Home | History | Annotate | Download | only in ui
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/ui/browser_command_controller.h"
      6 
      7 #include "base/command_line.h"
      8 #include "chrome/app/chrome_command_ids.h"
      9 #include "chrome/browser/browser_process.h"
     10 #include "chrome/browser/command_updater.h"
     11 #include "chrome/browser/prefs/incognito_mode_prefs.h"
     12 #include "chrome/browser/profiles/profile_manager.h"
     13 #include "chrome/browser/profiles/profiles_state.h"
     14 #include "chrome/browser/ui/browser.h"
     15 #include "chrome/browser/ui/browser_commands.h"
     16 #include "chrome/browser/ui/browser_window_state.h"
     17 #include "chrome/common/chrome_switches.h"
     18 #include "chrome/common/pref_names.h"
     19 #include "chrome/test/base/browser_with_test_window_test.h"
     20 #include "chrome/test/base/test_browser_window.h"
     21 #include "chrome/test/base/testing_browser_process.h"
     22 #include "chrome/test/base/testing_profile.h"
     23 #include "chrome/test/base/testing_profile_manager.h"
     24 #include "components/signin/core/common/profile_management_switches.h"
     25 #include "content/public/browser/native_web_keyboard_event.h"
     26 #include "ui/events/keycodes/keyboard_codes.h"
     27 
     28 typedef BrowserWithTestWindowTest BrowserCommandControllerTest;
     29 
     30 TEST_F(BrowserCommandControllerTest, IsReservedCommandOrKey) {
     31 #if defined(OS_CHROMEOS)
     32   // F1-3 keys are reserved Chrome accelerators on Chrome OS.
     33   EXPECT_TRUE(browser()->command_controller()->IsReservedCommandOrKey(
     34       IDC_BACK, content::NativeWebKeyboardEvent(
     35           ui::ET_KEY_PRESSED, false, ui::VKEY_BROWSER_BACK, 0, 0)));
     36   EXPECT_TRUE(browser()->command_controller()->IsReservedCommandOrKey(
     37       IDC_FORWARD, content::NativeWebKeyboardEvent(
     38           ui::ET_KEY_PRESSED, false, ui::VKEY_BROWSER_FORWARD, 0, 0)));
     39   EXPECT_TRUE(browser()->command_controller()->IsReservedCommandOrKey(
     40       IDC_RELOAD, content::NativeWebKeyboardEvent(
     41           ui::ET_KEY_PRESSED, false, ui::VKEY_BROWSER_REFRESH, 0, 0)));
     42 
     43   // When there are modifier keys pressed, don't reserve.
     44   EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
     45       IDC_RELOAD_IGNORING_CACHE, content::NativeWebKeyboardEvent(
     46           ui::ET_KEY_PRESSED, false, ui::VKEY_F3, ui::EF_SHIFT_DOWN, 0)));
     47   EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
     48       IDC_RELOAD_IGNORING_CACHE, content::NativeWebKeyboardEvent(
     49           ui::ET_KEY_PRESSED, false, ui::VKEY_F3, ui::EF_CONTROL_DOWN, 0)));
     50   EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
     51       IDC_FULLSCREEN, content::NativeWebKeyboardEvent(
     52           ui::ET_KEY_PRESSED, false, ui::VKEY_F4, ui::EF_SHIFT_DOWN, 0)));
     53 
     54   // F4-10 keys are not reserved since they are Ash accelerators.
     55   EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
     56       -1, content::NativeWebKeyboardEvent(ui::ET_KEY_PRESSED, false,
     57                                           ui::VKEY_F4, 0, 0)));
     58   EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
     59       -1, content::NativeWebKeyboardEvent(ui::ET_KEY_PRESSED, false,
     60                                           ui::VKEY_F5, 0, 0)));
     61   EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
     62       -1, content::NativeWebKeyboardEvent(ui::ET_KEY_PRESSED, false,
     63                                           ui::VKEY_F6, 0, 0)));
     64   EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
     65       -1, content::NativeWebKeyboardEvent(ui::ET_KEY_PRESSED, false,
     66                                           ui::VKEY_F7, 0, 0)));
     67   EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
     68       -1, content::NativeWebKeyboardEvent(ui::ET_KEY_PRESSED, false,
     69                                           ui::VKEY_F8, 0, 0)));
     70   EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
     71       -1, content::NativeWebKeyboardEvent(ui::ET_KEY_PRESSED, false,
     72                                           ui::VKEY_F9, 0, 0)));
     73   EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
     74       -1, content::NativeWebKeyboardEvent(ui::ET_KEY_PRESSED, false,
     75                                           ui::VKEY_F10, 0, 0)));
     76 
     77   // Shift+Control+Alt+F3 is also an Ash accelerator. Don't reserve it.
     78   EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
     79       -1, content::NativeWebKeyboardEvent(
     80           ui::ET_KEY_PRESSED, false,
     81           ui::VKEY_F3,
     82           ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, 0)));
     83 #endif  // OS_CHROMEOS
     84 
     85 #if defined(USE_AURA)
     86   // Ctrl+n, Ctrl+w are reserved while Ctrl+f is not.
     87 
     88   // The content::NativeWebKeyboardEvent constructor is available only when
     89   // USE_AURA is #defined.
     90   EXPECT_TRUE(browser()->command_controller()->IsReservedCommandOrKey(
     91       IDC_NEW_WINDOW, content::NativeWebKeyboardEvent(
     92           ui::ET_KEY_PRESSED, false, ui::VKEY_N, ui::EF_CONTROL_DOWN, 0)));
     93   EXPECT_TRUE(browser()->command_controller()->IsReservedCommandOrKey(
     94       IDC_CLOSE_TAB, content::NativeWebKeyboardEvent(
     95           ui::ET_KEY_PRESSED, false, ui::VKEY_W, ui::EF_CONTROL_DOWN, 0)));
     96   EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
     97       IDC_FIND, content::NativeWebKeyboardEvent(
     98           ui::ET_KEY_PRESSED, false, ui::VKEY_F, ui::EF_CONTROL_DOWN, 0)));
     99 #endif  // USE_AURA
    100 }
    101 
    102 TEST_F(BrowserCommandControllerTest, IsReservedCommandOrKeyIsApp) {
    103   browser()->app_name_ = "app";
    104   ASSERT_TRUE(browser()->is_app());
    105 
    106   // When is_app(), no keys are reserved.
    107 #if defined(OS_CHROMEOS)
    108   EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
    109       IDC_BACK, content::NativeWebKeyboardEvent(ui::ET_KEY_PRESSED, false,
    110                                                 ui::VKEY_F1, 0, 0)));
    111   EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
    112       IDC_FORWARD, content::NativeWebKeyboardEvent(ui::ET_KEY_PRESSED, false,
    113                                                    ui::VKEY_F2, 0, 0)));
    114   EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
    115       IDC_RELOAD, content::NativeWebKeyboardEvent(ui::ET_KEY_PRESSED, false,
    116                                                   ui::VKEY_F3, 0, 0)));
    117   EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
    118       -1, content::NativeWebKeyboardEvent(ui::ET_KEY_PRESSED, false,
    119                                           ui::VKEY_F4, 0, 0)));
    120 #endif  // OS_CHROMEOS
    121 
    122 #if defined(USE_AURA)
    123   // The content::NativeWebKeyboardEvent constructor is available only when
    124   // USE_AURA is #defined.
    125   EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
    126       IDC_NEW_WINDOW, content::NativeWebKeyboardEvent(
    127           ui::ET_KEY_PRESSED, false, ui::VKEY_N, ui::EF_CONTROL_DOWN, 0)));
    128   EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
    129       IDC_CLOSE_TAB, content::NativeWebKeyboardEvent(
    130           ui::ET_KEY_PRESSED, false, ui::VKEY_W, ui::EF_CONTROL_DOWN, 0)));
    131   EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
    132       IDC_FIND, content::NativeWebKeyboardEvent(
    133           ui::ET_KEY_PRESSED, false, ui::VKEY_F, ui::EF_CONTROL_DOWN, 0)));
    134 #endif  // USE_AURA
    135 }
    136 
    137 TEST_F(BrowserCommandControllerTest, IncognitoCommands) {
    138   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_OPTIONS));
    139   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_IMPORT_SETTINGS));
    140   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_SHOW_SIGNIN));
    141 
    142   TestingProfile* testprofile = browser()->profile()->AsTestingProfile();
    143   EXPECT_TRUE(testprofile);
    144   testprofile->SetGuestSession(true);
    145   chrome::BrowserCommandController
    146     ::UpdateSharedCommandsForIncognitoAvailability(
    147       browser()->command_controller()->command_updater(), testprofile);
    148   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_OPTIONS));
    149   EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_IMPORT_SETTINGS));
    150   EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_SHOW_SIGNIN));
    151 
    152   testprofile->SetGuestSession(false);
    153   IncognitoModePrefs::SetAvailability(browser()->profile()->GetPrefs(),
    154                                       IncognitoModePrefs::FORCED);
    155   chrome::BrowserCommandController
    156     ::UpdateSharedCommandsForIncognitoAvailability(
    157       browser()->command_controller()->command_updater(), testprofile);
    158   EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_OPTIONS));
    159   EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_IMPORT_SETTINGS));
    160   EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_SHOW_SIGNIN));
    161 }
    162 
    163 TEST_F(BrowserCommandControllerTest, AppFullScreen) {
    164   // Enable for tabbed browser.
    165   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FULLSCREEN));
    166 
    167   // Enabled for app windows.
    168   browser()->app_name_ = "app";
    169   ASSERT_TRUE(browser()->is_app());
    170   browser()->command_controller()->FullscreenStateChanged();
    171   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FULLSCREEN));
    172 }
    173 
    174 TEST_F(BrowserCommandControllerTest, OldAvatarMenuEnabledForOneOrMoreProfiles) {
    175   if (!profiles::IsMultipleProfilesEnabled())
    176     return;
    177 
    178   EXPECT_FALSE(switches::IsNewProfileManagement());
    179 
    180   TestingProfileManager testing_profile_manager(
    181       TestingBrowserProcess::GetGlobal());
    182   ASSERT_TRUE(testing_profile_manager.SetUp());
    183   ProfileManager* profile_manager = testing_profile_manager.profile_manager();
    184 
    185   chrome::BrowserCommandController command_controller(browser());
    186   const CommandUpdater* command_updater = command_controller.command_updater();
    187 
    188   bool enabled = true;
    189 #if defined(OS_CHROMEOS)
    190   // Chrome OS uses system tray menu to handle multi-profiles.
    191   enabled = false;
    192 #endif
    193 
    194   testing_profile_manager.CreateTestingProfile("p1");
    195   ASSERT_EQ(1U, profile_manager->GetNumberOfProfiles());
    196   EXPECT_EQ(enabled, command_updater->IsCommandEnabled(IDC_SHOW_AVATAR_MENU));
    197 
    198   testing_profile_manager.CreateTestingProfile("p2");
    199   ASSERT_EQ(2U, profile_manager->GetNumberOfProfiles());
    200   EXPECT_EQ(enabled, command_updater->IsCommandEnabled(IDC_SHOW_AVATAR_MENU));
    201 
    202   testing_profile_manager.DeleteTestingProfile("p1");
    203   ASSERT_EQ(1U, profile_manager->GetNumberOfProfiles());
    204   EXPECT_EQ(enabled, command_updater->IsCommandEnabled(IDC_SHOW_AVATAR_MENU));
    205 
    206   testing_profile_manager.DeleteTestingProfile("p2");
    207 }
    208 
    209 TEST_F(BrowserCommandControllerTest, NewAvatarMenuEnabledWhenOnlyOneProfile) {
    210   if (!profiles::IsMultipleProfilesEnabled())
    211     return;
    212 
    213   // The command line is reset at the end of every test by the test suite.
    214   switches::EnableNewProfileManagementForTesting(
    215       CommandLine::ForCurrentProcess());
    216 
    217   TestingProfileManager testing_profile_manager(
    218       TestingBrowserProcess::GetGlobal());
    219   ASSERT_TRUE(testing_profile_manager.SetUp());
    220   ProfileManager* profile_manager = testing_profile_manager.profile_manager();
    221 
    222   chrome::BrowserCommandController command_controller(browser());
    223   const CommandUpdater* command_updater = command_controller.command_updater();
    224 
    225   testing_profile_manager.CreateTestingProfile("p1");
    226   ASSERT_EQ(1U, profile_manager->GetNumberOfProfiles());
    227 #if defined(OS_CHROMEOS)
    228   // Chrome OS uses system tray menu to handle multi-profiles.
    229   EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_SHOW_AVATAR_MENU));
    230 #else
    231   EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_SHOW_AVATAR_MENU));
    232 #endif
    233   testing_profile_manager.DeleteTestingProfile("p1");
    234 }
    235 
    236 TEST_F(BrowserCommandControllerTest, NewAvatarMenuEnabledInGuestMode) {
    237   if (!profiles::IsMultipleProfilesEnabled())
    238     return;
    239 
    240   // The command line is reset at the end of every test by the test suite.
    241   switches::EnableNewProfileManagementForTesting(
    242       CommandLine::ForCurrentProcess());
    243 
    244   TestingProfileManager testing_profile_manager(
    245       TestingBrowserProcess::GetGlobal());
    246   ASSERT_TRUE(testing_profile_manager.SetUp());
    247 
    248   // Set up guest a profile.
    249   TestingProfile::Builder guest_builder;
    250   guest_builder.SetIncognito();  // Guest profiles are off the record.
    251   guest_builder.SetGuestSession();
    252   guest_builder.SetPath(ProfileManager::GetGuestProfilePath());
    253   scoped_ptr<TestingProfile>guest_profile = guest_builder.Build();
    254 
    255   ASSERT_TRUE(guest_profile->IsGuestSession());
    256 
    257   // Create a new browser based on the guest profile.
    258   Browser::CreateParams profile_params(guest_profile.get(),
    259                                        chrome::GetActiveDesktop());
    260   scoped_ptr<Browser> guest_browser(
    261       chrome::CreateBrowserWithTestWindowForParams(&profile_params));
    262   chrome::BrowserCommandController command_controller(guest_browser.get());
    263   const CommandUpdater* command_updater = command_controller.command_updater();
    264 #if defined(OS_CHROMEOS)
    265   // Chrome OS uses system tray menu to handle multi-profiles.
    266   EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_SHOW_AVATAR_MENU));
    267 #else
    268   EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_SHOW_AVATAR_MENU));
    269 #endif
    270 }
    271 
    272 TEST_F(BrowserCommandControllerTest, AvatarMenuAlwaysDisabledInIncognitoMode) {
    273   if (!profiles::IsMultipleProfilesEnabled())
    274     return;
    275 
    276   // Set up a profile with an off the record profile.
    277   TestingProfile::Builder normal_builder;
    278   scoped_ptr<TestingProfile> original_profile = normal_builder.Build();
    279 
    280   // Create a new browser based on the off the record profile.
    281   Browser::CreateParams profile_params(
    282       original_profile->GetOffTheRecordProfile(), chrome::GetActiveDesktop());
    283   scoped_ptr<Browser> otr_browser(
    284       chrome::CreateBrowserWithTestWindowForParams(&profile_params));
    285 
    286   chrome::BrowserCommandController command_controller(otr_browser.get());
    287   const CommandUpdater* command_updater = command_controller.command_updater();
    288 
    289   // The old style avatar menu should be disabled.
    290   EXPECT_FALSE(switches::IsNewProfileManagement());
    291   EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_SHOW_AVATAR_MENU));
    292 
    293   // The new style avatar menu should also be disabled.
    294   // The command line is reset at the end of every test by the test suite.
    295   switches::EnableNewProfileManagementForTesting(
    296       CommandLine::ForCurrentProcess());
    297   EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_SHOW_AVATAR_MENU));
    298 }
    299 
    300 //////////////////////////////////////////////////////////////////////////////
    301 
    302 // A test browser window that can toggle fullscreen state.
    303 class FullscreenTestBrowserWindow : public TestBrowserWindow {
    304  public:
    305   FullscreenTestBrowserWindow() : fullscreen_(false) {}
    306   virtual ~FullscreenTestBrowserWindow() {}
    307 
    308   // TestBrowserWindow overrides:
    309   virtual bool ShouldHideUIForFullscreen() const OVERRIDE {
    310     return fullscreen_;
    311   }
    312   virtual bool IsFullscreen() const OVERRIDE {
    313     return fullscreen_;
    314   }
    315   virtual void EnterFullscreen(
    316       const GURL& url, FullscreenExitBubbleType type) OVERRIDE {
    317     fullscreen_ = true;
    318   }
    319   virtual void ExitFullscreen() OVERRIDE {
    320     fullscreen_ = false;
    321   }
    322 
    323  private:
    324   bool fullscreen_;
    325 
    326   DISALLOW_COPY_AND_ASSIGN(FullscreenTestBrowserWindow);
    327 };
    328 
    329 // Test that uses FullscreenTestBrowserWindow for its window.
    330 class BrowserCommandControllerFullscreenTest
    331     : public BrowserWithTestWindowTest {
    332  public:
    333   BrowserCommandControllerFullscreenTest() {}
    334   virtual ~BrowserCommandControllerFullscreenTest() {}
    335 
    336   // BrowserWithTestWindowTest overrides:
    337   virtual BrowserWindow* CreateBrowserWindow() OVERRIDE {
    338     return new FullscreenTestBrowserWindow;
    339   }
    340 
    341  private:
    342   DISALLOW_COPY_AND_ASSIGN(BrowserCommandControllerFullscreenTest);
    343 };
    344 
    345 TEST_F(BrowserCommandControllerFullscreenTest,
    346        UpdateCommandsForFullscreenMode) {
    347   // Defaults for a tabbed browser.
    348   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_OPEN_CURRENT_URL));
    349   EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_SHOW_AS_TAB));
    350   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_TOOLBAR));
    351   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_LOCATION));
    352   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_SEARCH));
    353   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_MENU_BAR));
    354   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_NEXT_PANE));
    355   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_PREVIOUS_PANE));
    356   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_BOOKMARKS));
    357   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_DEVELOPER_MENU));
    358 #if defined(GOOGLE_CHROME_BUILD)
    359   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FEEDBACK));
    360 #endif
    361   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_OPTIONS));
    362   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_IMPORT_SETTINGS));
    363   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_EDIT_SEARCH_ENGINES));
    364   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_VIEW_PASSWORDS));
    365   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_ABOUT));
    366   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_SHOW_APP_MENU));
    367   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FULLSCREEN));
    368 
    369   // Simulate going fullscreen.
    370   chrome::ToggleFullscreenMode(browser());
    371   ASSERT_TRUE(browser()->window()->IsFullscreen());
    372   browser()->command_controller()->FullscreenStateChanged();
    373 
    374   // Most commands are disabled in fullscreen.
    375   EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_OPEN_CURRENT_URL));
    376   EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_SHOW_AS_TAB));
    377   EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_TOOLBAR));
    378   EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_LOCATION));
    379   EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_SEARCH));
    380   EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_MENU_BAR));
    381   EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_NEXT_PANE));
    382   EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_PREVIOUS_PANE));
    383   EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_BOOKMARKS));
    384   EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_DEVELOPER_MENU));
    385 #if defined(GOOGLE_CHROME_BUILD)
    386   EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_FEEDBACK));
    387 #endif
    388   EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_OPTIONS));
    389   EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_IMPORT_SETTINGS));
    390   EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_EDIT_SEARCH_ENGINES));
    391   EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_VIEW_PASSWORDS));
    392   EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_ABOUT));
    393   EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_SHOW_APP_MENU));
    394   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FULLSCREEN));
    395 
    396   // Exit fullscreen.
    397   chrome::ToggleFullscreenMode(browser());
    398   ASSERT_FALSE(browser()->window()->IsFullscreen());
    399   browser()->command_controller()->FullscreenStateChanged();
    400   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_OPEN_CURRENT_URL));
    401   EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_SHOW_AS_TAB));
    402   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_TOOLBAR));
    403   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_LOCATION));
    404   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_SEARCH));
    405   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_MENU_BAR));
    406   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_NEXT_PANE));
    407   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_PREVIOUS_PANE));
    408   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_BOOKMARKS));
    409   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_DEVELOPER_MENU));
    410 #if defined(GOOGLE_CHROME_BUILD)
    411   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FEEDBACK));
    412 #endif
    413   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_OPTIONS));
    414   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_IMPORT_SETTINGS));
    415   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_EDIT_SEARCH_ENGINES));
    416   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_VIEW_PASSWORDS));
    417   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_ABOUT));
    418   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_SHOW_APP_MENU));
    419   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FULLSCREEN));
    420 
    421   // Guest Profiles disallow some options.
    422   TestingProfile* testprofile = browser()->profile()->AsTestingProfile();
    423   EXPECT_TRUE(testprofile);
    424   testprofile->SetGuestSession(true);
    425 
    426   browser()->command_controller()->FullscreenStateChanged();
    427   EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_OPTIONS));
    428   EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_IMPORT_SETTINGS));
    429 }
    430 
    431 TEST_F(BrowserCommandControllerTest, IncognitoModeOnSigninAllowedPrefChange) {
    432   // Set up a profile with an off the record profile.
    433   TestingProfile::Builder builder;
    434   builder.SetIncognito();
    435   scoped_ptr<TestingProfile> profile2(builder.Build());
    436   TestingProfile::Builder builder2;
    437   scoped_ptr<TestingProfile> profile1 = builder2.Build();
    438   profile2->SetOriginalProfile(profile1.get());
    439   EXPECT_EQ(profile2->GetOriginalProfile(), profile1.get());
    440   profile1->SetOffTheRecordProfile(profile2.PassAs<Profile>());
    441 
    442   // Create a new browser based on the off the record profile.
    443   Browser::CreateParams profile_params(profile1->GetOffTheRecordProfile(),
    444                                        chrome::GetActiveDesktop());
    445   scoped_ptr<Browser> browser2(
    446       chrome::CreateBrowserWithTestWindowForParams(&profile_params));
    447 
    448   chrome::BrowserCommandController command_controller(browser2.get());
    449   const CommandUpdater* command_updater = command_controller.command_updater();
    450 
    451   // Check that the SYNC_SETUP command is updated on preference change.
    452   EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_SHOW_SYNC_SETUP));
    453   profile1->GetPrefs()->SetBoolean(prefs::kSigninAllowed, false);
    454   EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_SHOW_SYNC_SETUP));
    455 }
    456 
    457 TEST_F(BrowserCommandControllerTest, OnSigninAllowedPrefChange) {
    458   chrome::BrowserCommandController command_controller(browser());
    459   const CommandUpdater* command_updater = command_controller.command_updater();
    460 
    461   // Check that the SYNC_SETUP command is updated on preference change.
    462   EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_SHOW_SYNC_SETUP));
    463   profile()->GetPrefs()->SetBoolean(prefs::kSigninAllowed, false);
    464   EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_SHOW_SYNC_SETUP));
    465 }
    466