diff options
author | ben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-06-27 22:57:40 +0000 |
---|---|---|
committer | ben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-06-27 22:57:40 +0000 |
commit | 5d9829491fa187db0fbbecb7f1e139d8367dcc16 (patch) | |
tree | 641f14f9285abae645efbb67da4cb378736f4e22 | |
parent | b61a5d8a9a3eb306079743e73f592a6ac6c8c8b3 (diff) | |
download | chromium_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
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', |