| // Copyright 2011 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "content/browser/browser_url_handler_impl.h" |
| #include "content/public/test/browser_task_environment.h" |
| #include "content/public/test/test_browser_context.h" |
| #include "testing/gmock/include/gmock/gmock.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "url/gurl.h" |
| |
| namespace content { |
| |
| class BrowserURLHandlerImplTest : public testing::Test { |
| }; |
| |
| // Test URL rewriter that rewrites all "foo://" URLs to "bar://bar". |
| static bool FooRewriter(GURL* url, BrowserContext* browser_context) { |
| if (url->scheme() == "foo") { |
| *url = GURL("bar://bar"); |
| return true; |
| } |
| return false; |
| } |
| |
| // Test URL rewriter that rewrites all "bar://" URLs to "foo://foo". |
| static bool BarRewriter(GURL* url, BrowserContext* browser_context) { |
| if (url->scheme() == "bar") { |
| *url = GURL("foo://foo"); |
| return true; |
| } |
| return false; |
| } |
| |
| TEST_F(BrowserURLHandlerImplTest, BasicRewriteAndReverse) { |
| BrowserTaskEnvironment task_environment; |
| TestBrowserContext browser_context; |
| BrowserURLHandlerImpl handler; |
| |
| handler.AddHandlerPair(FooRewriter, BarRewriter); |
| |
| GURL url("foo://bar"); |
| GURL original_url(url); |
| bool reverse_on_redirect = false; |
| handler.RewriteURLIfNecessary(&url, &browser_context, &reverse_on_redirect); |
| ASSERT_TRUE(reverse_on_redirect); |
| ASSERT_EQ("bar://bar", url.spec()); |
| |
| // Check that reversing the URL works. |
| GURL saved_url(url); |
| bool reversed = handler.ReverseURLRewrite(&url, |
| original_url, |
| &browser_context); |
| ASSERT_TRUE(reversed); |
| ASSERT_EQ("foo://foo", url.spec()); |
| |
| // Check that reversing the URL only works with a matching |original_url|. |
| url = saved_url; |
| original_url = GURL("bam://bam"); // Won't be matched by FooRewriter. |
| reversed = handler.ReverseURLRewrite(&url, original_url, &browser_context); |
| ASSERT_FALSE(reversed); |
| ASSERT_EQ(saved_url, url); |
| } |
| |
| TEST_F(BrowserURLHandlerImplTest, NullHandlerReverse) { |
| BrowserTaskEnvironment task_environment; |
| TestBrowserContext browser_context; |
| BrowserURLHandlerImpl handler; |
| |
| GURL url("bar://foo"); |
| GURL original_url(url); |
| |
| handler.AddHandlerPair(BrowserURLHandlerImpl::null_handler(), FooRewriter); |
| bool reversed = handler.ReverseURLRewrite(&url, |
| original_url, |
| &browser_context); |
| ASSERT_FALSE(reversed); |
| ASSERT_EQ(original_url, url); |
| |
| handler.AddHandlerPair(BrowserURLHandlerImpl::null_handler(), BarRewriter); |
| reversed = handler.ReverseURLRewrite(&url, original_url, &browser_context); |
| ASSERT_TRUE(reversed); |
| ASSERT_EQ("foo://foo", url.spec()); |
| } |
| |
| // Verify that the reverse handler for view-source does not duplicate query |
| // parameters. |
| TEST_F(BrowserURLHandlerImplTest, ViewSourceReverse) { |
| BrowserTaskEnvironment task_environment; |
| TestBrowserContext browser_context; |
| BrowserURLHandlerImpl handler; |
| |
| GURL url("http://foo/?a=1"); |
| GURL original_url("view-source:http://some_url"); |
| bool reversed = handler.ReverseURLRewrite(&url, |
| original_url, |
| &browser_context); |
| ASSERT_TRUE(reversed); |
| ASSERT_EQ("view-source:http://foo/?a=1", url.spec()); |
| } |
| |
| // Verify that GetPossibleRewrites retrieves the rewrites from all handlers that |
| // match, in order of priority. |
| TEST_F(BrowserURLHandlerImplTest, GetPossibleRewrites) { |
| BrowserTaskEnvironment task_environment; |
| TestBrowserContext browser_context; |
| BrowserURLHandlerImpl handler; |
| |
| auto rewriter1 = [](GURL* url, BrowserContext* context) { |
| *url = GURL("https://test1.example"); |
| return true; |
| }; |
| auto rewriter2 = [](GURL* url, BrowserContext* context) { return false; }; |
| auto rewriter3 = [](GURL* url, BrowserContext* context) { |
| *url = GURL("https://test3.example"); |
| return true; |
| }; |
| handler.AddHandlerPair(rewriter1, BrowserURLHandlerImpl::null_handler()); |
| handler.AddHandlerPair(rewriter2, BrowserURLHandlerImpl::null_handler()); |
| handler.AddHandlerPair(rewriter3, BrowserURLHandlerImpl::null_handler()); |
| |
| GURL url("https://example.com"); |
| std::vector<GURL> rewrites = |
| handler.GetPossibleRewrites(url, &browser_context); |
| |
| EXPECT_THAT(rewrites, testing::ElementsAre(GURL("https://test1.example"), |
| GURL("https://test3.example"))); |
| } |
| |
| } // namespace content |