| 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);
 | 
|  };
 | 
|  
 | 
| 
 |