blob: ab25a9acb600d22fc0a6020a484a39ebc720ec66 [file] [log] [blame]
[email protected]5d98294912012-06-27 22:57:401// 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#include "chrome/browser/ui/browser_command_controller.h"
6
[email protected]488e3952013-11-18 05:29:147#include "base/command_line.h"
[email protected]3853a4c2013-02-11 17:15:578#include "base/prefs/pref_service.h"
[email protected]5d98294912012-06-27 22:57:409#include "chrome/app/chrome_command_ids.h"
10#include "chrome/browser/browser_process.h"
[email protected]dcc8fbc2013-07-12 00:54:0911#include "chrome/browser/chrome_notification_types.h"
[email protected]5d98294912012-06-27 22:57:4012#include "chrome/browser/defaults.h"
13#include "chrome/browser/extensions/extension_service.h"
benwells39f23ae2014-08-27 08:01:5214#include "chrome/browser/extensions/extension_util.h"
[email protected]2e9d79f2013-08-16 05:45:5615#include "chrome/browser/lifetime/application_lifetime.h"
[email protected]5d98294912012-06-27 22:57:4016#include "chrome/browser/prefs/incognito_mode_prefs.h"
[email protected]5d98294912012-06-27 22:57:4017#include "chrome/browser/profiles/profile.h"
mlermane01e6de2014-09-29 19:26:4718#include "chrome/browser/profiles/profile_manager.h"
[email protected]5d98294912012-06-27 22:57:4019#include "chrome/browser/sessions/tab_restore_service.h"
20#include "chrome/browser/sessions/tab_restore_service_factory.h"
[email protected]0b32f9b62012-09-17 19:08:0321#include "chrome/browser/shell_integration.h"
[email protected]3d27d272013-07-31 03:15:1622#include "chrome/browser/signin/signin_promo.h"
[email protected]5d98294912012-06-27 22:57:4023#include "chrome/browser/sync/profile_sync_service.h"
24#include "chrome/browser/sync/profile_sync_service_factory.h"
25#include "chrome/browser/ui/bookmarks/bookmark_tab_helper.h"
26#include "chrome/browser/ui/browser.h"
27#include "chrome/browser/ui/browser_commands.h"
28#include "chrome/browser/ui/browser_window.h"
29#include "chrome/browser/ui/chrome_pages.h"
[email protected]5d98294912012-06-27 22:57:4030#include "chrome/browser/ui/tabs/tab_strip_model.h"
[email protected]00a1cc5b2012-11-07 13:44:5131#include "chrome/browser/ui/tabs/tab_strip_model_utils.h"
[email protected]2056c3192013-10-21 22:40:5132#include "chrome/browser/ui/webui/inspect_ui.h"
[email protected]488e3952013-11-18 05:29:1433#include "chrome/common/chrome_switches.h"
[email protected]3c71576ce2013-07-23 02:00:0134#include "chrome/common/content_restriction.h"
[email protected]5d98294912012-06-27 22:57:4035#include "chrome/common/pref_names.h"
36#include "chrome/common/profiling.h"
37#include "content/public/browser/native_web_keyboard_event.h"
38#include "content/public/browser/navigation_controller.h"
39#include "content/public/browser/navigation_entry.h"
[email protected]6708dbc2012-11-04 00:17:2240#include "content/public/browser/user_metrics.h"
[email protected]5d98294912012-06-27 22:57:4041#include "content/public/browser/web_contents.h"
[email protected]20ca0382013-02-28 19:50:0742#include "content/public/browser/web_contents_observer.h"
[email protected]5d98294912012-06-27 22:57:4043#include "content/public/common/url_constants.h"
[email protected]03d25812014-06-22 19:41:5544#include "extensions/browser/extension_system.h"
[email protected]7e9acd082013-09-17 23:31:1645#include "ui/events/keycodes/keyboard_codes.h"
[email protected]5d98294912012-06-27 22:57:4046
[email protected]9c4d68332013-01-30 13:34:4147#if defined(OS_MACOSX)
48#include "chrome/browser/ui/browser_commands_mac.h"
49#endif
50
[email protected]5d98294912012-06-27 22:57:4051#if defined(OS_WIN)
52#include "base/win/metro.h"
[email protected]a43ed002013-02-05 19:47:5453#include "base/win/windows_version.h"
[email protected]471e1e82013-08-14 09:53:5254#include "chrome/browser/ui/apps/apps_metro_handler_win.h"
[email protected]2d0f80f2013-11-01 22:47:1855#include "content/public/browser/gpu_data_manager.h"
[email protected]5d98294912012-06-27 22:57:4056#endif
57
[email protected]4b0bcef2012-09-27 00:20:5658#if defined(USE_ASH)
[email protected]fa9412762013-09-04 23:31:3359#include "ash/accelerators/accelerator_commands.h"
[email protected]4b0bcef2012-09-27 00:20:5660#include "chrome/browser/ui/ash/ash_util.h"
61#endif
62
[email protected]d12cc5e2013-10-19 18:25:0663#if defined(OS_CHROMEOS)
[email protected]7c43e7fe2013-11-01 13:35:1764#include "ash/multi_profile_uma.h"
[email protected]fdf74bf2014-04-30 21:24:0265#include "ash/session/session_state_delegate.h"
[email protected]d12cc5e2013-10-19 18:25:0666#include "ash/shell.h"
[email protected]0c930812014-01-30 18:01:4767#include "chrome/browser/ui/ash/multi_user/multi_user_context_menu.h"
[email protected]5226f1e2013-11-09 04:12:1068#include "chrome/browser/ui/ash/multi_user/multi_user_window_manager.h"
caelyn4e4e08a2015-02-04 21:27:4969#include "chrome/browser/ui/browser_commands_chromeos.h"
[email protected]d12cc5e2013-10-19 18:25:0670#endif
71
[email protected]d5bedb6d2014-04-08 10:49:3272#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
73#include "ui/events/linux/text_edit_key_bindings_delegate_auralinux.h"
[email protected]1e2172f2014-04-01 17:32:3474#endif
75
[email protected]5d98294912012-06-27 22:57:4076using content::NavigationEntry;
77using content::NavigationController;
78using content::WebContents;
79
80namespace {
81
[email protected]32dfede2013-08-25 15:48:2582enum WindowState {
83 // Not in fullscreen mode.
84 WINDOW_STATE_NOT_FULLSCREEN,
85
86 // Fullscreen mode, occupying the whole screen.
87 WINDOW_STATE_FULLSCREEN,
88
89 // Fullscreen mode for metro snap, occupying the full height and 20% of
90 // the screen width.
91 WINDOW_STATE_METRO_SNAP,
92};
93
[email protected]5d98294912012-06-27 22:57:4094// Returns |true| if entry has an internal chrome:// URL, |false| otherwise.
95bool HasInternalURL(const NavigationEntry* entry) {
96 if (!entry)
97 return false;
98
99 // Check the |virtual_url()| first. This catches regular chrome:// URLs
100 // including URLs that were rewritten (such as chrome://bookmarks).
[email protected]2d9748b22014-02-11 00:17:29101 if (entry->GetVirtualURL().SchemeIs(content::kChromeUIScheme))
[email protected]5d98294912012-06-27 22:57:40102 return true;
103
104 // If the |virtual_url()| isn't a chrome:// URL, check if it's actually
105 // view-source: of a chrome:// URL.
[email protected]dbdda5402013-05-30 22:13:48106 if (entry->GetVirtualURL().SchemeIs(content::kViewSourceScheme))
[email protected]2d9748b22014-02-11 00:17:29107 return entry->GetURL().SchemeIs(content::kChromeUIScheme);
[email protected]5d98294912012-06-27 22:57:40108
109 return false;
110}
111
[email protected]0b32f9b62012-09-17 19:08:03112#if defined(OS_WIN)
113// Windows 8 specific helper class to manage DefaultBrowserWorker. It does the
114// following asynchronous actions in order:
115// 1- Check that chrome is the default browser
116// 2- If we are the default, restart chrome in metro and exit
117// 3- If not the default browser show the 'select default browser' system dialog
118// 4- When dialog dismisses check again who got made the default
119// 5- If we are the default then restart chrome in metro and exit
120// 6- If we are not the default exit.
121//
122// Note: this class deletes itself.
[email protected]24ced7dc02013-04-04 08:32:39123class SwitchToMetroUIHandler
[email protected]0b32f9b62012-09-17 19:08:03124 : public ShellIntegration::DefaultWebClientObserver {
125 public:
[email protected]24ced7dc02013-04-04 08:32:39126 SwitchToMetroUIHandler()
[email protected]d4b2d232013-04-30 21:14:23127 : default_browser_worker_(
128 new ShellIntegration::DefaultBrowserWorker(this)),
[email protected]0b32f9b62012-09-17 19:08:03129 first_check_(true) {
130 default_browser_worker_->StartCheckIsDefault();
131 }
132
nickddb02ac2015-04-24 20:45:38133 ~SwitchToMetroUIHandler() override {
[email protected]0b32f9b62012-09-17 19:08:03134 default_browser_worker_->ObserverDestroyed();
135 }
136
137 private:
nickddb02ac2015-04-24 20:45:38138 void SetDefaultWebClientUIState(
mostynb205d6252014-10-04 00:49:22139 ShellIntegration::DefaultWebClientUIState state) override {
[email protected]0b32f9b62012-09-17 19:08:03140 switch (state) {
141 case ShellIntegration::STATE_PROCESSING:
142 return;
143 case ShellIntegration::STATE_UNKNOWN :
144 break;
145 case ShellIntegration::STATE_IS_DEFAULT:
[email protected]d51373d2013-10-31 15:22:00146 chrome::AttemptRestartToMetroMode();
[email protected]0b32f9b62012-09-17 19:08:03147 break;
148 case ShellIntegration::STATE_NOT_DEFAULT:
149 if (first_check_) {
150 default_browser_worker_->StartSetAsDefault();
151 return;
152 }
153 break;
154 default:
155 NOTREACHED();
156 }
157 delete this;
158 }
159
nickddb02ac2015-04-24 20:45:38160 void OnSetAsDefaultConcluded(bool success) override {
[email protected]0b32f9b62012-09-17 19:08:03161 if (!success) {
162 delete this;
163 return;
164 }
165 first_check_ = false;
166 default_browser_worker_->StartCheckIsDefault();
167 }
168
nickddb02ac2015-04-24 20:45:38169 bool IsInteractiveSetDefaultPermitted() override {
[email protected]0b32f9b62012-09-17 19:08:03170 return true;
171 }
172
173 scoped_refptr<ShellIntegration::DefaultBrowserWorker> default_browser_worker_;
174 bool first_check_;
175
[email protected]24ced7dc02013-04-04 08:32:39176 DISALLOW_COPY_AND_ASSIGN(SwitchToMetroUIHandler);
[email protected]0b32f9b62012-09-17 19:08:03177};
178#endif // defined(OS_WIN)
179
[email protected]5d98294912012-06-27 22:57:40180} // namespace
181
182namespace chrome {
183
184///////////////////////////////////////////////////////////////////////////////
185// BrowserCommandController, public:
186
[email protected]338416c02014-05-13 16:47:06187BrowserCommandController::BrowserCommandController(Browser* browser)
[email protected]5d98294912012-06-27 22:57:40188 : browser_(browser),
[email protected]d4b2d232013-04-30 21:14:23189 command_updater_(this),
[email protected]5d98294912012-06-27 22:57:40190 block_command_execution_(false),
191 last_blocked_command_id_(-1),
192 last_blocked_command_disposition_(CURRENT_TAB) {
193 browser_->tab_strip_model()->AddObserver(this);
194 PrefService* local_state = g_browser_process->local_state();
195 if (local_state) {
196 local_pref_registrar_.Init(local_state);
[email protected]9ec3ea5b2012-12-03 18:14:30197 local_pref_registrar_.Add(
198 prefs::kAllowFileSelectionDialogs,
199 base::Bind(
200 &BrowserCommandController::UpdateCommandsForFileSelectionDialogs,
201 base::Unretained(this)));
[email protected]5d98294912012-06-27 22:57:40202 }
203
204 profile_pref_registrar_.Init(profile()->GetPrefs());
[email protected]9ec3ea5b2012-12-03 18:14:30205 profile_pref_registrar_.Add(
206 prefs::kDevToolsDisabled,
207 base::Bind(&BrowserCommandController::UpdateCommandsForDevTools,
208 base::Unretained(this)));
209 profile_pref_registrar_.Add(
tfarina3bddbe112014-08-28 05:29:32210 bookmarks::prefs::kEditBookmarksEnabled,
[email protected]9ec3ea5b2012-12-03 18:14:30211 base::Bind(&BrowserCommandController::UpdateCommandsForBookmarkEditing,
212 base::Unretained(this)));
213 profile_pref_registrar_.Add(
tfarina3bddbe112014-08-28 05:29:32214 bookmarks::prefs::kShowBookmarkBar,
[email protected]9ec3ea5b2012-12-03 18:14:30215 base::Bind(&BrowserCommandController::UpdateCommandsForBookmarkBar,
216 base::Unretained(this)));
217 profile_pref_registrar_.Add(
218 prefs::kIncognitoModeAvailability,
219 base::Bind(
220 &BrowserCommandController::UpdateCommandsForIncognitoAvailability,
221 base::Unretained(this)));
222 profile_pref_registrar_.Add(
223 prefs::kPrintingEnabled,
224 base::Bind(&BrowserCommandController::UpdatePrintingState,
225 base::Unretained(this)));
[email protected]32dfede2013-08-25 15:48:25226#if !defined(OS_MACOSX)
227 profile_pref_registrar_.Add(
228 prefs::kFullscreenAllowed,
229 base::Bind(&BrowserCommandController::UpdateCommandsForFullscreenMode,
230 base::Unretained(this)));
231#endif
[email protected]074311a2013-02-28 23:14:09232 pref_signin_allowed_.Init(
233 prefs::kSigninAllowed,
234 profile()->GetOriginalProfile()->GetPrefs(),
235 base::Bind(&BrowserCommandController::OnSigninAllowedPrefChange,
236 base::Unretained(this)));
[email protected]5d98294912012-06-27 22:57:40237
238 InitCommandState();
239
240 TabRestoreService* tab_restore_service =
241 TabRestoreServiceFactory::GetForProfile(profile());
242 if (tab_restore_service) {
243 tab_restore_service->AddObserver(this);
244 TabRestoreServiceChanged(tab_restore_service);
245 }
[email protected]5d98294912012-06-27 22:57:40246}
247
248BrowserCommandController::~BrowserCommandController() {
[email protected]95e39472012-10-05 23:37:36249 // TabRestoreService may have been shutdown by the time we get here. Don't
250 // trigger creating it.
[email protected]5d98294912012-06-27 22:57:40251 TabRestoreService* tab_restore_service =
[email protected]95e39472012-10-05 23:37:36252 TabRestoreServiceFactory::GetForProfileIfExisting(profile());
[email protected]5d98294912012-06-27 22:57:40253 if (tab_restore_service)
254 tab_restore_service->RemoveObserver(this);
255 profile_pref_registrar_.RemoveAll();
256 local_pref_registrar_.RemoveAll();
257 browser_->tab_strip_model()->RemoveObserver(this);
258}
259
260bool BrowserCommandController::IsReservedCommandOrKey(
261 int command_id,
262 const content::NativeWebKeyboardEvent& event) {
263 // In Apps mode, no keys are reserved.
264 if (browser_->is_app())
265 return false;
266
267#if defined(OS_CHROMEOS)
[email protected]397abd32013-08-21 05:44:19268 // On Chrome OS, the top row of keys are mapped to browser actions like
269 // back/forward or refresh. We don't want web pages to be able to change the
270 // behavior of these keys. Ash handles F4 and up; this leaves us needing to
271 // reserve browser back/forward and refresh here.
[email protected]5d98294912012-06-27 22:57:40272 ui::KeyboardCode key_code =
[email protected]3642e2d2012-10-29 21:31:14273 static_cast<ui::KeyboardCode>(event.windowsKeyCode);
[email protected]397abd32013-08-21 05:44:19274 if ((key_code == ui::VKEY_BROWSER_BACK && command_id == IDC_BACK) ||
275 (key_code == ui::VKEY_BROWSER_FORWARD && command_id == IDC_FORWARD) ||
276 (key_code == ui::VKEY_BROWSER_REFRESH && command_id == IDC_RELOAD)) {
[email protected]5d98294912012-06-27 22:57:40277 return true;
278 }
279#endif
280
281 if (window()->IsFullscreen() && command_id == IDC_FULLSCREEN)
282 return true;
[email protected]1e2172f2014-04-01 17:32:34283
[email protected]893124a22014-04-15 00:45:28284#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
[email protected]1e2172f2014-04-01 17:32:34285 // If this key was registered by the user as a content editing hotkey, then
286 // it is not reserved.
[email protected]d5bedb6d2014-04-08 10:49:32287 ui::TextEditKeyBindingsDelegateAuraLinux* delegate =
[email protected]1e2172f2014-04-01 17:32:34288 ui::GetTextEditKeyBindingsDelegate();
[email protected]47e8e7542014-04-03 07:52:42289 if (delegate && event.os_event && delegate->MatchEvent(*event.os_event, NULL))
[email protected]1e2172f2014-04-01 17:32:34290 return false;
291#endif
292
[email protected]5d98294912012-06-27 22:57:40293 return command_id == IDC_CLOSE_TAB ||
294 command_id == IDC_CLOSE_WINDOW ||
295 command_id == IDC_NEW_INCOGNITO_WINDOW ||
296 command_id == IDC_NEW_TAB ||
297 command_id == IDC_NEW_WINDOW ||
298 command_id == IDC_RESTORE_TAB ||
299 command_id == IDC_SELECT_NEXT_TAB ||
300 command_id == IDC_SELECT_PREVIOUS_TAB ||
[email protected]3642e2d2012-10-29 21:31:14301 command_id == IDC_EXIT;
[email protected]5d98294912012-06-27 22:57:40302}
303
304void BrowserCommandController::SetBlockCommandExecution(bool block) {
305 block_command_execution_ = block;
306 if (block) {
307 last_blocked_command_id_ = -1;
308 last_blocked_command_disposition_ = CURRENT_TAB;
309 }
310}
311
312int BrowserCommandController::GetLastBlockedCommand(
313 WindowOpenDisposition* disposition) {
314 if (disposition)
315 *disposition = last_blocked_command_disposition_;
316 return last_blocked_command_id_;
317}
318
319void BrowserCommandController::TabStateChanged() {
320 UpdateCommandsForTabState();
321}
322
[email protected]d93dbd12014-08-04 23:42:53323void BrowserCommandController::ZoomStateChanged() {
324 UpdateCommandsForZoomState();
325}
326
[email protected]5d98294912012-06-27 22:57:40327void BrowserCommandController::ContentRestrictionsChanged() {
328 UpdateCommandsForContentRestrictionState();
329}
330
331void BrowserCommandController::FullscreenStateChanged() {
[email protected]32dfede2013-08-25 15:48:25332 UpdateCommandsForFullscreenMode();
[email protected]5d98294912012-06-27 22:57:40333}
334
335void BrowserCommandController::PrintingStateChanged() {
336 UpdatePrintingState();
337}
338
339void BrowserCommandController::LoadingStateChanged(bool is_loading,
340 bool force) {
341 UpdateReloadStopState(is_loading, force);
342}
343
wittman76df71db32014-12-18 23:26:58344void BrowserCommandController::ExtensionStateChanged() {
345 // Extensions may disable the bookmark editing commands.
346 UpdateCommandsForBookmarkEditing();
347}
348
[email protected]5d98294912012-06-27 22:57:40349////////////////////////////////////////////////////////////////////////////////
[email protected]de0d0f42012-12-06 21:27:11350// BrowserCommandController, CommandUpdaterDelegate implementation:
[email protected]5d98294912012-06-27 22:57:40351
352void BrowserCommandController::ExecuteCommandWithDisposition(
[email protected]de0d0f42012-12-06 21:27:11353 int id,
354 WindowOpenDisposition disposition) {
[email protected]5d98294912012-06-27 22:57:40355 // No commands are enabled if there is not yet any selected tab.
356 // TODO(pkasting): It seems like we should not need this, because either
357 // most/all commands should not have been enabled yet anyway or the ones that
358 // are enabled should be global, or safe themselves against having no selected
359 // tab. However, Ben says he tried removing this before and got lots of
360 // crashes, e.g. from Windows sending WM_COMMANDs at random times during
361 // window construction. This probably could use closer examination someday.
[email protected]59253a652012-11-20 00:17:26362 if (browser_->tab_strip_model()->active_index() == TabStripModel::kNoTab)
[email protected]5d98294912012-06-27 22:57:40363 return;
364
365 DCHECK(command_updater_.IsCommandEnabled(id)) << "Invalid/disabled command "
366 << id;
367
368 // If command execution is blocked then just record the command and return.
369 if (block_command_execution_) {
370 // We actually only allow no more than one blocked command, otherwise some
371 // commands maybe lost.
372 DCHECK_EQ(last_blocked_command_id_, -1);
373 last_blocked_command_id_ = id;
374 last_blocked_command_disposition_ = disposition;
375 return;
376 }
377
378 // The order of commands in this switch statement must match the function
379 // declaration order in browser.h!
380 switch (id) {
381 // Navigation commands
382 case IDC_BACK:
383 GoBack(browser_, disposition);
384 break;
385 case IDC_FORWARD:
386 GoForward(browser_, disposition);
387 break;
388 case IDC_RELOAD:
389 Reload(browser_, disposition);
390 break;
[email protected]58e29032012-08-06 20:19:57391 case IDC_RELOAD_CLEARING_CACHE:
392 ClearCache(browser_);
393 // FALL THROUGH
[email protected]5d98294912012-06-27 22:57:40394 case IDC_RELOAD_IGNORING_CACHE:
395 ReloadIgnoringCache(browser_, disposition);
396 break;
397 case IDC_HOME:
398 Home(browser_, disposition);
399 break;
400 case IDC_OPEN_CURRENT_URL:
401 OpenCurrentURL(browser_);
402 break;
403 case IDC_STOP:
404 Stop(browser_);
405 break;
406
407 // Window management commands
408 case IDC_NEW_WINDOW:
409 NewWindow(browser_);
410 break;
411 case IDC_NEW_INCOGNITO_WINDOW:
412 NewIncognitoWindow(browser_);
413 break;
414 case IDC_CLOSE_WINDOW:
[email protected]e6e30ac2014-01-13 21:24:39415 content::RecordAction(base::UserMetricsAction("CloseWindowByKey"));
[email protected]04b9e692012-08-24 14:49:09416 CloseWindow(browser_);
[email protected]5d98294912012-06-27 22:57:40417 break;
418 case IDC_NEW_TAB:
419 NewTab(browser_);
420 break;
421 case IDC_CLOSE_TAB:
[email protected]e6e30ac2014-01-13 21:24:39422 content::RecordAction(base::UserMetricsAction("CloseTabByKey"));
[email protected]04b9e692012-08-24 14:49:09423 CloseTab(browser_);
[email protected]5d98294912012-06-27 22:57:40424 break;
425 case IDC_SELECT_NEXT_TAB:
[email protected]e6e30ac2014-01-13 21:24:39426 content::RecordAction(base::UserMetricsAction("Accel_SelectNextTab"));
[email protected]5d98294912012-06-27 22:57:40427 SelectNextTab(browser_);
428 break;
429 case IDC_SELECT_PREVIOUS_TAB:
[email protected]0db969d2013-05-30 18:26:16430 content::RecordAction(
[email protected]e6e30ac2014-01-13 21:24:39431 base::UserMetricsAction("Accel_SelectPreviousTab"));
[email protected]5d98294912012-06-27 22:57:40432 SelectPreviousTab(browser_);
433 break;
[email protected]5d98294912012-06-27 22:57:40434 case IDC_MOVE_TAB_NEXT:
435 MoveTabNext(browser_);
436 break;
437 case IDC_MOVE_TAB_PREVIOUS:
438 MoveTabPrevious(browser_);
439 break;
440 case IDC_SELECT_TAB_0:
441 case IDC_SELECT_TAB_1:
442 case IDC_SELECT_TAB_2:
443 case IDC_SELECT_TAB_3:
444 case IDC_SELECT_TAB_4:
445 case IDC_SELECT_TAB_5:
446 case IDC_SELECT_TAB_6:
447 case IDC_SELECT_TAB_7:
448 SelectNumberedTab(browser_, id - IDC_SELECT_TAB_0);
449 break;
450 case IDC_SELECT_LAST_TAB:
451 SelectLastTab(browser_);
452 break;
453 case IDC_DUPLICATE_TAB:
454 DuplicateTab(browser_);
455 break;
456 case IDC_RESTORE_TAB:
457 RestoreTab(browser_);
458 break;
[email protected]5d98294912012-06-27 22:57:40459 case IDC_SHOW_AS_TAB:
460 ConvertPopupToTabbedBrowser(browser_);
461 break;
462 case IDC_FULLSCREEN:
[email protected]9c4d68332013-01-30 13:34:41463#if defined(OS_MACOSX)
andresantosob5753852014-11-21 23:07:56464 chrome::ToggleFullscreenWithToolbarOrFallback(browser_);
[email protected]9c4d68332013-01-30 13:34:41465#else
[email protected]3f32b9b2012-07-09 16:59:28466 chrome::ToggleFullscreenMode(browser_);
[email protected]9c4d68332013-01-30 13:34:41467#endif
[email protected]5d98294912012-06-27 22:57:40468 break;
[email protected]770c6d82012-09-06 22:21:32469
[email protected]d12cc5e2013-10-19 18:25:06470#if defined(OS_CHROMEOS)
471 case IDC_VISIT_DESKTOP_OF_LRU_USER_2:
[email protected]0c930812014-01-30 18:01:47472 case IDC_VISIT_DESKTOP_OF_LRU_USER_3:
473 ExecuteVisitDesktopCommand(id, browser_->window()->GetNativeWindow());
474 break;
[email protected]d12cc5e2013-10-19 18:25:06475#endif
476
[email protected]893124a22014-04-15 00:45:28477#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
[email protected]af97be4c62014-02-13 14:43:34478 case IDC_USE_SYSTEM_TITLE_BAR: {
479 PrefService* prefs = browser_->profile()->GetPrefs();
480 prefs->SetBoolean(prefs::kUseCustomChromeFrame,
481 !prefs->GetBoolean(prefs::kUseCustomChromeFrame));
482 break;
483 }
484#endif
485
[email protected]5d98294912012-06-27 22:57:40486#if defined(OS_WIN)
[email protected]770c6d82012-09-06 22:21:32487 // Windows 8 specific commands.
[email protected]5d98294912012-06-27 22:57:40488 case IDC_METRO_SNAP_ENABLE:
489 browser_->SetMetroSnapMode(true);
490 break;
491 case IDC_METRO_SNAP_DISABLE:
492 browser_->SetMetroSnapMode(false);
493 break;
ananta196db192014-08-28 21:37:55494 case IDC_WIN_DESKTOP_RESTART:
495 if (!VerifyASHSwitchForApps(window()->GetNativeWindow(), id))
[email protected]396de6872013-11-08 08:50:37496 break;
497
[email protected]d51373d2013-10-31 15:22:00498 chrome::AttemptRestartToDesktopMode();
ananta196db192014-08-28 21:37:55499 if (base::win::GetVersion() >= base::win::VERSION_WIN8) {
500 content::RecordAction(base::UserMetricsAction("Win8DesktopRestart"));
501 } else {
502 content::RecordAction(base::UserMetricsAction("Win7DesktopRestart"));
503 }
[email protected]770c6d82012-09-06 22:21:32504 break;
[email protected]0b32f9b62012-09-17 19:08:03505 case IDC_WIN8_METRO_RESTART:
ananta196db192014-08-28 21:37:55506 case IDC_WIN_CHROMEOS_RESTART:
507 if (!VerifyASHSwitchForApps(window()->GetNativeWindow(), id))
[email protected]24ced7dc02013-04-04 08:32:39508 break;
ananta196db192014-08-28 21:37:55509 if (base::win::GetVersion() >= base::win::VERSION_WIN8) {
510 // SwitchToMetroUIHandler deletes itself.
511 new SwitchToMetroUIHandler;
512 content::RecordAction(base::UserMetricsAction("Win8MetroRestart"));
513 } else {
514 content::RecordAction(base::UserMetricsAction("Win7ASHRestart"));
515 chrome::AttemptRestartToMetroMode();
516 }
[email protected]0b32f9b62012-09-17 19:08:03517 break;
thestig5149d272014-10-30 07:25:29518 case IDC_PIN_TO_START_SCREEN:
519 TogglePagePinnedToStartScreen(browser_);
520 break;
[email protected]5d98294912012-06-27 22:57:40521#endif
[email protected]770c6d82012-09-06 22:21:32522
[email protected]5d98294912012-06-27 22:57:40523#if defined(OS_MACOSX)
524 case IDC_PRESENTATION_MODE:
[email protected]9c4d68332013-01-30 13:34:41525 chrome::ToggleFullscreenMode(browser_);
[email protected]5d98294912012-06-27 22:57:40526 break;
527#endif
528 case IDC_EXIT:
529 Exit();
530 break;
531
532 // Page-related commands
533 case IDC_SAVE_PAGE:
534 SavePage(browser_);
535 break;
536 case IDC_BOOKMARK_PAGE:
deepak.m154a7f392014-12-15 04:41:43537 BookmarkCurrentPageAllowingExtensionOverrides(browser_);
[email protected]5d98294912012-06-27 22:57:40538 break;
[email protected]5d98294912012-06-27 22:57:40539 case IDC_BOOKMARK_ALL_TABS:
540 BookmarkAllTabs(browser_);
541 break;
542 case IDC_VIEW_SOURCE:
543 ViewSelectedSource(browser_);
544 break;
545 case IDC_EMAIL_PAGE_LOCATION:
546 EmailPageLocation(browser_);
547 break;
548 case IDC_PRINT:
549 Print(browser_);
550 break;
vitalybukae29991c2014-11-05 21:15:12551#if defined(ENABLE_BASIC_PRINTING)
vitalybukaf9433e42014-09-08 10:04:55552 case IDC_BASIC_PRINT:
[email protected]e6e30ac2014-01-13 21:24:39553 content::RecordAction(base::UserMetricsAction("Accel_Advanced_Print"));
vitalybukaf9433e42014-09-08 10:04:55554 BasicPrint(browser_);
[email protected]5d98294912012-06-27 22:57:40555 break;
vitalybukae29991c2014-11-05 21:15:12556#endif // ENABLE_BASIC_PRINTING
[email protected]e625b7602013-10-28 09:24:56557 case IDC_TRANSLATE_PAGE:
558 Translate(browser_);
559 break;
[email protected]4bee4432014-05-05 13:11:41560 case IDC_MANAGE_PASSWORDS_FOR_PAGE:
561 ManagePasswordsForPage(browser_);
562 break;
563
564 // Page encoding commands
[email protected]5d98294912012-06-27 22:57:40565 case IDC_ENCODING_AUTO_DETECT:
566 browser_->ToggleEncodingAutoDetect();
567 break;
568 case IDC_ENCODING_UTF8:
569 case IDC_ENCODING_UTF16LE:
[email protected]5d98294912012-06-27 22:57:40570 case IDC_ENCODING_WINDOWS1252:
571 case IDC_ENCODING_GBK:
572 case IDC_ENCODING_GB18030:
[email protected]5d98294912012-06-27 22:57:40573 case IDC_ENCODING_BIG5:
574 case IDC_ENCODING_KOREAN:
575 case IDC_ENCODING_SHIFTJIS:
576 case IDC_ENCODING_ISO2022JP:
577 case IDC_ENCODING_EUCJP:
578 case IDC_ENCODING_THAI:
579 case IDC_ENCODING_ISO885915:
580 case IDC_ENCODING_MACINTOSH:
581 case IDC_ENCODING_ISO88592:
582 case IDC_ENCODING_WINDOWS1250:
583 case IDC_ENCODING_ISO88595:
584 case IDC_ENCODING_WINDOWS1251:
585 case IDC_ENCODING_KOI8R:
586 case IDC_ENCODING_KOI8U:
jshin03456dca2015-03-24 20:51:34587 case IDC_ENCODING_IBM866:
[email protected]5d98294912012-06-27 22:57:40588 case IDC_ENCODING_ISO88597:
589 case IDC_ENCODING_WINDOWS1253:
590 case IDC_ENCODING_ISO88594:
591 case IDC_ENCODING_ISO885913:
592 case IDC_ENCODING_WINDOWS1257:
593 case IDC_ENCODING_ISO88593:
594 case IDC_ENCODING_ISO885910:
595 case IDC_ENCODING_ISO885914:
596 case IDC_ENCODING_ISO885916:
597 case IDC_ENCODING_WINDOWS1254:
598 case IDC_ENCODING_ISO88596:
599 case IDC_ENCODING_WINDOWS1256:
600 case IDC_ENCODING_ISO88598:
601 case IDC_ENCODING_ISO88598I:
602 case IDC_ENCODING_WINDOWS1255:
603 case IDC_ENCODING_WINDOWS1258:
604 browser_->OverrideEncoding(id);
605 break;
606
607 // Clipboard commands
608 case IDC_CUT:
[email protected]5d98294912012-06-27 22:57:40609 case IDC_COPY:
[email protected]5d98294912012-06-27 22:57:40610 case IDC_PASTE:
pkastingcd3f08bce2015-04-18 13:37:12611 CutCopyPaste(browser_, id);
[email protected]5d98294912012-06-27 22:57:40612 break;
613
614 // Find-in-page
615 case IDC_FIND:
616 Find(browser_);
617 break;
618 case IDC_FIND_NEXT:
619 FindNext(browser_);
620 break;
621 case IDC_FIND_PREVIOUS:
622 FindPrevious(browser_);
623 break;
624
625 // Zoom
626 case IDC_ZOOM_PLUS:
627 Zoom(browser_, content::PAGE_ZOOM_IN);
628 break;
629 case IDC_ZOOM_NORMAL:
630 Zoom(browser_, content::PAGE_ZOOM_RESET);
631 break;
632 case IDC_ZOOM_MINUS:
633 Zoom(browser_, content::PAGE_ZOOM_OUT);
634 break;
635
636 // Focus various bits of UI
637 case IDC_FOCUS_TOOLBAR:
[email protected]e6e30ac2014-01-13 21:24:39638 content::RecordAction(base::UserMetricsAction("Accel_Focus_Toolbar"));
[email protected]5d98294912012-06-27 22:57:40639 FocusToolbar(browser_);
640 break;
641 case IDC_FOCUS_LOCATION:
[email protected]e6e30ac2014-01-13 21:24:39642 content::RecordAction(base::UserMetricsAction("Accel_Focus_Location"));
[email protected]5d98294912012-06-27 22:57:40643 FocusLocationBar(browser_);
644 break;
645 case IDC_FOCUS_SEARCH:
[email protected]e6e30ac2014-01-13 21:24:39646 content::RecordAction(base::UserMetricsAction("Accel_Focus_Search"));
[email protected]5d98294912012-06-27 22:57:40647 FocusSearch(browser_);
648 break;
649 case IDC_FOCUS_MENU_BAR:
650 FocusAppMenu(browser_);
651 break;
652 case IDC_FOCUS_BOOKMARKS:
[email protected]9fbc1902013-12-06 01:49:45653 content::RecordAction(
[email protected]e6e30ac2014-01-13 21:24:39654 base::UserMetricsAction("Accel_Focus_Bookmarks"));
[email protected]5d98294912012-06-27 22:57:40655 FocusBookmarksToolbar(browser_);
656 break;
[email protected]822ca8c62013-04-19 00:49:15657 case IDC_FOCUS_INFOBARS:
658 FocusInfobars(browser_);
659 break;
[email protected]5d98294912012-06-27 22:57:40660 case IDC_FOCUS_NEXT_PANE:
661 FocusNextPane(browser_);
662 break;
663 case IDC_FOCUS_PREVIOUS_PANE:
664 FocusPreviousPane(browser_);
665 break;
666
667 // Show various bits of UI
668 case IDC_OPEN_FILE:
669 browser_->OpenFile();
670 break;
671 case IDC_CREATE_SHORTCUTS:
[email protected]619f86182012-07-03 21:30:18672 CreateApplicationShortcuts(browser_);
[email protected]5d98294912012-06-27 22:57:40673 break;
[email protected]488e3952013-11-18 05:29:14674 case IDC_CREATE_HOSTED_APP:
[email protected]92086542014-04-08 08:45:29675 CreateBookmarkAppFromCurrentWebContents(browser_);
[email protected]488e3952013-11-18 05:29:14676 break;
[email protected]5d98294912012-06-27 22:57:40677 case IDC_DEV_TOOLS:
[email protected]c934c382013-11-01 00:36:01678 ToggleDevToolsWindow(browser_, DevToolsToggleAction::Show());
[email protected]5d98294912012-06-27 22:57:40679 break;
680 case IDC_DEV_TOOLS_CONSOLE:
[email protected]c934c382013-11-01 00:36:01681 ToggleDevToolsWindow(browser_, DevToolsToggleAction::ShowConsole());
[email protected]5d98294912012-06-27 22:57:40682 break;
[email protected]2056c3192013-10-21 22:40:51683 case IDC_DEV_TOOLS_DEVICES:
684 InspectUI::InspectDevices(browser_);
685 break;
[email protected]5d98294912012-06-27 22:57:40686 case IDC_DEV_TOOLS_INSPECT:
[email protected]c934c382013-11-01 00:36:01687 ToggleDevToolsWindow(browser_, DevToolsToggleAction::Inspect());
[email protected]5d98294912012-06-27 22:57:40688 break;
[email protected]d16657c2012-09-03 14:25:10689 case IDC_DEV_TOOLS_TOGGLE:
[email protected]c934c382013-11-01 00:36:01690 ToggleDevToolsWindow(browser_, DevToolsToggleAction::Toggle());
[email protected]d16657c2012-09-03 14:25:10691 break;
[email protected]5d98294912012-06-27 22:57:40692 case IDC_TASK_MANAGER:
[email protected]29c262de2013-06-22 15:39:38693 OpenTaskManager(browser_);
[email protected]5d98294912012-06-27 22:57:40694 break;
caelyn4e4e08a2015-02-04 21:27:49695#if defined(OS_CHROMEOS)
696 case IDC_TAKE_SCREENSHOT:
697 TakeScreenshot();
698 break;
699#endif
[email protected]236ad3022013-09-04 03:27:43700#if defined(GOOGLE_CHROME_BUILD)
[email protected]5d98294912012-06-27 22:57:40701 case IDC_FEEDBACK:
702 OpenFeedbackDialog(browser_);
703 break;
[email protected]236ad3022013-09-04 03:27:43704#endif
[email protected]5d98294912012-06-27 22:57:40705 case IDC_SHOW_BOOKMARK_BAR:
706 ToggleBookmarkBar(browser_);
707 break;
708 case IDC_PROFILING_ENABLED:
709 Profiling::Toggle();
710 break;
711
712 case IDC_SHOW_BOOKMARK_MANAGER:
713 ShowBookmarkManager(browser_);
714 break;
715 case IDC_SHOW_APP_MENU:
[email protected]e6e30ac2014-01-13 21:24:39716 content::RecordAction(base::UserMetricsAction("Accel_Show_App_Menu"));
[email protected]5d98294912012-06-27 22:57:40717 ShowAppMenu(browser_);
718 break;
719 case IDC_SHOW_AVATAR_MENU:
720 ShowAvatarMenu(browser_);
721 break;
anthonyvd7dc985da2015-03-23 16:53:19722 case IDC_SHOW_FAST_USER_SWITCHER:
723 ShowFastUserSwitcher(browser_);
724 break;
[email protected]5d98294912012-06-27 22:57:40725 case IDC_SHOW_HISTORY:
726 ShowHistory(browser_);
727 break;
728 case IDC_SHOW_DOWNLOADS:
729 ShowDownloads(browser_);
730 break;
731 case IDC_MANAGE_EXTENSIONS:
[email protected]bc9833c32013-02-28 04:05:08732 ShowExtensions(browser_, std::string());
[email protected]5d98294912012-06-27 22:57:40733 break;
734 case IDC_OPTIONS:
735 ShowSettings(browser_);
736 break;
737 case IDC_EDIT_SEARCH_ENGINES:
738 ShowSearchEngineSettings(browser_);
739 break;
740 case IDC_VIEW_PASSWORDS:
741 ShowPasswordManager(browser_);
742 break;
743 case IDC_CLEAR_BROWSING_DATA:
744 ShowClearBrowsingDataDialog(browser_);
745 break;
746 case IDC_IMPORT_SETTINGS:
747 ShowImportDialog(browser_);
748 break;
[email protected]9b7ab882012-09-10 23:46:36749 case IDC_TOGGLE_REQUEST_TABLET_SITE:
750 ToggleRequestTabletSite(browser_);
751 break;
[email protected]5d98294912012-06-27 22:57:40752 case IDC_ABOUT:
753 ShowAboutChrome(browser_);
754 break;
755 case IDC_UPGRADE_DIALOG:
756 OpenUpdateChromeDialog(browser_);
757 break;
758 case IDC_VIEW_INCOMPATIBILITIES:
759 ShowConflicts(browser_);
760 break;
761 case IDC_HELP_PAGE_VIA_KEYBOARD:
762 ShowHelp(browser_, HELP_SOURCE_KEYBOARD);
763 break;
764 case IDC_HELP_PAGE_VIA_MENU:
765 ShowHelp(browser_, HELP_SOURCE_MENU);
766 break;
[email protected]08fafe42013-02-03 08:10:49767 case IDC_SHOW_SIGNIN:
rockotb2fdf0b2015-01-23 03:42:35768 ShowBrowserSigninOrSettings(browser_, signin_metrics::SOURCE_MENU);
[email protected]5d98294912012-06-27 22:57:40769 break;
770 case IDC_TOGGLE_SPEECH_INPUT:
771 ToggleSpeechInput(browser_);
772 break;
[email protected]6bd370b2014-05-28 14:19:47773 case IDC_DISTILL_PAGE:
774 DistillCurrentPage(browser_);
775 break;
kpschoedelf8e9274e2014-10-07 18:32:41776#if defined(OS_CHROMEOS)
777 case IDC_TOUCH_HUD_PROJECTION_TOGGLE:
778 ash::accelerators::ToggleTouchHudProjection();
779 break;
780#endif
[email protected]5d98294912012-06-27 22:57:40781
782 default:
783 LOG(WARNING) << "Received Unimplemented Command: " << id;
784 break;
785 }
786}
787
788////////////////////////////////////////////////////////////////////////////////
[email protected]074311a2013-02-28 23:14:09789// BrowserCommandController, SigninPrefObserver implementation:
790
791void BrowserCommandController::OnSigninAllowedPrefChange() {
792 // For unit tests, we don't have a window.
793 if (!window())
794 return;
795 UpdateShowSyncState(IsShowingMainUI());
796}
797
[email protected]5d98294912012-06-27 22:57:40798// BrowserCommandController, TabStripModelObserver implementation:
799
[email protected]409ea2972012-11-10 19:54:43800void BrowserCommandController::TabInsertedAt(WebContents* contents,
[email protected]5d98294912012-06-27 22:57:40801 int index,
802 bool foreground) {
803 AddInterstitialObservers(contents);
804}
805
[email protected]e89cfcb2012-11-11 14:47:24806void BrowserCommandController::TabDetachedAt(WebContents* contents, int index) {
[email protected]5d98294912012-06-27 22:57:40807 RemoveInterstitialObservers(contents);
808}
809
810void BrowserCommandController::TabReplacedAt(TabStripModel* tab_strip_model,
[email protected]b624ddc2012-11-15 18:04:13811 WebContents* old_contents,
812 WebContents* new_contents,
[email protected]5d98294912012-06-27 22:57:40813 int index) {
[email protected]b624ddc2012-11-15 18:04:13814 RemoveInterstitialObservers(old_contents);
815 AddInterstitialObservers(new_contents);
[email protected]5d98294912012-06-27 22:57:40816}
817
[email protected]3cac87232012-11-20 01:48:27818void BrowserCommandController::TabBlockedStateChanged(
819 content::WebContents* contents,
820 int index) {
821 PrintingStateChanged();
822 FullscreenStateChanged();
823 UpdateCommandsForFind();
824}
825
[email protected]5d98294912012-06-27 22:57:40826////////////////////////////////////////////////////////////////////////////////
827// BrowserCommandController, TabRestoreServiceObserver implementation:
828
829void BrowserCommandController::TabRestoreServiceChanged(
830 TabRestoreService* service) {
[email protected]2e9369e2014-08-15 09:12:53831 UpdateTabRestoreCommandState();
[email protected]5d98294912012-06-27 22:57:40832}
833
834void BrowserCommandController::TabRestoreServiceDestroyed(
835 TabRestoreService* service) {
836 service->RemoveObserver(this);
837}
838
[email protected]2e9369e2014-08-15 09:12:53839void BrowserCommandController::TabRestoreServiceLoaded(
840 TabRestoreService* service) {
841 UpdateTabRestoreCommandState();
842}
843
[email protected]5d98294912012-06-27 22:57:40844////////////////////////////////////////////////////////////////////////////////
[email protected]5d98294912012-06-27 22:57:40845// BrowserCommandController, private:
846
[email protected]20ca0382013-02-28 19:50:07847class BrowserCommandController::InterstitialObserver
848 : public content::WebContentsObserver {
849 public:
850 InterstitialObserver(BrowserCommandController* controller,
851 content::WebContents* web_contents)
852 : WebContentsObserver(web_contents),
853 controller_(controller) {
854 }
855
dcheng5dd5ff62014-10-21 12:42:38856 void DidAttachInterstitialPage() override {
[email protected]20ca0382013-02-28 19:50:07857 controller_->UpdateCommandsForTabState();
858 }
859
dcheng5dd5ff62014-10-21 12:42:38860 void DidDetachInterstitialPage() override {
[email protected]20ca0382013-02-28 19:50:07861 controller_->UpdateCommandsForTabState();
862 }
863
864 private:
865 BrowserCommandController* controller_;
866
867 DISALLOW_COPY_AND_ASSIGN(InterstitialObserver);
868};
869
[email protected]6a414ff2013-02-27 08:22:54870bool BrowserCommandController::IsShowingMainUI() {
871 bool should_hide_ui = window() && window()->ShouldHideUIForFullscreen();
872 return browser_->is_type_tabbed() && !should_hide_ui;
[email protected]5d98294912012-06-27 22:57:40873}
874
875void BrowserCommandController::InitCommandState() {
876 // All browser commands whose state isn't set automagically some other way
877 // (like Back & Forward with initial page load) must have their state
878 // initialized here, otherwise they will be forever disabled.
879
880 // Navigation commands
881 command_updater_.UpdateCommandEnabled(IDC_RELOAD, true);
882 command_updater_.UpdateCommandEnabled(IDC_RELOAD_IGNORING_CACHE, true);
[email protected]58e29032012-08-06 20:19:57883 command_updater_.UpdateCommandEnabled(IDC_RELOAD_CLEARING_CACHE, true);
[email protected]5d98294912012-06-27 22:57:40884
885 // Window management commands
886 command_updater_.UpdateCommandEnabled(IDC_CLOSE_WINDOW, true);
887 command_updater_.UpdateCommandEnabled(IDC_NEW_TAB, true);
888 command_updater_.UpdateCommandEnabled(IDC_CLOSE_TAB, true);
889 command_updater_.UpdateCommandEnabled(IDC_DUPLICATE_TAB, true);
[email protected]2e9369e2014-08-15 09:12:53890 UpdateTabRestoreCommandState();
[email protected]6ed406c2013-03-12 17:57:11891#if defined(OS_WIN) && defined(USE_ASH)
892 if (browser_->host_desktop_type() != chrome::HOST_DESKTOP_TYPE_ASH)
893 command_updater_.UpdateCommandEnabled(IDC_EXIT, true);
894#else
[email protected]d28d3782013-02-26 16:31:55895 command_updater_.UpdateCommandEnabled(IDC_EXIT, true);
[email protected]6ed406c2013-03-12 17:57:11896#endif
[email protected]5d98294912012-06-27 22:57:40897 command_updater_.UpdateCommandEnabled(IDC_DEBUG_FRAME_TOGGLE, true);
[email protected]fa9412762013-09-04 23:31:33898#if defined(USE_ASH)
899 command_updater_.UpdateCommandEnabled(IDC_MINIMIZE_WINDOW, true);
900#endif
[email protected]d12cc5e2013-10-19 18:25:06901#if defined(OS_CHROMEOS)
902 command_updater_.UpdateCommandEnabled(IDC_VISIT_DESKTOP_OF_LRU_USER_2, true);
903 command_updater_.UpdateCommandEnabled(IDC_VISIT_DESKTOP_OF_LRU_USER_3, true);
904#endif
[email protected]893124a22014-04-15 00:45:28905#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
[email protected]af97be4c62014-02-13 14:43:34906 command_updater_.UpdateCommandEnabled(IDC_USE_SYSTEM_TITLE_BAR, true);
907#endif
[email protected]5d98294912012-06-27 22:57:40908
909 // Page-related commands
910 command_updater_.UpdateCommandEnabled(IDC_EMAIL_PAGE_LOCATION, true);
[email protected]4bee4432014-05-05 13:11:41911 command_updater_.UpdateCommandEnabled(IDC_MANAGE_PASSWORDS_FOR_PAGE, true);
[email protected]5d98294912012-06-27 22:57:40912 command_updater_.UpdateCommandEnabled(IDC_ENCODING_AUTO_DETECT, true);
913 command_updater_.UpdateCommandEnabled(IDC_ENCODING_UTF8, true);
914 command_updater_.UpdateCommandEnabled(IDC_ENCODING_UTF16LE, true);
[email protected]5d98294912012-06-27 22:57:40915 command_updater_.UpdateCommandEnabled(IDC_ENCODING_WINDOWS1252, true);
916 command_updater_.UpdateCommandEnabled(IDC_ENCODING_GBK, true);
917 command_updater_.UpdateCommandEnabled(IDC_ENCODING_GB18030, true);
[email protected]5d98294912012-06-27 22:57:40918 command_updater_.UpdateCommandEnabled(IDC_ENCODING_BIG5, true);
919 command_updater_.UpdateCommandEnabled(IDC_ENCODING_THAI, true);
920 command_updater_.UpdateCommandEnabled(IDC_ENCODING_KOREAN, true);
921 command_updater_.UpdateCommandEnabled(IDC_ENCODING_SHIFTJIS, true);
922 command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO2022JP, true);
923 command_updater_.UpdateCommandEnabled(IDC_ENCODING_EUCJP, true);
924 command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO885915, true);
925 command_updater_.UpdateCommandEnabled(IDC_ENCODING_MACINTOSH, true);
926 command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO88592, true);
927 command_updater_.UpdateCommandEnabled(IDC_ENCODING_WINDOWS1250, true);
928 command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO88595, true);
929 command_updater_.UpdateCommandEnabled(IDC_ENCODING_WINDOWS1251, true);
930 command_updater_.UpdateCommandEnabled(IDC_ENCODING_KOI8R, true);
931 command_updater_.UpdateCommandEnabled(IDC_ENCODING_KOI8U, true);
jshin03456dca2015-03-24 20:51:34932 command_updater_.UpdateCommandEnabled(IDC_ENCODING_IBM866, true);
[email protected]5d98294912012-06-27 22:57:40933 command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO88597, true);
934 command_updater_.UpdateCommandEnabled(IDC_ENCODING_WINDOWS1253, true);
935 command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO88594, true);
936 command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO885913, true);
937 command_updater_.UpdateCommandEnabled(IDC_ENCODING_WINDOWS1257, true);
938 command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO88593, true);
939 command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO885910, true);
940 command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO885914, true);
941 command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO885916, true);
942 command_updater_.UpdateCommandEnabled(IDC_ENCODING_WINDOWS1254, true);
943 command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO88596, true);
944 command_updater_.UpdateCommandEnabled(IDC_ENCODING_WINDOWS1256, true);
945 command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO88598, true);
946 command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO88598I, true);
947 command_updater_.UpdateCommandEnabled(IDC_ENCODING_WINDOWS1255, true);
948 command_updater_.UpdateCommandEnabled(IDC_ENCODING_WINDOWS1258, true);
949
950 // Zoom
951 command_updater_.UpdateCommandEnabled(IDC_ZOOM_MENU, true);
952 command_updater_.UpdateCommandEnabled(IDC_ZOOM_PLUS, true);
[email protected]d93dbd12014-08-04 23:42:53953 command_updater_.UpdateCommandEnabled(IDC_ZOOM_NORMAL, false);
[email protected]5d98294912012-06-27 22:57:40954 command_updater_.UpdateCommandEnabled(IDC_ZOOM_MINUS, true);
955
956 // Show various bits of UI
mlerman7831f57d2015-05-25 11:40:15957 const bool guest_session = profile()->IsGuestSession() ||
958 profile()->IsSystemProfile();
959 DCHECK(!profile()->IsSystemProfile())
960 << "Ought to never have browser for the system profile.";
[email protected]338416c02014-05-13 16:47:06961 const bool normal_window = browser_->is_type_tabbed();
[email protected]05454532013-01-22 21:09:08962 UpdateOpenFileState(&command_updater_);
[email protected]5d98294912012-06-27 22:57:40963 command_updater_.UpdateCommandEnabled(IDC_CREATE_SHORTCUTS, false);
964 UpdateCommandsForDevTools();
965 command_updater_.UpdateCommandEnabled(IDC_TASK_MANAGER, CanOpenTaskManager());
[email protected]338416c02014-05-13 16:47:06966 command_updater_.UpdateCommandEnabled(IDC_SHOW_HISTORY, !guest_session);
[email protected]5d98294912012-06-27 22:57:40967 command_updater_.UpdateCommandEnabled(IDC_SHOW_DOWNLOADS, true);
[email protected]674b65672014-06-02 23:21:56968 command_updater_.UpdateCommandEnabled(IDC_HELP_MENU, true);
[email protected]5d98294912012-06-27 22:57:40969 command_updater_.UpdateCommandEnabled(IDC_HELP_PAGE_VIA_KEYBOARD, true);
970 command_updater_.UpdateCommandEnabled(IDC_HELP_PAGE_VIA_MENU, true);
[email protected]338416c02014-05-13 16:47:06971 command_updater_.UpdateCommandEnabled(IDC_BOOKMARKS_MENU, !guest_session);
[email protected]2f1acc212012-11-13 10:43:51972 command_updater_.UpdateCommandEnabled(IDC_RECENT_TABS_MENU,
[email protected]338416c02014-05-13 16:47:06973 !guest_session &&
[email protected]2f1acc212012-11-13 10:43:51974 !profile()->IsOffTheRecord());
[email protected]338416c02014-05-13 16:47:06975 command_updater_.UpdateCommandEnabled(IDC_CLEAR_BROWSING_DATA, normal_window);
[email protected]39d47592014-01-10 21:42:45976#if defined(OS_CHROMEOS)
caelyn4e4e08a2015-02-04 21:27:49977 command_updater_.UpdateCommandEnabled(IDC_TAKE_SCREENSHOT, true);
kpschoedelf8e9274e2014-10-07 18:32:41978 command_updater_.UpdateCommandEnabled(IDC_TOUCH_HUD_PROJECTION_TOGGLE, true);
[email protected]338416c02014-05-13 16:47:06979#else
980 // Chrome OS uses the system tray menu to handle multi-profiles.
anthonyvd7dc985da2015-03-23 16:53:19981 if (normal_window && (guest_session || !profile()->IsOffTheRecord())) {
[email protected]338416c02014-05-13 16:47:06982 command_updater_.UpdateCommandEnabled(IDC_SHOW_AVATAR_MENU, true);
anthonyvd7dc985da2015-03-23 16:53:19983 command_updater_.UpdateCommandEnabled(IDC_SHOW_FAST_USER_SWITCHER, true);
984 }
[email protected]39d47592014-01-10 21:42:45985#endif
[email protected]5d98294912012-06-27 22:57:40986
[email protected]074311a2013-02-28 23:14:09987 UpdateShowSyncState(true);
[email protected]5d98294912012-06-27 22:57:40988
[email protected]5d98294912012-06-27 22:57:40989 // Navigation commands
[email protected]c9f983d2014-02-05 09:00:24990 command_updater_.UpdateCommandEnabled(
991 IDC_HOME,
benwellsc431c0ae2015-01-27 22:04:06992 normal_window ||
993 (extensions::util::IsNewBookmarkAppsEnabled() && browser_->is_app()));
[email protected]5d98294912012-06-27 22:57:40994
995 // Window management commands
[email protected]5d98294912012-06-27 22:57:40996 command_updater_.UpdateCommandEnabled(IDC_SELECT_NEXT_TAB, normal_window);
997 command_updater_.UpdateCommandEnabled(IDC_SELECT_PREVIOUS_TAB,
998 normal_window);
999 command_updater_.UpdateCommandEnabled(IDC_MOVE_TAB_NEXT, normal_window);
1000 command_updater_.UpdateCommandEnabled(IDC_MOVE_TAB_PREVIOUS, normal_window);
1001 command_updater_.UpdateCommandEnabled(IDC_SELECT_TAB_0, normal_window);
1002 command_updater_.UpdateCommandEnabled(IDC_SELECT_TAB_1, normal_window);
1003 command_updater_.UpdateCommandEnabled(IDC_SELECT_TAB_2, normal_window);
1004 command_updater_.UpdateCommandEnabled(IDC_SELECT_TAB_3, normal_window);
1005 command_updater_.UpdateCommandEnabled(IDC_SELECT_TAB_4, normal_window);
1006 command_updater_.UpdateCommandEnabled(IDC_SELECT_TAB_5, normal_window);
1007 command_updater_.UpdateCommandEnabled(IDC_SELECT_TAB_6, normal_window);
1008 command_updater_.UpdateCommandEnabled(IDC_SELECT_TAB_7, normal_window);
1009 command_updater_.UpdateCommandEnabled(IDC_SELECT_LAST_TAB, normal_window);
1010#if defined(OS_WIN)
[email protected]338416c02014-05-13 16:47:061011 bool metro = browser_->host_desktop_type() == chrome::HOST_DESKTOP_TYPE_ASH;
1012 command_updater_.UpdateCommandEnabled(IDC_METRO_SNAP_ENABLE, metro);
1013 command_updater_.UpdateCommandEnabled(IDC_METRO_SNAP_DISABLE, metro);
ananta196db192014-08-28 21:37:551014 int restart_mode = metro ? IDC_WIN_DESKTOP_RESTART :
1015 (base::win::GetVersion() >= base::win::VERSION_WIN8 ?
1016 IDC_WIN8_METRO_RESTART : IDC_WIN_CHROMEOS_RESTART);
[email protected]770c6d82012-09-06 22:21:321017 command_updater_.UpdateCommandEnabled(restart_mode, normal_window);
[email protected]5d98294912012-06-27 22:57:401018#endif
[email protected]5d98294912012-06-27 22:57:401019
[email protected]338416c02014-05-13 16:47:061020 // These are always enabled; the menu determines their menu item visibility.
[email protected]5d98294912012-06-27 22:57:401021 command_updater_.UpdateCommandEnabled(IDC_UPGRADE_DIALOG, true);
1022 command_updater_.UpdateCommandEnabled(IDC_VIEW_INCOMPATIBILITIES, true);
1023
[email protected]5d98294912012-06-27 22:57:401024 // Toggle speech input
1025 command_updater_.UpdateCommandEnabled(IDC_TOGGLE_SPEECH_INPUT, true);
1026
[email protected]6bd370b2014-05-28 14:19:471027 // Distill current page.
1028 command_updater_.UpdateCommandEnabled(
avi556c05022014-12-22 23:31:431029 IDC_DISTILL_PAGE, base::CommandLine::ForCurrentProcess()->HasSwitch(
1030 switches::kEnableDomDistiller));
[email protected]6bd370b2014-05-28 14:19:471031
[email protected]338416c02014-05-13 16:47:061032 // Initialize other commands whose state changes based on various conditions.
[email protected]32dfede2013-08-25 15:48:251033 UpdateCommandsForFullscreenMode();
[email protected]5d98294912012-06-27 22:57:401034 UpdateCommandsForContentRestrictionState();
[email protected]5d98294912012-06-27 22:57:401035 UpdateCommandsForBookmarkEditing();
[email protected]5d98294912012-06-27 22:57:401036 UpdateCommandsForIncognitoAvailability();
1037}
1038
[email protected]05454532013-01-22 21:09:081039// static
1040void BrowserCommandController::UpdateSharedCommandsForIncognitoAvailability(
1041 CommandUpdater* command_updater,
1042 Profile* profile) {
mlermane01e6de2014-09-29 19:26:471043 const bool guest_session = profile->IsGuestSession();
1044 // TODO(mlerman): Make GetAvailability account for profile->IsGuestSession().
[email protected]5d98294912012-06-27 22:57:401045 IncognitoModePrefs::Availability incognito_availability =
[email protected]05454532013-01-22 21:09:081046 IncognitoModePrefs::GetAvailability(profile->GetPrefs());
1047 command_updater->UpdateCommandEnabled(
[email protected]5d98294912012-06-27 22:57:401048 IDC_NEW_WINDOW,
1049 incognito_availability != IncognitoModePrefs::FORCED);
[email protected]05454532013-01-22 21:09:081050 command_updater->UpdateCommandEnabled(
[email protected]5d98294912012-06-27 22:57:401051 IDC_NEW_INCOGNITO_WINDOW,
mlermane01e6de2014-09-29 19:26:471052 incognito_availability != IncognitoModePrefs::DISABLED && !guest_session);
[email protected]5d98294912012-06-27 22:57:401053
[email protected]57b25292014-05-01 16:31:061054 const bool forced_incognito =
1055 incognito_availability == IncognitoModePrefs::FORCED ||
1056 guest_session; // Guest always runs in Incognito mode.
[email protected]05454532013-01-22 21:09:081057 command_updater->UpdateCommandEnabled(
[email protected]5d98294912012-06-27 22:57:401058 IDC_SHOW_BOOKMARK_MANAGER,
[email protected]57b25292014-05-01 16:31:061059 browser_defaults::bookmarks_enabled && !forced_incognito);
[email protected]03d25812014-06-22 19:41:551060 ExtensionService* extension_service =
1061 extensions::ExtensionSystem::Get(profile)->extension_service();
[email protected]57b25292014-05-01 16:31:061062 const bool enable_extensions =
[email protected]5d98294912012-06-27 22:57:401063 extension_service && extension_service->extensions_enabled();
[email protected]5d98294912012-06-27 22:57:401064
[email protected]57b25292014-05-01 16:31:061065 // Bookmark manager and settings page/subpages are forced to open in normal
1066 // mode. For this reason we disable these commands when incognito is forced.
1067 command_updater->UpdateCommandEnabled(IDC_MANAGE_EXTENSIONS,
1068 enable_extensions && !forced_incognito);
1069
1070 command_updater->UpdateCommandEnabled(IDC_IMPORT_SETTINGS, !forced_incognito);
1071 command_updater->UpdateCommandEnabled(IDC_OPTIONS,
1072 !forced_incognito || guest_session);
1073 command_updater->UpdateCommandEnabled(IDC_SHOW_SIGNIN, !forced_incognito);
[email protected]05454532013-01-22 21:09:081074}
1075
1076void BrowserCommandController::UpdateCommandsForIncognitoAvailability() {
1077 UpdateSharedCommandsForIncognitoAvailability(&command_updater_, profile());
1078
[email protected]6a414ff2013-02-27 08:22:541079 if (!IsShowingMainUI()) {
[email protected]05454532013-01-22 21:09:081080 command_updater_.UpdateCommandEnabled(IDC_IMPORT_SETTINGS, false);
1081 command_updater_.UpdateCommandEnabled(IDC_OPTIONS, false);
1082 }
[email protected]5d98294912012-06-27 22:57:401083}
1084
1085void BrowserCommandController::UpdateCommandsForTabState() {
[email protected]617ee962013-01-29 20:49:121086 WebContents* current_web_contents =
1087 browser_->tab_strip_model()->GetActiveWebContents();
[email protected]1c5119c2012-09-19 00:08:571088 if (!current_web_contents) // May be NULL during tab restore.
[email protected]5d98294912012-06-27 22:57:401089 return;
[email protected]5d98294912012-06-27 22:57:401090
1091 // Navigation commands
1092 command_updater_.UpdateCommandEnabled(IDC_BACK, CanGoBack(browser_));
1093 command_updater_.UpdateCommandEnabled(IDC_FORWARD, CanGoForward(browser_));
1094 command_updater_.UpdateCommandEnabled(IDC_RELOAD, CanReload(browser_));
1095 command_updater_.UpdateCommandEnabled(IDC_RELOAD_IGNORING_CACHE,
1096 CanReload(browser_));
[email protected]58e29032012-08-06 20:19:571097 command_updater_.UpdateCommandEnabled(IDC_RELOAD_CLEARING_CACHE,
1098 CanReload(browser_));
[email protected]5d98294912012-06-27 22:57:401099
1100 // Window management commands
1101 command_updater_.UpdateCommandEnabled(IDC_DUPLICATE_TAB,
1102 !browser_->is_app() && CanDuplicateTab(browser_));
1103
1104 // Page-related commands
1105 window()->SetStarredState(
[email protected]1c5119c2012-09-19 00:08:571106 BookmarkTabHelper::FromWebContents(current_web_contents)->is_starred());
[email protected]5423c372012-08-22 05:50:161107 window()->ZoomChangedForActiveTab(false);
[email protected]5d98294912012-06-27 22:57:401108 command_updater_.UpdateCommandEnabled(IDC_VIEW_SOURCE,
1109 CanViewSource(browser_));
1110 command_updater_.UpdateCommandEnabled(IDC_EMAIL_PAGE_LOCATION,
1111 CanEmailPageLocation(browser_));
1112 if (browser_->is_devtools())
1113 command_updater_.UpdateCommandEnabled(IDC_OPEN_FILE, false);
1114
1115 // Changing the encoding is not possible on Chrome-internal webpages.
1116 NavigationController& nc = current_web_contents->GetController();
[email protected]97174892014-06-03 09:06:121117 bool is_chrome_internal = HasInternalURL(nc.GetLastCommittedEntry()) ||
[email protected]5d98294912012-06-27 22:57:401118 current_web_contents->ShowingInterstitialPage();
1119 command_updater_.UpdateCommandEnabled(IDC_ENCODING_MENU,
1120 !is_chrome_internal && current_web_contents->IsSavable());
1121
1122 // Show various bits of UI
1123 // TODO(pinkerton): Disable app-mode in the model until we implement it
1124 // on the Mac. Be sure to remove both ifdefs. http://crbug.com/13148
1125#if !defined(OS_MACOSX)
1126 command_updater_.UpdateCommandEnabled(
1127 IDC_CREATE_SHORTCUTS,
1128 CanCreateApplicationShortcuts(browser_));
mitchelljones6d1594de2014-12-02 01:42:441129#endif
[email protected]92086542014-04-08 08:45:291130 command_updater_.UpdateCommandEnabled(IDC_CREATE_HOSTED_APP,
1131 CanCreateBookmarkApp(browser_));
[email protected]5d98294912012-06-27 22:57:401132
[email protected]9b7ab882012-09-10 23:46:361133 command_updater_.UpdateCommandEnabled(
1134 IDC_TOGGLE_REQUEST_TABLET_SITE,
1135 CanRequestTabletSite(current_web_contents));
1136
[email protected]5d98294912012-06-27 22:57:401137 UpdateCommandsForContentRestrictionState();
1138 UpdateCommandsForBookmarkEditing();
[email protected]3cac87232012-11-20 01:48:271139 UpdateCommandsForFind();
[email protected]d93dbd12014-08-04 23:42:531140 // Update the zoom commands when an active tab is selected.
1141 UpdateCommandsForZoomState();
1142}
1143
1144void BrowserCommandController::UpdateCommandsForZoomState() {
1145 WebContents* contents =
1146 browser_->tab_strip_model()->GetActiveWebContents();
1147 if (!contents)
1148 return;
a.sarkar.arundaadc712015-02-26 05:39:081149 command_updater_.UpdateCommandEnabled(IDC_ZOOM_PLUS,
1150 CanZoomIn(contents));
1151 command_updater_.UpdateCommandEnabled(IDC_ZOOM_NORMAL,
ccameronb7c1d6c2015-03-09 17:08:241152 CanResetZoom(contents));
a.sarkar.arundaadc712015-02-26 05:39:081153 command_updater_.UpdateCommandEnabled(IDC_ZOOM_MINUS,
1154 CanZoomOut(contents));
[email protected]5d98294912012-06-27 22:57:401155}
1156
1157void BrowserCommandController::UpdateCommandsForContentRestrictionState() {
1158 int restrictions = GetContentRestrictions(browser_);
1159
1160 command_updater_.UpdateCommandEnabled(
[email protected]3c71576ce2013-07-23 02:00:011161 IDC_COPY, !(restrictions & CONTENT_RESTRICTION_COPY));
[email protected]5d98294912012-06-27 22:57:401162 command_updater_.UpdateCommandEnabled(
[email protected]3c71576ce2013-07-23 02:00:011163 IDC_CUT, !(restrictions & CONTENT_RESTRICTION_CUT));
[email protected]5d98294912012-06-27 22:57:401164 command_updater_.UpdateCommandEnabled(
[email protected]3c71576ce2013-07-23 02:00:011165 IDC_PASTE, !(restrictions & CONTENT_RESTRICTION_PASTE));
[email protected]5d98294912012-06-27 22:57:401166 UpdateSaveAsState();
1167 UpdatePrintingState();
1168}
1169
1170void BrowserCommandController::UpdateCommandsForDevTools() {
1171 bool dev_tools_enabled =
1172 !profile()->GetPrefs()->GetBoolean(prefs::kDevToolsDisabled);
1173 command_updater_.UpdateCommandEnabled(IDC_DEV_TOOLS,
1174 dev_tools_enabled);
1175 command_updater_.UpdateCommandEnabled(IDC_DEV_TOOLS_CONSOLE,
1176 dev_tools_enabled);
[email protected]2056c3192013-10-21 22:40:511177 command_updater_.UpdateCommandEnabled(IDC_DEV_TOOLS_DEVICES,
1178 dev_tools_enabled);
[email protected]5d98294912012-06-27 22:57:401179 command_updater_.UpdateCommandEnabled(IDC_DEV_TOOLS_INSPECT,
1180 dev_tools_enabled);
[email protected]d16657c2012-09-03 14:25:101181 command_updater_.UpdateCommandEnabled(IDC_DEV_TOOLS_TOGGLE,
1182 dev_tools_enabled);
[email protected]5d98294912012-06-27 22:57:401183}
1184
1185void BrowserCommandController::UpdateCommandsForBookmarkEditing() {
1186 command_updater_.UpdateCommandEnabled(IDC_BOOKMARK_PAGE,
1187 CanBookmarkCurrentPage(browser_));
1188 command_updater_.UpdateCommandEnabled(IDC_BOOKMARK_ALL_TABS,
1189 CanBookmarkAllTabs(browser_));
thestig5149d272014-10-30 07:25:291190#if defined(OS_WIN)
1191 command_updater_.UpdateCommandEnabled(IDC_PIN_TO_START_SCREEN, true);
1192#endif
[email protected]5d98294912012-06-27 22:57:401193}
1194
1195void BrowserCommandController::UpdateCommandsForBookmarkBar() {
tfarina3bddbe112014-08-28 05:29:321196 command_updater_.UpdateCommandEnabled(
1197 IDC_SHOW_BOOKMARK_BAR,
1198 browser_defaults::bookmarks_enabled && !profile()->IsGuestSession() &&
mlerman7831f57d2015-05-25 11:40:151199 !profile()->IsSystemProfile() &&
tfarina3bddbe112014-08-28 05:29:321200 !profile()->GetPrefs()->IsManagedPreference(
1201 bookmarks::prefs::kShowBookmarkBar) &&
1202 IsShowingMainUI());
[email protected]5d98294912012-06-27 22:57:401203}
1204
[email protected]9ec3ea5b2012-12-03 18:14:301205void BrowserCommandController::UpdateCommandsForFileSelectionDialogs() {
1206 UpdateSaveAsState();
[email protected]05454532013-01-22 21:09:081207 UpdateOpenFileState(&command_updater_);
[email protected]9ec3ea5b2012-12-03 18:14:301208}
1209
[email protected]32dfede2013-08-25 15:48:251210void BrowserCommandController::UpdateCommandsForFullscreenMode() {
1211 WindowState window_state = WINDOW_STATE_NOT_FULLSCREEN;
1212 if (window() && window()->IsFullscreen()) {
1213 window_state = WINDOW_STATE_FULLSCREEN;
1214#if defined(OS_WIN)
1215 if (window()->IsInMetroSnapMode())
1216 window_state = WINDOW_STATE_METRO_SNAP;
1217#endif
1218 }
[email protected]6a414ff2013-02-27 08:22:541219 bool show_main_ui = IsShowingMainUI();
[email protected]32dfede2013-08-25 15:48:251220 bool main_not_fullscreen =
1221 show_main_ui && window_state == WINDOW_STATE_NOT_FULLSCREEN;
[email protected]5d98294912012-06-27 22:57:401222
1223 // Navigation commands
1224 command_updater_.UpdateCommandEnabled(IDC_OPEN_CURRENT_URL, show_main_ui);
1225
1226 // Window management commands
1227 command_updater_.UpdateCommandEnabled(
1228 IDC_SHOW_AS_TAB,
[email protected]32dfede2013-08-25 15:48:251229 !browser_->is_type_tabbed() &&
1230 window_state == WINDOW_STATE_NOT_FULLSCREEN);
[email protected]5d98294912012-06-27 22:57:401231
1232 // Focus various bits of UI
1233 command_updater_.UpdateCommandEnabled(IDC_FOCUS_TOOLBAR, show_main_ui);
1234 command_updater_.UpdateCommandEnabled(IDC_FOCUS_LOCATION, show_main_ui);
1235 command_updater_.UpdateCommandEnabled(IDC_FOCUS_SEARCH, show_main_ui);
1236 command_updater_.UpdateCommandEnabled(
1237 IDC_FOCUS_MENU_BAR, main_not_fullscreen);
1238 command_updater_.UpdateCommandEnabled(
1239 IDC_FOCUS_NEXT_PANE, main_not_fullscreen);
1240 command_updater_.UpdateCommandEnabled(
1241 IDC_FOCUS_PREVIOUS_PANE, main_not_fullscreen);
1242 command_updater_.UpdateCommandEnabled(
1243 IDC_FOCUS_BOOKMARKS, main_not_fullscreen);
[email protected]822ca8c62013-04-19 00:49:151244 command_updater_.UpdateCommandEnabled(
1245 IDC_FOCUS_INFOBARS, main_not_fullscreen);
[email protected]5d98294912012-06-27 22:57:401246
1247 // Show various bits of UI
1248 command_updater_.UpdateCommandEnabled(IDC_DEVELOPER_MENU, show_main_ui);
[email protected]236ad3022013-09-04 03:27:431249#if defined(GOOGLE_CHROME_BUILD)
[email protected]5d98294912012-06-27 22:57:401250 command_updater_.UpdateCommandEnabled(IDC_FEEDBACK, show_main_ui);
[email protected]236ad3022013-09-04 03:27:431251#endif
[email protected]074311a2013-02-28 23:14:091252 UpdateShowSyncState(show_main_ui);
[email protected]5d98294912012-06-27 22:57:401253
1254 // Settings page/subpages are forced to open in normal mode. We disable these
[email protected]90efc3e2014-04-22 18:39:031255 // commands for guest sessions and when incognito is forced.
[email protected]5d98294912012-06-27 22:57:401256 const bool options_enabled = show_main_ui &&
1257 IncognitoModePrefs::GetAvailability(
1258 profile()->GetPrefs()) != IncognitoModePrefs::FORCED;
[email protected]57b25292014-05-01 16:31:061259 const bool guest_session = profile()->IsGuestSession();
[email protected]5d98294912012-06-27 22:57:401260 command_updater_.UpdateCommandEnabled(IDC_OPTIONS, options_enabled);
[email protected]57b25292014-05-01 16:31:061261 command_updater_.UpdateCommandEnabled(IDC_IMPORT_SETTINGS,
1262 options_enabled && !guest_session);
[email protected]5d98294912012-06-27 22:57:401263
1264 command_updater_.UpdateCommandEnabled(IDC_EDIT_SEARCH_ENGINES, show_main_ui);
1265 command_updater_.UpdateCommandEnabled(IDC_VIEW_PASSWORDS, show_main_ui);
1266 command_updater_.UpdateCommandEnabled(IDC_ABOUT, show_main_ui);
1267 command_updater_.UpdateCommandEnabled(IDC_SHOW_APP_MENU, show_main_ui);
1268#if defined (ENABLE_PROFILING) && !defined(NO_TCMALLOC)
1269 command_updater_.UpdateCommandEnabled(IDC_PROFILING_ENABLED, show_main_ui);
1270#endif
1271
[email protected]7efaed362013-04-04 09:33:321272 // Disable explicit fullscreen toggling when in metro snap mode.
[email protected]32dfede2013-08-25 15:48:251273 bool fullscreen_enabled = window_state != WINDOW_STATE_METRO_SNAP;
[email protected]aeafc3852014-04-29 16:51:291274#if !defined(OS_MACOSX)
[email protected]32dfede2013-08-25 15:48:251275 if (window_state == WINDOW_STATE_NOT_FULLSCREEN &&
1276 !profile()->GetPrefs()->GetBoolean(prefs::kFullscreenAllowed)) {
1277 // Disable toggling into fullscreen mode if disallowed by pref.
1278 fullscreen_enabled = false;
1279 }
[email protected]00a1cc5b2012-11-07 13:44:511280#endif
1281
1282 command_updater_.UpdateCommandEnabled(IDC_FULLSCREEN, fullscreen_enabled);
1283 command_updater_.UpdateCommandEnabled(IDC_PRESENTATION_MODE,
1284 fullscreen_enabled);
[email protected]5d98294912012-06-27 22:57:401285
1286 UpdateCommandsForBookmarkBar();
[email protected]5d98294912012-06-27 22:57:401287}
1288
1289void BrowserCommandController::UpdatePrintingState() {
[email protected]d53e4032012-06-29 18:58:341290 bool print_enabled = CanPrint(browser_);
1291 command_updater_.UpdateCommandEnabled(IDC_PRINT, print_enabled);
vitalybukae29991c2014-11-05 21:15:121292#if defined(ENABLE_BASIC_PRINTING)
vitalybukaf9433e42014-09-08 10:04:551293 command_updater_.UpdateCommandEnabled(IDC_BASIC_PRINT,
1294 CanBasicPrint(browser_));
vitalybukae29991c2014-11-05 21:15:121295#endif // ENABLE_BASIC_PRINTING
[email protected]5d98294912012-06-27 22:57:401296}
1297
1298void BrowserCommandController::UpdateSaveAsState() {
1299 command_updater_.UpdateCommandEnabled(IDC_SAVE_PAGE, CanSavePage(browser_));
1300}
1301
[email protected]074311a2013-02-28 23:14:091302void BrowserCommandController::UpdateShowSyncState(bool show_main_ui) {
1303 command_updater_.UpdateCommandEnabled(
1304 IDC_SHOW_SYNC_SETUP, show_main_ui && pref_signin_allowed_.GetValue());
1305}
1306
[email protected]05454532013-01-22 21:09:081307// static
1308void BrowserCommandController::UpdateOpenFileState(
1309 CommandUpdater* command_updater) {
[email protected]5d98294912012-06-27 22:57:401310 bool enabled = true;
1311 PrefService* local_state = g_browser_process->local_state();
1312 if (local_state)
1313 enabled = local_state->GetBoolean(prefs::kAllowFileSelectionDialogs);
1314
[email protected]05454532013-01-22 21:09:081315 command_updater->UpdateCommandEnabled(IDC_OPEN_FILE, enabled);
[email protected]5d98294912012-06-27 22:57:401316}
1317
1318void BrowserCommandController::UpdateReloadStopState(bool is_loading,
1319 bool force) {
1320 window()->UpdateReloadStopState(is_loading, force);
1321 command_updater_.UpdateCommandEnabled(IDC_STOP, is_loading);
1322}
1323
[email protected]2e9369e2014-08-15 09:12:531324void BrowserCommandController::UpdateTabRestoreCommandState() {
1325 TabRestoreService* tab_restore_service =
1326 TabRestoreServiceFactory::GetForProfile(profile());
1327 // The command is enabled if the service hasn't loaded yet to trigger loading.
1328 // The command is updated once the load completes.
1329 command_updater_.UpdateCommandEnabled(
1330 IDC_RESTORE_TAB,
1331 tab_restore_service &&
1332 (!tab_restore_service->IsLoaded() ||
1333 GetRestoreTabType(browser_) != TabStripModelDelegate::RESTORE_NONE));
1334}
1335
[email protected]3cac87232012-11-20 01:48:271336void BrowserCommandController::UpdateCommandsForFind() {
1337 TabStripModel* model = browser_->tab_strip_model();
1338 bool enabled = !model->IsTabBlocked(model->active_index()) &&
1339 !browser_->is_devtools();
1340
1341 command_updater_.UpdateCommandEnabled(IDC_FIND, enabled);
1342 command_updater_.UpdateCommandEnabled(IDC_FIND_NEXT, enabled);
1343 command_updater_.UpdateCommandEnabled(IDC_FIND_PREVIOUS, enabled);
1344}
1345
[email protected]409ea2972012-11-10 19:54:431346void BrowserCommandController::AddInterstitialObservers(WebContents* contents) {
[email protected]20ca0382013-02-28 19:50:071347 interstitial_observers_.push_back(new InterstitialObserver(this, contents));
[email protected]5d98294912012-06-27 22:57:401348}
1349
1350void BrowserCommandController::RemoveInterstitialObservers(
[email protected]e89cfcb2012-11-11 14:47:241351 WebContents* contents) {
[email protected]20ca0382013-02-28 19:50:071352 for (size_t i = 0; i < interstitial_observers_.size(); i++) {
1353 if (interstitial_observers_[i]->web_contents() != contents)
1354 continue;
1355
1356 delete interstitial_observers_[i];
1357 interstitial_observers_.erase(interstitial_observers_.begin() + i);
1358 return;
1359 }
[email protected]5d98294912012-06-27 22:57:401360}
1361
1362BrowserWindow* BrowserCommandController::window() {
1363 return browser_->window();
1364}
1365
1366Profile* BrowserCommandController::profile() {
1367 return browser_->profile();
1368}
1369
[email protected]5d98294912012-06-27 22:57:401370} // namespace chrome