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