diff options
author | koz@chromium.org <koz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-05-14 12:50:45 +0000 |
---|---|---|
committer | koz@chromium.org <koz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-05-14 12:50:45 +0000 |
commit | 0d025e14b6ce2f686e03974865467d98ee4f2b44 (patch) | |
tree | df239bfc20b5af5cc8b5533bce7c14a4383a1db2 /apps/app_restore_service.cc | |
parent | 3a282dd9e76b74aac5d26bff4f2d08113a0bb0c1 (diff) | |
download | chromium_src-0d025e14b6ce2f686e03974865467d98ee4f2b44.zip chromium_src-0d025e14b6ce2f686e03974865467d98ee4f2b44.tar.gz chromium_src-0d025e14b6ce2f686e03974865467d98ee4f2b44.tar.bz2 |
Restart apps that don't listen to onRestarted() by sending them onLaunched().
We only do this if the app had windows opened the last time it was running,
otherwise apps that were running but had no windows may restart by opening
windows, which manifests as apps coming back on a restart after the user
already closed them.
BUG=230667,167740,162057
Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=199406
Reverted: https://src.chromium.org/viewvc/chrome?view=rev&revision=199409
Review URL: https://chromiumcodereview.appspot.com/14878008
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@199970 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'apps/app_restore_service.cc')
-rw-r--r-- | apps/app_restore_service.cc | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/apps/app_restore_service.cc b/apps/app_restore_service.cc index f8932fb..08d5988 100644 --- a/apps/app_restore_service.cc +++ b/apps/app_restore_service.cc @@ -8,9 +8,11 @@ #include "chrome/browser/extensions/api/file_handlers/app_file_handler_util.h" #include "chrome/browser/extensions/event_router.h" #include "chrome/browser/extensions/extension_host.h" +#include "chrome/browser/extensions/extension_prefs.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/extensions/platform_app_launcher.h" +#include "chrome/browser/ui/extensions/shell_window.h" #include "chrome/common/chrome_notification_types.h" #include "chrome/common/extensions/extension.h" #include "chrome/common/extensions/extension_set.h" @@ -55,6 +57,9 @@ AppRestoreService::AppRestoreService(Profile* profile) registrar_.Add( this, chrome::NOTIFICATION_APP_TERMINATING, content::NotificationService::AllSources()); + extensions::ShellWindowRegistry* shell_window_registry = + extensions::ShellWindowRegistry::Get(profile); + shell_window_registry->AddObserver(this); } void AppRestoreService::HandleStartup(bool should_restore_apps) { @@ -102,11 +107,32 @@ void AppRestoreService::Observe(int type, // Stop listening to NOTIFICATION_EXTENSION_HOST_DESTROYED in particular // as all extension hosts will be destroyed as a result of shutdown. registrar_.RemoveAll(); + // Stop listening to the ShellWindowRegistry for window closes, because + // all windows will be closed as a result of shutdown. + extensions::ShellWindowRegistry* shell_window_registry = + extensions::ShellWindowRegistry::Get(profile_); + shell_window_registry->RemoveObserver(this); break; } } } +void AppRestoreService::OnShellWindowAdded(ShellWindow* shell_window) { + RecordIfAppHasWindows(shell_window->extension_id()); +} + +void AppRestoreService::OnShellWindowIconChanged(ShellWindow* shell_window) { +} + +void AppRestoreService::OnShellWindowRemoved(ShellWindow* shell_window) { + RecordIfAppHasWindows(shell_window->extension_id()); +} + +void AppRestoreService::Shutdown() { + extensions::ShellWindowRegistry* shell_window_registry = + extensions::ShellWindowRegistry::Get(profile_); + shell_window_registry->RemoveObserver(this); +} void AppRestoreService::RecordAppStart(const std::string& extension_id) { ExtensionPrefs* extension_prefs = @@ -122,6 +148,23 @@ void AppRestoreService::RecordAppStop(const std::string& extension_id) { extension_prefs, extension_id); } +void AppRestoreService::RecordIfAppHasWindows( + const std::string& id) { + ExtensionService* extension_service = + ExtensionSystem::Get(profile_)->extension_service(); + ExtensionPrefs* extension_prefs = extension_service->extension_prefs(); + + // If the extension isn't running then we will already have recorded whether + // it had windows or not. + if (!extension_prefs->IsExtensionRunning(id)) + return; + + extensions::ShellWindowRegistry* shell_window_registry = + extensions::ShellWindowRegistry::Get(profile_); + bool has_windows = !shell_window_registry->GetShellWindowsForApp(id).empty(); + extension_prefs->SetHasWindows(id, has_windows); +} + void AppRestoreService::RestoreApp( const Extension* extension, const std::vector<SavedFileEntry>& file_entries) { |