summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorasargent@chromium.org <asargent@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-03 21:43:12 +0000
committerasargent@chromium.org <asargent@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-03 21:43:12 +0000
commit454109585616181cac5db08dfcaa528b12ee941f (patch)
tree3d33287964c6d69dbd7d446bbf4a86733dfd732e
parentfa1be9496fc89be6efc10ea83d8ef45ae015630c (diff)
downloadchromium_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.cc14
-rw-r--r--chrome/browser/extensions/event_names.cc3
-rw-r--r--chrome/browser/extensions/event_names.h4
-rw-r--r--chrome/browser/extensions/platform_app_browsertest.cc67
-rw-r--r--chrome/browser/extensions/shell_window_registry.cc4
-rw-r--r--chrome/browser/extensions/shell_window_registry.h1
-rw-r--r--chrome/common/extensions/extension.cc3
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) {