diff options
author | asargent@chromium.org <asargent@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-05-03 21:43:12 +0000 |
---|---|---|
committer | asargent@chromium.org <asargent@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-05-03 21:43:12 +0000 |
commit | 454109585616181cac5db08dfcaa528b12ee941f (patch) | |
tree | 3d33287964c6d69dbd7d446bbf4a86733dfd732e | |
parent | fa1be9496fc89be6efc10ea83d8ef45ae015630c (diff) | |
download | chromium_src-454109585616181cac5db08dfcaa528b12ee941f.zip chromium_src-454109585616181cac5db08dfcaa528b12ee941f.tar.gz chromium_src-454109585616181cac5db08dfcaa528b12ee941f.tar.bz2 |
Support component v2 packaged apps in incognito mode
This will let the ChromeOS File Manager work in Guest mode.
BUG=230724
R=miket@chromium.org
Review URL: https://codereview.chromium.org/14835005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@198191 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/extensions/api/app_runtime/app_runtime_api.cc | 14 | ||||
-rw-r--r-- | chrome/browser/extensions/event_names.cc | 3 | ||||
-rw-r--r-- | chrome/browser/extensions/event_names.h | 4 | ||||
-rw-r--r-- | chrome/browser/extensions/platform_app_browsertest.cc | 67 | ||||
-rw-r--r-- | chrome/browser/extensions/shell_window_registry.cc | 4 | ||||
-rw-r--r-- | chrome/browser/extensions/shell_window_registry.h | 1 | ||||
-rw-r--r-- | chrome/common/extensions/extension.cc | 3 |
7 files changed, 88 insertions, 8 deletions
diff --git a/chrome/browser/extensions/api/app_runtime/app_runtime_api.cc b/chrome/browser/extensions/api/app_runtime/app_runtime_api.cc index 10e29f57..2cbdbd7 100644 --- a/chrome/browser/extensions/api/app_runtime/app_runtime_api.cc +++ b/chrome/browser/extensions/api/app_runtime/app_runtime_api.cc @@ -10,6 +10,7 @@ #include "base/utf_string_conversions.h" #include "base/values.h" #include "chrome/browser/extensions/api/file_handlers/app_file_handler_util.h" +#include "chrome/browser/extensions/event_names.h" #include "chrome/browser/extensions/event_router.h" #include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/profiles/profile.h" @@ -21,8 +22,8 @@ namespace extensions { namespace { -const char kOnLaunchedEvent[] = "app.runtime.onLaunched"; -const char kOnRestartedEvent[] = "app.runtime.onRestarted"; +using event_names::kOnLaunched; +using event_names::kOnRestarted; void DispatchOnLaunchedEventImpl(const std::string& extension_id, scoped_ptr<base::ListValue> args, @@ -35,12 +36,11 @@ void DispatchOnLaunchedEventImpl(const std::string& extension_id, // extension does not actually have a listener, the event will just be // ignored (but an app that doesn't listen for the onLaunched event doesn't // make sense anyway). - system->event_router()->AddLazyEventListener(kOnLaunchedEvent, extension_id); - scoped_ptr<Event> event(new Event(kOnLaunchedEvent, args.Pass())); + system->event_router()->AddLazyEventListener(kOnLaunched, extension_id); + scoped_ptr<Event> event(new Event(kOnLaunched, args.Pass())); event->restrict_to_profile = profile; system->event_router()->DispatchEventToExtension(extension_id, event.Pass()); - system->event_router()->RemoveLazyEventListener(kOnLaunchedEvent, - extension_id); + system->event_router()->RemoveLazyEventListener(kOnLaunched, extension_id); } } // anonymous namespace @@ -74,7 +74,7 @@ void AppEventRouter::DispatchOnRestartedEvent( } scoped_ptr<ListValue> arguments(new ListValue()); arguments->Append(file_entries_list); - scoped_ptr<Event> event(new Event(kOnRestartedEvent, arguments.Pass())); + scoped_ptr<Event> event(new Event(kOnRestarted, arguments.Pass())); event->restrict_to_profile = profile; extensions::ExtensionSystem::Get(profile)->event_router()-> DispatchEventToExtension(extension->id(), event.Pass()); diff --git a/chrome/browser/extensions/event_names.cc b/chrome/browser/extensions/event_names.cc index 188eb9c..3a17857 100644 --- a/chrome/browser/extensions/event_names.cc +++ b/chrome/browser/extensions/event_names.cc @@ -99,6 +99,9 @@ const char kOnNetworkListChanged[] = "networkingPrivate.onNetworkListChanged"; const char kOnAudioDeviceChanged[] = "audio.onDeviceChanged"; +const char kOnLaunched[] = "app.runtime.onLaunched"; +const char kOnRestarted[] = "app.runtime.onRestarted"; + } // namespace event_names } // namespace extensions diff --git a/chrome/browser/extensions/event_names.h b/chrome/browser/extensions/event_names.h index 1e1610f..7f682fc 100644 --- a/chrome/browser/extensions/event_names.h +++ b/chrome/browser/extensions/event_names.h @@ -116,6 +116,10 @@ extern const char kOnNetworkListChanged[]; // Audio extern const char kOnAudioDeviceChanged[]; +// Runtime. +extern const char kOnLaunched[]; +extern const char kOnRestarted[]; + } // namespace event_names } // namespace extensions diff --git a/chrome/browser/extensions/platform_app_browsertest.cc b/chrome/browser/extensions/platform_app_browsertest.cc index 38ca40b..cab680e 100644 --- a/chrome/browser/extensions/platform_app_browsertest.cc +++ b/chrome/browser/extensions/platform_app_browsertest.cc @@ -6,6 +6,7 @@ #include "base/file_util.h" #include "base/files/scoped_temp_dir.h" #include "base/prefs/pref_service.h" +#include "base/stl_util.h" #include "base/test/test_timeouts.h" #include "base/threading/platform_thread.h" #include "base/utf_string_conversions.h" @@ -13,6 +14,9 @@ #include "chrome/browser/automation/automation_util.h" #include "chrome/browser/devtools/devtools_window.h" #include "chrome/browser/extensions/api/permissions/permissions_api.h" +#include "chrome/browser/extensions/component_loader.h" +#include "chrome/browser/extensions/event_names.h" +#include "chrome/browser/extensions/event_router.h" #include "chrome/browser/extensions/extension_browsertest.h" #include "chrome/browser/extensions/extension_prefs.h" #include "chrome/browser/extensions/extension_service.h" @@ -29,6 +33,7 @@ #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/web_contents_modal_dialog_manager.h" #include "chrome/common/chrome_notification_types.h" +#include "chrome/common/chrome_switches.h" #include "chrome/common/url_constants.h" #include "chrome/test/base/ui_test_utils.h" #include "components/user_prefs/pref_registry_syncable.h" @@ -910,4 +915,66 @@ IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest, MAYBE_WebContentsHasFocus) { GetRenderWidgetHostView()->HasFocus()); } + +#if defined(OS_CHROMEOS) + +class PlatformAppIncognitoBrowserTest : public PlatformAppBrowserTest, + public ShellWindowRegistry::Observer { + public: + virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { + // Tell chromeos to launch in Guest mode, aka incognito. + command_line->AppendSwitch(switches::kIncognito); + PlatformAppBrowserTest::SetUpCommandLine(command_line); + } + virtual void SetUp() OVERRIDE { + // Make sure the file manager actually gets loaded. + ComponentLoader::EnableBackgroundExtensionsForTesting(); + PlatformAppBrowserTest::SetUp(); + } + + // ShellWindowRegistry::Observer implementation. + virtual void OnShellWindowAdded(ShellWindow* shell_window) { + opener_app_ids_.insert(shell_window->extension()->id()); + } + virtual void OnShellWindowIconChanged(ShellWindow* shell_window) {} + virtual void OnShellWindowRemoved(ShellWindow* shell_window) {} + + protected: + // A set of ids of apps we've seen open a shell window. + std::set<std::string> opener_app_ids_; +}; + +IN_PROC_BROWSER_TEST_F(PlatformAppIncognitoBrowserTest, IncognitoComponentApp) { + // Get the file manager app. + const Extension* file_manager = extension_service()->GetExtensionById( + "hhaomjibdihmijegdhdafkllkbggdgoj", false); + ASSERT_TRUE(file_manager != NULL); + Profile* incognito_profile = profile()->GetOffTheRecordProfile(); + ASSERT_TRUE(incognito_profile != NULL); + + // Wait until the file manager has had a chance to register its listener + // for the launch event. + EventRouter* router = ExtensionSystem::Get(incognito_profile)->event_router(); + ASSERT_TRUE(router != NULL); + while (!router->ExtensionHasEventListener(file_manager->id(), + event_names::kOnLaunched)) { + content::RunAllPendingInMessageLoop(); + } + + // Listen for new shell windows so we see the file manager app launch itself. + ShellWindowRegistry* registry = ShellWindowRegistry::Get(incognito_profile); + ASSERT_TRUE(registry != NULL); + registry->AddObserver(this); + + chrome::AppLaunchParams params(incognito_profile, file_manager, 0); + chrome::OpenApplication(params); + + while (!ContainsKey(opener_app_ids_, file_manager->id())) { + content::RunAllPendingInMessageLoop(); + } +} + +#endif // defined(OS_CHROMEOS) + + } // namespace extensions diff --git a/chrome/browser/extensions/shell_window_registry.cc b/chrome/browser/extensions/shell_window_registry.cc index e08b04a..6d64374 100644 --- a/chrome/browser/extensions/shell_window_registry.cc +++ b/chrome/browser/extensions/shell_window_registry.cc @@ -257,4 +257,8 @@ bool ShellWindowRegistry::Factory::ServiceIsNULLWhileTesting() const { return false; } +bool ShellWindowRegistry::Factory::ServiceRedirectedInIncognito() const { + return true; +} + } // namespace extensions diff --git a/chrome/browser/extensions/shell_window_registry.h b/chrome/browser/extensions/shell_window_registry.h index 3789333..1da54a0 100644 --- a/chrome/browser/extensions/shell_window_registry.h +++ b/chrome/browser/extensions/shell_window_registry.h @@ -118,6 +118,7 @@ class ShellWindowRegistry : public ProfileKeyedService { content::BrowserContext* profile) const OVERRIDE; virtual bool ServiceIsCreatedWithProfile() const OVERRIDE; virtual bool ServiceIsNULLWhileTesting() const OVERRIDE; + virtual bool ServiceRedirectedInIncognito() const OVERRIDE; }; Profile* profile_; diff --git a/chrome/common/extensions/extension.cc b/chrome/common/extensions/extension.cc index 6ed0e79..aa7b5f4 100644 --- a/chrome/common/extensions/extension.cc +++ b/chrome/common/extensions/extension.cc @@ -973,7 +973,8 @@ bool Extension::is_extension() const { } bool Extension::can_be_incognito_enabled() const { - return !is_platform_app(); + // Only component platform apps are supported in incognito. + return !is_platform_app() || location() == Manifest::COMPONENT; } void Extension::AddWebExtentPattern(const URLPattern& pattern) { |