diff options
author | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-10-17 03:00:48 +0000 |
---|---|---|
committer | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-10-17 03:00:48 +0000 |
commit | 4d007b3104f9502caeb376666ff7d21da5d0a8b8 (patch) | |
tree | 0d5326f68fd80e768d73e65ad13ab7ea067e1cd5 /chrome/browser/extensions | |
parent | 59965613e65e47671f860ee50a8a0642f88d2f6d (diff) | |
download | chromium_src-4d007b3104f9502caeb376666ff7d21da5d0a8b8.zip chromium_src-4d007b3104f9502caeb376666ff7d21da5d0a8b8.tar.gz chromium_src-4d007b3104f9502caeb376666ff7d21da5d0a8b8.tar.bz2 |
Don't display platform app resources in normal browser windows.
BUG=139258
Review URL: https://codereview.chromium.org/10920084
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@162304 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/extensions')
4 files changed, 67 insertions, 10 deletions
diff --git a/chrome/browser/extensions/api/push_messaging/push_messaging_apitest.cc b/chrome/browser/extensions/api/push_messaging/push_messaging_apitest.cc index b2f7973..5da2a80 100644 --- a/chrome/browser/extensions/api/push_messaging/push_messaging_apitest.cc +++ b/chrome/browser/extensions/api/push_messaging/push_messaging_apitest.cc @@ -9,6 +9,7 @@ #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/extensions/extension_test_message_listener.h" +#include "chrome/browser/extensions/platform_app_launcher.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/sync/profile_sync_service.h" #include "chrome/browser/sync/profile_sync_service_factory.h" @@ -55,13 +56,13 @@ class PushMessagingApiTest : public ExtensionApiTest { IN_PROC_BROWSER_TEST_F(PushMessagingApiTest, EventDispatch) { ResultCatcher catcher; catcher.RestrictToProfile(browser()->profile()); - ExtensionTestMessageListener ready("ready", true); + const extensions::Extension* extension = LoadExtension(test_data_dir_.AppendASCII("push_messaging")); ASSERT_TRUE(extension); - GURL page_url = extension->GetResourceURL("event_dispatch.html"); - ui_test_utils::NavigateToURL(browser(), page_url); + extensions::LaunchPlatformApp( + browser()->profile(), extension, NULL, FilePath()); EXPECT_TRUE(ready.WaitUntilSatisfied()); GetEventRouter()->TriggerMessageForTest(extension->id(), 1, "payload"); @@ -77,10 +78,10 @@ IN_PROC_BROWSER_TEST_F(PushMessagingApiTest, ReceivesPush) { ExtensionTestMessageListener ready("ready", true); const extensions::Extension* extension = - LoadExtension(test_data_dir_.AppendASCII("push_messaging")); + LoadExtension(test_data_dir_.AppendASCII("push_messaging")); ASSERT_TRUE(extension); - GURL page_url = extension->GetResourceURL("event_dispatch.html"); - ui_test_utils::NavigateToURL(browser(), page_url); + extensions::LaunchPlatformApp( + browser()->profile(), extension, NULL, FilePath()); EXPECT_TRUE(ready.WaitUntilSatisfied()); ProfileSyncService* pss = ProfileSyncServiceFactory::GetForProfile( @@ -141,13 +142,14 @@ IN_PROC_BROWSER_TEST_F(PushMessagingApiTest, Restart) { IN_PROC_BROWSER_TEST_F(PushMessagingApiTest, GetChannelId) { ResultCatcher catcher; catcher.RestrictToProfile(browser()->profile()); +// ExtensionTestMessageListener ready("ready", true); - ExtensionTestMessageListener ready("ready", true); const extensions::Extension* extension = - LoadExtension(test_data_dir_.AppendASCII("push_messaging")); + LoadExtension(test_data_dir_.AppendASCII("get_channel_id")); ASSERT_TRUE(extension); - GURL page_url = extension->GetResourceURL("get_channel_id.html"); - ui_test_utils::NavigateToURL(browser(), page_url); + extensions::LaunchPlatformApp( + browser()->profile(), extension, NULL, FilePath()); +// EXPECT_TRUE(ready.WaitUntilSatisfied()); // Just loading the page will cause a getChannelId call, so we check // for a callback. It should fail because there is no auth token. diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc index 6b896e2..41e3358 100644 --- a/chrome/browser/extensions/extension_service.cc +++ b/chrome/browser/extensions/extension_service.cc @@ -2295,6 +2295,17 @@ bool ExtensionService::ExtensionBindingsAllowed(const GURL& url) { extension->location() == Extension::COMPONENT); } +bool ExtensionService::ShouldBlockUrlInBrowserTab(GURL* url) { + const Extension* extension = extensions_.GetExtensionOrAppByURL( + ExtensionURLInfo(*url)); + if (extension && extension->is_platform_app()) { + *url = GURL(chrome::kExtensionInvalidRequestURL); + return true; + } + + return false; +} + gfx::Image ExtensionService::GetOmniboxIcon( const std::string& extension_id) { return gfx::Image(omnibox_icon_manager_.GetIcon(extension_id)); diff --git a/chrome/browser/extensions/extension_service.h b/chrome/browser/extensions/extension_service.h index 3e42906..7ca9765 100644 --- a/chrome/browser/extensions/extension_service.h +++ b/chrome/browser/extensions/extension_service.h @@ -391,6 +391,10 @@ class ExtensionService // permissions the given extension has been granted. bool ExtensionBindingsAllowed(const GURL& url); + // Returns true if a normal browser window should avoid showing |url| in a + // tab. In this case, |url| is also rewritten to an error URL. + bool ShouldBlockUrlInBrowserTab(GURL* url); + // Returns the icon to display in the omnibox for the given extension. gfx::Image GetOmniboxIcon(const std::string& extension_id); diff --git a/chrome/browser/extensions/platform_app_browsertest.cc b/chrome/browser/extensions/platform_app_browsertest.cc index 5c0b3ac..164b8d7 100644 --- a/chrome/browser/extensions/platform_app_browsertest.cc +++ b/chrome/browser/extensions/platform_app_browsertest.cc @@ -24,6 +24,7 @@ #include "chrome/browser/ui/extensions/application_launch.h" #include "chrome/browser/ui/extensions/shell_window.h" #include "chrome/common/chrome_notification_types.h" +#include "chrome/common/url_constants.h" #include "chrome/test/base/ui_test_utils.h" #include "content/public/browser/render_process_host.h" #include "content/public/browser/web_intents_dispatcher.h" @@ -105,6 +106,36 @@ class LaunchReplyHandler { base::WeakPtrFactory<LaunchReplyHandler> weak_ptr_factory_; }; +// This class keeps track of tabs as they are added to the browser. It will be +// "done" (i.e. won't block on Wait()) once |observations| tabs have been added. +class TabsAddedNotificationObserver + : public content::WindowedNotificationObserver { + public: + explicit TabsAddedNotificationObserver(size_t observations) + : content::WindowedNotificationObserver( + chrome::NOTIFICATION_TAB_ADDED, + content::NotificationService::AllSources()), + observations_(observations) { + } + + virtual void Observe(int type, + const content::NotificationSource& source, + const content::NotificationDetails& details) OVERRIDE { + observed_tabs_.push_back( + content::Details<WebContents>(details).ptr()); + if (observed_tabs_.size() == observations_) + content::WindowedNotificationObserver::Observe(type, source, details); + } + + const std::vector<content::WebContents*>& tabs() { return observed_tabs_; } + + private: + size_t observations_; + std::vector<content::WebContents*> observed_tabs_; + + DISALLOW_COPY_AND_ASSIGN(TabsAddedNotificationObserver); +}; + const char kTestFilePath[] = "platform_apps/launch_files/test.txt"; } // namespace @@ -324,8 +355,17 @@ IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, AppWithContextMenuClicked) { } IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, DisallowNavigation) { + TabsAddedNotificationObserver observer(2); + ASSERT_TRUE(StartTestServer()); ASSERT_TRUE(RunPlatformAppTest("platform_apps/navigation")) << message_; + + observer.Wait(); + ASSERT_EQ(2U, observer.tabs().size()); + EXPECT_EQ(std::string(chrome::kExtensionInvalidRequestURL), + observer.tabs()[0]->GetURL().spec()); + EXPECT_EQ("http://chromium.org/", + observer.tabs()[1]->GetURL().spec()); } IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, Iframes) { |