15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/sys_string_conversions.h" 6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/component_loader.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_browsertest.h" 9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/search/search.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h" 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/ui/location_bar/location_bar.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/omnibox/omnibox_view.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_controller.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_entry.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/constants.h" 237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationEntry; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionURLRewriteBrowserTest : public ExtensionBrowserTest { 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetUp() OVERRIDE { 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ComponentLoader::EnableBackgroundExtensionsForTesting(); 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionBrowserTest::SetUp(); 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string GetLocationBarText() const { 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::UTF16ToUTF8( 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) browser()->window()->GetLocationBar()->GetOmniboxView()->GetText()); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL GetLocationBarTextAsURL() const { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GURL(GetLocationBarText()); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NavigationController* GetNavigationController() const { 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &browser()->tab_strip_model()->GetActiveWebContents()-> 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetController(); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* GetNavigationEntry() const { 503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return GetNavigationController()->GetVisibleEntry(); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath GetTestExtensionPath(const char* extension_name) const { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return test_data_dir_.AppendASCII("browsertest/url_rewrite/"). 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendASCII(extension_name); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigates to |url| and tests that the location bar and the |virtual_url| 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // correspond to |url|, while the real URL of the navigation entry uses the 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chrome-extension:// scheme. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void TestExtensionURLOverride(const GURL& url) { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), url); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(url, GetLocationBarTextAsURL()); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(url, GetNavigationEntry()->GetVirtualURL()); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE( 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetNavigationEntry()->GetURL().SchemeIs(extensions::kExtensionScheme)); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigates to |url| and tests that the location bar is empty while the 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |virtual_url| is the same as |url|. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void TestURLNotShown(const GURL& url) { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), url); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", GetLocationBarText()); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(url, GetNavigationEntry()->GetVirtualURL()); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionURLRewriteBrowserTest, NewTabPageURL) { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigate to chrome://newtab and check that the location bar text is blank. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url(chrome::kChromeUINewTabURL); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLNotShown(url); 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Check that the actual URL corresponds to the new tab URL. 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(chrome::IsNTPURL(GetNavigationEntry()->GetURL(), profile())); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionURLRewriteBrowserTest, NewTabPageURLOverride) { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load an extension to override the NTP and check that the location bar text 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is blank after navigating to chrome://newtab. 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(LoadExtension(GetTestExtensionPath("newtab"))); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestURLNotShown(GURL(chrome::kChromeUINewTabURL)); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the internal URL uses the chrome-extension:// scheme. 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(GetNavigationEntry()->GetURL().SchemeIs( 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::kExtensionScheme)); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionURLRewriteBrowserTest, BookmarksURL) { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigate to chrome://bookmarks and check that the location bar URL is 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // what was entered and the internal URL uses the chrome-extension:// scheme. 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL bookmarks_url(chrome::kChromeUIBookmarksURL); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_test_utils::NavigateToURL(browser(), bookmarks_url); 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The default chrome://bookmarks implementation will append /#1 to the URL 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // once loaded. Use |GetWithEmptyPath()| to avoid flakyness. 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(bookmarks_url, GetLocationBarTextAsURL().GetWithEmptyPath()); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigationEntry* navigation = GetNavigationEntry(); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(bookmarks_url, navigation->GetVirtualURL().GetWithEmptyPath()); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(navigation->GetURL().SchemeIs(extensions::kExtensionScheme)); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionURLRewriteBrowserTest, BookmarksURLWithRef) { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigate to chrome://bookmarks/#1 and check that the location bar URL is 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // what was entered and the internal URL uses the chrome-extension:// scheme. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url_with_ref(chrome::kChromeUIBookmarksURL + std::string("#1")); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestExtensionURLOverride(url_with_ref); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionURLRewriteBrowserTest, BookmarksURLOverride) { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load an extension that overrides chrome://bookmarks. 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(LoadExtension(GetTestExtensionPath("bookmarks"))); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigate to chrome://bookmarks and check that the location bar URL is what 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // was entered and the internal URL uses the chrome-extension:// scheme. 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestExtensionURLOverride(GURL(chrome::kChromeUIBookmarksURL)); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 123