summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-06-27 22:57:40 +0000
committerben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-06-27 22:57:40 +0000
commit5d9829491fa187db0fbbecb7f1e139d8367dcc16 (patch)
tree641f14f9285abae645efbb67da4cb378736f4e22
parentb61a5d8a9a3eb306079743e73f592a6ac6c8c8b3 (diff)
downloadchromium_src-5d9829491fa187db0fbbecb7f1e139d8367dcc16.zip
chromium_src-5d9829491fa187db0fbbecb7f1e139d8367dcc16.tar.gz
chromium_src-5d9829491fa187db0fbbecb7f1e139d8367dcc16.tar.bz2
Moves command handling from Browser to a new object, BrowserCommandController.
Notes: . BrowserCommandController now owns the CommandUpdater. . CommandHandler's ExecuteCommand API was massaged a little so that ExecuteCommand/IsCommandEnabled/SupportsCommand methods are always called on it, rather than the wrapping controller. . The creation of BCC was performed as a svn cp so that history for the various Exec methods could be easily carried forward. . Various "CanFoo" methods were extracted from the UpdateFooState() methods and moved to CanFoo(const Browser* browser) in browser_commands. http://crbug.com/133576 TEST=none Review URL: https://chromiumcodereview.appspot.com/10677009 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@144597 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/app_controller_mac.mm10
-rw-r--r--chrome/browser/automation/automation_provider.cc4
-rw-r--r--chrome/browser/automation/testing_automation_provider.cc29
-rw-r--r--chrome/browser/browser_commands_unittest.cc21
-rw-r--r--chrome/browser/chrome_to_mobile_service.cc10
-rw-r--r--chrome/browser/chromeos/locale_change_guard.cc3
-rw-r--r--chrome/browser/command_observer.h21
-rw-r--r--chrome/browser/command_updater.cc14
-rw-r--r--chrome/browser/command_updater.h27
-rw-r--r--chrome/browser/command_updater_unittest.cc3
-rw-r--r--chrome/browser/download/save_page_browsertest.cc3
-rw-r--r--chrome/browser/extensions/extension_global_error_badge.cc3
-rw-r--r--chrome/browser/global_keyboard_shortcuts_mac.h4
-rw-r--r--chrome/browser/page_cycler/page_cycler.cc3
-rw-r--r--chrome/browser/ssl/ssl_browser_tests.cc2
-rw-r--r--chrome/browser/sync/sync_global_error.cc4
-rw-r--r--chrome/browser/sync/sync_global_error_unittest.cc8
-rw-r--r--chrome/browser/tab_contents/view_source_browsertest.cc5
-rw-r--r--chrome/browser/tab_restore_browsertest.cc2
-rw-r--r--chrome/browser/ui/browser.cc887
-rw-r--r--chrome/browser/ui/browser.h139
-rw-r--r--chrome/browser/ui/browser_browsertest.cc46
-rw-r--r--chrome/browser/ui/browser_command_controller.cc1063
-rw-r--r--chrome/browser/ui/browser_command_controller.h188
-rw-r--r--chrome/browser/ui/browser_commands.cc172
-rw-r--r--chrome/browser/ui/browser_commands.h33
-rw-r--r--chrome/browser/ui/browser_unittest.cc7
-rw-r--r--chrome/browser/ui/cocoa/browser/avatar_button_controller.mm3
-rw-r--r--chrome/browser/ui/cocoa/browser_window_cocoa.mm3
-rw-r--r--chrome/browser/ui/cocoa/browser_window_controller.mm39
-rw-r--r--chrome/browser/ui/cocoa/browser_window_utils.mm3
-rw-r--r--chrome/browser/ui/cocoa/command_observer_bridge.h8
-rw-r--r--chrome/browser/ui/cocoa/command_observer_bridge.mm1
-rw-r--r--chrome/browser/ui/cocoa/command_observer_bridge_unittest.mm1
-rw-r--r--chrome/browser/ui/cocoa/fullscreen_exit_bubble_controller.mm3
-rw-r--r--chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h5
-rw-r--r--chrome/browser/ui/cocoa/toolbar/toolbar_controller.mm1
-rw-r--r--chrome/browser/ui/cocoa/toolbar/toolbar_controller_unittest.mm20
-rw-r--r--chrome/browser/ui/fullscreen_exit_bubble.cc3
-rw-r--r--chrome/browser/ui/gtk/avatar_menu_button_gtk.cc3
-rw-r--r--chrome/browser/ui/gtk/back_forward_button_gtk.cc4
-rw-r--r--chrome/browser/ui/gtk/browser_titlebar.cc5
-rw-r--r--chrome/browser/ui/gtk/browser_toolbar_gtk.cc18
-rw-r--r--chrome/browser/ui/gtk/browser_toolbar_gtk.h6
-rw-r--r--chrome/browser/ui/gtk/browser_window_gtk.cc19
-rw-r--r--chrome/browser/ui/gtk/global_menu_bar.cc12
-rw-r--r--chrome/browser/ui/gtk/global_menu_bar.h6
-rw-r--r--chrome/browser/ui/gtk/location_bar_view_gtk.cc7
-rw-r--r--chrome/browser/ui/gtk/location_bar_view_gtk.h6
-rw-r--r--chrome/browser/ui/gtk/reload_button_gtk.cc2
-rw-r--r--chrome/browser/ui/panels/old_panel.cc8
-rw-r--r--chrome/browser/ui/panels/panel_browser_window_cocoa.mm4
-rw-r--r--chrome/browser/ui/toolbar/wrench_menu_model.cc10
-rw-r--r--chrome/browser/ui/views/avatar_menu_button.cc3
-rw-r--r--chrome/browser/ui/views/frame/browser_view.cc21
-rw-r--r--chrome/browser/ui/views/frame/system_menu_model_delegate.cc5
-rw-r--r--chrome/browser/ui/views/location_bar/chrome_to_mobile_view.cc1
-rw-r--r--chrome/browser/ui/views/location_bar/chrome_to_mobile_view.h7
-rw-r--r--chrome/browser/ui/views/location_bar/location_bar_view.cc1
-rw-r--r--chrome/browser/ui/views/toolbar_view.cc25
-rw-r--r--chrome/browser/ui/views/toolbar_view.h6
-rw-r--r--chrome/browser/ui/webui/ntp/ntp_login_handler.cc4
-rw-r--r--chrome/browser/ui/webui/options2/chromeos/cros_language_options_handler2.cc7
-rw-r--r--chrome/browser/ui/webui/print_preview/print_preview_ui_browsertest.cc18
-rw-r--r--chrome/chrome_browser.gypi3
65 files changed, 1791 insertions, 1221 deletions
diff --git a/chrome/browser/app_controller_mac.mm b/chrome/browser/app_controller_mac.mm
index be7af30..c5f9293 100644
--- a/chrome/browser/app_controller_mac.mm
+++ b/chrome/browser/app_controller_mac.mm
@@ -827,7 +827,7 @@ const AEEventClass kAECloudPrintUninstallClass = 'GCPu';
// Create a new tab in an existing browser window (which we activate) if
// possible.
if (Browser* browser = ActivateBrowser(lastProfile)) {
- browser->ExecuteCommand(IDC_NEW_TAB);
+ chrome::ExecuteCommand(browser, IDC_NEW_TAB);
break;
}
// Else fall through to create new window.
@@ -835,10 +835,12 @@ const AEEventClass kAECloudPrintUninstallClass = 'GCPu';
CreateBrowser(lastProfile);
break;
case IDC_FOCUS_LOCATION:
- ActivateOrCreateBrowser(lastProfile)->ExecuteCommand(IDC_FOCUS_LOCATION);
+ chrome::ExecuteCommand(ActivateOrCreateBrowser(lastProfile),
+ IDC_FOCUS_LOCATION);
break;
case IDC_FOCUS_SEARCH:
- ActivateOrCreateBrowser(lastProfile)->ExecuteCommand(IDC_FOCUS_SEARCH);
+ chrome::ExecuteCommand(ActivateOrCreateBrowser(lastProfile),
+ IDC_FOCUS_SEARCH);
break;
case IDC_NEW_INCOGNITO_WINDOW:
CreateBrowser(lastProfile->GetOffTheRecordProfile());
@@ -847,7 +849,7 @@ const AEEventClass kAECloudPrintUninstallClass = 'GCPu';
chrome::OpenWindowWithRestoredTabs(lastProfile);
break;
case IDC_OPEN_FILE:
- CreateBrowser(lastProfile)->ExecuteCommand(IDC_OPEN_FILE);
+ chrome::ExecuteCommand(CreateBrowser(lastProfile), IDC_OPEN_FILE);
break;
case IDC_CLEAR_BROWSING_DATA: {
// There may not be a browser open, so use the default profile.
diff --git a/chrome/browser/automation/automation_provider.cc b/chrome/browser/automation/automation_provider.cc
index 018cec6..7effc33 100644
--- a/chrome/browser/automation/automation_provider.cc
+++ b/chrome/browser/automation/automation_provider.cc
@@ -46,6 +46,7 @@
#include "chrome/browser/ssl/ssl_blocking_page.h"
#include "chrome/browser/ui/app_modal_dialogs/app_modal_dialog.h"
#include "chrome/browser/ui/app_modal_dialogs/app_modal_dialog_queue.h"
+#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/find_bar/find_bar.h"
@@ -560,8 +561,7 @@ void AutomationProvider::OverrideEncoding(int tab_handle,
// If the browser has UI, simulate what a user would do.
// Activate the tab and then click the encoding menu.
- if (browser &&
- browser->command_updater()->IsCommandEnabled(IDC_ENCODING_MENU)) {
+ if (browser && chrome::IsCommandEnabled(browser, IDC_ENCODING_MENU)) {
int selected_encoding_id =
CharacterEncoding::GetCommandIdByCanonicalEncodingName(encoding_name);
if (selected_encoding_id) {
diff --git a/chrome/browser/automation/testing_automation_provider.cc b/chrome/browser/automation/testing_automation_provider.cc
index e47c837..8a095f3 100644
--- a/chrome/browser/automation/testing_automation_provider.cc
+++ b/chrome/browser/automation/testing_automation_provider.cc
@@ -634,10 +634,10 @@ void TestingAutomationProvider::Reload(int handle,
if (tab_tracker_->ContainsHandle(handle)) {
NavigationController* tab = tab_tracker_->GetResource(handle);
Browser* browser = FindAndActivateTab(tab);
- if (browser && browser->command_updater()->IsCommandEnabled(IDC_RELOAD)) {
+ if (chrome::IsCommandEnabled(browser, IDC_RELOAD)) {
new NavigationNotificationObserver(
tab, this, reply_message, 1, false, false);
- chrome::Reload(browser, CURRENT_TAB);
+ chrome::ExecuteCommand(browser, IDC_RELOAD);
return;
}
}
@@ -678,15 +678,15 @@ void TestingAutomationProvider::ExecuteBrowserCommandAsync(int handle,
return;
}
Browser* browser = browser_tracker_->GetResource(handle);
- if (!browser->command_updater()->SupportsCommand(command)) {
+ if (!chrome::SupportsCommand(browser, command)) {
LOG(WARNING) << "Browser does not support command: " << command;
return;
}
- if (!browser->command_updater()->IsCommandEnabled(command)) {
+ if (!chrome::IsCommandEnabled(browser, command)) {
LOG(WARNING) << "Browser command not enabled: " << command;
return;
}
- browser->ExecuteCommand(command);
+ chrome::ExecuteCommand(browser, command);
*success = true;
}
@@ -702,12 +702,12 @@ void TestingAutomationProvider::ExecuteBrowserCommand(
};
if (browser_tracker_->ContainsHandle(handle)) {
Browser* browser = browser_tracker_->GetResource(handle);
- if (browser->command_updater()->SupportsCommand(command) &&
- browser->command_updater()->IsCommandEnabled(command)) {
+ if (chrome::SupportsCommand(browser, command) &&
+ chrome::IsCommandEnabled(browser, command)) {
// First check if we can handle the command without using an observer.
for (size_t i = 0; i < arraysize(kSynchronousCommands); i++) {
if (command == kSynchronousCommands[i]) {
- browser->ExecuteCommand(command);
+ chrome::ExecuteCommand(browser, command);
AutomationMsg_WindowExecuteCommand::WriteReplyParams(reply_message,
true);
Send(reply_message);
@@ -718,7 +718,7 @@ void TestingAutomationProvider::ExecuteBrowserCommand(
// Use an observer if we have one, otherwise fail.
if (ExecuteBrowserCommandObserver::CreateAndRegisterObserver(
this, browser, command, reply_message)) {
- browser->ExecuteCommand(command);
+ chrome::ExecuteCommand(browser, command);
return;
}
}
@@ -1369,8 +1369,7 @@ void TestingAutomationProvider::IsMenuCommandEnabled(int browser_handle,
*menu_item_enabled = false;
if (browser_tracker_->ContainsHandle(browser_handle)) {
Browser* browser = browser_tracker_->GetResource(browser_handle);
- *menu_item_enabled =
- browser->command_updater()->IsCommandEnabled(message_num);
+ *menu_item_enabled = chrome::IsCommandEnabled(browser, message_num);
}
}
@@ -1622,10 +1621,10 @@ void TestingAutomationProvider::GoBackBlockUntilNavigationsComplete(
if (tab_tracker_->ContainsHandle(handle)) {
NavigationController* tab = tab_tracker_->GetResource(handle);
Browser* browser = FindAndActivateTab(tab);
- if (browser && browser->command_updater()->IsCommandEnabled(IDC_BACK)) {
+ if (chrome::IsCommandEnabled(browser, IDC_BACK)) {
new NavigationNotificationObserver(tab, this, reply_message,
number_of_navigations, false, false);
- chrome::GoBack(browser, CURRENT_TAB);
+ chrome::ExecuteCommand(browser, IDC_BACK);
return;
}
}
@@ -1640,10 +1639,10 @@ void TestingAutomationProvider::GoForwardBlockUntilNavigationsComplete(
if (tab_tracker_->ContainsHandle(handle)) {
NavigationController* tab = tab_tracker_->GetResource(handle);
Browser* browser = FindAndActivateTab(tab);
- if (browser && browser->command_updater()->IsCommandEnabled(IDC_FORWARD)) {
+ if (chrome::IsCommandEnabled(browser, IDC_FORWARD)) {
new NavigationNotificationObserver(tab, this, reply_message,
number_of_navigations, false, false);
- chrome::GoForward(browser, CURRENT_TAB);
+ chrome::ExecuteCommand(browser, IDC_FORWARD);
return;
}
}
diff --git a/chrome/browser/browser_commands_unittest.cc b/chrome/browser/browser_commands_unittest.cc
index ca12761..1f9544d 100644
--- a/chrome/browser/browser_commands_unittest.cc
+++ b/chrome/browser/browser_commands_unittest.cc
@@ -4,6 +4,7 @@
#include "chrome/app/chrome_command_ids.h"
#include "chrome/browser/bookmarks/bookmark_model.h"
+#include "chrome/browser/ui/browser_command_controller.h"
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/browser_list.h"
#include "chrome/common/url_constants.h"
@@ -37,20 +38,22 @@ TEST_F(BrowserCommandsTest, TabNavigationAccelerators) {
// Select the second tab.
browser()->ActivateTabAt(1, false);
+ CommandUpdater* updater = browser()->command_controller()->command_updater();
+
// Navigate to the first tab using an accelerator.
- browser()->ExecuteCommand(IDC_SELECT_TAB_0);
+ updater->ExecuteCommand(IDC_SELECT_TAB_0);
ASSERT_EQ(0, browser()->active_index());
// Navigate to the second tab using the next accelerators.
- browser()->ExecuteCommand(IDC_SELECT_NEXT_TAB);
+ updater->ExecuteCommand(IDC_SELECT_NEXT_TAB);
ASSERT_EQ(1, browser()->active_index());
// Navigate back to the first tab using the previous accelerators.
- browser()->ExecuteCommand(IDC_SELECT_PREVIOUS_TAB);
+ updater->ExecuteCommand(IDC_SELECT_PREVIOUS_TAB);
ASSERT_EQ(0, browser()->active_index());
// Navigate to the last tab using the select last accelerator.
- browser()->ExecuteCommand(IDC_SELECT_LAST_TAB);
+ updater->ExecuteCommand(IDC_SELECT_LAST_TAB);
ASSERT_EQ(2, browser()->active_index());
}
@@ -68,7 +71,7 @@ TEST_F(BrowserCommandsTest, DuplicateTab) {
size_t initial_window_count = BrowserList::size();
// Duplicate the tab.
- browser()->ExecuteCommand(IDC_DUPLICATE_TAB);
+ chrome::ExecuteCommand(browser(), IDC_DUPLICATE_TAB);
// The duplicated tab should not end up in a new window.
size_t window_count = BrowserList::size();
@@ -98,13 +101,7 @@ TEST_F(BrowserCommandsTest, BookmarkCurrentPage) {
browser()->OpenURL(OpenURLParams(
url1, Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED, false));
- // TODO(beng): remove this once we can use TabContentses directly in testing
- // instead of the TestTabContents which causes this command not to
- // be enabled when the tab is added (and selected).
- browser()->command_updater()->UpdateCommandEnabled(IDC_BOOKMARK_PAGE, true);
-
- // Star it.
- browser()->ExecuteCommand(IDC_BOOKMARK_PAGE);
+ chrome::BookmarkCurrentPage(browser());
// It should now be bookmarked in the bookmark model.
EXPECT_EQ(profile(), browser()->profile());
diff --git a/chrome/browser/chrome_to_mobile_service.cc b/chrome/browser/chrome_to_mobile_service.cc
index 7a922c1..6521313 100644
--- a/chrome/browser/chrome_to_mobile_service.cc
+++ b/chrome/browser/chrome_to_mobile_service.cc
@@ -21,6 +21,7 @@
#include "chrome/browser/signin/token_service.h"
#include "chrome/browser/signin/token_service_factory.h"
#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_command_controller.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/common/chrome_notification_types.h"
#include "chrome/common/chrome_switches.h"
@@ -331,6 +332,7 @@ void ChromeToMobileService::SnapshotFileCreated(
// Track the set of temporary files to be deleted later.
snapshots_.insert(path);
+ // TODO(jam): This is bad and should be replaced with some sort of context.
Browser* browser = browser::FindLastActiveWithProfile(profile_);
if (success && browser && browser->GetActiveWebContents()) {
// Generate the snapshot and have the observer be called back on completion.
@@ -473,10 +475,12 @@ void ChromeToMobileService::HandleSearchResponse() {
if (!mobiles_.empty())
LogMetric(DEVICES_AVAILABLE);
+ // TODO(jam): This is bad and should be replaced with some sort of context.
Browser* browser = browser::FindLastActiveWithProfile(profile_);
- if (browser && browser->command_updater())
- browser->command_updater()->UpdateCommandEnabled(
- IDC_CHROME_TO_MOBILE_PAGE, !mobiles_.empty());
+ if (browser) {
+ browser->command_controller()->SendToMobileStateChanged(
+ !mobiles_.empty());
+ }
}
}
diff --git a/chrome/browser/chromeos/locale_change_guard.cc b/chrome/browser/chromeos/locale_change_guard.cc
index 92815d3..6687dad 100644
--- a/chrome/browser/chromeos/locale_change_guard.cc
+++ b/chrome/browser/chromeos/locale_change_guard.cc
@@ -17,6 +17,7 @@
#include "chrome/browser/prefs/pref_service.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/common/chrome_notification_types.h"
#include "chrome/common/pref_names.h"
@@ -86,7 +87,7 @@ void LocaleChangeGuard::RevertLocaleChange() {
Browser* browser = browser::FindTabbedBrowser(profile_, false);
if (browser)
- browser->ExecuteCommand(IDC_EXIT);
+ chrome::ExecuteCommand(browser, IDC_EXIT);
}
void LocaleChangeGuard::RevertLocaleChangeCallback(const ListValue* list) {
diff --git a/chrome/browser/command_observer.h b/chrome/browser/command_observer.h
new file mode 100644
index 0000000..ac54cbf
--- /dev/null
+++ b/chrome/browser/command_observer.h
@@ -0,0 +1,21 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_COMMAND_OBSERVER_H_
+#define CHROME_BROWSER_COMMAND_OBSERVER_H_
+#pragma once
+
+// An Observer interface implemented by objects that want to be informed when
+// the state of a particular command ID is modified. See CommandUpdater.
+class CommandObserver {
+ public:
+ // Notifies the observer that the enabled state has changed for the
+ // specified command id.
+ virtual void EnabledStateChangedForCommand(int id, bool enabled) = 0;
+
+ protected:
+ virtual ~CommandObserver();
+};
+
+#endif // CHROME_BROWSER_COMMAND_OBSERVER_H_
diff --git a/chrome/browser/command_updater.cc b/chrome/browser/command_updater.cc
index 3642db4..a92b8cb 100644
--- a/chrome/browser/command_updater.cc
+++ b/chrome/browser/command_updater.cc
@@ -9,6 +9,7 @@
#include "base/logging.h"
#include "base/observer_list.h"
#include "base/stl_util.h"
+#include "chrome/browser/command_observer.h"
CommandUpdater::CommandUpdaterDelegate::~CommandUpdaterDelegate() {
}
@@ -40,18 +41,21 @@ bool CommandUpdater::SupportsCommand(int id) const {
return commands_.find(id) != commands_.end();
}
-void CommandUpdater::ExecuteCommand(int id) {
- ExecuteCommandWithDisposition(id, CURRENT_TAB);
+bool CommandUpdater::ExecuteCommand(int id) {
+ return ExecuteCommandWithDisposition(id, CURRENT_TAB);
}
-void CommandUpdater::ExecuteCommandWithDisposition(
+bool CommandUpdater::ExecuteCommandWithDisposition(
int id,
WindowOpenDisposition disposition) {
- if (IsCommandEnabled(id))
+ if (SupportsCommand(id) && IsCommandEnabled(id)) {
delegate_->ExecuteCommandWithDisposition(id, disposition);
+ return true;
+ }
+ return false;
}
-CommandUpdater::CommandObserver::~CommandObserver() {
+CommandObserver::~CommandObserver() {
}
void CommandUpdater::UpdateCommandEnabled(int id, bool enabled) {
diff --git a/chrome/browser/command_updater.h b/chrome/browser/command_updater.h
index 80d8350..3478582 100644
--- a/chrome/browser/command_updater.h
+++ b/chrome/browser/command_updater.h
@@ -10,6 +10,8 @@
#include "base/hash_tables.h"
#include "webkit/glue/window_open_disposition.h"
+class CommandObserver;
+
////////////////////////////////////////////////////////////////////////////////
//
// CommandUpdater class
@@ -48,28 +50,15 @@ class CommandUpdater {
// Performs the action associated with this command ID using CURRENT_TAB
// disposition.
- // TODO(beng): get rid of this since it's effectively just a pass-thru and the
- // call sites would be better off using more well defined delegate interfaces.
- void ExecuteCommand(int id);
+ // Returns true if the command was executed (i.e. it is supported and is
+ // enabled).
+ bool ExecuteCommand(int id);
// Performs the action associated with this command ID using the given
// disposition.
- // TODO(altimofeev): refactor the interface to provide more flexible and
- // explicit way for passing command specific arguments. See
- // NotificationDetails class for the possible implementation ideas.
- void ExecuteCommandWithDisposition(int id, WindowOpenDisposition disposition);
-
- // An Observer interface implemented by objects that want to be informed when
- // the state of a particular command ID is modified.
- class CommandObserver {
- public:
- // Notifies the observer that the enabled state has changed for the
- // specified command id.
- virtual void EnabledStateChangedForCommand(int id, bool enabled) = 0;
-
- protected:
- virtual ~CommandObserver();
- };
+ // Returns true if the command was executed (i.e. it is supported and is
+ // enabled).
+ bool ExecuteCommandWithDisposition(int id, WindowOpenDisposition disposition);
// Adds an observer to the state of a particular command. If the command does
// not exist, it is created, initialized to false.
diff --git a/chrome/browser/command_updater_unittest.cc b/chrome/browser/command_updater_unittest.cc
index 5dcc737..c72d5f1 100644
--- a/chrome/browser/command_updater_unittest.cc
+++ b/chrome/browser/command_updater_unittest.cc
@@ -3,6 +3,7 @@
// found in the LICENSE file.
#include "base/compiler_specific.h"
+#include "chrome/browser/command_observer.h"
#include "chrome/browser/command_updater.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -18,7 +19,7 @@ class TestingCommandHandlerMock
class CommandUpdaterTest : public testing::Test {
};
-class TestingCommandObserverMock : public CommandUpdater::CommandObserver {
+class TestingCommandObserverMock : public CommandObserver {
public:
TestingCommandObserverMock() : enabled_(true) {}
diff --git a/chrome/browser/download/save_page_browsertest.cc b/chrome/browser/download/save_page_browsertest.cc
index bdd1b37..e0d79b4 100644
--- a/chrome/browser/download/save_page_browsertest.cc
+++ b/chrome/browser/download/save_page_browsertest.cc
@@ -284,8 +284,7 @@ IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, SaveCompleteHTML) {
IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, NoSave) {
ui_test_utils::NavigateToURL(browser(), GURL(chrome::kAboutBlankURL));
- ASSERT_TRUE(browser()->command_updater()->SupportsCommand(IDC_SAVE_PAGE));
- EXPECT_FALSE(browser()->command_updater()->IsCommandEnabled(IDC_SAVE_PAGE));
+ EXPECT_FALSE(chrome::CanSavePage(browser()));
}
IN_PROC_BROWSER_TEST_F(SavePageBrowserTest, FileNameFromPageTitle) {
diff --git a/chrome/browser/extensions/extension_global_error_badge.cc b/chrome/browser/extensions/extension_global_error_badge.cc
index b2578df..70f3765 100644
--- a/chrome/browser/extensions/extension_global_error_badge.cc
+++ b/chrome/browser/extensions/extension_global_error_badge.cc
@@ -9,6 +9,7 @@
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_commands.h"
#include "grit/generated_resources.h"
#include "ui/base/l10n/l10n_util.h"
@@ -40,7 +41,7 @@ void ExtensionGlobalErrorBadge::ExecuteMenuItem(Browser* browser) {
// a badge on the wrench menu in the future of this session.
extension_service->extension_warnings()->SuppressBadgeForCurrentWarnings();
- browser->ExecuteCommand(IDC_MANAGE_EXTENSIONS);
+ chrome::ExecuteCommand(browser, IDC_MANAGE_EXTENSIONS);
}
bool ExtensionGlobalErrorBadge::HasBubbleView() {
diff --git a/chrome/browser/global_keyboard_shortcuts_mac.h b/chrome/browser/global_keyboard_shortcuts_mac.h
index 2741ef7..3eb95e6 100644
--- a/chrome/browser/global_keyboard_shortcuts_mac.h
+++ b/chrome/browser/global_keyboard_shortcuts_mac.h
@@ -25,8 +25,8 @@ struct KeyboardShortcutData {
// Check if a given keycode + modifiers (or keychar + modifiers if the
// |key_char| is specified) correspond to a given Chrome command.
-// returns: Command number (as passed to Browser::ExecuteCommand) or -1 if there
-// was no match.
+// returns: Command number (as passed to
+// BrowserCommandController::ExecuteCommand) or -1 if there was no match.
//
// |performKeyEquivalent:| bubbles events up from the window to the views. If
// we let it bubble up to the Omnibox, then the Omnibox handles cmd-left/right
diff --git a/chrome/browser/page_cycler/page_cycler.cc b/chrome/browser/page_cycler/page_cycler.cc
index ad161c9..a5c1cb2 100644
--- a/chrome/browser/page_cycler/page_cycler.cc
+++ b/chrome/browser/page_cycler/page_cycler.cc
@@ -13,6 +13,7 @@
#include "base/string_split.h"
#include "base/utf_string_conversions.h"
#include "chrome/app/chrome_command_ids.h"
+#include "chrome/browser/ui/browser_commands.h"
#include "chrome/common/chrome_notification_types.h"
#include "chrome/test/base/chrome_process_util.h"
#include "chrome/test/perf/perf_test.h"
@@ -232,7 +233,7 @@ void PageCycler::Finish() {
CHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
BrowserList::RemoveObserver(this);
browser_->OnWindowClosing();
- browser_->ExecuteCommand(IDC_EXIT);
+ chrome::ExecuteCommand(browser_, IDC_EXIT);
Release(); // Balanced in PageCycler constructor;
// (only one of Finish/Abort should be called).
}
diff --git a/chrome/browser/ssl/ssl_browser_tests.cc b/chrome/browser/ssl/ssl_browser_tests.cc
index f70863d..fe4cc00 100644
--- a/chrome/browser/ssl/ssl_browser_tests.cc
+++ b/chrome/browser/ssl/ssl_browser_tests.cc
@@ -619,7 +619,7 @@ IN_PROC_BROWSER_TEST_F(SSLUITest, MAYBE_TestHTTPSErrorWithNoNavEntry) {
ui_test_utils::WaitForLoadStop(tab2->web_contents());
// Verify our assumption that there was no prior navigation.
- EXPECT_FALSE(browser()->command_updater()->IsCommandEnabled(IDC_BACK));
+ EXPECT_FALSE(chrome::CanGoBack(browser()));
// We should have an interstitial page showing.
ASSERT_TRUE(tab2->web_contents()->GetInterstitialPage());
diff --git a/chrome/browser/sync/sync_global_error.cc b/chrome/browser/sync/sync_global_error.cc
index b6b0385..19e79fc 100644
--- a/chrome/browser/sync/sync_global_error.cc
+++ b/chrome/browser/sync/sync_global_error.cc
@@ -9,6 +9,7 @@
#include "chrome/browser/sync/profile_sync_service_observer.h"
#include "chrome/browser/sync/sync_ui_util.h"
#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/global_error_service.h"
#include "chrome/browser/ui/global_error_service_factory.h"
#include "chrome/browser/ui/webui/signin/login_ui_service.h"
@@ -59,7 +60,8 @@ void SyncGlobalError::ExecuteMenuItem(Browser* browser) {
#if defined(OS_CHROMEOS)
if (service_->GetAuthError().state() != AuthError::NONE) {
DLOG(INFO) << "Signing out the user to fix a sync error.";
- browser->ExecuteCommand(IDC_EXIT);
+ // TODO(beng): seems like this could just call browser::AttemptUserExit().
+ chrome::ExecuteCommand(browser, IDC_EXIT);
return;
}
#endif
diff --git a/chrome/browser/sync/sync_global_error_unittest.cc b/chrome/browser/sync/sync_global_error_unittest.cc
index 07b746f..1ac0b1e 100644
--- a/chrome/browser/sync/sync_global_error_unittest.cc
+++ b/chrome/browser/sync/sync_global_error_unittest.cc
@@ -105,6 +105,13 @@ void VerifySyncGlobalErrorResult(NiceMock<ProfileSyncServiceMock>* service,
EXPECT_FALSE(error->GetBubbleViewTitle().empty());
#if defined(OS_CHROMEOS)
+ // TODO(altimofeev): Implement this in a way that doesn't involve subclassing
+ // Browser or using GMock on browser/ui types which is
+ // banned. Consider observing NOTIFICATION_APP_TERMINATING
+ // instead.
+ // http://crbug.com/134675
+#else
+#if defined(OS_CHROMEOS)
if (error_state != GoogleServiceAuthError::NONE) {
// In CrOS sign-in/sign-out is made to fix the error.
EXPECT_CALL(*static_cast<BrowserMock*>(browser),
@@ -121,6 +128,7 @@ void VerifySyncGlobalErrorResult(NiceMock<ProfileSyncServiceMock>* service,
error->BubbleViewDidClose(browser);
}
#endif
+#endif
}
} // namespace
diff --git a/chrome/browser/tab_contents/view_source_browsertest.cc b/chrome/browser/tab_contents/view_source_browsertest.cc
index 85299d2..7084bdc 100644
--- a/chrome/browser/tab_contents/view_source_browsertest.cc
+++ b/chrome/browser/tab_contents/view_source_browsertest.cc
@@ -5,6 +5,7 @@
#include "base/utf_string_conversions.h"
#include "chrome/app/chrome_command_ids.h"
#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_commands.h"
#include "chrome/common/url_constants.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
@@ -65,7 +66,7 @@ IN_PROC_BROWSER_TEST_F(ViewSourceTest, ViewSourceInMenuEnabledOnANormalPage) {
GURL url(test_server()->GetURL(kTestHtml));
ui_test_utils::NavigateToURL(browser(), url);
- EXPECT_TRUE(browser()->command_updater()->IsCommandEnabled(IDC_VIEW_SOURCE));
+ EXPECT_TRUE(chrome::CanViewSource(browser()));
}
// Make sure that when looking at the page source, we can't select "View Source"
@@ -80,5 +81,5 @@ IN_PROC_BROWSER_TEST_F(ViewSourceTest,
test_server()->GetURL(kTestHtml).spec());
ui_test_utils::NavigateToURL(browser(), url_viewsource);
- EXPECT_FALSE(browser()->command_updater()->IsCommandEnabled(IDC_VIEW_SOURCE));
+ EXPECT_FALSE(chrome::CanViewSource(browser()));
}
diff --git a/chrome/browser/tab_restore_browsertest.cc b/chrome/browser/tab_restore_browsertest.cc
index 3f73d54..448fc8e 100644
--- a/chrome/browser/tab_restore_browsertest.cc
+++ b/chrome/browser/tab_restore_browsertest.cc
@@ -257,7 +257,7 @@ IN_PROC_BROWSER_TEST_F(TabRestoreTest, DontLoadRestoredTab) {
ASSERT_EQ(browser()->tab_count(), starting_tab_count + 2);
// Make sure that there's nothing else to restore.
- ASSERT_FALSE(browser()->command_updater()->IsCommandEnabled(IDC_RESTORE_TAB));
+ ASSERT_FALSE(chrome::CanRestoreTab(browser()));
}
// Open a window with multiple tabs, close a tab, then close the window.
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index 1909c5e..b87decf 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -95,6 +95,7 @@
#include "chrome/browser/ui/app_modal_dialogs/javascript_dialog_creator.h"
#include "chrome/browser/ui/blocked_content/blocked_content_tab_helper.h"
#include "chrome/browser/ui/bookmarks/bookmark_tab_helper.h"
+#include "chrome/browser/ui/browser_command_controller.h"
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/browser_content_setting_bubble_model_delegate.h"
#include "chrome/browser/ui/browser_dialogs.h"
@@ -236,24 +237,6 @@ const char kPrivacyDashboardUrl[] = "https://www.google.com/dashboard";
// How long we wait before updating the browser chrome while loading a page.
const int kUIUpdateCoalescingTimeMS = 200;
-// Returns |true| if entry has an internal chrome:// URL, |false| otherwise.
-bool HasInternalURL(const NavigationEntry* entry) {
- if (!entry)
- return false;
-
- // Check the |virtual_url()| first. This catches regular chrome:// URLs
- // including URLs that were rewritten (such as chrome://bookmarks).
- if (entry->GetVirtualURL().SchemeIs(chrome::kChromeUIScheme))
- return true;
-
- // If the |virtual_url()| isn't a chrome:// URL, check if it's actually
- // view-source: of a chrome:// URL.
- if (entry->GetVirtualURL().SchemeIs(chrome::kViewSourceScheme))
- return entry->GetURL().SchemeIs(chrome::kChromeUIScheme);
-
- return false;
-}
-
bool AllowPanels(const std::string& app_name) {
return PanelManager::ShouldUsePanels(
web_app::GetExtensionIdFromApplicationName(app_name));
@@ -316,7 +299,6 @@ Browser::Browser(Type type, Profile* profile)
window_(NULL),
ALLOW_THIS_IN_INITIALIZER_LIST(
tab_strip_model_(new TabStripModel(this, profile))),
- command_updater_(this),
app_type_(APP_TYPE_HOST),
chrome_updater_factory_(this),
is_attempting_to_close_browser_(false),
@@ -324,9 +306,6 @@ Browser::Browser(Type type, Profile* profile)
initial_show_state_(ui::SHOW_STATE_DEFAULT),
is_session_restore_(false),
weak_factory_(this),
- block_command_execution_(false),
- last_blocked_command_id_(-1),
- last_blocked_command_disposition_(CURRENT_TAB),
pending_web_app_action_(NONE),
ALLOW_THIS_IN_INITIALIZER_LIST(
content_setting_bubble_model_delegate_(
@@ -342,6 +321,8 @@ Browser::Browser(Type type, Profile* profile)
new BrowserSyncedWindowDelegate(this))),
bookmark_bar_state_(BookmarkBar::HIDDEN),
device_attached_intent_source_(this, this),
+ ALLOW_THIS_IN_INITIALIZER_LIST(
+ command_controller_(new chrome::BrowserCommandController(this))),
window_has_shown_(false) {
tab_strip_model_->AddObserver(this);
@@ -369,23 +350,12 @@ Browser::Browser(Type type, Profile* profile)
registrar_.Add(this, chrome::NOTIFICATION_WEB_CONTENT_SETTINGS_CHANGED,
content::NotificationService::AllSources());
- PrefService* local_state = g_browser_process->local_state();
- if (local_state) {
- local_pref_registrar_.Init(local_state);
- local_pref_registrar_.Add(prefs::kPrintingEnabled, this);
- local_pref_registrar_.Add(prefs::kAllowFileSelectionDialogs, this);
- local_pref_registrar_.Add(prefs::kInManagedMode, this);
- }
-
profile_pref_registrar_.Init(profile_->GetPrefs());
profile_pref_registrar_.Add(prefs::kDevToolsDisabled, this);
- profile_pref_registrar_.Add(prefs::kEditBookmarksEnabled, this);
profile_pref_registrar_.Add(prefs::kShowBookmarkBar, this);
profile_pref_registrar_.Add(prefs::kHomePage, this);
profile_pref_registrar_.Add(prefs::kInstantEnabled, this);
- profile_pref_registrar_.Add(prefs::kIncognitoModeAvailability, this);
- InitCommandState();
BrowserList::AddBrowser(this);
// NOTE: These prefs all need to be explicitly destroyed in the destructor
@@ -393,17 +363,6 @@ Browser::Browser(Type type, Profile* profile)
encoding_auto_detect_.Init(prefs::kWebKitUsesUniversalDetector,
profile_->GetPrefs(), NULL);
- tab_restore_service_ = TabRestoreServiceFactory::GetForProfile(profile);
- if (tab_restore_service_) {
- tab_restore_service_->AddObserver(this);
- TabRestoreServiceChanged(tab_restore_service_);
- }
-
- ProfileSyncService* service =
- ProfileSyncServiceFactory::GetInstance()->GetForProfile(profile_);
- if (service)
- service->AddObserver(this);
-
CreateInstantIfNecessary();
UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_INIT);
@@ -413,11 +372,6 @@ Browser::Browser(Type type, Profile* profile)
}
Browser::~Browser() {
- ProfileSyncService* service =
- ProfileSyncServiceFactory::GetInstance()->GetForProfile(profile_);
- if (service)
- service->RemoveObserver(this);
-
// The tab strip should not have any tabs at this point.
if (!browser_shutdown::ShuttingDownWithoutClosingBrowsers())
DCHECK(tab_strip_model_->empty());
@@ -451,10 +405,11 @@ Browser::~Browser() {
#endif
profile_pref_registrar_.RemoveAll();
- local_pref_registrar_.RemoveAll();
encoding_auto_detect_.Destroy();
+ command_controller_.reset();
+
if (profile_->IsOffTheRecord() &&
!BrowserList::IsOffTheRecordSessionActiveForProfile(profile_)) {
// An incognito profile is no longer needed, this indirectly frees
@@ -466,8 +421,6 @@ Browser::~Browser() {
// away so they don't try and call back to us.
if (select_file_dialog_.get())
select_file_dialog_->ListenerDestroyed();
-
- TabRestoreServiceDestroyed(tab_restore_service_);
}
// static
@@ -939,16 +892,7 @@ void Browser::ReplaceRestoredTab(
void Browser::WindowFullscreenStateChanged() {
fullscreen_controller_->WindowFullscreenStateChanged();
- FullScreenMode fullscreen_mode = FULLSCREEN_DISABLED;
- if (window_->IsFullscreen()) {
-#if defined(OS_WIN)
- fullscreen_mode = window_->IsInMetroSnapMode() ? FULLSCREEN_METRO_SNAP :
- FULLSCREEN_NORMAL;
-#else
- fullscreen_mode = FULLSCREEN_NORMAL;
-#endif
- }
- UpdateCommandsForFullscreenMode(fullscreen_mode);
+ command_controller_->FullscreenStateChanged();
UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_TOGGLE_FULLSCREEN);
}
@@ -1190,76 +1134,6 @@ void Browser::FindReplyHelper(WebContents* web_contents,
final_update);
}
-void Browser::ExecuteCommand(int id) {
- ExecuteCommandWithDisposition(id, CURRENT_TAB);
-}
-
-void Browser::ExecuteCommand(int id, int event_flags) {
- ExecuteCommandWithDisposition(
- id, browser::DispositionFromEventFlags(event_flags));
-}
-
-bool Browser::ExecuteCommandIfEnabled(int id) {
- if (command_updater_.SupportsCommand(id) &&
- command_updater_.IsCommandEnabled(id)) {
- ExecuteCommand(id);
- return true;
- }
- return false;
-}
-
-bool Browser::IsReservedCommandOrKey(int command_id,
- const NativeWebKeyboardEvent& event) {
- // In Apps mode, no keys are reserved.
- if (is_app())
- return false;
-
-#if defined(OS_CHROMEOS)
- // Chrome OS's top row of keys produces F1-10. Make sure that web pages
- // aren't able to block Chrome from performing the standard actions for F1-F4.
- // We should not handle F5-10 here since they are processed by Ash. See also:
- // crbug.com/127333#c8
- ui::KeyboardCode key_code =
- static_cast<ui::KeyboardCode>(event.windowsKeyCode);
- if ((key_code == ui::VKEY_F1 ||
- key_code == ui::VKEY_F2 ||
- key_code == ui::VKEY_F3 ||
- key_code == ui::VKEY_F4) &&
- // Make sure it's a browser shortcut (i.e. not an Ash one like Alt+F4).
- command_id != -1) {
- return true;
- }
-#endif
-
- if (window_->IsFullscreen() && command_id == IDC_FULLSCREEN)
- return true;
- return command_id == IDC_CLOSE_TAB ||
- command_id == IDC_CLOSE_WINDOW ||
- command_id == IDC_NEW_INCOGNITO_WINDOW ||
- command_id == IDC_NEW_TAB ||
- command_id == IDC_NEW_WINDOW ||
- command_id == IDC_RESTORE_TAB ||
- command_id == IDC_SELECT_NEXT_TAB ||
- command_id == IDC_SELECT_PREVIOUS_TAB ||
- command_id == IDC_TABPOSE ||
- command_id == IDC_EXIT ||
- command_id == IDC_SEARCH;
-}
-
-void Browser::SetBlockCommandExecution(bool block) {
- block_command_execution_ = block;
- if (block) {
- last_blocked_command_id_ = -1;
- last_blocked_command_disposition_ = CURRENT_TAB;
- }
-}
-
-int Browser::GetLastBlockedCommand(WindowOpenDisposition* disposition) {
- if (disposition)
- *disposition = last_blocked_command_disposition_;
- return last_blocked_command_id_;
-}
-
void Browser::UpdateUIForNavigationInTab(TabContents* contents,
content::PageTransition transition,
bool user_initiated) {
@@ -1295,256 +1169,6 @@ WebContents* Browser::OpenURL(const OpenURLParams& params) {
return OpenURLFromTab(NULL, params);
}
-///////////////////////////////////////////////////////////////////////////////
-// Browser, CommandUpdater::CommandUpdaterDelegate implementation:
-
-void Browser::ExecuteCommandWithDisposition(
- int id, WindowOpenDisposition disposition) {
- // No commands are enabled if there is not yet any selected tab.
- // TODO(pkasting): It seems like we should not need this, because either
- // most/all commands should not have been enabled yet anyway or the ones that
- // are enabled should be global, or safe themselves against having no selected
- // tab. However, Ben says he tried removing this before and got lots of
- // crashes, e.g. from Windows sending WM_COMMANDs at random times during
- // window construction. This probably could use closer examination someday.
- if (!GetActiveTabContents())
- return;
-
- DCHECK(command_updater_.IsCommandEnabled(id)) << "Invalid/disabled command "
- << id;
-
- // If command execution is blocked then just record the command and return.
- if (block_command_execution_) {
- // We actually only allow no more than one blocked command, otherwise some
- // commands maybe lost.
- DCHECK_EQ(last_blocked_command_id_, -1);
- last_blocked_command_id_ = id;
- last_blocked_command_disposition_ = disposition;
- return;
- }
-
- // The order of commands in this switch statement must match the function
- // declaration order in browser.h!
- switch (id) {
- // Navigation commands
- case IDC_BACK: chrome::GoBack(this, disposition);break;
- case IDC_FORWARD:
- chrome::GoForward(this, disposition);
- break;
- case IDC_RELOAD: chrome::Reload(this, disposition);break;
- case IDC_RELOAD_IGNORING_CACHE:
- chrome::ReloadIgnoringCache(this, disposition);
- break;
- case IDC_HOME: chrome::Home(this, disposition); break;
- case IDC_OPEN_CURRENT_URL: chrome::OpenCurrentURL(this); break;
- case IDC_STOP: chrome::Stop(this); break;
-
- // Window management commands
- case IDC_NEW_WINDOW: chrome::NewWindow(this); break;
- case IDC_NEW_INCOGNITO_WINDOW: chrome::NewIncognitoWindow(this); break;
- case IDC_CLOSE_WINDOW: chrome::CloseWindow(this); break;
- case IDC_NEW_TAB: chrome::NewTab(this); break;
- case IDC_CLOSE_TAB: chrome::CloseTab(this); break;
- case IDC_SELECT_NEXT_TAB: chrome::SelectNextTab(this); break;
- case IDC_SELECT_PREVIOUS_TAB: chrome::SelectPreviousTab(this); break;
- case IDC_TABPOSE: chrome::OpenTabpose(this); break;
- case IDC_MOVE_TAB_NEXT: chrome::MoveTabNext(this); break;
- case IDC_MOVE_TAB_PREVIOUS: chrome::MoveTabPrevious(this); break;
- case IDC_SELECT_TAB_0:
- case IDC_SELECT_TAB_1:
- case IDC_SELECT_TAB_2:
- case IDC_SELECT_TAB_3:
- case IDC_SELECT_TAB_4:
- case IDC_SELECT_TAB_5:
- case IDC_SELECT_TAB_6:
- case IDC_SELECT_TAB_7:
- chrome::SelectNumberedTab(this, id - IDC_SELECT_TAB_0);
- break;
- case IDC_SELECT_LAST_TAB: chrome::SelectLastTab(this); break;
- case IDC_DUPLICATE_TAB: chrome::DuplicateTab(this); break;
- case IDC_RESTORE_TAB: RestoreTab(); break;
- case IDC_COPY_URL:
- chrome::WriteCurrentURLToClipboard(this);
- break;
- case IDC_SHOW_AS_TAB:
- chrome::ConvertPopupToTabbedBrowser(this);
- break;
- case IDC_FULLSCREEN: ToggleFullscreenMode(); break;
-#if defined(OS_WIN)
- case IDC_METRO_SNAP_ENABLE: SetMetroSnapMode(true); break;
- case IDC_METRO_SNAP_DISABLE: SetMetroSnapMode(false); break;
-#endif
-#if defined(OS_MACOSX)
- case IDC_PRESENTATION_MODE: TogglePresentationMode(); break;
-#endif
- case IDC_EXIT: chrome::Exit(); break;
-
- // Page-related commands
- case IDC_SAVE_PAGE: chrome::SavePage(this); break;
- case IDC_BOOKMARK_PAGE: chrome::BookmarkCurrentPage(this);break;
- case IDC_PIN_TO_START_SCREEN:
- chrome::PinCurrentPageToStartScreen(this);
- break;
- case IDC_BOOKMARK_ALL_TABS: BookmarkAllTabs(); break;
- case IDC_VIEW_SOURCE: chrome::ViewSelectedSource(this); break;
- case IDC_EMAIL_PAGE_LOCATION: chrome::EmailPageLocation(this); break;
- case IDC_PRINT: chrome::Print(this); break;
- case IDC_ADVANCED_PRINT: chrome::AdvancedPrint(this); break;
- case IDC_CHROME_TO_MOBILE_PAGE:
- chrome::ShowChromeToMobileBubble(this);
- break;
- case IDC_ENCODING_AUTO_DETECT: ToggleEncodingAutoDetect(); break;
- case IDC_ENCODING_UTF8:
- case IDC_ENCODING_UTF16LE:
- case IDC_ENCODING_ISO88591:
- case IDC_ENCODING_WINDOWS1252:
- case IDC_ENCODING_GBK:
- case IDC_ENCODING_GB18030:
- case IDC_ENCODING_BIG5HKSCS:
- case IDC_ENCODING_BIG5:
- case IDC_ENCODING_KOREAN:
- case IDC_ENCODING_SHIFTJIS:
- case IDC_ENCODING_ISO2022JP:
- case IDC_ENCODING_EUCJP:
- case IDC_ENCODING_THAI:
- case IDC_ENCODING_ISO885915:
- case IDC_ENCODING_MACINTOSH:
- case IDC_ENCODING_ISO88592:
- case IDC_ENCODING_WINDOWS1250:
- case IDC_ENCODING_ISO88595:
- case IDC_ENCODING_WINDOWS1251:
- case IDC_ENCODING_KOI8R:
- case IDC_ENCODING_KOI8U:
- case IDC_ENCODING_ISO88597:
- case IDC_ENCODING_WINDOWS1253:
- case IDC_ENCODING_ISO88594:
- case IDC_ENCODING_ISO885913:
- case IDC_ENCODING_WINDOWS1257:
- case IDC_ENCODING_ISO88593:
- case IDC_ENCODING_ISO885910:
- case IDC_ENCODING_ISO885914:
- case IDC_ENCODING_ISO885916:
- case IDC_ENCODING_WINDOWS1254:
- case IDC_ENCODING_ISO88596:
- case IDC_ENCODING_WINDOWS1256:
- case IDC_ENCODING_ISO88598:
- case IDC_ENCODING_ISO88598I:
- case IDC_ENCODING_WINDOWS1255:
- case IDC_ENCODING_WINDOWS1258: OverrideEncoding(id); break;
-
- // Clipboard commands
- case IDC_CUT: chrome::Cut(this); break;
- case IDC_COPY: chrome::Copy(this); break;
- case IDC_PASTE: chrome::Paste(this); break;
-
- // Find-in-page
- case IDC_FIND: chrome::Find(this); break;
- case IDC_FIND_NEXT: chrome::FindNext(this); break;
- case IDC_FIND_PREVIOUS: chrome::FindPrevious(this); break;
-
- // Zoom
- case IDC_ZOOM_PLUS:
- chrome::Zoom(this, content::PAGE_ZOOM_IN);
- break;
- case IDC_ZOOM_NORMAL:
- chrome::Zoom(this, content::PAGE_ZOOM_RESET);
- break;
- case IDC_ZOOM_MINUS:
- chrome::Zoom(this, content::PAGE_ZOOM_OUT);
- break;
-
- // Focus various bits of UI
- case IDC_FOCUS_TOOLBAR: chrome::FocusToolbar(this); break;
- case IDC_FOCUS_LOCATION: chrome::FocusLocationBar(this); break;
- case IDC_FOCUS_SEARCH: chrome::FocusSearch(this); break;
- case IDC_FOCUS_MENU_BAR: chrome::FocusAppMenu(this); break;
- case IDC_FOCUS_BOOKMARKS:
- chrome::FocusBookmarksToolbar(this);
- break;
- case IDC_FOCUS_NEXT_PANE: chrome::FocusNextPane(this); break;
- case IDC_FOCUS_PREVIOUS_PANE: chrome::FocusPreviousPane(this); break;
-
- // Show various bits of UI
- case IDC_OPEN_FILE: OpenFile(); break;
- case IDC_CREATE_SHORTCUTS: OpenCreateShortcutsDialog(); break;
- case IDC_DEV_TOOLS:
- chrome::ToggleDevToolsWindow(this, DEVTOOLS_TOGGLE_ACTION_NONE);
- break;
- case IDC_DEV_TOOLS_CONSOLE:
- chrome::ToggleDevToolsWindow(this, DEVTOOLS_TOGGLE_ACTION_SHOW_CONSOLE);
- break;
- case IDC_DEV_TOOLS_INSPECT:
- chrome::ToggleDevToolsWindow(this, DEVTOOLS_TOGGLE_ACTION_INSPECT);
- break;
- case IDC_TASK_MANAGER:
- chrome::OpenTaskManager(this, false);
- break;
- case IDC_VIEW_BACKGROUND_PAGES:
- chrome::OpenTaskManager(this, true);
- break;
- case IDC_FEEDBACK:
- chrome::OpenFeedbackDialog(this);
- break;
-
- case IDC_SHOW_BOOKMARK_BAR: chrome::ToggleBookmarkBar(this); break;
- case IDC_PROFILING_ENABLED: Profiling::Toggle(); break;
-
- case IDC_SHOW_BOOKMARK_MANAGER: chrome::ShowBookmarkManager(this);break;
- case IDC_SHOW_APP_MENU: chrome::ShowAppMenu(this); break;
- case IDC_SHOW_AVATAR_MENU: chrome::ShowAvatarMenu(this); break;
- case IDC_SHOW_HISTORY: chrome::ShowHistory(this); break;
- case IDC_SHOW_DOWNLOADS: chrome::ShowDownloads(this); break;
- case IDC_MANAGE_EXTENSIONS: chrome::ShowExtensions(this); break;
- case IDC_OPTIONS: chrome::ShowSettings(this); break;
- case IDC_EDIT_SEARCH_ENGINES:
- chrome::ShowSearchEngineSettings(this);
- break;
- case IDC_VIEW_PASSWORDS: chrome::ShowPasswordManager(this);break;
- case IDC_CLEAR_BROWSING_DATA:
- chrome::ShowClearBrowsingDataDialog(this);
- break;
- case IDC_IMPORT_SETTINGS: chrome::ShowImportDialog(this); break;
- case IDC_ABOUT: chrome::ShowAboutChrome(this); break;
- case IDC_UPGRADE_DIALOG:
- chrome::OpenUpdateChromeDialog(this);
- break;
- case IDC_VIEW_INCOMPATIBILITIES:
- chrome::ShowConflicts(this);
- break;
- case IDC_HELP_PAGE_VIA_KEYBOARD:
- chrome::ShowHelp(this, chrome::HELP_SOURCE_KEYBOARD);
- break;
- case IDC_HELP_PAGE_VIA_MENU:
- chrome::ShowHelp(this, chrome::HELP_SOURCE_MENU);
- break;
- case IDC_SHOW_SYNC_SETUP:
- chrome::ShowSyncSetup(this, SyncPromoUI::SOURCE_MENU);
- break;
- case IDC_TOGGLE_SPEECH_INPUT: chrome::ToggleSpeechInput(this); break;
-
- default:
- LOG(WARNING) << "Received Unimplemented Command: " << id;
- break;
- }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// Browser, TabRestoreServiceObserver:
-
-void Browser::TabRestoreServiceChanged(TabRestoreService* service) {
- command_updater_.UpdateCommandEnabled(IDC_RESTORE_TAB,
- !service->entries().empty());
-}
-
-void Browser::TabRestoreServiceDestroyed(TabRestoreService* service) {
- if (!tab_restore_service_)
- return;
-
- DCHECK_EQ(tab_restore_service_, service);
- tab_restore_service_->RemoveObserver(this);
- tab_restore_service_ = NULL;
-}
-
// Centralized method for creating a TabContents, configuring and
// installing all its supporting objects and observers.
TabContents* Browser::TabContentsFactory(
@@ -1716,28 +1340,19 @@ bool Browser::RunUnloadListenerBeforeClosing(TabContents* contents) {
}
bool Browser::CanBookmarkAllTabs() const {
- BookmarkModel* model = profile()->GetBookmarkModel();
- return (model && model->IsLoaded()) &&
- tab_count() > 1 &&
- profile()->GetPrefs()->GetBoolean(prefs::kEditBookmarksEnabled);
+ return chrome::CanBookmarkAllTabs(this);
}
void Browser::BookmarkAllTabs() {
- BookmarkEditor::ShowBookmarkAllTabsDialog(this);
+ chrome::BookmarkAllTabs(this);
}
bool Browser::CanRestoreTab() {
- return command_updater_.IsCommandEnabled(IDC_RESTORE_TAB);
+ return chrome::CanRestoreTab(this);
}
void Browser::RestoreTab() {
- content::RecordAction(UserMetricsAction("RestoreTab"));
- TabRestoreService* service =
- TabRestoreServiceFactory::GetForProfile(profile_);
- if (!service)
- return;
-
- service->RestoreMostRecentEntry(tab_restore_service_delegate());
+ chrome::RestoreTab(this);
}
///////////////////////////////////////////////////////////////////////////////
@@ -1837,10 +1452,11 @@ void Browser::ActiveTabChanged(TabContents* old_contents,
UpdateSearchState(new_contents);
// Update reload/stop state.
- UpdateReloadStopState(new_contents->web_contents()->IsLoading(), true);
+ command_controller_->LoadingStateChanged(
+ new_contents->web_contents()->IsLoading(), true);
// Update commands to reflect current state.
- UpdateCommandsForTabState();
+ command_controller_->TabStateChanged();
// Reset the status bubble.
StatusBubble* status_bubble = GetStatusBubble();
@@ -2048,7 +1664,7 @@ void Browser::NavigationStateChanged(const WebContents* source,
// actions in the face of slow-to-commit pages.
if (changed_flags & (content::INVALIDATE_TYPE_URL |
content::INVALIDATE_TYPE_LOAD))
- UpdateCommandsForTabState();
+ command_controller_->TabStateChanged();
}
void Browser::AddNewContents(WebContents* source,
@@ -2123,7 +1739,7 @@ void Browser::LoadingStateChanged(WebContents* source) {
WebContents* selected_contents = GetActiveWebContents();
if (source == selected_contents) {
bool is_loading = source->IsLoading();
- UpdateReloadStopState(is_loading, false);
+ command_controller_->LoadingStateChanged(is_loading, false);
if (GetStatusBubble()) {
GetStatusBubble()->SetStatus(
GetActiveTabContents()->core_tab_helper()->GetStatusText());
@@ -2207,7 +1823,7 @@ void Browser::ContentsMouseEvent(
}
void Browser::ContentsZoomChange(bool zoom_in) {
- ExecuteCommand(zoom_in ? IDC_ZOOM_PLUS : IDC_ZOOM_MINUS);
+ chrome::ExecuteCommand(this, zoom_in ? IDC_ZOOM_PLUS : IDC_ZOOM_MINUS);
}
void Browser::WebContentsFocused(WebContents* contents) {
@@ -2405,7 +2021,7 @@ void Browser::WebContentsCreated(WebContents* source_contents,
}
void Browser::ContentRestrictionsChanged(WebContents* source) {
- UpdateCommandsForContentRestrictionState();
+ command_controller_->ContentRestrictionsChanged();
}
void Browser::RendererUnresponsive(WebContents* source) {
@@ -2614,11 +2230,11 @@ void Browser::SwapTabContents(TabContents* old_tab_contents,
}
bool Browser::CanReloadContents(TabContents* source) const {
- return !is_devtools();
+ return chrome::CanReload(this);
}
bool Browser::CanSaveContents(TabContents* source) const {
- return !is_devtools();
+ return chrome::CanSavePage(this);
}
///////////////////////////////////////////////////////////////////////////////
@@ -2639,7 +2255,7 @@ void Browser::SetTabContentBlocked(TabContents* tab_contents, bool blocked) {
return;
}
tab_strip_model_->SetTabBlocked(index, blocked);
- UpdatePrintingState(tab_contents->web_contents()->GetContentRestrictions());
+ command_controller_->PrintingStateChanged();
if (!blocked && GetActiveTabContents() == tab_contents)
tab_contents->web_contents()->Focus();
}
@@ -2827,9 +2443,7 @@ void Browser::Observe(int type,
case chrome::NOTIFICATION_PREF_CHANGED: {
const std::string& pref_name =
*content::Details<std::string>(details).ptr();
- if (pref_name == prefs::kPrintingEnabled) {
- UpdatePrintingState(GetContentRestrictionsForSelectedTab());
- } else if (pref_name == prefs::kInstantEnabled) {
+ if (pref_name == prefs::kInstantEnabled) {
if (browser_shutdown::ShuttingDownWithoutClosingBrowsers() ||
!InstantController::IsEnabled(profile())) {
if (instant()) {
@@ -2840,25 +2454,14 @@ void Browser::Observe(int type,
} else {
CreateInstantIfNecessary();
}
- } else if (pref_name == prefs::kIncognitoModeAvailability) {
- UpdateCommandsForIncognitoAvailability();
} else if (pref_name == prefs::kDevToolsDisabled) {
- UpdateCommandsForDevTools();
if (profile_->GetPrefs()->GetBoolean(prefs::kDevToolsDisabled))
content::DevToolsManager::GetInstance()->CloseAllClientHosts();
- } else if (pref_name == prefs::kEditBookmarksEnabled) {
- UpdateCommandsForBookmarkEditing();
} else if (pref_name == prefs::kShowBookmarkBar) {
- UpdateCommandsForBookmarkBar();
UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_PREF_CHANGE);
} else if (pref_name == prefs::kHomePage) {
PrefService* pref_service = content::Source<PrefService>(source).ptr();
MarkHomePageAsChanged(pref_service);
- } else if (pref_name == prefs::kAllowFileSelectionDialogs) {
- UpdateSaveAsState(GetContentRestrictionsForSelectedTab());
- UpdateOpenFileState();
- } else if (pref_name == prefs::kInManagedMode) {
- UpdateCommandsForMultipleProfiles();
} else {
NOTREACHED();
}
@@ -2877,12 +2480,10 @@ void Browser::Observe(int type,
case content::NOTIFICATION_INTERSTITIAL_ATTACHED:
UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_TAB_STATE);
- UpdateCommandsForTabState();
break;
case content::NOTIFICATION_INTERSTITIAL_DETACHED:
UpdateBookmarkBarState(BOOKMARK_BAR_STATE_CHANGE_TAB_STATE);
- UpdateCommandsForTabState();
break;
default:
@@ -2891,20 +2492,6 @@ void Browser::Observe(int type,
}
///////////////////////////////////////////////////////////////////////////////
-// Browser, ProfileSyncServiceObserver implementation:
-
-void Browser::OnStateChanged() {
- DCHECK(ProfileSyncServiceFactory::GetInstance()->HasProfileSyncService(
- profile_));
- // For unit tests, we don't have a window.
- if (!window_)
- return;
- const bool show_main_ui = IsShowingMainUI(window_->IsFullscreen());
- command_updater_.UpdateCommandEnabled(IDC_SHOW_SYNC_SETUP,
- show_main_ui && profile_->GetOriginalProfile()->IsSyncAccessible());
-}
-
-///////////////////////////////////////////////////////////////////////////////
// Browser, InstantDelegate implementation:
void Browser::ShowInstant(TabContents* preview_contents) {
@@ -2963,418 +2550,10 @@ TabContents* Browser::GetInstantHostTabContents() const {
///////////////////////////////////////////////////////////////////////////////
// Browser, Command and state updating (private):
-bool Browser::IsShowingMainUI(bool is_fullscreen) {
-#if !defined(OS_MACOSX)
- return is_type_tabbed() && !is_fullscreen;
-#else
- return is_type_tabbed();
-#endif
-}
-
-void Browser::InitCommandState() {
- // All browser commands whose state isn't set automagically some other way
- // (like Back & Forward with initial page load) must have their state
- // initialized here, otherwise they will be forever disabled.
-
- // Navigation commands
- command_updater_.UpdateCommandEnabled(IDC_RELOAD, true);
- command_updater_.UpdateCommandEnabled(IDC_RELOAD_IGNORING_CACHE, true);
-
- // Window management commands
- command_updater_.UpdateCommandEnabled(IDC_CLOSE_WINDOW, true);
- command_updater_.UpdateCommandEnabled(IDC_NEW_TAB, true);
- command_updater_.UpdateCommandEnabled(IDC_CLOSE_TAB, true);
- command_updater_.UpdateCommandEnabled(IDC_DUPLICATE_TAB, true);
- command_updater_.UpdateCommandEnabled(IDC_RESTORE_TAB, false);
- command_updater_.UpdateCommandEnabled(IDC_EXIT, true);
- command_updater_.UpdateCommandEnabled(IDC_DEBUG_FRAME_TOGGLE, true);
-
- // Page-related commands
- command_updater_.UpdateCommandEnabled(IDC_EMAIL_PAGE_LOCATION, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_AUTO_DETECT, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_UTF8, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_UTF16LE, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO88591, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_WINDOWS1252, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_GBK, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_GB18030, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_BIG5HKSCS, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_BIG5, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_THAI, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_KOREAN, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_SHIFTJIS, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO2022JP, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_EUCJP, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO885915, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_MACINTOSH, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO88592, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_WINDOWS1250, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO88595, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_WINDOWS1251, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_KOI8R, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_KOI8U, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO88597, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_WINDOWS1253, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO88594, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO885913, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_WINDOWS1257, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO88593, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO885910, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO885914, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO885916, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_WINDOWS1254, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO88596, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_WINDOWS1256, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO88598, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO88598I, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_WINDOWS1255, true);
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_WINDOWS1258, true);
-
- // Zoom
- command_updater_.UpdateCommandEnabled(IDC_ZOOM_MENU, true);
- command_updater_.UpdateCommandEnabled(IDC_ZOOM_PLUS, true);
- command_updater_.UpdateCommandEnabled(IDC_ZOOM_NORMAL, true);
- command_updater_.UpdateCommandEnabled(IDC_ZOOM_MINUS, true);
-
- // Show various bits of UI
- UpdateOpenFileState();
- command_updater_.UpdateCommandEnabled(IDC_CREATE_SHORTCUTS, false);
- UpdateCommandsForDevTools();
- command_updater_.UpdateCommandEnabled(IDC_TASK_MANAGER,
- chrome::CanOpenTaskManager());
- command_updater_.UpdateCommandEnabled(IDC_SHOW_HISTORY, true);
- command_updater_.UpdateCommandEnabled(IDC_SHOW_DOWNLOADS, true);
- command_updater_.UpdateCommandEnabled(IDC_HELP_PAGE_VIA_KEYBOARD, true);
- command_updater_.UpdateCommandEnabled(IDC_HELP_PAGE_VIA_MENU, true);
- command_updater_.UpdateCommandEnabled(IDC_BOOKMARKS_MENU, true);
-
- command_updater_.UpdateCommandEnabled(
- IDC_SHOW_SYNC_SETUP, profile_->GetOriginalProfile()->IsSyncAccessible());
-
- // Initialize other commands based on the window type.
- bool normal_window = is_type_tabbed();
-
- // Navigation commands
- command_updater_.UpdateCommandEnabled(IDC_HOME, normal_window);
-
- // Window management commands
- // TODO(rohitrao): Disable fullscreen on non-Lion?
- command_updater_.UpdateCommandEnabled(IDC_FULLSCREEN,
- !(is_type_panel() && is_app()));
- command_updater_.UpdateCommandEnabled(IDC_SELECT_NEXT_TAB, normal_window);
- command_updater_.UpdateCommandEnabled(IDC_SELECT_PREVIOUS_TAB,
- normal_window);
- command_updater_.UpdateCommandEnabled(IDC_MOVE_TAB_NEXT, normal_window);
- command_updater_.UpdateCommandEnabled(IDC_MOVE_TAB_PREVIOUS, normal_window);
- command_updater_.UpdateCommandEnabled(IDC_SELECT_TAB_0, normal_window);
- command_updater_.UpdateCommandEnabled(IDC_SELECT_TAB_1, normal_window);
- command_updater_.UpdateCommandEnabled(IDC_SELECT_TAB_2, normal_window);
- command_updater_.UpdateCommandEnabled(IDC_SELECT_TAB_3, normal_window);
- command_updater_.UpdateCommandEnabled(IDC_SELECT_TAB_4, normal_window);
- command_updater_.UpdateCommandEnabled(IDC_SELECT_TAB_5, normal_window);
- command_updater_.UpdateCommandEnabled(IDC_SELECT_TAB_6, normal_window);
- command_updater_.UpdateCommandEnabled(IDC_SELECT_TAB_7, normal_window);
- command_updater_.UpdateCommandEnabled(IDC_SELECT_LAST_TAB, normal_window);
-#if defined(OS_WIN)
- const bool metro_mode = base::win::IsMetroProcess();
- command_updater_.UpdateCommandEnabled(IDC_METRO_SNAP_ENABLE, metro_mode);
- command_updater_.UpdateCommandEnabled(IDC_METRO_SNAP_DISABLE, metro_mode);
-#endif
-#if defined(OS_MACOSX)
- command_updater_.UpdateCommandEnabled(IDC_TABPOSE, normal_window);
- command_updater_.UpdateCommandEnabled(IDC_PRESENTATION_MODE,
- !(is_type_panel() && is_app()));
-#endif
-
- // Clipboard commands
- command_updater_.UpdateCommandEnabled(IDC_COPY_URL, !is_devtools());
-
- // Find-in-page
- command_updater_.UpdateCommandEnabled(IDC_FIND, !is_devtools());
- command_updater_.UpdateCommandEnabled(IDC_FIND_NEXT, !is_devtools());
- command_updater_.UpdateCommandEnabled(IDC_FIND_PREVIOUS, !is_devtools());
-
- // Show various bits of UI
- command_updater_.UpdateCommandEnabled(IDC_CLEAR_BROWSING_DATA, normal_window);
-
- // The upgrade entry and the view incompatibility entry should always be
- // enabled. Whether they are visible is a separate matter determined on menu
- // show.
- command_updater_.UpdateCommandEnabled(IDC_UPGRADE_DIALOG, true);
- command_updater_.UpdateCommandEnabled(IDC_VIEW_INCOMPATIBILITIES, true);
-
- // View Background Pages entry is always enabled, but is hidden if there are
- // no background pages.
- command_updater_.UpdateCommandEnabled(IDC_VIEW_BACKGROUND_PAGES, true);
-
- // Toggle speech input
- command_updater_.UpdateCommandEnabled(IDC_TOGGLE_SPEECH_INPUT, true);
-
- // Initialize other commands whose state changes based on fullscreen mode.
- UpdateCommandsForFullscreenMode(FULLSCREEN_DISABLED);
-
- UpdateCommandsForContentRestrictionState();
-
- UpdateCommandsForBookmarkEditing();
-
- UpdateCommandsForIncognitoAvailability();
-}
-
-void Browser::UpdateCommandsForIncognitoAvailability() {
- IncognitoModePrefs::Availability incognito_availability =
- IncognitoModePrefs::GetAvailability(profile_->GetPrefs());
- command_updater_.UpdateCommandEnabled(
- IDC_NEW_WINDOW,
- incognito_availability != IncognitoModePrefs::FORCED);
- command_updater_.UpdateCommandEnabled(
- IDC_NEW_INCOGNITO_WINDOW,
- incognito_availability != IncognitoModePrefs::DISABLED);
-
- // Bookmark manager and settings page/subpages are forced to open in normal
- // mode. For this reason we disable these commands when incognito is forced.
- const bool command_enabled =
- incognito_availability != IncognitoModePrefs::FORCED;
- command_updater_.UpdateCommandEnabled(
- IDC_SHOW_BOOKMARK_MANAGER,
- browser_defaults::bookmarks_enabled && command_enabled);
- ExtensionService* extension_service = profile()->GetExtensionService();
- bool enable_extensions =
- extension_service && extension_service->extensions_enabled();
- command_updater_.UpdateCommandEnabled(IDC_MANAGE_EXTENSIONS,
- enable_extensions && command_enabled);
-
- const bool show_main_ui = IsShowingMainUI(window_ && window_->IsFullscreen());
- command_updater_.UpdateCommandEnabled(IDC_IMPORT_SETTINGS,
- show_main_ui && command_enabled);
- command_updater_.UpdateCommandEnabled(IDC_OPTIONS,
- show_main_ui && command_enabled);
-}
-
-void Browser::UpdateCommandsForTabState() {
- TabContents* current_tab_contents = GetActiveTabContents();
- if (!current_tab_contents) // May be NULL during tab restore.
- return;
- WebContents* current_web_contents = current_tab_contents->web_contents();
-
- // Navigation commands
- NavigationController& nc = current_web_contents->GetController();
- command_updater_.UpdateCommandEnabled(IDC_BACK, nc.CanGoBack());
- command_updater_.UpdateCommandEnabled(IDC_FORWARD, nc.CanGoForward());
- command_updater_.UpdateCommandEnabled(
- IDC_RELOAD, CanReloadContents(current_tab_contents));
- command_updater_.UpdateCommandEnabled(
- IDC_RELOAD_IGNORING_CACHE, CanReloadContents(current_tab_contents));
-
- // Window management commands
- command_updater_.UpdateCommandEnabled(IDC_DUPLICATE_TAB,
- !is_app() && CanDuplicateContentsAt(active_index()));
-
- // Page-related commands
- window_->SetStarredState(
- current_tab_contents->bookmark_tab_helper()->is_starred());
- window_->SetZoomIconState(
- current_tab_contents->zoom_controller()->zoom_icon_state());
- window_->SetZoomIconTooltipPercent(
- current_tab_contents->zoom_controller()->zoom_percent());
- command_updater_.UpdateCommandEnabled(IDC_VIEW_SOURCE,
- current_web_contents->GetController().CanViewSource());
- command_updater_.UpdateCommandEnabled(IDC_EMAIL_PAGE_LOCATION,
- toolbar_model_->ShouldDisplayURL() &&
- current_web_contents->GetURL().is_valid());
- if (is_devtools())
- command_updater_.UpdateCommandEnabled(IDC_OPEN_FILE, false);
-
- // Changing the encoding is not possible on Chrome-internal webpages.
- bool is_chrome_internal = HasInternalURL(nc.GetActiveEntry()) ||
- current_web_contents->ShowingInterstitialPage();
- command_updater_.UpdateCommandEnabled(IDC_ENCODING_MENU,
- !is_chrome_internal && current_web_contents->IsSavable());
-
- // Show various bits of UI
- // TODO(pinkerton): Disable app-mode in the model until we implement it
- // on the Mac. Be sure to remove both ifdefs. http://crbug.com/13148
-#if !defined(OS_MACOSX)
- command_updater_.UpdateCommandEnabled(IDC_CREATE_SHORTCUTS,
- web_app::IsValidUrl(current_web_contents->GetURL()));
-#endif
-
- UpdateCommandsForContentRestrictionState();
- UpdateCommandsForBookmarkEditing();
-}
-
-void Browser::UpdateCommandsForContentRestrictionState() {
- int restrictions = GetContentRestrictionsForSelectedTab();
-
- command_updater_.UpdateCommandEnabled(
- IDC_COPY, !(restrictions & content::CONTENT_RESTRICTION_COPY));
- command_updater_.UpdateCommandEnabled(
- IDC_CUT, !(restrictions & content::CONTENT_RESTRICTION_CUT));
- command_updater_.UpdateCommandEnabled(
- IDC_PASTE, !(restrictions & content::CONTENT_RESTRICTION_PASTE));
- UpdateSaveAsState(restrictions);
- UpdatePrintingState(restrictions);
-}
-
-void Browser::UpdateCommandsForDevTools() {
- bool dev_tools_enabled =
- !profile_->GetPrefs()->GetBoolean(prefs::kDevToolsDisabled);
- command_updater_.UpdateCommandEnabled(IDC_DEV_TOOLS,
- dev_tools_enabled);
- command_updater_.UpdateCommandEnabled(IDC_DEV_TOOLS_CONSOLE,
- dev_tools_enabled);
- command_updater_.UpdateCommandEnabled(IDC_DEV_TOOLS_INSPECT,
- dev_tools_enabled);
-}
-
-void Browser::UpdateCommandsForBookmarkEditing() {
- bool enabled =
- profile_->GetPrefs()->GetBoolean(prefs::kEditBookmarksEnabled) &&
- browser_defaults::bookmarks_enabled;
-
- command_updater_.UpdateCommandEnabled(IDC_BOOKMARK_PAGE,
- enabled && is_type_tabbed());
- command_updater_.UpdateCommandEnabled(IDC_BOOKMARK_ALL_TABS,
- enabled && CanBookmarkAllTabs());
- command_updater_.UpdateCommandEnabled(IDC_PIN_TO_START_SCREEN,
- true);
-}
-
-void Browser::UpdateCommandsForBookmarkBar() {
- const bool show_main_ui = IsShowingMainUI(window_ && window_->IsFullscreen());
- command_updater_.UpdateCommandEnabled(IDC_SHOW_BOOKMARK_BAR,
- browser_defaults::bookmarks_enabled &&
- !profile_->GetPrefs()->IsManagedPreference(prefs::kShowBookmarkBar) &&
- show_main_ui);
-}
-
void Browser::MarkHomePageAsChanged(PrefService* pref_service) {
pref_service->SetBoolean(prefs::kHomePageChanged, true);
}
-void Browser::UpdateCommandsForFullscreenMode(FullScreenMode fullscreen_mode) {
- const bool show_main_ui =
- IsShowingMainUI(fullscreen_mode != FULLSCREEN_DISABLED);
- bool main_not_fullscreen = show_main_ui &&
- (fullscreen_mode == FULLSCREEN_DISABLED);
-
- // Navigation commands
- command_updater_.UpdateCommandEnabled(IDC_OPEN_CURRENT_URL, show_main_ui);
-
- // Window management commands
- command_updater_.UpdateCommandEnabled(IDC_SHOW_AS_TAB,
- type_ != TYPE_TABBED && (fullscreen_mode == FULLSCREEN_DISABLED));
-
- // Focus various bits of UI
- command_updater_.UpdateCommandEnabled(IDC_FOCUS_TOOLBAR, show_main_ui);
- command_updater_.UpdateCommandEnabled(IDC_FOCUS_LOCATION, show_main_ui);
- command_updater_.UpdateCommandEnabled(IDC_FOCUS_SEARCH, show_main_ui);
- command_updater_.UpdateCommandEnabled(
- IDC_FOCUS_MENU_BAR, main_not_fullscreen);
- command_updater_.UpdateCommandEnabled(
- IDC_FOCUS_NEXT_PANE, main_not_fullscreen);
- command_updater_.UpdateCommandEnabled(
- IDC_FOCUS_PREVIOUS_PANE, main_not_fullscreen);
- command_updater_.UpdateCommandEnabled(
- IDC_FOCUS_BOOKMARKS, main_not_fullscreen);
-
- // Show various bits of UI
- command_updater_.UpdateCommandEnabled(IDC_DEVELOPER_MENU, show_main_ui);
- command_updater_.UpdateCommandEnabled(IDC_FEEDBACK, show_main_ui);
- command_updater_.UpdateCommandEnabled(IDC_SHOW_SYNC_SETUP,
- show_main_ui && profile_->GetOriginalProfile()->IsSyncAccessible());
-
- // Settings page/subpages are forced to open in normal mode. We disable these
- // commands when incognito is forced.
- const bool options_enabled = show_main_ui &&
- IncognitoModePrefs::GetAvailability(
- profile_->GetPrefs()) != IncognitoModePrefs::FORCED;
- command_updater_.UpdateCommandEnabled(IDC_OPTIONS, options_enabled);
- command_updater_.UpdateCommandEnabled(IDC_IMPORT_SETTINGS, options_enabled);
-
- command_updater_.UpdateCommandEnabled(IDC_EDIT_SEARCH_ENGINES, show_main_ui);
- command_updater_.UpdateCommandEnabled(IDC_VIEW_PASSWORDS, show_main_ui);
- command_updater_.UpdateCommandEnabled(IDC_ABOUT, show_main_ui);
- command_updater_.UpdateCommandEnabled(IDC_SHOW_APP_MENU, show_main_ui);
-#if defined (ENABLE_PROFILING) && !defined(NO_TCMALLOC)
- command_updater_.UpdateCommandEnabled(IDC_PROFILING_ENABLED, show_main_ui);
-#endif
-
- // Disable explicit fullscreen toggling when in metro snap mode.
- command_updater_.UpdateCommandEnabled(
- IDC_FULLSCREEN,
- fullscreen_mode != FULLSCREEN_METRO_SNAP);
-
- UpdateCommandsForBookmarkBar();
- UpdateCommandsForMultipleProfiles();
-}
-
-void Browser::UpdateCommandsForMultipleProfiles() {
- bool show_main_ui = IsShowingMainUI(window_ && window_->IsFullscreen());
- command_updater_.UpdateCommandEnabled(IDC_SHOW_AVATAR_MENU,
- show_main_ui &&
- !profile()->IsOffTheRecord() &&
- ProfileManager::IsMultipleProfilesEnabled());
-}
-
-void Browser::UpdatePrintingState(int content_restrictions) {
- bool print_enabled = true;
- bool advanced_print_enabled = true;
- if (g_browser_process->local_state()) {
- print_enabled =
- g_browser_process->local_state()->GetBoolean(prefs::kPrintingEnabled);
- advanced_print_enabled = print_enabled;
- }
- if (print_enabled) {
- // Do not print when a constrained window is showing. It's confusing.
- TabContents* tab_contents = GetActiveTabContents();
- bool has_constrained_window =
- tab_contents &&
- tab_contents->constrained_window_tab_helper()->
- constrained_window_count();
- if (has_constrained_window ||
- content_restrictions & content::CONTENT_RESTRICTION_PRINT) {
- print_enabled = false;
- advanced_print_enabled = false;
- }
-
- // The exception is print preview,
- // where advanced printing is always enabled.
- printing::PrintPreviewTabController* controller =
- printing::PrintPreviewTabController::GetInstance();
- if (controller && (controller->GetPrintPreviewForTab(tab_contents) ||
- controller->is_creating_print_preview_tab())) {
- advanced_print_enabled = true;
- }
- }
- command_updater_.UpdateCommandEnabled(IDC_PRINT, print_enabled);
- command_updater_.UpdateCommandEnabled(IDC_ADVANCED_PRINT,
- advanced_print_enabled);
-}
-
-void Browser::UpdateSaveAsState(int content_restrictions) {
- bool enabled = !(content_restrictions & content::CONTENT_RESTRICTION_SAVE);
- enabled = enabled && CanSaveContents(GetActiveTabContents());
- PrefService* state = g_browser_process->local_state();
- if (state)
- enabled = enabled && state->GetBoolean(prefs::kAllowFileSelectionDialogs);
-
- command_updater_.UpdateCommandEnabled(IDC_SAVE_PAGE, enabled);
-}
-
-void Browser::UpdateOpenFileState() {
- bool enabled = true;
- PrefService* local_state = g_browser_process->local_state();
- if (local_state)
- enabled = local_state->GetBoolean(prefs::kAllowFileSelectionDialogs);
-
- command_updater_.UpdateCommandEnabled(IDC_OPEN_FILE, enabled);
-}
-
-void Browser::UpdateReloadStopState(bool is_loading, bool force) {
- window_->UpdateReloadStopState(is_loading, force);
- command_updater_.UpdateCommandEnabled(IDC_STOP, is_loading);
-}
-
///////////////////////////////////////////////////////////////////////////////
// Browser, UI update coalescing and handling (private):
@@ -3483,12 +2662,6 @@ void Browser::ProcessPendingUIUpdates() {
if (flags & (content::INVALIDATE_TYPE_TAB |
content::INVALIDATE_TYPE_TITLE)) {
-// TODO(pinkerton): Disable app-mode in the model until we implement it
-// on the Mac. Be sure to remove both ifdefs. http://crbug.com/13148
-#if !defined(OS_MACOSX)
- command_updater_.UpdateCommandEnabled(IDC_CREATE_SHORTCUTS,
- web_app::IsValidUrl(contents->GetURL()));
-#endif
window_->UpdateTitleBar();
}
}
@@ -3771,24 +2944,6 @@ void Browser::CreateInstantIfNecessary() {
}
}
-int Browser::GetContentRestrictionsForSelectedTab() {
- int content_restrictions = 0;
- WebContents* current_tab = GetActiveWebContents();
- if (current_tab) {
- content_restrictions = current_tab->GetContentRestrictions();
- NavigationEntry* active_entry =
- current_tab->GetController().GetActiveEntry();
- // See comment in UpdateCommandsForTabState about why we call url().
- if (!download_util::IsSavableURL(
- active_entry ? active_entry->GetURL() : GURL())
- || current_tab->ShowingInterstitialPage())
- content_restrictions |= content::CONTENT_RESTRICTION_SAVE;
- if (current_tab->ShowingInterstitialPage())
- content_restrictions |= content::CONTENT_RESTRICTION_PRINT;
- }
- return content_restrictions;
-}
-
void Browser::UpdateBookmarkBarState(BookmarkBarStateChangeReason reason) {
BookmarkBar::State state;
// The bookmark bar is hidden in fullscreen mode, unless on the new tab page.
diff --git a/chrome/browser/ui/browser.h b/chrome/browser/ui/browser.h
index a067765..3ea48c5 100644
--- a/chrome/browser/ui/browser.h
+++ b/chrome/browser/ui/browser.h
@@ -17,7 +17,6 @@
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/string16.h"
-#include "chrome/browser/command_updater.h"
#include "chrome/browser/debugger/devtools_toggle_action.h"
#include "chrome/browser/event_disposition.h"
#include "chrome/browser/extensions/extension_tab_helper_delegate.h"
@@ -26,8 +25,6 @@
#include "chrome/browser/prefs/pref_change_registrar.h"
#include "chrome/browser/prefs/pref_member.h"
#include "chrome/browser/sessions/session_id.h"
-#include "chrome/browser/sessions/tab_restore_service_observer.h"
-#include "chrome/browser/sync/profile_sync_service_observer.h"
#include "chrome/browser/ui/blocked_content/blocked_content_tab_helper_delegate.h"
#include "chrome/browser/ui/bookmarks/bookmark_bar.h"
#include "chrome/browser/ui/bookmarks/bookmark_tab_helper_delegate.h"
@@ -71,6 +68,7 @@ class TabStripModel;
struct WebApplicationInfo;
namespace chrome {
+class BrowserCommandController;
namespace search {
class SearchDelegate;
class SearchModel;
@@ -109,11 +107,8 @@ class Browser : public TabStripModelDelegate,
public ZoomObserver,
public ExtensionTabHelperDelegate,
public content::PageNavigator,
- public CommandUpdater::CommandUpdaterDelegate,
public content::NotificationObserver,
public SelectFileDialog::Listener,
- public TabRestoreServiceObserver,
- public ProfileSyncServiceObserver,
public InstantDelegate {
public:
// SessionService::WindowType mirrors these values. If you add to this
@@ -272,10 +267,12 @@ class Browser : public TabStripModelDelegate,
// is done.
BrowserWindow* window() const { return window_; }
ToolbarModel* toolbar_model() { return toolbar_model_.get(); }
+ const ToolbarModel* toolbar_model() const { return toolbar_model_.get(); }
+ chrome::BrowserCommandController* command_controller() {
+ return command_controller_.get();
+ }
chrome::search::SearchModel* search_model() { return search_model_.get(); }
const SessionID& session_id() const { return session_id_; }
- CommandUpdater* command_updater() { return &command_updater_; }
- bool block_command_execution() const { return block_command_execution_; }
BrowserContentSettingBubbleModelDelegate*
content_setting_bubble_model_delegate() {
return content_setting_bubble_model_delegate_.get();
@@ -502,34 +499,6 @@ class Browser : public TabStripModelDelegate,
int active_match_ordinal,
bool final_update);
- // Calls ExecuteCommandWithDisposition with CURRENT_TAB disposition.
- void ExecuteCommand(int id);
-
- // Calls ExecuteCommandWithDisposition with the given event flags.
- void ExecuteCommand(int id, int event_flags);
-
- // Executes a command if it's enabled.
- // Returns true if the command is executed.
- bool ExecuteCommandIfEnabled(int id);
-
- // Returns true if |command_id| is a reserved command whose keyboard shortcuts
- // should not be sent to the renderer or |event| was triggered by a key that
- // we never want to send to the renderer.
- bool IsReservedCommandOrKey(int command_id,
- const content::NativeWebKeyboardEvent& event);
-
- // Sets if command execution shall be blocked. If |block| is true then
- // following calls to ExecuteCommand() or ExecuteCommandWithDisposition()
- // method will not execute the command, and the last blocked command will be
- // recorded for retrieval.
- void SetBlockCommandExecution(bool block);
-
- // Gets the last blocked command after calling SetBlockCommandExecution(true).
- // Returns the command id or -1 if there is no command blocked. The
- // disposition type of the command will be stored in |*disposition| if it's
- // not null.
- int GetLastBlockedCommand(WindowOpenDisposition* disposition);
-
// Called by browser::Navigate() when a navigation has occurred in a tab in
// this Browser. Updates the UI for the start of this navigation.
void UpdateUIForNavigationInTab(TabContents* contents,
@@ -542,15 +511,6 @@ class Browser : public TabStripModelDelegate,
virtual content::WebContents* OpenURL(
const content::OpenURLParams& params) OVERRIDE;
- // Overridden from CommandUpdater::CommandUpdaterDelegate:
- virtual void ExecuteCommandWithDisposition(
- int id,
- WindowOpenDisposition disposition) OVERRIDE;
-
- // Overridden from TabRestoreServiceObserver:
- virtual void TabRestoreServiceChanged(TabRestoreService* service) OVERRIDE;
- virtual void TabRestoreServiceDestroyed(TabRestoreService* service) OVERRIDE;
-
// Centralized method for creating a TabContents, configuring and
// installing all its supporting objects and observers.
static TabContents* TabContentsFactory(
@@ -710,18 +670,6 @@ class Browser : public TabStripModelDelegate,
BOOKMARK_BAR_STATE_CHANGE_TOGGLE_FULLSCREEN,
};
- enum FullScreenMode {
- // Not in fullscreen mode.
- FULLSCREEN_DISABLED,
-
- // Fullscreen mode, occupying the whole screen.
- FULLSCREEN_NORMAL,
-
- // Fullscreen mode for metro snap, occupying the full height and 20% of
- // the screen width.
- FULLSCREEN_METRO_SNAP,
- };
-
// Overridden from content::WebContentsDelegate:
virtual content::WebContents* OpenURLFromTab(
content::WebContents* source,
@@ -887,9 +835,6 @@ class Browser : public TabStripModelDelegate,
const content::NotificationSource& source,
const content::NotificationDetails& details) OVERRIDE;
- // Overridden from ProfileSyncServiceObserver:
- virtual void OnStateChanged() OVERRIDE;
-
// Overriden from InstantDelegate:
virtual void ShowInstant(TabContents* preview_contents) OVERRIDE;
virtual void HideInstant() OVERRIDE;
@@ -902,58 +847,9 @@ class Browser : public TabStripModelDelegate,
// Command and state updating ///////////////////////////////////////////////
- // Returns true if the regular Chrome UI (not the fullscreen one and
- // not the single-tab one) is shown. Used for updating window command states
- // only. Consider using SupportsWindowFeature if you need the mentioned
- // functionality anywhere else.
- bool IsShowingMainUI(bool is_fullscreen);
-
- // Initialize state for all browser commands.
- void InitCommandState();
-
- // Update commands whose state depends on incognito mode availability.
- void UpdateCommandsForIncognitoAvailability();
-
- // Update commands whose state depends on the tab's state.
- void UpdateCommandsForTabState();
-
- // Updates commands when the content's restrictions change.
- void UpdateCommandsForContentRestrictionState();
-
- // Updates commands for enabling developer tools.
- void UpdateCommandsForDevTools();
-
- // Updates commands for bookmark editing.
- void UpdateCommandsForBookmarkEditing();
-
- // Updates commands that affect the bookmark bar.
- void UpdateCommandsForBookmarkBar();
-
// Set the preference that indicates that the home page has been changed.
void MarkHomePageAsChanged(PrefService* pref_service);
- // Update commands whose state depends on the type of fullscreen mode the
- // window is in.
- void UpdateCommandsForFullscreenMode(FullScreenMode fullscreen_mode);
-
- // Update commands whose state depends on whether multiple profiles are
- // allowed.
- void UpdateCommandsForMultipleProfiles();
-
- // Updates the printing command state.
- void UpdatePrintingState(int content_restrictions);
-
- // Updates the save-page-as command state.
- void UpdateSaveAsState(int content_restrictions);
-
- // Updates the open-file state (Mac Only).
- void UpdateOpenFileState();
-
- // Ask the Reload/Stop button to change its icon, and update the Stop command
- // state. |is_loading| is true if the current WebContents is loading.
- // |force| is true if the button should change its icon immediately.
- void UpdateReloadStopState(bool is_loading, bool force);
-
// UI update coalescing and handling ////////////////////////////////////////
// Asks the toolbar (and as such the location bar) to update its state to
@@ -1075,11 +971,6 @@ class Browser : public TabStripModelDelegate,
// If this browser should have instant one is created, otherwise does nothing.
void CreateInstantIfNecessary();
- // Retrieves the content restrictions for the currently selected tab.
- // Returns 0 if no tab selected, which is equivalent to no content
- // restrictions active.
- int GetContentRestrictionsForSelectedTab();
-
// Resets |bookmark_bar_state_| based on the active tab. Notifies the
// BrowserWindow if necessary.
void UpdateBookmarkBarState(BookmarkBarStateChangeReason reason);
@@ -1097,8 +988,6 @@ class Browser : public TabStripModelDelegate,
PrefChangeRegistrar profile_pref_registrar_;
- PrefChangeRegistrar local_pref_registrar_;
-
// This Browser's type.
const Type type_;
@@ -1110,9 +999,6 @@ class Browser : public TabStripModelDelegate,
scoped_ptr<TabStripModel> tab_strip_model_;
- // The CommandUpdater that manages the browser window commands.
- CommandUpdater command_updater_;
-
// The application name that is also the name of the window to the shell.
// This name should be set when:
// 1) we launch an application via an application shortcut or extension API.
@@ -1204,23 +1090,10 @@ class Browser : public TabStripModelDelegate,
// Keep track of the encoding auto detect pref.
BooleanPrefMember encoding_auto_detect_;
- // Indicates if command execution is blocked.
- bool block_command_execution_;
-
- // Stores the last blocked command id when |block_command_execution_| is true.
- int last_blocked_command_id_;
-
- // Stores the disposition type of the last blocked command.
- WindowOpenDisposition last_blocked_command_disposition_;
-
// Which deferred action to perform when OnDidGetApplicationInfo is notified
// from a WebContents. Currently, only one pending action is allowed.
WebAppAction pending_web_app_action_;
- // The profile's tab restore service. The service is owned by the profile,
- // and we install ourselves as an observer.
- TabRestoreService* tab_restore_service_;
-
// Helper which implements the ContentSettingBubbleModel interface.
scoped_ptr<BrowserContentSettingBubbleModelDelegate>
content_setting_bubble_model_delegate_;
@@ -1248,6 +1121,8 @@ class Browser : public TabStripModelDelegate,
scoped_ptr<ExtensionWindowController> extension_window_controller_;
+ scoped_ptr<chrome::BrowserCommandController> command_controller_;
+
// True if the browser window has been shown at least once.
bool window_has_shown_;
diff --git a/chrome/browser/ui/browser_browsertest.cc b/chrome/browser/ui/browser_browsertest.cc
index 2a7d711..fec105f 100644
--- a/chrome/browser/ui/browser_browsertest.cc
+++ b/chrome/browser/ui/browser_browsertest.cc
@@ -28,6 +28,7 @@
#include "chrome/browser/ui/app_modal_dialogs/javascript_app_modal_dialog.h"
#include "chrome/browser/ui/app_modal_dialogs/native_app_modal_dialog.h"
#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_command_controller.h"
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/browser_list.h"
@@ -610,7 +611,8 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, RenderIdleTime) {
// on the Mac. http://crbug.com/13148
#if !defined(OS_MACOSX)
IN_PROC_BROWSER_TEST_F(BrowserTest, CommandCreateAppShortcutFile) {
- CommandUpdater* command_updater = browser()->command_updater();
+ CommandUpdater* command_updater =
+ browser()->command_controller()->command_updater();
static const FilePath::CharType* kEmptyFile = FILE_PATH_LITERAL("empty.html");
GURL file_url(ui_test_utils::GetTestUrl(FilePath(FilePath::kCurrentDirectory),
@@ -621,7 +623,8 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, CommandCreateAppShortcutFile) {
}
IN_PROC_BROWSER_TEST_F(BrowserTest, CommandCreateAppShortcutHttp) {
- CommandUpdater* command_updater = browser()->command_updater();
+ CommandUpdater* command_updater =
+ browser()->command_controller()->command_updater();
ASSERT_TRUE(test_server()->Start());
GURL http_url(test_server()->GetURL(""));
@@ -631,7 +634,8 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, CommandCreateAppShortcutHttp) {
}
IN_PROC_BROWSER_TEST_F(BrowserTest, CommandCreateAppShortcutHttps) {
- CommandUpdater* command_updater = browser()->command_updater();
+ CommandUpdater* command_updater =
+ browser()->command_controller()->command_updater();
net::TestServer test_server(net::TestServer::TYPE_HTTPS,
net::TestServer::kLocalhost,
@@ -644,7 +648,8 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, CommandCreateAppShortcutHttps) {
}
IN_PROC_BROWSER_TEST_F(BrowserTest, CommandCreateAppShortcutFtp) {
- CommandUpdater* command_updater = browser()->command_updater();
+ CommandUpdater* command_updater =
+ browser()->command_controller()->command_updater();
net::TestServer test_server(net::TestServer::TYPE_FTP,
net::TestServer::kLocalhost,
@@ -657,7 +662,8 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, CommandCreateAppShortcutFtp) {
}
IN_PROC_BROWSER_TEST_F(BrowserTest, CommandCreateAppShortcutInvalid) {
- CommandUpdater* command_updater = browser()->command_updater();
+ CommandUpdater* command_updater =
+ browser()->command_controller()->command_updater();
// Urls that should not have shortcuts.
GURL new_tab_url(chrome::kChromeUINewTabURL);
@@ -1075,7 +1081,9 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, ForwardDisabledOnForward) {
&browser()->GetActiveWebContents()->GetController()));
chrome::GoBack(browser(), CURRENT_TAB);
back_nav_load_observer.Wait();
- EXPECT_TRUE(browser()->command_updater()->IsCommandEnabled(IDC_FORWARD));
+ CommandUpdater* command_updater =
+ browser()->command_controller()->command_updater();
+ EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_FORWARD));
ui_test_utils::WindowedNotificationObserver forward_nav_load_observer(
content::NOTIFICATION_LOAD_STOP,
@@ -1084,13 +1092,14 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, ForwardDisabledOnForward) {
chrome::GoForward(browser(), CURRENT_TAB);
// This check will happen before the navigation completes, since the browser
// won't process the renderer's response until the Wait() call below.
- EXPECT_FALSE(browser()->command_updater()->IsCommandEnabled(IDC_FORWARD));
+ EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_FORWARD));
forward_nav_load_observer.Wait();
}
// Makes sure certain commands are disabled when Incognito mode is forced.
IN_PROC_BROWSER_TEST_F(BrowserTest, DisableMenuItemsWhenIncognitoIsForced) {
- CommandUpdater* command_updater = browser()->command_updater();
+ CommandUpdater* command_updater =
+ browser()->command_controller()->command_updater();
// At the beginning, all commands are enabled.
EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_NEW_WINDOW));
EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_NEW_INCOGNITO_WINDOW));
@@ -1113,7 +1122,8 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, DisableMenuItemsWhenIncognitoIsForced) {
// Create a new browser.
Browser* new_browser = Browser::Create(browser()->profile());
- CommandUpdater* new_command_updater = new_browser->command_updater();
+ CommandUpdater* new_command_updater =
+ new_browser->command_controller()->command_updater();
// It should have Bookmarks & Settings commands disabled by default.
EXPECT_FALSE(new_command_updater->IsCommandEnabled(IDC_NEW_WINDOW));
EXPECT_FALSE(new_command_updater->IsCommandEnabled(
@@ -1128,7 +1138,8 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, DisableMenuItemsWhenIncognitoIsForced) {
// not available.
IN_PROC_BROWSER_TEST_F(BrowserTest,
NoNewIncognitoWindowWhenIncognitoIsDisabled) {
- CommandUpdater* command_updater = browser()->command_updater();
+ CommandUpdater* command_updater =
+ browser()->command_controller()->command_updater();
// Set Incognito to DISABLED.
IncognitoModePrefs::SetAvailability(browser()->profile()->GetPrefs(),
IncognitoModePrefs::DISABLED);
@@ -1143,7 +1154,8 @@ IN_PROC_BROWSER_TEST_F(BrowserTest,
// Create a new browser.
Browser* new_browser = Browser::Create(browser()->profile());
- CommandUpdater* new_command_updater = new_browser->command_updater();
+ CommandUpdater* new_command_updater =
+ new_browser->command_controller()->command_updater();
EXPECT_FALSE(new_command_updater->IsCommandEnabled(IDC_NEW_INCOGNITO_WINDOW));
EXPECT_TRUE(new_command_updater->IsCommandEnabled(IDC_NEW_WINDOW));
EXPECT_TRUE(new_command_updater->IsCommandEnabled(IDC_SHOW_BOOKMARK_MANAGER));
@@ -1156,7 +1168,8 @@ IN_PROC_BROWSER_TEST_F(BrowserTest,
// circumstances even though normally they should stay enabled.
IN_PROC_BROWSER_TEST_F(BrowserTest,
DisableExtensionsAndSettingsWhenIncognitoIsDisabled) {
- CommandUpdater* command_updater = browser()->command_updater();
+ CommandUpdater* command_updater =
+ browser()->command_controller()->command_updater();
// Disable extensions. This should disable Extensions menu.
browser()->profile()->GetExtensionService()->set_extensions_enabled(false);
// Set Incognito to DISABLED.
@@ -1173,7 +1186,8 @@ IN_PROC_BROWSER_TEST_F(BrowserTest,
// as Extensions should be disabled.
Browser* popup_browser = browser()->CreateWithParams(
Browser::CreateParams(Browser::TYPE_POPUP, browser()->profile()));
- CommandUpdater* popup_command_updater = popup_browser->command_updater();
+ CommandUpdater* popup_command_updater =
+ popup_browser->command_controller()->command_updater();
EXPECT_FALSE(popup_command_updater->IsCommandEnabled(IDC_MANAGE_EXTENSIONS));
EXPECT_FALSE(popup_command_updater->IsCommandEnabled(IDC_OPTIONS));
EXPECT_TRUE(popup_command_updater->IsCommandEnabled(
@@ -1188,7 +1202,8 @@ IN_PROC_BROWSER_TEST_F(BrowserTest,
// Create a popup browser.
Browser* popup_browser = browser()->CreateWithParams(
Browser::CreateParams(Browser::TYPE_POPUP, browser()->profile()));
- CommandUpdater* command_updater = popup_browser->command_updater();
+ CommandUpdater* command_updater =
+ popup_browser->command_controller()->command_updater();
// OPTIONS and IMPORT_SETTINGS are disabled for a non-normal UI.
EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_OPTIONS));
EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_IMPORT_SETTINGS));
@@ -1247,7 +1262,8 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, InterstitialCommandDisable) {
GURL url(test_server()->GetURL("empty.html"));
ui_test_utils::NavigateToURL(browser(), url);
- CommandUpdater* command_updater = browser()->command_updater();
+ CommandUpdater* command_updater =
+ browser()->command_controller()->command_updater();
EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_VIEW_SOURCE));
EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_PRINT));
EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_SAVE_PAGE));
diff --git a/chrome/browser/ui/browser_command_controller.cc b/chrome/browser/ui/browser_command_controller.cc
new file mode 100644
index 0000000..fd43df0
--- /dev/null
+++ b/chrome/browser/ui/browser_command_controller.cc
@@ -0,0 +1,1063 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/browser_command_controller.h"
+
+#include "chrome/app/chrome_command_ids.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/defaults.h"
+#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/prefs/incognito_mode_prefs.h"
+#include "chrome/browser/prefs/pref_service.h"
+#include "chrome/browser/printing/print_preview_tab_controller.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/sessions/tab_restore_service.h"
+#include "chrome/browser/sessions/tab_restore_service_factory.h"
+#include "chrome/browser/sync/profile_sync_service.h"
+#include "chrome/browser/sync/profile_sync_service_factory.h"
+#include "chrome/browser/ui/bookmarks/bookmark_tab_helper.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_commands.h"
+#include "chrome/browser/ui/browser_window.h"
+#include "chrome/browser/ui/chrome_pages.h"
+#include "chrome/browser/ui/tab_contents/tab_contents.h"
+#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/browser/ui/webui/sync_promo/sync_promo_ui.h"
+#include "chrome/common/chrome_notification_types.h"
+#include "chrome/common/pref_names.h"
+#include "chrome/common/profiling.h"
+#include "content/public/browser/native_web_keyboard_event.h"
+#include "content/public/browser/navigation_controller.h"
+#include "content/public/browser/navigation_entry.h"
+#include "content/public/browser/notification_details.h"
+#include "content/public/browser/notification_source.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/common/content_restriction.h"
+#include "content/public/common/url_constants.h"
+#include "ui/base/keycodes/keyboard_codes.h"
+
+#if defined(OS_WIN)
+#include "base/win/metro.h"
+#endif
+
+using content::WebContents;
+using content::NavigationEntry;
+using content::NavigationController;
+using content::WebContents;
+
+namespace {
+
+// Returns |true| if entry has an internal chrome:// URL, |false| otherwise.
+bool HasInternalURL(const NavigationEntry* entry) {
+ if (!entry)
+ return false;
+
+ // Check the |virtual_url()| first. This catches regular chrome:// URLs
+ // including URLs that were rewritten (such as chrome://bookmarks).
+ if (entry->GetVirtualURL().SchemeIs(chrome::kChromeUIScheme))
+ return true;
+
+ // If the |virtual_url()| isn't a chrome:// URL, check if it's actually
+ // view-source: of a chrome:// URL.
+ if (entry->GetVirtualURL().SchemeIs(chrome::kViewSourceScheme))
+ return entry->GetURL().SchemeIs(chrome::kChromeUIScheme);
+
+ return false;
+}
+
+} // namespace
+
+namespace chrome {
+
+///////////////////////////////////////////////////////////////////////////////
+// BrowserCommandController, public:
+
+BrowserCommandController::BrowserCommandController(Browser* browser)
+ : browser_(browser),
+ ALLOW_THIS_IN_INITIALIZER_LIST(command_updater_(this)),
+ block_command_execution_(false),
+ last_blocked_command_id_(-1),
+ last_blocked_command_disposition_(CURRENT_TAB) {
+ browser_->tab_strip_model()->AddObserver(this);
+ PrefService* local_state = g_browser_process->local_state();
+ if (local_state) {
+ local_pref_registrar_.Init(local_state);
+ local_pref_registrar_.Add(prefs::kPrintingEnabled, this);
+ local_pref_registrar_.Add(prefs::kAllowFileSelectionDialogs, this);
+ local_pref_registrar_.Add(prefs::kInManagedMode, this);
+ }
+
+ profile_pref_registrar_.Init(profile()->GetPrefs());
+ profile_pref_registrar_.Add(prefs::kDevToolsDisabled, this);
+ profile_pref_registrar_.Add(prefs::kEditBookmarksEnabled, this);
+ profile_pref_registrar_.Add(prefs::kShowBookmarkBar, this);
+ profile_pref_registrar_.Add(prefs::kIncognitoModeAvailability, this);
+
+ InitCommandState();
+
+ TabRestoreService* tab_restore_service =
+ TabRestoreServiceFactory::GetForProfile(profile());
+ if (tab_restore_service) {
+ tab_restore_service->AddObserver(this);
+ TabRestoreServiceChanged(tab_restore_service);
+ }
+
+ ProfileSyncService* service =
+ ProfileSyncServiceFactory::GetInstance()->GetForProfile(profile());
+ if (service)
+ service->AddObserver(this);
+}
+
+BrowserCommandController::~BrowserCommandController() {
+ ProfileSyncService* service =
+ ProfileSyncServiceFactory::GetInstance()->GetForProfile(profile());
+ if (service)
+ service->RemoveObserver(this);
+
+ TabRestoreService* tab_restore_service =
+ TabRestoreServiceFactory::GetForProfile(profile());
+ if (tab_restore_service)
+ tab_restore_service->RemoveObserver(this);
+ profile_pref_registrar_.RemoveAll();
+ local_pref_registrar_.RemoveAll();
+ browser_->tab_strip_model()->RemoveObserver(this);
+}
+
+bool BrowserCommandController::IsReservedCommandOrKey(
+ int command_id,
+ const content::NativeWebKeyboardEvent& event) {
+ // In Apps mode, no keys are reserved.
+ if (browser_->is_app())
+ return false;
+
+#if defined(OS_CHROMEOS)
+ // Chrome OS's top row of keys produces F1-10. Make sure that web pages
+ // aren't able to block Chrome from performing the standard actions for F1-F4.
+ // We should not handle F5-10 here since they are processed by Ash. See also:
+ // crbug.com/127333#c8
+ ui::KeyboardCode key_code =
+ static_cast<ui::KeyboardCode>(event.windowsKeyCode);
+ if ((key_code == ui::VKEY_F1 ||
+ key_code == ui::VKEY_F2 ||
+ key_code == ui::VKEY_F3 ||
+ key_code == ui::VKEY_F4) &&
+ // Make sure it's a browser shortcut (i.e. not an Ash one like Alt+F4).
+ command_id != -1) {
+ return true;
+ }
+#endif
+
+ if (window()->IsFullscreen() && command_id == IDC_FULLSCREEN)
+ return true;
+ return command_id == IDC_CLOSE_TAB ||
+ command_id == IDC_CLOSE_WINDOW ||
+ command_id == IDC_NEW_INCOGNITO_WINDOW ||
+ command_id == IDC_NEW_TAB ||
+ command_id == IDC_NEW_WINDOW ||
+ command_id == IDC_RESTORE_TAB ||
+ command_id == IDC_SELECT_NEXT_TAB ||
+ command_id == IDC_SELECT_PREVIOUS_TAB ||
+ command_id == IDC_TABPOSE ||
+ command_id == IDC_EXIT ||
+ command_id == IDC_SEARCH;
+}
+
+void BrowserCommandController::SetBlockCommandExecution(bool block) {
+ block_command_execution_ = block;
+ if (block) {
+ last_blocked_command_id_ = -1;
+ last_blocked_command_disposition_ = CURRENT_TAB;
+ }
+}
+
+int BrowserCommandController::GetLastBlockedCommand(
+ WindowOpenDisposition* disposition) {
+ if (disposition)
+ *disposition = last_blocked_command_disposition_;
+ return last_blocked_command_id_;
+}
+
+void BrowserCommandController::TabStateChanged() {
+ UpdateCommandsForTabState();
+}
+
+void BrowserCommandController::ContentRestrictionsChanged() {
+ UpdateCommandsForContentRestrictionState();
+}
+
+void BrowserCommandController::FullscreenStateChanged() {
+ FullScreenMode fullscreen_mode = FULLSCREEN_DISABLED;
+ if (window()->IsFullscreen()) {
+#if defined(OS_WIN)
+ fullscreen_mode = window()->IsInMetroSnapMode() ? FULLSCREEN_METRO_SNAP :
+ FULLSCREEN_NORMAL;
+#else
+ fullscreen_mode = FULLSCREEN_NORMAL;
+#endif
+ }
+ UpdateCommandsForFullscreenMode(fullscreen_mode);
+}
+
+void BrowserCommandController::PrintingStateChanged() {
+ UpdatePrintingState();
+}
+
+void BrowserCommandController::LoadingStateChanged(bool is_loading,
+ bool force) {
+ UpdateReloadStopState(is_loading, force);
+}
+
+void BrowserCommandController::SendToMobileStateChanged(
+ bool send_to_mobile_available) {
+ command_updater_.UpdateCommandEnabled(IDC_CHROME_TO_MOBILE_PAGE,
+ send_to_mobile_available);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// BrowserCommandController,
+// CommandUpdater::CommandUpdaterDelegate implementation:
+
+void BrowserCommandController::ExecuteCommandWithDisposition(
+ int id, WindowOpenDisposition disposition) {
+ // No commands are enabled if there is not yet any selected tab.
+ // TODO(pkasting): It seems like we should not need this, because either
+ // most/all commands should not have been enabled yet anyway or the ones that
+ // are enabled should be global, or safe themselves against having no selected
+ // tab. However, Ben says he tried removing this before and got lots of
+ // crashes, e.g. from Windows sending WM_COMMANDs at random times during
+ // window construction. This probably could use closer examination someday.
+ if (!browser_->GetActiveTabContents())
+ return;
+
+ DCHECK(command_updater_.IsCommandEnabled(id)) << "Invalid/disabled command "
+ << id;
+
+ // If command execution is blocked then just record the command and return.
+ if (block_command_execution_) {
+ // We actually only allow no more than one blocked command, otherwise some
+ // commands maybe lost.
+ DCHECK_EQ(last_blocked_command_id_, -1);
+ last_blocked_command_id_ = id;
+ last_blocked_command_disposition_ = disposition;
+ return;
+ }
+
+ // The order of commands in this switch statement must match the function
+ // declaration order in browser.h!
+ switch (id) {
+ // Navigation commands
+ case IDC_BACK:
+ GoBack(browser_, disposition);
+ break;
+ case IDC_FORWARD:
+ GoForward(browser_, disposition);
+ break;
+ case IDC_RELOAD:
+ Reload(browser_, disposition);
+ break;
+ case IDC_RELOAD_IGNORING_CACHE:
+ ReloadIgnoringCache(browser_, disposition);
+ break;
+ case IDC_HOME:
+ Home(browser_, disposition);
+ break;
+ case IDC_OPEN_CURRENT_URL:
+ OpenCurrentURL(browser_);
+ break;
+ case IDC_STOP:
+ Stop(browser_);
+ break;
+
+ // Window management commands
+ case IDC_NEW_WINDOW:
+ NewWindow(browser_);
+ break;
+ case IDC_NEW_INCOGNITO_WINDOW:
+ NewIncognitoWindow(browser_);
+ break;
+ case IDC_CLOSE_WINDOW:
+ CloseWindow(browser_);
+ break;
+ case IDC_NEW_TAB:
+ NewTab(browser_);
+ break;
+ case IDC_CLOSE_TAB:
+ CloseTab(browser_);
+ break;
+ case IDC_SELECT_NEXT_TAB:
+ SelectNextTab(browser_);
+ break;
+ case IDC_SELECT_PREVIOUS_TAB:
+ SelectPreviousTab(browser_);
+ break;
+ case IDC_TABPOSE:
+ OpenTabpose(browser_);
+ break;
+ case IDC_MOVE_TAB_NEXT:
+ MoveTabNext(browser_);
+ break;
+ case IDC_MOVE_TAB_PREVIOUS:
+ MoveTabPrevious(browser_);
+ break;
+ case IDC_SELECT_TAB_0:
+ case IDC_SELECT_TAB_1:
+ case IDC_SELECT_TAB_2:
+ case IDC_SELECT_TAB_3:
+ case IDC_SELECT_TAB_4:
+ case IDC_SELECT_TAB_5:
+ case IDC_SELECT_TAB_6:
+ case IDC_SELECT_TAB_7:
+ SelectNumberedTab(browser_, id - IDC_SELECT_TAB_0);
+ break;
+ case IDC_SELECT_LAST_TAB:
+ SelectLastTab(browser_);
+ break;
+ case IDC_DUPLICATE_TAB:
+ DuplicateTab(browser_);
+ break;
+ case IDC_RESTORE_TAB:
+ RestoreTab(browser_);
+ break;
+ case IDC_COPY_URL:
+ WriteCurrentURLToClipboard(browser_);
+ break;
+ case IDC_SHOW_AS_TAB:
+ ConvertPopupToTabbedBrowser(browser_);
+ break;
+ case IDC_FULLSCREEN:
+ browser_->ToggleFullscreenMode();
+ break;
+#if defined(OS_WIN)
+ case IDC_METRO_SNAP_ENABLE:
+ browser_->SetMetroSnapMode(true);
+ break;
+ case IDC_METRO_SNAP_DISABLE:
+ browser_->SetMetroSnapMode(false);
+ break;
+#endif
+#if defined(OS_MACOSX)
+ case IDC_PRESENTATION_MODE:
+ browser_->TogglePresentationMode();
+ break;
+#endif
+ case IDC_EXIT:
+ Exit();
+ break;
+
+ // Page-related commands
+ case IDC_SAVE_PAGE:
+ SavePage(browser_);
+ break;
+ case IDC_BOOKMARK_PAGE:
+ BookmarkCurrentPage(browser_);
+ break;
+ case IDC_PIN_TO_START_SCREEN:
+ PinCurrentPageToStartScreen(browser_);
+ break;
+ case IDC_BOOKMARK_ALL_TABS:
+ BookmarkAllTabs(browser_);
+ break;
+ case IDC_VIEW_SOURCE:
+ ViewSelectedSource(browser_);
+ break;
+ case IDC_EMAIL_PAGE_LOCATION:
+ EmailPageLocation(browser_);
+ break;
+ case IDC_PRINT:
+ Print(browser_);
+ break;
+ case IDC_ADVANCED_PRINT:
+ AdvancedPrint(browser_);
+ break;
+ case IDC_CHROME_TO_MOBILE_PAGE:
+ ShowChromeToMobileBubble(browser_);
+ break;
+ case IDC_ENCODING_AUTO_DETECT:
+ browser_->ToggleEncodingAutoDetect();
+ break;
+ case IDC_ENCODING_UTF8:
+ case IDC_ENCODING_UTF16LE:
+ case IDC_ENCODING_ISO88591:
+ case IDC_ENCODING_WINDOWS1252:
+ case IDC_ENCODING_GBK:
+ case IDC_ENCODING_GB18030:
+ case IDC_ENCODING_BIG5HKSCS:
+ case IDC_ENCODING_BIG5:
+ case IDC_ENCODING_KOREAN:
+ case IDC_ENCODING_SHIFTJIS:
+ case IDC_ENCODING_ISO2022JP:
+ case IDC_ENCODING_EUCJP:
+ case IDC_ENCODING_THAI:
+ case IDC_ENCODING_ISO885915:
+ case IDC_ENCODING_MACINTOSH:
+ case IDC_ENCODING_ISO88592:
+ case IDC_ENCODING_WINDOWS1250:
+ case IDC_ENCODING_ISO88595:
+ case IDC_ENCODING_WINDOWS1251:
+ case IDC_ENCODING_KOI8R:
+ case IDC_ENCODING_KOI8U:
+ case IDC_ENCODING_ISO88597:
+ case IDC_ENCODING_WINDOWS1253:
+ case IDC_ENCODING_ISO88594:
+ case IDC_ENCODING_ISO885913:
+ case IDC_ENCODING_WINDOWS1257:
+ case IDC_ENCODING_ISO88593:
+ case IDC_ENCODING_ISO885910:
+ case IDC_ENCODING_ISO885914:
+ case IDC_ENCODING_ISO885916:
+ case IDC_ENCODING_WINDOWS1254:
+ case IDC_ENCODING_ISO88596:
+ case IDC_ENCODING_WINDOWS1256:
+ case IDC_ENCODING_ISO88598:
+ case IDC_ENCODING_ISO88598I:
+ case IDC_ENCODING_WINDOWS1255:
+ case IDC_ENCODING_WINDOWS1258:
+ browser_->OverrideEncoding(id);
+ break;
+
+ // Clipboard commands
+ case IDC_CUT:
+ Cut(browser_);
+ break;
+ case IDC_COPY:
+ Copy(browser_);
+ break;
+ case IDC_PASTE:
+ Paste(browser_);
+ break;
+
+ // Find-in-page
+ case IDC_FIND:
+ Find(browser_);
+ break;
+ case IDC_FIND_NEXT:
+ FindNext(browser_);
+ break;
+ case IDC_FIND_PREVIOUS:
+ FindPrevious(browser_);
+ break;
+
+ // Zoom
+ case IDC_ZOOM_PLUS:
+ Zoom(browser_, content::PAGE_ZOOM_IN);
+ break;
+ case IDC_ZOOM_NORMAL:
+ Zoom(browser_, content::PAGE_ZOOM_RESET);
+ break;
+ case IDC_ZOOM_MINUS:
+ Zoom(browser_, content::PAGE_ZOOM_OUT);
+ break;
+
+ // Focus various bits of UI
+ case IDC_FOCUS_TOOLBAR:
+ FocusToolbar(browser_);
+ break;
+ case IDC_FOCUS_LOCATION:
+ FocusLocationBar(browser_);
+ break;
+ case IDC_FOCUS_SEARCH:
+ FocusSearch(browser_);
+ break;
+ case IDC_FOCUS_MENU_BAR:
+ FocusAppMenu(browser_);
+ break;
+ case IDC_FOCUS_BOOKMARKS:
+ FocusBookmarksToolbar(browser_);
+ break;
+ case IDC_FOCUS_NEXT_PANE:
+ FocusNextPane(browser_);
+ break;
+ case IDC_FOCUS_PREVIOUS_PANE:
+ FocusPreviousPane(browser_);
+ break;
+
+ // Show various bits of UI
+ case IDC_OPEN_FILE:
+ browser_->OpenFile();
+ break;
+ case IDC_CREATE_SHORTCUTS:
+ browser_->OpenCreateShortcutsDialog();
+ break;
+ case IDC_DEV_TOOLS:
+ ToggleDevToolsWindow(browser_, DEVTOOLS_TOGGLE_ACTION_NONE);
+ break;
+ case IDC_DEV_TOOLS_CONSOLE:
+ ToggleDevToolsWindow(browser_, DEVTOOLS_TOGGLE_ACTION_SHOW_CONSOLE);
+ break;
+ case IDC_DEV_TOOLS_INSPECT:
+ ToggleDevToolsWindow(browser_, DEVTOOLS_TOGGLE_ACTION_INSPECT);
+ break;
+ case IDC_TASK_MANAGER:
+ OpenTaskManager(browser_, false);
+ break;
+ case IDC_VIEW_BACKGROUND_PAGES:
+ OpenTaskManager(browser_, true);
+ break;
+ case IDC_FEEDBACK:
+ OpenFeedbackDialog(browser_);
+ break;
+
+ case IDC_SHOW_BOOKMARK_BAR:
+ ToggleBookmarkBar(browser_);
+ break;
+ case IDC_PROFILING_ENABLED:
+ Profiling::Toggle();
+ break;
+
+ case IDC_SHOW_BOOKMARK_MANAGER:
+ ShowBookmarkManager(browser_);
+ break;
+ case IDC_SHOW_APP_MENU:
+ ShowAppMenu(browser_);
+ break;
+ case IDC_SHOW_AVATAR_MENU:
+ ShowAvatarMenu(browser_);
+ break;
+ case IDC_SHOW_HISTORY:
+ ShowHistory(browser_);
+ break;
+ case IDC_SHOW_DOWNLOADS:
+ ShowDownloads(browser_);
+ break;
+ case IDC_MANAGE_EXTENSIONS:
+ ShowExtensions(browser_);
+ break;
+ case IDC_OPTIONS:
+ ShowSettings(browser_);
+ break;
+ case IDC_EDIT_SEARCH_ENGINES:
+ ShowSearchEngineSettings(browser_);
+ break;
+ case IDC_VIEW_PASSWORDS:
+ ShowPasswordManager(browser_);
+ break;
+ case IDC_CLEAR_BROWSING_DATA:
+ ShowClearBrowsingDataDialog(browser_);
+ break;
+ case IDC_IMPORT_SETTINGS:
+ ShowImportDialog(browser_);
+ break;
+ case IDC_ABOUT:
+ ShowAboutChrome(browser_);
+ break;
+ case IDC_UPGRADE_DIALOG:
+ OpenUpdateChromeDialog(browser_);
+ break;
+ case IDC_VIEW_INCOMPATIBILITIES:
+ ShowConflicts(browser_);
+ break;
+ case IDC_HELP_PAGE_VIA_KEYBOARD:
+ ShowHelp(browser_, HELP_SOURCE_KEYBOARD);
+ break;
+ case IDC_HELP_PAGE_VIA_MENU:
+ ShowHelp(browser_, HELP_SOURCE_MENU);
+ break;
+ case IDC_SHOW_SYNC_SETUP:
+ ShowSyncSetup(browser_, SyncPromoUI::SOURCE_MENU);
+ break;
+ case IDC_TOGGLE_SPEECH_INPUT:
+ ToggleSpeechInput(browser_);
+ break;
+
+ default:
+ LOG(WARNING) << "Received Unimplemented Command: " << id;
+ break;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// BrowserCommandController, content::NotificationObserver implementation:
+
+void BrowserCommandController::Observe(
+ int type,
+ const content::NotificationSource& source,
+ const content::NotificationDetails& details) {
+ switch (type) {
+ case NOTIFICATION_PREF_CHANGED: {
+ const std::string& pref_name =
+ *content::Details<std::string>(details).ptr();
+ if (pref_name == prefs::kPrintingEnabled) {
+ UpdatePrintingState();
+ } else if (pref_name == prefs::kIncognitoModeAvailability) {
+ UpdateCommandsForIncognitoAvailability();
+ } else if (pref_name == prefs::kDevToolsDisabled) {
+ UpdateCommandsForDevTools();
+ } else if (pref_name == prefs::kEditBookmarksEnabled) {
+ UpdateCommandsForBookmarkEditing();
+ } else if (pref_name == prefs::kShowBookmarkBar) {
+ UpdateCommandsForBookmarkBar();
+ } else if (pref_name == prefs::kAllowFileSelectionDialogs) {
+ UpdateSaveAsState();
+ UpdateOpenFileState();
+ } else if (pref_name == prefs::kInManagedMode) {
+ UpdateCommandsForMultipleProfiles();
+ } else {
+ NOTREACHED();
+ }
+ break;
+ }
+ case content::NOTIFICATION_INTERSTITIAL_ATTACHED:
+ UpdateCommandsForTabState();
+ break;
+
+ case content::NOTIFICATION_INTERSTITIAL_DETACHED:
+ UpdateCommandsForTabState();
+ break;
+
+ default:
+ NOTREACHED() << "Got a notification we didn't register for.";
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// BrowserCommandController, TabStripModelObserver implementation:
+
+void BrowserCommandController::TabInsertedAt(TabContents* contents,
+ int index,
+ bool foreground) {
+ AddInterstitialObservers(contents);
+}
+
+void BrowserCommandController::TabDetachedAt(TabContents* contents, int index) {
+ RemoveInterstitialObservers(contents);
+}
+
+void BrowserCommandController::TabReplacedAt(TabStripModel* tab_strip_model,
+ TabContents* old_contents,
+ TabContents* new_contents,
+ int index) {
+ RemoveInterstitialObservers(old_contents);
+ AddInterstitialObservers(new_contents);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// BrowserCommandController, TabRestoreServiceObserver implementation:
+
+void BrowserCommandController::TabRestoreServiceChanged(
+ TabRestoreService* service) {
+ command_updater_.UpdateCommandEnabled(IDC_RESTORE_TAB,
+ CanRestoreTab(browser_));
+}
+
+void BrowserCommandController::TabRestoreServiceDestroyed(
+ TabRestoreService* service) {
+ service->RemoveObserver(this);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// BrowserCommandController, ProfileSyncServiceObserver implementation:
+
+void BrowserCommandController::OnStateChanged() {
+ DCHECK(ProfileSyncServiceFactory::GetInstance()->HasProfileSyncService(
+ profile()));
+ // For unit tests, we don't have a window.
+ if (!window())
+ return;
+ const bool show_main_ui = IsShowingMainUI(window()->IsFullscreen());
+ command_updater_.UpdateCommandEnabled(IDC_SHOW_SYNC_SETUP,
+ show_main_ui && profile()->GetOriginalProfile()->IsSyncAccessible());
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// BrowserCommandController, private:
+
+bool BrowserCommandController::IsShowingMainUI(bool is_fullscreen) {
+#if !defined(OS_MACOSX)
+ return browser_->is_type_tabbed() && !is_fullscreen;
+#else
+ return browser_->is_type_tabbed();
+#endif
+}
+
+void BrowserCommandController::InitCommandState() {
+ // All browser commands whose state isn't set automagically some other way
+ // (like Back & Forward with initial page load) must have their state
+ // initialized here, otherwise they will be forever disabled.
+
+ // Navigation commands
+ command_updater_.UpdateCommandEnabled(IDC_RELOAD, true);
+ command_updater_.UpdateCommandEnabled(IDC_RELOAD_IGNORING_CACHE, true);
+
+ // Window management commands
+ command_updater_.UpdateCommandEnabled(IDC_CLOSE_WINDOW, true);
+ command_updater_.UpdateCommandEnabled(IDC_NEW_TAB, true);
+ command_updater_.UpdateCommandEnabled(IDC_CLOSE_TAB, true);
+ command_updater_.UpdateCommandEnabled(IDC_DUPLICATE_TAB, true);
+ command_updater_.UpdateCommandEnabled(IDC_RESTORE_TAB, false);
+ command_updater_.UpdateCommandEnabled(IDC_EXIT, true);
+ command_updater_.UpdateCommandEnabled(IDC_DEBUG_FRAME_TOGGLE, true);
+
+ // Page-related commands
+ command_updater_.UpdateCommandEnabled(IDC_EMAIL_PAGE_LOCATION, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_AUTO_DETECT, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_UTF8, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_UTF16LE, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO88591, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_WINDOWS1252, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_GBK, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_GB18030, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_BIG5HKSCS, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_BIG5, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_THAI, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_KOREAN, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_SHIFTJIS, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO2022JP, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_EUCJP, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO885915, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_MACINTOSH, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO88592, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_WINDOWS1250, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO88595, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_WINDOWS1251, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_KOI8R, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_KOI8U, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO88597, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_WINDOWS1253, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO88594, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO885913, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_WINDOWS1257, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO88593, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO885910, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO885914, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO885916, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_WINDOWS1254, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO88596, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_WINDOWS1256, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO88598, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_ISO88598I, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_WINDOWS1255, true);
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_WINDOWS1258, true);
+
+ // Zoom
+ command_updater_.UpdateCommandEnabled(IDC_ZOOM_MENU, true);
+ command_updater_.UpdateCommandEnabled(IDC_ZOOM_PLUS, true);
+ command_updater_.UpdateCommandEnabled(IDC_ZOOM_NORMAL, true);
+ command_updater_.UpdateCommandEnabled(IDC_ZOOM_MINUS, true);
+
+ // Show various bits of UI
+ UpdateOpenFileState();
+ command_updater_.UpdateCommandEnabled(IDC_CREATE_SHORTCUTS, false);
+ UpdateCommandsForDevTools();
+ command_updater_.UpdateCommandEnabled(IDC_TASK_MANAGER, CanOpenTaskManager());
+ command_updater_.UpdateCommandEnabled(IDC_SHOW_HISTORY, true);
+ command_updater_.UpdateCommandEnabled(IDC_SHOW_DOWNLOADS, true);
+ command_updater_.UpdateCommandEnabled(IDC_HELP_PAGE_VIA_KEYBOARD, true);
+ command_updater_.UpdateCommandEnabled(IDC_HELP_PAGE_VIA_MENU, true);
+ command_updater_.UpdateCommandEnabled(IDC_BOOKMARKS_MENU, true);
+
+ command_updater_.UpdateCommandEnabled(
+ IDC_SHOW_SYNC_SETUP, profile()->GetOriginalProfile()->IsSyncAccessible());
+
+ // Initialize other commands based on the window type.
+ bool normal_window = browser_->is_type_tabbed();
+
+ // Navigation commands
+ command_updater_.UpdateCommandEnabled(IDC_HOME, normal_window);
+
+ // Window management commands
+ // TODO(rohitrao): Disable fullscreen on non-Lion?
+ command_updater_.UpdateCommandEnabled(IDC_FULLSCREEN,
+ !(browser_->is_type_panel() && browser_->is_app()));
+ command_updater_.UpdateCommandEnabled(IDC_SELECT_NEXT_TAB, normal_window);
+ command_updater_.UpdateCommandEnabled(IDC_SELECT_PREVIOUS_TAB,
+ normal_window);
+ command_updater_.UpdateCommandEnabled(IDC_MOVE_TAB_NEXT, normal_window);
+ command_updater_.UpdateCommandEnabled(IDC_MOVE_TAB_PREVIOUS, normal_window);
+ command_updater_.UpdateCommandEnabled(IDC_SELECT_TAB_0, normal_window);
+ command_updater_.UpdateCommandEnabled(IDC_SELECT_TAB_1, normal_window);
+ command_updater_.UpdateCommandEnabled(IDC_SELECT_TAB_2, normal_window);
+ command_updater_.UpdateCommandEnabled(IDC_SELECT_TAB_3, normal_window);
+ command_updater_.UpdateCommandEnabled(IDC_SELECT_TAB_4, normal_window);
+ command_updater_.UpdateCommandEnabled(IDC_SELECT_TAB_5, normal_window);
+ command_updater_.UpdateCommandEnabled(IDC_SELECT_TAB_6, normal_window);
+ command_updater_.UpdateCommandEnabled(IDC_SELECT_TAB_7, normal_window);
+ command_updater_.UpdateCommandEnabled(IDC_SELECT_LAST_TAB, normal_window);
+#if defined(OS_WIN)
+ const bool metro_mode = base::win::IsMetroProcess();
+ command_updater_.UpdateCommandEnabled(IDC_METRO_SNAP_ENABLE, metro_mode);
+ command_updater_.UpdateCommandEnabled(IDC_METRO_SNAP_DISABLE, metro_mode);
+#endif
+#if defined(OS_MACOSX)
+ command_updater_.UpdateCommandEnabled(IDC_TABPOSE, normal_window);
+ command_updater_.UpdateCommandEnabled(IDC_PRESENTATION_MODE,
+ !(browser_->is_type_panel() && browser_->is_app()));
+#endif
+
+ // Clipboard commands
+ command_updater_.UpdateCommandEnabled(IDC_COPY_URL, !browser_->is_devtools());
+
+ // Find-in-page
+ command_updater_.UpdateCommandEnabled(IDC_FIND, !browser_->is_devtools());
+ command_updater_.UpdateCommandEnabled(IDC_FIND_NEXT,
+ !browser_->is_devtools());
+ command_updater_.UpdateCommandEnabled(IDC_FIND_PREVIOUS,
+ !browser_->is_devtools());
+
+ // Show various bits of UI
+ command_updater_.UpdateCommandEnabled(IDC_CLEAR_BROWSING_DATA, normal_window);
+
+ // The upgrade entry and the view incompatibility entry should always be
+ // enabled. Whether they are visible is a separate matter determined on menu
+ // show.
+ command_updater_.UpdateCommandEnabled(IDC_UPGRADE_DIALOG, true);
+ command_updater_.UpdateCommandEnabled(IDC_VIEW_INCOMPATIBILITIES, true);
+
+ // View Background Pages entry is always enabled, but is hidden if there are
+ // no background pages.
+ command_updater_.UpdateCommandEnabled(IDC_VIEW_BACKGROUND_PAGES, true);
+
+ // Toggle speech input
+ command_updater_.UpdateCommandEnabled(IDC_TOGGLE_SPEECH_INPUT, true);
+
+ // Initialize other commands whose state changes based on fullscreen mode.
+ UpdateCommandsForFullscreenMode(FULLSCREEN_DISABLED);
+
+ UpdateCommandsForContentRestrictionState();
+
+ UpdateCommandsForBookmarkEditing();
+
+ UpdateCommandsForIncognitoAvailability();
+}
+
+void BrowserCommandController::UpdateCommandsForIncognitoAvailability() {
+ IncognitoModePrefs::Availability incognito_availability =
+ IncognitoModePrefs::GetAvailability(profile()->GetPrefs());
+ command_updater_.UpdateCommandEnabled(
+ IDC_NEW_WINDOW,
+ incognito_availability != IncognitoModePrefs::FORCED);
+ command_updater_.UpdateCommandEnabled(
+ IDC_NEW_INCOGNITO_WINDOW,
+ incognito_availability != IncognitoModePrefs::DISABLED);
+
+ // Bookmark manager and settings page/subpages are forced to open in normal
+ // mode. For this reason we disable these commands when incognito is forced.
+ const bool command_enabled =
+ incognito_availability != IncognitoModePrefs::FORCED;
+ command_updater_.UpdateCommandEnabled(
+ IDC_SHOW_BOOKMARK_MANAGER,
+ browser_defaults::bookmarks_enabled && command_enabled);
+ ExtensionService* extension_service = profile()->GetExtensionService();
+ bool enable_extensions =
+ extension_service && extension_service->extensions_enabled();
+ command_updater_.UpdateCommandEnabled(IDC_MANAGE_EXTENSIONS,
+ enable_extensions && command_enabled);
+
+ const bool show_main_ui =
+ IsShowingMainUI(window() && window()->IsFullscreen());
+ command_updater_.UpdateCommandEnabled(IDC_IMPORT_SETTINGS,
+ show_main_ui && command_enabled);
+ command_updater_.UpdateCommandEnabled(IDC_OPTIONS,
+ show_main_ui && command_enabled);
+}
+
+void BrowserCommandController::UpdateCommandsForTabState() {
+ TabContents* current_tab_contents = browser_->GetActiveTabContents();
+ if (!current_tab_contents) // May be NULL during tab restore.
+ return;
+ WebContents* current_web_contents = current_tab_contents->web_contents();
+
+ // Navigation commands
+ command_updater_.UpdateCommandEnabled(IDC_BACK, CanGoBack(browser_));
+ command_updater_.UpdateCommandEnabled(IDC_FORWARD, CanGoForward(browser_));
+ command_updater_.UpdateCommandEnabled(IDC_RELOAD, CanReload(browser_));
+ command_updater_.UpdateCommandEnabled(IDC_RELOAD_IGNORING_CACHE,
+ CanReload(browser_));
+
+ // Window management commands
+ command_updater_.UpdateCommandEnabled(IDC_DUPLICATE_TAB,
+ !browser_->is_app() && CanDuplicateTab(browser_));
+
+ // Page-related commands
+ window()->SetStarredState(
+ current_tab_contents->bookmark_tab_helper()->is_starred());
+ window()->SetZoomIconState(
+ current_tab_contents->zoom_controller()->zoom_icon_state());
+ window()->SetZoomIconTooltipPercent(
+ current_tab_contents->zoom_controller()->zoom_percent());
+ command_updater_.UpdateCommandEnabled(IDC_VIEW_SOURCE,
+ CanViewSource(browser_));
+ command_updater_.UpdateCommandEnabled(IDC_EMAIL_PAGE_LOCATION,
+ CanEmailPageLocation(browser_));
+ if (browser_->is_devtools())
+ command_updater_.UpdateCommandEnabled(IDC_OPEN_FILE, false);
+
+ // Changing the encoding is not possible on Chrome-internal webpages.
+ NavigationController& nc = current_web_contents->GetController();
+ bool is_chrome_internal = HasInternalURL(nc.GetActiveEntry()) ||
+ current_web_contents->ShowingInterstitialPage();
+ command_updater_.UpdateCommandEnabled(IDC_ENCODING_MENU,
+ !is_chrome_internal && current_web_contents->IsSavable());
+
+ // Show various bits of UI
+ // TODO(pinkerton): Disable app-mode in the model until we implement it
+ // on the Mac. Be sure to remove both ifdefs. http://crbug.com/13148
+#if !defined(OS_MACOSX)
+ command_updater_.UpdateCommandEnabled(
+ IDC_CREATE_SHORTCUTS,
+ CanCreateApplicationShortcuts(browser_));
+#endif
+
+ UpdateCommandsForContentRestrictionState();
+ UpdateCommandsForBookmarkEditing();
+}
+
+void BrowserCommandController::UpdateCommandsForContentRestrictionState() {
+ int restrictions = GetContentRestrictions(browser_);
+
+ command_updater_.UpdateCommandEnabled(
+ IDC_COPY, !(restrictions & content::CONTENT_RESTRICTION_COPY));
+ command_updater_.UpdateCommandEnabled(
+ IDC_CUT, !(restrictions & content::CONTENT_RESTRICTION_CUT));
+ command_updater_.UpdateCommandEnabled(
+ IDC_PASTE, !(restrictions & content::CONTENT_RESTRICTION_PASTE));
+ UpdateSaveAsState();
+ UpdatePrintingState();
+}
+
+void BrowserCommandController::UpdateCommandsForDevTools() {
+ bool dev_tools_enabled =
+ !profile()->GetPrefs()->GetBoolean(prefs::kDevToolsDisabled);
+ command_updater_.UpdateCommandEnabled(IDC_DEV_TOOLS,
+ dev_tools_enabled);
+ command_updater_.UpdateCommandEnabled(IDC_DEV_TOOLS_CONSOLE,
+ dev_tools_enabled);
+ command_updater_.UpdateCommandEnabled(IDC_DEV_TOOLS_INSPECT,
+ dev_tools_enabled);
+}
+
+void BrowserCommandController::UpdateCommandsForBookmarkEditing() {
+ command_updater_.UpdateCommandEnabled(IDC_BOOKMARK_PAGE,
+ CanBookmarkCurrentPage(browser_));
+ command_updater_.UpdateCommandEnabled(IDC_BOOKMARK_ALL_TABS,
+ CanBookmarkAllTabs(browser_));
+ command_updater_.UpdateCommandEnabled(IDC_PIN_TO_START_SCREEN,
+ true);
+}
+
+void BrowserCommandController::UpdateCommandsForBookmarkBar() {
+ const bool show_main_ui =
+ IsShowingMainUI(window() && window()->IsFullscreen());
+ command_updater_.UpdateCommandEnabled(IDC_SHOW_BOOKMARK_BAR,
+ browser_defaults::bookmarks_enabled &&
+ !profile()->GetPrefs()->IsManagedPreference(prefs::kShowBookmarkBar) &&
+ show_main_ui);
+}
+
+void BrowserCommandController::UpdateCommandsForFullscreenMode(
+ FullScreenMode fullscreen_mode) {
+ const bool show_main_ui =
+ IsShowingMainUI(fullscreen_mode != FULLSCREEN_DISABLED);
+ bool main_not_fullscreen = show_main_ui &&
+ (fullscreen_mode == FULLSCREEN_DISABLED);
+
+ // Navigation commands
+ command_updater_.UpdateCommandEnabled(IDC_OPEN_CURRENT_URL, show_main_ui);
+
+ // Window management commands
+ command_updater_.UpdateCommandEnabled(
+ IDC_SHOW_AS_TAB,
+ !browser_->is_type_tabbed() && fullscreen_mode == FULLSCREEN_DISABLED);
+
+ // Focus various bits of UI
+ command_updater_.UpdateCommandEnabled(IDC_FOCUS_TOOLBAR, show_main_ui);
+ command_updater_.UpdateCommandEnabled(IDC_FOCUS_LOCATION, show_main_ui);
+ command_updater_.UpdateCommandEnabled(IDC_FOCUS_SEARCH, show_main_ui);
+ command_updater_.UpdateCommandEnabled(
+ IDC_FOCUS_MENU_BAR, main_not_fullscreen);
+ command_updater_.UpdateCommandEnabled(
+ IDC_FOCUS_NEXT_PANE, main_not_fullscreen);
+ command_updater_.UpdateCommandEnabled(
+ IDC_FOCUS_PREVIOUS_PANE, main_not_fullscreen);
+ command_updater_.UpdateCommandEnabled(
+ IDC_FOCUS_BOOKMARKS, main_not_fullscreen);
+
+ // Show various bits of UI
+ command_updater_.UpdateCommandEnabled(IDC_DEVELOPER_MENU, show_main_ui);
+ command_updater_.UpdateCommandEnabled(IDC_FEEDBACK, show_main_ui);
+ command_updater_.UpdateCommandEnabled(IDC_SHOW_SYNC_SETUP,
+ show_main_ui && profile()->GetOriginalProfile()->IsSyncAccessible());
+
+ // Settings page/subpages are forced to open in normal mode. We disable these
+ // commands when incognito is forced.
+ const bool options_enabled = show_main_ui &&
+ IncognitoModePrefs::GetAvailability(
+ profile()->GetPrefs()) != IncognitoModePrefs::FORCED;
+ command_updater_.UpdateCommandEnabled(IDC_OPTIONS, options_enabled);
+ command_updater_.UpdateCommandEnabled(IDC_IMPORT_SETTINGS, options_enabled);
+
+ command_updater_.UpdateCommandEnabled(IDC_EDIT_SEARCH_ENGINES, show_main_ui);
+ command_updater_.UpdateCommandEnabled(IDC_VIEW_PASSWORDS, show_main_ui);
+ command_updater_.UpdateCommandEnabled(IDC_ABOUT, show_main_ui);
+ command_updater_.UpdateCommandEnabled(IDC_SHOW_APP_MENU, show_main_ui);
+#if defined (ENABLE_PROFILING) && !defined(NO_TCMALLOC)
+ command_updater_.UpdateCommandEnabled(IDC_PROFILING_ENABLED, show_main_ui);
+#endif
+
+ // Disable explicit fullscreen toggling when in metro snap mode.
+ command_updater_.UpdateCommandEnabled(
+ IDC_FULLSCREEN,
+ fullscreen_mode != FULLSCREEN_METRO_SNAP);
+
+ UpdateCommandsForBookmarkBar();
+ UpdateCommandsForMultipleProfiles();
+}
+
+void BrowserCommandController::UpdateCommandsForMultipleProfiles() {
+ bool show_main_ui = IsShowingMainUI(window() && window()->IsFullscreen());
+ command_updater_.UpdateCommandEnabled(IDC_SHOW_AVATAR_MENU,
+ show_main_ui &&
+ !profile()->IsOffTheRecord() &&
+ ProfileManager::IsMultipleProfilesEnabled());
+}
+
+void BrowserCommandController::UpdatePrintingState() {
+ command_updater_.UpdateCommandEnabled(IDC_PRINT, CanPrint(browser_));
+ command_updater_.UpdateCommandEnabled(IDC_ADVANCED_PRINT,
+ CanAdvancedPrint(browser_));
+}
+
+void BrowserCommandController::UpdateSaveAsState() {
+ command_updater_.UpdateCommandEnabled(IDC_SAVE_PAGE, CanSavePage(browser_));
+}
+
+void BrowserCommandController::UpdateOpenFileState() {
+ bool enabled = true;
+ PrefService* local_state = g_browser_process->local_state();
+ if (local_state)
+ enabled = local_state->GetBoolean(prefs::kAllowFileSelectionDialogs);
+
+ command_updater_.UpdateCommandEnabled(IDC_OPEN_FILE, enabled);
+}
+
+void BrowserCommandController::UpdateReloadStopState(bool is_loading,
+ bool force) {
+ window()->UpdateReloadStopState(is_loading, force);
+ command_updater_.UpdateCommandEnabled(IDC_STOP, is_loading);
+}
+
+void BrowserCommandController::AddInterstitialObservers(TabContents* contents) {
+ registrar_.Add(this, content::NOTIFICATION_INTERSTITIAL_ATTACHED,
+ content::Source<WebContents>(contents->web_contents()));
+ registrar_.Add(this, content::NOTIFICATION_INTERSTITIAL_DETACHED,
+ content::Source<WebContents>(contents->web_contents()));
+}
+
+void BrowserCommandController::RemoveInterstitialObservers(
+ TabContents* contents) {
+ registrar_.Remove(this, content::NOTIFICATION_INTERSTITIAL_ATTACHED,
+ content::Source<WebContents>(contents->web_contents()));
+ registrar_.Remove(this, content::NOTIFICATION_INTERSTITIAL_DETACHED,
+ content::Source<WebContents>(contents->web_contents()));
+}
+
+BrowserWindow* BrowserCommandController::window() {
+ return browser_->window();
+}
+
+Profile* BrowserCommandController::profile() {
+ return browser_->profile();
+}
+
+} // namespace chrome
diff --git a/chrome/browser/ui/browser_command_controller.h b/chrome/browser/ui/browser_command_controller.h
new file mode 100644
index 0000000..909e7e7
--- /dev/null
+++ b/chrome/browser/ui/browser_command_controller.h
@@ -0,0 +1,188 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_BROWSER_COMMAND_CONTROLLER_H_
+#define CHROME_BROWSER_UI_BROWSER_COMMAND_CONTROLLER_H_
+#pragma once
+
+#include "chrome/browser/command_updater.h"
+#include "chrome/browser/prefs/pref_change_registrar.h"
+#include "chrome/browser/sessions/tab_restore_service_observer.h"
+#include "chrome/browser/sync/profile_sync_service_observer.h"
+#include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
+#include "content/public/browser/notification_registrar.h"
+#include "content/public/browser/notification_observer.h"
+#include "webkit/glue/window_open_disposition.h"
+
+class Browser;
+class BrowserWindow;
+class Profile;
+class TabContents;
+
+namespace content {
+struct NativeWebKeyboardEvent;
+}
+
+namespace chrome {
+
+class BrowserCommandController : public CommandUpdater::CommandUpdaterDelegate,
+ public content::NotificationObserver,
+ public TabStripModelObserver,
+ public TabRestoreServiceObserver,
+ public ProfileSyncServiceObserver {
+ public:
+ explicit BrowserCommandController(Browser* browser);
+ virtual ~BrowserCommandController();
+
+ CommandUpdater* command_updater() { return &command_updater_; }
+ bool block_command_execution() const { return block_command_execution_; }
+
+ // Returns true if |command_id| is a reserved command whose keyboard shortcuts
+ // should not be sent to the renderer or |event| was triggered by a key that
+ // we never want to send to the renderer.
+ bool IsReservedCommandOrKey(int command_id,
+ const content::NativeWebKeyboardEvent& event);
+
+ // Sets if command execution shall be blocked. If |block| is true then
+ // following calls to ExecuteCommand() or ExecuteCommandWithDisposition()
+ // method will not execute the command, and the last blocked command will be
+ // recorded for retrieval.
+ void SetBlockCommandExecution(bool block);
+
+ // Gets the last blocked command after calling SetBlockCommandExecution(true).
+ // Returns the command id or -1 if there is no command blocked. The
+ // disposition type of the command will be stored in |*disposition| if it's
+ // not NULL.
+ int GetLastBlockedCommand(WindowOpenDisposition* disposition);
+
+ // Notifies the controller that state has changed in one of the following
+ // areas and it should update command states.
+ void TabStateChanged();
+ void ContentRestrictionsChanged();
+ void FullscreenStateChanged();
+ void PrintingStateChanged();
+ void LoadingStateChanged(bool is_loading, bool force);
+ void SendToMobileStateChanged(bool send_to_mobile_available);
+
+ private:
+ enum FullScreenMode {
+ // Not in fullscreen mode.
+ FULLSCREEN_DISABLED,
+
+ // Fullscreen mode, occupying the whole screen.
+ FULLSCREEN_NORMAL,
+
+ // Fullscreen mode for metro snap, occupying the full height and 20% of
+ // the screen width.
+ FULLSCREEN_METRO_SNAP,
+ };
+
+ // Overridden from CommandUpdater::CommandUpdaterDelegate:
+ virtual void ExecuteCommandWithDisposition(
+ int id,
+ WindowOpenDisposition disposition) OVERRIDE;
+
+ // Overridden from content::NotificationObserver:
+ virtual void Observe(int type,
+ const content::NotificationSource& source,
+ const content::NotificationDetails& details) OVERRIDE;
+
+ // Overridden from TabStripModelObserver:
+ virtual void TabInsertedAt(TabContents* contents,
+ int index,
+ bool foreground) OVERRIDE;
+ virtual void TabDetachedAt(TabContents* contents, int index) OVERRIDE;
+ virtual void TabReplacedAt(TabStripModel* tab_strip_model,
+ TabContents* old_contents,
+ TabContents* new_contents,
+ int index) OVERRIDE;
+
+ // Overridden from TabRestoreServiceObserver:
+ virtual void TabRestoreServiceChanged(TabRestoreService* service) OVERRIDE;
+ virtual void TabRestoreServiceDestroyed(TabRestoreService* service) OVERRIDE;
+
+ // Overridden from ProfileSyncServiceObserver:
+ virtual void OnStateChanged() OVERRIDE;
+
+ // Returns true if the regular Chrome UI (not the fullscreen one and
+ // not the single-tab one) is shown. Used for updating window command states
+ // only. Consider using SupportsWindowFeature if you need the mentioned
+ // functionality anywhere else.
+ bool IsShowingMainUI(bool is_fullscreen);
+
+ // Initialize state for all browser commands.
+ void InitCommandState();
+
+ // Update commands whose state depends on incognito mode availability.
+ void UpdateCommandsForIncognitoAvailability();
+
+ // Update commands whose state depends on the tab's state.
+ void UpdateCommandsForTabState();
+
+ // Updates commands when the content's restrictions change.
+ void UpdateCommandsForContentRestrictionState();
+
+ // Updates commands for enabling developer tools.
+ void UpdateCommandsForDevTools();
+
+ // Updates commands for bookmark editing.
+ void UpdateCommandsForBookmarkEditing();
+
+ // Updates commands that affect the bookmark bar.
+ void UpdateCommandsForBookmarkBar();
+
+ // Update commands whose state depends on the type of fullscreen mode the
+ // window is in.
+ void UpdateCommandsForFullscreenMode(FullScreenMode fullscreen_mode);
+
+ // Update commands whose state depends on whether multiple profiles are
+ // allowed.
+ void UpdateCommandsForMultipleProfiles();
+
+ // Updates the printing command state.
+ void UpdatePrintingState();
+
+ // Updates the save-page-as command state.
+ void UpdateSaveAsState();
+
+ // Updates the open-file state (Mac Only).
+ void UpdateOpenFileState();
+
+ // Ask the Reload/Stop button to change its icon, and update the Stop command
+ // state. |is_loading| is true if the current WebContents is loading.
+ // |force| is true if the button should change its icon immediately.
+ void UpdateReloadStopState(bool is_loading, bool force);
+
+ // Add/remove observers for interstitial attachment/detachment from
+ // |contents|.
+ void AddInterstitialObservers(TabContents* contents);
+ void RemoveInterstitialObservers(TabContents* contents);
+
+ inline BrowserWindow* window();
+ inline Profile* profile();
+
+ Browser* browser_;
+
+ // The CommandUpdater that manages the browser window commands.
+ CommandUpdater command_updater_;
+
+ // Indicates if command execution is blocked.
+ bool block_command_execution_;
+
+ // Stores the last blocked command id when |block_command_execution_| is true.
+ int last_blocked_command_id_;
+
+ // Stores the disposition type of the last blocked command.
+ WindowOpenDisposition last_blocked_command_disposition_;
+
+ content::NotificationRegistrar registrar_;
+ PrefChangeRegistrar profile_pref_registrar_;
+ PrefChangeRegistrar local_pref_registrar_;
+
+ DISALLOW_COPY_AND_ASSIGN(BrowserCommandController);
+};
+
+} // namespace chrome
+
+#endif // CHROME_BROWSER_UI_BROWSER_COMMAND_CONTROLLER_H_
diff --git a/chrome/browser/ui/browser_commands.cc b/chrome/browser/ui/browser_commands.cc
index 8e386fc..2b3f468 100644
--- a/chrome/browser/ui/browser_commands.cc
+++ b/chrome/browser/ui/browser_commands.cc
@@ -7,25 +7,32 @@
#include "base/command_line.h"
#include "base/metrics/histogram.h"
#include "base/utf_string_conversions.h"
+#include "chrome/browser/bookmarks/bookmark_editor.h"
#include "chrome/browser/bookmarks/bookmark_model.h"
#include "chrome/browser/bookmarks/bookmark_utils.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chrome_page_zoom.h"
#include "chrome/browser/debugger/devtools_window.h"
+#include "chrome/browser/download/download_util.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/favicon/favicon_tab_helper.h"
#include "chrome/browser/lifetime/application_lifetime.h"
#include "chrome/browser/platform_util.h"
#include "chrome/browser/prefs/incognito_mode_prefs.h"
#include "chrome/browser/prefs/pref_service.h"
+#include "chrome/browser/printing/print_preview_tab_controller.h"
#include "chrome/browser/printing/print_view_manager.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/sessions/session_service_factory.h"
#include "chrome/browser/sessions/tab_restore_service_factory.h"
#include "chrome/browser/sessions/tab_restore_service.h"
+#include "chrome/browser/sessions/tab_restore_service_delegate.h"
#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_command_controller.h"
#include "chrome/browser/ui/browser_finder.h"
+#include "chrome/browser/ui/browser_tab_restore_service_delegate.h"
#include "chrome/browser/ui/browser_window.h"
+#include "chrome/browser/ui/constrained_window_tab_helper.h"
#include "chrome/browser/ui/find_bar/find_bar_controller.h"
#include "chrome/browser/ui/find_bar/find_tab_helper.h"
#include "chrome/browser/ui/omnibox/location_bar.h"
@@ -34,9 +41,11 @@
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/browser/ui/webui/feedback_ui.h"
#include "chrome/browser/ui/webui/ntp/app_launcher_handler.h"
+#include "chrome/browser/web_applications/web_app.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/net/url_util.h"
#include "chrome/common/pref_names.h"
+#include "content/public/common/content_restriction.h"
#include "content/public/browser/navigation_controller.h"
#include "content/public/browser/navigation_entry.h"
#include "content/public/browser/page_navigator.h"
@@ -123,8 +132,81 @@ void ReloadInternal(Browser* browser,
web_contents->GetController().Reload(true);
}
+bool HasConstrainedWindow(const Browser* browser) {
+ TabContents* tab_contents = browser->GetActiveTabContents();
+ return tab_contents && tab_contents->constrained_window_tab_helper()->
+ constrained_window_count();
+}
+
+bool PrintPreviewShowing(const Browser* browser) {
+ TabContents* contents = browser->GetActiveTabContents();
+ printing::PrintPreviewTabController* controller =
+ printing::PrintPreviewTabController::GetInstance();
+ return controller && (controller->GetPrintPreviewForTab(contents) ||
+ controller->is_creating_print_preview_tab());
+}
+
} // namespace
+bool IsCommandEnabled(Browser* browser, int command) {
+ return browser->command_controller()->command_updater()->IsCommandEnabled(
+ command);
+}
+
+bool SupportsCommand(Browser* browser, int command) {
+ return browser->command_controller()->command_updater()->SupportsCommand(
+ command);
+}
+
+bool ExecuteCommand(Browser* browser, int command) {
+ return browser->command_controller()->command_updater()->ExecuteCommand(
+ command);
+}
+
+bool ExecuteCommandWithDisposition(Browser* browser,
+ int command,
+ WindowOpenDisposition disposition) {
+ return browser->command_controller()->command_updater()->
+ ExecuteCommandWithDisposition(command, disposition);
+}
+
+void UpdateCommandEnabled(Browser* browser, int command, bool enabled) {
+ browser->command_controller()->command_updater()->UpdateCommandEnabled(
+ command, enabled);
+}
+
+void AddCommandObserver(Browser* browser,
+ int command,
+ CommandObserver* observer) {
+ browser->command_controller()->command_updater()->AddCommandObserver(
+ command, observer);
+}
+
+void RemoveCommandObserver(Browser* browser,
+ int command,
+ CommandObserver* observer) {
+ browser->command_controller()->command_updater()->RemoveCommandObserver(
+ command, observer);
+}
+
+int GetContentRestrictions(const Browser* browser) {
+ int content_restrictions = 0;
+ WebContents* current_tab = browser->GetActiveWebContents();
+ if (current_tab) {
+ content_restrictions = current_tab->GetContentRestrictions();
+ NavigationEntry* active_entry =
+ current_tab->GetController().GetActiveEntry();
+ // See comment in UpdateCommandsForTabState about why we call url().
+ if (!download_util::IsSavableURL(
+ active_entry ? active_entry->GetURL() : GURL()) ||
+ current_tab->ShowingInterstitialPage())
+ content_restrictions |= content::CONTENT_RESTRICTION_SAVE;
+ if (current_tab->ShowingInterstitialPage())
+ content_restrictions |= content::CONTENT_RESTRICTION_PRINT;
+ }
+ return content_restrictions;
+}
+
void NewEmptyWindow(Profile* profile) {
bool incognito = profile->IsOffTheRecord();
PrefService* prefs = profile->GetPrefs();
@@ -175,7 +257,7 @@ void OpenURLOffTheRecord(Profile* profile, const GURL& url) {
browser->window()->Show();
}
-bool CanGoBack(Browser* browser) {
+bool CanGoBack(const Browser* browser) {
return browser->GetActiveWebContents()->GetController().CanGoBack();
}
@@ -194,7 +276,7 @@ void GoBack(Browser* browser, WindowOpenDisposition disposition) {
}
}
-bool CanGoForward(Browser* browser) {
+bool CanGoForward(const Browser* browser) {
return browser->GetActiveWebContents()->GetController().CanGoForward();
}
@@ -227,6 +309,10 @@ void ReloadIgnoringCache(Browser* browser, WindowOpenDisposition disposition) {
ReloadInternal(browser, disposition, true);
}
+bool CanReload(const Browser* browser) {
+ return !browser->is_devtools();
+}
+
void Home(Browser* browser, WindowOpenDisposition disposition) {
content::RecordAction(UserMetricsAction("Home"));
browser->OpenURL(OpenURLParams(
@@ -315,6 +401,20 @@ void CloseTab(Browser* browser) {
browser->tab_strip_model()->CloseSelectedTabs();
}
+void RestoreTab(Browser* browser) {
+ content::RecordAction(UserMetricsAction("RestoreTab"));
+ TabRestoreService* service =
+ TabRestoreServiceFactory::GetForProfile(browser->profile());
+ if (service)
+ service->RestoreMostRecentEntry(browser->tab_restore_service_delegate());
+}
+
+bool CanRestoreTab(const Browser* browser) {
+ TabRestoreService* service =
+ TabRestoreServiceFactory::GetForProfile(browser->profile());
+ return service && !service->entries().empty();
+}
+
void SelectNextTab(Browser* browser) {
content::RecordAction(UserMetricsAction("SelectNextTab"));
browser->tab_strip_model()->SelectNextTab();
@@ -366,6 +466,11 @@ void DuplicateTab(Browser* browser) {
browser->DuplicateContentsAt(browser->active_index());
}
+bool CanDuplicateTab(const Browser* browser) {
+ WebContents* contents = browser->GetActiveWebContents();
+ return contents && contents->GetController().GetLastCommittedEntry();
+}
+
void WriteCurrentURLToClipboard(Browser* browser) {
// TODO(ericu): There isn't currently a metric for this. Should there be?
// We don't appear to track the action when it comes from the
@@ -422,6 +527,22 @@ void BookmarkCurrentPage(Browser* browser) {
}
}
+bool CanBookmarkCurrentPage(const Browser* browser) {
+ BookmarkModel* model = browser->profile()->GetBookmarkModel();
+ return browser_defaults::bookmarks_enabled &&
+ browser->profile()->GetPrefs()->GetBoolean(
+ prefs::kEditBookmarksEnabled) &&
+ model && model->IsLoaded() && browser->is_type_tabbed();
+}
+
+void BookmarkAllTabs(Browser* browser) {
+ BookmarkEditor::ShowBookmarkAllTabsDialog(browser);
+}
+
+bool CanBookmarkAllTabs(const Browser* browser) {
+ return browser->tab_count() > 1 && CanBookmarkCurrentPage(browser);
+}
+
#if !defined(OS_WIN)
void PinCurrentPageToStartScreen(Browser* browser) {
}
@@ -435,6 +556,17 @@ void SavePage(Browser* browser) {
current_tab->OnSavePage();
}
+bool CanSavePage(const Browser* browser) {
+ // LocalState can be NULL in tests.
+ if (g_browser_process->local_state() &&
+ !g_browser_process->local_state()->GetBoolean(
+ prefs::kAllowFileSelectionDialogs)) {
+ return false;
+ }
+ return !browser->is_devtools() &&
+ !(GetContentRestrictions(browser) & content::CONTENT_RESTRICTION_SAVE);
+}
+
void ShowFindBar(Browser* browser) {
browser->GetFindBarController()->Show();
}
@@ -473,10 +605,33 @@ void Print(Browser* browser) {
}
}
+bool CanPrint(const Browser* browser) {
+ // LocalState can be NULL in tests.
+ if (g_browser_process->local_state() &&
+ !g_browser_process->local_state()->GetBoolean(prefs::kPrintingEnabled)) {
+ return false;
+ }
+
+ // Do not print when a constrained window is showing. It's confusing.
+ return !(HasConstrainedWindow(browser) ||
+ GetContentRestrictions(browser) & content::CONTENT_RESTRICTION_PRINT);
+}
+
void AdvancedPrint(Browser* browser) {
browser->GetActiveTabContents()->print_view_manager()->AdvancedPrintNow();
}
+bool CanAdvancedPrint(const Browser* browser) {
+ // LocalState can be NULL in tests.
+ if (g_browser_process->local_state() &&
+ !g_browser_process->local_state()->GetBoolean(prefs::kPrintingEnabled)) {
+ return false;
+ }
+
+ // It is always possible to advanced print when print preview is visible.
+ return PrintPreviewShowing(browser) || CanPrint(browser);
+}
+
void EmailPageLocation(Browser* browser) {
content::RecordAction(UserMetricsAction("EmailPageLocation"));
WebContents* wc = browser->GetActiveWebContents();
@@ -490,6 +645,11 @@ void EmailPageLocation(Browser* browser) {
platform_util::OpenExternal(GURL(mailto));
}
+bool CanEmailPageLocation(const Browser* browser) {
+ return browser->toolbar_model()->ShouldDisplayURL() &&
+ browser->GetActiveWebContents()->GetURL().is_valid();
+}
+
void Cut(Browser* browser) {
content::RecordAction(UserMetricsAction("Cut"));
browser->window()->Cut();
@@ -756,4 +916,12 @@ void ViewSelectedSource(Browser* browser) {
ViewSource(browser, browser->GetActiveTabContents());
}
+bool CanViewSource(const Browser* browser) {
+ return browser->GetActiveWebContents()->GetController().CanViewSource();
+}
+
+bool CanCreateApplicationShortcuts(const Browser* browser) {
+ return web_app::IsValidUrl(browser->GetActiveWebContents()->GetURL());
+}
+
} // namespace chrome
diff --git a/chrome/browser/ui/browser_commands.h b/chrome/browser/ui/browser_commands.h
index a1a4c4d..30c2cc7 100644
--- a/chrome/browser/ui/browser_commands.h
+++ b/chrome/browser/ui/browser_commands.h
@@ -13,6 +13,7 @@
#include "webkit/glue/window_open_disposition.h"
class Browser;
+class CommandObserver;
class GURL;
class Profile;
class TabContents;
@@ -24,6 +25,20 @@ struct SSLStatus;
namespace chrome {
+// For all commands, where a tab is not specified, the active tab is assumed.
+
+bool IsCommandEnabled(Browser* browser, int command);
+bool SupportsCommand(Browser* browser, int command);
+bool ExecuteCommand(Browser* browser, int command);
+bool ExecuteCommandWithDisposition(Browser* browser,
+ int command,
+ WindowOpenDisposition disposition);
+void UpdateCommandEnabled(Browser* browser, int command, bool enabled);
+void AddCommandObserver(Browser*, int command, CommandObserver* observer);
+void RemoveCommandObserver(Browser*, int command, CommandObserver* observer);
+
+int GetContentRestrictions(const Browser* browser);
+
// Opens a new window with the default blank tab.
void NewEmptyWindow(Profile* profile);
@@ -39,15 +54,16 @@ void OpenWindowWithRestoredTabs(Profile* profile);
// |profile|, that session is re-used.
void OpenURLOffTheRecord(Profile* profile, const GURL& url);
-bool CanGoBack(Browser* browser);
+bool CanGoBack(const Browser* browser);
void GoBack(Browser* browser, WindowOpenDisposition disposition);
-bool CanGoForward(Browser* browser);
+bool CanGoForward(const Browser* browser);
void GoForward(Browser* browser, WindowOpenDisposition disposition);
bool NavigateToIndexWithDisposition(Browser* browser,
int index,
WindowOpenDisposition disp);
void Reload(Browser* browser, WindowOpenDisposition disposition);
void ReloadIgnoringCache(Browser* browser, WindowOpenDisposition disposition);
+bool CanReload(const Browser* browser);
void Home(Browser* browser, WindowOpenDisposition disposition);
void OpenCurrentURL(Browser* browser);
void Stop(Browser* browser);
@@ -56,6 +72,8 @@ void NewIncognitoWindow(Browser* browser);
void CloseWindow(Browser* browser);
void NewTab(Browser* browser);
void CloseTab(Browser* browser);
+void RestoreTab(Browser* browser);
+bool CanRestoreTab(const Browser* browser);
void SelectNextTab(Browser* browser);
void SelectPreviousTab(Browser* browser);
void OpenTabpose(Browser* browser); // Mac-only
@@ -64,12 +82,17 @@ void MoveTabPrevious(Browser* browser);
void SelectNumberedTab(Browser* browser, int index);
void SelectLastTab(Browser* browser);
void DuplicateTab(Browser* browser);
+bool CanDuplicateTab(const Browser* browser);
void WriteCurrentURLToClipboard(Browser* browser);
void ConvertPopupToTabbedBrowser(Browser* browser);
void Exit();
void BookmarkCurrentPage(Browser* browser);
+bool CanBookmarkCurrentPage(const Browser* browser);
+void BookmarkAllTabs(Browser* browser);
+bool CanBookmarkAllTabs(const Browser* browser);
void PinCurrentPageToStartScreen(Browser* browser);
void SavePage(Browser* browser);
+bool CanSavePage(const Browser* browser);
void ShowFindBar(Browser* browser);
void ShowPageInfo(Browser* browser,
content::WebContents* web_contents,
@@ -78,8 +101,11 @@ void ShowPageInfo(Browser* browser,
bool show_history);
void ShowChromeToMobileBubble(Browser* browser);
void Print(Browser* browser);
+bool CanPrint(const Browser* browser);
void AdvancedPrint(Browser* browser);
+bool CanAdvancedPrint(const Browser* browser);
void EmailPageLocation(Browser* browser);
+bool CanEmailPageLocation(const Browser* browser);
void Cut(Browser* browser);
void Copy(Browser* browser);
void Paste(Browser* browser);
@@ -115,6 +141,9 @@ void ViewSource(Browser* browser,
const std::string& content_state);
void ViewSelectedSource(Browser* browser);
+bool CanViewSource(const Browser* browser);
+
+bool CanCreateApplicationShortcuts(const Browser* browser);
} // namespace chrome
diff --git a/chrome/browser/ui/browser_unittest.cc b/chrome/browser/ui/browser_unittest.cc
index 9b0b052..5802e77 100644
--- a/chrome/browser/ui/browser_unittest.cc
+++ b/chrome/browser/ui/browser_unittest.cc
@@ -5,6 +5,7 @@
#include "chrome/browser/ui/browser.h"
#include "chrome/app/chrome_command_ids.h"
+#include "chrome/browser/ui/browser_command_controller.h"
#include "chrome/browser/ui/browser_window_state.h"
#include "chrome/test/base/browser_with_test_window_test.h"
#include "content/public/browser/native_web_keyboard_event.h"
@@ -36,8 +37,10 @@ TEST_F(BrowserWithTestWindowTest, IsReservedCommandOrKey) {
0,
base::Time::Now().ToDoubleT());
// F1-4 keys are reserved on Chrome OS.
- EXPECT_TRUE(browser()->IsReservedCommandOrKey(IDC_BACK, event));
+ EXPECT_TRUE(browser()->command_controller()->IsReservedCommandOrKey(IDC_BACK,
+ event));
// ..unless |command_id| is -1. crbug.com/122978
- EXPECT_FALSE(browser()->IsReservedCommandOrKey(-1, event));
+ EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(-1,
+ event));
#endif
}
diff --git a/chrome/browser/ui/cocoa/browser/avatar_button_controller.mm b/chrome/browser/ui/cocoa/browser/avatar_button_controller.mm
index a9ff524..91dbff2 100644
--- a/chrome/browser/ui/cocoa/browser/avatar_button_controller.mm
+++ b/chrome/browser/ui/cocoa/browser/avatar_button_controller.mm
@@ -15,6 +15,7 @@
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/profiles/profile_metrics.h"
#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/browser_window.h"
#import "chrome/browser/ui/cocoa/browser/avatar_menu_bubble_controller.h"
#import "chrome/browser/ui/cocoa/browser_window_controller.h"
@@ -158,7 +159,7 @@ const CGFloat kMenuYOffsetAdjust = 1.0;
if (menuController_)
return;
- DCHECK(browser_->command_updater()->IsCommandEnabled(IDC_SHOW_AVATAR_MENU));
+ DCHECK(chrome::IsCommandEnabled(browser_, IDC_SHOW_AVATAR_MENU));
NSWindowController* wc =
[browser_->window()->GetNativeWindow() windowController];
diff --git a/chrome/browser/ui/cocoa/browser_window_cocoa.mm b/chrome/browser/ui/cocoa/browser_window_cocoa.mm
index f3fe3e0..de4141e 100644
--- a/chrome/browser/ui/cocoa/browser_window_cocoa.mm
+++ b/chrome/browser/ui/cocoa/browser_window_cocoa.mm
@@ -16,6 +16,7 @@
#include "chrome/browser/prefs/pref_service.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_command_controller.h"
#include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/browser_window_state.h"
#import "chrome/browser/ui/cocoa/browser/avatar_button_controller.h"
@@ -509,7 +510,7 @@ bool BrowserWindowCocoa::PreHandleKeyboardEvent(
if (id == -1)
return false;
- if (browser_->IsReservedCommandOrKey(id, event)) {
+ if (browser_->command_controller()->IsReservedCommandOrKey(id, event)) {
return [BrowserWindowUtils handleKeyboardEvent:event.os_event
inWindow:window()];
}
diff --git a/chrome/browser/ui/cocoa/browser_window_controller.mm b/chrome/browser/ui/cocoa/browser_window_controller.mm
index 6f4a622..47e3176 100644
--- a/chrome/browser/ui/cocoa/browser_window_controller.mm
+++ b/chrome/browser/ui/cocoa/browser_window_controller.mm
@@ -26,6 +26,8 @@
#include "chrome/browser/themes/theme_service.h"
#include "chrome/browser/themes/theme_service_factory.h"
#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_command_controller.h"
+#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/browser_window_state.h"
#import "chrome/browser/ui/cocoa/background_gradient_view.h"
@@ -320,7 +322,7 @@ enum {
// Adds the toolbar to the content area.
toolbarController_.reset([[ToolbarController alloc]
initWithModel:browser->toolbar_model()
- commands:browser->command_updater()
+ commands:browser->command_controller()->command_updater()
profile:browser->profile()
browser:browser
resizeDelegate:self]);
@@ -1015,9 +1017,9 @@ enum {
if (action == @selector(commandDispatch:) ||
action == @selector(commandDispatchUsingKeyModifiers:)) {
NSInteger tag = [item tag];
- if (browser_->command_updater()->SupportsCommand(tag)) {
+ if (chrome::SupportsCommand(browser_.get(), tag)) {
// Generate return value (enabled state)
- enable = browser_->command_updater()->IsCommandEnabled(tag);
+ enable = chrome::IsCommandEnabled(browser_.get(), tag);
switch (tag) {
case IDC_CLOSE_TAB:
// Disable "close tab" if the receiving window is not tabbed.
@@ -1063,8 +1065,8 @@ enum {
// enable/disable the submenu's contents (per Apple's HIG).
EncodingMenuController encoding_controller;
if (encoding_controller.DoesCommandBelongToEncodingMenu(tag)) {
- enable &= browser_->command_updater()->IsCommandEnabled(
- IDC_ENCODING_MENU) ? YES : NO;
+ enable &= chrome::IsCommandEnabled(browser_.get(),
+ IDC_ENCODING_MENU) ? YES : NO;
}
}
@@ -1094,7 +1096,7 @@ enum {
targetController = [[sender window] windowController];
DCHECK([targetController isKindOfClass:[BrowserWindowController class]]);
DCHECK(targetController->browser_.get());
- targetController->browser_->ExecuteCommand([sender tag]);
+ chrome::ExecuteCommand(targetController->browser_.get(), [sender tag]);
}
// Same as |-commandDispatch:|, but executes commands using a disposition
@@ -1144,14 +1146,14 @@ enum {
}
}
DCHECK(targetController->browser_.get());
- targetController->browser_->ExecuteCommandWithDisposition(command,
- disposition);
+ chrome::ExecuteCommandWithDisposition(targetController->browser_.get(),
+ command, disposition);
}
// Called when another part of the internal codebase needs to execute a
// command.
- (void)executeCommand:(int)command {
- browser_->ExecuteCommandIfEnabled(command);
+ chrome::ExecuteCommand(browser_.get(), command);
}
// StatusBubble delegate method: tell the status bubble the frame it should
@@ -1704,14 +1706,17 @@ enum {
// TODO(pinkerton): figure out page-up, http://crbug.com/16305
} else if (deltaY < -0.5) {
// TODO(pinkerton): figure out page-down, http://crbug.com/16305
- browser_->ExecuteCommand(IDC_TABPOSE);
+ chrome::ExecuteCommand(browser_.get(), IDC_TABPOSE);
}
// Ensure the command is valid first (ExecuteCommand() won't do that) and
// then make it so.
- if (browser_->command_updater()->IsCommandEnabled(command))
- browser_->ExecuteCommandWithDisposition(command,
+ if (chrome::IsCommandEnabled(browser_.get(), command)) {
+ chrome::ExecuteCommandWithDisposition(
+ browser_.get(),
+ command,
event_utils::WindowOpenDispositionFromNSEvent(event));
+ }
}
// Documented in 10.6+, but present starting in 10.5. Called repeatedly during
@@ -1741,9 +1746,11 @@ enum {
command = IDC_ZOOM_MINUS;
}
- if (command && browser_->command_updater()->IsCommandEnabled(command)) {
+ if (command && chrome::IsCommandEnabled(browser_.get(), command)) {
currentZoomStepDelta_ += (command == IDC_ZOOM_PLUS) ? 1 : -1;
- browser_->ExecuteCommandWithDisposition(command,
+ chrome::ExecuteCommandWithDisposition(
+ browser_.get(),
+ command,
event_utils::WindowOpenDispositionFromNSEvent(event));
}
}
@@ -1942,7 +1949,7 @@ willAnimateFromState:(bookmarks::VisualState)oldState
- (void)handleLionToggleFullscreen {
DCHECK(base::mac::IsOSLionOrLater());
- browser_->ExecuteCommand(IDC_FULLSCREEN);
+ chrome::ExecuteCommand(browser_.get(), IDC_FULLSCREEN);
}
// On Lion, this method is called by either the Lion fullscreen button or the
@@ -1997,7 +2004,7 @@ willAnimateFromState:(bookmarks::VisualState)oldState
// Called only by the presentation mode toggle button.
DCHECK(base::mac::IsOSLionOrLater());
enteredPresentationModeFromFullscreen_ = YES;
- browser_->ExecuteCommand(IDC_PRESENTATION_MODE);
+ chrome::ExecuteCommand(browser_.get(), IDC_PRESENTATION_MODE);
}
// On Lion, this function is called by either the presentation mode toggle
diff --git a/chrome/browser/ui/cocoa/browser_window_utils.mm b/chrome/browser/ui/cocoa/browser_window_utils.mm
index f9c7aae..de2e3d6 100644
--- a/chrome/browser/ui/cocoa/browser_window_utils.mm
+++ b/chrome/browser/ui/cocoa/browser_window_utils.mm
@@ -66,7 +66,8 @@ using content::NativeWebKeyboardEvent;
// "Close window" doesn't use the |commandDispatch:| mechanism. Menu items
// that do not correspond to IDC_ constants need no special treatment however,
- // as they can't be blacklisted in |Browser::IsReservedCommandOrKey()| anyhow.
+ // as they can't be blacklisted in
+ // |BrowserCommandController::IsReservedCommandOrKey()| anyhow.
if (item && [item action] == @selector(performClose:))
return IDC_CLOSE_WINDOW;
diff --git a/chrome/browser/ui/cocoa/command_observer_bridge.h b/chrome/browser/ui/cocoa/command_observer_bridge.h
index a10c918..4e3159f 100644
--- a/chrome/browser/ui/cocoa/command_observer_bridge.h
+++ b/chrome/browser/ui/cocoa/command_observer_bridge.h
@@ -9,10 +9,12 @@
#import <Cocoa/Cocoa.h>
#include "base/compiler_specific.h"
-#include "chrome/browser/command_updater.h"
+#include "chrome/browser/command_observer.h"
@protocol CommandObserverProtocol;
+class CommandUpdater;
+
// A C++ bridge class that handles listening for updates to commands and
// passing them back to an object that supports the protocol delcared below.
// The observer will create one of these bridges, call ObserveCommand() on the
@@ -21,7 +23,7 @@
// bridge will handle automatically unregistering for updates, so there's no
// need to do that manually.
-class CommandObserverBridge : public CommandUpdater::CommandObserver {
+class CommandObserverBridge : public CommandObserver {
public:
CommandObserverBridge(id<CommandObserverProtocol> observer,
CommandUpdater* commands);
@@ -31,7 +33,7 @@ class CommandObserverBridge : public CommandUpdater::CommandObserver {
void ObserveCommand(int command);
protected:
- // Overridden from CommandUpdater::CommandObserver
+ // Overridden from CommandObserver
virtual void EnabledStateChangedForCommand(int command,
bool enabled) OVERRIDE;
diff --git a/chrome/browser/ui/cocoa/command_observer_bridge.mm b/chrome/browser/ui/cocoa/command_observer_bridge.mm
index 0ffea97..aa01368 100644
--- a/chrome/browser/ui/cocoa/command_observer_bridge.mm
+++ b/chrome/browser/ui/cocoa/command_observer_bridge.mm
@@ -3,6 +3,7 @@
// found in the LICENSE file.
#import "chrome/browser/ui/cocoa/command_observer_bridge.h"
+#include "chrome/browser/command_updater.h"
#include "base/logging.h"
diff --git a/chrome/browser/ui/cocoa/command_observer_bridge_unittest.mm b/chrome/browser/ui/cocoa/command_observer_bridge_unittest.mm
index 90c5b8a..ed973b1 100644
--- a/chrome/browser/ui/cocoa/command_observer_bridge_unittest.mm
+++ b/chrome/browser/ui/cocoa/command_observer_bridge_unittest.mm
@@ -6,6 +6,7 @@
#include "base/memory/scoped_nsobject.h"
#include "base/memory/scoped_ptr.h"
+#include "chrome/browser/command_updater.h"
#import "chrome/browser/ui/cocoa/command_observer_bridge.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/platform_test.h"
diff --git a/chrome/browser/ui/cocoa/fullscreen_exit_bubble_controller.mm b/chrome/browser/ui/cocoa/fullscreen_exit_bubble_controller.mm
index 3f0e1d8..4f91ca6 100644
--- a/chrome/browser/ui/cocoa/fullscreen_exit_bubble_controller.mm
+++ b/chrome/browser/ui/cocoa/fullscreen_exit_bubble_controller.mm
@@ -11,6 +11,7 @@
#include "base/utf_string_conversions.h"
#include "chrome/app/chrome_command_ids.h"
#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_commands.h"
#import "chrome/browser/ui/cocoa/browser_window_controller.h"
#include "chrome/browser/ui/cocoa/event_utils.h"
#import "chrome/browser/ui/cocoa/fullscreen_exit_bubble_controller.h"
@@ -150,7 +151,7 @@ const float kHideDuration = 0.7;
- (BOOL) textView:(NSTextView*)textView
clickedOnLink:(id)link
atIndex:(NSUInteger)charIndex {
- browser_->ExecuteCommand(IDC_FULLSCREEN);
+ chrome::ExecuteCommand(browser_, IDC_FULLSCREEN);
return YES;
}
diff --git a/chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h b/chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h
index 189cb33..87a4ba5 100644
--- a/chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h
+++ b/chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h
@@ -14,6 +14,7 @@
#include "base/memory/scoped_ptr.h"
#include "base/memory/scoped_vector.h"
#include "base/memory/weak_ptr.h"
+#include "chrome/browser/command_observer.h"
#include "chrome/browser/extensions/image_loading_tracker.h"
#include "chrome/browser/prefs/pref_member.h"
#include "chrome/browser/ui/browser.h"
@@ -46,7 +47,7 @@ class LocationBarViewMac : public LocationBar,
public LocationBarTesting,
public OmniboxEditController,
public content::NotificationObserver,
- public CommandUpdater::CommandObserver {
+ public CommandObserver {
public:
LocationBarViewMac(AutocompleteTextField* field,
CommandUpdater* command_updater,
@@ -163,7 +164,7 @@ class LocationBarViewMac : public LocationBar,
const content::NotificationSource& source,
const content::NotificationDetails& details) OVERRIDE;
- // CommandUpdater::CommandObserver:
+ // CommandObserver:
virtual void EnabledStateChangedForCommand(int id, bool enabled) OVERRIDE;
private:
diff --git a/chrome/browser/ui/cocoa/toolbar/toolbar_controller.mm b/chrome/browser/ui/cocoa/toolbar/toolbar_controller.mm
index 9b93756..0512e29 100644
--- a/chrome/browser/ui/cocoa/toolbar/toolbar_controller.mm
+++ b/chrome/browser/ui/cocoa/toolbar/toolbar_controller.mm
@@ -17,6 +17,7 @@
#include "chrome/browser/autocomplete/autocomplete_classifier.h"
#include "chrome/browser/autocomplete/autocomplete_classifier_factory.h"
#include "chrome/browser/autocomplete/autocomplete_match.h"
+#include "chrome/browser/command_updater.h"
#include "chrome/browser/net/url_fixer_upper.h"
#include "chrome/browser/prefs/pref_service.h"
#include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/ui/cocoa/toolbar/toolbar_controller_unittest.mm b/chrome/browser/ui/cocoa/toolbar/toolbar_controller_unittest.mm
index 18bf60c..0431b485 100644
--- a/chrome/browser/ui/cocoa/toolbar/toolbar_controller_unittest.mm
+++ b/chrome/browser/ui/cocoa/toolbar/toolbar_controller_unittest.mm
@@ -6,6 +6,9 @@
#import "base/memory/scoped_nsobject.h"
#include "chrome/app/chrome_command_ids.h"
+#include "chrome/browser/command_updater.h"
+#include "chrome/browser/ui/browser_command_controller.h"
+#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/cocoa/cocoa_profile_test.h"
#import "chrome/browser/ui/cocoa/gradient_button_cell.h"
#import "chrome/browser/ui/cocoa/toolbar/toolbar_controller.h"
@@ -50,7 +53,8 @@ class ToolbarControllerTest : public CocoaProfileTest {
CocoaProfileTest::SetUp();
ASSERT_TRUE(browser());
- CommandUpdater* updater = browser()->command_updater();
+ CommandUpdater* updater =
+ browser()->command_controller()->command_updater();
// The default state for the commands is true, set a couple to false to
// ensure they get picked up correct on initialization
updater->UpdateCommandEnabled(IDC_BACK, false);
@@ -58,7 +62,7 @@ class ToolbarControllerTest : public CocoaProfileTest {
resizeDelegate_.reset([[ViewResizerPong alloc] init]);
bar_.reset(
[[ToolbarController alloc] initWithModel:browser()->toolbar_model()
- commands:browser()->command_updater()
+ commands:browser()->command_controller()->command_updater()
profile:profile()
browser:browser()
resizeDelegate:resizeDelegate_.get()]);
@@ -88,7 +92,7 @@ TEST_VIEW(ToolbarControllerTest, [bar_ view])
// Test the initial state that everything is sync'd up
TEST_F(ToolbarControllerTest, InitialState) {
- CommandUpdater* updater = browser()->command_updater();
+ CommandUpdater* updater = browser()->command_controller()->command_updater();
CompareState(updater, [bar_ toolbarViews]);
}
@@ -131,11 +135,11 @@ TEST_F(ToolbarControllerTest, NoLocationBar) {
// Make some changes to the enabled state of a few of the buttons and ensure
// that we're still in sync.
TEST_F(ToolbarControllerTest, UpdateEnabledState) {
- CommandUpdater* updater = browser()->command_updater();
- EXPECT_FALSE(updater->IsCommandEnabled(IDC_BACK));
- EXPECT_FALSE(updater->IsCommandEnabled(IDC_FORWARD));
- updater->UpdateCommandEnabled(IDC_BACK, true);
- updater->UpdateCommandEnabled(IDC_FORWARD, true);
+ EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_BACK));
+ EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_FORWARD));
+ chrome::UpdateCommandEnabled(browser(), IDC_BACK, true);
+ chrome::UpdateCommandEnabled(browser(), IDC_FORWARD, true);
+ CommandUpdater* updater = browser()->command_controller()->command_updater();
CompareState(updater, [bar_ toolbarViews]);
}
diff --git a/chrome/browser/ui/fullscreen_exit_bubble.cc b/chrome/browser/ui/fullscreen_exit_bubble.cc
index 5c7ca3f..cdc0650 100644
--- a/chrome/browser/ui/fullscreen_exit_bubble.cc
+++ b/chrome/browser/ui/fullscreen_exit_bubble.cc
@@ -8,6 +8,7 @@
#include "chrome/app/chrome_command_ids.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_commands.h"
#include "grit/generated_resources.h"
#include "grit/ui_strings.h"
#include "ui/base/l10n/l10n_util.h"
@@ -108,7 +109,7 @@ void FullscreenExitBubble::CheckMousePosition() {
}
void FullscreenExitBubble::ToggleFullscreen() {
- browser_->ExecuteCommand(IDC_FULLSCREEN);
+ chrome::ExecuteCommand(browser_, IDC_FULLSCREEN);
}
void FullscreenExitBubble::Accept() {
diff --git a/chrome/browser/ui/gtk/avatar_menu_button_gtk.cc b/chrome/browser/ui/gtk/avatar_menu_button_gtk.cc
index c8560c4..a1c1034 100644
--- a/chrome/browser/ui/gtk/avatar_menu_button_gtk.cc
+++ b/chrome/browser/ui/gtk/avatar_menu_button_gtk.cc
@@ -11,6 +11,7 @@
#include "chrome/browser/profiles/profile_metrics.h"
#include "chrome/browser/profiles/profile_info_util.h"
#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/gtk/avatar_menu_bubble_gtk.h"
#include "chrome/browser/ui/gtk/bubble/bubble_gtk.h"
#include "ui/gfx/gtk_util.h"
@@ -67,7 +68,7 @@ void AvatarMenuButtonGtk::OnSizeAllocate(GtkWidget* widget,
}
void AvatarMenuButtonGtk::ShowAvatarBubble() {
- DCHECK(browser_->command_updater()->IsCommandEnabled(IDC_SHOW_AVATAR_MENU));
+ DCHECK(chrome::IsCommandEnabled(browser_, IDC_SHOW_AVATAR_MENU));
// Only show the avatar bubble if the avatar button is in the title bar.
if (gtk_widget_get_parent_window(widget_.get()))
new AvatarMenuBubbleGtk(browser_, widget_.get(), arrow_location_, NULL);
diff --git a/chrome/browser/ui/gtk/back_forward_button_gtk.cc b/chrome/browser/ui/gtk/back_forward_button_gtk.cc
index 30fb2c2..1168557 100644
--- a/chrome/browser/ui/gtk/back_forward_button_gtk.cc
+++ b/chrome/browser/ui/gtk/back_forward_button_gtk.cc
@@ -11,6 +11,7 @@
#include "chrome/app/chrome_command_ids.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/gtk/event_utils.h"
#include "chrome/browser/ui/gtk/gtk_theme_service.h"
#include "chrome/browser/ui/gtk/gtk_util.h"
@@ -90,7 +91,8 @@ void BackForwardButtonGtk::ShowBackForwardMenu(int button, guint32 event_time) {
void BackForwardButtonGtk::OnClick(GtkWidget* widget) {
weak_factory_.InvalidateWeakPtrs();
- browser_->ExecuteCommandWithDisposition(
+ chrome::ExecuteCommandWithDisposition(
+ browser_,
is_forward_ ? IDC_FORWARD : IDC_BACK,
event_utils::DispositionForCurrentButtonPressEvent());
}
diff --git a/chrome/browser/ui/gtk/browser_titlebar.cc b/chrome/browser/ui/gtk/browser_titlebar.cc
index 4121159..b04eb04 100644
--- a/chrome/browser/ui/gtk/browser_titlebar.cc
+++ b/chrome/browser/ui/gtk/browser_titlebar.cc
@@ -938,8 +938,7 @@ bool BrowserTitlebar::IsCommandIdEnabled(int command_id) const {
if (command_id == kShowWindowDecorationsCommand)
return true;
- return browser_window_->browser()->command_updater()->
- IsCommandEnabled(command_id);
+ return chrome::IsCommandEnabled(browser_window_->browser(), command_id);
}
bool BrowserTitlebar::IsCommandIdChecked(int command_id) const {
@@ -972,7 +971,7 @@ void BrowserTitlebar::ExecuteCommand(int command_id) {
return;
}
- browser_window_->browser()->ExecuteCommand(command_id);
+ chrome::ExecuteCommand(browser_window_->browser(), command_id);
}
bool BrowserTitlebar::GetAcceleratorForCommandId(
diff --git a/chrome/browser/ui/gtk/browser_toolbar_gtk.cc b/chrome/browser/ui/gtk/browser_toolbar_gtk.cc
index 4a89fa6..35a56ab 100644
--- a/chrome/browser/ui/gtk/browser_toolbar_gtk.cc
+++ b/chrome/browser/ui/gtk/browser_toolbar_gtk.cc
@@ -104,10 +104,10 @@ BrowserToolbarGtk::BrowserToolbarGtk(Browser* browser, BrowserWindowGtk* window)
window_(window) {
wrench_menu_model_.reset(new WrenchMenuModel(this, browser_));
- browser_->command_updater()->AddCommandObserver(IDC_BACK, this);
- browser_->command_updater()->AddCommandObserver(IDC_FORWARD, this);
- browser_->command_updater()->AddCommandObserver(IDC_HOME, this);
- browser_->command_updater()->AddCommandObserver(IDC_BOOKMARK_PAGE, this);
+ chrome::AddCommandObserver(browser_, IDC_BACK, this);
+ chrome::AddCommandObserver(browser_, IDC_FORWARD, this);
+ chrome::AddCommandObserver(browser_, IDC_HOME, this);
+ chrome::AddCommandObserver(browser_, IDC_BOOKMARK_PAGE, this);
registrar_.Add(this,
chrome::NOTIFICATION_UPGRADE_RECOMMENDED,
@@ -118,10 +118,10 @@ BrowserToolbarGtk::BrowserToolbarGtk(Browser* browser, BrowserWindowGtk* window)
}
BrowserToolbarGtk::~BrowserToolbarGtk() {
- browser_->command_updater()->RemoveCommandObserver(IDC_BACK, this);
- browser_->command_updater()->RemoveCommandObserver(IDC_FORWARD, this);
- browser_->command_updater()->RemoveCommandObserver(IDC_HOME, this);
- browser_->command_updater()->RemoveCommandObserver(IDC_BOOKMARK_PAGE, this);
+ chrome::RemoveCommandObserver(browser_, IDC_BACK, this);
+ chrome::RemoveCommandObserver(browser_, IDC_FORWARD, this);
+ chrome::RemoveCommandObserver(browser_, IDC_HOME, this);
+ chrome::RemoveCommandObserver(browser_, IDC_BOOKMARK_PAGE, this);
offscreen_entry_.Destroy();
@@ -303,7 +303,7 @@ void BrowserToolbarGtk::ShowAppMenu() {
wrench_menu_->PopupAsFromKeyEvent(wrench_menu_button_->widget());
}
-// CommandUpdater::CommandObserver ---------------------------------------------
+// CommandObserver -------------------------------------------------------------
void BrowserToolbarGtk::EnabledStateChangedForCommand(int id, bool enabled) {
GtkWidget* widget = NULL;
diff --git a/chrome/browser/ui/gtk/browser_toolbar_gtk.h b/chrome/browser/ui/gtk/browser_toolbar_gtk.h
index 08d9f6b..a6593d9 100644
--- a/chrome/browser/ui/gtk/browser_toolbar_gtk.h
+++ b/chrome/browser/ui/gtk/browser_toolbar_gtk.h
@@ -11,7 +11,7 @@
#include "base/compiler_specific.h"
#include "base/memory/scoped_ptr.h"
-#include "chrome/browser/command_updater.h"
+#include "chrome/browser/command_observer.h"
#include "chrome/browser/prefs/pref_member.h"
#include "chrome/browser/ui/gtk/custom_button.h"
#include "chrome/browser/ui/gtk/menu_gtk.h"
@@ -41,7 +41,7 @@ class WebContents;
// View class that displays the GTK version of the toolbar and routes gtk
// events back to the Browser.
-class BrowserToolbarGtk : public CommandUpdater::CommandObserver,
+class BrowserToolbarGtk : public CommandObserver,
public ui::AcceleratorProvider,
public MenuGtk::Delegate,
public content::NotificationObserver {
@@ -87,7 +87,7 @@ class BrowserToolbarGtk : public CommandUpdater::CommandObserver,
void ShowAppMenu();
- // Overridden from CommandUpdater::CommandObserver:
+ // Overridden from CommandObserver:
virtual void EnabledStateChangedForCommand(int id, bool enabled) OVERRIDE;
// Overridden from MenuGtk::Delegate:
diff --git a/chrome/browser/ui/gtk/browser_window_gtk.cc b/chrome/browser/ui/gtk/browser_window_gtk.cc
index b3c76b3..0c54248 100644
--- a/chrome/browser/ui/gtk/browser_window_gtk.cc
+++ b/chrome/browser/ui/gtk/browser_window_gtk.cc
@@ -37,6 +37,7 @@
#include "chrome/browser/ui/app_modal_dialogs/app_modal_dialog_queue.h"
#include "chrome/browser/ui/bookmarks/bookmark_tab_helper.h"
#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_command_controller.h"
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/browser_dialogs.h"
#include "chrome/browser/ui/browser_list.h"
@@ -1179,20 +1180,22 @@ bool BrowserWindowGtk::PreHandleKeyboardEvent(
// 1. The logic is a little complicated.
// 2. We should be careful not to introduce any accelerators that trigger
// customized code instead of browser commands.
- browser_->SetBlockCommandExecution(true);
+ browser_->command_controller()->SetBlockCommandExecution(true);
gtk_window_activate_key(window_, os_event);
// We don't need to care about the WindowOpenDisposition value,
// because all commands executed in this path use the default value.
- id = browser_->GetLastBlockedCommand(NULL);
- browser_->SetBlockCommandExecution(false);
+ id = browser_->command_controller()->GetLastBlockedCommand(NULL);
+ browser_->command_controller()->SetBlockCommandExecution(false);
}
if (id == -1)
return false;
// Executing the command may cause |this| object to be destroyed.
- if (browser_->IsReservedCommandOrKey(id, event) && !event.match_edit_command)
- return browser_->ExecuteCommandIfEnabled(id);
+ if (browser_->command_controller()->IsReservedCommandOrKey(id, event) &&
+ !event.match_edit_command) {
+ return chrome::ExecuteCommand(browser_.get(), id);
+ }
// The |event| is a keyboard shortcut.
DCHECK(is_keyboard_shortcut != NULL);
@@ -1217,7 +1220,7 @@ void BrowserWindowGtk::HandleKeyboardEvent(
// gtk_window_activate_key() takes care of it automatically.
int id = GetCustomCommandId(os_event);
if (id != -1)
- browser_->ExecuteCommandIfEnabled(id);
+ chrome::ExecuteCommand(browser_.get(), id);
else
gtk_window_activate_key(window_, os_event);
}
@@ -2205,7 +2208,7 @@ gboolean BrowserWindowGtk::OnGtkAccelerator(GtkAccelGroup* accel_group,
BrowserWindowGtk* browser_window =
GetBrowserWindowForNativeWindow(GTK_WINDOW(acceleratable));
DCHECK(browser_window != NULL);
- return browser_window->browser()->ExecuteCommandIfEnabled(command_id);
+ return chrome::ExecuteCommand(browser_window->browser(), command_id);
}
// Let the focused widget have first crack at the key event so we don't
@@ -2226,7 +2229,7 @@ gboolean BrowserWindowGtk::OnKeyPress(GtkWidget* widget, GdkEventKey* event) {
if (command_id == -1)
command_id = GetPreHandleCommandId(event);
- if (command_id != -1 && browser_->ExecuteCommandIfEnabled(command_id))
+ if (command_id != -1 && chrome::ExecuteCommand(browser_.get(), command_id))
return TRUE;
// Propagate the key event to child widget first, so we don't override their
diff --git a/chrome/browser/ui/gtk/global_menu_bar.cc b/chrome/browser/ui/gtk/global_menu_bar.cc
index 6e81049..7ea211d 100644
--- a/chrome/browser/ui/gtk/global_menu_bar.cc
+++ b/chrome/browser/ui/gtk/global_menu_bar.cc
@@ -11,6 +11,7 @@
#include "chrome/browser/prefs/pref_service.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/gtk/accelerators_gtk.h"
#include "chrome/browser/ui/gtk/gtk_theme_service.h"
#include "chrome/browser/ui/gtk/gtk_util.h"
@@ -169,9 +170,8 @@ GlobalMenuBar::GlobalMenuBar(Browser* browser)
for (CommandIDMenuItemMap::const_iterator it = id_to_menu_item_.begin();
it != id_to_menu_item_.end(); ++it) {
// Get the starting enabled state.
- gtk_widget_set_sensitive(
- it->second,
- browser_->command_updater()->IsCommandEnabled(it->first));
+ gtk_widget_set_sensitive(it->second,
+ chrome::IsCommandEnabled(browser_, it->first));
// Set the accelerator for each menu item.
AcceleratorsGtk* accelerators = AcceleratorsGtk::GetInstance();
@@ -186,7 +186,7 @@ GlobalMenuBar::GlobalMenuBar(Browser* browser)
GTK_ACCEL_VISIBLE);
}
- browser_->command_updater()->AddCommandObserver(it->first, this);
+ chrome::AddCommandObserver(browser_, it->first, this);
}
pref_change_registrar_.Init(browser_->profile()->GetPrefs());
@@ -202,7 +202,7 @@ GlobalMenuBar::~GlobalMenuBar() {
void GlobalMenuBar::Disable() {
for (CommandIDMenuItemMap::const_iterator it = id_to_menu_item_.begin();
it != id_to_menu_item_.end(); ++it) {
- browser_->command_updater()->RemoveCommandObserver(it->first, this);
+ chrome::RemoveCommandObserver(browser_, it->first, this);
}
id_to_menu_item_.clear();
@@ -308,5 +308,5 @@ void GlobalMenuBar::OnItemActivated(GtkWidget* sender) {
return;
int id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(sender), "command-id"));
- browser_->ExecuteCommandIfEnabled(id);
+ chrome::ExecuteCommand(browser_, id);
}
diff --git a/chrome/browser/ui/gtk/global_menu_bar.h b/chrome/browser/ui/gtk/global_menu_bar.h
index 23c7a69..7ddb979 100644
--- a/chrome/browser/ui/gtk/global_menu_bar.h
+++ b/chrome/browser/ui/gtk/global_menu_bar.h
@@ -8,7 +8,7 @@
#include <map>
#include "base/compiler_specific.h"
-#include "chrome/browser/command_updater.h"
+#include "chrome/browser/command_observer.h"
#include "chrome/browser/prefs/pref_change_registrar.h"
#include "chrome/browser/ui/gtk/global_history_menu.h"
#include "content/public/browser/notification_observer.h"
@@ -30,7 +30,7 @@ typedef struct _GtkWidget GtkWidget;
// GtkMenuBar found. Thankfully, these systems don't check to see if the menu
// bar itself is visible, so we insert a GtkMenuBar into the window hierarchy
// and set it to be invisible.
-class GlobalMenuBar : public CommandUpdater::CommandObserver,
+class GlobalMenuBar : public CommandObserver,
public content::NotificationObserver {
public:
static const int TAG_NORMAL = 0;
@@ -65,7 +65,7 @@ class GlobalMenuBar : public CommandUpdater::CommandObserver,
std::map<int, GtkWidget*>* id_to_menu_item,
GtkWidget* menu_to_add_to);
- // CommandUpdater::CommandObserver:
+ // CommandObserver:
virtual void EnabledStateChangedForCommand(int id, bool enabled) OVERRIDE;
// content::NotificationObserver:
diff --git a/chrome/browser/ui/gtk/location_bar_view_gtk.cc b/chrome/browser/ui/gtk/location_bar_view_gtk.cc
index e3ee061..0baa061 100644
--- a/chrome/browser/ui/gtk/location_bar_view_gtk.cc
+++ b/chrome/browser/ui/gtk/location_bar_view_gtk.cc
@@ -38,6 +38,7 @@
#include "chrome/browser/search_engines/template_url_service.h"
#include "chrome/browser/search_engines/template_url_service_factory.h"
#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_command_controller.h"
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/browser_content_setting_bubble_model_delegate.h"
#include "chrome/browser/ui/browser_list.h"
@@ -185,7 +186,7 @@ LocationBarViewGtk::LocationBarViewGtk(Browser* browser)
tab_to_search_hint_leading_label_(NULL),
tab_to_search_hint_icon_(NULL),
tab_to_search_hint_trailing_label_(NULL),
- command_updater_(browser->command_updater()),
+ command_updater_(browser->command_controller()->command_updater()),
toolbar_model_(browser->toolbar_model()),
browser_(browser),
disposition_(CURRENT_TAB),
@@ -1240,7 +1241,7 @@ gboolean LocationBarViewGtk::OnZoomButtonPress(GtkWidget* widget,
gboolean LocationBarViewGtk::OnStarButtonPress(GtkWidget* widget,
GdkEventButton* event) {
if (event->button == 1) {
- browser_->ExecuteCommand(IDC_BOOKMARK_PAGE);
+ chrome::ExecuteCommand(browser_, IDC_BOOKMARK_PAGE);
return TRUE;
}
return FALSE;
@@ -1250,7 +1251,7 @@ gboolean LocationBarViewGtk::OnChromeToMobileButtonPress(
GtkWidget* widget,
GdkEventButton* event) {
if (event->button == 1) {
- browser_->ExecuteCommand(IDC_CHROME_TO_MOBILE_PAGE);
+ chrome::ExecuteCommand(browser_, IDC_CHROME_TO_MOBILE_PAGE);
return TRUE;
}
return FALSE;
diff --git a/chrome/browser/ui/gtk/location_bar_view_gtk.h b/chrome/browser/ui/gtk/location_bar_view_gtk.h
index aef919a..4532c5a 100644
--- a/chrome/browser/ui/gtk/location_bar_view_gtk.h
+++ b/chrome/browser/ui/gtk/location_bar_view_gtk.h
@@ -16,7 +16,7 @@
#include "base/memory/scoped_ptr.h"
#include "base/memory/scoped_vector.h"
#include "base/memory/weak_ptr.h"
-#include "chrome/browser/command_updater.h"
+#include "chrome/browser/command_observer.h"
#include "chrome/browser/extensions/extension_context_menu_model.h"
#include "chrome/browser/extensions/image_loading_tracker.h"
#include "chrome/browser/prefs/pref_member.h"
@@ -61,7 +61,7 @@ class LocationBarViewGtk : public OmniboxEditController,
public LocationBar,
public LocationBarTesting,
public content::NotificationObserver,
- public CommandUpdater::CommandObserver {
+ public CommandObserver {
public:
explicit LocationBarViewGtk(Browser* browser);
virtual ~LocationBarViewGtk();
@@ -163,7 +163,7 @@ class LocationBarViewGtk : public OmniboxEditController,
const content::NotificationSource& source,
const content::NotificationDetails& details) OVERRIDE;
- // CommandUpdater::CommandObserver:
+ // CommandObserver:
virtual void EnabledStateChangedForCommand(int id, bool enabled) OVERRIDE;
// Edit background color.
diff --git a/chrome/browser/ui/gtk/reload_button_gtk.cc b/chrome/browser/ui/gtk/reload_button_gtk.cc
index f825350..a3cc4b5 100644
--- a/chrome/browser/ui/gtk/reload_button_gtk.cc
+++ b/chrome/browser/ui/gtk/reload_button_gtk.cc
@@ -192,7 +192,7 @@ void ReloadButtonGtk::OnClicked(GtkWidget* /* sender */) {
&ReloadButtonGtk::OnDoubleClickTimer);
if (browser_)
- browser_->ExecuteCommandWithDisposition(command, disposition);
+ chrome::ExecuteCommandWithDisposition(browser_, command, disposition);
++testing_reload_count_;
}
}
diff --git a/chrome/browser/ui/panels/old_panel.cc b/chrome/browser/ui/panels/old_panel.cc
index bcb1f0a..762ec8d 100644
--- a/chrome/browser/ui/panels/old_panel.cc
+++ b/chrome/browser/ui/panels/old_panel.cc
@@ -5,6 +5,8 @@
#include "chrome/browser/ui/panels/old_panel.h"
#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_command_controller.h"
+#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/panels/panel_browser_window.h"
#include "third_party/skia/include/core/SkBitmap.h"
@@ -25,7 +27,7 @@ BrowserWindow* OldPanel::browser_window() const {
}
CommandUpdater* OldPanel::command_updater() {
- return browser_->command_updater();
+ return browser_->command_controller()->command_updater();
}
Profile* OldPanel::profile() const {
@@ -51,8 +53,8 @@ void OldPanel::OnWindowClosing() {
}
void OldPanel::ExecuteCommandWithDisposition(
- int id, WindowOpenDisposition disposition) {
- browser_->ExecuteCommandWithDisposition(id, disposition);
+ int id, WindowOpenDisposition disposition) {
+ chrome::ExecuteCommandWithDisposition(browser_, id, disposition);
}
SkBitmap OldPanel::GetCurrentPageIcon() const {
diff --git a/chrome/browser/ui/panels/panel_browser_window_cocoa.mm b/chrome/browser/ui/panels/panel_browser_window_cocoa.mm
index d0c5573..3b0a242 100644
--- a/chrome/browser/ui/panels/panel_browser_window_cocoa.mm
+++ b/chrome/browser/ui/panels/panel_browser_window_cocoa.mm
@@ -6,6 +6,7 @@
#include "base/logging.h"
#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_command_controller.h"
#include "chrome/browser/ui/browser_list.h"
#import "chrome/browser/ui/cocoa/browser_window_utils.h"
#include "chrome/browser/ui/cocoa/find_bar/find_bar_bridge.h"
@@ -248,7 +249,8 @@ bool PanelBrowserWindowCocoa::PreHandlePanelKeyboardEvent(
if (id == -1)
return false;
- if (GetPanelBrowser()->IsReservedCommandOrKey(id, event)) {
+ if (GetPanelBrowser()->command_controller()->IsReservedCommandOrKey(id,
+ event)) {
return [BrowserWindowUtils handleKeyboardEvent:event.os_event
inWindow:GetNativePanelHandle()];
}
diff --git a/chrome/browser/ui/toolbar/wrench_menu_model.cc b/chrome/browser/ui/toolbar/wrench_menu_model.cc
index 8f61a5a..f15fbb5 100644
--- a/chrome/browser/ui/toolbar/wrench_menu_model.cc
+++ b/chrome/browser/ui/toolbar/wrench_menu_model.cc
@@ -119,12 +119,12 @@ bool EncodingMenuModel::IsCommandIdChecked(int command_id) const {
}
bool EncodingMenuModel::IsCommandIdEnabled(int command_id) const {
- bool enabled = browser_->command_updater()->IsCommandEnabled(command_id);
+ bool enabled = chrome::IsCommandEnabled(browser_, command_id);
// Special handling for the contents of the Encoding submenu. On Mac OS,
// instead of enabling/disabling the top-level menu item, the submenu's
// contents get disabled, per Apple's HIG.
#if defined(OS_MACOSX)
- enabled &= browser_->command_updater()->IsCommandEnabled(IDC_ENCODING_MENU);
+ enabled &= chrome::IsCommandEnabled(browser_, IDC_ENCODING_MENU);
#endif
return enabled;
}
@@ -136,7 +136,7 @@ bool EncodingMenuModel::GetAcceleratorForCommandId(
}
void EncodingMenuModel::ExecuteCommand(int command_id) {
- browser_->ExecuteCommand(command_id);
+ chrome::ExecuteCommand(browser_, command_id);
}
////////////////////////////////////////////////////////////////////////////////
@@ -342,7 +342,7 @@ void WrenchMenuModel::ExecuteCommand(int command_id) {
if (command_id == IDC_HELP_PAGE_VIA_MENU)
content::RecordAction(UserMetricsAction("ShowHelpTabViaWrenchMenu"));
- browser_->ExecuteCommand(command_id);
+ chrome::ExecuteCommand(browser_, command_id);
}
bool WrenchMenuModel::IsCommandIdChecked(int command_id) const {
@@ -361,7 +361,7 @@ bool WrenchMenuModel::IsCommandIdEnabled(int command_id) const {
if (error)
return true;
- return browser_->command_updater()->IsCommandEnabled(command_id);
+ return chrome::IsCommandEnabled(browser_, command_id);
}
bool WrenchMenuModel::IsCommandIdVisible(int command_id) const {
diff --git a/chrome/browser/ui/views/avatar_menu_button.cc b/chrome/browser/ui/views/avatar_menu_button.cc
index 6f1ef5d..8030d41 100644
--- a/chrome/browser/ui/views/avatar_menu_button.cc
+++ b/chrome/browser/ui/views/avatar_menu_button.cc
@@ -13,6 +13,7 @@
#include "chrome/browser/profiles/profile_info_util.h"
#include "chrome/browser/profiles/profile_metrics.h"
#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/views/avatar_menu_bubble_view.h"
#include "chrome/browser/ui/views/frame/browser_view.h"
#include "chrome/common/chrome_notification_types.h"
@@ -159,7 +160,7 @@ void AvatarMenuButton::OnMenuButtonClicked(views::View* source,
}
void AvatarMenuButton::ShowAvatarBubble() {
- DCHECK(browser_->command_updater()->IsCommandEnabled(IDC_SHOW_AVATAR_MENU));
+ DCHECK(chrome::IsCommandEnabled(browser_, IDC_SHOW_AVATAR_MENU));
gfx::Point origin;
views::View::ConvertPointToScreen(this, &origin);
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc
index 4c25083..f2b2d63 100644
--- a/chrome/browser/ui/views/frame/browser_view.cc
+++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -33,6 +33,8 @@
#include "chrome/browser/themes/theme_service.h"
#include "chrome/browser/ui/app_modal_dialogs/app_modal_dialog_queue.h"
#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_command_controller.h"
+#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/browser_dialogs.h"
#include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/browser_window_state.h"
@@ -475,9 +477,10 @@ bool BrowserView::AcceleratorPressed(const ui::Accelerator& accelerator) {
DCHECK(iter != accelerator_table_.end());
int command_id = iter->second;
- if (!browser_->block_command_execution())
+ chrome::BrowserCommandController* controller = browser_->command_controller();
+ if (!controller->block_command_execution())
UpdateAcceleratorMetrics(accelerator, command_id);
- return browser_->ExecuteCommandIfEnabled(command_id);
+ return chrome::ExecuteCommand(browser_.get(), command_id);
}
bool BrowserView::GetAccelerator(int cmd_id, ui::Accelerator* accelerator) {
@@ -1230,24 +1233,26 @@ bool BrowserView::PreHandleKeyboardEvent(const NativeWebKeyboardEvent& event,
return false;
}
+ chrome::BrowserCommandController* controller = browser_->command_controller();
+
// Here we need to retrieve the command id (if any) associated to the
// keyboard event. Instead of looking up the command id in the
// |accelerator_table_| by ourselves, we block the command execution of
// the |browser_| object then send the keyboard event to the
// |focus_manager| as if we are activating an accelerator key.
// Then we can retrieve the command id from the |browser_| object.
- browser_->SetBlockCommandExecution(true);
+ controller->SetBlockCommandExecution(true);
// If the |accelerator| is a non-browser shortcut (e.g. Ash shortcut), the
// command execution cannot be blocked and true is returned. However, it is
// okay as long as is_app() is false. See comments in this function.
const bool processed = focus_manager->ProcessAccelerator(accelerator);
- const int id = browser_->GetLastBlockedCommand(NULL);
- browser_->SetBlockCommandExecution(false);
+ const int id = controller->GetLastBlockedCommand(NULL);
+ controller->SetBlockCommandExecution(false);
// Executing the command may cause |this| object to be destroyed.
- if (browser_->IsReservedCommandOrKey(id, event)) {
+ if (controller->IsReservedCommandOrKey(id, event)) {
UpdateAcceleratorMetrics(accelerator, id);
- return browser_->ExecuteCommandIfEnabled(id);
+ return chrome::ExecuteCommand(browser_.get(), id);
}
if (id != -1) {
@@ -1521,7 +1526,7 @@ bool BrowserView::ExecuteWindowsCommand(int command_id) {
if (command_id_from_app_command != -1)
command_id = command_id_from_app_command;
- return browser_->ExecuteCommandIfEnabled(command_id);
+ return chrome::ExecuteCommand(browser_.get(), command_id);
}
std::string BrowserView::GetWindowName() const {
diff --git a/chrome/browser/ui/views/frame/system_menu_model_delegate.cc b/chrome/browser/ui/views/frame/system_menu_model_delegate.cc
index b72be09..f7fcf08 100644
--- a/chrome/browser/ui/views/frame/system_menu_model_delegate.cc
+++ b/chrome/browser/ui/views/frame/system_menu_model_delegate.cc
@@ -8,6 +8,7 @@
#include "chrome/browser/command_updater.h"
#include "chrome/browser/sessions/tab_restore_service.h"
#include "chrome/browser/sessions/tab_restore_service_factory.h"
+#include "chrome/browser/ui/browser_commands.h"
#include "grit/generated_resources.h"
#include "ui/base/l10n/l10n_util.h"
@@ -28,7 +29,7 @@ bool SystemMenuModelDelegate::IsCommandIdChecked(int command_id) const {
}
bool SystemMenuModelDelegate::IsCommandIdEnabled(int command_id) const {
- return browser_->command_updater()->IsCommandEnabled(command_id);
+ return chrome::IsCommandEnabled(browser_, command_id);
}
bool SystemMenuModelDelegate::GetAcceleratorForCommandId(int command_id,
@@ -54,5 +55,5 @@ string16 SystemMenuModelDelegate::GetLabelForCommandId(int command_id) const {
}
void SystemMenuModelDelegate::ExecuteCommand(int command_id) {
- browser_->ExecuteCommandIfEnabled(command_id);
+ chrome::ExecuteCommand(browser_, command_id);
}
diff --git a/chrome/browser/ui/views/location_bar/chrome_to_mobile_view.cc b/chrome/browser/ui/views/location_bar/chrome_to_mobile_view.cc
index a3400074..7ab3370 100644
--- a/chrome/browser/ui/views/location_bar/chrome_to_mobile_view.cc
+++ b/chrome/browser/ui/views/location_bar/chrome_to_mobile_view.cc
@@ -6,6 +6,7 @@
#include "base/utf_string_conversions.h"
#include "chrome/app/chrome_command_ids.h"
+#include "chrome/browser/command_updater.h"
#include "chrome/browser/ui/view_ids.h"
#include "chrome/browser/ui/views/browser_dialogs.h"
#include "chrome/browser/ui/views/location_bar/location_bar_view.h"
diff --git a/chrome/browser/ui/views/location_bar/chrome_to_mobile_view.h b/chrome/browser/ui/views/location_bar/chrome_to_mobile_view.h
index 51c3d31..b53ec7e 100644
--- a/chrome/browser/ui/views/location_bar/chrome_to_mobile_view.h
+++ b/chrome/browser/ui/views/location_bar/chrome_to_mobile_view.h
@@ -6,10 +6,11 @@
#define CHROME_BROWSER_UI_VIEWS_LOCATION_BAR_CHROME_TO_MOBILE_VIEW_H_
#pragma once
-#include "chrome/browser/command_updater.h"
+#include "chrome/browser/command_observer.h"
#include "chrome/browser/ui/views/location_bar/touchable_location_bar_view.h"
#include "ui/views/controls/image_view.h"
+class CommandUpdater;
class LocationBarView;
namespace views {
@@ -19,14 +20,14 @@ class MouseEvent;
// A Page Action image view for the Chrome To Mobile bubble.
class ChromeToMobileView : public views::ImageView,
- public CommandUpdater::CommandObserver,
+ public CommandObserver,
public TouchableLocationBarView {
public:
ChromeToMobileView(LocationBarView* location_bar_view,
CommandUpdater* command_updater);
virtual ~ChromeToMobileView();
- // CommandUpdater::CommandObserver overrides:
+ // CommandObserver overrides:
virtual void EnabledStateChangedForCommand(int id, bool enabled) OVERRIDE;
// TouchableLocationBarView.
diff --git a/chrome/browser/ui/views/location_bar/location_bar_view.cc b/chrome/browser/ui/views/location_bar/location_bar_view.cc
index 6bcc9b9..a0050e5 100644
--- a/chrome/browser/ui/views/location_bar/location_bar_view.cc
+++ b/chrome/browser/ui/views/location_bar/location_bar_view.cc
@@ -11,6 +11,7 @@
#include "base/utf_string_conversions.h"
#include "chrome/app/chrome_command_ids.h"
#include "chrome/browser/alternate_nav_url_fetcher.h"
+#include "chrome/browser/command_updater.h"
#include "chrome/browser/chrome_to_mobile_service.h"
#include "chrome/browser/chrome_to_mobile_service_factory.h"
#include "chrome/browser/defaults.h"
diff --git a/chrome/browser/ui/views/toolbar_view.cc b/chrome/browser/ui/views/toolbar_view.cc
index 9229461..3449f3e0 100644
--- a/chrome/browser/ui/views/toolbar_view.cc
+++ b/chrome/browser/ui/views/toolbar_view.cc
@@ -7,11 +7,13 @@
#include "base/i18n/number_formatting.h"
#include "base/utf_string_conversions.h"
#include "chrome/app/chrome_command_ids.h"
+#include "chrome/browser/command_updater.h"
#include "chrome/browser/event_disposition.h"
#include "chrome/browser/prefs/pref_service.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/themes/theme_service.h"
#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_command_controller.h"
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/browser_content_setting_bubble_model_delegate.h"
#include "chrome/browser/ui/browser_window.h"
@@ -152,11 +154,11 @@ ToolbarView::ToolbarView(Browser* browser)
profiles_menu_contents_(NULL) {
set_id(VIEW_ID_TOOLBAR);
- browser_->command_updater()->AddCommandObserver(IDC_BACK, this);
- browser_->command_updater()->AddCommandObserver(IDC_FORWARD, this);
- browser_->command_updater()->AddCommandObserver(IDC_RELOAD, this);
- browser_->command_updater()->AddCommandObserver(IDC_HOME, this);
- browser_->command_updater()->AddCommandObserver(IDC_LOAD_NEW_TAB_PAGE, this);
+ chrome::AddCommandObserver(browser_, IDC_BACK, this);
+ chrome::AddCommandObserver(browser_, IDC_FORWARD, this);
+ chrome::AddCommandObserver(browser_, IDC_RELOAD, this);
+ chrome::AddCommandObserver(browser_, IDC_HOME, this);
+ chrome::AddCommandObserver(browser_, IDC_LOAD_NEW_TAB_PAGE, this);
display_mode_ = browser->SupportsWindowFeature(Browser::FEATURE_TABSTRIP) ?
DISPLAYMODE_NORMAL : DISPLAYMODE_LOCATION;
@@ -220,7 +222,7 @@ void ToolbarView::Init(views::View* location_bar_parent,
chrome::search::IsInstantExtendedAPIEnabled(browser_->profile()));
location_bar_ = new LocationBarView(
browser_->profile(),
- browser_->command_updater(),
+ browser_->command_controller()->command_updater(),
model_,
this,
browser_->search_model(),
@@ -231,7 +233,8 @@ void ToolbarView::Init(views::View* location_bar_parent,
// location_bar_->set_view_to_focus(location_bar_container_);
location_bar_container_->SetLocationBarView(location_bar_);
- reload_ = new ReloadButton(location_bar_, browser_->command_updater());
+ reload_ = new ReloadButton(location_bar_,
+ browser_->command_controller()->command_updater());
reload_->set_triggerable_event_flags(ui::EF_LEFT_MOUSE_BUTTON |
ui::EF_MIDDLE_MOUSE_BUTTON);
reload_->set_tag(IDC_RELOAD);
@@ -474,7 +477,7 @@ void ToolbarView::ModeChanged(const chrome::search::Mode& mode) {
}
////////////////////////////////////////////////////////////////////////////////
-// ToolbarView, CommandUpdater::CommandObserver implementation:
+// ToolbarView, CommandObserver implementation:
void ToolbarView::EnabledStateChangedForCommand(int id, bool enabled) {
// Special case the reload button at the NTP for extended instant.
@@ -516,7 +519,7 @@ void ToolbarView::ButtonPressed(views::Button* sender,
// action.
location_bar_->Revert();
}
- browser_->ExecuteCommandWithDisposition(command, disposition);
+ chrome::ExecuteCommandWithDisposition(browser_, command, disposition);
}
////////////////////////////////////////////////////////////////////////////////
@@ -700,7 +703,7 @@ void ToolbarView::Layout() {
// Force the reload button to go into disabled mode to display the grey
// circle and not the grey cross. The disabled reload state only exists for
// ntp pages.
- browser_->command_updater()->UpdateCommandEnabled(IDC_RELOAD, false);
+ chrome::UpdateCommandEnabled(browser_, IDC_RELOAD, false);
} else {
// Start the location bar animation.
if (si_mode.animate && si_mode.is_search() &&
@@ -713,7 +716,7 @@ void ToolbarView::Layout() {
} else {
SetLocationBarContainerBounds(location_bar_bounds);
}
- browser_->command_updater()->UpdateCommandEnabled(IDC_RELOAD, true);
+ chrome::UpdateCommandEnabled(browser_, IDC_RELOAD, true);
}
browser_actions_->SetBounds(location_bar_bounds.right(), 0,
diff --git a/chrome/browser/ui/views/toolbar_view.h b/chrome/browser/ui/views/toolbar_view.h
index f9e39c8..507d685 100644
--- a/chrome/browser/ui/views/toolbar_view.h
+++ b/chrome/browser/ui/views/toolbar_view.h
@@ -11,7 +11,7 @@
#include "base/memory/scoped_ptr.h"
#include "base/observer_list.h"
-#include "chrome/browser/command_updater.h"
+#include "chrome/browser/command_observer.h"
#include "chrome/browser/prefs/pref_member.h"
#include "chrome/browser/ui/search/search_model_observer.h"
#include "chrome/browser/ui/toolbar/back_forward_menu_model.h"
@@ -46,7 +46,7 @@ class ToolbarView : public views::AccessiblePaneView,
public LocationBarView::Delegate,
public chrome::search::SearchModelObserver,
public content::NotificationObserver,
- public CommandUpdater::CommandObserver,
+ public CommandObserver,
public views::ButtonListener {
public:
// The view class name.
@@ -128,7 +128,7 @@ class ToolbarView : public views::AccessiblePaneView,
// Overridden from chrome::search::SearchModelObserver:
virtual void ModeChanged(const chrome::search::Mode& mode) OVERRIDE;
- // Overridden from CommandUpdater::CommandObserver:
+ // Overridden from CommandObserver:
virtual void EnabledStateChangedForCommand(int id, bool enabled) OVERRIDE;
// Overridden from views::ButtonListener:
diff --git a/chrome/browser/ui/webui/ntp/ntp_login_handler.cc b/chrome/browser/ui/webui/ntp/ntp_login_handler.cc
index e572958..e391b54 100644
--- a/chrome/browser/ui/webui/ntp/ntp_login_handler.cc
+++ b/chrome/browser/ui/webui/ntp/ntp_login_handler.cc
@@ -23,6 +23,7 @@
#include "chrome/browser/sync/profile_sync_service.h"
#include "chrome/browser/sync/profile_sync_service_factory.h"
#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/chrome_pages.h"
@@ -141,8 +142,7 @@ void NTPLoginHandler::HandleShowSyncLoginUI(const ListValue* args) {
}
#endif
} else if (args->GetSize() == 4 &&
- browser->command_updater()->IsCommandEnabled(
- IDC_SHOW_AVATAR_MENU)) {
+ chrome::IsCommandEnabled(browser, IDC_SHOW_AVATAR_MENU)) {
// The user is signed in, show the profiles menu.
double x = 0;
double y = 0;
diff --git a/chrome/browser/ui/webui/options2/chromeos/cros_language_options_handler2.cc b/chrome/browser/ui/webui/options2/chromeos/cros_language_options_handler2.cc
index 4d4de87..254d6fe 100644
--- a/chrome/browser/ui/webui/options2/chromeos/cros_language_options_handler2.cc
+++ b/chrome/browser/ui/webui/options2/chromeos/cros_language_options_handler2.cc
@@ -18,6 +18,7 @@
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chromeos/input_method/input_method_manager.h"
#include "chrome/browser/chromeos/input_method/input_method_util.h"
+#include "chrome/browser/lifetime/application_lifetime.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_finder.h"
@@ -214,11 +215,7 @@ void CrosLanguageOptionsHandler::SetApplicationLocale(
void CrosLanguageOptionsHandler::RestartCallback(const ListValue* args) {
content::RecordAction(UserMetricsAction("LanguageOptions_SignOut"));
-
- Browser* browser = browser::FindBrowserWithWebContents(
- web_ui()->GetWebContents());
- if (browser)
- browser->ExecuteCommand(IDC_EXIT);
+ browser::AttemptUserExit();
}
void CrosLanguageOptionsHandler::InputMethodDisableCallback(
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_ui_browsertest.cc b/chrome/browser/ui/webui/print_preview/print_preview_ui_browsertest.cc
index 79e993d..1cc0692 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_ui_browsertest.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_ui_browsertest.cc
@@ -32,7 +32,7 @@ class PrintPreviewTest : public InProcessBrowserTest {
ui_test_utils::WindowedNotificationObserver observer(
content::NOTIFICATION_WEB_CONTENTS_TITLE_UPDATED,
content::NotificationService::AllSources());
- browser()->ExecuteCommand(IDC_PRINT);
+ chrome::ExecuteCommand(browser(), IDC_PRINT);
observer.Wait();
}
};
@@ -41,32 +41,30 @@ IN_PROC_BROWSER_TEST_F(PrintPreviewTest, PrintCommands) {
// We start off at about:blank page.
// Make sure there is 1 tab and print is enabled.
ASSERT_EQ(1, browser()->tab_count());
- ASSERT_TRUE(browser()->command_updater()->IsCommandEnabled(IDC_PRINT));
+
+ ASSERT_TRUE(chrome::IsCommandEnabled(browser(), IDC_PRINT));
// Make sure advanced print command (Ctrl+Shift+p) is enabled.
- ASSERT_TRUE(
- browser()->command_updater()->IsCommandEnabled(IDC_ADVANCED_PRINT));
+ ASSERT_TRUE(chrome::IsCommandEnabled(browser(), IDC_ADVANCED_PRINT));
// Create print preview tab.
Print();
// Make sure print is disabled.
- ASSERT_FALSE(browser()->command_updater()->IsCommandEnabled(IDC_PRINT));
+ ASSERT_FALSE(chrome::IsCommandEnabled(browser(), IDC_PRINT));
// Make sure advanced print command (Ctrl+Shift+p) is enabled.
- ASSERT_TRUE(
- browser()->command_updater()->IsCommandEnabled(IDC_ADVANCED_PRINT));
+ ASSERT_TRUE(chrome::IsCommandEnabled(browser(), IDC_ADVANCED_PRINT));
content::TestNavigationObserver reload_observer(
content::NotificationService::AllSources());
chrome::Reload(browser(), CURRENT_TAB);
reload_observer.Wait();
- ASSERT_TRUE(browser()->command_updater()->IsCommandEnabled(IDC_PRINT));
+ ASSERT_TRUE(chrome::IsCommandEnabled(browser(), IDC_PRINT));
// Make sure advanced print command (Ctrl+Shift+p) is enabled.
- ASSERT_TRUE(
- browser()->command_updater()->IsCommandEnabled(IDC_ADVANCED_PRINT));
+ ASSERT_TRUE(chrome::IsCommandEnabled(browser(), IDC_ADVANCED_PRINT));
}
} // namespace
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index c3c157a..3a54b9171 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -904,6 +904,7 @@
'browser/chromeos/xinput_hierarchy_changed_event_listener.cc',
'browser/chromeos/xinput_hierarchy_changed_event_listener.h',
'browser/chromeos/xinput_hierarchy_changed_event_listener_aura.cc',
+ 'browser/command_observer.h',
'browser/command_updater.cc',
'browser/command_updater.h',
'browser/component_updater/component_updater_configurator.cc',
@@ -2382,6 +2383,8 @@
'browser/ui/browser.h',
'browser/ui/browser_commands.cc',
'browser/ui/browser_commands.h',
+ 'browser/ui/browser_command_controller.cc',
+ 'browser/ui/browser_command_controller.h',
'browser/ui/browser_content_setting_bubble_model_delegate.cc',
'browser/ui/browser_content_setting_bubble_model_delegate.h',
'browser/ui/browser_dialogs.h',