|  | // 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/test_browser_context.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) { | 
|  | 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) { | 
|  | 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) { | 
|  | 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()); | 
|  | } | 
|  |  | 
|  | }  // namespace content |