| // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_BROWSER_BACKGROUND_MODE_MANAGER_H_ |
| #define CHROME_BROWSER_BACKGROUND_MODE_MANAGER_H_ |
| #pragma once |
| |
| #include "base/gtest_prod_util.h" |
| #include "chrome/browser/background_application_list_model.h" |
| #include "chrome/browser/prefs/pref_change_registrar.h" |
| #include "chrome/browser/profiles/profile_keyed_service.h" |
| #include "chrome/browser/status_icons/status_icon.h" |
| #include "content/common/notification_observer.h" |
| #include "content/common/notification_registrar.h" |
| #include "ui/base/models/simple_menu_model.h" |
| |
| class Browser; |
| class CommandLine; |
| class Extension; |
| class PrefService; |
| class Profile; |
| class StatusIcon; |
| class StatusTray; |
| |
| // BackgroundModeManager is responsible for switching Chrome into and out of |
| // "background mode" and for providing UI for the user to exit Chrome when there |
| // are no open browser windows. |
| // |
| // Chrome enters background mode whenever there is an application with the |
| // "background" permission installed. This class monitors the set of |
| // installed/loaded extensions to ensure that Chrome enters/exits background |
| // mode at the appropriate time. |
| // |
| // When Chrome is in background mode, it will continue running even after the |
| // last browser window is closed, until the user explicitly exits the app. |
| // Additionally, when in background mode, Chrome will launch on OS login with |
| // no open windows to allow apps with the "background" permission to run in the |
| // background. |
| class BackgroundModeManager |
| : public NotificationObserver, |
| public ui::SimpleMenuModel::Delegate, |
| public BackgroundApplicationListModel::Observer, |
| public ProfileKeyedService { |
| public: |
| BackgroundModeManager(Profile* profile, CommandLine* command_line); |
| virtual ~BackgroundModeManager(); |
| |
| static bool IsBackgroundModeEnabled(const CommandLine* command_line); |
| static void RegisterPrefs(PrefService* prefs); |
| |
| private: |
| friend class TestBackgroundModeManager; |
| friend class BackgroundModeManagerTest; |
| FRIEND_TEST_ALL_PREFIXES(BackgroundModeManagerTest, |
| BackgroundAppLoadUnload); |
| FRIEND_TEST_ALL_PREFIXES(BackgroundModeManagerTest, |
| BackgroundAppInstallUninstall); |
| FRIEND_TEST_ALL_PREFIXES(BackgroundModeManagerTest, |
| BackgroundPrefDisabled); |
| FRIEND_TEST_ALL_PREFIXES(BackgroundModeManagerTest, |
| BackgroundPrefDynamicDisable); |
| FRIEND_TEST_ALL_PREFIXES(BackgroundModeManagerTest, |
| BackgroundPrefDynamicEnable); |
| |
| // NotificationObserver implementation. |
| virtual void Observe(NotificationType type, |
| const NotificationSource& source, |
| const NotificationDetails& details); |
| |
| // SimpleMenuModel::Delegate implementation. |
| virtual bool IsCommandIdChecked(int command_id) const; |
| virtual bool IsCommandIdEnabled(int command_id) const; |
| virtual bool GetAcceleratorForCommandId(int command_id, |
| ui::Accelerator* accelerator); |
| virtual void ExecuteCommand(int command_id); |
| |
| // Open an application in a new tab, opening a new window if needed. |
| virtual void ExecuteApplication(int application_id); |
| |
| // BackgroundApplicationListModel::Observer implementation. |
| virtual void OnApplicationDataChanged(const Extension* extension); |
| virtual void OnApplicationListChanged(); |
| |
| // Called when an extension is loaded to manage count of background apps. |
| void OnBackgroundAppLoaded(); |
| |
| // Called when an extension is unloaded to manage count of background apps. |
| void OnBackgroundAppUnloaded(); |
| |
| // Invoked when an extension is installed so we can ensure that |
| // launch-on-startup is enabled if appropriate. |extension| can be NULL when |
| // called from unit tests. |
| void OnBackgroundAppInstalled(const Extension* extension); |
| |
| // Invoked when an extension is uninstalled so we can ensure that |
| // launch-on-startup is disabled if appropriate. |
| void OnBackgroundAppUninstalled(); |
| |
| // Called to make sure that our launch-on-startup mode is properly set. |
| // (virtual so we can override for tests). |
| virtual void EnableLaunchOnStartup(bool should_launch); |
| |
| // Invoked when a background app is installed so we can display a |
| // platform-specific notification to the user. |
| void DisplayAppInstalledNotification(const Extension* extension); |
| |
| // Invoked to put Chrome in KeepAlive mode - chrome runs in the background |
| // and has a status bar icon. |
| void StartBackgroundMode(); |
| |
| // Invoked to take Chrome out of KeepAlive mode - chrome stops running in |
| // the background and removes its status bar icon. |
| void EndBackgroundMode(); |
| |
| // If --no-startup-window is passed, BackgroundModeManager will manually keep |
| // chrome running while waiting for apps to load. This is called when we no |
| // longer need to do this (either because the user has chosen to exit chrome |
| // manually, or all apps have been loaded). |
| void EndKeepAliveForStartup(); |
| |
| // Return an appropriate name for a Preferences menu entry. Preferences is |
| // sometimes called Options or Settings. |
| string16 GetPreferencesMenuLabel(); |
| |
| // Create a status tray icon to allow the user to shutdown Chrome when running |
| // in background mode. Virtual to enable testing. |
| virtual void CreateStatusTrayIcon(); |
| |
| // Removes the status tray icon because we are exiting background mode. |
| // Virtual to enable testing. |
| virtual void RemoveStatusTrayIcon(); |
| |
| // Updates the status icon's context menu entry corresponding to |extension| |
| // to use the icon associated with |extension| in the |
| // BackgroundApplicationListModel. |
| void UpdateContextMenuEntryIcon(const Extension* extension); |
| |
| // Create a context menu, or replace/update an existing context menu, for the |
| // status tray icon which, among other things, allows the user to shutdown |
| // Chrome when running in background mode. |
| virtual void UpdateStatusTrayIconContextMenu(); |
| |
| // Returns a browser window, or creates one if none are open. Used by |
| // operations (like displaying the preferences dialog) that require a Browser |
| // window. |
| Browser* GetBrowserWindow(); |
| |
| NotificationRegistrar registrar_; |
| |
| // The parent profile for this object. |
| Profile* profile_; |
| |
| // The cached list of BackgroundApplications. |
| BackgroundApplicationListModel applications_; |
| |
| // The number of background apps currently loaded. |
| int background_app_count_; |
| |
| // Reference to our status icon's context menu (if any) - owned by the |
| // status_icon_ |
| ui::SimpleMenuModel* context_menu_; |
| |
| // Set to the position of the first application entry in the status icon's |
| // context menu. |
| int context_menu_application_offset_; |
| |
| // Set to true when we are running in background mode. Allows us to track our |
| // current background state so we can take the appropriate action when the |
| // user disables/enables background mode via preferences. |
| bool in_background_mode_; |
| |
| // Set when we are keeping chrome running during the startup process - this |
| // is required when running with the --no-startup-window flag, as otherwise |
| // chrome would immediately exit due to having no open windows. |
| bool keep_alive_for_startup_; |
| |
| // Reference to our status tray (owned by our parent profile). If null, the |
| // platform doesn't support status icons. |
| StatusTray* status_tray_; |
| |
| // Reference to our status icon (if any) - owned by the StatusTray. |
| StatusIcon* status_icon_; |
| |
| DISALLOW_COPY_AND_ASSIGN(BackgroundModeManager); |
| }; |
| |
| #endif // CHROME_BROWSER_BACKGROUND_MODE_MANAGER_H_ |