browser_command_controller.h revision 5e3f23d412006dc4db4e659864679f29341e113f
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
19class Browser;
20class BrowserWindow;
21class Profile;
22class ProfileManager;
23
24namespace content {
25struct NativeWebKeyboardEvent;
26}
27
28namespace chrome {
29
30class 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  enum FullScreenMode {
83    // Not in fullscreen mode.
84    FULLSCREEN_DISABLED,
85
86    // Fullscreen mode, occupying the whole screen.
87    FULLSCREEN_NORMAL,
88
89    // Fullscreen mode for metro snap, occupying the full height and 20% of
90    // the screen width.
91    FULLSCREEN_METRO_SNAP,
92  };
93
94  // Overridden from CommandUpdaterDelegate:
95  virtual void ExecuteCommandWithDisposition(
96      int id,
97      WindowOpenDisposition disposition) OVERRIDE;
98
99  // Overridden from ProfileInfoCacheObserver:
100  virtual void OnProfileAdded(const base::FilePath& profile_path) OVERRIDE;
101  virtual void OnProfileWasRemoved(const base::FilePath& profile_path,
102                                   const string16& profile_name) OVERRIDE;
103
104  // Overridden from TabStripModelObserver:
105  virtual void TabInsertedAt(content::WebContents* contents,
106                             int index,
107                             bool foreground) OVERRIDE;
108  virtual void TabDetachedAt(content::WebContents* contents,
109                             int index) OVERRIDE;
110  virtual void TabReplacedAt(TabStripModel* tab_strip_model,
111                             content::WebContents* old_contents,
112                             content::WebContents* new_contents,
113                             int index) OVERRIDE;
114  virtual void TabBlockedStateChanged(content::WebContents* contents,
115                                      int index) OVERRIDE;
116
117  // Overridden from TabRestoreServiceObserver:
118  virtual void TabRestoreServiceChanged(TabRestoreService* service) OVERRIDE;
119  virtual void TabRestoreServiceDestroyed(TabRestoreService* service) OVERRIDE;
120
121  // Returns true if the regular Chrome UI (not the fullscreen one and
122  // not the single-tab one) is shown. Used for updating window command states
123  // only. Consider using SupportsWindowFeature if you need the mentioned
124  // functionality anywhere else.
125  bool IsShowingMainUI();
126
127  // Initialize state for all browser commands.
128  void InitCommandState();
129
130  // Update commands whose state depends on incognito mode availability.
131  void UpdateCommandsForIncognitoAvailability();
132
133  // Update commands whose state depends on the tab's state.
134  void UpdateCommandsForTabState();
135
136  // Updates commands when the content's restrictions change.
137  void UpdateCommandsForContentRestrictionState();
138
139  // Updates commands for enabling developer tools.
140  void UpdateCommandsForDevTools();
141
142  // Updates commands for bookmark editing.
143  void UpdateCommandsForBookmarkEditing();
144
145  // Updates commands that affect the bookmark bar.
146  void UpdateCommandsForBookmarkBar();
147
148  // Updates commands that affect file selection dialogs in aggregate,
149  // namely the save-page-as state and the open-file state.
150  void UpdateCommandsForFileSelectionDialogs();
151
152  // Update commands whose state depends on the type of fullscreen mode the
153  // window is in.
154  void UpdateCommandsForFullscreenMode(FullScreenMode fullscreen_mode);
155
156  // Update commands whose state depends on whether multiple profiles are
157  // allowed.
158  void UpdateCommandsForMultipleProfiles();
159
160  // Updates the printing command state.
161  void UpdatePrintingState();
162
163  // Updates the SHOW_SYNC_SETUP menu entry.
164  void OnSigninAllowedPrefChange();
165
166  // Updates the save-page-as command state.
167  void UpdateSaveAsState();
168
169  // Updates the show-sync command state.
170  void UpdateShowSyncState(bool show_main_ui);
171
172  // Ask the Reload/Stop button to change its icon, and update the Stop command
173  // state.  |is_loading| is true if the current WebContents is loading.
174  // |force| is true if the button should change its icon immediately.
175  void UpdateReloadStopState(bool is_loading, bool force);
176
177  // Updates commands for find.
178  void UpdateCommandsForFind();
179
180  // Add/remove observers for interstitial attachment/detachment from
181  // |contents|.
182  void AddInterstitialObservers(content::WebContents* contents);
183  void RemoveInterstitialObservers(content::WebContents* contents);
184
185  inline BrowserWindow* window();
186  inline Profile* profile();
187
188  Browser* browser_;
189
190  ProfileManager* profile_manager_;
191
192  // The CommandUpdater that manages the browser window commands.
193  CommandUpdater command_updater_;
194
195  // Indicates if command execution is blocked.
196  bool block_command_execution_;
197
198  // Stores the last blocked command id when |block_command_execution_| is true.
199  int last_blocked_command_id_;
200
201  // Stores the disposition type of the last blocked command.
202  WindowOpenDisposition last_blocked_command_disposition_;
203
204  std::vector<InterstitialObserver*> interstitial_observers_;
205
206  PrefChangeRegistrar profile_pref_registrar_;
207  PrefChangeRegistrar local_pref_registrar_;
208  BooleanPrefMember pref_signin_allowed_;
209
210  DISALLOW_COPY_AND_ASSIGN(BrowserCommandController);
211};
212
213}  // namespace chrome
214
215#endif  // CHROME_BROWSER_UI_BROWSER_COMMAND_CONTROLLER_H_
216