1 // Copyright 2013 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.
6 #include "ash/system/tray/system_tray.h"
7 #include "base/command_line.h"
8 #include "base/prefs/pref_service.h"
9 #include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
10 #include "chrome/browser/profiles/profile.h"
11 #include "chrome/browser/ui/browser.h"
12 #include "chrome/browser/ui/tabs/tab_strip_model.h"
13 #include "chrome/browser/ui/view_ids.h"
14 #include "chrome/common/pref_names.h"
15 #include "chrome/test/base/in_process_browser_test.h"
16 #include "chrome/test/base/interactive_test_utils.h"
17 #include "ui/aura/root_window.h"
18 #include "ui/events/keycodes/keyboard_codes.h"
19 #include "ui/gfx/native_widget_types.h"
23 class StickyKeysBrowserTest
: public InProcessBrowserTest
{
25 StickyKeysBrowserTest() {}
26 virtual ~StickyKeysBrowserTest() {}
28 void EnableStickyKeys() {
29 AccessibilityManager::Get()->EnableStickyKeys(true);
32 void DisableStickyKeys() {
33 AccessibilityManager::Get()->EnableStickyKeys(false);
36 ash::SystemTray
* GetSystemTray() {
37 return ash::Shell::GetInstance()->GetPrimarySystemTray();
40 void SendKeyPress(ui::KeyboardCode key
) {
41 gfx::NativeWindow root_window
=
42 ash::Shell::GetInstance()->GetPrimaryRootWindow();
44 ui_test_utils::SendKeyPressToWindowSync(root_window
,
52 content::NotificationRegistrar registrar_
;
54 DISALLOW_COPY_AND_ASSIGN(StickyKeysBrowserTest
);
57 IN_PROC_BROWSER_TEST_F(StickyKeysBrowserTest
, OpenTrayMenu
) {
60 // Open system tray bubble with shortcut.
61 SendKeyPress(ui::VKEY_MENU
); // alt key.
62 SendKeyPress(ui::VKEY_SHIFT
);
63 SendKeyPress(ui::VKEY_S
);
64 EXPECT_TRUE(GetSystemTray()->HasSystemBubble());
66 // Hide system bubble.
67 GetSystemTray()->CloseSystemBubble();
68 EXPECT_FALSE(GetSystemTray()->HasSystemBubble());
70 // Pressing S again should not reopen the bubble.
71 SendKeyPress(ui::VKEY_S
);
72 EXPECT_FALSE(GetSystemTray()->HasSystemBubble());
74 // With sticky keys disabled, we will fail to perform the shortcut.
76 SendKeyPress(ui::VKEY_MENU
); // alt key.
77 SendKeyPress(ui::VKEY_SHIFT
);
78 SendKeyPress(ui::VKEY_S
);
79 EXPECT_FALSE(GetSystemTray()->HasSystemBubble());
82 IN_PROC_BROWSER_TEST_F(StickyKeysBrowserTest
, OpenNewTabs
) {
83 // Lock the modifier key.
85 SendKeyPress(ui::VKEY_CONTROL
);
86 SendKeyPress(ui::VKEY_CONTROL
);
88 // In the locked state, pressing 't' should open a new tab each time.
89 TabStripModel
* tab_strip_model
= browser()->tab_strip_model();
91 for (; tab_count
< 5; ++tab_count
) {
92 EXPECT_EQ(tab_count
, tab_strip_model
->count());
93 SendKeyPress(ui::VKEY_T
);
96 // Unlock the modifier key and shortcut should no longer activate.
97 SendKeyPress(ui::VKEY_CONTROL
);
98 SendKeyPress(ui::VKEY_T
);
99 EXPECT_EQ(tab_count
, tab_strip_model
->count());
101 // Shortcut should not work after disabling sticky keys.
103 SendKeyPress(ui::VKEY_CONTROL
);
104 SendKeyPress(ui::VKEY_CONTROL
);
105 SendKeyPress(ui::VKEY_T
);
106 EXPECT_EQ(tab_count
, tab_strip_model
->count());
109 IN_PROC_BROWSER_TEST_F(StickyKeysBrowserTest
, CtrlClickHomeButton
) {
110 // Show home page button.
111 browser()->profile()->GetPrefs()->SetBoolean(prefs::kShowHomeButton
, true);
112 TabStripModel
* tab_strip_model
= browser()->tab_strip_model();
114 EXPECT_EQ(tab_count
, tab_strip_model
->count());
116 // Test sticky keys with modified mouse click action.
118 SendKeyPress(ui::VKEY_CONTROL
);
119 ui_test_utils::ClickOnView(browser(), VIEW_ID_HOME_BUTTON
);
120 EXPECT_EQ(++tab_count
, tab_strip_model
->count());
121 ui_test_utils::ClickOnView(browser(), VIEW_ID_HOME_BUTTON
);
122 EXPECT_EQ(tab_count
, tab_strip_model
->count());
124 // Test locked modifier key with mouse click.
125 SendKeyPress(ui::VKEY_CONTROL
);
126 SendKeyPress(ui::VKEY_CONTROL
);
127 for (; tab_count
< 5; ++tab_count
) {
128 EXPECT_EQ(tab_count
, tab_strip_model
->count());
129 ui_test_utils::ClickOnView(browser(), VIEW_ID_HOME_BUTTON
);
131 SendKeyPress(ui::VKEY_CONTROL
);
132 ui_test_utils::ClickOnView(browser(), VIEW_ID_HOME_BUTTON
);
133 EXPECT_EQ(tab_count
, tab_strip_model
->count());
135 // Test disabling sticky keys prevent modified mouse click.
137 SendKeyPress(ui::VKEY_CONTROL
);
138 ui_test_utils::ClickOnView(browser(), VIEW_ID_HOME_BUTTON
);
139 EXPECT_EQ(tab_count
, tab_strip_model
->count());
142 } // namespace chromeos