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"
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/scoped_vector.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_change_registrar.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/background/background_application_list_model.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_info_cache_observer.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/status_icons/status_icon.h"
16424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chrome/browser/status_icons/status_icon_menu_model.h"
171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/ui/browser_list_observer.h"
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/keyed_service/core/keyed_service.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h"
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/common/extension.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Browser;
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PrefRegistrySimple;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProfileInfoCache;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StatusIcon;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StatusTray;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace base {
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class CommandLine;
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)typedef std::vector<int> CommandIdExtensionVector;
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BackgroundModeManager is responsible for switching Chrome into and out of
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "background mode" and for providing UI for the user to exit Chrome when there
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// are no open browser windows.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Chrome enters background mode whenever there is an application with the
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "background" permission installed. This class monitors the set of
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// installed/loaded extensions to ensure that Chrome enters/exits background
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// mode at the appropriate time.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// When Chrome is in background mode, it will continue running even after the
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// last browser window is closed, until the user explicitly exits the app.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Additionally, when in background mode, Chrome will launch on OS login with
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// no open windows to allow apps with the "background" permission to run in the
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// background.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BackgroundModeManager
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public content::NotificationObserver,
521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      public chrome::BrowserListObserver,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public BackgroundApplicationListModel::Observer,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public ProfileInfoCacheObserver,
55424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      public StatusIconMenuModel::Delegate {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  BackgroundModeManager(base::CommandLine* command_line,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        ProfileInfoCache* profile_cache);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~BackgroundModeManager();
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void RegisterPrefs(PrefRegistrySimple* registry);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RegisterProfile(Profile* profile);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void LaunchBackgroundApplication(Profile* profile,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const extensions::Extension* extension);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Returns true if background mode is active.
698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  virtual bool IsBackgroundModeActive();
708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Suspends background mode until either ResumeBackgroundMode is called or
721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Chrome is restarted. This has the same effect as ending background mode
731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // for the current browser session.
741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void SuspendBackgroundMode();
751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Resumes background mode. This ends a suspension of background mode, but
771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // will not start it if it is not enabled.
781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void ResumeBackgroundMode();
791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For testing purposes.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int NumberOfBackgroundModeData();
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class AppBackgroundPageApiTest;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class BackgroundModeManagerTest;
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  friend class BackgroundModeManagerWithExtensionsTest;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class TestBackgroundModeManager;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(BackgroundModeManagerTest,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           BackgroundAppLoadUnload);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(BackgroundModeManagerTest,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           BackgroundLaunchOnStartup);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(BackgroundModeManagerTest,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           BackgroundAppInstallUninstallWhileDisabled);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(BackgroundModeManagerTest,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           BackgroundModeDisabledPreventsKeepAliveOnStartup);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(BackgroundModeManagerTest,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           DisableBackgroundModeUnderTestFlag);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(BackgroundModeManagerTest,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           EnableAfterBackgroundAppInstall);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(BackgroundModeManagerTest,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           MultiProfile);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(BackgroundModeManagerTest,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           ProfileInfoCacheStorage);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(BackgroundModeManagerTest,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           ProfileInfoCacheObserver);
1060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(BackgroundModeManagerTest,
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                           DeleteBackgroundProfile);
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  FRIEND_TEST_ALL_PREFIXES(BackgroundModeManagerWithExtensionsTest,
1090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           BackgroundMenuGeneration);
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  FRIEND_TEST_ALL_PREFIXES(BackgroundModeManagerWithExtensionsTest,
111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           BackgroundMenuGenerationMultipleProfile);
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  FRIEND_TEST_ALL_PREFIXES(BackgroundModeManagerWithExtensionsTest,
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                           BalloonDisplay);
114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FRIEND_TEST_ALL_PREFIXES(BackgroundAppBrowserTest,
115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           ReloadBackgroundApp);
116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
117424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  class BackgroundModeData : public StatusIconMenuModel::Delegate {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit BackgroundModeData(
120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        Profile* profile,
121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        CommandIdExtensionVector* command_id_extension_vector);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~BackgroundModeData();
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The cached list of BackgroundApplications.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<BackgroundApplicationListModel> applications_;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
127424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // Overrides from StatusIconMenuModel::Delegate implementation.
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void ExecuteCommand(int command_id, int event_flags) OVERRIDE;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Returns a browser window, or creates one if none are open. Used by
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // operations (like displaying the preferences dialog) that require a
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Browser window.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* GetBrowserWindow();
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Returns the number of background apps for this profile.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int GetBackgroundAppCount() const;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Builds the profile specific parts of the menu. The menu passed in may
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // be a submenu in the case of multi-profiles or the main menu in the case
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // of the single profile case. If containing_menu is valid, we will add
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // menu as a submenu to it.
142424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    void BuildProfileMenu(StatusIconMenuModel* menu,
143424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                          StatusIconMenuModel* containing_menu);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Set the name associated with this background mode data for displaying in
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the status tray.
147a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    void SetName(const base::string16& new_profile_name);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The name associated with this background mode data. This should match
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the name in the ProfileInfoCache for this profile.
151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16 name();
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Used for sorting BackgroundModeData*s.
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static bool BackgroundModeDataCompare(const BackgroundModeData* bmd1,
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          const BackgroundModeData* bmd2);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Returns the set of new background apps (apps that have been loaded since
158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // the last call to GetNewBackgroundApps()).
159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    std::set<const extensions::Extension*> GetNewBackgroundApps();
160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Name associated with this profile which is used to label its submenu.
163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16 name_;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The profile associated with this background app data.
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile_;
167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Weak ref vector owned by BackgroundModeManager where the
169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // indices correspond to Command IDs and values correspond to
170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // extension indices. A value of -1 indicates no extension is associated
171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // with the index.
172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    CommandIdExtensionVector* command_id_extension_vector_;
173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // The list of notified extensions for this profile. We track this to ensure
175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // that we never notify the user about the same extension twice in a single
176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // browsing session - this is done because the extension subsystem is not
177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // good about tracking changes to the background permission around
178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // extension reloads, and will sometimes report spurious permission changes.
179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    std::set<extensions::ExtensionId> current_extensions_;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ideally we would want our BackgroundModeData to be scoped_ptrs,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // but since maps copy their entries, we can't used scoped_ptrs.
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Similarly, we can't just have a map of BackgroundModeData objects,
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // since BackgroundModeData contains a scoped_ptr which once again
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // can't be copied. So rather than using BackgroundModeData* which
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we'd have to remember to delete, we use the ref-counted linked_ptr
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // which is similar to a shared_ptr.
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef linked_ptr<BackgroundModeData> BackgroundModeInfo;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<Profile*, BackgroundModeInfo> BackgroundModeInfoMap;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // content::NotificationObserver implementation.
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Observe(int type,
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationSource& source,
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called when the kBackgroundModeEnabled preference changes.
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnBackgroundModeEnabledPrefChanged();
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // BackgroundApplicationListModel::Observer implementation.
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnApplicationDataChanged(const extensions::Extension* extension,
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        Profile* profile) OVERRIDE;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnApplicationListChanged(Profile* profile) OVERRIDE;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overrides from ProfileInfoCacheObserver
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnProfileAdded(const base::FilePath& profile_path) OVERRIDE;
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnProfileWillBeRemoved(
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& profile_path) OVERRIDE;
210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void OnProfileNameChanged(
211a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const base::FilePath& profile_path,
212a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const base::string16& old_profile_name) OVERRIDE;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
214424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Overrides from StatusIconMenuModel::Delegate implementation.
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ExecuteCommand(int command_id, int event_flags) OVERRIDE;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // chrome::BrowserListObserver implementation.
2181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void OnBrowserAdded(Browser* browser) OVERRIDE;
2191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invoked when an extension is installed so we can ensure that
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // launch-on-startup is enabled if appropriate. |extension| can be NULL when
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // called from unit tests.
223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void OnBackgroundAppInstalled(
224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const extensions::Extension* extension);
225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Walk the list of profiles and see if an extension or app is being
227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // currently upgraded or reloaded by any profile.  If so, update the
228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // output variables appropriately.
229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void CheckReloadStatus(
230eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const extensions::Extension* extension,
231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      bool* is_being_reloaded);
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called to make sure that our launch-on-startup mode is properly set.
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (virtual so we can override for tests).
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void EnableLaunchOnStartup(bool should_launch);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invoked when a background app is installed so we can display a
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // platform-specific notification to the user.
239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void DisplayAppInstalledNotification(
240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const extensions::Extension* extension);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invoked to put Chrome in KeepAlive mode - chrome runs in the background
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and has a status bar icon.
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartBackgroundMode();
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invoked to take Chrome out of KeepAlive mode - chrome stops running in
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the background and removes its status bar icon.
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void EndBackgroundMode();
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Enables keep alive and the status tray icon if and only if background mode
2511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // is active and not suspended.
2520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual void UpdateKeepAliveAndTrayIcon();
2531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If --no-startup-window is passed, BackgroundModeManager will manually keep
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // chrome running while waiting for apps to load. This is called when we no
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // longer need to do this (either because the user has chosen to exit chrome
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // manually, or all apps have been loaded).
258a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void DecrementKeepAliveCountForStartup();
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return an appropriate name for a Preferences menu entry.  Preferences is
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // sometimes called Options or Settings.
262a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 GetPreferencesMenuLabel();
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a status tray icon to allow the user to shutdown Chrome when running
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in background mode. Virtual to enable testing.
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CreateStatusTrayIcon();
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Removes the status tray icon because we are exiting background mode.
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Virtual to enable testing.
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RemoveStatusTrayIcon();
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a context menu, or replace/update an existing context menu, for the
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // status tray icon which, among other things, allows the user to shutdown
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Chrome when running in background mode. All profiles are listed under
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the one context menu.
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void UpdateStatusTrayIconContextMenu();
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the BackgroundModeData associated with this profile. If it does
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // not exist, returns NULL.
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackgroundModeManager::BackgroundModeData* GetBackgroundModeData(
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Profile* const profile) const;
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the iterator associated with a particular profile name.
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This should not be used to iterate over the background mode data. It is
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // used to efficiently delete an item from the background mode data map.
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackgroundModeInfoMap::iterator GetBackgroundModeIterator(
287a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const base::string16& profile_name);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the "Let chrome run in the background" pref is checked.
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (virtual to allow overriding in tests).
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsBackgroundModePrefEnabled() const;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Turns off background mode if it's currently enabled.
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DisableBackgroundMode();
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Turns on background mode if it's currently disabled.
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void EnableBackgroundMode();
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the number of background apps in the system (virtual to allow
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // overriding in unit tests).
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int GetBackgroundAppCount() const;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the number of background apps for a profile.
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int GetBackgroundAppCountForProfile(Profile* const profile) const;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if we should be in background mode.
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ShouldBeInBackgroundMode() const;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Finds the BackgroundModeData associated with the last active profile,
3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // if the profile isn't locked. Returns NULL otherwise.
3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BackgroundModeManager::BackgroundModeData*
3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      GetBackgroundModeDataForLastProfile() const;
3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reference to the profile info cache. It is used to update the background
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // app status of profiles when they open/close background apps.
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileInfoCache* profile_cache_;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Registrars for managing our change observers.
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationRegistrar registrar_;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefChangeRegistrar pref_registrar_;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The profile-keyed data for this background mode manager. Keyed on profile.
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackgroundModeInfoMap background_mode_data_;
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Contains the dynamic Command IDs for the entire background menu.
326f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CommandIdExtensionVector command_id_extension_vector_;
327f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
328f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Maintains submenu lifetime for the multiple profile context menu.
329f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ScopedVector<StatusIconMenuModel> submenus;
330f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reference to our status tray. If null, the platform doesn't support status
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // icons.
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StatusTray* status_tray_;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reference to our status icon (if any) - owned by the StatusTray.
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StatusIcon* status_icon_;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reference to our status icon's context menu (if any) - owned by the
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // status_icon_.
340424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  StatusIconMenuModel* context_menu_;
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set to true when we are running in background mode. Allows us to track our
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // current background state so we can take the appropriate action when the
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // user disables/enables background mode via preferences.
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool in_background_mode_;
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set when we are keeping chrome running during the startup process - this
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is required when running with the --no-startup-window flag, as otherwise
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // chrome would immediately exit due to having no open windows.
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool keep_alive_for_startup_;
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set to true when Chrome is running with the --keep-alive-for-test flag
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (used for testing background mode without having to install a background
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // app).
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool keep_alive_for_test_;
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Set to true when background mode is suspended.
3581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  bool background_mode_suspended_;
3591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Set to true when background mode is keeping Chrome alive.
3611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  bool keeping_alive_;
3621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BackgroundModeManager);
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_BACKGROUND_BACKGROUND_MODE_MANAGER_H_
367