browser_command_controller_unittest.cc revision 9ab5563a3196760eb381d102cbb2bc0f7abc6a50
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 "chrome/app/chrome_command_ids.h"
8#include "chrome/browser/browser_process.h"
9#include "chrome/browser/command_updater.h"
10#include "chrome/browser/profiles/profile_destroyer.h"
11#include "chrome/browser/profiles/profile_manager.h"
12#include "chrome/browser/profiles/profiles_state.h"
13#include "chrome/browser/ui/browser.h"
14#include "chrome/browser/ui/browser_commands.h"
15#include "chrome/browser/ui/browser_window_state.h"
16#include "chrome/common/pref_names.h"
17#include "chrome/test/base/browser_with_test_window_test.h"
18#include "chrome/test/base/test_browser_window.h"
19#include "chrome/test/base/testing_browser_process.h"
20#include "chrome/test/base/testing_profile_manager.h"
21#include "content/public/browser/native_web_keyboard_event.h"
22#include "ui/base/keycodes/keyboard_codes.h"
23
24typedef BrowserWithTestWindowTest BrowserCommandControllerTest;
25
26TEST_F(BrowserCommandControllerTest, IsReservedCommandOrKey) {
27#if defined(OS_CHROMEOS)
28  // F1-3 keys are reserved Chrome accelerators on Chrome OS.
29  EXPECT_TRUE(browser()->command_controller()->IsReservedCommandOrKey(
30      IDC_BACK, content::NativeWebKeyboardEvent(ui::ET_KEY_PRESSED, false,
31                                                ui::VKEY_F1, 0, 0)));
32  EXPECT_TRUE(browser()->command_controller()->IsReservedCommandOrKey(
33      IDC_FORWARD, content::NativeWebKeyboardEvent(ui::ET_KEY_PRESSED, false,
34                                                   ui::VKEY_F2, 0, 0)));
35  EXPECT_TRUE(browser()->command_controller()->IsReservedCommandOrKey(
36      IDC_RELOAD, content::NativeWebKeyboardEvent(ui::ET_KEY_PRESSED, false,
37                                                  ui::VKEY_F3, 0, 0)));
38
39  // When there are modifier keys pressed, don't reserve.
40  EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
41      IDC_RELOAD_IGNORING_CACHE, content::NativeWebKeyboardEvent(
42          ui::ET_KEY_PRESSED, false, ui::VKEY_F3, ui::EF_SHIFT_DOWN, 0)));
43  EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
44      IDC_RELOAD_IGNORING_CACHE, content::NativeWebKeyboardEvent(
45          ui::ET_KEY_PRESSED, false, ui::VKEY_F3, ui::EF_CONTROL_DOWN, 0)));
46  EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
47      IDC_FULLSCREEN, content::NativeWebKeyboardEvent(
48          ui::ET_KEY_PRESSED, false, ui::VKEY_F4, ui::EF_SHIFT_DOWN, 0)));
49
50  // F4-10 keys are not reserved since they are Ash accelerators.
51  EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
52      -1, content::NativeWebKeyboardEvent(ui::ET_KEY_PRESSED, false,
53                                          ui::VKEY_F4, 0, 0)));
54  EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
55      -1, content::NativeWebKeyboardEvent(ui::ET_KEY_PRESSED, false,
56                                          ui::VKEY_F5, 0, 0)));
57  EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
58      -1, content::NativeWebKeyboardEvent(ui::ET_KEY_PRESSED, false,
59                                          ui::VKEY_F6, 0, 0)));
60  EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
61      -1, content::NativeWebKeyboardEvent(ui::ET_KEY_PRESSED, false,
62                                          ui::VKEY_F7, 0, 0)));
63  EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
64      -1, content::NativeWebKeyboardEvent(ui::ET_KEY_PRESSED, false,
65                                          ui::VKEY_F8, 0, 0)));
66  EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
67      -1, content::NativeWebKeyboardEvent(ui::ET_KEY_PRESSED, false,
68                                          ui::VKEY_F9, 0, 0)));
69  EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
70      -1, content::NativeWebKeyboardEvent(ui::ET_KEY_PRESSED, false,
71                                          ui::VKEY_F10, 0, 0)));
72
73  // Shift+Control+Alt+F3 is also an Ash accelerator. Don't reserve it.
74  EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
75      -1, content::NativeWebKeyboardEvent(
76          ui::ET_KEY_PRESSED, false,
77          ui::VKEY_F3,
78          ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, 0)));
79#endif  // OS_CHROMEOS
80
81#if defined(USE_AURA)
82  // Ctrl+n, Ctrl+w are reserved while Ctrl+f is not.
83
84  // The content::NativeWebKeyboardEvent constructor is available only when
85  // USE_AURA is #defined.
86  EXPECT_TRUE(browser()->command_controller()->IsReservedCommandOrKey(
87      IDC_NEW_WINDOW, content::NativeWebKeyboardEvent(
88          ui::ET_KEY_PRESSED, false, ui::VKEY_N, ui::EF_CONTROL_DOWN, 0)));
89  EXPECT_TRUE(browser()->command_controller()->IsReservedCommandOrKey(
90      IDC_CLOSE_TAB, content::NativeWebKeyboardEvent(
91          ui::ET_KEY_PRESSED, false, ui::VKEY_W, ui::EF_CONTROL_DOWN, 0)));
92  EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
93      IDC_FIND, content::NativeWebKeyboardEvent(
94          ui::ET_KEY_PRESSED, false, ui::VKEY_F, ui::EF_CONTROL_DOWN, 0)));
95#endif  // USE_AURA
96}
97
98TEST_F(BrowserCommandControllerTest, IsReservedCommandOrKeyIsApp) {
99  browser()->app_name_ = "app";
100  ASSERT_TRUE(browser()->is_app());
101
102  // When is_app(), no keys are reserved.
103#if defined(OS_CHROMEOS)
104  EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
105      IDC_BACK, content::NativeWebKeyboardEvent(ui::ET_KEY_PRESSED, false,
106                                                ui::VKEY_F1, 0, 0)));
107  EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
108      IDC_FORWARD, content::NativeWebKeyboardEvent(ui::ET_KEY_PRESSED, false,
109                                                   ui::VKEY_F2, 0, 0)));
110  EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
111      IDC_RELOAD, content::NativeWebKeyboardEvent(ui::ET_KEY_PRESSED, false,
112                                                  ui::VKEY_F3, 0, 0)));
113  EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
114      -1, content::NativeWebKeyboardEvent(ui::ET_KEY_PRESSED, false,
115                                          ui::VKEY_F4, 0, 0)));
116#endif  // OS_CHROMEOS
117
118#if defined(USE_AURA)
119  // The content::NativeWebKeyboardEvent constructor is available only when
120  // USE_AURA is #defined.
121  EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
122      IDC_NEW_WINDOW, content::NativeWebKeyboardEvent(
123          ui::ET_KEY_PRESSED, false, ui::VKEY_N, ui::EF_CONTROL_DOWN, 0)));
124  EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
125      IDC_CLOSE_TAB, content::NativeWebKeyboardEvent(
126          ui::ET_KEY_PRESSED, false, ui::VKEY_W, ui::EF_CONTROL_DOWN, 0)));
127  EXPECT_FALSE(browser()->command_controller()->IsReservedCommandOrKey(
128      IDC_FIND, content::NativeWebKeyboardEvent(
129          ui::ET_KEY_PRESSED, false, ui::VKEY_F, ui::EF_CONTROL_DOWN, 0)));
130#endif  // USE_AURA
131}
132
133TEST_F(BrowserCommandControllerTest, AppFullScreen) {
134  // Enable for tabbed browser.
135  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FULLSCREEN));
136
137  // Enabled for app windows.
138  browser()->app_name_ = "app";
139  ASSERT_TRUE(browser()->is_app());
140  browser()->command_controller()->FullscreenStateChanged();
141  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FULLSCREEN));
142}
143
144TEST_F(BrowserCommandControllerTest, AvatarMenuDisabledWhenOnlyOneProfile) {
145  if (!profiles::IsMultipleProfilesEnabled())
146    return;
147
148  TestingProfileManager testing_profile_manager(
149      TestingBrowserProcess::GetGlobal());
150  ASSERT_TRUE(testing_profile_manager.SetUp());
151  ProfileManager* profile_manager = testing_profile_manager.profile_manager();
152
153  chrome::BrowserCommandController command_controller(browser(),
154                                                      profile_manager);
155  const CommandUpdater* command_updater = command_controller.command_updater();
156
157  testing_profile_manager.CreateTestingProfile("p1");
158  ASSERT_EQ(1U, profile_manager->GetNumberOfProfiles());
159  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_SHOW_AVATAR_MENU));
160
161  testing_profile_manager.CreateTestingProfile("p2");
162  ASSERT_EQ(2U, profile_manager->GetNumberOfProfiles());
163  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_SHOW_AVATAR_MENU));
164
165  testing_profile_manager.DeleteTestingProfile("p1");
166  ASSERT_EQ(1U, profile_manager->GetNumberOfProfiles());
167  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_SHOW_AVATAR_MENU));
168
169  testing_profile_manager.DeleteTestingProfile("p2");
170}
171
172//////////////////////////////////////////////////////////////////////////////
173
174// A test browser window that can toggle fullscreen state.
175class FullscreenTestBrowserWindow : public TestBrowserWindow {
176 public:
177  FullscreenTestBrowserWindow() : fullscreen_(false) {}
178  virtual ~FullscreenTestBrowserWindow() {}
179
180  // TestBrowserWindow overrides:
181  virtual bool ShouldHideUIForFullscreen() const OVERRIDE {
182    return fullscreen_;
183  }
184  virtual bool IsFullscreen() const OVERRIDE {
185    return fullscreen_;
186  }
187  virtual void EnterFullscreen(
188      const GURL& url, FullscreenExitBubbleType type) OVERRIDE {
189    fullscreen_ = true;
190  }
191  virtual void ExitFullscreen() OVERRIDE {
192    fullscreen_ = false;
193  }
194
195 private:
196  bool fullscreen_;
197
198  DISALLOW_COPY_AND_ASSIGN(FullscreenTestBrowserWindow);
199};
200
201// Test that uses FullscreenTestBrowserWindow for its window.
202class BrowserCommandControllerFullscreenTest
203    : public BrowserWithTestWindowTest {
204 public:
205  BrowserCommandControllerFullscreenTest() {}
206  virtual ~BrowserCommandControllerFullscreenTest() {}
207
208  // BrowserWithTestWindowTest overrides:
209  virtual BrowserWindow* CreateBrowserWindow() OVERRIDE {
210    return new FullscreenTestBrowserWindow;
211  }
212
213 private:
214  DISALLOW_COPY_AND_ASSIGN(BrowserCommandControllerFullscreenTest);
215};
216
217TEST_F(BrowserCommandControllerFullscreenTest,
218       UpdateCommandsForFullscreenMode) {
219  // Defaults for a tabbed browser.
220  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_OPEN_CURRENT_URL));
221  EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_SHOW_AS_TAB));
222  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_TOOLBAR));
223  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_LOCATION));
224  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_SEARCH));
225  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_MENU_BAR));
226  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_NEXT_PANE));
227  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_PREVIOUS_PANE));
228  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_BOOKMARKS));
229  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_DEVELOPER_MENU));
230  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FEEDBACK));
231  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_OPTIONS));
232  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_IMPORT_SETTINGS));
233  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_EDIT_SEARCH_ENGINES));
234  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_VIEW_PASSWORDS));
235  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_ABOUT));
236  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_SHOW_APP_MENU));
237  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FULLSCREEN));
238
239  // Simulate going fullscreen.
240  chrome::ToggleFullscreenMode(browser());
241  ASSERT_TRUE(browser()->window()->IsFullscreen());
242  browser()->command_controller()->FullscreenStateChanged();
243
244  // Most commands are disabled in fullscreen.
245  EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_OPEN_CURRENT_URL));
246  EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_SHOW_AS_TAB));
247  EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_TOOLBAR));
248  EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_LOCATION));
249  EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_SEARCH));
250  EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_MENU_BAR));
251  EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_NEXT_PANE));
252  EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_PREVIOUS_PANE));
253  EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_BOOKMARKS));
254  EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_DEVELOPER_MENU));
255  EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_FEEDBACK));
256  EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_OPTIONS));
257  EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_IMPORT_SETTINGS));
258  EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_EDIT_SEARCH_ENGINES));
259  EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_VIEW_PASSWORDS));
260  EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_ABOUT));
261  EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_SHOW_APP_MENU));
262  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FULLSCREEN));
263
264  // Exit fullscreen.
265  chrome::ToggleFullscreenMode(browser());
266  ASSERT_FALSE(browser()->window()->IsFullscreen());
267  browser()->command_controller()->FullscreenStateChanged();
268  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_OPEN_CURRENT_URL));
269  EXPECT_FALSE(chrome::IsCommandEnabled(browser(), IDC_SHOW_AS_TAB));
270  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_TOOLBAR));
271  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_LOCATION));
272  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_SEARCH));
273  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_MENU_BAR));
274  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_NEXT_PANE));
275  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_PREVIOUS_PANE));
276  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FOCUS_BOOKMARKS));
277  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_DEVELOPER_MENU));
278  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FEEDBACK));
279  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_OPTIONS));
280  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_IMPORT_SETTINGS));
281  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_EDIT_SEARCH_ENGINES));
282  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_VIEW_PASSWORDS));
283  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_ABOUT));
284  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_SHOW_APP_MENU));
285  EXPECT_TRUE(chrome::IsCommandEnabled(browser(), IDC_FULLSCREEN));
286}
287
288TEST_F(BrowserCommandControllerTest,
289    IncognitoModeOnSigninAllowedPrefChange) {
290  TestingProfileManager testing_profile_manager(
291      TestingBrowserProcess::GetGlobal());
292  ASSERT_TRUE(testing_profile_manager.SetUp());
293
294  // Set up a profile with an off the record profile.
295  TestingProfile::Builder builder;
296  TestingProfile* profile2 = builder.Build().release();
297  profile2->set_incognito(true);
298  TestingProfile::Builder builder2;
299  TestingProfile* profile1 = builder2.Build().release();
300  profile2->SetOriginalProfile(profile1);
301  EXPECT_EQ(profile2->GetOriginalProfile(), profile1);
302  profile1->SetOffTheRecordProfile(profile2);
303
304  // Create a new browser based on the off the record profile.
305  Browser::CreateParams profile_params(profile2, chrome::GetActiveDesktop());
306  scoped_ptr<Browser> browser2(
307      chrome::CreateBrowserWithTestWindowForParams(&profile_params));
308
309  ProfileManager* profile_manager = testing_profile_manager.profile_manager();
310  chrome::BrowserCommandController* command_controller =
311      new chrome::BrowserCommandController(browser2.get(), profile_manager);
312  const CommandUpdater* command_updater = command_controller->command_updater();
313
314  // Check that the SYNC_SETUP command is updated on preference change.
315  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_SHOW_SYNC_SETUP));
316  profile1->GetPrefs()->SetBoolean(prefs::kSigninAllowed, false);
317  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_SHOW_SYNC_SETUP));
318  delete command_controller;
319  browser2.reset();
320  ProfileDestroyer::DestroyProfileWhenAppropriate(profile1);
321}
322
323TEST_F(BrowserCommandControllerTest,
324    OnSigninAllowedPrefChange) {
325  TestingProfileManager testing_profile_manager(
326      TestingBrowserProcess::GetGlobal());
327  ASSERT_TRUE(testing_profile_manager.SetUp());
328  ProfileManager* profile_manager = testing_profile_manager.profile_manager();
329  chrome::BrowserCommandController command_controller(browser(),
330                                                      profile_manager);
331  const CommandUpdater* command_updater = command_controller.command_updater();
332
333  // Check that the SYNC_SETUP command is updated on preference change.
334  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_SHOW_SYNC_SETUP));
335  profile()->GetPrefs()->SetBoolean(prefs::kSigninAllowed, false);
336  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_SHOW_SYNC_SETUP));
337}
338