diff options
Diffstat (limited to 'chrome/browser/ui/extensions')
-rw-r--r-- | chrome/browser/ui/extensions/bookmark_app_browser_controller.h | 51 | ||||
-rw-r--r-- | chrome/browser/ui/extensions/hosted_app_browser_controller.cc (renamed from chrome/browser/ui/extensions/bookmark_app_browser_controller.cc) | 37 | ||||
-rw-r--r-- | chrome/browser/ui/extensions/hosted_app_browser_controller.h | 51 | ||||
-rw-r--r-- | chrome/browser/ui/extensions/hosted_app_browsertest.cc (renamed from chrome/browser/ui/extensions/bookmark_app_browsertest.cc) | 195 |
4 files changed, 187 insertions, 147 deletions
diff --git a/chrome/browser/ui/extensions/bookmark_app_browser_controller.h b/chrome/browser/ui/extensions/bookmark_app_browser_controller.h deleted file mode 100644 index e47aaf3..0000000 --- a/chrome/browser/ui/extensions/bookmark_app_browser_controller.h +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2015 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. - -#ifndef CHROME_BROWSER_UI_EXTENSIONS_BOOKMARK_APP_BROWSER_CONTROLLER_H_ -#define CHROME_BROWSER_UI_EXTENSIONS_BOOKMARK_APP_BROWSER_CONTROLLER_H_ - -#include <string> - -#include "base/macros.h" - -class Browser; -class Profile; - -namespace extensions { - -// Class to encapsulate logic to control the browser UI for bookmark apps. -class BookmarkAppBrowserController { - public: - // Indicates whether |browser| is a bookmark app browser. - static bool IsForBookmarkApp(Browser* browser); - - explicit BookmarkAppBrowserController(Browser* browser); - ~BookmarkAppBrowserController(); - - // Whether the browser being controlled can ever show the location bar. - bool SupportsLocationBar(); - - // Whether the browser being controlled should be currently showing the - // location bar. - bool ShouldShowLocationBar(); - - // Updates the location bar visibility based on whether it should be - // currently visible or not. If |animate| is set, the change will be - // animated. - void UpdateLocationBarVisibility(bool animate); - - // Whether the controlled browser should use the web app style frame. - bool should_use_web_app_frame() { return should_use_web_app_frame_; } - - private: - Browser* browser_; - const std::string extension_id_; - const bool should_use_web_app_frame_; - - DISALLOW_COPY_AND_ASSIGN(BookmarkAppBrowserController); -}; - -} // namespace extensions - -#endif // CHROME_BROWSER_UI_EXTENSIONS_BOOKMARK_APP_BROWSER_CONTROLLER_H_ diff --git a/chrome/browser/ui/extensions/bookmark_app_browser_controller.cc b/chrome/browser/ui/extensions/hosted_app_browser_controller.cc index 773250a..7a3a930 100644 --- a/chrome/browser/ui/extensions/bookmark_app_browser_controller.cc +++ b/chrome/browser/ui/extensions/hosted_app_browser_controller.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/ui/extensions/bookmark_app_browser_controller.h" +#include "chrome/browser/ui/extensions/hosted_app_browser_controller.h" #include "base/command_line.h" #include "chrome/browser/profiles/profile.h" @@ -18,6 +18,7 @@ #include "content/public/browser/web_contents.h" #include "extensions/browser/extension_registry.h" #include "extensions/common/extension.h" +#include "net/base/net_util.h" #include "url/gurl.h" namespace extensions { @@ -25,9 +26,11 @@ namespace extensions { namespace { bool IsSameOriginOrMoreSecure(const GURL& app_url, const GURL& page_url) { + const std::string www("www."); return (app_url.scheme() == page_url.scheme() || page_url.scheme() == url::kHttpsScheme) && - app_url.host() == page_url.host() && + (app_url.host() == page_url.host() || + www + app_url.host() == page_url.host()) && app_url.port() == page_url.port(); } @@ -39,32 +42,37 @@ bool IsWebAppFrameEnabled() { } // namespace // static -bool BookmarkAppBrowserController::IsForBookmarkApp(Browser* browser) { +bool HostedAppBrowserController::IsForHostedApp(Browser* browser) { const std::string extension_id = web_app::GetExtensionIdFromApplicationName(browser->app_name()); const Extension* extension = ExtensionRegistry::Get(browser->profile())->GetExtensionById( extension_id, ExtensionRegistry::EVERYTHING); - return extension && extension->from_bookmark(); + return extension && extension->is_hosted_app(); } -BookmarkAppBrowserController::BookmarkAppBrowserController(Browser* browser) +HostedAppBrowserController::HostedAppBrowserController(Browser* browser) : browser_(browser), extension_id_( - web_app::GetExtensionIdFromApplicationName(browser->app_name())), - should_use_web_app_frame_(browser->host_desktop_type() == - chrome::HOST_DESKTOP_TYPE_ASH && - IsWebAppFrameEnabled()) { + web_app::GetExtensionIdFromApplicationName(browser->app_name())) { + const Extension* extension = + ExtensionRegistry::Get(browser->profile())->GetExtensionById( + extension_id_, ExtensionRegistry::EVERYTHING); + DCHECK(extension); + should_use_web_app_frame_ = + extension->from_bookmark() && + browser->host_desktop_type() == chrome::HOST_DESKTOP_TYPE_ASH && + IsWebAppFrameEnabled(); } -BookmarkAppBrowserController::~BookmarkAppBrowserController() { +HostedAppBrowserController::~HostedAppBrowserController() { } -bool BookmarkAppBrowserController::SupportsLocationBar() { +bool HostedAppBrowserController::SupportsLocationBar() const { return !should_use_web_app_frame(); } -bool BookmarkAppBrowserController::ShouldShowLocationBar() { +bool HostedAppBrowserController::ShouldShowLocationBar() const { const Extension* extension = ExtensionRegistry::Get(browser_->profile())->GetExtensionById( extension_id_, ExtensionRegistry::EVERYTHING); @@ -77,7 +85,7 @@ bool BookmarkAppBrowserController::ShouldShowLocationBar() { if (!extension || !web_contents) return false; - if (!extension->from_bookmark()) + if (!extension->is_hosted_app()) return false; // Don't show a location bar until a navigation has occurred. @@ -96,7 +104,8 @@ bool BookmarkAppBrowserController::ShouldShowLocationBar() { web_contents->GetLastCommittedURL())); } -void BookmarkAppBrowserController::UpdateLocationBarVisibility(bool animate) { +void HostedAppBrowserController::UpdateLocationBarVisibility( + bool animate) const { if (!SupportsLocationBar()) return; diff --git a/chrome/browser/ui/extensions/hosted_app_browser_controller.h b/chrome/browser/ui/extensions/hosted_app_browser_controller.h new file mode 100644 index 0000000..09384d0 --- /dev/null +++ b/chrome/browser/ui/extensions/hosted_app_browser_controller.h @@ -0,0 +1,51 @@ +// Copyright 2015 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. + +#ifndef CHROME_BROWSER_UI_EXTENSIONS_HOSTED_APP_BROWSER_CONTROLLER_H_ +#define CHROME_BROWSER_UI_EXTENSIONS_HOSTED_APP_BROWSER_CONTROLLER_H_ + +#include <string> + +#include "base/macros.h" + +class Browser; +class Profile; + +namespace extensions { + +// Class to encapsulate logic to control the browser UI for hosted apps. +class HostedAppBrowserController { + public: + // Indicates whether |browser| is a hosted app browser. + static bool IsForHostedApp(Browser* browser); + + explicit HostedAppBrowserController(Browser* browser); + ~HostedAppBrowserController(); + + // Whether the browser being controlled can ever show the location bar. + bool SupportsLocationBar() const; + + // Whether the browser being controlled should be currently showing the + // location bar. + bool ShouldShowLocationBar() const; + + // Updates the location bar visibility based on whether it should be + // currently visible or not. If |animate| is set, the change will be + // animated. + void UpdateLocationBarVisibility(bool animate) const; + + // Whether the controlled browser should use the web app style frame. + bool should_use_web_app_frame() const { return should_use_web_app_frame_; } + + private: + Browser* browser_; + const std::string extension_id_; + bool should_use_web_app_frame_; + + DISALLOW_COPY_AND_ASSIGN(HostedAppBrowserController); +}; + +} // namespace extensions + +#endif // CHROME_BROWSER_UI_EXTENSIONS_HOSTED_APP_BROWSER_CONTROLLER_H_ diff --git a/chrome/browser/ui/extensions/bookmark_app_browsertest.cc b/chrome/browser/ui/extensions/hosted_app_browsertest.cc index 186029b..fa96455 100644 --- a/chrome/browser/ui/extensions/bookmark_app_browsertest.cc +++ b/chrome/browser/ui/extensions/hosted_app_browsertest.cc @@ -14,7 +14,7 @@ #include "chrome/browser/ui/browser_iterator.h" #include "chrome/browser/ui/extensions/app_launch_params.h" #include "chrome/browser/ui/extensions/application_launch.h" -#include "chrome/browser/ui/extensions/bookmark_app_browser_controller.h" +#include "chrome/browser/ui/extensions/hosted_app_browser_controller.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/web_applications/web_app.h" #include "chrome/common/chrome_switches.h" @@ -28,8 +28,6 @@ using content::WebContents; using extensions::Extension; -typedef ExtensionBrowserTest BookmarkAppTest; - namespace { // Used by ShouldLocationBarForXXX. Performs a navigation and then checks that @@ -40,141 +38,174 @@ void NavigateAndCheckForLocationBar(Browser* browser, GURL url(url_string); ui_test_utils::NavigateToURL(browser, url); EXPECT_EQ(expected_visibility, - browser->bookmark_app_controller()->ShouldShowLocationBar()); + browser->hosted_app_controller()->ShouldShowLocationBar()); } } // namespace +class HostedAppTest : public ExtensionBrowserTest { + public: + HostedAppTest() : app_browser_(nullptr) {} + ~HostedAppTest() override {} + + protected: + void SetupApp(const std::string& app_folder, bool is_bookmark_app) { + const Extension* app = InstallExtensionWithSourceAndFlags( + test_data_dir_.AppendASCII(app_folder), 1, + extensions::Manifest::INTERNAL, + is_bookmark_app ? extensions::Extension::FROM_BOOKMARK + : extensions::Extension::NO_FLAGS); + ASSERT_TRUE(app); + + // Launch it in a window. + ASSERT_TRUE(OpenApplication(AppLaunchParams( + browser()->profile(), app, extensions::LAUNCH_CONTAINER_WINDOW, + NEW_WINDOW, extensions::SOURCE_TEST))); + + for (chrome::BrowserIterator it; !it.done(); it.Next()) { + if (*it == browser()) + continue; + + std::string browser_app_id = + web_app::GetExtensionIdFromApplicationName((*it)->app_name()); + if (browser_app_id == app->id()) { + app_browser_ = *it; + break; + } + } + + ASSERT_TRUE(app_browser_); + ASSERT_TRUE(app_browser_ != browser()); + } + + Browser* app_browser_; +}; + // Check that the location bar is shown correctly for HTTP bookmark apps. -IN_PROC_BROWSER_TEST_F(BookmarkAppTest, +IN_PROC_BROWSER_TEST_F(HostedAppTest, ShouldShowLocationBarForHTTPBookmarkApp) { base::CommandLine::ForCurrentProcess()->AppendSwitch( switches::kEnableNewBookmarkApps); - ASSERT_TRUE(test_server()->Start()); - // Load a http bookmark app. - const Extension* http_bookmark_app = InstallExtensionWithSourceAndFlags( - test_data_dir_.AppendASCII("app/"), - 1, - extensions::Manifest::INTERNAL, - extensions::Extension::FROM_BOOKMARK); - ASSERT_TRUE(http_bookmark_app); - - // Launch it in a window. - WebContents* app_window = OpenApplication(AppLaunchParams( - browser()->profile(), http_bookmark_app, - extensions::LAUNCH_CONTAINER_WINDOW, NEW_WINDOW, - extensions::SOURCE_TEST)); - ASSERT_TRUE(app_window); - - // Find the new browser. - Browser* http_app_browser = NULL; - for (chrome::BrowserIterator it; !it.done(); it.Next()) { - std::string app_id = - web_app::GetExtensionIdFromApplicationName((*it)->app_name()); - if (*it == browser()) { - continue; - } else if (app_id == http_bookmark_app->id()) { - http_app_browser = *it; - } - } - ASSERT_TRUE(http_app_browser); - ASSERT_TRUE(http_app_browser != browser()); + SetupApp("app", true); // Navigate to the app's launch page; the location bar should be hidden. NavigateAndCheckForLocationBar( - http_app_browser, "http://www.example.com/empty.html", false); + app_browser_, "http://www.example.com/empty.html", false); // Navigate to another page on the same origin; the location bar should still // hidden. NavigateAndCheckForLocationBar( - http_app_browser, "http://www.example.com/blah", false); + app_browser_, "http://www.example.com/blah", false); // Navigate to the https version of the site; the location bar should - // be hidden for both browsers. + // be hidden. NavigateAndCheckForLocationBar( - http_app_browser, "https://www.example.com/blah", false); + app_browser_, "https://www.example.com/blah", false); // Navigate to different origin; the location bar should now be visible. NavigateAndCheckForLocationBar( - http_app_browser, "http://www.foo.com/blah", true); + app_browser_, "http://www.foo.com/blah", true); // Navigate back to the app's origin; the location bar should now be hidden. NavigateAndCheckForLocationBar( - http_app_browser, "http://www.example.com/blah", false); + app_browser_, "http://www.example.com/blah", false); } // Check that the location bar is shown correctly for HTTPS bookmark apps. -IN_PROC_BROWSER_TEST_F(BookmarkAppTest, +IN_PROC_BROWSER_TEST_F(HostedAppTest, ShouldShowLocationBarForHTTPSBookmarkApp) { base::CommandLine::ForCurrentProcess()->AppendSwitch( switches::kEnableNewBookmarkApps); - ASSERT_TRUE(test_server()->Start()); - // Load a https bookmark app. - const Extension* https_bookmark_app = InstallExtensionWithSourceAndFlags( - test_data_dir_.AppendASCII("https_app/"), - 1, - extensions::Manifest::INTERNAL, - extensions::Extension::FROM_BOOKMARK); - ASSERT_TRUE(https_bookmark_app); - - // Launch it in a window. - WebContents* app_window = OpenApplication(AppLaunchParams( - browser()->profile(), https_bookmark_app, - extensions::LAUNCH_CONTAINER_WINDOW, NEW_WINDOW, - extensions::SOURCE_TEST)); - ASSERT_TRUE(app_window); - - // Find the new browser. - Browser* https_app_browser = NULL; - for (chrome::BrowserIterator it; !it.done(); it.Next()) { - std::string app_id = - web_app::GetExtensionIdFromApplicationName((*it)->app_name()); - if (*it == browser()) { - continue; - } else if (app_id == https_bookmark_app->id()) { - https_app_browser = *it; - } - } - ASSERT_TRUE(https_app_browser); - ASSERT_TRUE(https_app_browser != browser()); + SetupApp("https_app", true); // Navigate to the app's launch page; the location bar should be hidden. NavigateAndCheckForLocationBar( - https_app_browser, "https://www.example.com/empty.html", false); + app_browser_, "https://www.example.com/empty.html", false); // Navigate to another page on the same origin; the location bar should still // hidden. NavigateAndCheckForLocationBar( - https_app_browser, "https://www.example.com/blah", false); + app_browser_, "https://www.example.com/blah", false); // Navigate to the http version of the site; the location bar should // be visible for the https version as it is now on a less secure version // of its host. NavigateAndCheckForLocationBar( - https_app_browser, "http://www.example.com/blah", true); + app_browser_, "http://www.example.com/blah", true); + + // Navigate to different origin; the location bar should now be visible. + NavigateAndCheckForLocationBar( + app_browser_, "http://www.foo.com/blah", true); + + // Navigate back to the app's origin; the location bar should now be hidden. + NavigateAndCheckForLocationBar( + app_browser_, "https://www.example.com/blah", false); +} + +// Check that the location bar is shown correctly for normal hosted apps. +IN_PROC_BROWSER_TEST_F(HostedAppTest, + ShouldShowLocationBarForHostedApp) { + SetupApp("app", false); + + // Navigate to the app's launch page; the location bar should be hidden. + NavigateAndCheckForLocationBar( + app_browser_, "http://www.example.com/empty.html", false); + + // Navigate to another page on the same origin; the location bar should still + // hidden. + NavigateAndCheckForLocationBar( + app_browser_, "http://www.example.com/blah", false); + + // Navigate to the https version of the site; the location bar should + // be hidden. + NavigateAndCheckForLocationBar( + app_browser_, "https://www.example.com/blah", false); + + // Navigate to different origin; the location bar should now be visible. + NavigateAndCheckForLocationBar( + app_browser_, "http://www.foo.com/blah", true); + + // Navigate back to the app's origin; the location bar should now be hidden. + NavigateAndCheckForLocationBar( + app_browser_, "http://www.example.com/blah", false); +} + +// Check that the location bar is shown correctly for hosted apps that specify +// start URLs without the 'www.' prefix. +IN_PROC_BROWSER_TEST_F(HostedAppTest, + LocationBarForHostedAppWithoutWWW) { + SetupApp("app_no_www", false); + + // Navigate to the app's launch page; the location bar should be hidden. + NavigateAndCheckForLocationBar( + app_browser_, "http://example.com/empty.html", false); + + // Navigate to the app's launch page with the 'www.' prefis; the location bar + // should be hidden. + NavigateAndCheckForLocationBar( + app_browser_, "http://www.example.com/empty.html", false); // Navigate to different origin; the location bar should now be visible. NavigateAndCheckForLocationBar( - https_app_browser, "http://www.foo.com/blah", true); + app_browser_, "http://www.foo.com/blah", true); // Navigate back to the app's origin; the location bar should now be hidden. NavigateAndCheckForLocationBar( - https_app_browser, "https://www.example.com/blah", false); + app_browser_, "http://example.com/blah", false); } // Open a normal browser window, a hosted app window, a legacy packaged app // window and a dev tools window, and check that the web app frame feature is // supported correctly. -IN_PROC_BROWSER_TEST_F(BookmarkAppTest, ShouldUseWebAppFrame) { - ASSERT_TRUE(test_server()->Start()); +IN_PROC_BROWSER_TEST_F(HostedAppTest, ShouldUseWebAppFrame) { base::CommandLine::ForCurrentProcess()->AppendSwitch( switches::kEnableWebAppFrame); // Load a hosted app. const Extension* bookmark_app = InstallExtensionWithSourceAndFlags( - test_data_dir_.AppendASCII("app/"), + test_data_dir_.AppendASCII("app"), 1, extensions::Manifest::INTERNAL, extensions::Extension::FROM_BOOKMARK); @@ -187,7 +218,7 @@ IN_PROC_BROWSER_TEST_F(BookmarkAppTest, ShouldUseWebAppFrame) { ASSERT_TRUE(bookmark_app_window); // Load a packaged app. - ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("packaged_app/"))); + ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("packaged_app"))); const Extension* packaged_app = nullptr; extensions::ExtensionRegistry* registry = extensions::ExtensionRegistry::Get(browser()->profile()); @@ -212,9 +243,9 @@ IN_PROC_BROWSER_TEST_F(BookmarkAppTest, ShouldUseWebAppFrame) { browser()->host_desktop_type())); // Find the new browsers. - Browser* bookmark_app_browser = NULL; - Browser* packaged_app_browser = NULL; - Browser* dev_tools_browser = NULL; + Browser* bookmark_app_browser = nullptr; + Browser* packaged_app_browser = nullptr; + Browser* dev_tools_browser = nullptr; for (chrome::BrowserIterator it; !it.done(); it.Next()) { if (*it == browser()) { continue; |