Index: chrome/browser/background_mode_manager.h |
=================================================================== |
--- chrome/browser/background_mode_manager.h (revision 86624) |
+++ chrome/browser/background_mode_manager.h (working copy) |
@@ -6,6 +6,8 @@ |
#define CHROME_BROWSER_BACKGROUND_MODE_MANAGER_H_ |
#pragma once |
+#include <map> |
+ |
#include "base/gtest_prod_util.h" |
#include "chrome/browser/background_application_list_model.h" |
#include "chrome/browser/prefs/pref_change_registrar.h" |
@@ -39,15 +41,16 @@ |
// background. |
class BackgroundModeManager |
: public NotificationObserver, |
- public ui::SimpleMenuModel::Delegate, |
public BackgroundApplicationListModel::Observer, |
public ProfileKeyedService { |
public: |
- BackgroundModeManager(Profile* profile, CommandLine* command_line); |
+ explicit BackgroundModeManager(CommandLine* command_line); |
virtual ~BackgroundModeManager(); |
static void RegisterPrefs(PrefService* prefs); |
+ virtual void RegisterProfile(Profile* profile); |
+ |
private: |
friend class TestBackgroundModeManager; |
friend class BackgroundModeManagerTest; |
@@ -59,25 +62,80 @@ |
BackgroundAppInstallUninstallWhileDisabled); |
FRIEND_TEST_ALL_PREFIXES(BackgroundModeManagerTest, |
EnableAfterBackgroundAppInstall); |
+ FRIEND_TEST_ALL_PREFIXES(BackgroundModeManagerTest, |
+ MultiProfile); |
+ class BackgroundModeData : public ui::SimpleMenuModel::Delegate { |
+ public: |
+ explicit BackgroundModeData( |
+ Profile* profile, |
+ BackgroundModeManager* background_mode_manager); |
+ virtual ~BackgroundModeData(); |
+ |
+ // The cached list of BackgroundApplications. |
+ scoped_ptr<BackgroundApplicationListModel> applications_; |
+ |
+ // Reference to our status icon (if any) - owned by the StatusTray. |
+ StatusIcon* status_icon_; |
+ |
+ // Reference to our status icon's context menu (if any) - owned by the |
+ // status_icon_ |
+ ui::SimpleMenuModel* context_menu_; |
+ |
+ // Set to the position of the first application entry in the status icon's |
+ // context menu. |
+ int context_menu_application_offset_; |
+ |
+ // The profile associated with this background app data. |
+ Profile* profile_; |
+ |
+ // The background mode manager which owns this BackgroundModeData |
+ BackgroundModeManager* background_mode_manager_; |
+ |
+ // Overrides from SimpleMenuModel::Delegate implementation. |
+ virtual bool IsCommandIdChecked(int command_id) const OVERRIDE; |
+ virtual bool IsCommandIdEnabled(int command_id) const OVERRIDE; |
+ virtual bool GetAcceleratorForCommandId(int command_id, |
+ ui::Accelerator* accelerator) |
+ OVERRIDE; |
+ virtual void ExecuteCommand(int command_id) OVERRIDE; |
+ |
+ // Returns a browser window, or creates one if none are open. Used by |
+ // operations (like displaying the preferences dialog) that require a |
+ // Browser window. |
+ Browser* GetBrowserWindow(); |
+ |
+ // Open an application in a new tab, opening a new window if needed. |
+ virtual void ExecuteApplication(int application_id); |
+ |
+ // Updates the status icon's context menu entry corresponding to |
+ // |extension| to use the icon associated with |extension| in the |
+ // BackgroundApplicationListModel. |
+ // TODO(rlp): Remove after creating one status icon. |
+ void UpdateContextMenuEntryIcon(const Extension* extension); |
+ |
+ // Returns whether any of the extensions are background apps. |
+ bool HasBackgroundApp(); |
+ }; |
+ |
+ // Ideally we would want our BackgroundModeData to be scoped_ptrs, |
+ // but since maps copy their entries, we can't used scoped_ptrs. |
+ // Similarly, we can't just have a map of BackgroundModeData objects, |
+ // since BackgroundModeData contains a scoped_ptr which once again |
+ // can't be copied. So rather than using BackgroundModeData* which |
+ // we'd have to remember to delete, we use the ref-counted linked_ptr |
+ // which is similar to a shared_ptr. |
+ typedef linked_ptr<BackgroundModeData> BackgroundModeInfo; |
+ |
// NotificationObserver implementation. |
virtual void Observe(NotificationType type, |
const NotificationSource& source, |
- const NotificationDetails& details); |
+ const NotificationDetails& details) OVERRIDE; |
- // SimpleMenuModel::Delegate implementation. |
- virtual bool IsCommandIdChecked(int command_id) const; |
- virtual bool IsCommandIdEnabled(int command_id) const; |
- virtual bool GetAcceleratorForCommandId(int command_id, |
- ui::Accelerator* accelerator); |
- virtual void ExecuteCommand(int command_id); |
- |
- // Open an application in a new tab, opening a new window if needed. |
- virtual void ExecuteApplication(int application_id); |
- |
// BackgroundApplicationListModel::Observer implementation. |
- virtual void OnApplicationDataChanged(const Extension* extension); |
- virtual void OnApplicationListChanged(); |
+ virtual void OnApplicationDataChanged(const Extension* extension, |
+ Profile* profile) OVERRIDE; |
+ virtual void OnApplicationListChanged(Profile* profile) OVERRIDE; |
// Called when an extension is loaded to manage count of background apps. |
void OnBackgroundAppLoaded(); |
@@ -88,11 +146,11 @@ |
// Invoked when an extension is installed so we can ensure that |
// launch-on-startup is enabled if appropriate. |extension| can be NULL when |
// called from unit tests. |
- void OnBackgroundAppInstalled(const Extension* extension); |
+ void OnBackgroundAppInstalled(const Extension* extension, Profile* profile); |
// Invoked when an extension is uninstalled so we can ensure that |
// launch-on-startup is disabled if appropriate. |
- void OnBackgroundAppUninstalled(); |
+ void OnBackgroundAppUninstalled(Profile* profile); |
// Called to make sure that our launch-on-startup mode is properly set. |
// (virtual so we can override for tests). |
@@ -100,12 +158,17 @@ |
// Invoked when a background app is installed so we can display a |
// platform-specific notification to the user. |
- void DisplayAppInstalledNotification(const Extension* extension); |
+ void DisplayAppInstalledNotification(const Extension* extension, |
+ Profile* profile); |
// Invoked to put Chrome in KeepAlive mode - chrome runs in the background |
// and has a status bar icon. |
void StartBackgroundMode(); |
+ // Invoked to create status icons for any profiles currently running |
+ // background apps so that there is a way to exit Chrome. |
+ void InitStatusTrayIcons(); |
+ |
// Invoked to take Chrome out of KeepAlive mode - chrome stops running in |
// the background and removes its status bar icon. |
void EndBackgroundMode(); |
@@ -122,26 +185,26 @@ |
// Create a status tray icon to allow the user to shutdown Chrome when running |
// in background mode. Virtual to enable testing. |
- virtual void CreateStatusTrayIcon(); |
+ virtual void CreateStatusTrayIcon(Profile* profile); |
// Removes the status tray icon because we are exiting background mode. |
// Virtual to enable testing. |
- virtual void RemoveStatusTrayIcon(); |
+ virtual void RemoveStatusTrayIcon(Profile* profile); |
// Updates the status icon's context menu entry corresponding to |extension| |
// to use the icon associated with |extension| in the |
// BackgroundApplicationListModel. |
- void UpdateContextMenuEntryIcon(const Extension* extension); |
+ void UpdateContextMenuEntryIcon(const Extension* extension, Profile* profile); |
// Create a context menu, or replace/update an existing context menu, for the |
// status tray icon which, among other things, allows the user to shutdown |
// Chrome when running in background mode. |
- virtual void UpdateStatusTrayIconContextMenu(); |
+ virtual void UpdateStatusTrayIconContextMenu(Profile* profile); |
- // Returns a browser window, or creates one if none are open. Used by |
- // operations (like displaying the preferences dialog) that require a Browser |
- // window. |
- Browser* GetBrowserWindow(); |
+ // Returns the BackgroundModeInfo associated with this profile. If it does |
+ // not exist, returns an empty BackgroundModeInfo. |
+ BackgroundModeManager::BackgroundModeInfo GetBackgroundModeInfo( |
+ Profile* profile); |
// Returns true if the "Let chrome run in the background" pref is checked. |
// (virtual to allow overriding in tests). |
@@ -162,23 +225,17 @@ |
NotificationRegistrar registrar_; |
PrefChangeRegistrar pref_registrar_; |
- // The parent profile for this object. |
- Profile* profile_; |
+ // The profile-keyed data for this background mode manager. Keyed on profile. |
+ std::map<Profile*, BackgroundModeInfo> background_mode_data_; |
- // The cached list of BackgroundApplications. |
- BackgroundApplicationListModel applications_; |
+ // Reference to our status tray. If null, the platform doesn't support status |
+ // icons. |
+ StatusTray* status_tray_; |
- // The number of background apps currently loaded. |
+ // The number of background apps currently loaded. This is the total over |
+ // all profiles. |
int background_app_count_; |
- // Reference to our status icon's context menu (if any) - owned by the |
- // status_icon_ |
- ui::SimpleMenuModel* context_menu_; |
- |
- // Set to the position of the first application entry in the status icon's |
- // context menu. |
- int context_menu_application_offset_; |
- |
// Set to true when we are running in background mode. Allows us to track our |
// current background state so we can take the appropriate action when the |
// user disables/enables background mode via preferences. |
@@ -189,13 +246,6 @@ |
// chrome would immediately exit due to having no open windows. |
bool keep_alive_for_startup_; |
- // Reference to our status tray (owned by our parent profile). If null, the |
- // platform doesn't support status icons. |
- StatusTray* status_tray_; |
- |
- // Reference to our status icon (if any) - owned by the StatusTray. |
- StatusIcon* status_icon_; |
- |
DISALLOW_COPY_AND_ASSIGN(BackgroundModeManager); |
}; |