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