Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(595)

Side by Side Diff: chrome/browser/chromeos/events/event_rewriter_unittest.cc

Issue 248343002: Convert chromeos::EventRewriter to a ui::EventRewriter (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@x354034-kder
Patch Set: Bug fix: non-native event under X11 Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/browser/chromeos/events/event_rewriter.cc ('k') | chrome/chrome_browser_chromeos.gypi » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/chromeos/events/event_rewriter.h" 5 #include "chrome/browser/chromeos/events/event_rewriter.h"
6 6
7 #include <X11/keysym.h> 7 #include <X11/keysym.h>
8 #include <X11/XF86keysym.h> 8 #include <X11/XF86keysym.h>
9 #include <X11/Xlib.h> 9 #include <X11/Xlib.h>
10 #undef Bool 10 #undef Bool
11 #undef None 11 #undef None
12 #undef RootWindow 12 #undef RootWindow
13 13
14 #include <vector>
15
14 #include "ash/test/ash_test_base.h" 16 #include "ash/test/ash_test_base.h"
15 #include "ash/wm/window_state.h" 17 #include "ash/wm/window_state.h"
16 #include "base/basictypes.h" 18 #include "base/basictypes.h"
17 #include "base/command_line.h" 19 #include "base/command_line.h"
18 #include "base/prefs/pref_member.h" 20 #include "base/prefs/pref_member.h"
19 #include "base/strings/stringprintf.h" 21 #include "base/strings/stringprintf.h"
20 #include "chrome/browser/chromeos/input_method/input_method_configuration.h" 22 #include "chrome/browser/chromeos/input_method/input_method_configuration.h"
21 #include "chrome/browser/chromeos/input_method/mock_input_method_manager.h" 23 #include "chrome/browser/chromeos/input_method/mock_input_method_manager.h"
22 #include "chrome/browser/chromeos/login/mock_user_manager.h" 24 #include "chrome/browser/chromeos/login/mock_user_manager.h"
23 #include "chrome/browser/chromeos/login/user_manager.h" 25 #include "chrome/browser/chromeos/login/user_manager.h"
24 #include "chrome/browser/chromeos/preferences.h" 26 #include "chrome/browser/chromeos/preferences.h"
25 #include "chrome/common/pref_names.h" 27 #include "chrome/common/pref_names.h"
26 #include "chrome/test/base/testing_pref_service_syncable.h" 28 #include "chrome/test/base/testing_pref_service_syncable.h"
27 #include "chromeos/chromeos_switches.h" 29 #include "chromeos/chromeos_switches.h"
28 #include "chromeos/ime/fake_ime_keyboard.h" 30 #include "chromeos/ime/fake_ime_keyboard.h"
29 #include "testing/gtest/include/gtest/gtest.h" 31 #include "testing/gtest/include/gtest/gtest.h"
30 #include "ui/aura/window.h" 32 #include "ui/aura/window.h"
31 #include "ui/events/event.h" 33 #include "ui/events/event.h"
34 #include "ui/events/event_rewriter.h"
32 #include "ui/events/test/events_test_utils_x11.h" 35 #include "ui/events/test/events_test_utils_x11.h"
33 #include "ui/events/x/touch_factory_x11.h" 36 #include "ui/events/x/touch_factory_x11.h"
34 #include "ui/gfx/x/x11_types.h" 37 #include "ui/gfx/x/x11_types.h"
35 38
36 namespace { 39 namespace {
37 40
41 std::string GetKeyEventAsString(const ui::KeyEvent& keyevent) {
42 return base::StringPrintf("ui_keycode=0x%X ui_flags=0x%X ui_type=%d",
43 keyevent.key_code(),
44 keyevent.flags(),
45 keyevent.type());
46 }
47
38 std::string GetRewrittenEventAsString(chromeos::EventRewriter* rewriter, 48 std::string GetRewrittenEventAsString(chromeos::EventRewriter* rewriter,
39 ui::KeyboardCode ui_keycode, 49 ui::KeyboardCode ui_keycode,
40 int ui_flags, 50 int ui_flags,
41 ui::EventType ui_type, 51 ui::EventType ui_type) {
42 KeyCode x_keycode, 52 const ui::KeyEvent event(ui_type, ui_keycode, ui_flags, false);
43 unsigned int x_state) { 53 scoped_ptr<ui::Event> new_event;
44 ui::ScopedXI2Event xev; 54 rewriter->RewriteEvent(event, &new_event);
45 xev.InitKeyEvent(ui_type, ui_keycode, ui_flags); 55 if (new_event)
46 XEvent* xevent = xev; 56 return GetKeyEventAsString(
47 xevent->xkey.keycode = x_keycode; 57 static_cast<const ui::KeyEvent&>(*new_event.get()));
48 xevent->xkey.state = x_state; 58 return GetKeyEventAsString(event);
49 rewriter->RewriteForTesting(xevent);
50 ui::KeyEvent keyevent(xevent, false /* is_char */);
51 return base::StringPrintf(
52 "ui_keycode=%d ui_flags=%d ui_type=%d x_keycode=%u x_state=%u x_type=%d",
53 keyevent.key_code(), keyevent.flags(), keyevent.type(),
54 xevent->xkey.keycode, xevent->xkey.state, xevent->xkey.type);
55 } 59 }
56 60
57 std::string GetExpectedResultAsString(ui::KeyboardCode ui_keycode, 61 std::string GetExpectedResultAsString(ui::KeyboardCode ui_keycode,
58 int ui_flags, 62 int ui_flags,
59 ui::EventType ui_type, 63 ui::EventType ui_type) {
60 KeyCode x_keycode, 64 return base::StringPrintf("ui_keycode=0x%X ui_flags=0x%X ui_type=%d",
61 unsigned int x_state, 65 ui_keycode,
62 int x_type) { 66 ui_flags,
63 return base::StringPrintf( 67 ui_type);
64 "ui_keycode=%d ui_flags=%d ui_type=%d x_keycode=%u x_state=%u x_type=%d", 68 }
65 ui_keycode, ui_flags, ui_type, x_keycode, x_state, x_type); 69
70 std::string GetRewrittenEventNumbered(size_t i,
71 chromeos::EventRewriter* rewriter,
72 ui::KeyboardCode ui_keycode,
73 int ui_flags,
74 ui::EventType ui_type) {
75 return base::StringPrintf("(%zu) ", i) +
76 GetRewrittenEventAsString(rewriter, ui_keycode, ui_flags, ui_type);
77 }
78
79 std::string GetExpectedResultNumbered(size_t i,
80 ui::KeyboardCode ui_keycode,
81 int ui_flags,
82 ui::EventType ui_type) {
83 return base::StringPrintf("(%zu) ", i) +
84 GetExpectedResultAsString(ui_keycode, ui_flags, ui_type);
66 } 85 }
67 86
68 } // namespace 87 } // namespace
69 88
70 namespace chromeos { 89 namespace chromeos {
71 90
72 class EventRewriterTest : public ash::test::AshTestBase { 91 class EventRewriterTest : public ash::test::AshTestBase {
73 public: 92 public:
74 EventRewriterTest() 93 EventRewriterTest()
75 : display_(gfx::GetXDisplay()), 94 : display_(gfx::GetXDisplay()),
76 keycode_a_(XKeysymToKeycode(display_, XK_a)),
77 keycode_alt_l_(XKeysymToKeycode(display_, XK_Alt_L)),
78 keycode_alt_r_(XKeysymToKeycode(display_, XK_Alt_R)),
79 keycode_b_(XKeysymToKeycode(display_, XK_B)),
80 keycode_caps_lock_(XKeysymToKeycode(display_, XK_Caps_Lock)),
81 keycode_control_l_(XKeysymToKeycode(display_, XK_Control_L)),
82 keycode_control_r_(XKeysymToKeycode(display_, XK_Control_R)),
83 keycode_meta_l_(XKeysymToKeycode(display_, XK_Meta_L)),
84 keycode_meta_r_(XKeysymToKeycode(display_, XK_Meta_R)),
85 keycode_num_pad_0_(XKeysymToKeycode(display_, XK_KP_0)),
86 keycode_num_pad_1_(XKeysymToKeycode(display_, XK_KP_1)),
87 keycode_num_pad_2_(XKeysymToKeycode(display_, XK_KP_2)),
88 keycode_num_pad_3_(XKeysymToKeycode(display_, XK_KP_3)),
89 keycode_num_pad_4_(XKeysymToKeycode(display_, XK_KP_4)),
90 keycode_num_pad_5_(XKeysymToKeycode(display_, XK_KP_5)),
91 keycode_num_pad_6_(XKeysymToKeycode(display_, XK_KP_6)),
92 keycode_num_pad_7_(XKeysymToKeycode(display_, XK_KP_7)),
93 keycode_num_pad_8_(XKeysymToKeycode(display_, XK_KP_8)),
94 keycode_num_pad_9_(XKeysymToKeycode(display_, XK_KP_9)),
95 keycode_num_pad_begin_(XKeysymToKeycode(display_, XK_KP_Begin)),
96 keycode_num_pad_decimal_(XKeysymToKeycode(display_, XK_KP_Decimal)),
97 keycode_num_pad_delete_(XKeysymToKeycode(display_, XK_KP_Delete)),
98 keycode_num_pad_down_(XKeysymToKeycode(display_, XK_KP_Down)),
99 keycode_num_pad_end_(XKeysymToKeycode(display_, XK_KP_End)),
100 keycode_num_pad_home_(XKeysymToKeycode(display_, XK_KP_Home)),
101 keycode_num_pad_insert_(XKeysymToKeycode(display_, XK_KP_Insert)),
102 keycode_num_pad_left_(XKeysymToKeycode(display_, XK_KP_Left)),
103 keycode_num_pad_next_(XKeysymToKeycode(display_, XK_KP_Next)),
104 keycode_num_pad_prior_(XKeysymToKeycode(display_, XK_KP_Prior)),
105 keycode_num_pad_right_(XKeysymToKeycode(display_, XK_KP_Right)),
106 keycode_num_pad_up_(XKeysymToKeycode(display_, XK_KP_Up)),
107 keycode_super_l_(XKeysymToKeycode(display_, XK_Super_L)),
108 keycode_super_r_(XKeysymToKeycode(display_, XK_Super_R)),
109 keycode_void_symbol_(XKeysymToKeycode(display_, XK_VoidSymbol)),
110 keycode_delete_(XKeysymToKeycode(display_, XK_Delete)),
111 keycode_backspace_(XKeysymToKeycode(display_, XK_BackSpace)),
112 keycode_up_(XKeysymToKeycode(display_, XK_Up)),
113 keycode_down_(XKeysymToKeycode(display_, XK_Down)),
114 keycode_left_(XKeysymToKeycode(display_, XK_Left)),
115 keycode_right_(XKeysymToKeycode(display_, XK_Right)),
116 keycode_prior_(XKeysymToKeycode(display_, XK_Prior)),
117 keycode_next_(XKeysymToKeycode(display_, XK_Next)),
118 keycode_home_(XKeysymToKeycode(display_, XK_Home)),
119 keycode_end_(XKeysymToKeycode(display_, XK_End)),
120 keycode_escape_(XKeysymToKeycode(display_, XK_Escape)),
121 keycode_launch6_(XKeysymToKeycode(display_, XF86XK_Launch6)),
122 keycode_launch7_(XKeysymToKeycode(display_, XF86XK_Launch7)),
123 keycode_f1_(XKeysymToKeycode(display_, XK_F1)),
124 keycode_f2_(XKeysymToKeycode(display_, XK_F2)),
125 keycode_f3_(XKeysymToKeycode(display_, XK_F3)),
126 keycode_f4_(XKeysymToKeycode(display_, XK_F4)),
127 keycode_f5_(XKeysymToKeycode(display_, XK_F5)),
128 keycode_f6_(XKeysymToKeycode(display_, XK_F6)),
129 keycode_f7_(XKeysymToKeycode(display_, XK_F7)),
130 keycode_f8_(XKeysymToKeycode(display_, XK_F8)),
131 keycode_f9_(XKeysymToKeycode(display_, XK_F9)),
132 keycode_f10_(XKeysymToKeycode(display_, XK_F10)),
133 keycode_f11_(XKeysymToKeycode(display_, XK_F11)),
134 keycode_f12_(XKeysymToKeycode(display_, XK_F12)),
135 keycode_browser_back_(XKeysymToKeycode(display_, XF86XK_Back)),
136 keycode_browser_forward_(XKeysymToKeycode(display_, XF86XK_Forward)),
137 keycode_browser_refresh_(XKeysymToKeycode(display_, XF86XK_Reload)),
138 keycode_media_launch_app1_(XKeysymToKeycode(display_, XF86XK_LaunchA)),
139 keycode_media_launch_app2_(XKeysymToKeycode(display_, XF86XK_LaunchB)),
140 keycode_brightness_down_(XKeysymToKeycode(
141 display_, XF86XK_MonBrightnessDown)),
142 keycode_brightness_up_(XKeysymToKeycode(
143 display_, XF86XK_MonBrightnessUp)),
144 keycode_volume_mute_(XKeysymToKeycode(display_, XF86XK_AudioMute)),
145 keycode_volume_down_(XKeysymToKeycode(
146 display_, XF86XK_AudioLowerVolume)),
147 keycode_volume_up_(XKeysymToKeycode(
148 display_, XF86XK_AudioRaiseVolume)),
149 keycode_power_(XKeysymToKeycode(display_, XF86XK_PowerOff)),
150 keycode_1_(XKeysymToKeycode(display_, XK_1)),
151 keycode_2_(XKeysymToKeycode(display_, XK_2)),
152 keycode_3_(XKeysymToKeycode(display_, XK_3)),
153 keycode_4_(XKeysymToKeycode(display_, XK_4)),
154 keycode_5_(XKeysymToKeycode(display_, XK_5)),
155 keycode_6_(XKeysymToKeycode(display_, XK_6)),
156 keycode_7_(XKeysymToKeycode(display_, XK_7)),
157 keycode_8_(XKeysymToKeycode(display_, XK_8)),
158 keycode_9_(XKeysymToKeycode(display_, XK_9)),
159 keycode_0_(XKeysymToKeycode(display_, XK_0)),
160 keycode_minus_(XKeysymToKeycode(display_, XK_minus)),
161 keycode_equal_(XKeysymToKeycode(display_, XK_equal)),
162 keycode_period_(XKeysymToKeycode(display_, XK_period)),
163 keycode_insert_(XKeysymToKeycode(display_, XK_Insert)),
164 mock_user_manager_(new chromeos::MockUserManager), 95 mock_user_manager_(new chromeos::MockUserManager),
165 user_manager_enabler_(mock_user_manager_), 96 user_manager_enabler_(mock_user_manager_),
166 input_method_manager_mock_(NULL) { 97 input_method_manager_mock_(NULL) {
167 } 98 }
168 virtual ~EventRewriterTest() {} 99 virtual ~EventRewriterTest() {}
169 100
170 virtual void SetUp() { 101 virtual void SetUp() {
171 // Mocking user manager because the real one needs to be called on UI thread 102 // Mocking user manager because the real one needs to be called on UI thread
172 EXPECT_CALL(*mock_user_manager_, IsLoggedInAsGuest()) 103 EXPECT_CALL(*mock_user_manager_, IsLoggedInAsGuest())
173 .WillRepeatedly(testing::Return(false)); 104 .WillRepeatedly(testing::Return(false));
174 input_method_manager_mock_ = 105 input_method_manager_mock_ =
175 new chromeos::input_method::MockInputMethodManager; 106 new chromeos::input_method::MockInputMethodManager;
176 chromeos::input_method::InitializeForTesting( 107 chromeos::input_method::InitializeForTesting(
177 input_method_manager_mock_); // pass ownership 108 input_method_manager_mock_); // pass ownership
178 109
179 AshTestBase::SetUp(); 110 AshTestBase::SetUp();
180 } 111 }
181 112
182 virtual void TearDown() { 113 virtual void TearDown() {
183 AshTestBase::TearDown(); 114 AshTestBase::TearDown();
184 // Shutdown() deletes the IME mock object. 115 // Shutdown() deletes the IME mock object.
185 chromeos::input_method::Shutdown(); 116 chromeos::input_method::Shutdown();
186 } 117 }
187 118
188 protected: 119 protected:
189 void TestRewriteNumPadKeys(); 120 void TestRewriteNumPadKeys();
190 void TestRewriteNumPadKeysOnAppleKeyboard(); 121 void TestRewriteNumPadKeysOnAppleKeyboard();
191 122
192 void RewriteMouseEvent(EventRewriter* rewriter, 123 int RewriteMouseEvent(chromeos::EventRewriter* rewriter,
193 ui::MouseEvent* event) { 124 const ui::MouseEvent& event) {
194 XEvent* xevent = event->native_event(); 125 int flags = event.flags();
195 rewriter->RewriteLocatedEvent(xevent); 126 rewriter->RewriteLocatedEventForTesting(event, &flags);
196 *event = ui::MouseEvent(xevent); 127 return flags;
197 } 128 }
198 129
199 Display* display_; 130 Display* display_;
200 const KeyCode keycode_a_;
201 const KeyCode keycode_alt_l_;
202 const KeyCode keycode_alt_r_;
203 const KeyCode keycode_b_;
204 const KeyCode keycode_caps_lock_;
205 const KeyCode keycode_control_l_;
206 const KeyCode keycode_control_r_;
207 const KeyCode keycode_meta_l_;
208 const KeyCode keycode_meta_r_;
209 const KeyCode keycode_num_pad_0_;
210 const KeyCode keycode_num_pad_1_;
211 const KeyCode keycode_num_pad_2_;
212 const KeyCode keycode_num_pad_3_;
213 const KeyCode keycode_num_pad_4_;
214 const KeyCode keycode_num_pad_5_;
215 const KeyCode keycode_num_pad_6_;
216 const KeyCode keycode_num_pad_7_;
217 const KeyCode keycode_num_pad_8_;
218 const KeyCode keycode_num_pad_9_;
219 const KeyCode keycode_num_pad_begin_;
220 const KeyCode keycode_num_pad_decimal_;
221 const KeyCode keycode_num_pad_delete_;
222 const KeyCode keycode_num_pad_down_;
223 const KeyCode keycode_num_pad_end_;
224 const KeyCode keycode_num_pad_home_;
225 const KeyCode keycode_num_pad_insert_;
226 const KeyCode keycode_num_pad_left_;
227 const KeyCode keycode_num_pad_next_;
228 const KeyCode keycode_num_pad_prior_;
229 const KeyCode keycode_num_pad_right_;
230 const KeyCode keycode_num_pad_up_;
231 const KeyCode keycode_super_l_;
232 const KeyCode keycode_super_r_;
233 const KeyCode keycode_void_symbol_;
234 const KeyCode keycode_delete_;
235 const KeyCode keycode_backspace_;
236 const KeyCode keycode_up_;
237 const KeyCode keycode_down_;
238 const KeyCode keycode_left_;
239 const KeyCode keycode_right_;
240 const KeyCode keycode_prior_;
241 const KeyCode keycode_next_;
242 const KeyCode keycode_home_;
243 const KeyCode keycode_end_;
244 const KeyCode keycode_escape_;
245 const KeyCode keycode_launch6_; // F15
246 const KeyCode keycode_launch7_; // F16
247 const KeyCode keycode_f1_;
248 const KeyCode keycode_f2_;
249 const KeyCode keycode_f3_;
250 const KeyCode keycode_f4_;
251 const KeyCode keycode_f5_;
252 const KeyCode keycode_f6_;
253 const KeyCode keycode_f7_;
254 const KeyCode keycode_f8_;
255 const KeyCode keycode_f9_;
256 const KeyCode keycode_f10_;
257 const KeyCode keycode_f11_;
258 const KeyCode keycode_f12_;
259 const KeyCode keycode_browser_back_;
260 const KeyCode keycode_browser_forward_;
261 const KeyCode keycode_browser_refresh_;
262 const KeyCode keycode_media_launch_app1_;
263 const KeyCode keycode_media_launch_app2_;
264 const KeyCode keycode_brightness_down_;
265 const KeyCode keycode_brightness_up_;
266 const KeyCode keycode_volume_mute_;
267 const KeyCode keycode_volume_down_;
268 const KeyCode keycode_volume_up_;
269 const KeyCode keycode_power_;
270 const KeyCode keycode_1_;
271 const KeyCode keycode_2_;
272 const KeyCode keycode_3_;
273 const KeyCode keycode_4_;
274 const KeyCode keycode_5_;
275 const KeyCode keycode_6_;
276 const KeyCode keycode_7_;
277 const KeyCode keycode_8_;
278 const KeyCode keycode_9_;
279 const KeyCode keycode_0_;
280 const KeyCode keycode_minus_;
281 const KeyCode keycode_equal_;
282 const KeyCode keycode_period_;
283 const KeyCode keycode_insert_;
284 chromeos::MockUserManager* mock_user_manager_; // Not owned. 131 chromeos::MockUserManager* mock_user_manager_; // Not owned.
285 chromeos::ScopedUserManagerEnabler user_manager_enabler_; 132 chromeos::ScopedUserManagerEnabler user_manager_enabler_;
286 chromeos::input_method::MockInputMethodManager* input_method_manager_mock_; 133 chromeos::input_method::MockInputMethodManager* input_method_manager_mock_;
287 }; 134 };
288 135
289 TEST_F(EventRewriterTest, TestGetDeviceType) {
290 // This is the typical string which an Apple keyboard sends.
291 EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard,
292 EventRewriter::GetDeviceType("Apple Inc. Apple Keyboard"));
293
294 // Other cases we accept.
295 EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard,
296 EventRewriter::GetDeviceType("Apple Keyboard"));
297 EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard,
298 EventRewriter::GetDeviceType("apple keyboard"));
299 EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard,
300 EventRewriter::GetDeviceType("apple keyboard."));
301 EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard,
302 EventRewriter::GetDeviceType("apple.keyboard."));
303 EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard,
304 EventRewriter::GetDeviceType(".apple.keyboard."));
305
306 // Dell, Microsoft, Logitech, ... should be recognized as a kDeviceUnknown.
307 EXPECT_EQ(EventRewriter::kDeviceUnknown,
308 EventRewriter::GetDeviceType("Dell Dell USB Entry Keyboard"));
309 EXPECT_EQ(EventRewriter::kDeviceUnknown,
310 EventRewriter::GetDeviceType(
311 "Microsoft Natural Ergonomic Keyboard"));
312 EXPECT_EQ(EventRewriter::kDeviceUnknown,
313 EventRewriter::GetDeviceType("CHESEN USB Keyboard"));
314
315 // Some corner cases.
316 EXPECT_EQ(EventRewriter::kDeviceUnknown, EventRewriter::GetDeviceType(""));
317 EXPECT_EQ(EventRewriter::kDeviceUnknown,
318 EventRewriter::GetDeviceType("."));
319 EXPECT_EQ(EventRewriter::kDeviceUnknown,
320 EventRewriter::GetDeviceType(". "));
321 EXPECT_EQ(EventRewriter::kDeviceUnknown,
322 EventRewriter::GetDeviceType(" ."));
323 EXPECT_EQ(EventRewriter::kDeviceUnknown,
324 EventRewriter::GetDeviceType("not-an-apple keyboard"));
325 }
326
327 TEST_F(EventRewriterTest, TestDeviceAddedOrRemoved) {
328 EventRewriter rewriter;
329 EXPECT_TRUE(rewriter.device_id_to_type_for_testing().empty());
330 EXPECT_EQ(EventRewriter::kDeviceUnknown,
331 rewriter.DeviceAddedForTesting(0, "PC Keyboard"));
332 EXPECT_EQ(1U, rewriter.device_id_to_type_for_testing().size());
333 EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard,
334 rewriter.DeviceAddedForTesting(1, "Apple Keyboard"));
335 EXPECT_EQ(2U, rewriter.device_id_to_type_for_testing().size());
336 // Try to reuse the first ID.
337 EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard,
338 rewriter.DeviceAddedForTesting(0, "Apple Keyboard"));
339 EXPECT_EQ(2U, rewriter.device_id_to_type_for_testing().size());
340 }
341
342 TEST_F(EventRewriterTest, TestRewriteCommandToControl) { 136 TEST_F(EventRewriterTest, TestRewriteCommandToControl) {
343 // First, test with a PC keyboard. 137 // First, test with a PC keyboard.
344 TestingPrefServiceSyncable prefs; 138 TestingPrefServiceSyncable prefs;
345 EventRewriter rewriter; 139 EventRewriter rewriter;
346 rewriter.DeviceAddedForTesting(0, "PC Keyboard"); 140 rewriter.DeviceAddedForTesting(0, "PC Keyboard");
347 rewriter.set_last_device_id_for_testing(0); 141 rewriter.set_last_device_id_for_testing(0);
348 rewriter.set_pref_service_for_testing(&prefs); 142 rewriter.set_pref_service_for_testing(&prefs);
349 143
350 // XK_a, Alt modifier. 144 // VKEY_A, Alt modifier.
145 EXPECT_EQ(GetExpectedResultAsString(
146 ui::VKEY_A, ui::EF_ALT_DOWN, ui::ET_KEY_PRESSED),
147 GetRewrittenEventAsString(
148 &rewriter, ui::VKEY_A, ui::EF_ALT_DOWN, ui::ET_KEY_PRESSED));
149
150 // VKEY_A, Win modifier.
151 EXPECT_EQ(
152 GetExpectedResultAsString(
153 ui::VKEY_A, ui::EF_COMMAND_DOWN, ui::ET_KEY_PRESSED),
154 GetRewrittenEventAsString(
155 &rewriter, ui::VKEY_A, ui::EF_COMMAND_DOWN, ui::ET_KEY_PRESSED));
156
157 // VKEY_A, Alt+Win modifier.
351 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, 158 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A,
352 ui::EF_ALT_DOWN, 159 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
353 ui::ET_KEY_PRESSED, 160 ui::ET_KEY_PRESSED),
354 keycode_a_,
355 Mod1Mask,
356 KeyPress),
357 GetRewrittenEventAsString(&rewriter, 161 GetRewrittenEventAsString(&rewriter,
358 ui::VKEY_A, 162 ui::VKEY_A,
359 ui::EF_ALT_DOWN, 163 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
360 ui::ET_KEY_PRESSED, 164 ui::ET_KEY_PRESSED));
361 keycode_a_,
362 Mod1Mask));
363 165
364 // XK_a, Win modifier. 166 // VKEY_LWIN (left Windows key), Alt modifier.
365 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A,
366 0,
367 ui::ET_KEY_PRESSED,
368 keycode_a_,
369 Mod4Mask,
370 KeyPress),
371 GetRewrittenEventAsString(&rewriter,
372 ui::VKEY_A,
373 0,
374 ui::ET_KEY_PRESSED,
375 keycode_a_,
376 Mod4Mask));
377
378 // XK_a, Alt+Win modifier.
379 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A,
380 ui::EF_ALT_DOWN,
381 ui::ET_KEY_PRESSED,
382 keycode_a_,
383 Mod1Mask | Mod4Mask,
384 KeyPress),
385 GetRewrittenEventAsString(&rewriter,
386 ui::VKEY_A,
387 ui::EF_ALT_DOWN,
388 ui::ET_KEY_PRESSED,
389 keycode_a_,
390 Mod1Mask | Mod4Mask));
391
392 // XK_Super_L (left Windows key), Alt modifier.
393 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_LWIN, 167 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_LWIN,
394 ui::EF_ALT_DOWN, 168 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
395 ui::ET_KEY_PRESSED, 169 ui::ET_KEY_PRESSED),
396 keycode_super_l_,
397 Mod1Mask,
398 KeyPress),
399 GetRewrittenEventAsString(&rewriter, 170 GetRewrittenEventAsString(&rewriter,
400 ui::VKEY_LWIN, 171 ui::VKEY_LWIN,
401 ui::EF_ALT_DOWN, 172 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
402 ui::ET_KEY_PRESSED, 173 ui::ET_KEY_PRESSED));
403 keycode_super_l_,
404 Mod1Mask));
405 174
406 // XK_Super_R (right Windows key), Alt modifier. 175 // VKEY_RWIN (right Windows key), Alt modifier.
407 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_RWIN, 176 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_RWIN,
408 ui::EF_ALT_DOWN, 177 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
409 ui::ET_KEY_PRESSED, 178 ui::ET_KEY_PRESSED),
410 keycode_super_r_,
411 Mod1Mask,
412 KeyPress),
413 GetRewrittenEventAsString(&rewriter, 179 GetRewrittenEventAsString(&rewriter,
414 ui::VKEY_RWIN, 180 ui::VKEY_RWIN,
415 ui::EF_ALT_DOWN, 181 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
416 ui::ET_KEY_PRESSED, 182 ui::ET_KEY_PRESSED));
417 keycode_super_r_,
418 Mod1Mask));
419 183
420 // An Apple keyboard reusing the ID, zero. 184 // An Apple keyboard reusing the ID, zero.
421 rewriter.DeviceAddedForTesting(0, "Apple Keyboard"); 185 rewriter.DeviceAddedForTesting(0, "Apple Keyboard");
422 rewriter.set_last_device_id_for_testing(0); 186 rewriter.set_last_device_id_for_testing(0);
423 187
424 // XK_a, Alt modifier. 188 // VKEY_A, Alt modifier.
189 EXPECT_EQ(GetExpectedResultAsString(
190 ui::VKEY_A, ui::EF_ALT_DOWN, ui::ET_KEY_PRESSED),
191 GetRewrittenEventAsString(
192 &rewriter, ui::VKEY_A, ui::EF_ALT_DOWN, ui::ET_KEY_PRESSED));
193
194 // VKEY_A, Win modifier.
195 EXPECT_EQ(
196 GetExpectedResultAsString(
197 ui::VKEY_A, ui::EF_CONTROL_DOWN, ui::ET_KEY_PRESSED),
198 GetRewrittenEventAsString(
199 &rewriter, ui::VKEY_A, ui::EF_COMMAND_DOWN, ui::ET_KEY_PRESSED));
200
201 // VKEY_A, Alt+Win modifier.
425 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, 202 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A,
426 ui::EF_ALT_DOWN, 203 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
427 ui::ET_KEY_PRESSED, 204 ui::ET_KEY_PRESSED),
428 keycode_a_,
429 Mod1Mask,
430 KeyPress),
431 GetRewrittenEventAsString(&rewriter, 205 GetRewrittenEventAsString(&rewriter,
432 ui::VKEY_A, 206 ui::VKEY_A,
433 ui::EF_ALT_DOWN, 207 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
434 ui::ET_KEY_PRESSED, 208 ui::ET_KEY_PRESSED));
435 keycode_a_,
436 Mod1Mask));
437 209
438 // XK_a, Win modifier. 210 // VKEY_LWIN (left Windows key), Alt modifier.
439 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A,
440 ui::EF_CONTROL_DOWN,
441 ui::ET_KEY_PRESSED,
442 keycode_a_,
443 ControlMask,
444 KeyPress),
445 GetRewrittenEventAsString(&rewriter,
446 ui::VKEY_A,
447 0,
448 ui::ET_KEY_PRESSED,
449 keycode_a_,
450 Mod4Mask));
451
452 // XK_a, Alt+Win modifier.
453 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A,
454 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
455 ui::ET_KEY_PRESSED,
456 keycode_a_,
457 Mod1Mask | ControlMask,
458 KeyPress),
459 GetRewrittenEventAsString(&rewriter,
460 ui::VKEY_A,
461 ui::EF_ALT_DOWN,
462 ui::ET_KEY_PRESSED,
463 keycode_a_,
464 Mod1Mask | Mod4Mask));
465
466 // XK_Super_L (left Windows key), Alt modifier.
467 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, 211 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL,
468 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, 212 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
469 ui::ET_KEY_PRESSED, 213 ui::ET_KEY_PRESSED),
470 keycode_control_l_,
471 Mod1Mask,
472 KeyPress),
473 GetRewrittenEventAsString(&rewriter, 214 GetRewrittenEventAsString(&rewriter,
474 ui::VKEY_LWIN, 215 ui::VKEY_LWIN,
475 ui::EF_ALT_DOWN, 216 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN,
476 ui::ET_KEY_PRESSED, 217 ui::ET_KEY_PRESSED));
477 keycode_super_l_,
478 Mod1Mask));
479 218
480 // XK_Super_R (right Windows key), Alt modifier. 219 // VKEY_RWIN (right Windows key), Alt modifier.
481 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, 220 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL,
482 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, 221 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
483 ui::ET_KEY_PRESSED, 222 ui::ET_KEY_PRESSED),
484 keycode_control_r_,
485 Mod1Mask,
486 KeyPress),
487 GetRewrittenEventAsString(&rewriter, 223 GetRewrittenEventAsString(&rewriter,
488 ui::VKEY_RWIN, 224 ui::VKEY_RWIN,
489 ui::EF_ALT_DOWN, 225 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN,
490 ui::ET_KEY_PRESSED, 226 ui::ET_KEY_PRESSED));
491 keycode_super_r_,
492 Mod1Mask));
493 } 227 }
494 228
495 // For crbug.com/133896. 229 // For crbug.com/133896.
496 TEST_F(EventRewriterTest, TestRewriteCommandToControlWithControlRemapped) { 230 TEST_F(EventRewriterTest, TestRewriteCommandToControlWithControlRemapped) {
497 // Remap Control to Alt. 231 // Remap Control to Alt.
498 TestingPrefServiceSyncable prefs; 232 TestingPrefServiceSyncable prefs;
499 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 233 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
500 IntegerPrefMember control; 234 IntegerPrefMember control;
501 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); 235 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs);
502 control.SetValue(chromeos::input_method::kAltKey); 236 control.SetValue(chromeos::input_method::kAltKey);
503 237
504 EventRewriter rewriter; 238 EventRewriter rewriter;
505 rewriter.set_pref_service_for_testing(&prefs); 239 rewriter.set_pref_service_for_testing(&prefs);
506 rewriter.DeviceAddedForTesting(0, "PC Keyboard"); 240 rewriter.DeviceAddedForTesting(0, "PC Keyboard");
507 rewriter.set_last_device_id_for_testing(0); 241 rewriter.set_last_device_id_for_testing(0);
508 242
509 // XK_Control_L (left Control key) should be remapped to Alt. 243 // Control should be remapped to Alt.
510 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU, 244 EXPECT_EQ(GetExpectedResultAsString(
511 ui::EF_ALT_DOWN, 245 ui::VKEY_MENU, ui::EF_ALT_DOWN, ui::ET_KEY_PRESSED),
512 ui::ET_KEY_PRESSED,
513 keycode_alt_l_,
514 0U,
515 KeyPress),
516 GetRewrittenEventAsString(&rewriter, 246 GetRewrittenEventAsString(&rewriter,
517 ui::VKEY_CONTROL, 247 ui::VKEY_CONTROL,
518 0, 248 ui::EF_CONTROL_DOWN,
519 ui::ET_KEY_PRESSED, 249 ui::ET_KEY_PRESSED));
520 keycode_control_l_,
521 0U));
522 250
523 // An Apple keyboard reusing the ID, zero. 251 // An Apple keyboard reusing the ID, zero.
524 rewriter.DeviceAddedForTesting(0, "Apple Keyboard"); 252 rewriter.DeviceAddedForTesting(0, "Apple Keyboard");
525 rewriter.set_last_device_id_for_testing(0); 253 rewriter.set_last_device_id_for_testing(0);
526 254
527 // XK_Super_L (left Command key) with Alt modifier. The remapped Command key 255 // VKEY_LWIN (left Command key) with Alt modifier. The remapped Command key
528 // should never be re-remapped to Alt. 256 // should never be re-remapped to Alt.
529 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, 257 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL,
530 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, 258 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
531 ui::ET_KEY_PRESSED, 259 ui::ET_KEY_PRESSED),
532 keycode_control_l_,
533 Mod1Mask,
534 KeyPress),
535 GetRewrittenEventAsString(&rewriter, 260 GetRewrittenEventAsString(&rewriter,
536 ui::VKEY_LWIN, 261 ui::VKEY_LWIN,
537 ui::EF_ALT_DOWN, 262 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN,
538 ui::ET_KEY_PRESSED, 263 ui::ET_KEY_PRESSED));
539 keycode_super_l_,
540 Mod1Mask));
541 264
542 // XK_Super_R (right Command key) with Alt modifier. The remapped Command key 265 // VKEY_RWIN (right Command key) with Alt modifier. The remapped Command key
543 // should never be re-remapped to Alt. 266 // should never be re-remapped to Alt.
544 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, 267 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL,
545 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, 268 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
546 ui::ET_KEY_PRESSED, 269 ui::ET_KEY_PRESSED),
547 keycode_control_r_,
548 Mod1Mask,
549 KeyPress),
550 GetRewrittenEventAsString(&rewriter, 270 GetRewrittenEventAsString(&rewriter,
551 ui::VKEY_RWIN, 271 ui::VKEY_RWIN,
552 ui::EF_ALT_DOWN, 272 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN,
553 ui::ET_KEY_PRESSED, 273 ui::ET_KEY_PRESSED));
554 keycode_super_r_,
555 Mod1Mask));
556 } 274 }
557 275
558 void EventRewriterTest::TestRewriteNumPadKeys() { 276 void EventRewriterTest::TestRewriteNumPadKeys() {
559 TestingPrefServiceSyncable prefs; 277 TestingPrefServiceSyncable prefs;
560 EventRewriter rewriter; 278 EventRewriter rewriter;
561 rewriter.set_pref_service_for_testing(&prefs); 279 rewriter.set_pref_service_for_testing(&prefs);
562 280
563 // XK_KP_Insert (= NumPad 0 without Num Lock), no modifier. 281 // XK_KP_Insert (= NumPad 0 without Num Lock), no modifier.
564 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD0, 282 EXPECT_EQ(
565 ui::EF_NUMPAD_KEY, 283 GetExpectedResultAsString(
566 ui::ET_KEY_PRESSED, 284 ui::VKEY_NUMPAD0, ui::EF_NUMPAD_KEY, ui::ET_KEY_PRESSED),
567 keycode_num_pad_0_, 285 GetRewrittenEventAsString(
568 Mod2Mask, // Num Lock 286 &rewriter, ui::VKEY_INSERT, ui::EF_NUMPAD_KEY, ui::ET_KEY_PRESSED));
569 KeyPress),
570 GetRewrittenEventAsString(&rewriter,
571 ui::VKEY_INSERT,
572 0,
573 ui::ET_KEY_PRESSED,
574 keycode_num_pad_insert_,
575 0));
576 287
577 // XK_KP_Insert (= NumPad 0 without Num Lock), Alt modifier. 288 // XK_KP_Insert (= NumPad 0 without Num Lock), Alt modifier.
578 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD0, 289 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD0,
579 ui::EF_ALT_DOWN | ui::EF_NUMPAD_KEY, 290 ui::EF_ALT_DOWN | ui::EF_NUMPAD_KEY,
580 ui::ET_KEY_PRESSED, 291 ui::ET_KEY_PRESSED),
581 keycode_num_pad_0_,
582 Mod1Mask | Mod2Mask,
583 KeyPress),
584 GetRewrittenEventAsString(&rewriter, 292 GetRewrittenEventAsString(&rewriter,
585 ui::VKEY_INSERT, 293 ui::VKEY_INSERT,
586 ui::EF_ALT_DOWN, 294 ui::EF_ALT_DOWN | ui::EF_NUMPAD_KEY,
587 ui::ET_KEY_PRESSED, 295 ui::ET_KEY_PRESSED));
588 keycode_num_pad_insert_,
589 Mod1Mask));
590 296
591 // XK_KP_Delete (= NumPad . without Num Lock), Alt modifier. 297 // XK_KP_Delete (= NumPad . without Num Lock), Alt modifier.
592 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_DECIMAL, 298 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_DECIMAL,
593 ui::EF_ALT_DOWN | ui::EF_NUMPAD_KEY, 299 ui::EF_ALT_DOWN | ui::EF_NUMPAD_KEY,
594 ui::ET_KEY_PRESSED, 300 ui::ET_KEY_PRESSED),
595 keycode_num_pad_decimal_,
596 Mod1Mask | Mod2Mask,
597 KeyPress),
598 GetRewrittenEventAsString(&rewriter, 301 GetRewrittenEventAsString(&rewriter,
599 ui::VKEY_DELETE, 302 ui::VKEY_DELETE,
600 ui::EF_ALT_DOWN, 303 ui::EF_ALT_DOWN | ui::EF_NUMPAD_KEY,
601 ui::ET_KEY_PRESSED, 304 ui::ET_KEY_PRESSED));
602 keycode_num_pad_delete_,
603 Mod1Mask));
604 305
605 // XK_KP_End (= NumPad 1 without Num Lock), Alt modifier. 306 // XK_KP_End (= NumPad 1 without Num Lock), Alt modifier.
606 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD1, 307 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD1,
607 ui::EF_ALT_DOWN | ui::EF_NUMPAD_KEY, 308 ui::EF_ALT_DOWN | ui::EF_NUMPAD_KEY,
608 ui::ET_KEY_PRESSED, 309 ui::ET_KEY_PRESSED),
609 keycode_num_pad_1_,
610 Mod1Mask | Mod2Mask,
611 KeyPress),
612 GetRewrittenEventAsString(&rewriter, 310 GetRewrittenEventAsString(&rewriter,
613 ui::VKEY_END, 311 ui::VKEY_END,
614 ui::EF_ALT_DOWN, 312 ui::EF_ALT_DOWN | ui::EF_NUMPAD_KEY,
615 ui::ET_KEY_PRESSED, 313 ui::ET_KEY_PRESSED));
616 keycode_num_pad_end_,
617 Mod1Mask));
618 314
619 // XK_KP_Down (= NumPad 2 without Num Lock), Alt modifier. 315 // XK_KP_Down (= NumPad 2 without Num Lock), Alt modifier.
620 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD2, 316 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD2,
621 ui::EF_ALT_DOWN | ui::EF_NUMPAD_KEY, 317 ui::EF_ALT_DOWN | ui::EF_NUMPAD_KEY,
622 ui::ET_KEY_PRESSED, 318 ui::ET_KEY_PRESSED),
623 keycode_num_pad_2_,
624 Mod1Mask | Mod2Mask,
625 KeyPress),
626 GetRewrittenEventAsString(&rewriter, 319 GetRewrittenEventAsString(&rewriter,
627 ui::VKEY_DOWN, 320 ui::VKEY_DOWN,
628 ui::EF_ALT_DOWN, 321 ui::EF_ALT_DOWN | ui::EF_NUMPAD_KEY,
629 ui::ET_KEY_PRESSED, 322 ui::ET_KEY_PRESSED));
630 keycode_num_pad_down_,
631 Mod1Mask));
632 323
633 // XK_KP_Next (= NumPad 3 without Num Lock), Alt modifier. 324 // XK_KP_Next (= NumPad 3 without Num Lock), Alt modifier.
634 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD3, 325 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD3,
635 ui::EF_ALT_DOWN | ui::EF_NUMPAD_KEY, 326 ui::EF_ALT_DOWN | ui::EF_NUMPAD_KEY,
636 ui::ET_KEY_PRESSED, 327 ui::ET_KEY_PRESSED),
637 keycode_num_pad_3_,
638 Mod1Mask | Mod2Mask,
639 KeyPress),
640 GetRewrittenEventAsString(&rewriter, 328 GetRewrittenEventAsString(&rewriter,
641 ui::VKEY_NEXT, 329 ui::VKEY_NEXT,
642 ui::EF_ALT_DOWN, 330 ui::EF_ALT_DOWN | ui::EF_NUMPAD_KEY,
643 ui::ET_KEY_PRESSED, 331 ui::ET_KEY_PRESSED));
644 keycode_num_pad_next_,
645 Mod1Mask));
646 332
647 // XK_KP_Left (= NumPad 4 without Num Lock), Alt modifier. 333 // XK_KP_Left (= NumPad 4 without Num Lock), Alt modifier.
648 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD4, 334 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD4,
649 ui::EF_ALT_DOWN | ui::EF_NUMPAD_KEY, 335 ui::EF_ALT_DOWN | ui::EF_NUMPAD_KEY,
650 ui::ET_KEY_PRESSED, 336 ui::ET_KEY_PRESSED),
651 keycode_num_pad_4_,
652 Mod1Mask | Mod2Mask,
653 KeyPress),
654 GetRewrittenEventAsString(&rewriter, 337 GetRewrittenEventAsString(&rewriter,
655 ui::VKEY_LEFT, 338 ui::VKEY_LEFT,
656 ui::EF_ALT_DOWN, 339 ui::EF_ALT_DOWN | ui::EF_NUMPAD_KEY,
657 ui::ET_KEY_PRESSED, 340 ui::ET_KEY_PRESSED));
658 keycode_num_pad_left_,
659 Mod1Mask));
660 341
661 // XK_KP_Begin (= NumPad 5 without Num Lock), Alt modifier. 342 // XK_KP_Begin (= NumPad 5 without Num Lock), Alt modifier.
662 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD5, 343 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD5,
663 ui::EF_ALT_DOWN | ui::EF_NUMPAD_KEY, 344 ui::EF_ALT_DOWN | ui::EF_NUMPAD_KEY,
664 ui::ET_KEY_PRESSED, 345 ui::ET_KEY_PRESSED),
665 keycode_num_pad_5_,
666 Mod1Mask | Mod2Mask,
667 KeyPress),
668 GetRewrittenEventAsString(&rewriter, 346 GetRewrittenEventAsString(&rewriter,
669 ui::VKEY_CLEAR, 347 ui::VKEY_CLEAR,
670 ui::EF_ALT_DOWN, 348 ui::EF_ALT_DOWN | ui::EF_NUMPAD_KEY,
671 ui::ET_KEY_PRESSED, 349 ui::ET_KEY_PRESSED));
672 keycode_num_pad_begin_,
673 Mod1Mask));
674 350
675 // XK_KP_Right (= NumPad 6 without Num Lock), Alt modifier. 351 // XK_KP_Right (= NumPad 6 without Num Lock), Alt modifier.
676 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD6, 352 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD6,
677 ui::EF_ALT_DOWN | ui::EF_NUMPAD_KEY, 353 ui::EF_ALT_DOWN | ui::EF_NUMPAD_KEY,
678 ui::ET_KEY_PRESSED, 354 ui::ET_KEY_PRESSED),
679 keycode_num_pad_6_,
680 Mod1Mask | Mod2Mask,
681 KeyPress),
682 GetRewrittenEventAsString(&rewriter, 355 GetRewrittenEventAsString(&rewriter,
683 ui::VKEY_RIGHT, 356 ui::VKEY_RIGHT,
684 ui::EF_ALT_DOWN, 357 ui::EF_ALT_DOWN | ui::EF_NUMPAD_KEY,
685 ui::ET_KEY_PRESSED, 358 ui::ET_KEY_PRESSED));
686 keycode_num_pad_right_,
687 Mod1Mask));
688 359
689 // XK_KP_Home (= NumPad 7 without Num Lock), Alt modifier. 360 // XK_KP_Home (= NumPad 7 without Num Lock), Alt modifier.
690 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD7, 361 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD7,
691 ui::EF_ALT_DOWN | ui::EF_NUMPAD_KEY, 362 ui::EF_ALT_DOWN | ui::EF_NUMPAD_KEY,
692 ui::ET_KEY_PRESSED, 363 ui::ET_KEY_PRESSED),
693 keycode_num_pad_7_,
694 Mod1Mask | Mod2Mask,
695 KeyPress),
696 GetRewrittenEventAsString(&rewriter, 364 GetRewrittenEventAsString(&rewriter,
697 ui::VKEY_HOME, 365 ui::VKEY_HOME,
698 ui::EF_ALT_DOWN, 366 ui::EF_ALT_DOWN | ui::EF_NUMPAD_KEY,
699 ui::ET_KEY_PRESSED, 367 ui::ET_KEY_PRESSED));
700 keycode_num_pad_home_,
701 Mod1Mask));
702 368
703 // XK_KP_Up (= NumPad 8 without Num Lock), Alt modifier. 369 // XK_KP_Up (= NumPad 8 without Num Lock), Alt modifier.
704 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD8, 370 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD8,
705 ui::EF_ALT_DOWN | ui::EF_NUMPAD_KEY, 371 ui::EF_ALT_DOWN | ui::EF_NUMPAD_KEY,
706 ui::ET_KEY_PRESSED, 372 ui::ET_KEY_PRESSED),
707 keycode_num_pad_8_,
708 Mod1Mask | Mod2Mask,
709 KeyPress),
710 GetRewrittenEventAsString(&rewriter, 373 GetRewrittenEventAsString(&rewriter,
711 ui::VKEY_UP, 374 ui::VKEY_UP,
712 ui::EF_ALT_DOWN, 375 ui::EF_ALT_DOWN | ui::EF_NUMPAD_KEY,
713 ui::ET_KEY_PRESSED, 376 ui::ET_KEY_PRESSED));
714 keycode_num_pad_up_,
715 Mod1Mask));
716 377
717 // XK_KP_Prior (= NumPad 9 without Num Lock), Alt modifier. 378 // XK_KP_Prior (= NumPad 9 without Num Lock), Alt modifier.
718 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD9, 379 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD9,
719 ui::EF_ALT_DOWN | ui::EF_NUMPAD_KEY, 380 ui::EF_ALT_DOWN | ui::EF_NUMPAD_KEY,
720 ui::ET_KEY_PRESSED, 381 ui::ET_KEY_PRESSED),
721 keycode_num_pad_9_,
722 Mod1Mask | Mod2Mask,
723 KeyPress),
724 GetRewrittenEventAsString(&rewriter, 382 GetRewrittenEventAsString(&rewriter,
725 ui::VKEY_PRIOR, 383 ui::VKEY_PRIOR,
726 ui::EF_ALT_DOWN, 384 ui::EF_ALT_DOWN | ui::EF_NUMPAD_KEY,
727 ui::ET_KEY_PRESSED, 385 ui::ET_KEY_PRESSED));
728 keycode_num_pad_prior_,
729 Mod1Mask));
730 386
731 // XK_KP_0 (= NumPad 0 with Num Lock), Num Lock modifier. 387 // XK_KP_0 (= NumPad 0 with Num Lock), Num Lock modifier.
732 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD0, 388 EXPECT_EQ(
733 ui::EF_NUMPAD_KEY, 389 GetExpectedResultAsString(
734 ui::ET_KEY_PRESSED, 390 ui::VKEY_NUMPAD0, ui::EF_NUMPAD_KEY, ui::ET_KEY_PRESSED),
735 keycode_num_pad_0_, 391 GetRewrittenEventAsString(
736 Mod2Mask, 392 &rewriter, ui::VKEY_NUMPAD0, ui::EF_NUMPAD_KEY, ui::ET_KEY_PRESSED));
737 KeyPress),
738 GetRewrittenEventAsString(&rewriter,
739 ui::VKEY_NUMPAD0,
740 0,
741 ui::ET_KEY_PRESSED,
742 keycode_num_pad_0_,
743 Mod2Mask));
744 393
745 // XK_KP_DECIMAL (= NumPad . with Num Lock), Num Lock modifier. 394 // XK_KP_DECIMAL (= NumPad . with Num Lock), Num Lock modifier.
746 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_DECIMAL, 395 EXPECT_EQ(
747 ui::EF_NUMPAD_KEY, 396 GetExpectedResultAsString(
748 ui::ET_KEY_PRESSED, 397 ui::VKEY_DECIMAL, ui::EF_NUMPAD_KEY, ui::ET_KEY_PRESSED),
749 keycode_num_pad_decimal_, 398 GetRewrittenEventAsString(
750 Mod2Mask, 399 &rewriter, ui::VKEY_DECIMAL, ui::EF_NUMPAD_KEY, ui::ET_KEY_PRESSED));
751 KeyPress),
752 GetRewrittenEventAsString(&rewriter,
753 ui::VKEY_DECIMAL,
754 0,
755 ui::ET_KEY_PRESSED,
756 keycode_num_pad_decimal_,
757 Mod2Mask));
758 400
759 // XK_KP_1 (= NumPad 1 with Num Lock), Num Lock modifier. 401 // XK_KP_1 (= NumPad 1 with Num Lock), Num Lock modifier.
760 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD1, 402 EXPECT_EQ(
761 ui::EF_NUMPAD_KEY, 403 GetExpectedResultAsString(
762 ui::ET_KEY_PRESSED, 404 ui::VKEY_NUMPAD1, ui::EF_NUMPAD_KEY, ui::ET_KEY_PRESSED),
763 keycode_num_pad_1_, 405 GetRewrittenEventAsString(
764 Mod2Mask, 406 &rewriter, ui::VKEY_NUMPAD1, ui::EF_NUMPAD_KEY, ui::ET_KEY_PRESSED));
765 KeyPress),
766 GetRewrittenEventAsString(&rewriter,
767 ui::VKEY_NUMPAD1,
768 0,
769 ui::ET_KEY_PRESSED,
770 keycode_num_pad_1_,
771 Mod2Mask));
772 407
773 // XK_KP_2 (= NumPad 2 with Num Lock), Num Lock modifier. 408 // XK_KP_2 (= NumPad 2 with Num Lock), Num Lock modifier.
774 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD2, 409 EXPECT_EQ(
775 ui::EF_NUMPAD_KEY, 410 GetExpectedResultAsString(
776 ui::ET_KEY_PRESSED, 411 ui::VKEY_NUMPAD2, ui::EF_NUMPAD_KEY, ui::ET_KEY_PRESSED),
777 keycode_num_pad_2_, 412 GetRewrittenEventAsString(
778 Mod2Mask, 413 &rewriter, ui::VKEY_NUMPAD2, ui::EF_NUMPAD_KEY, ui::ET_KEY_PRESSED));
779 KeyPress),
780 GetRewrittenEventAsString(&rewriter,
781 ui::VKEY_NUMPAD2,
782 0,
783 ui::ET_KEY_PRESSED,
784 keycode_num_pad_2_,
785 Mod2Mask));
786 414
787 // XK_KP_3 (= NumPad 3 with Num Lock), Num Lock modifier. 415 // XK_KP_3 (= NumPad 3 with Num Lock), Num Lock modifier.
788 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD3, 416 EXPECT_EQ(
789 ui::EF_NUMPAD_KEY, 417 GetExpectedResultAsString(
790 ui::ET_KEY_PRESSED, 418 ui::VKEY_NUMPAD3, ui::EF_NUMPAD_KEY, ui::ET_KEY_PRESSED),
791 keycode_num_pad_3_, 419 GetRewrittenEventAsString(
792 Mod2Mask, 420 &rewriter, ui::VKEY_NUMPAD3, ui::EF_NUMPAD_KEY, ui::ET_KEY_PRESSED));
793 KeyPress),
794 GetRewrittenEventAsString(&rewriter,
795 ui::VKEY_NUMPAD3,
796 0,
797 ui::ET_KEY_PRESSED,
798 keycode_num_pad_3_,
799 Mod2Mask));
800 421
801 // XK_KP_4 (= NumPad 4 with Num Lock), Num Lock modifier. 422 // XK_KP_4 (= NumPad 4 with Num Lock), Num Lock modifier.
802 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD4, 423 EXPECT_EQ(
803 ui::EF_NUMPAD_KEY, 424 GetExpectedResultAsString(
804 ui::ET_KEY_PRESSED, 425 ui::VKEY_NUMPAD4, ui::EF_NUMPAD_KEY, ui::ET_KEY_PRESSED),
805 keycode_num_pad_4_, 426 GetRewrittenEventAsString(
806 Mod2Mask, 427 &rewriter, ui::VKEY_NUMPAD4, ui::EF_NUMPAD_KEY, ui::ET_KEY_PRESSED));
807 KeyPress),
808 GetRewrittenEventAsString(&rewriter,
809 ui::VKEY_NUMPAD4,
810 0,
811 ui::ET_KEY_PRESSED,
812 keycode_num_pad_4_,
813 Mod2Mask));
814 428
815 // XK_KP_5 (= NumPad 5 with Num Lock), Num Lock modifier. 429 // XK_KP_5 (= NumPad 5 with Num Lock), Num Lock modifier.
816 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD5, 430 EXPECT_EQ(
817 ui::EF_NUMPAD_KEY, 431 GetExpectedResultAsString(
818 ui::ET_KEY_PRESSED, 432 ui::VKEY_NUMPAD5, ui::EF_NUMPAD_KEY, ui::ET_KEY_PRESSED),
819 keycode_num_pad_5_, 433 GetRewrittenEventAsString(
820 Mod2Mask, 434 &rewriter, ui::VKEY_NUMPAD5, ui::EF_NUMPAD_KEY, ui::ET_KEY_PRESSED));
821 KeyPress),
822 GetRewrittenEventAsString(&rewriter,
823 ui::VKEY_NUMPAD5,
824 0,
825 ui::ET_KEY_PRESSED,
826 keycode_num_pad_5_,
827 Mod2Mask));
828 435
829 // XK_KP_6 (= NumPad 6 with Num Lock), Num Lock modifier. 436 // XK_KP_6 (= NumPad 6 with Num Lock), Num Lock modifier.
830 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD6, 437 EXPECT_EQ(
831 ui::EF_NUMPAD_KEY, 438 GetExpectedResultAsString(
832 ui::ET_KEY_PRESSED, 439 ui::VKEY_NUMPAD6, ui::EF_NUMPAD_KEY, ui::ET_KEY_PRESSED),
833 keycode_num_pad_6_, 440 GetRewrittenEventAsString(
834 Mod2Mask, 441 &rewriter, ui::VKEY_NUMPAD6, ui::EF_NUMPAD_KEY, ui::ET_KEY_PRESSED));
835 KeyPress),
836 GetRewrittenEventAsString(&rewriter,
837 ui::VKEY_NUMPAD6,
838 0,
839 ui::ET_KEY_PRESSED,
840 keycode_num_pad_6_,
841 Mod2Mask));
842 442
843 // XK_KP_7 (= NumPad 7 with Num Lock), Num Lock modifier. 443 // XK_KP_7 (= NumPad 7 with Num Lock), Num Lock modifier.
844 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD7, 444 EXPECT_EQ(
845 ui::EF_NUMPAD_KEY, 445 GetExpectedResultAsString(
846 ui::ET_KEY_PRESSED, 446 ui::VKEY_NUMPAD7, ui::EF_NUMPAD_KEY, ui::ET_KEY_PRESSED),
847 keycode_num_pad_7_, 447 GetRewrittenEventAsString(
848 Mod2Mask, 448 &rewriter, ui::VKEY_NUMPAD7, ui::EF_NUMPAD_KEY, ui::ET_KEY_PRESSED));
849 KeyPress),
850 GetRewrittenEventAsString(&rewriter,
851 ui::VKEY_NUMPAD7,
852 0,
853 ui::ET_KEY_PRESSED,
854 keycode_num_pad_7_,
855 Mod2Mask));
856 449
857 // XK_KP_8 (= NumPad 8 with Num Lock), Num Lock modifier. 450 // XK_KP_8 (= NumPad 8 with Num Lock), Num Lock modifier.
858 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD8, 451 EXPECT_EQ(
859 ui::EF_NUMPAD_KEY, 452 GetExpectedResultAsString(
860 ui::ET_KEY_PRESSED, 453 ui::VKEY_NUMPAD8, ui::EF_NUMPAD_KEY, ui::ET_KEY_PRESSED),
861 keycode_num_pad_8_, 454 GetRewrittenEventAsString(
862 Mod2Mask, 455 &rewriter, ui::VKEY_NUMPAD8, ui::EF_NUMPAD_KEY, ui::ET_KEY_PRESSED));
863 KeyPress),
864 GetRewrittenEventAsString(&rewriter,
865 ui::VKEY_NUMPAD8,
866 0,
867 ui::ET_KEY_PRESSED,
868 keycode_num_pad_8_,
869 Mod2Mask));
870 456
871 // XK_KP_9 (= NumPad 9 with Num Lock), Num Lock modifier. 457 // XK_KP_9 (= NumPad 9 with Num Lock), Num Lock modifier.
872 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD9, 458 EXPECT_EQ(
873 ui::EF_NUMPAD_KEY, 459 GetExpectedResultAsString(
874 ui::ET_KEY_PRESSED, 460 ui::VKEY_NUMPAD9, ui::EF_NUMPAD_KEY, ui::ET_KEY_PRESSED),
875 keycode_num_pad_9_, 461 GetRewrittenEventAsString(
876 Mod2Mask, 462 &rewriter, ui::VKEY_NUMPAD9, ui::EF_NUMPAD_KEY, ui::ET_KEY_PRESSED));
877 KeyPress),
878 GetRewrittenEventAsString(&rewriter,
879 ui::VKEY_NUMPAD9,
880 0,
881 ui::ET_KEY_PRESSED,
882 keycode_num_pad_9_,
883 Mod2Mask));
884 } 463 }
885 464
886 TEST_F(EventRewriterTest, TestRewriteNumPadKeys) { 465 TEST_F(EventRewriterTest, TestRewriteNumPadKeys) {
887 TestRewriteNumPadKeys(); 466 TestRewriteNumPadKeys();
888 } 467 }
889 468
890 TEST_F(EventRewriterTest, TestRewriteNumPadKeysWithDiamondKeyFlag) { 469 TEST_F(EventRewriterTest, TestRewriteNumPadKeysWithDiamondKeyFlag) {
891 // Make sure the num lock works correctly even when Diamond key exists. 470 // Make sure the num lock works correctly even when Diamond key exists.
892 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); 471 const CommandLine original_cl(*CommandLine::ForCurrentProcess());
893 CommandLine::ForCurrentProcess()->AppendSwitchASCII( 472 CommandLine::ForCurrentProcess()->AppendSwitchASCII(
894 chromeos::switches::kHasChromeOSDiamondKey, ""); 473 chromeos::switches::kHasChromeOSDiamondKey, "");
895 474
896 TestRewriteNumPadKeys(); 475 TestRewriteNumPadKeys();
897 *CommandLine::ForCurrentProcess() = original_cl; 476 *CommandLine::ForCurrentProcess() = original_cl;
898 } 477 }
899 478
900 // Tests if the rewriter can handle a Command + Num Pad event. 479 // Tests if the rewriter can handle a Command + Num Pad event.
901 void EventRewriterTest::TestRewriteNumPadKeysOnAppleKeyboard() { 480 void EventRewriterTest::TestRewriteNumPadKeysOnAppleKeyboard() {
902 TestingPrefServiceSyncable prefs; 481 TestingPrefServiceSyncable prefs;
903 EventRewriter rewriter; 482 EventRewriter rewriter;
904 rewriter.DeviceAddedForTesting(0, "Apple Keyboard"); 483 rewriter.DeviceAddedForTesting(0, "Apple Keyboard");
905 rewriter.set_last_device_id_for_testing(0); 484 rewriter.set_last_device_id_for_testing(0);
906 rewriter.set_pref_service_for_testing(&prefs); 485 rewriter.set_pref_service_for_testing(&prefs);
907 486
908 // XK_KP_End (= NumPad 1 without Num Lock), Win modifier. 487 // XK_KP_End (= NumPad 1 without Num Lock), Win modifier.
909 // The result should be "Num Pad 1 with Control + Num Lock modifiers". 488 // The result should be "Num Pad 1 with Control + Num Lock modifiers".
910 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD1, 489 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD1,
911 ui::EF_CONTROL_DOWN | ui::EF_NUMPAD_KEY, 490 ui::EF_CONTROL_DOWN | ui::EF_NUMPAD_KEY,
912 ui::ET_KEY_PRESSED, 491 ui::ET_KEY_PRESSED),
913 keycode_num_pad_1_,
914 ControlMask | Mod2Mask,
915 KeyPress),
916 GetRewrittenEventAsString(&rewriter, 492 GetRewrittenEventAsString(&rewriter,
917 ui::VKEY_END, 493 ui::VKEY_END,
918 0, 494 ui::EF_COMMAND_DOWN | ui::EF_NUMPAD_KEY,
919 ui::ET_KEY_PRESSED, 495 ui::ET_KEY_PRESSED));
920 keycode_num_pad_end_,
921 Mod4Mask));
922 496
923 // XK_KP_1 (= NumPad 1 without Num Lock), Win modifier. 497 // XK_KP_1 (= NumPad 1 with Num Lock), Win modifier.
924 // The result should also be "Num Pad 1 with Control + Num Lock modifiers". 498 // The result should also be "Num Pad 1 with Control + Num Lock modifiers".
925 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD1, 499 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD1,
926 ui::EF_CONTROL_DOWN | ui::EF_NUMPAD_KEY, 500 ui::EF_CONTROL_DOWN | ui::EF_NUMPAD_KEY,
927 ui::ET_KEY_PRESSED, 501 ui::ET_KEY_PRESSED),
928 keycode_num_pad_1_,
929 ControlMask | Mod2Mask,
930 KeyPress),
931 GetRewrittenEventAsString(&rewriter, 502 GetRewrittenEventAsString(&rewriter,
932 ui::VKEY_NUMPAD1, 503 ui::VKEY_NUMPAD1,
933 0, 504 ui::EF_COMMAND_DOWN | ui::EF_NUMPAD_KEY,
934 ui::ET_KEY_PRESSED, 505 ui::ET_KEY_PRESSED));
935 keycode_num_pad_end_,
936 Mod4Mask));
937 } 506 }
938 507
939 TEST_F(EventRewriterTest, TestRewriteNumPadKeysOnAppleKeyboard) { 508 TEST_F(EventRewriterTest, TestRewriteNumPadKeysOnAppleKeyboard) {
940 TestRewriteNumPadKeysOnAppleKeyboard(); 509 TestRewriteNumPadKeysOnAppleKeyboard();
941 } 510 }
942 511
943 TEST_F(EventRewriterTest, 512 TEST_F(EventRewriterTest,
944 TestRewriteNumPadKeysOnAppleKeyboardWithDiamondKeyFlag) { 513 TestRewriteNumPadKeysOnAppleKeyboardWithDiamondKeyFlag) {
945 // Makes sure the num lock works correctly even when Diamond key exists. 514 // Makes sure the num lock works correctly even when Diamond key exists.
946 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); 515 const CommandLine original_cl(*CommandLine::ForCurrentProcess());
947 CommandLine::ForCurrentProcess()->AppendSwitchASCII( 516 CommandLine::ForCurrentProcess()->AppendSwitchASCII(
948 chromeos::switches::kHasChromeOSDiamondKey, ""); 517 chromeos::switches::kHasChromeOSDiamondKey, "");
949 518
950 TestRewriteNumPadKeysOnAppleKeyboard(); 519 TestRewriteNumPadKeysOnAppleKeyboard();
951 *CommandLine::ForCurrentProcess() = original_cl; 520 *CommandLine::ForCurrentProcess() = original_cl;
952 } 521 }
953 522
954 TEST_F(EventRewriterTest, TestRewriteModifiersNoRemap) { 523 TEST_F(EventRewriterTest, TestRewriteModifiersNoRemap) {
955 TestingPrefServiceSyncable prefs; 524 TestingPrefServiceSyncable prefs;
956 EventRewriter rewriter; 525 EventRewriter rewriter;
957 rewriter.set_pref_service_for_testing(&prefs); 526 rewriter.set_pref_service_for_testing(&prefs);
958 527
959 // Press Search. Confirm the event is not rewritten. 528 // Press Search. Confirm the event is not rewritten.
960 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_LWIN, 529 EXPECT_EQ(GetExpectedResultAsString(
961 0, 530 ui::VKEY_LWIN, ui::EF_COMMAND_DOWN, ui::ET_KEY_PRESSED),
962 ui::ET_KEY_PRESSED, 531 GetRewrittenEventAsString(
963 keycode_super_l_, 532 &rewriter, ui::VKEY_LWIN, ui::EF_NONE, ui::ET_KEY_PRESSED));
964 0U,
965 KeyPress),
966 GetRewrittenEventAsString(&rewriter,
967 ui::VKEY_LWIN,
968 0,
969 ui::ET_KEY_PRESSED,
970 keycode_super_l_,
971 0U));
972 533
973 // Press left Control. Confirm the event is not rewritten. 534 // Press left Control. Confirm the event is not rewritten.
974 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, 535 EXPECT_EQ(GetExpectedResultAsString(
975 ui::EF_CONTROL_DOWN, 536 ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN, ui::ET_KEY_PRESSED),
976 ui::ET_KEY_PRESSED,
977 keycode_control_l_,
978 0U,
979 KeyPress),
980 GetRewrittenEventAsString(&rewriter, 537 GetRewrittenEventAsString(&rewriter,
981 ui::VKEY_CONTROL, 538 ui::VKEY_CONTROL,
982 0, 539 ui::EF_CONTROL_DOWN,
983 ui::ET_KEY_PRESSED, 540 ui::ET_KEY_PRESSED));
984 keycode_control_l_,
985 0U));
986 541
987 // Press right Control. Confirm the event is not rewritten. 542 // Press right Control. Confirm the event is not rewritten.
988 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, 543 EXPECT_EQ(GetExpectedResultAsString(
989 ui::EF_CONTROL_DOWN, 544 ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN, ui::ET_KEY_PRESSED),
990 ui::ET_KEY_PRESSED,
991 keycode_control_r_,
992 0U,
993 KeyPress),
994 GetRewrittenEventAsString(&rewriter, 545 GetRewrittenEventAsString(&rewriter,
995 ui::VKEY_CONTROL, 546 ui::VKEY_CONTROL,
996 0, 547 ui::EF_CONTROL_DOWN,
997 ui::ET_KEY_PRESSED, 548 ui::ET_KEY_PRESSED));
998 keycode_control_r_,
999 0U));
1000 549
1001 // Press left Alt. Confirm the event is not rewritten. 550 // Press left Alt. Confirm the event is not rewritten.
1002 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU, 551 EXPECT_EQ(GetExpectedResultAsString(
1003 ui::EF_ALT_DOWN, 552 ui::VKEY_MENU, ui::EF_ALT_DOWN, ui::ET_KEY_PRESSED),
1004 ui::ET_KEY_PRESSED, 553 GetRewrittenEventAsString(
1005 keycode_alt_l_, 554 &rewriter, ui::VKEY_MENU, ui::EF_ALT_DOWN, ui::ET_KEY_PRESSED));
1006 0,
1007 KeyPress),
1008 GetRewrittenEventAsString(&rewriter,
1009 ui::VKEY_MENU,
1010 0,
1011 ui::ET_KEY_PRESSED,
1012 keycode_alt_l_,
1013 0U));
1014 555
1015 // Press right Alt. Confirm the event is not rewritten. 556 // Press right Alt. Confirm the event is not rewritten.
1016 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU, 557 EXPECT_EQ(GetExpectedResultAsString(
1017 ui::EF_ALT_DOWN, 558 ui::VKEY_MENU, ui::EF_ALT_DOWN, ui::ET_KEY_PRESSED),
1018 ui::ET_KEY_PRESSED, 559 GetRewrittenEventAsString(
1019 keycode_alt_r_, 560 &rewriter, ui::VKEY_MENU, ui::EF_ALT_DOWN, ui::ET_KEY_PRESSED));
1020 0,
1021 KeyPress),
1022 GetRewrittenEventAsString(&rewriter,
1023 ui::VKEY_MENU,
1024 0,
1025 ui::ET_KEY_PRESSED,
1026 keycode_alt_r_,
1027 0U));
1028 561
1029 // Test KeyRelease event, just in case. 562 // Test KeyRelease event, just in case.
1030 // Release Search. Confirm the release event is not rewritten. 563 // Release Search. Confirm the release event is not rewritten.
1031 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_LWIN, 564 EXPECT_EQ(GetExpectedResultAsString(
1032 0, 565 ui::VKEY_LWIN, ui::EF_NONE, ui::ET_KEY_RELEASED),
1033 ui::ET_KEY_RELEASED, 566 GetRewrittenEventAsString(
1034 keycode_super_l_, 567 &rewriter, ui::VKEY_LWIN, ui::EF_NONE, ui::ET_KEY_RELEASED));
1035 Mod4Mask,
1036 KeyRelease),
1037 GetRewrittenEventAsString(&rewriter,
1038 ui::VKEY_LWIN,
1039 0,
1040 ui::ET_KEY_RELEASED,
1041 keycode_super_l_,
1042 Mod4Mask));
1043 } 568 }
1044 569
1045 TEST_F(EventRewriterTest, TestRewriteModifiersNoRemapMultipleKeys) { 570 TEST_F(EventRewriterTest, TestRewriteModifiersNoRemapMultipleKeys) {
1046 TestingPrefServiceSyncable prefs; 571 TestingPrefServiceSyncable prefs;
1047 EventRewriter rewriter; 572 EventRewriter rewriter;
1048 rewriter.set_pref_service_for_testing(&prefs); 573 rewriter.set_pref_service_for_testing(&prefs);
1049 574
1050 // Press left Alt with Shift. Confirm the event is not rewritten. 575 // Press Alt with Shift. Confirm the event is not rewritten.
1051 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU, 576 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU,
1052 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, 577 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
1053 ui::ET_KEY_PRESSED, 578 ui::ET_KEY_PRESSED),
1054 keycode_meta_l_,
1055 ShiftMask,
1056 KeyPress),
1057 GetRewrittenEventAsString(&rewriter, 579 GetRewrittenEventAsString(&rewriter,
1058 ui::VKEY_MENU, 580 ui::VKEY_MENU,
1059 ui::EF_SHIFT_DOWN,
1060 ui::ET_KEY_PRESSED,
1061 keycode_meta_l_,
1062 ShiftMask));
1063
1064 // Press right Alt with Shift. Confirm the event is not rewritten.
1065 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU,
1066 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, 581 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
1067 ui::ET_KEY_PRESSED, 582 ui::ET_KEY_PRESSED));
1068 keycode_meta_r_,
1069 ShiftMask,
1070 KeyPress),
1071 GetRewrittenEventAsString(&rewriter,
1072 ui::VKEY_MENU,
1073 ui::EF_SHIFT_DOWN,
1074 ui::ET_KEY_PRESSED,
1075 keycode_meta_r_,
1076 ShiftMask));
1077 583
1078 // Press Search with Caps Lock mask. Confirm the event is not rewritten. 584 // Press Search with Caps Lock mask. Confirm the event is not rewritten.
1079 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_LWIN, 585 EXPECT_EQ(
1080 ui::EF_CAPS_LOCK_DOWN, 586 GetExpectedResultAsString(ui::VKEY_LWIN,
1081 ui::ET_KEY_PRESSED, 587 ui::EF_CAPS_LOCK_DOWN | ui::EF_COMMAND_DOWN,
1082 keycode_super_l_, 588 ui::ET_KEY_PRESSED),
1083 LockMask, 589 GetRewrittenEventAsString(&rewriter,
1084 KeyPress), 590 ui::VKEY_LWIN,
591 ui::EF_CAPS_LOCK_DOWN | ui::EF_COMMAND_DOWN,
592 ui::ET_KEY_PRESSED));
593
594 // Release Search with Caps Lock mask. Confirm the event is not rewritten.
595 EXPECT_EQ(GetExpectedResultAsString(
596 ui::VKEY_LWIN, ui::EF_CAPS_LOCK_DOWN, ui::ET_KEY_RELEASED),
1085 GetRewrittenEventAsString(&rewriter, 597 GetRewrittenEventAsString(&rewriter,
1086 ui::VKEY_LWIN, 598 ui::VKEY_LWIN,
1087 ui::EF_CAPS_LOCK_DOWN, 599 ui::EF_CAPS_LOCK_DOWN,
1088 ui::ET_KEY_PRESSED, 600 ui::ET_KEY_RELEASED));
1089 keycode_super_l_,
1090 LockMask));
1091
1092 // Release Search with Caps Lock mask. Confirm the event is not rewritten.
1093 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_LWIN,
1094 ui::EF_CAPS_LOCK_DOWN,
1095 ui::ET_KEY_RELEASED,
1096 keycode_super_l_,
1097 LockMask | Mod4Mask,
1098 KeyRelease),
1099 GetRewrittenEventAsString(&rewriter,
1100 ui::VKEY_LWIN,
1101 ui::EF_CAPS_LOCK_DOWN,
1102 ui::ET_KEY_RELEASED,
1103 keycode_super_l_,
1104 LockMask | Mod4Mask));
1105 601
1106 // Press Shift+Ctrl+Alt+Search+A. Confirm the event is not rewritten. 602 // Press Shift+Ctrl+Alt+Search+A. Confirm the event is not rewritten.
1107 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_B, 603 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_B,
1108 ui::EF_SHIFT_DOWN | 604 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN |
1109 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, 605 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
1110 ui::ET_KEY_PRESSED, 606 ui::ET_KEY_PRESSED),
1111 keycode_b_,
1112 ShiftMask | ControlMask | Mod1Mask |
1113 Mod4Mask,
1114 KeyPress),
1115 GetRewrittenEventAsString(&rewriter, 607 GetRewrittenEventAsString(&rewriter,
1116 ui::VKEY_B, 608 ui::VKEY_B,
1117 ui::EF_SHIFT_DOWN | 609 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN |
1118 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, 610 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
1119 ui::ET_KEY_PRESSED, 611 ui::ET_KEY_PRESSED));
1120 keycode_b_,
1121 ShiftMask | ControlMask | Mod1Mask |
1122 Mod4Mask));
1123 } 612 }
1124 613
1125 TEST_F(EventRewriterTest, TestRewriteModifiersDisableSome) { 614 TEST_F(EventRewriterTest, TestRewriteModifiersDisableSome) {
1126 // Disable Search and Control keys. 615 // Disable Search and Control keys.
1127 TestingPrefServiceSyncable prefs; 616 TestingPrefServiceSyncable prefs;
1128 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 617 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1129 IntegerPrefMember search; 618 IntegerPrefMember search;
1130 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); 619 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs);
1131 search.SetValue(chromeos::input_method::kVoidKey); 620 search.SetValue(chromeos::input_method::kVoidKey);
1132 IntegerPrefMember control; 621 IntegerPrefMember control;
1133 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); 622 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs);
1134 control.SetValue(chromeos::input_method::kVoidKey); 623 control.SetValue(chromeos::input_method::kVoidKey);
1135 624
1136 EventRewriter rewriter; 625 EventRewriter rewriter;
1137 rewriter.set_pref_service_for_testing(&prefs); 626 rewriter.set_pref_service_for_testing(&prefs);
1138 627
1139 // Press left Alt with Shift. This key press shouldn't be affected by the 628 // Press Alt with Shift. This key press shouldn't be affected by the
1140 // pref. Confirm the event is not rewritten. 629 // pref. Confirm the event is not rewritten.
1141 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU, 630 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU,
1142 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, 631 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
1143 ui::ET_KEY_PRESSED, 632 ui::ET_KEY_PRESSED),
1144 keycode_meta_l_,
1145 ShiftMask,
1146 KeyPress),
1147 GetRewrittenEventAsString(&rewriter, 633 GetRewrittenEventAsString(&rewriter,
1148 ui::VKEY_MENU, 634 ui::VKEY_MENU,
1149 ui::EF_SHIFT_DOWN, 635 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
1150 ui::ET_KEY_PRESSED, 636 ui::ET_KEY_PRESSED));
1151 keycode_meta_l_,
1152 ShiftMask));
1153 637
1154 // Press Search. Confirm the event is now VKEY_UNKNOWN + XK_VoidSymbol. 638 // Press Search. Confirm the event is now VKEY_UNKNOWN.
1155 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_UNKNOWN, 639 EXPECT_EQ(GetExpectedResultAsString(
1156 0, 640 ui::VKEY_UNKNOWN, ui::EF_NONE, ui::ET_KEY_PRESSED),
1157 ui::ET_KEY_PRESSED, 641 GetRewrittenEventAsString(
1158 keycode_void_symbol_, 642 &rewriter, ui::VKEY_LWIN, ui::EF_NONE, ui::ET_KEY_PRESSED));
1159 0U,
1160 KeyPress),
1161 GetRewrittenEventAsString(&rewriter,
1162 ui::VKEY_LWIN,
1163 0,
1164 ui::ET_KEY_PRESSED,
1165 keycode_super_l_,
1166 0U));
1167 643
1168 // Press Control. Confirm the event is now VKEY_UNKNOWN + XK_VoidSymbol. 644 // Press Control. Confirm the event is now VKEY_UNKNOWN.
1169 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_UNKNOWN, 645 EXPECT_EQ(GetExpectedResultAsString(
1170 0, 646 ui::VKEY_UNKNOWN, ui::EF_NONE, ui::ET_KEY_PRESSED),
1171 ui::ET_KEY_PRESSED, 647 GetRewrittenEventAsString(
1172 keycode_void_symbol_, 648 &rewriter, ui::VKEY_CONTROL, ui::EF_NONE, ui::ET_KEY_PRESSED));
1173 0U,
1174 KeyPress),
1175 GetRewrittenEventAsString(&rewriter,
1176 ui::VKEY_CONTROL,
1177 0,
1178 ui::ET_KEY_PRESSED,
1179 keycode_control_l_,
1180 0U));
1181 649
1182 // Press Control+Search. Confirm the event is now VKEY_UNKNOWN + 650 // Press Control+Search. Confirm the event is now VKEY_UNKNOWN
1183 // XK_VoidSymbol without any modifiers. 651 // without any modifiers.
1184 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_UNKNOWN, 652 EXPECT_EQ(
1185 0, 653 GetExpectedResultAsString(
1186 ui::ET_KEY_PRESSED, 654 ui::VKEY_UNKNOWN, ui::EF_NONE, ui::ET_KEY_PRESSED),
1187 keycode_void_symbol_, 655 GetRewrittenEventAsString(
1188 0U, 656 &rewriter, ui::VKEY_LWIN, ui::EF_CONTROL_DOWN, ui::ET_KEY_PRESSED));
1189 KeyPress),
1190 GetRewrittenEventAsString(&rewriter,
1191 ui::VKEY_LWIN,
1192 ui::EF_CONTROL_DOWN,
1193 ui::ET_KEY_PRESSED,
1194 keycode_super_l_,
1195 ControlMask));
1196 657
1197 // Press Control+Search+a. Confirm the event is now VKEY_A without any 658 // Press Control+Search+a. Confirm the event is now VKEY_A without any
1198 // modifiers. 659 // modifiers.
1199 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, 660 EXPECT_EQ(
1200 0, 661 GetExpectedResultAsString(ui::VKEY_A, ui::EF_NONE, ui::ET_KEY_PRESSED),
1201 ui::ET_KEY_PRESSED, 662 GetRewrittenEventAsString(
1202 keycode_a_, 663 &rewriter, ui::VKEY_A, ui::EF_CONTROL_DOWN, ui::ET_KEY_PRESSED));
1203 0U,
1204 KeyPress),
1205 GetRewrittenEventAsString(&rewriter,
1206 ui::VKEY_A,
1207 ui::EF_CONTROL_DOWN,
1208 ui::ET_KEY_PRESSED,
1209 keycode_a_,
1210 ControlMask | Mod4Mask));
1211 664
1212 // Press Control+Search+Alt+a. Confirm the event is now VKEY_A only with 665 // Press Control+Search+Alt+a. Confirm the event is now VKEY_A only with
1213 // the Alt modifier. 666 // the Alt modifier.
1214 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, 667 EXPECT_EQ(GetExpectedResultAsString(
1215 ui::EF_ALT_DOWN, 668 ui::VKEY_A, ui::EF_ALT_DOWN, ui::ET_KEY_PRESSED),
1216 ui::ET_KEY_PRESSED,
1217 keycode_a_,
1218 Mod1Mask,
1219 KeyPress),
1220 GetRewrittenEventAsString(&rewriter, 669 GetRewrittenEventAsString(&rewriter,
1221 ui::VKEY_A, 670 ui::VKEY_A,
1222 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, 671 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
1223 ui::ET_KEY_PRESSED, 672 ui::ET_KEY_PRESSED));
1224 keycode_a_,
1225 ControlMask | Mod1Mask | Mod4Mask));
1226 673
1227 // Remap Alt to Control. 674 // Remap Alt to Control.
1228 IntegerPrefMember alt; 675 IntegerPrefMember alt;
1229 alt.Init(prefs::kLanguageRemapAltKeyTo, &prefs); 676 alt.Init(prefs::kLanguageRemapAltKeyTo, &prefs);
1230 alt.SetValue(chromeos::input_method::kControlKey); 677 alt.SetValue(chromeos::input_method::kControlKey);
1231 678
1232 // Press left Alt. Confirm the event is now VKEY_CONTROL + XK_Control_L 679 // Press left Alt. Confirm the event is now VKEY_CONTROL
1233 // even though the Control key itself is disabled. 680 // even though the Control key itself is disabled.
1234 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, 681 EXPECT_EQ(GetExpectedResultAsString(
1235 ui::EF_CONTROL_DOWN, 682 ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN, ui::ET_KEY_PRESSED),
1236 ui::ET_KEY_PRESSED, 683 GetRewrittenEventAsString(
1237 keycode_control_l_, 684 &rewriter, ui::VKEY_MENU, ui::EF_ALT_DOWN, ui::ET_KEY_PRESSED));
1238 0U,
1239 KeyPress),
1240 GetRewrittenEventAsString(&rewriter,
1241 ui::VKEY_MENU,
1242 0,
1243 ui::ET_KEY_PRESSED,
1244 keycode_alt_l_,
1245 0U));
1246 685
1247 // Press Alt+a. Confirm the event is now Control+a even though the Control 686 // Press Alt+a. Confirm the event is now Control+a even though the Control
1248 // key itself is disabled. 687 // key itself is disabled.
1249 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, 688 EXPECT_EQ(GetExpectedResultAsString(
1250 ui::EF_CONTROL_DOWN, 689 ui::VKEY_A, ui::EF_CONTROL_DOWN, ui::ET_KEY_PRESSED),
1251 ui::ET_KEY_PRESSED, 690 GetRewrittenEventAsString(
1252 keycode_a_, 691 &rewriter, ui::VKEY_A, ui::EF_ALT_DOWN, ui::ET_KEY_PRESSED));
1253 ControlMask,
1254 KeyPress),
1255 GetRewrittenEventAsString(&rewriter,
1256 ui::VKEY_A,
1257 ui::EF_ALT_DOWN,
1258 ui::ET_KEY_PRESSED,
1259 keycode_a_,
1260 Mod1Mask));
1261 } 692 }
1262 693
1263 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToControl) { 694 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToControl) {
1264 // Remap Search to Control. 695 // Remap Search to Control.
1265 TestingPrefServiceSyncable prefs; 696 TestingPrefServiceSyncable prefs;
1266 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 697 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1267 IntegerPrefMember search; 698 IntegerPrefMember search;
1268 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); 699 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs);
1269 search.SetValue(chromeos::input_method::kControlKey); 700 search.SetValue(chromeos::input_method::kControlKey);
1270 701
1271 EventRewriter rewriter; 702 EventRewriter rewriter;
1272 rewriter.set_pref_service_for_testing(&prefs); 703 rewriter.set_pref_service_for_testing(&prefs);
1273 704
1274 // Press Search. Confirm the event is now VKEY_CONTROL + XK_Control_L. 705 // Press Search. Confirm the event is now VKEY_CONTROL.
1275 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, 706 EXPECT_EQ(
1276 ui::EF_CONTROL_DOWN, 707 GetExpectedResultAsString(
1277 ui::ET_KEY_PRESSED, 708 ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN, ui::ET_KEY_PRESSED),
1278 keycode_control_l_, 709 GetRewrittenEventAsString(
1279 0U, 710 &rewriter, ui::VKEY_LWIN, ui::EF_COMMAND_DOWN, ui::ET_KEY_PRESSED));
1280 KeyPress),
1281 GetRewrittenEventAsString(&rewriter,
1282 ui::VKEY_LWIN,
1283 0,
1284 ui::ET_KEY_PRESSED,
1285 keycode_super_l_,
1286 0U));
1287 711
1288 // Remap Alt to Control too. 712 // Remap Alt to Control too.
1289 IntegerPrefMember alt; 713 IntegerPrefMember alt;
1290 alt.Init(prefs::kLanguageRemapAltKeyTo, &prefs); 714 alt.Init(prefs::kLanguageRemapAltKeyTo, &prefs);
1291 alt.SetValue(chromeos::input_method::kControlKey); 715 alt.SetValue(chromeos::input_method::kControlKey);
1292 716
1293 // Press left Alt. Confirm the event is now VKEY_CONTROL + XK_Control_L. 717 // Press Alt. Confirm the event is now VKEY_CONTROL.
1294 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, 718 EXPECT_EQ(GetExpectedResultAsString(
1295 ui::EF_CONTROL_DOWN, 719 ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN, ui::ET_KEY_PRESSED),
1296 ui::ET_KEY_PRESSED, 720 GetRewrittenEventAsString(
1297 keycode_control_l_, 721 &rewriter, ui::VKEY_MENU, ui::EF_ALT_DOWN, ui::ET_KEY_PRESSED));
1298 0U,
1299 KeyPress),
1300 GetRewrittenEventAsString(&rewriter,
1301 ui::VKEY_MENU,
1302 0,
1303 ui::ET_KEY_PRESSED,
1304 keycode_alt_l_,
1305 0U));
1306 722
1307 // Press right Alt. Confirm the event is now VKEY_CONTROL + XK_Control_R. 723 // Press Alt+Search. Confirm the event is now VKEY_CONTROL.
1308 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, 724 EXPECT_EQ(GetExpectedResultAsString(
1309 ui::EF_CONTROL_DOWN, 725 ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN, ui::ET_KEY_PRESSED),
1310 ui::ET_KEY_PRESSED,
1311 keycode_control_r_,
1312 0U,
1313 KeyPress),
1314 GetRewrittenEventAsString(&rewriter,
1315 ui::VKEY_MENU,
1316 0,
1317 ui::ET_KEY_PRESSED,
1318 keycode_alt_r_,
1319 0U));
1320
1321 // Press Alt+Search. Confirm the event is now VKEY_CONTROL + XK_Control_L.
1322 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL,
1323 ui::EF_CONTROL_DOWN,
1324 ui::ET_KEY_PRESSED,
1325 keycode_control_l_,
1326 ControlMask,
1327 KeyPress),
1328 GetRewrittenEventAsString(&rewriter, 726 GetRewrittenEventAsString(&rewriter,
1329 ui::VKEY_LWIN, 727 ui::VKEY_LWIN,
1330 ui::EF_ALT_DOWN, 728 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
1331 ui::ET_KEY_PRESSED, 729 ui::ET_KEY_PRESSED));
1332 keycode_super_l_,
1333 Mod1Mask));
1334 730
1335 // Press Control+Alt+Search. Confirm the event is now VKEY_CONTROL + 731 // Press Control+Alt+Search. Confirm the event is now VKEY_CONTROL.
1336 // XK_Control_L. 732 EXPECT_EQ(GetExpectedResultAsString(
1337 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, 733 ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN, ui::ET_KEY_PRESSED),
1338 ui::EF_CONTROL_DOWN, 734 GetRewrittenEventAsString(
1339 ui::ET_KEY_PRESSED, 735 &rewriter,
1340 keycode_control_l_, 736 ui::VKEY_LWIN,
1341 ControlMask, 737 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
1342 KeyPress), 738 ui::ET_KEY_PRESSED));
1343 GetRewrittenEventAsString(&rewriter,
1344 ui::VKEY_LWIN,
1345 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
1346 ui::ET_KEY_PRESSED,
1347 keycode_super_l_,
1348 ControlMask | Mod1Mask));
1349 739
1350 // Press Shift+Control+Alt+Search. Confirm the event is now Control with 740 // Press Shift+Control+Alt+Search. Confirm the event is now Control with
1351 // Shift and Control modifiers. 741 // Shift and Control modifiers.
1352 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, 742 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL,
1353 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, 743 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN,
1354 ui::ET_KEY_PRESSED, 744 ui::ET_KEY_PRESSED),
1355 keycode_control_l_,
1356 ShiftMask | ControlMask,
1357 KeyPress),
1358 GetRewrittenEventAsString(&rewriter, 745 GetRewrittenEventAsString(&rewriter,
1359 ui::VKEY_LWIN, 746 ui::VKEY_LWIN,
1360 ui::EF_SHIFT_DOWN | 747 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN |
1361 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, 748 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
1362 ui::ET_KEY_PRESSED, 749 ui::ET_KEY_PRESSED));
1363 keycode_super_l_,
1364 ShiftMask | ControlMask | Mod1Mask));
1365 750
1366 // Press Shift+Control+Alt+Search+B. Confirm the event is now B with Shift 751 // Press Shift+Control+Alt+Search+B. Confirm the event is now B with Shift
1367 // and Control modifiers. 752 // and Control modifiers.
1368 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_B, 753 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_B,
1369 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, 754 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN,
1370 ui::ET_KEY_PRESSED, 755 ui::ET_KEY_PRESSED),
1371 keycode_b_,
1372 ShiftMask | ControlMask,
1373 KeyPress),
1374 GetRewrittenEventAsString(&rewriter, 756 GetRewrittenEventAsString(&rewriter,
1375 ui::VKEY_B, 757 ui::VKEY_B,
1376 ui::EF_SHIFT_DOWN | 758 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN |
1377 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, 759 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
1378 ui::ET_KEY_PRESSED, 760 ui::ET_KEY_PRESSED));
1379 keycode_b_,
1380 ShiftMask | ControlMask | Mod1Mask));
1381 } 761 }
1382 762
1383 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToEscape) { 763 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToEscape) {
1384 // Remap Search to ESC. 764 // Remap Search to ESC.
1385 TestingPrefServiceSyncable prefs; 765 TestingPrefServiceSyncable prefs;
1386 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 766 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1387 IntegerPrefMember search; 767 IntegerPrefMember search;
1388 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); 768 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs);
1389 search.SetValue(chromeos::input_method::kEscapeKey); 769 search.SetValue(chromeos::input_method::kEscapeKey);
1390 770
1391 EventRewriter rewriter; 771 EventRewriter rewriter;
1392 rewriter.set_pref_service_for_testing(&prefs); 772 rewriter.set_pref_service_for_testing(&prefs);
1393 773
1394 // Press Search. Confirm the event is now VKEY_ESCAPE. 774 // Press Search. Confirm the event is now VKEY_ESCAPE.
1395 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_ESCAPE, 775 EXPECT_EQ(
1396 ui::EF_NONE, 776 GetExpectedResultAsString(
1397 ui::ET_KEY_PRESSED, 777 ui::VKEY_ESCAPE, ui::EF_NONE, ui::ET_KEY_PRESSED),
1398 keycode_escape_, 778 GetRewrittenEventAsString(
1399 0U, 779 &rewriter, ui::VKEY_LWIN, ui::EF_COMMAND_DOWN, ui::ET_KEY_PRESSED));
1400 KeyPress),
1401 GetRewrittenEventAsString(&rewriter,
1402 ui::VKEY_LWIN,
1403 0,
1404 ui::ET_KEY_PRESSED,
1405 keycode_super_l_,
1406 0U));
1407 } 780 }
1408 781
1409 TEST_F(EventRewriterTest, TestRewriteModifiersRemapMany) { 782 TEST_F(EventRewriterTest, TestRewriteModifiersRemapMany) {
1410 // Remap Search to Alt. 783 // Remap Search to Alt.
1411 TestingPrefServiceSyncable prefs; 784 TestingPrefServiceSyncable prefs;
1412 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 785 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1413 IntegerPrefMember search; 786 IntegerPrefMember search;
1414 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); 787 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs);
1415 search.SetValue(chromeos::input_method::kAltKey); 788 search.SetValue(chromeos::input_method::kAltKey);
1416 789
1417 EventRewriter rewriter; 790 EventRewriter rewriter;
1418 rewriter.set_pref_service_for_testing(&prefs); 791 rewriter.set_pref_service_for_testing(&prefs);
1419 792
1420 // Press Search. Confirm the event is now VKEY_MENU + XK_Alt_L. 793 // Press Search. Confirm the event is now VKEY_MENU.
1421 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU, 794 EXPECT_EQ(
1422 ui::EF_ALT_DOWN, 795 GetExpectedResultAsString(
1423 ui::ET_KEY_PRESSED, 796 ui::VKEY_MENU, ui::EF_ALT_DOWN, ui::ET_KEY_PRESSED),
1424 keycode_alt_l_, 797 GetRewrittenEventAsString(
1425 0U, 798 &rewriter, ui::VKEY_LWIN, ui::EF_COMMAND_DOWN, ui::ET_KEY_PRESSED));
1426 KeyPress),
1427 GetRewrittenEventAsString(&rewriter,
1428 ui::VKEY_LWIN,
1429 0,
1430 ui::ET_KEY_PRESSED,
1431 keycode_super_l_,
1432 0U));
1433 799
1434 // Remap Alt to Control. 800 // Remap Alt to Control.
1435 IntegerPrefMember alt; 801 IntegerPrefMember alt;
1436 alt.Init(prefs::kLanguageRemapAltKeyTo, &prefs); 802 alt.Init(prefs::kLanguageRemapAltKeyTo, &prefs);
1437 alt.SetValue(chromeos::input_method::kControlKey); 803 alt.SetValue(chromeos::input_method::kControlKey);
1438 804
1439 // Press left Alt. Confirm the event is now VKEY_CONTROL + XK_Control_L. 805 // Press left Alt. Confirm the event is now VKEY_CONTROL.
1440 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, 806 EXPECT_EQ(GetExpectedResultAsString(
1441 ui::EF_CONTROL_DOWN, 807 ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN, ui::ET_KEY_PRESSED),
1442 ui::ET_KEY_PRESSED, 808 GetRewrittenEventAsString(
1443 keycode_control_l_, 809 &rewriter, ui::VKEY_MENU, ui::EF_ALT_DOWN, ui::ET_KEY_PRESSED));
1444 0U,
1445 KeyPress),
1446 GetRewrittenEventAsString(&rewriter,
1447 ui::VKEY_MENU,
1448 0,
1449 ui::ET_KEY_PRESSED,
1450 keycode_alt_l_,
1451 0U));
1452 810
1453 // Remap Control to Search. 811 // Remap Control to Search.
1454 IntegerPrefMember control; 812 IntegerPrefMember control;
1455 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); 813 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs);
1456 control.SetValue(chromeos::input_method::kSearchKey); 814 control.SetValue(chromeos::input_method::kSearchKey);
1457 815
1458 // Press left Control. Confirm the event is now VKEY_LWIN. 816 // Press left Control. Confirm the event is now VKEY_LWIN.
1459 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_LWIN, 817 EXPECT_EQ(GetExpectedResultAsString(
1460 0, 818 ui::VKEY_LWIN, ui::EF_COMMAND_DOWN, ui::ET_KEY_PRESSED),
1461 ui::ET_KEY_PRESSED,
1462 keycode_super_l_,
1463 0U,
1464 KeyPress),
1465 GetRewrittenEventAsString(&rewriter, 819 GetRewrittenEventAsString(&rewriter,
1466 ui::VKEY_CONTROL, 820 ui::VKEY_CONTROL,
1467 0, 821 ui::EF_CONTROL_DOWN,
1468 ui::ET_KEY_PRESSED, 822 ui::ET_KEY_PRESSED));
1469 keycode_control_l_,
1470 0U));
1471 823
1472 // Then, press all of the three, Control+Alt+Search. 824 // Then, press all of the three, Control+Alt+Search.
1473 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU, 825 EXPECT_EQ(GetExpectedResultAsString(
1474 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, 826 ui::VKEY_MENU,
1475 ui::ET_KEY_PRESSED, 827 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
1476 keycode_alt_l_, 828 ui::ET_KEY_PRESSED),
1477 ControlMask | Mod4Mask, 829 GetRewrittenEventAsString(
1478 KeyPress), 830 &rewriter,
1479 GetRewrittenEventAsString(&rewriter, 831 ui::VKEY_LWIN,
1480 ui::VKEY_LWIN, 832 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
1481 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, 833 ui::ET_KEY_PRESSED));
1482 ui::ET_KEY_PRESSED,
1483 keycode_super_l_,
1484 ControlMask | Mod1Mask));
1485 834
1486 // Press Shift+Control+Alt+Search. 835 // Press Shift+Control+Alt+Search.
1487 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU, 836 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU,
1488 (ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | 837 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN |
1489 ui::EF_ALT_DOWN), 838 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
1490 ui::ET_KEY_PRESSED, 839 ui::ET_KEY_PRESSED),
1491 keycode_alt_l_,
1492 ShiftMask | ControlMask | Mod4Mask,
1493 KeyPress),
1494 GetRewrittenEventAsString(&rewriter, 840 GetRewrittenEventAsString(&rewriter,
1495 ui::VKEY_LWIN, 841 ui::VKEY_LWIN,
1496 ui::EF_SHIFT_DOWN | 842 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN |
1497 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, 843 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
1498 ui::ET_KEY_PRESSED, 844 ui::ET_KEY_PRESSED));
1499 keycode_super_l_,
1500 ShiftMask | ControlMask | Mod1Mask));
1501 845
1502 // Press Shift+Control+Alt+Search+B 846 // Press Shift+Control+Alt+Search+B
1503 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_B, 847 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_B,
1504 ui::EF_SHIFT_DOWN | 848 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN |
1505 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, 849 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
1506 ui::ET_KEY_PRESSED, 850 ui::ET_KEY_PRESSED),
1507 keycode_b_,
1508 ShiftMask | ControlMask | Mod1Mask |
1509 Mod4Mask,
1510 KeyPress),
1511 GetRewrittenEventAsString(&rewriter, 851 GetRewrittenEventAsString(&rewriter,
1512 ui::VKEY_B, 852 ui::VKEY_B,
1513 ui::EF_SHIFT_DOWN | 853 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN |
1514 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, 854 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
1515 ui::ET_KEY_PRESSED, 855 ui::ET_KEY_PRESSED));
1516 keycode_b_,
1517 ShiftMask | ControlMask | Mod1Mask |
1518 Mod4Mask));
1519 } 856 }
1520 857
1521 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToCapsLock) { 858 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToCapsLock) {
1522 // Remap Search to Caps Lock. 859 // Remap Search to Caps Lock.
1523 TestingPrefServiceSyncable prefs; 860 TestingPrefServiceSyncable prefs;
1524 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 861 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1525 IntegerPrefMember search; 862 IntegerPrefMember search;
1526 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); 863 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs);
1527 search.SetValue(chromeos::input_method::kCapsLockKey); 864 search.SetValue(chromeos::input_method::kCapsLockKey);
1528 865
1529 chromeos::input_method::FakeImeKeyboard keyboard; 866 chromeos::input_method::FakeImeKeyboard ime_keyboard;
1530 EventRewriter rewriter; 867 EventRewriter rewriter;
1531 rewriter.set_pref_service_for_testing(&prefs); 868 rewriter.set_pref_service_for_testing(&prefs);
1532 rewriter.set_keyboard_for_testing(&keyboard); 869 rewriter.set_ime_keyboard_for_testing(&ime_keyboard);
1533 EXPECT_FALSE(keyboard.caps_lock_is_enabled_); 870 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_);
1534 871
1535 // Press Search. 872 // Press Search.
1536 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, 873 EXPECT_EQ(
1537 ui::EF_CAPS_LOCK_DOWN, 874 GetExpectedResultAsString(
1538 ui::ET_KEY_PRESSED, 875 ui::VKEY_CAPITAL, ui::EF_CAPS_LOCK_DOWN, ui::ET_KEY_PRESSED),
1539 keycode_caps_lock_, 876 GetRewrittenEventAsString(
1540 0U, 877 &rewriter, ui::VKEY_LWIN, ui::EF_COMMAND_DOWN, ui::ET_KEY_PRESSED));
1541 KeyPress),
1542 GetRewrittenEventAsString(&rewriter,
1543 ui::VKEY_LWIN,
1544 0,
1545 ui::ET_KEY_PRESSED,
1546 keycode_super_l_,
1547 0U));
1548 // Confirm that the Caps Lock status is changed. 878 // Confirm that the Caps Lock status is changed.
1549 EXPECT_TRUE(keyboard.caps_lock_is_enabled_); 879 EXPECT_TRUE(ime_keyboard.caps_lock_is_enabled_);
1550 880
1551 // Release Search. 881 // Release Search.
1552 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, 882 EXPECT_EQ(GetExpectedResultAsString(
1553 ui::EF_NONE, 883 ui::VKEY_CAPITAL, ui::EF_NONE, ui::ET_KEY_RELEASED),
1554 ui::ET_KEY_RELEASED, 884 GetRewrittenEventAsString(
1555 keycode_caps_lock_, 885 &rewriter, ui::VKEY_LWIN, ui::EF_NONE, ui::ET_KEY_RELEASED));
1556 LockMask,
1557 KeyRelease),
1558 GetRewrittenEventAsString(&rewriter,
1559 ui::VKEY_LWIN,
1560 ui::EF_CAPS_LOCK_DOWN,
1561 ui::ET_KEY_RELEASED,
1562 keycode_super_l_,
1563 Mod4Mask | LockMask));
1564 // Confirm that the Caps Lock status is not changed. 886 // Confirm that the Caps Lock status is not changed.
1565 EXPECT_TRUE(keyboard.caps_lock_is_enabled_); 887 EXPECT_TRUE(ime_keyboard.caps_lock_is_enabled_);
1566 888
1567 // Press Search. 889 // Press Search.
1568 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, 890 EXPECT_EQ(
1569 ui::EF_CAPS_LOCK_DOWN, 891 GetExpectedResultAsString(
1570 ui::ET_KEY_PRESSED, 892 ui::VKEY_CAPITAL, ui::EF_CAPS_LOCK_DOWN, ui::ET_KEY_PRESSED),
1571 keycode_caps_lock_, 893 GetRewrittenEventAsString(&rewriter,
1572 LockMask, 894 ui::VKEY_LWIN,
1573 KeyPress), 895 ui::EF_COMMAND_DOWN | ui::EF_CAPS_LOCK_DOWN,
1574 GetRewrittenEventAsString(&rewriter, 896 ui::ET_KEY_PRESSED));
1575 ui::VKEY_LWIN,
1576 ui::EF_CAPS_LOCK_DOWN,
1577 ui::ET_KEY_PRESSED,
1578 keycode_super_l_,
1579 LockMask));
1580 // Confirm that the Caps Lock status is changed. 897 // Confirm that the Caps Lock status is changed.
1581 EXPECT_FALSE(keyboard.caps_lock_is_enabled_); 898 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_);
1582 899
1583 // Release Search. 900 // Release Search.
1584 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, 901 EXPECT_EQ(GetExpectedResultAsString(
1585 ui::EF_NONE, 902 ui::VKEY_CAPITAL, ui::EF_NONE, ui::ET_KEY_RELEASED),
1586 ui::ET_KEY_RELEASED, 903 GetRewrittenEventAsString(
1587 keycode_caps_lock_, 904 &rewriter, ui::VKEY_LWIN, ui::EF_NONE, ui::ET_KEY_RELEASED));
1588 LockMask,
1589 KeyRelease),
1590 GetRewrittenEventAsString(&rewriter,
1591 ui::VKEY_LWIN,
1592 ui::EF_CAPS_LOCK_DOWN,
1593 ui::ET_KEY_RELEASED,
1594 keycode_super_l_,
1595 Mod4Mask | LockMask));
1596 // Confirm that the Caps Lock status is not changed. 905 // Confirm that the Caps Lock status is not changed.
1597 EXPECT_FALSE(keyboard.caps_lock_is_enabled_); 906 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_);
1598 907
1599 // Press Caps Lock (on an external keyboard). 908 // Press Caps Lock (on an external keyboard).
1600 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, 909 EXPECT_EQ(GetExpectedResultAsString(
1601 ui::EF_CAPS_LOCK_DOWN, 910 ui::VKEY_CAPITAL, ui::EF_CAPS_LOCK_DOWN, ui::ET_KEY_PRESSED),
1602 ui::ET_KEY_PRESSED,
1603 keycode_caps_lock_,
1604 0U,
1605 KeyPress),
1606 GetRewrittenEventAsString(&rewriter,
1607 ui::VKEY_CAPITAL,
1608 ui::EF_NONE,
1609 ui::ET_KEY_PRESSED,
1610 keycode_caps_lock_,
1611 0U));
1612
1613 // Confirm that calling RewriteForTesting() does not change the state of
1614 // |keyboard|. In this case, X Window system itself should change the
1615 // Caps Lock state, not ash::EventRewriter.
1616 EXPECT_FALSE(keyboard.caps_lock_is_enabled_);
1617
1618 // Release Caps Lock (on an external keyboard).
1619 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL,
1620 ui::EF_NONE,
1621 ui::ET_KEY_RELEASED,
1622 keycode_caps_lock_,
1623 LockMask,
1624 KeyRelease),
1625 GetRewrittenEventAsString(&rewriter, 911 GetRewrittenEventAsString(&rewriter,
1626 ui::VKEY_CAPITAL, 912 ui::VKEY_CAPITAL,
1627 ui::EF_CAPS_LOCK_DOWN, 913 ui::EF_CAPS_LOCK_DOWN,
1628 ui::ET_KEY_RELEASED, 914 ui::ET_KEY_PRESSED));
1629 keycode_caps_lock_, 915
1630 LockMask)); 916 // Confirm that calling RewriteForTesting() does not change the state of
1631 EXPECT_FALSE(keyboard.caps_lock_is_enabled_); 917 // |ime_keyboard|. In this case, X Window system itself should change the
918 // Caps Lock state, not ash::EventRewriter.
919 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_);
920
921 // Release Caps Lock (on an external keyboard).
922 EXPECT_EQ(GetExpectedResultAsString(
923 ui::VKEY_CAPITAL, ui::EF_NONE, ui::ET_KEY_RELEASED),
924 GetRewrittenEventAsString(
925 &rewriter, ui::VKEY_CAPITAL, ui::EF_NONE, ui::ET_KEY_RELEASED));
926 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_);
1632 } 927 }
1633 928
1634 TEST_F(EventRewriterTest, DISABLED_TestRewriteCapsLock) { 929 TEST_F(EventRewriterTest, TestRewriteCapsLock) {
1635 // It seems that the X server running on build servers is too old and does not
1636 // support F16 (i.e. 'XKeysymToKeycode(display_, XF86XK_Launch7)' call).
1637 // TODO(yusukes): Reenable the test once build servers are upgraded.
1638
1639 TestingPrefServiceSyncable prefs; 930 TestingPrefServiceSyncable prefs;
1640 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 931 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1641 932
1642 chromeos::input_method::FakeImeKeyboard keyboard; 933 chromeos::input_method::FakeImeKeyboard ime_keyboard;
1643 EventRewriter rewriter; 934 EventRewriter rewriter;
1644 rewriter.set_pref_service_for_testing(&prefs); 935 rewriter.set_pref_service_for_testing(&prefs);
1645 rewriter.set_keyboard_for_testing(&keyboard); 936 rewriter.set_ime_keyboard_for_testing(&ime_keyboard);
1646 EXPECT_FALSE(keyboard.caps_lock_is_enabled_); 937 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_);
1647 938
1648 // On Chrome OS, CapsLock is mapped to F16 with Mod3Mask. 939 // On Chrome OS, CapsLock is mapped to F16 with Mod3Mask.
1649 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, 940 EXPECT_EQ(GetExpectedResultAsString(
1650 ui::EF_CAPS_LOCK_DOWN, 941 ui::VKEY_CAPITAL, ui::EF_CAPS_LOCK_DOWN, ui::ET_KEY_PRESSED),
1651 ui::ET_KEY_PRESSED, 942 GetRewrittenEventAsString(
1652 keycode_caps_lock_, 943 &rewriter, ui::VKEY_F16, ui::EF_NONE, ui::ET_KEY_PRESSED));
1653 0U, 944 EXPECT_TRUE(ime_keyboard.caps_lock_is_enabled_);
1654 KeyPress),
1655 GetRewrittenEventAsString(&rewriter,
1656 ui::VKEY_F16,
1657 0,
1658 ui::ET_KEY_PRESSED,
1659 keycode_launch7_,
1660 0U));
1661 EXPECT_TRUE(keyboard.caps_lock_is_enabled_);
1662 } 945 }
1663 946
1664 TEST_F(EventRewriterTest, DISABLED_TestRewriteDiamondKey) { 947 TEST_F(EventRewriterTest, TestRewriteDiamondKey) {
1665 // TODO(yusukes): Reenable the test once build servers are upgraded.
1666
1667 TestingPrefServiceSyncable prefs; 948 TestingPrefServiceSyncable prefs;
1668 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 949 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1669 950
1670 chromeos::input_method::FakeImeKeyboard keyboard; 951 chromeos::input_method::FakeImeKeyboard ime_keyboard;
1671 EventRewriter rewriter; 952 EventRewriter rewriter;
1672 rewriter.set_pref_service_for_testing(&prefs); 953 rewriter.set_pref_service_for_testing(&prefs);
1673 rewriter.set_keyboard_for_testing(&keyboard); 954 rewriter.set_ime_keyboard_for_testing(&ime_keyboard);
1674 955
1675 // F15 should work as Ctrl when --has-chromeos-diamond-key is not specified. 956 // F15 should work as Ctrl when --has-chromeos-diamond-key is not specified.
1676 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, 957 EXPECT_EQ(GetExpectedResultAsString(
1677 ui::EF_CONTROL_DOWN, 958 ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN, ui::ET_KEY_PRESSED),
1678 ui::ET_KEY_PRESSED, 959 GetRewrittenEventAsString(
1679 keycode_control_l_, 960 &rewriter, ui::VKEY_F15, ui::EF_NONE, ui::ET_KEY_PRESSED));
1680 0U,
1681 KeyPress),
1682 GetRewrittenEventAsString(&rewriter,
1683 ui::VKEY_F15,
1684 0,
1685 ui::ET_KEY_PRESSED,
1686 keycode_launch6_,
1687 0U));
1688 961
1689 // However, Mod2Mask should not be rewritten to CtrlMask when 962 // However, Mod2Mask should not be rewritten to CtrlMask when
1690 // --has-chromeos-diamond-key is not specified. 963 // --has-chromeos-diamond-key is not specified.
1691 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, 964 EXPECT_EQ(
1692 0, 965 GetExpectedResultAsString(ui::VKEY_A, ui::EF_NONE, ui::ET_KEY_PRESSED),
1693 ui::ET_KEY_PRESSED, 966 GetRewrittenEventAsString(
1694 keycode_a_, 967 &rewriter, ui::VKEY_A, ui::EF_NONE, ui::ET_KEY_PRESSED));
1695 Mod2Mask,
1696 KeyPress),
1697 GetRewrittenEventAsString(&rewriter,
1698 ui::VKEY_A,
1699 0,
1700 ui::ET_KEY_PRESSED,
1701 keycode_a_,
1702 Mod2Mask));
1703 } 968 }
1704 969
1705 TEST_F(EventRewriterTest, DISABLED_TestRewriteDiamondKeyWithFlag) { 970 TEST_F(EventRewriterTest, TestRewriteDiamondKeyWithFlag) {
1706 // TODO(yusukes): Reenable the test once build servers are upgraded.
1707
1708 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); 971 const CommandLine original_cl(*CommandLine::ForCurrentProcess());
1709 CommandLine::ForCurrentProcess()->AppendSwitchASCII( 972 CommandLine::ForCurrentProcess()->AppendSwitchASCII(
1710 chromeos::switches::kHasChromeOSDiamondKey, ""); 973 chromeos::switches::kHasChromeOSDiamondKey, "");
1711 974
1712 TestingPrefServiceSyncable prefs; 975 TestingPrefServiceSyncable prefs;
1713 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 976 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1714 977
1715 chromeos::input_method::FakeImeKeyboard keyboard; 978 chromeos::input_method::FakeImeKeyboard ime_keyboard;
1716 EventRewriter rewriter; 979 EventRewriter rewriter;
1717 rewriter.set_pref_service_for_testing(&prefs); 980 rewriter.set_pref_service_for_testing(&prefs);
1718 rewriter.set_keyboard_for_testing(&keyboard); 981 rewriter.set_ime_keyboard_for_testing(&ime_keyboard);
1719 982
1720 // By default, F15 should work as Control. 983 // By default, F15 should work as Control.
1721 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, 984 EXPECT_EQ(GetExpectedResultAsString(
1722 ui::EF_CONTROL_DOWN, 985 ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN, ui::ET_KEY_PRESSED),
1723 ui::ET_KEY_PRESSED, 986 GetRewrittenEventAsString(
1724 keycode_control_l_, 987 &rewriter, ui::VKEY_F15, ui::EF_NONE, ui::ET_KEY_PRESSED));
1725 0U,
1726 KeyPress),
1727 GetRewrittenEventAsString(&rewriter,
1728 ui::VKEY_F15,
1729 0,
1730 ui::ET_KEY_PRESSED,
1731 keycode_launch6_,
1732 0U));
1733 988
1734 IntegerPrefMember diamond; 989 IntegerPrefMember diamond;
1735 diamond.Init(prefs::kLanguageRemapDiamondKeyTo, &prefs); 990 diamond.Init(prefs::kLanguageRemapDiamondKeyTo, &prefs);
1736 diamond.SetValue(chromeos::input_method::kVoidKey); 991 diamond.SetValue(chromeos::input_method::kVoidKey);
1737 992
1738 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_UNKNOWN, 993 EXPECT_EQ(GetExpectedResultAsString(
1739 0, 994 ui::VKEY_UNKNOWN, ui::EF_NONE, ui::ET_KEY_PRESSED),
1740 ui::ET_KEY_PRESSED, 995 GetRewrittenEventAsString(
1741 keycode_void_symbol_, 996 &rewriter, ui::VKEY_F15, ui::EF_NONE, ui::ET_KEY_PRESSED));
1742 0U,
1743 KeyPress),
1744 GetRewrittenEventAsString(&rewriter,
1745 ui::VKEY_F15,
1746 0,
1747 ui::ET_KEY_PRESSED,
1748 keycode_launch6_,
1749 0U));
1750 997
1751 diamond.SetValue(chromeos::input_method::kControlKey); 998 diamond.SetValue(chromeos::input_method::kControlKey);
1752 999
1753 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, 1000 EXPECT_EQ(GetExpectedResultAsString(
1754 ui::EF_CONTROL_DOWN, 1001 ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN, ui::ET_KEY_PRESSED),
1755 ui::ET_KEY_PRESSED, 1002 GetRewrittenEventAsString(
1756 keycode_control_l_, 1003 &rewriter, ui::VKEY_F15, ui::EF_NONE, ui::ET_KEY_PRESSED));
1757 0U,
1758 KeyPress),
1759 GetRewrittenEventAsString(&rewriter,
1760 ui::VKEY_F15,
1761 0,
1762 ui::ET_KEY_PRESSED,
1763 keycode_launch6_,
1764 0U));
1765 1004
1766 diamond.SetValue(chromeos::input_method::kAltKey); 1005 diamond.SetValue(chromeos::input_method::kAltKey);
1767 1006
1768 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU, 1007 EXPECT_EQ(GetExpectedResultAsString(
1769 ui::EF_ALT_DOWN, 1008 ui::VKEY_MENU, ui::EF_ALT_DOWN, ui::ET_KEY_PRESSED),
1770 ui::ET_KEY_PRESSED, 1009 GetRewrittenEventAsString(
1771 keycode_alt_l_, 1010 &rewriter, ui::VKEY_F15, ui::EF_NONE, ui::ET_KEY_PRESSED));
1772 0,
1773 KeyPress),
1774 GetRewrittenEventAsString(&rewriter,
1775 ui::VKEY_F15,
1776 0,
1777 ui::ET_KEY_PRESSED,
1778 keycode_launch6_,
1779 0U));
1780 1011
1781 diamond.SetValue(chromeos::input_method::kCapsLockKey); 1012 diamond.SetValue(chromeos::input_method::kCapsLockKey);
1782 1013
1783 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, 1014 EXPECT_EQ(GetExpectedResultAsString(
1784 ui::EF_CAPS_LOCK_DOWN, 1015 ui::VKEY_CAPITAL, ui::EF_CAPS_LOCK_DOWN, ui::ET_KEY_PRESSED),
1785 ui::ET_KEY_PRESSED, 1016 GetRewrittenEventAsString(
1786 keycode_caps_lock_, 1017 &rewriter, ui::VKEY_F15, ui::EF_NONE, ui::ET_KEY_PRESSED));
1787 0U,
1788 KeyPress),
1789 GetRewrittenEventAsString(&rewriter,
1790 ui::VKEY_F15,
1791 0,
1792 ui::ET_KEY_PRESSED,
1793 keycode_launch6_,
1794 0U));
1795 1018
1796 *CommandLine::ForCurrentProcess() = original_cl; 1019 *CommandLine::ForCurrentProcess() = original_cl;
1797 } 1020 }
1798 1021
1799 TEST_F(EventRewriterTest, TestRewriteCapsLockToControl) { 1022 TEST_F(EventRewriterTest, TestRewriteCapsLockToControl) {
1023 // Remap CapsLock to Control.
1800 TestingPrefServiceSyncable prefs; 1024 TestingPrefServiceSyncable prefs;
1801 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1025 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1802 IntegerPrefMember control; 1026 IntegerPrefMember control;
1803 control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs); 1027 control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs);
1804 control.SetValue(chromeos::input_method::kControlKey); 1028 control.SetValue(chromeos::input_method::kControlKey);
1805 1029
1806 EventRewriter rewriter; 1030 EventRewriter rewriter;
1807 rewriter.set_pref_service_for_testing(&prefs); 1031 rewriter.set_pref_service_for_testing(&prefs);
1808 1032
1809 // Press CapsLock+a. Confirm that Mod3Mask is rewritten to ControlMask. 1033 // Press CapsLock+a. Confirm that Mod3Mask is rewritten to ControlMask.
1810 // On Chrome OS, CapsLock works as a Mod3 modifier. 1034 // On Chrome OS, CapsLock works as a Mod3 modifier.
1811 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, 1035 EXPECT_EQ(
1812 ui::EF_CONTROL_DOWN, 1036 GetExpectedResultAsString(
1813 ui::ET_KEY_PRESSED, 1037 ui::VKEY_A, ui::EF_CONTROL_DOWN, ui::ET_KEY_PRESSED),
1814 keycode_a_, 1038 GetRewrittenEventAsString(
1815 ControlMask, 1039 &rewriter, ui::VKEY_A, ui::EF_CAPS_LOCK_DOWN, ui::ET_KEY_PRESSED));
1816 KeyPress),
1817 GetRewrittenEventAsString(&rewriter,
1818 ui::VKEY_A,
1819 0,
1820 ui::ET_KEY_PRESSED,
1821 keycode_a_,
1822 Mod3Mask));
1823 1040
1824 // Press Control+CapsLock+a. Confirm that Mod3Mask is rewritten to ControlMask 1041 // Press Control+CapsLock+a. Confirm that Mod3Mask is rewritten to ControlMask
1825 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, 1042 EXPECT_EQ(
1826 ui::EF_CONTROL_DOWN, 1043 GetExpectedResultAsString(
1827 ui::ET_KEY_PRESSED, 1044 ui::VKEY_A, ui::EF_CONTROL_DOWN, ui::ET_KEY_PRESSED),
1828 keycode_a_, 1045 GetRewrittenEventAsString(
1829 ControlMask, 1046 &rewriter, ui::VKEY_A, ui::EF_CONTROL_DOWN, ui::ET_KEY_PRESSED));
1830 KeyPress),
1831 GetRewrittenEventAsString(&rewriter,
1832 ui::VKEY_A,
1833 ui::EF_CONTROL_DOWN,
1834 ui::ET_KEY_PRESSED,
1835 keycode_a_,
1836 Mod3Mask | ControlMask));
1837 1047
1838 // Press Alt+CapsLock+a. Confirm that Mod3Mask is rewritten to ControlMask. 1048 // Press Alt+CapsLock+a. Confirm that Mod3Mask is rewritten to ControlMask.
1839 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, 1049 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A,
1840 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, 1050 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
1841 ui::ET_KEY_PRESSED, 1051 ui::ET_KEY_PRESSED),
1842 keycode_a_,
1843 Mod1Mask | ControlMask,
1844 KeyPress),
1845 GetRewrittenEventAsString(&rewriter, 1052 GetRewrittenEventAsString(&rewriter,
1846 ui::VKEY_A, 1053 ui::VKEY_A,
1847 ui::EF_ALT_DOWN, 1054 ui::EF_ALT_DOWN | ui::EF_CAPS_LOCK_DOWN,
1848 ui::ET_KEY_PRESSED, 1055 ui::ET_KEY_PRESSED));
1849 keycode_a_,
1850 Mod1Mask | Mod3Mask));
1851 } 1056 }
1852 1057
1853 TEST_F(EventRewriterTest, TestRewriteCapsLockMod3InUse) { 1058 TEST_F(EventRewriterTest, TestRewriteCapsLockMod3InUse) {
1854 // Remap CapsLock to Control. 1059 // Remap CapsLock to Control.
1855 TestingPrefServiceSyncable prefs; 1060 TestingPrefServiceSyncable prefs;
1856 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1061 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1857 IntegerPrefMember control; 1062 IntegerPrefMember control;
1858 control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs); 1063 control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs);
1859 control.SetValue(chromeos::input_method::kControlKey); 1064 control.SetValue(chromeos::input_method::kControlKey);
1860 1065
1861 EventRewriter rewriter; 1066 EventRewriter rewriter;
1862 rewriter.set_pref_service_for_testing(&prefs); 1067 rewriter.set_pref_service_for_testing(&prefs);
1863 input_method_manager_mock_->set_mod3_used(true); 1068 input_method_manager_mock_->set_mod3_used(true);
1864 1069
1865 // Press CapsLock+a. Confirm that Mod3Mask is NOT rewritten to ControlMask 1070 // Press CapsLock+a. Confirm that Mod3Mask is NOT rewritten to ControlMask
1866 // when Mod3Mask is already in use by the current XKB layout. 1071 // when Mod3Mask is already in use by the current XKB layout.
1867 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, 1072 EXPECT_EQ(
1868 0, 1073 GetExpectedResultAsString(ui::VKEY_A, ui::EF_NONE, ui::ET_KEY_PRESSED),
1869 ui::ET_KEY_PRESSED, 1074 GetRewrittenEventAsString(
1870 keycode_a_, 1075 &rewriter, ui::VKEY_A, ui::EF_NONE, ui::ET_KEY_PRESSED));
1871 Mod3Mask,
1872 KeyPress),
1873 GetRewrittenEventAsString(&rewriter,
1874 ui::VKEY_A,
1875 0,
1876 ui::ET_KEY_PRESSED,
1877 keycode_a_,
1878 Mod3Mask));
1879 1076
1880 input_method_manager_mock_->set_mod3_used(false); 1077 input_method_manager_mock_->set_mod3_used(false);
1881 } 1078 }
1882 1079
1883 TEST_F(EventRewriterTest, TestRewriteExtendedKeys) { 1080 TEST_F(EventRewriterTest, TestRewriteExtendedKeys) {
1884 TestingPrefServiceSyncable prefs; 1081 TestingPrefServiceSyncable prefs;
1885 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1082 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1886 EventRewriter rewriter; 1083 EventRewriter rewriter;
1084 rewriter.DeviceAddedForTesting(0, "PC Keyboard");
1085 rewriter.set_last_device_id_for_testing(0);
1887 rewriter.set_pref_service_for_testing(&prefs); 1086 rewriter.set_pref_service_for_testing(&prefs);
1888 1087
1889 struct { 1088 struct {
1890 ui::KeyboardCode input; 1089 ui::KeyboardCode input;
1891 KeyCode input_native;
1892 unsigned int input_mods; 1090 unsigned int input_mods;
1893 unsigned int input_native_mods;
1894 ui::KeyboardCode output; 1091 ui::KeyboardCode output;
1895 KeyCode output_native;
1896 unsigned int output_mods; 1092 unsigned int output_mods;
1897 unsigned int output_native_mods;
1898 } chromeos_tests[] = { 1093 } chromeos_tests[] = {
1899 // Alt+Backspace -> Delete 1094 // Alt+Backspace -> Delete
1900 { ui::VKEY_BACK, keycode_backspace_, 1095 {ui::VKEY_BACK, ui::EF_ALT_DOWN, ui::VKEY_DELETE, ui::EF_NONE},
1901 ui::EF_ALT_DOWN, Mod1Mask, 1096 // Control+Alt+Backspace -> Control+Delete
1902 ui::VKEY_DELETE, keycode_delete_, 1097 {ui::VKEY_BACK, ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::VKEY_DELETE,
1903 0, 0, }, 1098 ui::EF_CONTROL_DOWN},
1904 // Control+Alt+Backspace -> Control+Delete 1099 // Search+Alt+Backspace -> Alt+Backspace
1905 { ui::VKEY_BACK, keycode_backspace_, 1100 {ui::VKEY_BACK, ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::VKEY_BACK,
1906 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask, 1101 ui::EF_ALT_DOWN},
1907 ui::VKEY_DELETE, keycode_delete_, 1102 // Search+Control+Alt+Backspace -> Control+Alt+Backspace
1908 ui::EF_CONTROL_DOWN, ControlMask, }, 1103 {ui::VKEY_BACK,
1909 // Search+Alt+Backspace -> Alt+Backspace 1104 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
1910 { ui::VKEY_BACK, keycode_backspace_, 1105 ui::VKEY_BACK, ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN},
1911 ui::EF_ALT_DOWN, Mod1Mask | Mod4Mask, 1106 // Alt+Up -> Prior
1912 ui::VKEY_BACK, keycode_backspace_, 1107 {ui::VKEY_UP, ui::EF_ALT_DOWN, ui::VKEY_PRIOR, ui::EF_NONE},
1913 ui::EF_ALT_DOWN, Mod1Mask, }, 1108 // Alt+Down -> Next
1914 // Search+Control+Alt+Backspace -> Control+Alt+Backspace 1109 {ui::VKEY_DOWN, ui::EF_ALT_DOWN, ui::VKEY_NEXT, ui::EF_NONE},
1915 { ui::VKEY_BACK, keycode_backspace_, 1110 // Ctrl+Alt+Up -> Home
1916 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask | Mod4Mask, 1111 {ui::VKEY_UP, ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::VKEY_HOME,
1917 ui::VKEY_BACK, keycode_backspace_, 1112 ui::EF_NONE},
1918 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask, }, 1113 // Ctrl+Alt+Down -> End
1919 // Alt+Up -> Prior 1114 {ui::VKEY_DOWN, ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::VKEY_END,
1920 { ui::VKEY_UP, keycode_up_, 1115 ui::EF_NONE},
1921 ui::EF_ALT_DOWN, Mod1Mask,
1922 ui::VKEY_PRIOR, keycode_prior_,
1923 0, 0, },
1924 // Alt+Down -> Next
1925 { ui::VKEY_DOWN, keycode_down_,
1926 ui::EF_ALT_DOWN, Mod1Mask,
1927 ui::VKEY_NEXT, keycode_next_,
1928 0, 0, },
1929 // Ctrl+Alt+Up -> Home
1930 { ui::VKEY_UP, keycode_up_,
1931 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask,
1932 ui::VKEY_HOME, keycode_home_,
1933 0, 0, },
1934 // Ctrl+Alt+Down -> End
1935 { ui::VKEY_DOWN, keycode_down_,
1936 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask,
1937 ui::VKEY_END, keycode_end_,
1938 0, 0, },
1939 1116
1940 // Search+Alt+Up -> Alt+Up 1117 // Search+Alt+Up -> Alt+Up
1941 { ui::VKEY_UP, keycode_up_, 1118 {ui::VKEY_UP, ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::VKEY_UP,
1942 ui::EF_ALT_DOWN, Mod1Mask | Mod4Mask, 1119 ui::EF_ALT_DOWN},
1943 ui::VKEY_UP, keycode_up_, 1120 // Search+Alt+Down -> Alt+Down
1944 ui::EF_ALT_DOWN, Mod1Mask }, 1121 {ui::VKEY_DOWN, ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::VKEY_DOWN,
1945 // Search+Alt+Down -> Alt+Down 1122 ui::EF_ALT_DOWN},
1946 { ui::VKEY_DOWN, keycode_down_, 1123 // Search+Ctrl+Alt+Up -> Search+Ctrl+Alt+Up
1947 ui::EF_ALT_DOWN, Mod1Mask | Mod4Mask, 1124 {ui::VKEY_UP,
1948 ui::VKEY_DOWN, keycode_down_, 1125 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
1949 ui::EF_ALT_DOWN, Mod1Mask }, 1126 ui::VKEY_UP, ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN},
1950 // Search+Ctrl+Alt+Up -> Search+Ctrl+Alt+Up 1127 // Search+Ctrl+Alt+Down -> Ctrl+Alt+Down
1951 { ui::VKEY_UP, keycode_up_, 1128 {ui::VKEY_DOWN,
1952 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask | Mod4Mask, 1129 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
1953 ui::VKEY_UP, keycode_up_, 1130 ui::VKEY_DOWN, ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN},
1954 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask },
1955 // Search+Ctrl+Alt+Down -> Ctrl+Alt+Down
1956 { ui::VKEY_DOWN, keycode_down_,
1957 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask | Mod4Mask,
1958 ui::VKEY_DOWN, keycode_down_,
1959 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask },
1960 1131
1961 // Period -> Period 1132 // Period -> Period
1962 { ui::VKEY_OEM_PERIOD, keycode_period_, 0, 0, 1133 {ui::VKEY_OEM_PERIOD, ui::EF_NONE, ui::VKEY_OEM_PERIOD, ui::EF_NONE},
1963 ui::VKEY_OEM_PERIOD, keycode_period_, 0, 0 },
1964 1134
1965 // Search+Backspace -> Delete 1135 // Search+Backspace -> Delete
1966 { ui::VKEY_BACK, keycode_backspace_, 1136 {ui::VKEY_BACK, ui::EF_COMMAND_DOWN, ui::VKEY_DELETE, ui::EF_NONE},
1967 0, Mod4Mask, 1137 // Search+Up -> Prior
1968 ui::VKEY_DELETE, keycode_delete_, 1138 {ui::VKEY_UP, ui::EF_COMMAND_DOWN, ui::VKEY_PRIOR, ui::EF_NONE},
1969 0, 0, }, 1139 // Search+Down -> Next
1970 // Search+Up -> Prior 1140 {ui::VKEY_DOWN, ui::EF_COMMAND_DOWN, ui::VKEY_NEXT, ui::EF_NONE},
1971 { ui::VKEY_UP, keycode_up_, 1141 // Search+Left -> Home
1972 0, Mod4Mask, 1142 {ui::VKEY_LEFT, ui::EF_COMMAND_DOWN, ui::VKEY_HOME, ui::EF_NONE},
1973 ui::VKEY_PRIOR, keycode_prior_, 1143 // Control+Search+Left -> Home
1974 0, 0, }, 1144 {ui::VKEY_LEFT, ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN,
1975 // Search+Down -> Next 1145 ui::VKEY_HOME, ui::EF_CONTROL_DOWN},
1976 { ui::VKEY_DOWN, keycode_down_, 1146 // Search+Right -> End
1977 0, Mod4Mask, 1147 {ui::VKEY_RIGHT, ui::EF_COMMAND_DOWN, ui::VKEY_END, ui::EF_NONE},
1978 ui::VKEY_NEXT, keycode_next_, 1148 // Control+Search+Right -> End
1979 0, 0, }, 1149 {ui::VKEY_RIGHT, ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN,
1980 // Search+Left -> Home 1150 ui::VKEY_END, ui::EF_CONTROL_DOWN},
1981 { ui::VKEY_LEFT, keycode_left_, 1151 // Search+Period -> Insert
1982 0, Mod4Mask, 1152 {ui::VKEY_OEM_PERIOD, ui::EF_COMMAND_DOWN, ui::VKEY_INSERT,
1983 ui::VKEY_HOME, keycode_home_, 1153 ui::EF_NONE},
1984 0, 0, }, 1154 // Control+Search+Period -> Control+Insert
1985 // Control+Search+Left -> Home 1155 {ui::VKEY_OEM_PERIOD, ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN,
1986 { ui::VKEY_LEFT, keycode_left_, 1156 ui::VKEY_INSERT, ui::EF_CONTROL_DOWN}};
1987 ui::EF_CONTROL_DOWN, Mod4Mask | ControlMask,
1988 ui::VKEY_HOME, keycode_home_,
1989 ui::EF_CONTROL_DOWN, ControlMask },
1990 // Search+Right -> End
1991 { ui::VKEY_RIGHT, keycode_right_,
1992 0, Mod4Mask,
1993 ui::VKEY_END, keycode_end_,
1994 0, 0, },
1995 // Control+Search+Right -> End
1996 { ui::VKEY_RIGHT, keycode_right_,
1997 ui::EF_CONTROL_DOWN, Mod4Mask | ControlMask,
1998 ui::VKEY_END, keycode_end_,
1999 ui::EF_CONTROL_DOWN, ControlMask },
2000 // Search+Period -> Insert
2001 { ui::VKEY_OEM_PERIOD, keycode_period_, 0, Mod4Mask,
2002 ui::VKEY_INSERT, keycode_insert_, 0, 0 },
2003 // Control+Search+Period -> Control+Insert
2004 { ui::VKEY_OEM_PERIOD, keycode_period_,
2005 ui::EF_CONTROL_DOWN, Mod4Mask | ControlMask,
2006 ui::VKEY_INSERT, keycode_insert_,
2007 ui::EF_CONTROL_DOWN, ControlMask }
2008 };
2009 1157
2010 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(chromeos_tests); ++i) { 1158 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(chromeos_tests); ++i) {
2011 EXPECT_EQ(GetExpectedResultAsString(chromeos_tests[i].output, 1159 EXPECT_EQ(GetExpectedResultNumbered(i,
1160 chromeos_tests[i].output,
2012 chromeos_tests[i].output_mods, 1161 chromeos_tests[i].output_mods,
2013 ui::ET_KEY_PRESSED, 1162 ui::ET_KEY_PRESSED),
2014 chromeos_tests[i].output_native, 1163 GetRewrittenEventNumbered(i,
2015 chromeos_tests[i].output_native_mods, 1164 &rewriter,
2016 KeyPress),
2017 GetRewrittenEventAsString(&rewriter,
2018 chromeos_tests[i].input, 1165 chromeos_tests[i].input,
2019 chromeos_tests[i].input_mods, 1166 chromeos_tests[i].input_mods,
2020 ui::ET_KEY_PRESSED, 1167 ui::ET_KEY_PRESSED));
2021 chromeos_tests[i].input_native,
2022 chromeos_tests[i].input_native_mods));
2023 } 1168 }
2024 } 1169 }
2025 1170
2026 TEST_F(EventRewriterTest, TestRewriteFunctionKeys) { 1171 TEST_F(EventRewriterTest, TestRewriteFunctionKeys) {
2027 TestingPrefServiceSyncable prefs; 1172 TestingPrefServiceSyncable prefs;
2028 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1173 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
2029 EventRewriter rewriter; 1174 EventRewriter rewriter;
2030 rewriter.set_pref_service_for_testing(&prefs); 1175 rewriter.set_pref_service_for_testing(&prefs);
2031 1176
2032 struct { 1177 struct {
2033 ui::KeyboardCode input; 1178 ui::KeyboardCode input;
2034 KeyCode input_native;
2035 unsigned int input_native_mods;
2036 unsigned int input_mods; 1179 unsigned int input_mods;
2037 ui::KeyboardCode output; 1180 ui::KeyboardCode output;
2038 KeyCode output_native;
2039 unsigned int output_native_mods;
2040 unsigned int output_mods; 1181 unsigned int output_mods;
2041 } tests[] = { 1182 } tests[] = {
2042 // F1 -> Back 1183 // F1 -> Back
2043 { ui::VKEY_F1, keycode_f1_, 0, 0, 1184 {ui::VKEY_F1, ui::EF_NONE, ui::VKEY_BROWSER_BACK, ui::EF_NONE},
2044 ui::VKEY_BROWSER_BACK, keycode_browser_back_, 0, 0 }, 1185 {ui::VKEY_F1, ui::EF_CONTROL_DOWN, ui::VKEY_BROWSER_BACK,
2045 { ui::VKEY_F1, keycode_f1_, ControlMask, ui::EF_CONTROL_DOWN, 1186 ui::EF_CONTROL_DOWN},
2046 ui::VKEY_BROWSER_BACK, keycode_browser_back_, 1187 {ui::VKEY_F1, ui::EF_ALT_DOWN, ui::VKEY_BROWSER_BACK, ui::EF_ALT_DOWN},
2047 ControlMask, ui::EF_CONTROL_DOWN }, 1188 // F2 -> Forward
2048 { ui::VKEY_F1, keycode_f1_, Mod1Mask, ui::EF_ALT_DOWN, 1189 {ui::VKEY_F2, ui::EF_NONE, ui::VKEY_BROWSER_FORWARD, ui::EF_NONE},
2049 ui::VKEY_BROWSER_BACK, keycode_browser_back_, 1190 {ui::VKEY_F2, ui::EF_CONTROL_DOWN, ui::VKEY_BROWSER_FORWARD,
2050 Mod1Mask, ui::EF_ALT_DOWN }, 1191 ui::EF_CONTROL_DOWN},
2051 // F2 -> Forward 1192 {ui::VKEY_F2, ui::EF_ALT_DOWN, ui::VKEY_BROWSER_FORWARD,
2052 { ui::VKEY_F2, keycode_f2_, 0, 0, 1193 ui::EF_ALT_DOWN},
2053 ui::VKEY_BROWSER_FORWARD, keycode_browser_forward_, 0, 0 }, 1194 // F3 -> Refresh
2054 { ui::VKEY_F2, keycode_f2_, ControlMask, ui::EF_CONTROL_DOWN, 1195 {ui::VKEY_F3, ui::EF_NONE, ui::VKEY_BROWSER_REFRESH, ui::EF_NONE},
2055 ui::VKEY_BROWSER_FORWARD, keycode_browser_forward_, 1196 {ui::VKEY_F3, ui::EF_CONTROL_DOWN, ui::VKEY_BROWSER_REFRESH,
2056 ControlMask, ui::EF_CONTROL_DOWN }, 1197 ui::EF_CONTROL_DOWN},
2057 { ui::VKEY_F2, keycode_f2_, Mod1Mask, ui::EF_ALT_DOWN, 1198 {ui::VKEY_F3, ui::EF_ALT_DOWN, ui::VKEY_BROWSER_REFRESH,
2058 ui::VKEY_BROWSER_FORWARD, keycode_browser_forward_, 1199 ui::EF_ALT_DOWN},
2059 Mod1Mask, ui::EF_ALT_DOWN }, 1200 // F4 -> Launch App 2
2060 // F3 -> Refresh 1201 {ui::VKEY_F4, ui::EF_NONE, ui::VKEY_MEDIA_LAUNCH_APP2, ui::EF_NONE},
2061 { ui::VKEY_F3, keycode_f3_, 0, 0, 1202 {ui::VKEY_F4, ui::EF_CONTROL_DOWN, ui::VKEY_MEDIA_LAUNCH_APP2,
2062 ui::VKEY_BROWSER_REFRESH, keycode_browser_refresh_, 0, 0 }, 1203 ui::EF_CONTROL_DOWN},
2063 { ui::VKEY_F3, keycode_f3_, ControlMask, ui::EF_CONTROL_DOWN, 1204 {ui::VKEY_F4, ui::EF_ALT_DOWN, ui::VKEY_MEDIA_LAUNCH_APP2,
2064 ui::VKEY_BROWSER_REFRESH, keycode_browser_refresh_, 1205 ui::EF_ALT_DOWN},
2065 ControlMask, ui::EF_CONTROL_DOWN }, 1206 // F5 -> Launch App 1
2066 { ui::VKEY_F3, keycode_f3_, Mod1Mask, ui::EF_ALT_DOWN, 1207 {ui::VKEY_F5, ui::EF_NONE, ui::VKEY_MEDIA_LAUNCH_APP1, ui::EF_NONE},
2067 ui::VKEY_BROWSER_REFRESH, keycode_browser_refresh_, 1208 {ui::VKEY_F5, ui::EF_CONTROL_DOWN, ui::VKEY_MEDIA_LAUNCH_APP1,
2068 Mod1Mask, ui::EF_ALT_DOWN }, 1209 ui::EF_CONTROL_DOWN},
2069 // F4 -> Launch App 2 1210 {ui::VKEY_F5, ui::EF_ALT_DOWN, ui::VKEY_MEDIA_LAUNCH_APP1,
2070 { ui::VKEY_F4, keycode_f4_, 0, 0, 1211 ui::EF_ALT_DOWN},
2071 ui::VKEY_MEDIA_LAUNCH_APP2, keycode_media_launch_app2_, 0, 0 }, 1212 // F6 -> Brightness down
2072 { ui::VKEY_F4, keycode_f4_, ControlMask, ui::EF_CONTROL_DOWN, 1213 {ui::VKEY_F6, ui::EF_NONE, ui::VKEY_BRIGHTNESS_DOWN, ui::EF_NONE},
2073 ui::VKEY_MEDIA_LAUNCH_APP2, keycode_media_launch_app2_, 1214 {ui::VKEY_F6, ui::EF_CONTROL_DOWN, ui::VKEY_BRIGHTNESS_DOWN,
2074 ControlMask, ui::EF_CONTROL_DOWN }, 1215 ui::EF_CONTROL_DOWN},
2075 { ui::VKEY_F4, keycode_f4_, Mod1Mask, ui::EF_ALT_DOWN, 1216 {ui::VKEY_F6, ui::EF_ALT_DOWN, ui::VKEY_BRIGHTNESS_DOWN,
2076 ui::VKEY_MEDIA_LAUNCH_APP2, keycode_media_launch_app2_, 1217 ui::EF_ALT_DOWN},
2077 Mod1Mask, ui::EF_ALT_DOWN }, 1218 // F7 -> Brightness up
2078 // F5 -> Launch App 1 1219 {ui::VKEY_F7, ui::EF_NONE, ui::VKEY_BRIGHTNESS_UP, ui::EF_NONE},
2079 { ui::VKEY_F5, keycode_f5_, 0, 0, 1220 {ui::VKEY_F7, ui::EF_CONTROL_DOWN, ui::VKEY_BRIGHTNESS_UP,
2080 ui::VKEY_MEDIA_LAUNCH_APP1, keycode_media_launch_app1_, 0, 0 }, 1221 ui::EF_CONTROL_DOWN},
2081 { ui::VKEY_F5, keycode_f5_, ControlMask, ui::EF_CONTROL_DOWN, 1222 {ui::VKEY_F7, ui::EF_ALT_DOWN, ui::VKEY_BRIGHTNESS_UP, ui::EF_ALT_DOWN},
2082 ui::VKEY_MEDIA_LAUNCH_APP1, keycode_media_launch_app1_, 1223 // F8 -> Volume Mute
2083 ControlMask, ui::EF_CONTROL_DOWN }, 1224 {ui::VKEY_F8, ui::EF_NONE, ui::VKEY_VOLUME_MUTE, ui::EF_NONE},
2084 { ui::VKEY_F5, keycode_f5_, Mod1Mask, ui::EF_ALT_DOWN, 1225 {ui::VKEY_F8, ui::EF_CONTROL_DOWN, ui::VKEY_VOLUME_MUTE,
2085 ui::VKEY_MEDIA_LAUNCH_APP1, keycode_media_launch_app1_, 1226 ui::EF_CONTROL_DOWN},
2086 Mod1Mask, ui::EF_ALT_DOWN }, 1227 {ui::VKEY_F8, ui::EF_ALT_DOWN, ui::VKEY_VOLUME_MUTE, ui::EF_ALT_DOWN},
2087 // F6 -> Brightness down 1228 // F9 -> Volume Down
2088 { ui::VKEY_F6, keycode_f6_, 0, 0, 1229 {ui::VKEY_F9, ui::EF_NONE, ui::VKEY_VOLUME_DOWN, ui::EF_NONE},
2089 ui::VKEY_BRIGHTNESS_DOWN, keycode_brightness_down_, 0, 0 }, 1230 {ui::VKEY_F9, ui::EF_CONTROL_DOWN, ui::VKEY_VOLUME_DOWN,
2090 { ui::VKEY_F6, keycode_f6_, ControlMask, ui::EF_CONTROL_DOWN, 1231 ui::EF_CONTROL_DOWN},
2091 ui::VKEY_BRIGHTNESS_DOWN, keycode_brightness_down_, 1232 {ui::VKEY_F9, ui::EF_ALT_DOWN, ui::VKEY_VOLUME_DOWN, ui::EF_ALT_DOWN},
2092 ControlMask, ui::EF_CONTROL_DOWN }, 1233 // F10 -> Volume Up
2093 { ui::VKEY_F6, keycode_f6_, Mod1Mask, ui::EF_ALT_DOWN, 1234 {ui::VKEY_F10, ui::EF_NONE, ui::VKEY_VOLUME_UP, ui::EF_NONE},
2094 ui::VKEY_BRIGHTNESS_DOWN, keycode_brightness_down_, 1235 {ui::VKEY_F10, ui::EF_CONTROL_DOWN, ui::VKEY_VOLUME_UP,
2095 Mod1Mask, ui::EF_ALT_DOWN }, 1236 ui::EF_CONTROL_DOWN},
2096 // F7 -> Brightness up 1237 {ui::VKEY_F10, ui::EF_ALT_DOWN, ui::VKEY_VOLUME_UP, ui::EF_ALT_DOWN},
2097 { ui::VKEY_F7, keycode_f7_, 0, 0, 1238 // F11 -> F11
2098 ui::VKEY_BRIGHTNESS_UP, keycode_brightness_up_, 0, 0 }, 1239 {ui::VKEY_F11, ui::EF_NONE, ui::VKEY_F11, ui::EF_NONE},
2099 { ui::VKEY_F7, keycode_f7_, ControlMask, ui::EF_CONTROL_DOWN, 1240 {ui::VKEY_F11, ui::EF_CONTROL_DOWN, ui::VKEY_F11, ui::EF_CONTROL_DOWN},
2100 ui::VKEY_BRIGHTNESS_UP, keycode_brightness_up_, 1241 {ui::VKEY_F11, ui::EF_ALT_DOWN, ui::VKEY_F11, ui::EF_ALT_DOWN},
2101 ControlMask, ui::EF_CONTROL_DOWN }, 1242 // F12 -> F12
2102 { ui::VKEY_F7, keycode_f7_, Mod1Mask, ui::EF_ALT_DOWN, 1243 {ui::VKEY_F12, ui::EF_NONE, ui::VKEY_F12, ui::EF_NONE},
2103 ui::VKEY_BRIGHTNESS_UP, keycode_brightness_up_, 1244 {ui::VKEY_F12, ui::EF_CONTROL_DOWN, ui::VKEY_F12, ui::EF_CONTROL_DOWN},
2104 Mod1Mask, ui::EF_ALT_DOWN }, 1245 {ui::VKEY_F12, ui::EF_ALT_DOWN, ui::VKEY_F12, ui::EF_ALT_DOWN},
2105 // F8 -> Volume Mute
2106 { ui::VKEY_F8, keycode_f8_, 0, 0,
2107 ui::VKEY_VOLUME_MUTE, keycode_volume_mute_, 0, 0 },
2108 { ui::VKEY_F8, keycode_f8_, ControlMask, ui::EF_CONTROL_DOWN,
2109 ui::VKEY_VOLUME_MUTE, keycode_volume_mute_,
2110 ControlMask, ui::EF_CONTROL_DOWN },
2111 { ui::VKEY_F8, keycode_f8_, Mod1Mask, ui::EF_ALT_DOWN,
2112 ui::VKEY_VOLUME_MUTE, keycode_volume_mute_,
2113 Mod1Mask, ui::EF_ALT_DOWN },
2114 // F9 -> Volume Down
2115 { ui::VKEY_F9, keycode_f9_, 0, 0,
2116 ui::VKEY_VOLUME_DOWN, keycode_volume_down_, 0, 0 },
2117 { ui::VKEY_F9, keycode_f9_, ControlMask, ui::EF_CONTROL_DOWN,
2118 ui::VKEY_VOLUME_DOWN, keycode_volume_down_,
2119 ControlMask, ui::EF_CONTROL_DOWN },
2120 { ui::VKEY_F9, keycode_f9_, Mod1Mask, ui::EF_ALT_DOWN,
2121 ui::VKEY_VOLUME_DOWN, keycode_volume_down_,
2122 Mod1Mask, ui::EF_ALT_DOWN },
2123 // F10 -> Volume Up
2124 { ui::VKEY_F10, keycode_f10_, 0, 0,
2125 ui::VKEY_VOLUME_UP, keycode_volume_up_, 0, 0 },
2126 { ui::VKEY_F10, keycode_f10_, ControlMask, ui::EF_CONTROL_DOWN,
2127 ui::VKEY_VOLUME_UP, keycode_volume_up_,
2128 ControlMask, ui::EF_CONTROL_DOWN },
2129 { ui::VKEY_F10, keycode_f10_, Mod1Mask, ui::EF_ALT_DOWN,
2130 ui::VKEY_VOLUME_UP, keycode_volume_up_,
2131 Mod1Mask, ui::EF_ALT_DOWN },
2132 // F11 -> F11
2133 { ui::VKEY_F11, keycode_f11_, 0, 0,
2134 ui::VKEY_F11, keycode_f11_, 0, 0 },
2135 { ui::VKEY_F11, keycode_f11_, ControlMask, ui::EF_CONTROL_DOWN,
2136 ui::VKEY_F11, keycode_f11_, ControlMask, ui::EF_CONTROL_DOWN },
2137 { ui::VKEY_F11, keycode_f11_, Mod1Mask, ui::EF_ALT_DOWN,
2138 ui::VKEY_F11, keycode_f11_, Mod1Mask, ui::EF_ALT_DOWN },
2139 // F12 -> F12
2140 { ui::VKEY_F12, keycode_f12_, 0, 0,
2141 ui::VKEY_F12, keycode_f12_, 0, 0 },
2142 { ui::VKEY_F12, keycode_f12_, ControlMask, ui::EF_CONTROL_DOWN,
2143 ui::VKEY_F12, keycode_f12_, ControlMask, ui::EF_CONTROL_DOWN },
2144 { ui::VKEY_F12, keycode_f12_, Mod1Mask, ui::EF_ALT_DOWN,
2145 ui::VKEY_F12, keycode_f12_, Mod1Mask, ui::EF_ALT_DOWN },
2146 1246
2147 // The number row should not be rewritten without Search key. 1247 // The number row should not be rewritten without Search key.
2148 { ui::VKEY_1, keycode_1_, 0, 0, 1248 {ui::VKEY_1, ui::EF_NONE, ui::VKEY_1, ui::EF_NONE},
2149 ui::VKEY_1, keycode_1_, 0, 0 }, 1249 {ui::VKEY_2, ui::EF_NONE, ui::VKEY_2, ui::EF_NONE},
2150 { ui::VKEY_2, keycode_2_, 0, 0, 1250 {ui::VKEY_3, ui::EF_NONE, ui::VKEY_3, ui::EF_NONE},
2151 ui::VKEY_2, keycode_2_, 0, 0 }, 1251 {ui::VKEY_4, ui::EF_NONE, ui::VKEY_4, ui::EF_NONE},
2152 { ui::VKEY_3, keycode_3_, 0, 0, 1252 {ui::VKEY_5, ui::EF_NONE, ui::VKEY_5, ui::EF_NONE},
2153 ui::VKEY_3, keycode_3_, 0, 0 }, 1253 {ui::VKEY_6, ui::EF_NONE, ui::VKEY_6, ui::EF_NONE},
2154 { ui::VKEY_4, keycode_4_, 0, 0, 1254 {ui::VKEY_7, ui::EF_NONE, ui::VKEY_7, ui::EF_NONE},
2155 ui::VKEY_4, keycode_4_, 0, 0 }, 1255 {ui::VKEY_8, ui::EF_NONE, ui::VKEY_8, ui::EF_NONE},
2156 { ui::VKEY_5, keycode_5_, 0, 0, 1256 {ui::VKEY_9, ui::EF_NONE, ui::VKEY_9, ui::EF_NONE},
2157 ui::VKEY_5, keycode_5_, 0, 0 }, 1257 {ui::VKEY_0, ui::EF_NONE, ui::VKEY_0, ui::EF_NONE},
2158 { ui::VKEY_6, keycode_6_, 0, 0, 1258 {ui::VKEY_OEM_MINUS, ui::EF_NONE, ui::VKEY_OEM_MINUS, ui::EF_NONE},
2159 ui::VKEY_6, keycode_6_, 0, 0 }, 1259 {ui::VKEY_OEM_PLUS, ui::EF_NONE, ui::VKEY_OEM_PLUS, ui::EF_NONE},
2160 { ui::VKEY_7, keycode_7_, 0, 0,
2161 ui::VKEY_7, keycode_7_, 0, 0 },
2162 { ui::VKEY_8, keycode_8_, 0, 0,
2163 ui::VKEY_8, keycode_8_, 0, 0 },
2164 { ui::VKEY_9, keycode_9_, 0, 0,
2165 ui::VKEY_9, keycode_9_, 0, 0 },
2166 { ui::VKEY_0, keycode_0_, 0, 0,
2167 ui::VKEY_0, keycode_0_, 0, 0 },
2168 { ui::VKEY_OEM_MINUS, keycode_minus_, 0, 0,
2169 ui::VKEY_OEM_MINUS, keycode_minus_, 0, 0 },
2170 { ui::VKEY_OEM_PLUS, keycode_equal_, 0, 0,
2171 ui::VKEY_OEM_PLUS, keycode_equal_, 0, 0 },
2172 1260
2173 // The number row should be rewritten as the F<number> row with Search key. 1261 // The number row should be rewritten as the F<number> row with Search
2174 { ui::VKEY_1, keycode_1_, Mod4Mask, 0, 1262 // key.
2175 ui::VKEY_F1, keycode_f1_, 0, 0 }, 1263 {ui::VKEY_1, ui::EF_COMMAND_DOWN, ui::VKEY_F1, ui::EF_NONE},
2176 { ui::VKEY_2, keycode_2_, Mod4Mask, 0, 1264 {ui::VKEY_2, ui::EF_COMMAND_DOWN, ui::VKEY_F2, ui::EF_NONE},
2177 ui::VKEY_F2, keycode_f2_, 0, 0 }, 1265 {ui::VKEY_3, ui::EF_COMMAND_DOWN, ui::VKEY_F3, ui::EF_NONE},
2178 { ui::VKEY_3, keycode_3_, Mod4Mask, 0, 1266 {ui::VKEY_4, ui::EF_COMMAND_DOWN, ui::VKEY_F4, ui::EF_NONE},
2179 ui::VKEY_F3, keycode_f3_, 0, 0 }, 1267 {ui::VKEY_5, ui::EF_COMMAND_DOWN, ui::VKEY_F5, ui::EF_NONE},
2180 { ui::VKEY_4, keycode_4_, Mod4Mask, 0, 1268 {ui::VKEY_6, ui::EF_COMMAND_DOWN, ui::VKEY_F6, ui::EF_NONE},
2181 ui::VKEY_F4, keycode_f4_, 0, 0 }, 1269 {ui::VKEY_7, ui::EF_COMMAND_DOWN, ui::VKEY_F7, ui::EF_NONE},
2182 { ui::VKEY_5, keycode_5_, Mod4Mask, 0, 1270 {ui::VKEY_8, ui::EF_COMMAND_DOWN, ui::VKEY_F8, ui::EF_NONE},
2183 ui::VKEY_F5, keycode_f5_, 0, 0 }, 1271 {ui::VKEY_9, ui::EF_COMMAND_DOWN, ui::VKEY_F9, ui::EF_NONE},
2184 { ui::VKEY_6, keycode_6_, Mod4Mask, 0, 1272 {ui::VKEY_0, ui::EF_COMMAND_DOWN, ui::VKEY_F10, ui::EF_NONE},
2185 ui::VKEY_F6, keycode_f6_, 0, 0 }, 1273 {ui::VKEY_OEM_MINUS, ui::EF_COMMAND_DOWN, ui::VKEY_F11, ui::EF_NONE},
2186 { ui::VKEY_7, keycode_7_, Mod4Mask, 0, 1274 {ui::VKEY_OEM_PLUS, ui::EF_COMMAND_DOWN, ui::VKEY_F12, ui::EF_NONE},
2187 ui::VKEY_F7, keycode_f7_, 0, 0 },
2188 { ui::VKEY_8, keycode_8_, Mod4Mask, 0,
2189 ui::VKEY_F8, keycode_f8_, 0, 0 },
2190 { ui::VKEY_9, keycode_9_, Mod4Mask, 0,
2191 ui::VKEY_F9, keycode_f9_, 0, 0 },
2192 { ui::VKEY_0, keycode_0_, Mod4Mask, 0,
2193 ui::VKEY_F10, keycode_f10_, 0, 0 },
2194 { ui::VKEY_OEM_MINUS, keycode_minus_, Mod4Mask, 0,
2195 ui::VKEY_F11, keycode_f11_, 0, 0 },
2196 { ui::VKEY_OEM_PLUS, keycode_equal_, Mod4Mask, 0,
2197 ui::VKEY_F12, keycode_f12_, 0, 0 },
2198 1275
2199 // The function keys should not be rewritten with Search key pressed. 1276 // The function keys should not be rewritten with Search key pressed.
2200 { ui::VKEY_F1, keycode_f1_, Mod4Mask, 0, 1277 {ui::VKEY_F1, ui::EF_COMMAND_DOWN, ui::VKEY_F1, ui::EF_NONE},
2201 ui::VKEY_F1, keycode_f1_, 0, 0 }, 1278 {ui::VKEY_F2, ui::EF_COMMAND_DOWN, ui::VKEY_F2, ui::EF_NONE},
2202 { ui::VKEY_F2, keycode_f2_, Mod4Mask, 0, 1279 {ui::VKEY_F3, ui::EF_COMMAND_DOWN, ui::VKEY_F3, ui::EF_NONE},
2203 ui::VKEY_F2, keycode_f2_, 0, 0 }, 1280 {ui::VKEY_F4, ui::EF_COMMAND_DOWN, ui::VKEY_F4, ui::EF_NONE},
2204 { ui::VKEY_F3, keycode_f3_, Mod4Mask, 0, 1281 {ui::VKEY_F5, ui::EF_COMMAND_DOWN, ui::VKEY_F5, ui::EF_NONE},
2205 ui::VKEY_F3, keycode_f3_, 0, 0 }, 1282 {ui::VKEY_F6, ui::EF_COMMAND_DOWN, ui::VKEY_F6, ui::EF_NONE},
2206 { ui::VKEY_F4, keycode_f4_, Mod4Mask, 0, 1283 {ui::VKEY_F7, ui::EF_COMMAND_DOWN, ui::VKEY_F7, ui::EF_NONE},
2207 ui::VKEY_F4, keycode_f4_, 0, 0 }, 1284 {ui::VKEY_F8, ui::EF_COMMAND_DOWN, ui::VKEY_F8, ui::EF_NONE},
2208 { ui::VKEY_F5, keycode_f5_, Mod4Mask, 0, 1285 {ui::VKEY_F9, ui::EF_COMMAND_DOWN, ui::VKEY_F9, ui::EF_NONE},
2209 ui::VKEY_F5, keycode_f5_, 0, 0 }, 1286 {ui::VKEY_F10, ui::EF_COMMAND_DOWN, ui::VKEY_F10, ui::EF_NONE},
2210 { ui::VKEY_F6, keycode_f6_, Mod4Mask, 0, 1287 {ui::VKEY_F11, ui::EF_COMMAND_DOWN, ui::VKEY_F11, ui::EF_NONE},
2211 ui::VKEY_F6, keycode_f6_, 0, 0 }, 1288 {ui::VKEY_F12, ui::EF_COMMAND_DOWN, ui::VKEY_F12, ui::EF_NONE},
2212 { ui::VKEY_F7, keycode_f7_, Mod4Mask, 0, 1289 };
2213 ui::VKEY_F7, keycode_f7_, 0, 0 },
2214 { ui::VKEY_F8, keycode_f8_, Mod4Mask, 0,
2215 ui::VKEY_F8, keycode_f8_, 0, 0 },
2216 { ui::VKEY_F9, keycode_f9_, Mod4Mask, 0,
2217 ui::VKEY_F9, keycode_f9_, 0, 0 },
2218 { ui::VKEY_F10, keycode_f10_, Mod4Mask, 0,
2219 ui::VKEY_F10, keycode_f10_, 0, 0 },
2220 { ui::VKEY_F11, keycode_f11_, Mod4Mask, 0,
2221 ui::VKEY_F11, keycode_f11_, 0, 0 },
2222 { ui::VKEY_F12, keycode_f12_, Mod4Mask, 0,
2223 ui::VKEY_F12, keycode_f12_, 0, 0 },
2224 };
2225 1290
2226 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 1291 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
2227 // XKeysymToKeycode returns zero for unknown keys. So ignore those. 1292 EXPECT_EQ(GetExpectedResultNumbered(
2228 if (tests[i].output_native == 0) 1293 i, tests[i].output, tests[i].output_mods, ui::ET_KEY_PRESSED),
2229 continue; 1294 GetRewrittenEventNumbered(i,
2230 EXPECT_EQ(GetExpectedResultAsString(tests[i].output, 1295 &rewriter,
2231 tests[i].output_mods,
2232 ui::ET_KEY_PRESSED,
2233 tests[i].output_native,
2234 tests[i].output_native_mods,
2235 KeyPress),
2236 GetRewrittenEventAsString(&rewriter,
2237 tests[i].input, 1296 tests[i].input,
2238 tests[i].input_mods, 1297 tests[i].input_mods,
2239 ui::ET_KEY_PRESSED, 1298 ui::ET_KEY_PRESSED));
2240 tests[i].input_native,
2241 tests[i].input_native_mods));
2242 } 1299 }
2243 } 1300 }
2244 1301
2245 TEST_F(EventRewriterTest, TestRewriteExtendedKeysWithSearchRemapped) { 1302 TEST_F(EventRewriterTest, TestRewriteExtendedKeysWithSearchRemapped) {
2246 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); 1303 const CommandLine original_cl(*CommandLine::ForCurrentProcess());
2247 1304
2248 // Remap Search to Control. 1305 // Remap Search to Control.
2249 TestingPrefServiceSyncable prefs; 1306 TestingPrefServiceSyncable prefs;
2250 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1307 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
2251 IntegerPrefMember search; 1308 IntegerPrefMember search;
2252 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); 1309 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs);
2253 search.SetValue(chromeos::input_method::kControlKey); 1310 search.SetValue(chromeos::input_method::kControlKey);
2254 1311
2255 EventRewriter rewriter; 1312 EventRewriter rewriter;
2256 rewriter.set_pref_service_for_testing(&prefs); 1313 rewriter.set_pref_service_for_testing(&prefs);
2257 1314
2258 CommandLine::ForCurrentProcess()->AppendSwitchASCII( 1315 CommandLine::ForCurrentProcess()->AppendSwitchASCII(
2259 chromeos::switches::kHasChromeOSKeyboard, ""); 1316 chromeos::switches::kHasChromeOSKeyboard, "");
2260 1317
2261 // Alt+Search+Down -> End 1318 // Alt+Search+Down -> End
2262 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_END, 1319 EXPECT_EQ(
2263 0, 1320 GetExpectedResultAsString(ui::VKEY_END, ui::EF_NONE, ui::ET_KEY_PRESSED),
2264 ui::ET_KEY_PRESSED, 1321 GetRewrittenEventAsString(&rewriter,
2265 keycode_end_, 1322 ui::VKEY_DOWN,
2266 0U, 1323 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
2267 KeyPress), 1324 ui::ET_KEY_PRESSED));
2268 GetRewrittenEventAsString(&rewriter,
2269 ui::VKEY_DOWN,
2270 ui::EF_ALT_DOWN,
2271 ui::ET_KEY_PRESSED,
2272 keycode_down_,
2273 Mod1Mask | Mod4Mask));
2274 1325
2275 // Shift+Alt+Search+Down -> Shift+End 1326 // Shift+Alt+Search+Down -> Shift+End
2276 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_END, 1327 EXPECT_EQ(GetExpectedResultAsString(
2277 ui::EF_SHIFT_DOWN, 1328 ui::VKEY_END, ui::EF_SHIFT_DOWN, ui::ET_KEY_PRESSED),
2278 ui::ET_KEY_PRESSED, 1329 GetRewrittenEventAsString(
2279 keycode_end_, 1330 &rewriter,
2280 ShiftMask, 1331 ui::VKEY_DOWN,
2281 KeyPress), 1332 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
2282 GetRewrittenEventAsString(&rewriter, 1333 ui::ET_KEY_PRESSED));
2283 ui::VKEY_DOWN,
2284 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
2285 ui::ET_KEY_PRESSED,
2286 keycode_down_,
2287 ShiftMask | Mod1Mask | Mod4Mask));
2288 1334
2289 *CommandLine::ForCurrentProcess() = original_cl; 1335 *CommandLine::ForCurrentProcess() = original_cl;
2290 } 1336 }
2291 1337
2292 TEST_F(EventRewriterTest, TestRewriteKeyEventSentByXSendEvent) { 1338 TEST_F(EventRewriterTest, TestRewriteKeyEventSentByXSendEvent) {
2293 // Remap Control to Alt. 1339 // Remap Control to Alt.
2294 TestingPrefServiceSyncable prefs; 1340 TestingPrefServiceSyncable prefs;
2295 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1341 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
2296 IntegerPrefMember control; 1342 IntegerPrefMember control;
2297 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); 1343 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs);
2298 control.SetValue(chromeos::input_method::kAltKey); 1344 control.SetValue(chromeos::input_method::kAltKey);
2299 1345
2300 EventRewriter rewriter; 1346 EventRewriter rewriter;
2301 rewriter.set_pref_service_for_testing(&prefs); 1347 rewriter.set_pref_service_for_testing(&prefs);
2302 1348
2303 // Send left control press. 1349 // Send left control press.
2304 std::string rewritten_event; 1350 std::string rewritten_event;
2305 { 1351 {
2306 ui::ScopedXI2Event xev; 1352 ui::ScopedXI2Event xev;
2307 xev.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 0); 1353 xev.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 0);
2308 XEvent* xevent = xev; 1354 XEvent* xevent = xev;
2309 xevent->xkey.keycode = keycode_control_l_; 1355 xevent->xkey.keycode = XKeysymToKeycode(gfx::GetXDisplay(), XK_Control_L);
2310 xevent->xkey.send_event = True; // XSendEvent() always does this. 1356 xevent->xkey.send_event = True; // XSendEvent() always does this.
2311 rewriter.RewriteForTesting(xevent);
2312 ui::KeyEvent keyevent(xev, false /* is_char */); 1357 ui::KeyEvent keyevent(xev, false /* is_char */);
2313 rewritten_event = base::StringPrintf( 1358 scoped_ptr<ui::Event> new_event;
2314 "ui_keycode=%d ui_flags=%d ui_type=%d " 1359 // Control should NOT be remapped to Alt if send_event
2315 "x_keycode=%u x_state=%u x_type=%d", 1360 // flag in the event is True.
2316 keyevent.key_code(), keyevent.flags(), keyevent.type(), 1361 EXPECT_EQ(ui::EVENT_REWRITE_CONTINUE,
2317 xevent->xkey.keycode, xevent->xkey.state, xevent->xkey.type); 1362 rewriter.RewriteEvent(keyevent, &new_event));
1363 EXPECT_FALSE(new_event);
2318 } 1364 }
1365 }
2319 1366
2320 // XK_Control_L (left Control key) should NOT be remapped to Alt if send_event 1367 TEST_F(EventRewriterTest, TestRewriteNonNativeEvent) {
2321 // flag in the event is True. 1368 // Remap Control to Alt.
2322 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, 1369 TestingPrefServiceSyncable prefs;
2323 ui::EF_CONTROL_DOWN, 1370 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
2324 ui::ET_KEY_PRESSED, 1371 IntegerPrefMember control;
2325 keycode_control_l_, 1372 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs);
2326 0U, 1373 control.SetValue(chromeos::input_method::kAltKey);
2327 KeyPress), 1374
2328 rewritten_event); 1375 EventRewriter rewriter;
1376 rewriter.set_pref_service_for_testing(&prefs);
1377
1378 const int kTouchId = 2;
1379 gfx::Point location(0, 0);
1380 ui::TouchEvent press(
1381 ui::ET_TOUCH_PRESSED, location, kTouchId, base::TimeDelta());
1382 press.set_flags(ui::EF_CONTROL_DOWN);
1383
1384 scoped_ptr<ui::Event> new_event;
1385 rewriter.RewriteEvent(press, &new_event);
1386 EXPECT_TRUE(new_event);
1387 // Control should be remapped to Alt.
1388 EXPECT_EQ(ui::EF_ALT_DOWN,
1389 new_event->flags() & (ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN));
2329 } 1390 }
2330 1391
2331 // Tests of event rewriting that depend on the Ash window manager. 1392 // Tests of event rewriting that depend on the Ash window manager.
2332 class EventRewriterAshTest : public ash::test::AshTestBase { 1393 class EventRewriterAshTest : public ash::test::AshTestBase {
2333 public: 1394 public:
2334 EventRewriterAshTest() { 1395 EventRewriterAshTest()
2335 } 1396 : mock_user_manager_(new chromeos::MockUserManager),
1397 user_manager_enabler_(mock_user_manager_) {}
2336 virtual ~EventRewriterAshTest() {} 1398 virtual ~EventRewriterAshTest() {}
2337 1399
2338 bool RewriteFunctionKeys(XEvent* event) { 1400 bool RewriteFunctionKeys(const ui::Event& event,
2339 return rewriter_->RewriteFunctionKeys(event); 1401 scoped_ptr<ui::Event>* rewritten_event) {
1402 return rewriter_->RewriteEvent(event, rewritten_event);
2340 } 1403 }
2341 1404
2342 protected: 1405 protected:
2343 virtual void SetUp() OVERRIDE { 1406 virtual void SetUp() OVERRIDE {
2344 AshTestBase::SetUp(); 1407 AshTestBase::SetUp();
2345 rewriter_.reset(new EventRewriter()); 1408 rewriter_.reset(new EventRewriter());
2346 chromeos::Preferences::RegisterProfilePrefs(prefs_.registry()); 1409 chromeos::Preferences::RegisterProfilePrefs(prefs_.registry());
2347 rewriter_->set_pref_service_for_testing(&prefs_); 1410 rewriter_->set_pref_service_for_testing(&prefs_);
2348 } 1411 }
2349 1412
2350 virtual void TearDown() OVERRIDE { 1413 virtual void TearDown() OVERRIDE {
2351 rewriter_.reset(); 1414 rewriter_.reset();
2352 AshTestBase::TearDown(); 1415 AshTestBase::TearDown();
2353 } 1416 }
2354 1417
2355 TestingPrefServiceSyncable prefs_; 1418 TestingPrefServiceSyncable prefs_;
2356 1419
2357 private: 1420 private:
2358 scoped_ptr<EventRewriter> rewriter_; 1421 scoped_ptr<EventRewriter> rewriter_;
2359 1422
1423 chromeos::MockUserManager* mock_user_manager_; // Not owned.
1424 chromeos::ScopedUserManagerEnabler user_manager_enabler_;
1425
2360 DISALLOW_COPY_AND_ASSIGN(EventRewriterAshTest); 1426 DISALLOW_COPY_AND_ASSIGN(EventRewriterAshTest);
2361 }; 1427 };
2362 1428
2363 TEST_F(EventRewriterAshTest, TopRowKeysAreFunctionKeys) { 1429 TEST_F(EventRewriterAshTest, TopRowKeysAreFunctionKeys) {
2364 scoped_ptr<aura::Window> window(CreateTestWindowInShellWithId(1)); 1430 scoped_ptr<aura::Window> window(CreateTestWindowInShellWithId(1));
2365 ash::wm::WindowState* window_state = ash::wm::GetWindowState(window.get()); 1431 ash::wm::WindowState* window_state = ash::wm::GetWindowState(window.get());
2366 window_state->Activate(); 1432 window_state->Activate();
2367 1433
2368 // Create a simulated keypress of F1 targetted at the window. 1434 // Create a simulated keypress of F1 targetted at the window.
2369 ui::ScopedXI2Event xev_f1; 1435 ui::KeyEvent press_f1(ui::ET_KEY_PRESSED, ui::VKEY_F1, 0, false);
2370 KeyCode keycode_f1 = XKeysymToKeycode(gfx::GetXDisplay(), XK_F1);
2371 xev_f1.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_F1, 0);
2372 XEvent* xevent = xev_f1;
2373 xevent->xkey.keycode = keycode_f1;
2374 1436
2375 // Simulate an apps v2 window that has requested top row keys as function 1437 // Simulate an apps v2 window that has requested top row keys as function
2376 // keys. The event should not be rewritten. 1438 // keys. The event should not be rewritten.
2377 window_state->set_top_row_keys_are_function_keys(true); 1439 window_state->set_top_row_keys_are_function_keys(true);
2378 ASSERT_FALSE(RewriteFunctionKeys(xevent)); 1440 scoped_ptr<ui::Event> rewritten_event;
2379 ui::KeyEvent press_f1(xev_f1, false); 1441 ASSERT_FALSE(RewriteFunctionKeys(press_f1, &rewritten_event));
2380 ASSERT_EQ(ui::VKEY_F1, press_f1.key_code()); 1442 ASSERT_FALSE(rewritten_event);
1443 EXPECT_EQ(
1444 GetExpectedResultAsString(ui::VKEY_F1, ui::EF_NONE, ui::ET_KEY_PRESSED),
1445 GetKeyEventAsString(press_f1));
2381 1446
2382 // The event should also not be rewritten if the send-function-keys pref is 1447 // The event should also not be rewritten if the send-function-keys pref is
2383 // additionally set, for both apps v2 and regular windows. 1448 // additionally set, for both apps v2 and regular windows.
2384 BooleanPrefMember send_function_keys_pref; 1449 BooleanPrefMember send_function_keys_pref;
2385 send_function_keys_pref.Init(prefs::kLanguageSendFunctionKeys, &prefs_); 1450 send_function_keys_pref.Init(prefs::kLanguageSendFunctionKeys, &prefs_);
2386 send_function_keys_pref.SetValue(true); 1451 send_function_keys_pref.SetValue(true);
2387 ASSERT_FALSE(RewriteFunctionKeys(xevent));
2388 press_f1 = ui::KeyEvent(xev_f1, false);
2389 ASSERT_EQ(ui::VKEY_F1, press_f1.key_code());
2390 window_state->set_top_row_keys_are_function_keys(false); 1452 window_state->set_top_row_keys_are_function_keys(false);
2391 ASSERT_FALSE(RewriteFunctionKeys(xevent)); 1453 ASSERT_FALSE(RewriteFunctionKeys(press_f1, &rewritten_event));
2392 press_f1 = ui::KeyEvent(xev_f1, false); 1454 ASSERT_FALSE(rewritten_event);
2393 ASSERT_EQ(ui::VKEY_F1, press_f1.key_code()); 1455 EXPECT_EQ(
1456 GetExpectedResultAsString(ui::VKEY_F1, ui::EF_NONE, ui::ET_KEY_PRESSED),
1457 GetKeyEventAsString(press_f1));
2394 1458
2395 // If the pref isn't set when an event is sent to a regular window, F1 is 1459 // If the pref isn't set when an event is sent to a regular window, F1 is
2396 // rewritten to the back key. 1460 // rewritten to the back key.
2397 send_function_keys_pref.SetValue(false); 1461 send_function_keys_pref.SetValue(false);
2398 ASSERT_TRUE(RewriteFunctionKeys(xevent)); 1462 ASSERT_TRUE(RewriteFunctionKeys(press_f1, &rewritten_event));
2399 press_f1 = ui::KeyEvent(xev_f1, false); 1463 ASSERT_TRUE(rewritten_event);
2400 ASSERT_EQ(ui::VKEY_BROWSER_BACK, press_f1.key_code()); 1464 EXPECT_EQ(GetExpectedResultAsString(
1465 ui::VKEY_BROWSER_BACK, ui::EF_NONE, ui::ET_KEY_PRESSED),
1466 GetKeyEventAsString(
1467 *static_cast<const ui::KeyEvent*>(rewritten_event.get())));
2401 } 1468 }
2402 1469
2403 TEST_F(EventRewriterTest, DontRewriteIfNotRewritten) { 1470 TEST_F(EventRewriterTest, DontRewriteIfNotRewritten) {
2404 std::vector<unsigned int> device_list; 1471 std::vector<unsigned int> device_list;
2405 device_list.push_back(10); 1472 device_list.push_back(10);
2406 device_list.push_back(11); 1473 device_list.push_back(11);
2407 ui::TouchFactory::GetInstance()->SetPointerDeviceForTest(device_list); 1474 ui::TouchFactory::GetInstance()->SetPointerDeviceForTest(device_list);
2408 TestingPrefServiceSyncable prefs; 1475 TestingPrefServiceSyncable prefs;
2409 EventRewriter rewriter; 1476 EventRewriter rewriter;
2410 rewriter.set_pref_service_for_testing(&prefs); 1477 rewriter.set_pref_service_for_testing(&prefs);
2411 const int kLeftAndAltFlag = ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN; 1478 const int kLeftAndAltFlag = ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN;
2412 { 1479 {
2413 ui::ScopedXI2Event xev; 1480 ui::ScopedXI2Event xev;
2414 xev.InitGenericButtonEvent( 1481 xev.InitGenericButtonEvent(
2415 10, ui::ET_MOUSE_PRESSED, gfx::Point(), kLeftAndAltFlag); 1482 10, ui::ET_MOUSE_PRESSED, gfx::Point(), kLeftAndAltFlag);
2416 ui::MouseEvent press(xev); 1483 ui::MouseEvent press(xev);
2417 // Sanity check. 1484 // Sanity check.
2418 EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type()); 1485 EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type());
2419 EXPECT_EQ(kLeftAndAltFlag, press.flags()); 1486 EXPECT_EQ(kLeftAndAltFlag, press.flags());
2420 1487 int flags = RewriteMouseEvent(&rewriter, press);
2421 RewriteMouseEvent(&rewriter, &press); 1488 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & flags);
2422
2423 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & press.flags());
2424 } 1489 }
2425 { 1490 {
2426 ui::ScopedXI2Event xev; 1491 ui::ScopedXI2Event xev;
2427 xev.InitGenericButtonEvent( 1492 xev.InitGenericButtonEvent(
2428 10, ui::ET_MOUSE_RELEASED, gfx::Point(), kLeftAndAltFlag); 1493 10, ui::ET_MOUSE_RELEASED, gfx::Point(), kLeftAndAltFlag);
2429 ui::MouseEvent release(xev); 1494 ui::MouseEvent release(xev);
2430 RewriteMouseEvent(&rewriter, &release); 1495 int flags = RewriteMouseEvent(&rewriter, release);
2431 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & release.flags()); 1496 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & flags);
2432 } 1497 }
2433 1498
2434 // No ALT in frst click. 1499 // No ALT in frst click.
2435 { 1500 {
2436 ui::ScopedXI2Event xev; 1501 ui::ScopedXI2Event xev;
2437 xev.InitGenericButtonEvent( 1502 xev.InitGenericButtonEvent(
2438 10, ui::ET_MOUSE_PRESSED, gfx::Point(), ui::EF_LEFT_MOUSE_BUTTON); 1503 10, ui::ET_MOUSE_PRESSED, gfx::Point(), ui::EF_LEFT_MOUSE_BUTTON);
2439 ui::MouseEvent press(xev); 1504 ui::MouseEvent press(xev);
2440 RewriteMouseEvent(&rewriter, &press); 1505 int flags = RewriteMouseEvent(&rewriter, press);
2441 EXPECT_TRUE(ui::EF_LEFT_MOUSE_BUTTON & press.flags()); 1506 EXPECT_TRUE(ui::EF_LEFT_MOUSE_BUTTON & flags);
2442 } 1507 }
2443 { 1508 {
2444 ui::ScopedXI2Event xev; 1509 ui::ScopedXI2Event xev;
2445 xev.InitGenericButtonEvent( 1510 xev.InitGenericButtonEvent(
2446 10, ui::ET_MOUSE_RELEASED, gfx::Point(), kLeftAndAltFlag); 1511 10, ui::ET_MOUSE_RELEASED, gfx::Point(), kLeftAndAltFlag);
2447 ui::MouseEvent release(xev); 1512 ui::MouseEvent release(xev);
2448 RewriteMouseEvent(&rewriter, &release); 1513 int flags = RewriteMouseEvent(&rewriter, release);
2449 EXPECT_TRUE((ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN) & 1514 EXPECT_TRUE((ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN) & flags);
2450 release.flags());
2451 } 1515 }
2452 1516
2453 // ALT on different device. 1517 // ALT on different device.
2454 { 1518 {
2455 ui::ScopedXI2Event xev; 1519 ui::ScopedXI2Event xev;
2456 xev.InitGenericButtonEvent( 1520 xev.InitGenericButtonEvent(
2457 11, ui::ET_MOUSE_PRESSED, gfx::Point(), kLeftAndAltFlag); 1521 11, ui::ET_MOUSE_PRESSED, gfx::Point(), kLeftAndAltFlag);
2458 ui::MouseEvent press(xev); 1522 ui::MouseEvent press(xev);
2459 RewriteMouseEvent(&rewriter, &press); 1523 int flags = RewriteMouseEvent(&rewriter, press);
2460 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & press.flags()); 1524 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & flags);
2461 } 1525 }
2462 { 1526 {
2463 ui::ScopedXI2Event xev; 1527 ui::ScopedXI2Event xev;
2464 xev.InitGenericButtonEvent( 1528 xev.InitGenericButtonEvent(
2465 10, ui::ET_MOUSE_RELEASED, gfx::Point(), kLeftAndAltFlag); 1529 10, ui::ET_MOUSE_RELEASED, gfx::Point(), kLeftAndAltFlag);
2466 ui::MouseEvent release(xev); 1530 ui::MouseEvent release(xev);
2467 RewriteMouseEvent(&rewriter, &release); 1531 int flags = RewriteMouseEvent(&rewriter, release);
2468 EXPECT_TRUE((ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN) & 1532 EXPECT_TRUE((ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN) & flags);
2469 release.flags());
2470 } 1533 }
2471 { 1534 {
2472 ui::ScopedXI2Event xev; 1535 ui::ScopedXI2Event xev;
2473 xev.InitGenericButtonEvent( 1536 xev.InitGenericButtonEvent(
2474 11, ui::ET_MOUSE_RELEASED, gfx::Point(), kLeftAndAltFlag); 1537 11, ui::ET_MOUSE_RELEASED, gfx::Point(), kLeftAndAltFlag);
2475 ui::MouseEvent release(xev); 1538 ui::MouseEvent release(xev);
2476 RewriteMouseEvent(&rewriter, &release); 1539 int flags = RewriteMouseEvent(&rewriter, release);
2477 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & release.flags()); 1540 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & flags);
2478 } 1541 }
2479 } 1542 }
2480 1543
2481 } // namespace chromeos 1544 } // namespace chromeos
OLDNEW
« no previous file with comments | « chrome/browser/chromeos/events/event_rewriter.cc ('k') | chrome/chrome_browser_chromeos.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698