• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
TEST_F(BrowserCommandControllerTest,IsReservedCommandOrKey)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 
TEST_F(BrowserCommandControllerTest,IsReservedCommandOrKeyIsApp)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 
TEST_F(BrowserCommandControllerTest,IncognitoCommands)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 
TEST_F(BrowserCommandControllerTest,AppFullScreen)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 
TEST_F(BrowserCommandControllerTest,OldAvatarMenuEnabledForOneOrMoreProfiles)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 
TEST_F(BrowserCommandControllerTest,NewAvatarMenuEnabledWhenOnlyOneProfile)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 
TEST_F(BrowserCommandControllerTest,NewAvatarMenuEnabledInGuestMode)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 
TEST_F(BrowserCommandControllerTest,AvatarMenuAlwaysDisabledInIncognitoMode)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:
FullscreenTestBrowserWindow()305   FullscreenTestBrowserWindow() : fullscreen_(false) {}
~FullscreenTestBrowserWindow()306   virtual ~FullscreenTestBrowserWindow() {}
307 
308   // TestBrowserWindow overrides:
ShouldHideUIForFullscreen() const309   virtual bool ShouldHideUIForFullscreen() const OVERRIDE {
310     return fullscreen_;
311   }
IsFullscreen() const312   virtual bool IsFullscreen() const OVERRIDE {
313     return fullscreen_;
314   }
EnterFullscreen(const GURL & url,FullscreenExitBubbleType type)315   virtual void EnterFullscreen(
316       const GURL& url, FullscreenExitBubbleType type) OVERRIDE {
317     fullscreen_ = true;
318   }
ExitFullscreen()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:
BrowserCommandControllerFullscreenTest()333   BrowserCommandControllerFullscreenTest() {}
~BrowserCommandControllerFullscreenTest()334   virtual ~BrowserCommandControllerFullscreenTest() {}
335 
336   // BrowserWithTestWindowTest overrides:
CreateBrowserWindow()337   virtual BrowserWindow* CreateBrowserWindow() OVERRIDE {
338     return new FullscreenTestBrowserWindow;
339   }
340 
341  private:
342   DISALLOW_COPY_AND_ASSIGN(BrowserCommandControllerFullscreenTest);
343 };
344 
TEST_F(BrowserCommandControllerFullscreenTest,UpdateCommandsForFullscreenMode)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 
TEST_F(BrowserCommandControllerTest,IncognitoModeOnSigninAllowedPrefChange)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 
TEST_F(BrowserCommandControllerTest,OnSigninAllowedPrefChange)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