background_mode_manager.h revision 0f1bc08d4cfcc34181b0b5cbf065c40f687bf740
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_BACKGROUND_BACKGROUND_MODE_MANAGER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_BACKGROUND_BACKGROUND_MODE_MANAGER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_change_registrar.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/background/background_application_list_model.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_info_cache_observer.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/status_icons/status_icon.h"
15424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chrome/browser/status_icons/status_icon_menu_model.h"
161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/ui/browser_list_observer.h"
1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "components/browser_context_keyed_service/browser_context_keyed_service.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Browser;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CommandLine;
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PrefRegistrySimple;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProfileInfoCache;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StatusIcon;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StatusTray;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Extension;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BackgroundModeManager is responsible for switching Chrome into and out of
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "background mode" and for providing UI for the user to exit Chrome when there
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// are no open browser windows.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Chrome enters background mode whenever there is an application with the
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "background" permission installed. This class monitors the set of
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// installed/loaded extensions to ensure that Chrome enters/exits background
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// mode at the appropriate time.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// When Chrome is in background mode, it will continue running even after the
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// last browser window is closed, until the user explicitly exits the app.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Additionally, when in background mode, Chrome will launch on OS login with
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// no open windows to allow apps with the "background" permission to run in the
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// background.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BackgroundModeManager
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public content::NotificationObserver,
491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      public chrome::BrowserListObserver,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public BackgroundApplicationListModel::Observer,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public ProfileInfoCacheObserver,
52424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      public StatusIconMenuModel::Delegate {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackgroundModeManager(CommandLine* command_line,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        ProfileInfoCache* profile_cache);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~BackgroundModeManager();
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void RegisterPrefs(PrefRegistrySimple* registry);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RegisterProfile(Profile* profile);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void LaunchBackgroundApplication(Profile* profile,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const extensions::Extension* extension);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Returns true if background mode is active.
668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  virtual bool IsBackgroundModeActive();
678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Suspends background mode until either ResumeBackgroundMode is called or
691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Chrome is restarted. This has the same effect as ending background mode
701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // for the current browser session.
711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void SuspendBackgroundMode();
721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Resumes background mode. This ends a suspension of background mode, but
741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // will not start it if it is not enabled.
751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void ResumeBackgroundMode();
761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For testing purposes.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int NumberOfBackgroundModeData();
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class AppBackgroundPageApiTest;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class BackgroundModeManagerTest;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class TestBackgroundModeManager;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(BackgroundModeManagerTest,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           BackgroundAppLoadUnload);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(BackgroundModeManagerTest,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           BackgroundLaunchOnStartup);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(BackgroundModeManagerTest,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           BackgroundAppInstallUninstallWhileDisabled);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(BackgroundModeManagerTest,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           BackgroundModeDisabledPreventsKeepAliveOnStartup);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(BackgroundModeManagerTest,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           DisableBackgroundModeUnderTestFlag);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(BackgroundModeManagerTest,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           EnableAfterBackgroundAppInstall);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(BackgroundModeManagerTest,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           MultiProfile);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(BackgroundModeManagerTest,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           ProfileInfoCacheStorage);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(BackgroundModeManagerTest,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           ProfileInfoCacheObserver);
1020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(BackgroundModeManagerTest,
1030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           BackgroundMenuGeneration);
104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FRIEND_TEST_ALL_PREFIXES(BackgroundAppBrowserTest,
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           ReloadBackgroundApp);
106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
107424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  class BackgroundModeData : public StatusIconMenuModel::Delegate {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit BackgroundModeData(
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int command_id,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Profile* profile);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~BackgroundModeData();
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The cached list of BackgroundApplications.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<BackgroundApplicationListModel> applications_;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
117424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // Overrides from StatusIconMenuModel::Delegate implementation.
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void ExecuteCommand(int command_id, int event_flags) OVERRIDE;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Returns a browser window, or creates one if none are open. Used by
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // operations (like displaying the preferences dialog) that require a
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Browser window.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* GetBrowserWindow();
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Returns the number of background apps for this profile.
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int GetBackgroundAppCount() const;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Builds the profile specific parts of the menu. The menu passed in may
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // be a submenu in the case of multi-profiles or the main menu in the case
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // of the single profile case. If containing_menu is valid, we will add
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // menu as a submenu to it.
132424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    void BuildProfileMenu(StatusIconMenuModel* menu,
133424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                          StatusIconMenuModel* containing_menu);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Set the name associated with this background mode data for displaying in
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the status tray.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void SetName(const string16& new_profile_name);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The name associated with this background mode data. This should match
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the name in the ProfileInfoCache for this profile.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string16 name();
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Used for sorting BackgroundModeData*s.
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static bool BackgroundModeDataCompare(const BackgroundModeData* bmd1,
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          const BackgroundModeData* bmd2);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Command id for the sub menu for this BackgroundModeData.
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int command_id_;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Name associated with this profile which is used to label its submenu.
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string16 name_;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The profile associated with this background app data.
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile_;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ideally we would want our BackgroundModeData to be scoped_ptrs,
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // but since maps copy their entries, we can't used scoped_ptrs.
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Similarly, we can't just have a map of BackgroundModeData objects,
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // since BackgroundModeData contains a scoped_ptr which once again
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // can't be copied. So rather than using BackgroundModeData* which
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we'd have to remember to delete, we use the ref-counted linked_ptr
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // which is similar to a shared_ptr.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef linked_ptr<BackgroundModeData> BackgroundModeInfo;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<Profile*, BackgroundModeInfo> BackgroundModeInfoMap;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // content::NotificationObserver implementation.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Observe(int type,
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationSource& source,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called when the kBackgroundModeEnabled preference changes.
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnBackgroundModeEnabledPrefChanged();
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // BackgroundApplicationListModel::Observer implementation.
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnApplicationDataChanged(const extensions::Extension* extension,
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        Profile* profile) OVERRIDE;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnApplicationListChanged(Profile* profile) OVERRIDE;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overrides from ProfileInfoCacheObserver
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnProfileAdded(const base::FilePath& profile_path) OVERRIDE;
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnProfileWillBeRemoved(
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& profile_path) OVERRIDE;
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnProfileNameChanged(const base::FilePath& profile_path,
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    const string16& old_profile_name) OVERRIDE;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
189424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Overrides from StatusIconMenuModel::Delegate implementation.
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ExecuteCommand(int command_id, int event_flags) OVERRIDE;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // chrome::BrowserListObserver implementation.
1931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void OnBrowserAdded(Browser* browser) OVERRIDE;
1941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invoked when an extension is installed so we can ensure that
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // launch-on-startup is enabled if appropriate. |extension| can be NULL when
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // called from unit tests.
198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void OnBackgroundAppInstalled(
199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const extensions::Extension* extension);
200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Walk the list of profiles and see if an extension or app is being
202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // currently upgraded or reloaded by any profile.  If so, update the
203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // output variables appropriately.
204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void CheckReloadStatus(
205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const extensions::Extension* extension,
206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      bool* is_being_reloaded);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called to make sure that our launch-on-startup mode is properly set.
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (virtual so we can override for tests).
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void EnableLaunchOnStartup(bool should_launch);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invoked when a background app is installed so we can display a
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // platform-specific notification to the user.
214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void DisplayAppInstalledNotification(
215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const extensions::Extension* extension);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invoked to put Chrome in KeepAlive mode - chrome runs in the background
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and has a status bar icon.
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartBackgroundMode();
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invoked to take Chrome out of KeepAlive mode - chrome stops running in
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the background and removes its status bar icon.
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void EndBackgroundMode();
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Enables keep alive and the status tray icon if and only if background mode
2261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // is active and not suspended.
2270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual void UpdateKeepAliveAndTrayIcon();
2281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If --no-startup-window is passed, BackgroundModeManager will manually keep
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // chrome running while waiting for apps to load. This is called when we no
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // longer need to do this (either because the user has chosen to exit chrome
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // manually, or all apps have been loaded).
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void EndKeepAliveForStartup();
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return an appropriate name for a Preferences menu entry.  Preferences is
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // sometimes called Options or Settings.
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 GetPreferencesMenuLabel();
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a status tray icon to allow the user to shutdown Chrome when running
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in background mode. Virtual to enable testing.
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CreateStatusTrayIcon();
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Removes the status tray icon because we are exiting background mode.
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Virtual to enable testing.
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RemoveStatusTrayIcon();
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a context menu, or replace/update an existing context menu, for the
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // status tray icon which, among other things, allows the user to shutdown
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Chrome when running in background mode. All profiles are listed under
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the one context menu.
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void UpdateStatusTrayIconContextMenu();
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the BackgroundModeData associated with this profile. If it does
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // not exist, returns NULL.
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackgroundModeManager::BackgroundModeData* GetBackgroundModeData(
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Profile* const profile) const;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the iterator associated with a particular profile name.
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This should not be used to iterate over the background mode data. It is
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // used to efficiently delete an item from the background mode data map.
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackgroundModeInfoMap::iterator GetBackgroundModeIterator(
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const string16& profile_name);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the "Let chrome run in the background" pref is checked.
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (virtual to allow overriding in tests).
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsBackgroundModePrefEnabled() const;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Turns off background mode if it's currently enabled.
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DisableBackgroundMode();
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Turns on background mode if it's currently disabled.
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void EnableBackgroundMode();
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the number of background apps in the system (virtual to allow
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // overriding in unit tests).
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int GetBackgroundAppCount() const;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the number of background apps for a profile.
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int GetBackgroundAppCountForProfile(Profile* const profile) const;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if we should be in background mode.
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ShouldBeInBackgroundMode() const;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reference to the profile info cache. It is used to update the background
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // app status of profiles when they open/close background apps.
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileInfoCache* profile_cache_;
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registrars for managing our change observers.
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationRegistrar registrar_;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefChangeRegistrar pref_registrar_;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The profile-keyed data for this background mode manager. Keyed on profile.
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackgroundModeInfoMap background_mode_data_;
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reference to our status tray. If null, the platform doesn't support status
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // icons.
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StatusTray* status_tray_;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reference to our status icon (if any) - owned by the StatusTray.
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StatusIcon* status_icon_;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reference to our status icon's context menu (if any) - owned by the
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // status_icon_.
304424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  StatusIconMenuModel* context_menu_;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set to true when we are running in background mode. Allows us to track our
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // current background state so we can take the appropriate action when the
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // user disables/enables background mode via preferences.
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool in_background_mode_;
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set when we are keeping chrome running during the startup process - this
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is required when running with the --no-startup-window flag, as otherwise
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // chrome would immediately exit due to having no open windows.
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool keep_alive_for_startup_;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set to true when Chrome is running with the --keep-alive-for-test flag
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (used for testing background mode without having to install a background
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // app).
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool keep_alive_for_test_;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Set to true when background mode is suspended.
3221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  bool background_mode_suspended_;
3231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Set to true when background mode is keeping Chrome alive.
3251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  bool keeping_alive_;
3261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Provides a command id for each profile as they are created.
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int current_command_id_;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BackgroundModeManager);
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_BACKGROUND_BACKGROUND_MODE_MANAGER_H_
334