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