// 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