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