| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "app/l10n_util.h" | 5 #include "app/l10n_util.h" |
| 6 #include "app/resource_bundle.h" | 6 #include "app/resource_bundle.h" |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "chrome/app/chrome_dll_resource.h" | 8 #include "chrome/app/chrome_dll_resource.h" |
| 9 #include "chrome/browser/background_mode_manager.h" | 9 #include "chrome/browser/background_mode_manager.h" |
| 10 #include "chrome/browser/browser_list.h" | 10 #include "chrome/browser/browser_list.h" |
| (...skipping 17 matching lines...) Expand all Loading... |
| 28 background_app_count_(0), | 28 background_app_count_(0), |
| 29 status_tray_(NULL), | 29 status_tray_(NULL), |
| 30 status_icon_(NULL) { | 30 status_icon_(NULL) { |
| 31 // If background mode is disabled for unittests, just exit - don't listen for | 31 // If background mode is disabled for unittests, just exit - don't listen for |
| 32 // any notifications. | 32 // any notifications. |
| 33 if (CommandLine::ForCurrentProcess()->HasSwitch( | 33 if (CommandLine::ForCurrentProcess()->HasSwitch( |
| 34 switches::kDisableBackgroundMode)) | 34 switches::kDisableBackgroundMode)) |
| 35 return; | 35 return; |
| 36 | 36 |
| 37 // If the -keep-alive-for-test flag is passed, then always keep chrome running | 37 // If the -keep-alive-for-test flag is passed, then always keep chrome running |
| 38 // in the background until the user explicitly terminates it. | 38 // in the background until the user explicitly terminates it, by acting as if |
| 39 if (CommandLine::ForCurrentProcess()->HasSwitch( | 39 // we loaded a background app. |
| 40 switches::kKeepAliveForTest)) { | 40 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kKeepAliveForTest)) |
| 41 StartBackgroundMode(); | 41 OnBackgroundAppLoaded(); |
| 42 registrar_.Add(this, NotificationType::APP_TERMINATING, | |
| 43 NotificationService::AllSources()); | |
| 44 } | |
| 45 | 42 |
| 46 // When an extension is installed, make sure launch on startup is properly | 43 // When an extension is installed, make sure launch on startup is properly |
| 47 // set if appropriate. Likewise, turn off launch on startup when the last | 44 // set if appropriate. Likewise, turn off launch on startup when the last |
| 48 // background app is uninstalled. | 45 // background app is uninstalled. |
| 49 registrar_.Add(this, NotificationType::EXTENSION_INSTALLED, | 46 registrar_.Add(this, NotificationType::EXTENSION_INSTALLED, |
| 50 Source<Profile>(profile)); | 47 Source<Profile>(profile)); |
| 51 registrar_.Add(this, NotificationType::EXTENSION_UNINSTALLED, | 48 registrar_.Add(this, NotificationType::EXTENSION_UNINSTALLED, |
| 52 Source<Profile>(profile)); | 49 Source<Profile>(profile)); |
| 53 // Listen for when extensions are loaded/unloaded so we can track the | 50 // Listen for when extensions are loaded/unloaded so we can track the |
| 54 // number of background apps. | 51 // number of background apps. |
| 55 registrar_.Add(this, NotificationType::EXTENSION_LOADED, | 52 registrar_.Add(this, NotificationType::EXTENSION_LOADED, |
| 56 Source<Profile>(profile)); | 53 Source<Profile>(profile)); |
| 57 registrar_.Add(this, NotificationType::EXTENSION_UNLOADED, | 54 registrar_.Add(this, NotificationType::EXTENSION_UNLOADED, |
| 58 Source<Profile>(profile)); | 55 Source<Profile>(profile)); |
| 59 | 56 |
| 60 // Check for the presence of background apps after all extensions have been | 57 // Check for the presence of background apps after all extensions have been |
| 61 // loaded, to handle the case where an extension has been manually removed | 58 // loaded, to handle the case where an extension has been manually removed |
| 62 // while Chrome was not running. | 59 // while Chrome was not running. |
| 63 registrar_.Add(this, NotificationType::EXTENSIONS_READY, | 60 registrar_.Add(this, NotificationType::EXTENSIONS_READY, |
| 64 Source<Profile>(profile)); | 61 Source<Profile>(profile)); |
| 65 | 62 |
| 63 // Listen for the application shutting down so we can decrement our KeepAlive |
| 64 // count. |
| 65 registrar_.Add(this, NotificationType::APP_TERMINATING, |
| 66 NotificationService::AllSources()); |
| 67 |
| 68 |
| 66 } | 69 } |
| 67 | 70 |
| 68 BackgroundModeManager::~BackgroundModeManager() { | 71 BackgroundModeManager::~BackgroundModeManager() { |
| 69 // If we're going away, remove our status tray icon so we don't get any events | 72 // If we're going away, remove our status tray icon so we don't get any events |
| 70 // from it. | 73 // from it. |
| 71 RemoveStatusTrayIcon(); | 74 RemoveStatusTrayIcon(); |
| 72 } | 75 } |
| 73 | 76 |
| 74 bool BackgroundModeManager::IsBackgroundModeEnabled() { | 77 bool BackgroundModeManager::IsBackgroundModeEnabled() { |
| 75 return profile_->GetPrefs()->GetBoolean(prefs::kBackgroundModeEnabled); | 78 return profile_->GetPrefs()->GetBoolean(prefs::kBackgroundModeEnabled); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 93 break; | 96 break; |
| 94 case NotificationType::EXTENSION_INSTALLED: | 97 case NotificationType::EXTENSION_INSTALLED: |
| 95 if (IsBackgroundApp(Details<Extension>(details).ptr())) | 98 if (IsBackgroundApp(Details<Extension>(details).ptr())) |
| 96 OnBackgroundAppInstalled(); | 99 OnBackgroundAppInstalled(); |
| 97 break; | 100 break; |
| 98 case NotificationType::EXTENSION_UNINSTALLED: | 101 case NotificationType::EXTENSION_UNINSTALLED: |
| 99 if (IsBackgroundApp(Details<Extension>(details).ptr())) | 102 if (IsBackgroundApp(Details<Extension>(details).ptr())) |
| 100 OnBackgroundAppUninstalled(); | 103 OnBackgroundAppUninstalled(); |
| 101 break; | 104 break; |
| 102 case NotificationType::APP_TERMINATING: | 105 case NotificationType::APP_TERMINATING: |
| 103 // Performing an explicit shutdown, so allow the browser process to exit. | 106 // Performing an explicit shutdown, so exit background mode if we were in |
| 104 // (we only listen for this notification if the keep-alive-for-test flag | 107 // background mode. |
| 105 // is passed). | 108 if (background_app_count_ > 0 && IsBackgroundModeEnabled()) |
| 106 DCHECK(CommandLine::ForCurrentProcess()->HasSwitch( | 109 EndBackgroundMode(); |
| 107 switches::kKeepAliveForTest)); | 110 // Shutting down, so don't listen for any more notifications so we don't |
| 108 EndBackgroundMode(); | 111 // try to re-enter/exit background mode again. |
| 112 registrar_.RemoveAll(); |
| 109 break; | 113 break; |
| 110 default: | 114 default: |
| 111 NOTREACHED(); | 115 NOTREACHED(); |
| 112 break; | 116 break; |
| 113 } | 117 } |
| 114 } | 118 } |
| 115 | 119 |
| 116 bool BackgroundModeManager::IsBackgroundApp(Extension* extension) { | 120 bool BackgroundModeManager::IsBackgroundApp(Extension* extension) { |
| 117 return extension->HasApiPermission(Extension::kBackgroundPermission); | 121 return extension->HasApiPermission(Extension::kBackgroundPermission); |
| 118 } | 122 } |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 240 default: | 244 default: |
| 241 NOTREACHED(); | 245 NOTREACHED(); |
| 242 break; | 246 break; |
| 243 } | 247 } |
| 244 } | 248 } |
| 245 | 249 |
| 246 // static | 250 // static |
| 247 void BackgroundModeManager::RegisterUserPrefs(PrefService* prefs) { | 251 void BackgroundModeManager::RegisterUserPrefs(PrefService* prefs) { |
| 248 prefs->RegisterBooleanPref(prefs::kBackgroundModeEnabled, true); | 252 prefs->RegisterBooleanPref(prefs::kBackgroundModeEnabled, true); |
| 249 } | 253 } |
| OLD | NEW |