1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_UI_BROWSER_COMMAND_CONTROLLER_H_ 6 #define CHROME_BROWSER_UI_BROWSER_COMMAND_CONTROLLER_H_ 7 8 #include <vector> 9 10 #include "base/prefs/pref_change_registrar.h" 11 #include "base/prefs/pref_member.h" 12 #include "chrome/browser/command_updater.h" 13 #include "chrome/browser/command_updater_delegate.h" 14 #include "chrome/browser/profiles/profile_info_cache_observer.h" 15 #include "chrome/browser/sessions/tab_restore_service_observer.h" 16 #include "chrome/browser/ui/tabs/tab_strip_model_observer.h" 17 #include "ui/base/window_open_disposition.h" 18 19 class Browser; 20 class BrowserWindow; 21 class Profile; 22 class ProfileManager; 23 24 namespace content { 25 struct NativeWebKeyboardEvent; 26 } 27 28 namespace chrome { 29 30 class BrowserCommandController : public CommandUpdaterDelegate, 31 public ProfileInfoCacheObserver, 32 public TabStripModelObserver, 33 public TabRestoreServiceObserver { 34 public: 35 BrowserCommandController(Browser* browser, ProfileManager* profile_manager); 36 virtual ~BrowserCommandController(); 37 38 CommandUpdater* command_updater() { return &command_updater_; } 39 bool block_command_execution() const { return block_command_execution_; } 40 41 // Returns true if |command_id| is a reserved command whose keyboard shortcuts 42 // should not be sent to the renderer or |event| was triggered by a key that 43 // we never want to send to the renderer. 44 bool IsReservedCommandOrKey(int command_id, 45 const content::NativeWebKeyboardEvent& event); 46 47 // Sets if command execution shall be blocked. If |block| is true then 48 // following calls to ExecuteCommand() or ExecuteCommandWithDisposition() 49 // method will not execute the command, and the last blocked command will be 50 // recorded for retrieval. 51 void SetBlockCommandExecution(bool block); 52 53 // Gets the last blocked command after calling SetBlockCommandExecution(true). 54 // Returns the command id or -1 if there is no command blocked. The 55 // disposition type of the command will be stored in |*disposition| if it's 56 // not NULL. 57 int GetLastBlockedCommand(WindowOpenDisposition* disposition); 58 59 // Notifies the controller that state has changed in one of the following 60 // areas and it should update command states. 61 void TabStateChanged(); 62 void ContentRestrictionsChanged(); 63 void FullscreenStateChanged(); 64 void PrintingStateChanged(); 65 void LoadingStateChanged(bool is_loading, bool force); 66 67 // Shared state updating: these functions are static and public to share with 68 // outside code. 69 70 // Updates the open-file state. 71 static void UpdateOpenFileState(CommandUpdater* command_updater); 72 73 // Update commands whose state depends on incognito mode availability and that 74 // only depend on the profile. 75 static void UpdateSharedCommandsForIncognitoAvailability( 76 CommandUpdater* command_updater, 77 Profile* profile); 78 79 private: 80 class InterstitialObserver; 81 82 // Overridden from CommandUpdaterDelegate: 83 virtual void ExecuteCommandWithDisposition( 84 int id, 85 WindowOpenDisposition disposition) OVERRIDE; 86 87 // Overridden from ProfileInfoCacheObserver: 88 virtual void OnProfileAdded(const base::FilePath& profile_path) OVERRIDE; 89 virtual void OnProfileWasRemoved(const base::FilePath& profile_path, 90 const base::string16& profile_name) OVERRIDE; 91 92 // Overridden from TabStripModelObserver: 93 virtual void TabInsertedAt(content::WebContents* contents, 94 int index, 95 bool foreground) OVERRIDE; 96 virtual void TabDetachedAt(content::WebContents* contents, 97 int index) OVERRIDE; 98 virtual void TabReplacedAt(TabStripModel* tab_strip_model, 99 content::WebContents* old_contents, 100 content::WebContents* new_contents, 101 int index) OVERRIDE; 102 virtual void TabBlockedStateChanged(content::WebContents* contents, 103 int index) OVERRIDE; 104 105 // Overridden from TabRestoreServiceObserver: 106 virtual void TabRestoreServiceChanged(TabRestoreService* service) OVERRIDE; 107 virtual void TabRestoreServiceDestroyed(TabRestoreService* service) OVERRIDE; 108 109 // Returns true if the regular Chrome UI (not the fullscreen one and 110 // not the single-tab one) is shown. Used for updating window command states 111 // only. Consider using SupportsWindowFeature if you need the mentioned 112 // functionality anywhere else. 113 bool IsShowingMainUI(); 114 115 // Initialize state for all browser commands. 116 void InitCommandState(); 117 118 // Update commands whose state depends on incognito mode availability. 119 void UpdateCommandsForIncognitoAvailability(); 120 121 // Update commands whose state depends on the tab's state. 122 void UpdateCommandsForTabState(); 123 124 // Updates commands when the content's restrictions change. 125 void UpdateCommandsForContentRestrictionState(); 126 127 // Updates commands for enabling developer tools. 128 void UpdateCommandsForDevTools(); 129 130 // Updates commands for bookmark editing. 131 void UpdateCommandsForBookmarkEditing(); 132 133 // Updates commands that affect the bookmark bar. 134 void UpdateCommandsForBookmarkBar(); 135 136 // Updates commands that affect file selection dialogs in aggregate, 137 // namely the save-page-as state and the open-file state. 138 void UpdateCommandsForFileSelectionDialogs(); 139 140 // Update commands whose state depends on the type of fullscreen mode the 141 // window is in. 142 void UpdateCommandsForFullscreenMode(); 143 144 // Update commands whose state depends on whether multiple profiles are 145 // allowed. 146 void UpdateCommandsForMultipleProfiles(); 147 148 // Updates the printing command state. 149 void UpdatePrintingState(); 150 151 // Updates the SHOW_SYNC_SETUP menu entry. 152 void OnSigninAllowedPrefChange(); 153 154 // Updates the save-page-as command state. 155 void UpdateSaveAsState(); 156 157 // Updates the show-sync command state. 158 void UpdateShowSyncState(bool show_main_ui); 159 160 // Ask the Reload/Stop button to change its icon, and update the Stop command 161 // state. |is_loading| is true if the current WebContents is loading. 162 // |force| is true if the button should change its icon immediately. 163 void UpdateReloadStopState(bool is_loading, bool force); 164 165 // Updates commands for find. 166 void UpdateCommandsForFind(); 167 168 // Add/remove observers for interstitial attachment/detachment from 169 // |contents|. 170 void AddInterstitialObservers(content::WebContents* contents); 171 void RemoveInterstitialObservers(content::WebContents* contents); 172 173 inline BrowserWindow* window(); 174 inline Profile* profile(); 175 176 Browser* browser_; 177 178 ProfileManager* profile_manager_; 179 180 // The CommandUpdater that manages the browser window commands. 181 CommandUpdater command_updater_; 182 183 // Indicates if command execution is blocked. 184 bool block_command_execution_; 185 186 // Stores the last blocked command id when |block_command_execution_| is true. 187 int last_blocked_command_id_; 188 189 // Stores the disposition type of the last blocked command. 190 WindowOpenDisposition last_blocked_command_disposition_; 191 192 std::vector<InterstitialObserver*> interstitial_observers_; 193 194 PrefChangeRegistrar profile_pref_registrar_; 195 PrefChangeRegistrar local_pref_registrar_; 196 BooleanPrefMember pref_signin_allowed_; 197 198 DISALLOW_COPY_AND_ASSIGN(BrowserCommandController); 199 }; 200 201 } // namespace chrome 202 203 #endif // CHROME_BROWSER_UI_BROWSER_COMMAND_CONTROLLER_H_ 204