|  | // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 
|  | // 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 |