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