Index: chrome/browser/extensions/extension_service.cc |
diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc |
index c23f7eac3a713594df552d050e4aa8fc3fccd151..3f416de79ddffa6bed6e4a548ae9d187861d65ba 100644 |
--- a/chrome/browser/extensions/extension_service.cc |
+++ b/chrome/browser/extensions/extension_service.cc |
@@ -61,9 +61,12 @@ |
#include "chrome/browser/extensions/external_provider_impl.h" |
#include "chrome/browser/extensions/external_provider_interface.h" |
#include "chrome/browser/extensions/installed_loader.h" |
+#include "chrome/browser/extensions/lazy_background_task_queue.h" |
#include "chrome/browser/extensions/pending_extension_manager.h" |
#include "chrome/browser/extensions/permissions_updater.h" |
+#include "chrome/browser/extensions/platform_app_launcher.h" |
#include "chrome/browser/extensions/settings/settings_frontend.h" |
+#include "chrome/browser/extensions/shell_window_registry.h" |
#include "chrome/browser/extensions/unpacked_installer.h" |
#include "chrome/browser/extensions/updater/extension_updater.h" |
#include "chrome/browser/extensions/window_event_router.h" |
@@ -108,7 +111,6 @@ |
#include "sync/api/sync_error_factory.h" |
#include "webkit/database/database_tracker.h" |
#include "webkit/database/database_util.h" |
- |
#if defined(OS_CHROMEOS) |
#include "chrome/browser/chromeos/cros/cros_library.h" |
#include "chrome/browser/chromeos/extensions/bluetooth_event_router.h" |
@@ -664,6 +666,12 @@ void ExtensionService::ReloadExtension(const std::string& extension_id) { |
orphaned_dev_tools_[extension_id] = devtools_cookie; |
} |
+ if (current_extension->is_platform_app() && |
+ !extensions::ShellWindowRegistry::Get(profile_)-> |
+ GetShellWindowsForApp(extension_id).empty()) { |
+ relaunch_app_ids_.insert(extension_id); |
+ } |
+ |
path = current_extension->path(); |
DisableExtension(extension_id, Extension::DISABLE_RELOAD); |
disabled_extension_paths_[extension_id] = path; |
@@ -1954,6 +1962,7 @@ void ExtensionService::AddExtension(const Extension* extension) { |
extensions_.Insert(scoped_extension); |
SyncExtensionChangeIfNeeded(*extension); |
NotifyExtensionLoaded(extension); |
+ QueueRestoreAppWindow(extension); |
} |
void ExtensionService::InitializePermissions(const Extension* extension) { |
@@ -2565,3 +2574,31 @@ ExtensionService::NaClModuleInfoList::iterator |
} |
return nacl_module_list_.end(); |
} |
+ |
+void ExtensionService::QueueRestoreAppWindow(const Extension* extension) { |
+ std::set<std::string>::iterator relaunch_iter = |
+ relaunch_app_ids_.find(extension->id()); |
+ if (relaunch_iter != relaunch_app_ids_.end()) { |
+ extensions::LazyBackgroundTaskQueue* queue = |
+ system_->lazy_background_task_queue(); |
+ if (queue->ShouldEnqueueTask(profile(), extension)) { |
+ queue->AddPendingTask(profile(), extension->id(), |
+ base::Bind(&ExtensionService::LaunchApplication)); |
+ } |
+ |
+ relaunch_app_ids_.erase(relaunch_iter); |
+ } |
+} |
+ |
+// static |
+void ExtensionService::LaunchApplication( |
+ extensions::ExtensionHost* extension_host) { |
+ if (!extension_host) |
+ return; |
+ |
+#if !defined(OS_ANDROID) |
+ extensions::LaunchPlatformApp(extension_host->profile(), |
+ extension_host->extension(), |
+ NULL, FilePath()); |
+#endif |
+} |