| // 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->GetScheme() == "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->GetScheme() == "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 |