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