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

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

Issue 1284433002: Revise ui::DomKey to unify character and non-character codes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: IsDead Created 5 years, 3 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
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 <vector> 7 #include <vector>
8 8
9 #include "ash/shell.h" 9 #include "ash/shell.h"
10 #include "ash/sticky_keys/sticky_keys_controller.h" 10 #include "ash/sticky_keys/sticky_keys_controller.h"
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
50 // The device id of the test touchpad device. 50 // The device id of the test touchpad device.
51 #if defined(USE_X11) 51 #if defined(USE_X11)
52 const int kTouchPadDeviceId = 1; 52 const int kTouchPadDeviceId = 1;
53 #endif 53 #endif
54 const int kKeyboardDeviceId = 2; 54 const int kKeyboardDeviceId = 2;
55 55
56 std::string GetExpectedResultAsString(ui::EventType ui_type, 56 std::string GetExpectedResultAsString(ui::EventType ui_type,
57 ui::KeyboardCode ui_keycode, 57 ui::KeyboardCode ui_keycode,
58 ui::DomCode code, 58 ui::DomCode code,
59 int ui_flags, // ui::EventFlags 59 int ui_flags, // ui::EventFlags
60 ui::DomKey key, 60 ui::DomKey key) {
61 base::char16 character) {
62 return base::StringPrintf( 61 return base::StringPrintf(
63 "type=%d code=0x%06X flags=0x%X vk=0x%02X key=0x%03X c=0x%02X", ui_type, 62 "type=%d code=0x%06X flags=0x%X vk=0x%02X key=0x%08X", ui_type,
64 static_cast<unsigned int>(code), ui_flags & ~ui::EF_IS_REPEAT, ui_keycode, 63 static_cast<unsigned int>(code), ui_flags & ~ui::EF_IS_REPEAT, ui_keycode,
65 static_cast<unsigned int>(key), character); 64 static_cast<unsigned int>(key));
66 } 65 }
67 66
68 std::string GetKeyEventAsString(const ui::KeyEvent& keyevent) { 67 std::string GetKeyEventAsString(const ui::KeyEvent& keyevent) {
69 return GetExpectedResultAsString( 68 return GetExpectedResultAsString(keyevent.type(), keyevent.key_code(),
70 keyevent.type(), keyevent.key_code(), keyevent.code(), keyevent.flags(), 69 keyevent.code(), keyevent.flags(),
71 keyevent.GetDomKey(), keyevent.GetCharacter()); 70 keyevent.GetDomKey());
72 } 71 }
73 72
74 std::string GetRewrittenEventAsString(chromeos::EventRewriter* rewriter, 73 std::string GetRewrittenEventAsString(chromeos::EventRewriter* rewriter,
75 ui::EventType ui_type, 74 ui::EventType ui_type,
76 ui::KeyboardCode ui_keycode, 75 ui::KeyboardCode ui_keycode,
77 ui::DomCode code, 76 ui::DomCode code,
78 int ui_flags, // ui::EventFlags 77 int ui_flags, // ui::EventFlags
79 ui::DomKey key, 78 ui::DomKey key) {
80 base::char16 character) { 79 const ui::KeyEvent event(ui_type, ui_keycode, code, ui_flags, key,
81 const ui::KeyEvent event(ui_type, ui_keycode, code, ui_flags, key, character,
82 ui::EventTimeForNow()); 80 ui::EventTimeForNow());
83 scoped_ptr<ui::Event> new_event; 81 scoped_ptr<ui::Event> new_event;
84 rewriter->RewriteEvent(event, &new_event); 82 rewriter->RewriteEvent(event, &new_event);
85 if (new_event) 83 if (new_event)
86 return GetKeyEventAsString( 84 return GetKeyEventAsString(
87 static_cast<const ui::KeyEvent&>(*new_event.get())); 85 static_cast<const ui::KeyEvent&>(*new_event.get()));
88 return GetKeyEventAsString(event); 86 return GetKeyEventAsString(event);
89 } 87 }
90 88
91 // Table entry for simple single key event rewriting tests. 89 // Table entry for simple single key event rewriting tests.
92 struct KeyTestCase { 90 struct KeyTestCase {
93 ui::EventType type; 91 ui::EventType type;
94 struct Event { 92 struct Event {
95 ui::KeyboardCode key_code; 93 ui::KeyboardCode key_code;
96 ui::DomCode code; 94 ui::DomCode code;
97 int flags; // ui::EventFlags 95 int flags; // ui::EventFlags
98 ui::DomKey key; 96 ui::DomKey::Base key;
99 base::char16 character;
100 } input, expected; 97 } input, expected;
101 }; 98 };
102 99
103 std::string GetTestCaseAsString(ui::EventType ui_type, 100 std::string GetTestCaseAsString(ui::EventType ui_type,
104 const KeyTestCase::Event& test) { 101 const KeyTestCase::Event& test) {
105 return GetExpectedResultAsString(ui_type, test.key_code, test.code, 102 return GetExpectedResultAsString(ui_type, test.key_code, test.code,
106 test.flags, test.key, test.character); 103 test.flags, test.key);
107 } 104 }
108 105
109 // Tests a single stateless key rewrite operation. 106 // Tests a single stateless key rewrite operation.
110 void CheckKeyTestCase(chromeos::EventRewriter* rewriter, 107 void CheckKeyTestCase(chromeos::EventRewriter* rewriter,
111 const KeyTestCase& test) { 108 const KeyTestCase& test) {
112 SCOPED_TRACE("\nSource: " + GetTestCaseAsString(test.type, test.input)); 109 SCOPED_TRACE("\nSource: " + GetTestCaseAsString(test.type, test.input));
113 std::string expected = GetTestCaseAsString(test.type, test.expected); 110 std::string expected = GetTestCaseAsString(test.type, test.expected);
114 EXPECT_EQ(expected, 111 EXPECT_EQ(expected, GetRewrittenEventAsString(
115 GetRewrittenEventAsString(rewriter, test.type, test.input.key_code, 112 rewriter, test.type, test.input.key_code,
116 test.input.code, test.input.flags, 113 test.input.code, test.input.flags, test.input.key));
117 test.input.key, test.input.character));
118 } 114 }
119 115
120 } // namespace 116 } // namespace
121 117
122 namespace chromeos { 118 namespace chromeos {
123 119
124 class EventRewriterTest : public ash::test::AshTestBase { 120 class EventRewriterTest : public ash::test::AshTestBase {
125 public: 121 public:
126 EventRewriterTest() 122 EventRewriterTest()
127 : fake_user_manager_(new user_manager::FakeUserManager), 123 : fake_user_manager_(new user_manager::FakeUserManager),
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
166 // First, test with a PC keyboard. 162 // First, test with a PC keyboard.
167 TestingPrefServiceSyncable prefs; 163 TestingPrefServiceSyncable prefs;
168 EventRewriter rewriter(NULL); 164 EventRewriter rewriter(NULL);
169 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard"); 165 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
170 rewriter.set_last_keyboard_device_id_for_testing(kKeyboardDeviceId); 166 rewriter.set_last_keyboard_device_id_for_testing(kKeyboardDeviceId);
171 rewriter.set_pref_service_for_testing(&prefs); 167 rewriter.set_pref_service_for_testing(&prefs);
172 168
173 KeyTestCase pc_keyboard_tests[] = { 169 KeyTestCase pc_keyboard_tests[] = {
174 // VKEY_A, Alt modifier. 170 // VKEY_A, Alt modifier.
175 {ui::ET_KEY_PRESSED, 171 {ui::ET_KEY_PRESSED,
176 {ui::VKEY_A, 172 {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_ALT_DOWN,
177 ui::DomCode::KEY_A, 173 ui::DomKey::UNIDENTIFIED},
178 ui::EF_ALT_DOWN, 174 {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_ALT_DOWN,
179 ui::DomKey::UNIDENTIFIED, 175 ui::DomKey::UNIDENTIFIED}},
180 0},
181 {ui::VKEY_A,
182 ui::DomCode::KEY_A,
183 ui::EF_ALT_DOWN,
184 ui::DomKey::UNIDENTIFIED,
185 0}},
186 176
187 // VKEY_A, Win modifier. 177 // VKEY_A, Win modifier.
188 {ui::ET_KEY_PRESSED, 178 {ui::ET_KEY_PRESSED,
189 {ui::VKEY_A, 179 {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_COMMAND_DOWN,
190 ui::DomCode::KEY_A, 180 ui::DomKey::UNIDENTIFIED},
191 ui::EF_COMMAND_DOWN, 181 {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_COMMAND_DOWN,
192 ui::DomKey::UNIDENTIFIED, 182 ui::DomKey::UNIDENTIFIED}},
193 0},
194 {ui::VKEY_A,
195 ui::DomCode::KEY_A,
196 ui::EF_COMMAND_DOWN,
197 ui::DomKey::UNIDENTIFIED,
198 0}},
199 183
200 // VKEY_A, Alt+Win modifier. 184 // VKEY_A, Alt+Win modifier.
201 {ui::ET_KEY_PRESSED, 185 {ui::ET_KEY_PRESSED,
202 {ui::VKEY_A, 186 {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
203 ui::DomCode::KEY_A, 187 ui::DomKey::UNIDENTIFIED},
204 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, 188 {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
205 ui::DomKey::UNIDENTIFIED, 189 ui::DomKey::UNIDENTIFIED}},
206 0},
207 {ui::VKEY_A,
208 ui::DomCode::KEY_A,
209 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
210 ui::DomKey::UNIDENTIFIED,
211 0}},
212 190
213 // VKEY_LWIN (left Windows key), Alt modifier. 191 // VKEY_LWIN (left Windows key), Alt modifier.
214 {ui::ET_KEY_PRESSED, 192 {ui::ET_KEY_PRESSED,
215 {ui::VKEY_LWIN, 193 {ui::VKEY_LWIN, ui::DomCode::OS_LEFT,
216 ui::DomCode::OS_LEFT, 194 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, ui::DomKey::OS},
217 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, 195 {ui::VKEY_LWIN, ui::DomCode::OS_LEFT,
218 ui::DomKey::OS, 196 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, ui::DomKey::OS}},
219 0},
220 {ui::VKEY_LWIN,
221 ui::DomCode::OS_LEFT,
222 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
223 ui::DomKey::OS,
224 0}},
225 197
226 // VKEY_RWIN (right Windows key), Alt modifier. 198 // VKEY_RWIN (right Windows key), Alt modifier.
227 {ui::ET_KEY_PRESSED, 199 {ui::ET_KEY_PRESSED,
228 {ui::VKEY_RWIN, 200 {ui::VKEY_RWIN, ui::DomCode::OS_RIGHT,
229 ui::DomCode::OS_RIGHT, 201 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, ui::DomKey::OS},
230 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, 202 {ui::VKEY_RWIN, ui::DomCode::OS_RIGHT,
231 ui::DomKey::OS, 203 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, ui::DomKey::OS}},
232 0},
233 {ui::VKEY_RWIN,
234 ui::DomCode::OS_RIGHT,
235 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
236 ui::DomKey::OS,
237 0}},
238 }; 204 };
239 205
240 for (const auto& test : pc_keyboard_tests) { 206 for (const auto& test : pc_keyboard_tests) {
241 CheckKeyTestCase(&rewriter, test); 207 CheckKeyTestCase(&rewriter, test);
242 } 208 }
243 209
244 // An Apple keyboard reusing the ID, zero. 210 // An Apple keyboard reusing the ID, zero.
245 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "Apple Keyboard"); 211 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "Apple Keyboard");
246 rewriter.set_last_keyboard_device_id_for_testing(kKeyboardDeviceId); 212 rewriter.set_last_keyboard_device_id_for_testing(kKeyboardDeviceId);
247 213
248 KeyTestCase apple_keyboard_tests[] = { 214 KeyTestCase apple_keyboard_tests[] = {
249 // VKEY_A, Alt modifier. 215 // VKEY_A, Alt modifier.
250 {ui::ET_KEY_PRESSED, 216 {ui::ET_KEY_PRESSED,
251 {ui::VKEY_A, 217 {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_ALT_DOWN,
252 ui::DomCode::KEY_A, 218 ui::DomKey::UNIDENTIFIED},
253 ui::EF_ALT_DOWN, 219 {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_ALT_DOWN,
254 ui::DomKey::UNIDENTIFIED, 220 ui::DomKey::UNIDENTIFIED}},
255 0},
256 {ui::VKEY_A,
257 ui::DomCode::KEY_A,
258 ui::EF_ALT_DOWN,
259 ui::DomKey::UNIDENTIFIED,
260 0}},
261 221
262 // VKEY_A, Win modifier. 222 // VKEY_A, Win modifier.
263 {ui::ET_KEY_PRESSED, 223 {ui::ET_KEY_PRESSED,
264 {ui::VKEY_A, 224 {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_COMMAND_DOWN,
265 ui::DomCode::KEY_A, 225 ui::DomKey::UNIDENTIFIED},
266 ui::EF_COMMAND_DOWN, 226 {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_CONTROL_DOWN,
267 ui::DomKey::UNIDENTIFIED, 227 ui::DomKey::Constant<0x01>::Character}},
268 0},
269 {ui::VKEY_A,
270 ui::DomCode::KEY_A,
271 ui::EF_CONTROL_DOWN,
272 ui::DomKey::CHARACTER,
273 0x01}},
274 228
275 // VKEY_A, Alt+Win modifier. 229 // VKEY_A, Alt+Win modifier.
276 {ui::ET_KEY_PRESSED, 230 {ui::ET_KEY_PRESSED,
277 {ui::VKEY_A, 231 {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
278 ui::DomCode::KEY_A, 232 ui::DomKey::UNIDENTIFIED},
279 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, 233 {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
280 ui::DomKey::UNIDENTIFIED, 234 ui::DomKey::Constant<0x01>::Character}},
281 0},
282 {ui::VKEY_A,
283 ui::DomCode::KEY_A,
284 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
285 ui::DomKey::CHARACTER,
286 0x01}},
287 235
288 // VKEY_LWIN (left Windows key), Alt modifier. 236 // VKEY_LWIN (left Windows key), Alt modifier.
289 {ui::ET_KEY_PRESSED, 237 {ui::ET_KEY_PRESSED,
290 {ui::VKEY_LWIN, 238 {ui::VKEY_LWIN, ui::DomCode::OS_LEFT,
291 ui::DomCode::OS_LEFT, 239 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::OS},
292 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, 240 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
293 ui::DomKey::OS, 241 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::CONTROL}},
294 0},
295 {ui::VKEY_CONTROL,
296 ui::DomCode::CONTROL_LEFT,
297 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
298 ui::DomKey::CONTROL,
299 0}},
300 242
301 // VKEY_RWIN (right Windows key), Alt modifier. 243 // VKEY_RWIN (right Windows key), Alt modifier.
302 {ui::ET_KEY_PRESSED, 244 {ui::ET_KEY_PRESSED,
303 {ui::VKEY_RWIN, 245 {ui::VKEY_RWIN, ui::DomCode::OS_RIGHT,
304 ui::DomCode::OS_RIGHT, 246 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::OS},
305 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, 247 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_RIGHT,
306 ui::DomKey::OS, 248 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::CONTROL}},
307 0},
308 {ui::VKEY_CONTROL,
309 ui::DomCode::CONTROL_RIGHT,
310 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
311 ui::DomKey::CONTROL,
312 0}},
313 }; 249 };
314 250
315 for (const auto& test : apple_keyboard_tests) { 251 for (const auto& test : apple_keyboard_tests) {
316 CheckKeyTestCase(&rewriter, test); 252 CheckKeyTestCase(&rewriter, test);
317 } 253 }
318 } 254 }
319 255
320 // For crbug.com/133896. 256 // For crbug.com/133896.
321 TEST_F(EventRewriterTest, TestRewriteCommandToControlWithControlRemapped) { 257 TEST_F(EventRewriterTest, TestRewriteCommandToControlWithControlRemapped) {
322 // Remap Control to Alt. 258 // Remap Control to Alt.
323 TestingPrefServiceSyncable prefs; 259 TestingPrefServiceSyncable prefs;
324 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 260 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
325 IntegerPrefMember control; 261 IntegerPrefMember control;
326 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); 262 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs);
327 control.SetValue(chromeos::input_method::kAltKey); 263 control.SetValue(chromeos::input_method::kAltKey);
328 264
329 EventRewriter rewriter(NULL); 265 EventRewriter rewriter(NULL);
330 rewriter.set_pref_service_for_testing(&prefs); 266 rewriter.set_pref_service_for_testing(&prefs);
331 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard"); 267 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
332 rewriter.set_last_keyboard_device_id_for_testing(kKeyboardDeviceId); 268 rewriter.set_last_keyboard_device_id_for_testing(kKeyboardDeviceId);
333 269
334 KeyTestCase pc_keyboard_tests[] = { 270 KeyTestCase pc_keyboard_tests[] = {
335 // Control should be remapped to Alt. 271 // Control should be remapped to Alt.
336 {ui::ET_KEY_PRESSED, 272 {ui::ET_KEY_PRESSED,
337 {ui::VKEY_CONTROL, 273 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
338 ui::DomCode::CONTROL_LEFT, 274 ui::DomKey::CONTROL},
339 ui::EF_CONTROL_DOWN, 275 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN,
340 ui::DomKey::CONTROL, 276 ui::DomKey::ALT}},
341 0},
342 {ui::VKEY_MENU,
343 ui::DomCode::ALT_LEFT,
344 ui::EF_ALT_DOWN,
345 ui::DomKey::ALT,
346 0}},
347 }; 277 };
348 278
349 for (const auto& test : pc_keyboard_tests) { 279 for (const auto& test : pc_keyboard_tests) {
350 CheckKeyTestCase(&rewriter, test); 280 CheckKeyTestCase(&rewriter, test);
351 } 281 }
352 282
353 // An Apple keyboard reusing the ID, zero. 283 // An Apple keyboard reusing the ID, zero.
354 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "Apple Keyboard"); 284 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "Apple Keyboard");
355 rewriter.set_last_keyboard_device_id_for_testing(kKeyboardDeviceId); 285 rewriter.set_last_keyboard_device_id_for_testing(kKeyboardDeviceId);
356 286
357 KeyTestCase apple_keyboard_tests[] = { 287 KeyTestCase apple_keyboard_tests[] = {
358 // VKEY_LWIN (left Command key) with Alt modifier. The remapped Command 288 // VKEY_LWIN (left Command key) with Alt modifier. The remapped Command
359 // key should never be re-remapped to Alt. 289 // key should never be re-remapped to Alt.
360 {ui::ET_KEY_PRESSED, 290 {ui::ET_KEY_PRESSED,
361 {ui::VKEY_LWIN, 291 {ui::VKEY_LWIN, ui::DomCode::OS_LEFT,
362 ui::DomCode::OS_LEFT, 292 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::OS},
363 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, 293 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
364 ui::DomKey::OS, 294 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::CONTROL}},
365 0},
366 {ui::VKEY_CONTROL,
367 ui::DomCode::CONTROL_LEFT,
368 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
369 ui::DomKey::CONTROL,
370 0}},
371 295
372 // VKEY_RWIN (right Command key) with Alt modifier. The remapped Command 296 // VKEY_RWIN (right Command key) with Alt modifier. The remapped Command
373 // key should never be re-remapped to Alt. 297 // key should never be re-remapped to Alt.
374 {ui::ET_KEY_PRESSED, 298 {ui::ET_KEY_PRESSED,
375 {ui::VKEY_RWIN, 299 {ui::VKEY_RWIN, ui::DomCode::OS_RIGHT,
376 ui::DomCode::OS_RIGHT, 300 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::OS},
377 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, 301 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_RIGHT,
378 ui::DomKey::OS, 302 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::CONTROL}},
379 0},
380 {ui::VKEY_CONTROL,
381 ui::DomCode::CONTROL_RIGHT,
382 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
383 ui::DomKey::CONTROL,
384 0}},
385 }; 303 };
386 304
387 for (const auto& test : apple_keyboard_tests) { 305 for (const auto& test : apple_keyboard_tests) {
388 CheckKeyTestCase(&rewriter, test); 306 CheckKeyTestCase(&rewriter, test);
389 } 307 }
390 } 308 }
391 309
392 void EventRewriterTest::TestRewriteNumPadKeys() { 310 void EventRewriterTest::TestRewriteNumPadKeys() {
393 TestingPrefServiceSyncable prefs; 311 TestingPrefServiceSyncable prefs;
394 EventRewriter rewriter(NULL); 312 EventRewriter rewriter(NULL);
395 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard"); 313 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
396 rewriter.set_last_keyboard_device_id_for_testing(kKeyboardDeviceId); 314 rewriter.set_last_keyboard_device_id_for_testing(kKeyboardDeviceId);
397 rewriter.set_pref_service_for_testing(&prefs); 315 rewriter.set_pref_service_for_testing(&prefs);
398 316
399 KeyTestCase tests[] = { 317 KeyTestCase tests[] = {
400 // XK_KP_Insert (= NumPad 0 without Num Lock), no modifier. 318 // XK_KP_Insert (= NumPad 0 without Num Lock), no modifier.
401 {ui::ET_KEY_PRESSED, 319 {ui::ET_KEY_PRESSED,
402 {ui::VKEY_INSERT, 320 {ui::VKEY_INSERT, ui::DomCode::NUMPAD0, ui::EF_NONE, ui::DomKey::INSERT},
403 ui::DomCode::NUMPAD0, 321 {ui::VKEY_NUMPAD0, ui::DomCode::NUMPAD0, ui::EF_NONE,
404 ui::EF_NONE, 322 ui::DomKey::Constant<'0'>::Character}},
405 ui::DomKey::INSERT,
406 0},
407 {ui::VKEY_NUMPAD0,
408 ui::DomCode::NUMPAD0,
409 ui::EF_NONE,
410 ui::DomKey::CHARACTER,
411 '0'}},
412 323
413 // XK_KP_Insert (= NumPad 0 without Num Lock), Alt modifier. 324 // XK_KP_Insert (= NumPad 0 without Num Lock), Alt modifier.
414 {ui::ET_KEY_PRESSED, 325 {ui::ET_KEY_PRESSED,
415 {ui::VKEY_INSERT, 326 {ui::VKEY_INSERT, ui::DomCode::NUMPAD0, ui::EF_ALT_DOWN,
416 ui::DomCode::NUMPAD0, 327 ui::DomKey::INSERT},
417 ui::EF_ALT_DOWN, 328 {ui::VKEY_NUMPAD0, ui::DomCode::NUMPAD0, ui::EF_ALT_DOWN,
418 ui::DomKey::INSERT, 329 ui::DomKey::Constant<'0'>::Character}},
419 0},
420 {ui::VKEY_NUMPAD0,
421 ui::DomCode::NUMPAD0,
422 ui::EF_ALT_DOWN,
423 ui::DomKey::CHARACTER,
424 '0'}},
425 330
426 // XK_KP_Delete (= NumPad . without Num Lock), Alt modifier. 331 // XK_KP_Delete (= NumPad . without Num Lock), Alt modifier.
427 {ui::ET_KEY_PRESSED, 332 {ui::ET_KEY_PRESSED,
428 {ui::VKEY_DELETE, 333 {ui::VKEY_DELETE, ui::DomCode::NUMPAD_DECIMAL, ui::EF_ALT_DOWN,
429 ui::DomCode::NUMPAD_DECIMAL, 334 ui::DomKey::DEL},
430 ui::EF_ALT_DOWN, 335 {ui::VKEY_DECIMAL, ui::DomCode::NUMPAD_DECIMAL, ui::EF_ALT_DOWN,
431 ui::DomKey::DEL, 336 ui::DomKey::Constant<'.'>::Character}},
432 0x7F},
433 {ui::VKEY_DECIMAL,
434 ui::DomCode::NUMPAD_DECIMAL,
435 ui::EF_ALT_DOWN,
436 ui::DomKey::CHARACTER,
437 '.'}},
438 337
439 // XK_KP_End (= NumPad 1 without Num Lock), Alt modifier. 338 // XK_KP_End (= NumPad 1 without Num Lock), Alt modifier.
440 {ui::ET_KEY_PRESSED, 339 {ui::ET_KEY_PRESSED,
441 {ui::VKEY_END, 340 {ui::VKEY_END, ui::DomCode::NUMPAD1, ui::EF_ALT_DOWN, ui::DomKey::END},
442 ui::DomCode::NUMPAD1, 341 {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_ALT_DOWN,
443 ui::EF_ALT_DOWN, 342 ui::DomKey::Constant<'1'>::Character}},
444 ui::DomKey::END,
445 0},
446 {ui::VKEY_NUMPAD1,
447 ui::DomCode::NUMPAD1,
448 ui::EF_ALT_DOWN,
449 ui::DomKey::CHARACTER,
450 '1'}},
451 343
452 // XK_KP_Down (= NumPad 2 without Num Lock), Alt modifier. 344 // XK_KP_Down (= NumPad 2 without Num Lock), Alt modifier.
453 {ui::ET_KEY_PRESSED, 345 {ui::ET_KEY_PRESSED,
454 {ui::VKEY_DOWN, 346 {ui::VKEY_DOWN, ui::DomCode::NUMPAD2, ui::EF_ALT_DOWN,
455 ui::DomCode::NUMPAD2, 347 ui::DomKey::ARROW_DOWN},
456 ui::EF_ALT_DOWN, 348 {ui::VKEY_NUMPAD2, ui::DomCode::NUMPAD2, ui::EF_ALT_DOWN,
457 ui::DomKey::ARROW_DOWN, 349 ui::DomKey::Constant<'2'>::Character}},
458 0},
459 {ui::VKEY_NUMPAD2,
460 ui::DomCode::NUMPAD2,
461 ui::EF_ALT_DOWN,
462 ui::DomKey::CHARACTER,
463 '2'}},
464 350
465 // XK_KP_Next (= NumPad 3 without Num Lock), Alt modifier. 351 // XK_KP_Next (= NumPad 3 without Num Lock), Alt modifier.
466 {ui::ET_KEY_PRESSED, 352 {ui::ET_KEY_PRESSED,
467 {ui::VKEY_NEXT, 353 {ui::VKEY_NEXT, ui::DomCode::NUMPAD3, ui::EF_ALT_DOWN,
468 ui::DomCode::NUMPAD3, 354 ui::DomKey::PAGE_DOWN},
469 ui::EF_ALT_DOWN, 355 {ui::VKEY_NUMPAD3, ui::DomCode::NUMPAD3, ui::EF_ALT_DOWN,
470 ui::DomKey::PAGE_DOWN, 356 ui::DomKey::Constant<'3'>::Character}},
471 0},
472 {ui::VKEY_NUMPAD3,
473 ui::DomCode::NUMPAD3,
474 ui::EF_ALT_DOWN,
475 ui::DomKey::CHARACTER,
476 '3'}},
477 357
478 // XK_KP_Left (= NumPad 4 without Num Lock), Alt modifier. 358 // XK_KP_Left (= NumPad 4 without Num Lock), Alt modifier.
479 {ui::ET_KEY_PRESSED, 359 {ui::ET_KEY_PRESSED,
480 {ui::VKEY_LEFT, 360 {ui::VKEY_LEFT, ui::DomCode::NUMPAD4, ui::EF_ALT_DOWN,
481 ui::DomCode::NUMPAD4, 361 ui::DomKey::ARROW_LEFT},
482 ui::EF_ALT_DOWN, 362 {ui::VKEY_NUMPAD4, ui::DomCode::NUMPAD4, ui::EF_ALT_DOWN,
483 ui::DomKey::ARROW_LEFT, 363 ui::DomKey::Constant<'4'>::Character}},
484 0},
485 {ui::VKEY_NUMPAD4,
486 ui::DomCode::NUMPAD4,
487 ui::EF_ALT_DOWN,
488 ui::DomKey::CHARACTER,
489 '4'}},
490 364
491 // XK_KP_Begin (= NumPad 5 without Num Lock), Alt modifier. 365 // XK_KP_Begin (= NumPad 5 without Num Lock), Alt modifier.
492 {ui::ET_KEY_PRESSED, 366 {ui::ET_KEY_PRESSED,
493 {ui::VKEY_CLEAR, 367 {ui::VKEY_CLEAR, ui::DomCode::NUMPAD5, ui::EF_ALT_DOWN,
494 ui::DomCode::NUMPAD5, 368 ui::DomKey::CLEAR},
495 ui::EF_ALT_DOWN, 369 {ui::VKEY_NUMPAD5, ui::DomCode::NUMPAD5, ui::EF_ALT_DOWN,
496 ui::DomKey::CLEAR, 370 ui::DomKey::Constant<'5'>::Character}},
497 0},
498 {ui::VKEY_NUMPAD5,
499 ui::DomCode::NUMPAD5,
500 ui::EF_ALT_DOWN,
501 ui::DomKey::CHARACTER,
502 '5'}},
503 371
504 // XK_KP_Right (= NumPad 6 without Num Lock), Alt modifier. 372 // XK_KP_Right (= NumPad 6 without Num Lock), Alt modifier.
505 {ui::ET_KEY_PRESSED, 373 {ui::ET_KEY_PRESSED,
506 {ui::VKEY_RIGHT, 374 {ui::VKEY_RIGHT, ui::DomCode::NUMPAD6, ui::EF_ALT_DOWN,
507 ui::DomCode::NUMPAD6, 375 ui::DomKey::ARROW_RIGHT},
508 ui::EF_ALT_DOWN, 376 {ui::VKEY_NUMPAD6, ui::DomCode::NUMPAD6, ui::EF_ALT_DOWN,
509 ui::DomKey::ARROW_RIGHT, 377 ui::DomKey::Constant<'6'>::Character}},
510 0},
511 {ui::VKEY_NUMPAD6,
512 ui::DomCode::NUMPAD6,
513 ui::EF_ALT_DOWN,
514 ui::DomKey::CHARACTER,
515 '6'}},
516 378
517 // XK_KP_Home (= NumPad 7 without Num Lock), Alt modifier. 379 // XK_KP_Home (= NumPad 7 without Num Lock), Alt modifier.
518 {ui::ET_KEY_PRESSED, 380 {ui::ET_KEY_PRESSED,
519 {ui::VKEY_HOME, 381 {ui::VKEY_HOME, ui::DomCode::NUMPAD7, ui::EF_ALT_DOWN, ui::DomKey::HOME},
520 ui::DomCode::NUMPAD7, 382 {ui::VKEY_NUMPAD7, ui::DomCode::NUMPAD7, ui::EF_ALT_DOWN,
521 ui::EF_ALT_DOWN, 383 ui::DomKey::Constant<'7'>::Character}},
522 ui::DomKey::HOME,
523 0},
524 {ui::VKEY_NUMPAD7,
525 ui::DomCode::NUMPAD7,
526 ui::EF_ALT_DOWN,
527 ui::DomKey::CHARACTER,
528 '7'}},
529 384
530 // XK_KP_Up (= NumPad 8 without Num Lock), Alt modifier. 385 // XK_KP_Up (= NumPad 8 without Num Lock), Alt modifier.
531 {ui::ET_KEY_PRESSED, 386 {ui::ET_KEY_PRESSED,
532 {ui::VKEY_UP, 387 {ui::VKEY_UP, ui::DomCode::NUMPAD8, ui::EF_ALT_DOWN,
533 ui::DomCode::NUMPAD8, 388 ui::DomKey::ARROW_UP},
534 ui::EF_ALT_DOWN, 389 {ui::VKEY_NUMPAD8, ui::DomCode::NUMPAD8, ui::EF_ALT_DOWN,
535 ui::DomKey::ARROW_UP, 390 ui::DomKey::Constant<'8'>::Character}},
536 0},
537 {ui::VKEY_NUMPAD8,
538 ui::DomCode::NUMPAD8,
539 ui::EF_ALT_DOWN,
540 ui::DomKey::CHARACTER,
541 '8'}},
542 391
543 // XK_KP_Prior (= NumPad 9 without Num Lock), Alt modifier. 392 // XK_KP_Prior (= NumPad 9 without Num Lock), Alt modifier.
544 {ui::ET_KEY_PRESSED, 393 {ui::ET_KEY_PRESSED,
545 {ui::VKEY_PRIOR, 394 {ui::VKEY_PRIOR, ui::DomCode::NUMPAD9, ui::EF_ALT_DOWN,
546 ui::DomCode::NUMPAD9, 395 ui::DomKey::PAGE_UP},
547 ui::EF_ALT_DOWN, 396 {ui::VKEY_NUMPAD9, ui::DomCode::NUMPAD9, ui::EF_ALT_DOWN,
548 ui::DomKey::PAGE_UP, 397 ui::DomKey::Constant<'9'>::Character}},
549 0},
550 {ui::VKEY_NUMPAD9,
551 ui::DomCode::NUMPAD9,
552 ui::EF_ALT_DOWN,
553 ui::DomKey::CHARACTER,
554 '9'}},
555 398
556 // XK_KP_0 (= NumPad 0 with Num Lock), Num Lock modifier. 399 // XK_KP_0 (= NumPad 0 with Num Lock), Num Lock modifier.
557 {ui::ET_KEY_PRESSED, 400 {ui::ET_KEY_PRESSED,
558 {ui::VKEY_NUMPAD0, 401 {ui::VKEY_NUMPAD0, ui::DomCode::NUMPAD0, ui::EF_NONE,
559 ui::DomCode::NUMPAD0, 402 ui::DomKey::Constant<'0'>::Character},
560 ui::EF_NONE, 403 {ui::VKEY_NUMPAD0, ui::DomCode::NUMPAD0, ui::EF_NONE,
561 ui::DomKey::CHARACTER, 404 ui::DomKey::Constant<'0'>::Character}},
562 '0'},
563 {ui::VKEY_NUMPAD0,
564 ui::DomCode::NUMPAD0,
565 ui::EF_NONE,
566 ui::DomKey::CHARACTER,
567 '0'}},
568 405
569 // XK_KP_DECIMAL (= NumPad . with Num Lock), Num Lock modifier. 406 // XK_KP_DECIMAL (= NumPad . with Num Lock), Num Lock modifier.
570 {ui::ET_KEY_PRESSED, 407 {ui::ET_KEY_PRESSED,
571 {ui::VKEY_DECIMAL, 408 {ui::VKEY_DECIMAL, ui::DomCode::NUMPAD_DECIMAL, ui::EF_NONE,
572 ui::DomCode::NUMPAD_DECIMAL, 409 ui::DomKey::Constant<'.'>::Character},
573 ui::EF_NONE, 410 {ui::VKEY_DECIMAL, ui::DomCode::NUMPAD_DECIMAL, ui::EF_NONE,
574 ui::DomKey::CHARACTER, 411 ui::DomKey::Constant<'.'>::Character}},
575 '.'},
576 {ui::VKEY_DECIMAL,
577 ui::DomCode::NUMPAD_DECIMAL,
578 ui::EF_NONE,
579 ui::DomKey::CHARACTER,
580 '.'}},
581 412
582 // XK_KP_1 (= NumPad 1 with Num Lock), Num Lock modifier. 413 // XK_KP_1 (= NumPad 1 with Num Lock), Num Lock modifier.
583 {ui::ET_KEY_PRESSED, 414 {ui::ET_KEY_PRESSED,
584 {ui::VKEY_NUMPAD1, 415 {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_NONE,
585 ui::DomCode::NUMPAD1, 416 ui::DomKey::Constant<'1'>::Character},
586 ui::EF_NONE, 417 {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_NONE,
587 ui::DomKey::CHARACTER, 418 ui::DomKey::Constant<'1'>::Character}},
588 '1'},
589 {ui::VKEY_NUMPAD1,
590 ui::DomCode::NUMPAD1,
591 ui::EF_NONE,
592 ui::DomKey::CHARACTER,
593 '1'}},
594 419
595 // XK_KP_2 (= NumPad 2 with Num Lock), Num Lock modifier. 420 // XK_KP_2 (= NumPad 2 with Num Lock), Num Lock modifier.
596 {ui::ET_KEY_PRESSED, 421 {ui::ET_KEY_PRESSED,
597 {ui::VKEY_NUMPAD2, 422 {ui::VKEY_NUMPAD2, ui::DomCode::NUMPAD2, ui::EF_NONE,
598 ui::DomCode::NUMPAD2, 423 ui::DomKey::Constant<'2'>::Character},
599 ui::EF_NONE, 424 {ui::VKEY_NUMPAD2, ui::DomCode::NUMPAD2, ui::EF_NONE,
600 ui::DomKey::CHARACTER, 425 ui::DomKey::Constant<'2'>::Character}},
601 '2'},
602 {ui::VKEY_NUMPAD2,
603 ui::DomCode::NUMPAD2,
604 ui::EF_NONE,
605 ui::DomKey::CHARACTER,
606 '2'}},
607 426
608 // XK_KP_3 (= NumPad 3 with Num Lock), Num Lock modifier. 427 // XK_KP_3 (= NumPad 3 with Num Lock), Num Lock modifier.
609 {ui::ET_KEY_PRESSED, 428 {ui::ET_KEY_PRESSED,
610 {ui::VKEY_NUMPAD3, 429 {ui::VKEY_NUMPAD3, ui::DomCode::NUMPAD3, ui::EF_NONE,
611 ui::DomCode::NUMPAD3, 430 ui::DomKey::Constant<'3'>::Character},
612 ui::EF_NONE, 431 {ui::VKEY_NUMPAD3, ui::DomCode::NUMPAD3, ui::EF_NONE,
613 ui::DomKey::CHARACTER, 432 ui::DomKey::Constant<'3'>::Character}},
614 '3'},
615 {ui::VKEY_NUMPAD3,
616 ui::DomCode::NUMPAD3,
617 ui::EF_NONE,
618 ui::DomKey::CHARACTER,
619 '3'}},
620 433
621 // XK_KP_4 (= NumPad 4 with Num Lock), Num Lock modifier. 434 // XK_KP_4 (= NumPad 4 with Num Lock), Num Lock modifier.
622 {ui::ET_KEY_PRESSED, 435 {ui::ET_KEY_PRESSED,
623 {ui::VKEY_NUMPAD4, 436 {ui::VKEY_NUMPAD4, ui::DomCode::NUMPAD4, ui::EF_NONE,
624 ui::DomCode::NUMPAD4, 437 ui::DomKey::Constant<'4'>::Character},
625 ui::EF_NONE, 438 {ui::VKEY_NUMPAD4, ui::DomCode::NUMPAD4, ui::EF_NONE,
626 ui::DomKey::CHARACTER, 439 ui::DomKey::Constant<'4'>::Character}},
627 '4'},
628 {ui::VKEY_NUMPAD4,
629 ui::DomCode::NUMPAD4,
630 ui::EF_NONE,
631 ui::DomKey::CHARACTER,
632 '4'}},
633 440
634 // XK_KP_5 (= NumPad 5 with Num Lock), Num Lock 441 // XK_KP_5 (= NumPad 5 with Num Lock), Num Lock
635 // modifier. 442 // modifier.
636 {ui::ET_KEY_PRESSED, 443 {ui::ET_KEY_PRESSED,
637 {ui::VKEY_NUMPAD5, 444 {ui::VKEY_NUMPAD5, ui::DomCode::NUMPAD5, ui::EF_NONE,
638 ui::DomCode::NUMPAD5, 445 ui::DomKey::Constant<'5'>::Character},
639 ui::EF_NONE, 446 {ui::VKEY_NUMPAD5, ui::DomCode::NUMPAD5, ui::EF_NONE,
640 ui::DomKey::CHARACTER, 447 ui::DomKey::Constant<'5'>::Character}},
641 '5'},
642 {ui::VKEY_NUMPAD5,
643 ui::DomCode::NUMPAD5,
644 ui::EF_NONE,
645 ui::DomKey::CHARACTER,
646 '5'}},
647 448
648 // XK_KP_6 (= NumPad 6 with Num Lock), Num Lock 449 // XK_KP_6 (= NumPad 6 with Num Lock), Num Lock
649 // modifier. 450 // modifier.
650 {ui::ET_KEY_PRESSED, 451 {ui::ET_KEY_PRESSED,
651 {ui::VKEY_NUMPAD6, 452 {ui::VKEY_NUMPAD6, ui::DomCode::NUMPAD6, ui::EF_NONE,
652 ui::DomCode::NUMPAD6, 453 ui::DomKey::Constant<'6'>::Character},
653 ui::EF_NONE, 454 {ui::VKEY_NUMPAD6, ui::DomCode::NUMPAD6, ui::EF_NONE,
654 ui::DomKey::CHARACTER, 455 ui::DomKey::Constant<'6'>::Character}},
655 '6'},
656 {ui::VKEY_NUMPAD6,
657 ui::DomCode::NUMPAD6,
658 ui::EF_NONE,
659 ui::DomKey::CHARACTER,
660 '6'}},
661 456
662 // XK_KP_7 (= NumPad 7 with Num Lock), Num Lock 457 // XK_KP_7 (= NumPad 7 with Num Lock), Num Lock
663 // modifier. 458 // modifier.
664 {ui::ET_KEY_PRESSED, 459 {ui::ET_KEY_PRESSED,
665 {ui::VKEY_NUMPAD7, 460 {ui::VKEY_NUMPAD7, ui::DomCode::NUMPAD7, ui::EF_NONE,
666 ui::DomCode::NUMPAD7, 461 ui::DomKey::Constant<'7'>::Character},
667 ui::EF_NONE, 462 {ui::VKEY_NUMPAD7, ui::DomCode::NUMPAD7, ui::EF_NONE,
668 ui::DomKey::CHARACTER, 463 ui::DomKey::Constant<'7'>::Character}},
669 '7'},
670 {ui::VKEY_NUMPAD7,
671 ui::DomCode::NUMPAD7,
672 ui::EF_NONE,
673 ui::DomKey::CHARACTER,
674 '7'}},
675 464
676 // XK_KP_8 (= NumPad 8 with Num Lock), Num Lock 465 // XK_KP_8 (= NumPad 8 with Num Lock), Num Lock
677 // modifier. 466 // modifier.
678 {ui::ET_KEY_PRESSED, 467 {ui::ET_KEY_PRESSED,
679 {ui::VKEY_NUMPAD8, 468 {ui::VKEY_NUMPAD8, ui::DomCode::NUMPAD8, ui::EF_NONE,
680 ui::DomCode::NUMPAD8, 469 ui::DomKey::Constant<'8'>::Character},
681 ui::EF_NONE, 470 {ui::VKEY_NUMPAD8, ui::DomCode::NUMPAD8, ui::EF_NONE,
682 ui::DomKey::CHARACTER, 471 ui::DomKey::Constant<'8'>::Character}},
683 '8'},
684 {ui::VKEY_NUMPAD8,
685 ui::DomCode::NUMPAD8,
686 ui::EF_NONE,
687 ui::DomKey::CHARACTER,
688 '8'}},
689 472
690 // XK_KP_9 (= NumPad 9 with Num Lock), Num Lock 473 // XK_KP_9 (= NumPad 9 with Num Lock), Num Lock
691 // modifier. 474 // modifier.
692 {ui::ET_KEY_PRESSED, 475 {ui::ET_KEY_PRESSED,
693 {ui::VKEY_NUMPAD9, 476 {ui::VKEY_NUMPAD9, ui::DomCode::NUMPAD9, ui::EF_NONE,
694 ui::DomCode::NUMPAD9, 477 ui::DomKey::Constant<'9'>::Character},
695 ui::EF_NONE, 478 {ui::VKEY_NUMPAD9, ui::DomCode::NUMPAD9, ui::EF_NONE,
696 ui::DomKey::CHARACTER, 479 ui::DomKey::Constant<'9'>::Character}},
697 '9'},
698 {ui::VKEY_NUMPAD9,
699 ui::DomCode::NUMPAD9,
700 ui::EF_NONE,
701 ui::DomKey::CHARACTER,
702 '9'}},
703 }; 480 };
704 481
705 for (const auto& test : tests) { 482 for (const auto& test : tests) {
706 CheckKeyTestCase(&rewriter, test); 483 CheckKeyTestCase(&rewriter, test);
707 } 484 }
708 } 485 }
709 486
710 TEST_F(EventRewriterTest, TestRewriteNumPadKeys) { 487 TEST_F(EventRewriterTest, TestRewriteNumPadKeys) {
711 TestRewriteNumPadKeys(); 488 TestRewriteNumPadKeys();
712 } 489 }
(...skipping 13 matching lines...) Expand all
726 TestingPrefServiceSyncable prefs; 503 TestingPrefServiceSyncable prefs;
727 EventRewriter rewriter(NULL); 504 EventRewriter rewriter(NULL);
728 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "Apple Keyboard"); 505 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "Apple Keyboard");
729 rewriter.set_last_keyboard_device_id_for_testing(kKeyboardDeviceId); 506 rewriter.set_last_keyboard_device_id_for_testing(kKeyboardDeviceId);
730 rewriter.set_pref_service_for_testing(&prefs); 507 rewriter.set_pref_service_for_testing(&prefs);
731 508
732 KeyTestCase tests[] = { 509 KeyTestCase tests[] = {
733 // XK_KP_End (= NumPad 1 without Num Lock), Win modifier. 510 // XK_KP_End (= NumPad 1 without Num Lock), Win modifier.
734 // The result should be "Num Pad 1 with Control + Num Lock modifiers". 511 // The result should be "Num Pad 1 with Control + Num Lock modifiers".
735 {ui::ET_KEY_PRESSED, 512 {ui::ET_KEY_PRESSED,
736 {ui::VKEY_END, 513 {ui::VKEY_END, ui::DomCode::NUMPAD1, ui::EF_COMMAND_DOWN,
737 ui::DomCode::NUMPAD1, 514 ui::DomKey::END},
738 ui::EF_COMMAND_DOWN, 515 {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_CONTROL_DOWN,
739 ui::DomKey::END, 516 ui::DomKey::UNIDENTIFIED}},
740 0},
741 {ui::VKEY_NUMPAD1,
742 ui::DomCode::NUMPAD1,
743 ui::EF_CONTROL_DOWN,
744 ui::DomKey::UNIDENTIFIED,
745 0}},
746 517
747 // XK_KP_1 (= NumPad 1 with Num Lock), Win modifier. 518 // XK_KP_1 (= NumPad 1 with Num Lock), Win modifier.
748 // The result should also be "Num Pad 1 with Control + Num Lock 519 // The result should also be "Num Pad 1 with Control + Num Lock
749 // modifiers". 520 // modifiers".
750 {ui::ET_KEY_PRESSED, 521 {ui::ET_KEY_PRESSED,
751 {ui::VKEY_NUMPAD1, 522 {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_COMMAND_DOWN,
752 ui::DomCode::NUMPAD1, 523 ui::DomKey::Constant<'1'>::Character},
753 ui::EF_COMMAND_DOWN, 524 {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_CONTROL_DOWN,
754 ui::DomKey::CHARACTER, 525 ui::DomKey::UNIDENTIFIED}}};
755 '1'},
756 {ui::VKEY_NUMPAD1,
757 ui::DomCode::NUMPAD1,
758 ui::EF_CONTROL_DOWN,
759 ui::DomKey::UNIDENTIFIED,
760 0}}};
761 526
762 for (const auto& test : tests) { 527 for (const auto& test : tests) {
763 CheckKeyTestCase(&rewriter, test); 528 CheckKeyTestCase(&rewriter, test);
764 } 529 }
765 } 530 }
766 531
767 TEST_F(EventRewriterTest, TestRewriteNumPadKeysOnAppleKeyboard) { 532 TEST_F(EventRewriterTest, TestRewriteNumPadKeysOnAppleKeyboard) {
768 TestRewriteNumPadKeysOnAppleKeyboard(); 533 TestRewriteNumPadKeysOnAppleKeyboard();
769 } 534 }
770 535
(...skipping 10 matching lines...) Expand all
781 546
782 TEST_F(EventRewriterTest, TestRewriteModifiersNoRemap) { 547 TEST_F(EventRewriterTest, TestRewriteModifiersNoRemap) {
783 TestingPrefServiceSyncable prefs; 548 TestingPrefServiceSyncable prefs;
784 EventRewriter rewriter(NULL); 549 EventRewriter rewriter(NULL);
785 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard"); 550 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
786 rewriter.set_pref_service_for_testing(&prefs); 551 rewriter.set_pref_service_for_testing(&prefs);
787 552
788 KeyTestCase tests[] = { 553 KeyTestCase tests[] = {
789 // Press Search. Confirm the event is not rewritten. 554 // Press Search. Confirm the event is not rewritten.
790 {ui::ET_KEY_PRESSED, 555 {ui::ET_KEY_PRESSED,
791 {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, ui::EF_NONE, ui::DomKey::OS, 0}, 556 {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, ui::EF_NONE, ui::DomKey::OS},
792 {ui::VKEY_LWIN, 557 {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, ui::EF_COMMAND_DOWN,
793 ui::DomCode::OS_LEFT, 558 ui::DomKey::OS}},
794 ui::EF_COMMAND_DOWN,
795 ui::DomKey::OS,
796 0}},
797 559
798 // Press left Control. Confirm the event is not rewritten. 560 // Press left Control. Confirm the event is not rewritten.
799 {ui::ET_KEY_PRESSED, 561 {ui::ET_KEY_PRESSED,
800 {ui::VKEY_CONTROL, 562 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
801 ui::DomCode::CONTROL_LEFT, 563 ui::DomKey::CONTROL},
802 ui::EF_CONTROL_DOWN, 564 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
803 ui::DomKey::CONTROL, 565 ui::DomKey::CONTROL}},
804 0},
805 {ui::VKEY_CONTROL,
806 ui::DomCode::CONTROL_LEFT,
807 ui::EF_CONTROL_DOWN,
808 ui::DomKey::CONTROL,
809 0}},
810 566
811 // Press right Control. Confirm the event is not rewritten. 567 // Press right Control. Confirm the event is not rewritten.
812 {ui::ET_KEY_PRESSED, 568 {ui::ET_KEY_PRESSED,
813 {ui::VKEY_CONTROL, 569 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
814 ui::DomCode::CONTROL_LEFT, 570 ui::DomKey::CONTROL},
815 ui::EF_CONTROL_DOWN, 571 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
816 ui::DomKey::CONTROL, 572 ui::DomKey::CONTROL}},
817 0},
818 {ui::VKEY_CONTROL,
819 ui::DomCode::CONTROL_LEFT,
820 ui::EF_CONTROL_DOWN,
821 ui::DomKey::CONTROL,
822 0}},
823 573
824 // Press left Alt. Confirm the event is not rewritten. 574 // Press left Alt. Confirm the event is not rewritten.
825 {ui::ET_KEY_PRESSED, 575 {ui::ET_KEY_PRESSED,
826 {ui::VKEY_MENU, 576 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, ui::DomKey::ALT},
827 ui::DomCode::ALT_LEFT, 577 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN,
828 ui::EF_ALT_DOWN, 578 ui::DomKey::ALT}},
829 ui::DomKey::ALT,
830 0},
831 {ui::VKEY_MENU,
832 ui::DomCode::ALT_LEFT,
833 ui::EF_ALT_DOWN,
834 ui::DomKey::ALT,
835 0}},
836 579
837 // Press right Alt. Confirm the event is not rewritten. 580 // Press right Alt. Confirm the event is not rewritten.
838 {ui::ET_KEY_PRESSED, 581 {ui::ET_KEY_PRESSED,
839 {ui::VKEY_MENU, 582 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, ui::DomKey::ALT},
840 ui::DomCode::ALT_LEFT, 583 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN,
841 ui::EF_ALT_DOWN, 584 ui::DomKey::ALT}},
842 ui::DomKey::ALT,
843 0},
844 {ui::VKEY_MENU,
845 ui::DomCode::ALT_LEFT,
846 ui::EF_ALT_DOWN,
847 ui::DomKey::ALT,
848 0}},
849 585
850 // Test KeyRelease event, just in case. 586 // Test KeyRelease event, just in case.
851 // Release Search. Confirm the release event is not rewritten. 587 // Release Search. Confirm the release event is not rewritten.
852 {ui::ET_KEY_RELEASED, 588 {ui::ET_KEY_RELEASED,
853 {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, ui::EF_NONE, ui::DomKey::OS, 0}, 589 {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, ui::EF_NONE, ui::DomKey::OS},
854 {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, ui::EF_NONE, ui::DomKey::OS, 0}}, 590 {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, ui::EF_NONE, ui::DomKey::OS}},
855 }; 591 };
856 592
857 for (const auto& test : tests) { 593 for (const auto& test : tests) {
858 CheckKeyTestCase(&rewriter, test); 594 CheckKeyTestCase(&rewriter, test);
859 } 595 }
860 } 596 }
861 597
862 TEST_F(EventRewriterTest, TestRewriteModifiersNoRemapMultipleKeys) { 598 TEST_F(EventRewriterTest, TestRewriteModifiersNoRemapMultipleKeys) {
863 TestingPrefServiceSyncable prefs; 599 TestingPrefServiceSyncable prefs;
864 EventRewriter rewriter(NULL); 600 EventRewriter rewriter(NULL);
865 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard"); 601 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
866 rewriter.set_pref_service_for_testing(&prefs); 602 rewriter.set_pref_service_for_testing(&prefs);
867 603
868 KeyTestCase tests[] = { 604 KeyTestCase tests[] = {
869 // Press Alt with Shift. Confirm the event is not rewritten. 605 // Press Alt with Shift. Confirm the event is not rewritten.
870 {ui::ET_KEY_PRESSED, 606 {ui::ET_KEY_PRESSED,
871 {ui::VKEY_MENU, 607 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT,
872 ui::DomCode::ALT_LEFT, 608 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ALT},
873 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, 609 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT,
874 ui::DomKey::ALT, 610 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ALT}},
875 0},
876 {ui::VKEY_MENU,
877 ui::DomCode::ALT_LEFT,
878 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
879 ui::DomKey::ALT,
880 0}},
881 611
882 // Press Search with Caps Lock mask. Confirm the event is not rewritten. 612 // Press Search with Caps Lock mask. Confirm the event is not rewritten.
883 {ui::ET_KEY_PRESSED, 613 {ui::ET_KEY_PRESSED,
884 {ui::VKEY_LWIN, 614 {ui::VKEY_LWIN, ui::DomCode::OS_LEFT,
885 ui::DomCode::OS_LEFT, 615 ui::EF_CAPS_LOCK_DOWN | ui::EF_COMMAND_DOWN, ui::DomKey::OS},
886 ui::EF_CAPS_LOCK_DOWN | ui::EF_COMMAND_DOWN, 616 {ui::VKEY_LWIN, ui::DomCode::OS_LEFT,
887 ui::DomKey::OS, 617 ui::EF_CAPS_LOCK_DOWN | ui::EF_COMMAND_DOWN, ui::DomKey::OS}},
888 0},
889 {ui::VKEY_LWIN,
890 ui::DomCode::OS_LEFT,
891 ui::EF_CAPS_LOCK_DOWN | ui::EF_COMMAND_DOWN,
892 ui::DomKey::OS,
893 0}},
894 618
895 // Release Search with Caps Lock mask. Confirm the event is not rewritten. 619 // Release Search with Caps Lock mask. Confirm the event is not rewritten.
896 {ui::ET_KEY_RELEASED, 620 {ui::ET_KEY_RELEASED,
897 {ui::VKEY_LWIN, 621 {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, ui::EF_CAPS_LOCK_DOWN,
898 ui::DomCode::OS_LEFT, 622 ui::DomKey::OS},
899 ui::EF_CAPS_LOCK_DOWN, 623 {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, ui::EF_CAPS_LOCK_DOWN,
900 ui::DomKey::OS, 624 ui::DomKey::OS}},
901 0},
902 {ui::VKEY_LWIN,
903 ui::DomCode::OS_LEFT,
904 ui::EF_CAPS_LOCK_DOWN,
905 ui::DomKey::OS,
906 0}},
907 625
908 // Press Shift+Ctrl+Alt+Search+A. Confirm the event is not rewritten. 626 // Press Shift+Ctrl+Alt+Search+A. Confirm the event is not rewritten.
909 {ui::ET_KEY_PRESSED, 627 {ui::ET_KEY_PRESSED,
910 {ui::VKEY_B, 628 {ui::VKEY_B, ui::DomCode::KEY_B,
911 ui::DomCode::KEY_B,
912 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | 629 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
913 ui::EF_COMMAND_DOWN, 630 ui::EF_COMMAND_DOWN,
914 ui::DomKey::CHARACTER, 631 ui::DomKey::Constant<'B'>::Character},
915 'B'}, 632 {ui::VKEY_B, ui::DomCode::KEY_B,
916 {ui::VKEY_B,
917 ui::DomCode::KEY_B,
918 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | 633 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
919 ui::EF_COMMAND_DOWN, 634 ui::EF_COMMAND_DOWN,
920 ui::DomKey::CHARACTER, 635 ui::DomKey::Constant<'B'>::Character}},
921 'B'}},
922 }; 636 };
923 637
924 for (const auto& test : tests) { 638 for (const auto& test : tests) {
925 CheckKeyTestCase(&rewriter, test); 639 CheckKeyTestCase(&rewriter, test);
926 } 640 }
927 } 641 }
928 642
929 TEST_F(EventRewriterTest, TestRewriteModifiersDisableSome) { 643 TEST_F(EventRewriterTest, TestRewriteModifiersDisableSome) {
930 // Disable Search and Control keys. 644 // Disable Search and Control keys.
931 TestingPrefServiceSyncable prefs; 645 TestingPrefServiceSyncable prefs;
932 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 646 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
933 IntegerPrefMember search; 647 IntegerPrefMember search;
934 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); 648 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs);
935 search.SetValue(chromeos::input_method::kVoidKey); 649 search.SetValue(chromeos::input_method::kVoidKey);
936 IntegerPrefMember control; 650 IntegerPrefMember control;
937 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); 651 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs);
938 control.SetValue(chromeos::input_method::kVoidKey); 652 control.SetValue(chromeos::input_method::kVoidKey);
939 653
940 EventRewriter rewriter(NULL); 654 EventRewriter rewriter(NULL);
941 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard"); 655 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
942 rewriter.set_pref_service_for_testing(&prefs); 656 rewriter.set_pref_service_for_testing(&prefs);
943 657
944 KeyTestCase disabled_modifier_tests[] = { 658 KeyTestCase disabled_modifier_tests[] = {
945 // Press Alt with Shift. This key press shouldn't be affected by the 659 // Press Alt with Shift. This key press shouldn't be affected by the
946 // pref. Confirm the event is not rewritten. 660 // pref. Confirm the event is not rewritten.
947 {ui::ET_KEY_PRESSED, 661 {ui::ET_KEY_PRESSED,
948 {ui::VKEY_MENU, 662 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT,
949 ui::DomCode::ALT_LEFT, 663 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ALT},
950 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, 664 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT,
951 ui::DomKey::ALT, 665 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ALT}},
952 0},
953 {ui::VKEY_MENU,
954 ui::DomCode::ALT_LEFT,
955 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
956 ui::DomKey::ALT,
957 0}},
958 666
959 // Press Search. Confirm the event is now VKEY_UNKNOWN. 667 // Press Search. Confirm the event is now VKEY_UNKNOWN.
960 {ui::ET_KEY_PRESSED, 668 {ui::ET_KEY_PRESSED,
961 {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, ui::EF_NONE, ui::DomKey::OS, 0}, 669 {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, ui::EF_NONE, ui::DomKey::OS},
962 {ui::VKEY_UNKNOWN, 670 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_NONE,
963 ui::DomCode::NONE, 671 ui::DomKey::UNIDENTIFIED}},
964 ui::EF_NONE,
965 ui::DomKey::UNIDENTIFIED,
966 0}},
967 672
968 // Press Control. Confirm the event is now VKEY_UNKNOWN. 673 // Press Control. Confirm the event is now VKEY_UNKNOWN.
969 {ui::ET_KEY_PRESSED, 674 {ui::ET_KEY_PRESSED,
970 {ui::VKEY_CONTROL, 675 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
971 ui::DomCode::CONTROL_LEFT, 676 ui::DomKey::CONTROL},
972 ui::EF_CONTROL_DOWN, 677 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_NONE,
973 ui::DomKey::CONTROL, 678 ui::DomKey::UNIDENTIFIED}},
974 0},
975 {ui::VKEY_UNKNOWN,
976 ui::DomCode::NONE,
977 ui::EF_NONE,
978 ui::DomKey::UNIDENTIFIED,
979 0}},
980 679
981 // Press Control+Search. Confirm the event is now VKEY_UNKNOWN 680 // Press Control+Search. Confirm the event is now VKEY_UNKNOWN
982 // without any modifiers. 681 // without any modifiers.
983 {ui::ET_KEY_PRESSED, 682 {ui::ET_KEY_PRESSED,
984 {ui::VKEY_LWIN, 683 {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, ui::EF_CONTROL_DOWN,
985 ui::DomCode::OS_LEFT, 684 ui::DomKey::OS},
986 ui::EF_CONTROL_DOWN, 685 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_NONE,
987 ui::DomKey::OS, 686 ui::DomKey::UNIDENTIFIED}},
988 0},
989 {ui::VKEY_UNKNOWN,
990 ui::DomCode::NONE,
991 ui::EF_NONE,
992 ui::DomKey::UNIDENTIFIED,
993 0}},
994 687
995 // Press Control+Search+a. Confirm the event is now VKEY_A without any 688 // Press Control+Search+a. Confirm the event is now VKEY_A without any
996 // modifiers. 689 // modifiers.
997 {ui::ET_KEY_PRESSED, 690 {ui::ET_KEY_PRESSED,
998 {ui::VKEY_A, 691 {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_CONTROL_DOWN,
999 ui::DomCode::KEY_A, 692 ui::DomKey::Constant<'a'>::Character},
1000 ui::EF_CONTROL_DOWN, 693 {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_NONE,
1001 ui::DomKey::CHARACTER, 694 ui::DomKey::Constant<'a'>::Character}},
1002 'a'},
1003 {ui::VKEY_A,
1004 ui::DomCode::KEY_A,
1005 ui::EF_NONE,
1006 ui::DomKey::CHARACTER,
1007 'a'}},
1008 695
1009 // Press Control+Search+Alt+a. Confirm the event is now VKEY_A only with 696 // Press Control+Search+Alt+a. Confirm the event is now VKEY_A only with
1010 // the Alt modifier. 697 // the Alt modifier.
1011 {ui::ET_KEY_PRESSED, 698 {ui::ET_KEY_PRESSED,
1012 {ui::VKEY_A, 699 {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
1013 ui::DomCode::KEY_A, 700 ui::DomKey::Constant<'a'>::Character},
1014 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, 701 {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_ALT_DOWN,
1015 ui::DomKey::CHARACTER, 702 ui::DomKey::Constant<'a'>::Character}},
1016 'a'},
1017 {ui::VKEY_A,
1018 ui::DomCode::KEY_A,
1019 ui::EF_ALT_DOWN,
1020 ui::DomKey::CHARACTER,
1021 'a'}},
1022 }; 703 };
1023 704
1024 for (const auto& test : disabled_modifier_tests) { 705 for (const auto& test : disabled_modifier_tests) {
1025 CheckKeyTestCase(&rewriter, test); 706 CheckKeyTestCase(&rewriter, test);
1026 } 707 }
1027 708
1028 // Remap Alt to Control. 709 // Remap Alt to Control.
1029 IntegerPrefMember alt; 710 IntegerPrefMember alt;
1030 alt.Init(prefs::kLanguageRemapAltKeyTo, &prefs); 711 alt.Init(prefs::kLanguageRemapAltKeyTo, &prefs);
1031 alt.SetValue(chromeos::input_method::kControlKey); 712 alt.SetValue(chromeos::input_method::kControlKey);
1032 713
1033 KeyTestCase tests[] = { 714 KeyTestCase tests[] = {
1034 // Press left Alt. Confirm the event is now VKEY_CONTROL 715 // Press left Alt. Confirm the event is now VKEY_CONTROL
1035 // even though the Control key itself is disabled. 716 // even though the Control key itself is disabled.
1036 {ui::ET_KEY_PRESSED, 717 {ui::ET_KEY_PRESSED,
1037 {ui::VKEY_MENU, 718 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, ui::DomKey::ALT},
1038 ui::DomCode::ALT_LEFT, 719 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
1039 ui::EF_ALT_DOWN, 720 ui::DomKey::CONTROL}},
1040 ui::DomKey::ALT,
1041 0},
1042 {ui::VKEY_CONTROL,
1043 ui::DomCode::CONTROL_LEFT,
1044 ui::EF_CONTROL_DOWN,
1045 ui::DomKey::CONTROL,
1046 0}},
1047 721
1048 // Press Alt+a. Confirm the event is now Control+a even though the Control 722 // Press Alt+a. Confirm the event is now Control+a even though the Control
1049 // key itself is disabled. 723 // key itself is disabled.
1050 {ui::ET_KEY_PRESSED, 724 {ui::ET_KEY_PRESSED,
1051 {ui::VKEY_A, 725 {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_ALT_DOWN,
1052 ui::DomCode::KEY_A, 726 ui::DomKey::Constant<'a'>::Character},
1053 ui::EF_ALT_DOWN, 727 {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_CONTROL_DOWN,
1054 ui::DomKey::CHARACTER, 728 ui::DomKey::Constant<0x01>::Character}},
1055 'a'},
1056 {ui::VKEY_A,
1057 ui::DomCode::KEY_A,
1058 ui::EF_CONTROL_DOWN,
1059 ui::DomKey::CHARACTER,
1060 0x01}},
1061 }; 729 };
1062 730
1063 for (const auto& test : tests) { 731 for (const auto& test : tests) {
1064 CheckKeyTestCase(&rewriter, test); 732 CheckKeyTestCase(&rewriter, test);
1065 } 733 }
1066 } 734 }
1067 735
1068 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToControl) { 736 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToControl) {
1069 // Remap Search to Control. 737 // Remap Search to Control.
1070 TestingPrefServiceSyncable prefs; 738 TestingPrefServiceSyncable prefs;
1071 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 739 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1072 IntegerPrefMember search; 740 IntegerPrefMember search;
1073 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); 741 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs);
1074 search.SetValue(chromeos::input_method::kControlKey); 742 search.SetValue(chromeos::input_method::kControlKey);
1075 743
1076 EventRewriter rewriter(NULL); 744 EventRewriter rewriter(NULL);
1077 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard"); 745 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
1078 rewriter.set_pref_service_for_testing(&prefs); 746 rewriter.set_pref_service_for_testing(&prefs);
1079 747
1080 KeyTestCase s_tests[] = { 748 KeyTestCase s_tests[] = {
1081 // Press Search. Confirm the event is now VKEY_CONTROL. 749 // Press Search. Confirm the event is now VKEY_CONTROL.
1082 {ui::ET_KEY_PRESSED, 750 {ui::ET_KEY_PRESSED,
1083 {ui::VKEY_LWIN, 751 {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, ui::EF_COMMAND_DOWN,
1084 ui::DomCode::OS_LEFT, 752 ui::DomKey::OS},
1085 ui::EF_COMMAND_DOWN, 753 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
1086 ui::DomKey::OS, 754 ui::DomKey::CONTROL}},
1087 0},
1088 {ui::VKEY_CONTROL,
1089 ui::DomCode::CONTROL_LEFT,
1090 ui::EF_CONTROL_DOWN,
1091 ui::DomKey::CONTROL,
1092 0}},
1093 }; 755 };
1094 756
1095 for (const auto& test : s_tests) { 757 for (const auto& test : s_tests) {
1096 CheckKeyTestCase(&rewriter, test); 758 CheckKeyTestCase(&rewriter, test);
1097 } 759 }
1098 760
1099 // Remap Alt to Control too. 761 // Remap Alt to Control too.
1100 IntegerPrefMember alt; 762 IntegerPrefMember alt;
1101 alt.Init(prefs::kLanguageRemapAltKeyTo, &prefs); 763 alt.Init(prefs::kLanguageRemapAltKeyTo, &prefs);
1102 alt.SetValue(chromeos::input_method::kControlKey); 764 alt.SetValue(chromeos::input_method::kControlKey);
1103 765
1104 KeyTestCase sa_tests[] = { 766 KeyTestCase sa_tests[] = {
1105 // Press Alt. Confirm the event is now VKEY_CONTROL. 767 // Press Alt. Confirm the event is now VKEY_CONTROL.
1106 {ui::ET_KEY_PRESSED, 768 {ui::ET_KEY_PRESSED,
1107 {ui::VKEY_MENU, 769 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, ui::DomKey::ALT},
1108 ui::DomCode::ALT_LEFT, 770 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
1109 ui::EF_ALT_DOWN, 771 ui::DomKey::CONTROL}},
1110 ui::DomKey::ALT,
1111 0},
1112 {ui::VKEY_CONTROL,
1113 ui::DomCode::CONTROL_LEFT,
1114 ui::EF_CONTROL_DOWN,
1115 ui::DomKey::CONTROL,
1116 0}},
1117 772
1118 // Press Alt+Search. Confirm the event is now VKEY_CONTROL. 773 // Press Alt+Search. Confirm the event is now VKEY_CONTROL.
1119 {ui::ET_KEY_PRESSED, 774 {ui::ET_KEY_PRESSED,
1120 {ui::VKEY_LWIN, 775 {ui::VKEY_LWIN, ui::DomCode::OS_LEFT,
1121 ui::DomCode::OS_LEFT, 776 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, ui::DomKey::OS},
1122 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, 777 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
1123 ui::DomKey::OS, 778 ui::DomKey::CONTROL}},
1124 0},
1125 {ui::VKEY_CONTROL,
1126 ui::DomCode::CONTROL_LEFT,
1127 ui::EF_CONTROL_DOWN,
1128 ui::DomKey::CONTROL,
1129 0}},
1130 779
1131 // Press Control+Alt+Search. Confirm the event is now VKEY_CONTROL. 780 // Press Control+Alt+Search. Confirm the event is now VKEY_CONTROL.
1132 {ui::ET_KEY_PRESSED, 781 {ui::ET_KEY_PRESSED,
1133 {ui::VKEY_LWIN, 782 {ui::VKEY_LWIN, ui::DomCode::OS_LEFT,
1134 ui::DomCode::OS_LEFT,
1135 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, 783 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
1136 ui::DomKey::OS, 784 ui::DomKey::OS},
1137 0}, 785 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
1138 {ui::VKEY_CONTROL, 786 ui::DomKey::CONTROL}},
1139 ui::DomCode::CONTROL_LEFT,
1140 ui::EF_CONTROL_DOWN,
1141 ui::DomKey::CONTROL,
1142 0}},
1143 787
1144 // Press Shift+Control+Alt+Search. Confirm the event is now Control with 788 // Press Shift+Control+Alt+Search. Confirm the event is now Control with
1145 // Shift and Control modifiers. 789 // Shift and Control modifiers.
1146 {ui::ET_KEY_PRESSED, 790 {ui::ET_KEY_PRESSED,
1147 {ui::VKEY_LWIN, 791 {ui::VKEY_LWIN, ui::DomCode::OS_LEFT,
1148 ui::DomCode::OS_LEFT,
1149 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | 792 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
1150 ui::EF_COMMAND_DOWN, 793 ui::EF_COMMAND_DOWN,
1151 ui::DomKey::OS, 794 ui::DomKey::OS},
1152 0}, 795 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
1153 {ui::VKEY_CONTROL, 796 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::CONTROL}},
1154 ui::DomCode::CONTROL_LEFT,
1155 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN,
1156 ui::DomKey::CONTROL,
1157 0}},
1158 797
1159 // Press Shift+Control+Alt+Search+B. Confirm the event is now B with Shift 798 // Press Shift+Control+Alt+Search+B. Confirm the event is now B with Shift
1160 // and Control modifiers. 799 // and Control modifiers.
1161 {ui::ET_KEY_PRESSED, 800 {ui::ET_KEY_PRESSED,
1162 {ui::VKEY_B, 801 {ui::VKEY_B, ui::DomCode::KEY_B,
1163 ui::DomCode::KEY_B,
1164 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | 802 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
1165 ui::EF_COMMAND_DOWN, 803 ui::EF_COMMAND_DOWN,
1166 ui::DomKey::CHARACTER, 804 ui::DomKey::Constant<'B'>::Character},
1167 'B'}, 805 {ui::VKEY_B, ui::DomCode::KEY_B, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN,
1168 {ui::VKEY_B, 806 ui::DomKey::Constant<0x02>::Character}},
1169 ui::DomCode::KEY_B,
1170 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN,
1171 ui::DomKey::CHARACTER,
1172 0x02}},
1173 }; 807 };
1174 808
1175 for (const auto& test : sa_tests) { 809 for (const auto& test : sa_tests) {
1176 CheckKeyTestCase(&rewriter, test); 810 CheckKeyTestCase(&rewriter, test);
1177 } 811 }
1178 } 812 }
1179 813
1180 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToEscape) { 814 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToEscape) {
1181 // Remap Search to ESC. 815 // Remap Search to ESC.
1182 TestingPrefServiceSyncable prefs; 816 TestingPrefServiceSyncable prefs;
1183 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 817 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1184 IntegerPrefMember search; 818 IntegerPrefMember search;
1185 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); 819 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs);
1186 search.SetValue(chromeos::input_method::kEscapeKey); 820 search.SetValue(chromeos::input_method::kEscapeKey);
1187 821
1188 EventRewriter rewriter(NULL); 822 EventRewriter rewriter(NULL);
1189 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard"); 823 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
1190 rewriter.set_pref_service_for_testing(&prefs); 824 rewriter.set_pref_service_for_testing(&prefs);
1191 825
1192 KeyTestCase tests[] = { 826 KeyTestCase tests[] = {
1193 // Press Search. Confirm the event is now VKEY_ESCAPE. 827 // Press Search. Confirm the event is now VKEY_ESCAPE.
1194 {ui::ET_KEY_PRESSED, 828 {ui::ET_KEY_PRESSED,
1195 {ui::VKEY_LWIN, 829 {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, ui::EF_COMMAND_DOWN,
1196 ui::DomCode::OS_LEFT, 830 ui::DomKey::OS},
1197 ui::EF_COMMAND_DOWN, 831 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE, ui::EF_NONE, ui::DomKey::ESCAPE}},
1198 ui::DomKey::OS,
1199 0},
1200 {ui::VKEY_ESCAPE,
1201 ui::DomCode::ESCAPE,
1202 ui::EF_NONE,
1203 ui::DomKey::ESCAPE,
1204 0x1B}},
1205 }; 832 };
1206 833
1207 for (const auto& test : tests) { 834 for (const auto& test : tests) {
1208 CheckKeyTestCase(&rewriter, test); 835 CheckKeyTestCase(&rewriter, test);
1209 } 836 }
1210 } 837 }
1211 838
1212 TEST_F(EventRewriterTest, TestRewriteModifiersRemapMany) { 839 TEST_F(EventRewriterTest, TestRewriteModifiersRemapMany) {
1213 // Remap Search to Alt. 840 // Remap Search to Alt.
1214 TestingPrefServiceSyncable prefs; 841 TestingPrefServiceSyncable prefs;
1215 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 842 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1216 IntegerPrefMember search; 843 IntegerPrefMember search;
1217 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); 844 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs);
1218 search.SetValue(chromeos::input_method::kAltKey); 845 search.SetValue(chromeos::input_method::kAltKey);
1219 846
1220 EventRewriter rewriter(NULL); 847 EventRewriter rewriter(NULL);
1221 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard"); 848 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
1222 rewriter.set_pref_service_for_testing(&prefs); 849 rewriter.set_pref_service_for_testing(&prefs);
1223 850
1224 KeyTestCase s2a_tests[] = { 851 KeyTestCase s2a_tests[] = {
1225 // Press Search. Confirm the event is now VKEY_MENU. 852 // Press Search. Confirm the event is now VKEY_MENU.
1226 {ui::ET_KEY_PRESSED, 853 {ui::ET_KEY_PRESSED,
1227 {ui::VKEY_LWIN, 854 {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, ui::EF_COMMAND_DOWN,
1228 ui::DomCode::OS_LEFT, 855 ui::DomKey::OS},
1229 ui::EF_COMMAND_DOWN, 856 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN,
1230 ui::DomKey::OS, 857 ui::DomKey::ALT}},
1231 0},
1232 {ui::VKEY_MENU,
1233 ui::DomCode::ALT_LEFT,
1234 ui::EF_ALT_DOWN,
1235 ui::DomKey::ALT,
1236 0}},
1237 }; 858 };
1238 859
1239 for (const auto& test : s2a_tests) { 860 for (const auto& test : s2a_tests) {
1240 CheckKeyTestCase(&rewriter, test); 861 CheckKeyTestCase(&rewriter, test);
1241 } 862 }
1242 863
1243 // Remap Alt to Control. 864 // Remap Alt to Control.
1244 IntegerPrefMember alt; 865 IntegerPrefMember alt;
1245 alt.Init(prefs::kLanguageRemapAltKeyTo, &prefs); 866 alt.Init(prefs::kLanguageRemapAltKeyTo, &prefs);
1246 alt.SetValue(chromeos::input_method::kControlKey); 867 alt.SetValue(chromeos::input_method::kControlKey);
1247 868
1248 KeyTestCase a2c_tests[] = { 869 KeyTestCase a2c_tests[] = {
1249 // Press left Alt. Confirm the event is now VKEY_CONTROL. 870 // Press left Alt. Confirm the event is now VKEY_CONTROL.
1250 {ui::ET_KEY_PRESSED, 871 {ui::ET_KEY_PRESSED,
1251 {ui::VKEY_MENU, 872 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, ui::DomKey::ALT},
1252 ui::DomCode::ALT_LEFT, 873 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
1253 ui::EF_ALT_DOWN, 874 ui::DomKey::CONTROL}},
1254 ui::DomKey::ALT,
1255 0},
1256 {ui::VKEY_CONTROL,
1257 ui::DomCode::CONTROL_LEFT,
1258 ui::EF_CONTROL_DOWN,
1259 ui::DomKey::CONTROL,
1260 0}},
1261 // Press Shift+comma. Verify that only the flags are changed. 875 // Press Shift+comma. Verify that only the flags are changed.
1262 // The X11 portion of the test addresses crbug.com/390263 by verifying 876 // The X11 portion of the test addresses crbug.com/390263 by verifying
1263 // that the X keycode remains that for ',<' and not for 105-key '<>'. 877 // that the X keycode remains that for ',<' and not for 105-key '<>'.
1264 {ui::ET_KEY_PRESSED, 878 {ui::ET_KEY_PRESSED,
1265 {ui::VKEY_OEM_COMMA, 879 {ui::VKEY_OEM_COMMA, ui::DomCode::COMMA,
1266 ui::DomCode::COMMA, 880 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::UNIDENTIFIED},
1267 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, 881 {ui::VKEY_OEM_COMMA, ui::DomCode::COMMA,
1268 ui::DomKey::UNIDENTIFIED, 882 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::UNIDENTIFIED}},
1269 0},
1270 {ui::VKEY_OEM_COMMA,
1271 ui::DomCode::COMMA,
1272 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN,
1273 ui::DomKey::UNIDENTIFIED,
1274 0}},
1275 // Press Shift+9. Verify that only the flags are changed. 883 // Press Shift+9. Verify that only the flags are changed.
1276 {ui::ET_KEY_PRESSED, 884 {ui::ET_KEY_PRESSED,
1277 {ui::VKEY_9, 885 {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
1278 ui::DomCode::DIGIT9, 886 ui::DomKey::UNIDENTIFIED},
1279 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, 887 {ui::VKEY_9, ui::DomCode::DIGIT9,
1280 ui::DomKey::UNIDENTIFIED, 888 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::UNIDENTIFIED}},
1281 0},
1282 {ui::VKEY_9,
1283 ui::DomCode::DIGIT9,
1284 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN,
1285 ui::DomKey::UNIDENTIFIED,
1286 0}},
1287 }; 889 };
1288 890
1289 for (const auto& test : a2c_tests) { 891 for (const auto& test : a2c_tests) {
1290 CheckKeyTestCase(&rewriter, test); 892 CheckKeyTestCase(&rewriter, test);
1291 } 893 }
1292 894
1293 // Remap Control to Search. 895 // Remap Control to Search.
1294 IntegerPrefMember control; 896 IntegerPrefMember control;
1295 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); 897 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs);
1296 control.SetValue(chromeos::input_method::kSearchKey); 898 control.SetValue(chromeos::input_method::kSearchKey);
1297 899
1298 KeyTestCase c2s_tests[] = { 900 KeyTestCase c2s_tests[] = {
1299 // Press left Control. Confirm the event is now VKEY_LWIN. 901 // Press left Control. Confirm the event is now VKEY_LWIN.
1300 {ui::ET_KEY_PRESSED, 902 {ui::ET_KEY_PRESSED,
1301 {ui::VKEY_CONTROL, 903 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
1302 ui::DomCode::CONTROL_LEFT, 904 ui::DomKey::CONTROL},
1303 ui::EF_CONTROL_DOWN, 905 {ui::VKEY_LWIN, ui::DomCode::OS_LEFT, ui::EF_COMMAND_DOWN,
1304 ui::DomKey::CONTROL, 906 ui::DomKey::OS}},
1305 0},
1306 {ui::VKEY_LWIN,
1307 ui::DomCode::OS_LEFT,
1308 ui::EF_COMMAND_DOWN,
1309 ui::DomKey::OS,
1310 0}},
1311 907
1312 // Then, press all of the three, Control+Alt+Search. 908 // Then, press all of the three, Control+Alt+Search.
1313 {ui::ET_KEY_PRESSED, 909 {ui::ET_KEY_PRESSED,
1314 {ui::VKEY_LWIN, 910 {ui::VKEY_LWIN, ui::DomCode::OS_LEFT,
1315 ui::DomCode::OS_LEFT,
1316 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, 911 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
1317 ui::DomKey::OS, 912 ui::DomKey::OS},
1318 0}, 913 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT,
1319 {ui::VKEY_MENU,
1320 ui::DomCode::ALT_LEFT,
1321 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, 914 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
1322 ui::DomKey::ALT, 915 ui::DomKey::ALT}},
1323 0}},
1324 916
1325 // Press Shift+Control+Alt+Search. 917 // Press Shift+Control+Alt+Search.
1326 {ui::ET_KEY_PRESSED, 918 {ui::ET_KEY_PRESSED,
1327 {ui::VKEY_LWIN, 919 {ui::VKEY_LWIN, ui::DomCode::OS_LEFT,
1328 ui::DomCode::OS_LEFT,
1329 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | 920 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
1330 ui::EF_COMMAND_DOWN, 921 ui::EF_COMMAND_DOWN,
1331 ui::DomKey::OS, 922 ui::DomKey::OS},
1332 0}, 923 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT,
1333 {ui::VKEY_MENU,
1334 ui::DomCode::ALT_LEFT,
1335 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | 924 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
1336 ui::EF_COMMAND_DOWN, 925 ui::EF_COMMAND_DOWN,
1337 ui::DomKey::ALT, 926 ui::DomKey::ALT}},
1338 0}},
1339 927
1340 // Press Shift+Control+Alt+Search+B 928 // Press Shift+Control+Alt+Search+B
1341 {ui::ET_KEY_PRESSED, 929 {ui::ET_KEY_PRESSED,
1342 {ui::VKEY_B, 930 {ui::VKEY_B, ui::DomCode::KEY_B,
1343 ui::DomCode::KEY_B,
1344 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | 931 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
1345 ui::EF_COMMAND_DOWN, 932 ui::EF_COMMAND_DOWN,
1346 ui::DomKey::CHARACTER, 933 ui::DomKey::Constant<'B'>::Character},
1347 'B'}, 934 {ui::VKEY_B, ui::DomCode::KEY_B,
1348 {ui::VKEY_B,
1349 ui::DomCode::KEY_B,
1350 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | 935 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
1351 ui::EF_COMMAND_DOWN, 936 ui::EF_COMMAND_DOWN,
1352 ui::DomKey::CHARACTER, 937 ui::DomKey::Constant<'B'>::Character}},
1353 'B'}},
1354 }; 938 };
1355 939
1356 for (const auto& test : c2s_tests) { 940 for (const auto& test : c2s_tests) {
1357 CheckKeyTestCase(&rewriter, test); 941 CheckKeyTestCase(&rewriter, test);
1358 } 942 }
1359 } 943 }
1360 944
1361 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToCapsLock) { 945 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToCapsLock) {
1362 // Remap Search to Caps Lock. 946 // Remap Search to Caps Lock.
1363 TestingPrefServiceSyncable prefs; 947 TestingPrefServiceSyncable prefs;
1364 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 948 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1365 IntegerPrefMember search; 949 IntegerPrefMember search;
1366 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); 950 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs);
1367 search.SetValue(chromeos::input_method::kCapsLockKey); 951 search.SetValue(chromeos::input_method::kCapsLockKey);
1368 952
1369 chromeos::input_method::FakeImeKeyboard ime_keyboard; 953 chromeos::input_method::FakeImeKeyboard ime_keyboard;
1370 EventRewriter rewriter(NULL); 954 EventRewriter rewriter(NULL);
1371 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard"); 955 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
1372 rewriter.set_pref_service_for_testing(&prefs); 956 rewriter.set_pref_service_for_testing(&prefs);
1373 rewriter.set_ime_keyboard_for_testing(&ime_keyboard); 957 rewriter.set_ime_keyboard_for_testing(&ime_keyboard);
1374 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); 958 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_);
1375 959
1376 // Press Search. 960 // Press Search.
1377 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL, 961 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL,
1378 ui::DomCode::CAPS_LOCK, ui::EF_MOD3_DOWN, 962 ui::DomCode::CAPS_LOCK, ui::EF_MOD3_DOWN,
1379 ui::DomKey::CAPS_LOCK, 0), 963 ui::DomKey::CAPS_LOCK),
1380 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, 964 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED,
1381 ui::VKEY_LWIN, ui::DomCode::OS_LEFT, 965 ui::VKEY_LWIN, ui::DomCode::OS_LEFT,
1382 ui::EF_COMMAND_DOWN, ui::DomKey::OS, 0)); 966 ui::EF_COMMAND_DOWN, ui::DomKey::OS));
1383 // Confirm that the Caps Lock status is changed. 967 // Confirm that the Caps Lock status is changed.
1384 EXPECT_TRUE(ime_keyboard.caps_lock_is_enabled_); 968 EXPECT_TRUE(ime_keyboard.caps_lock_is_enabled_);
1385 969
1386 // Release Search. 970 // Release Search.
1387 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL, 971 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL,
1388 ui::DomCode::CAPS_LOCK, ui::EF_NONE, 972 ui::DomCode::CAPS_LOCK, ui::EF_NONE,
1389 ui::DomKey::CAPS_LOCK, 0), 973 ui::DomKey::CAPS_LOCK),
1390 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_RELEASED, 974 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_RELEASED,
1391 ui::VKEY_LWIN, ui::DomCode::OS_LEFT, 975 ui::VKEY_LWIN, ui::DomCode::OS_LEFT,
1392 ui::EF_NONE, ui::DomKey::OS, 0)); 976 ui::EF_NONE, ui::DomKey::OS));
1393 // Confirm that the Caps Lock status is not changed. 977 // Confirm that the Caps Lock status is not changed.
1394 EXPECT_TRUE(ime_keyboard.caps_lock_is_enabled_); 978 EXPECT_TRUE(ime_keyboard.caps_lock_is_enabled_);
1395 979
1396 // Press Search. 980 // Press Search.
1397 EXPECT_EQ( 981 EXPECT_EQ(
1398 GetExpectedResultAsString( 982 GetExpectedResultAsString(
1399 ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK, 983 ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
1400 ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN, ui::DomKey::CAPS_LOCK, 0), 984 ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN, ui::DomKey::CAPS_LOCK),
1401 GetRewrittenEventAsString( 985 GetRewrittenEventAsString(
1402 &rewriter, ui::ET_KEY_PRESSED, ui::VKEY_LWIN, ui::DomCode::OS_LEFT, 986 &rewriter, ui::ET_KEY_PRESSED, ui::VKEY_LWIN, ui::DomCode::OS_LEFT,
1403 ui::EF_COMMAND_DOWN | ui::EF_CAPS_LOCK_DOWN, ui::DomKey::OS, 0)); 987 ui::EF_COMMAND_DOWN | ui::EF_CAPS_LOCK_DOWN, ui::DomKey::OS));
1404 // Confirm that the Caps Lock status is changed. 988 // Confirm that the Caps Lock status is changed.
1405 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); 989 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_);
1406 990
1407 // Release Search. 991 // Release Search.
1408 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL, 992 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL,
1409 ui::DomCode::CAPS_LOCK, ui::EF_NONE, 993 ui::DomCode::CAPS_LOCK, ui::EF_NONE,
1410 ui::DomKey::CAPS_LOCK, 0), 994 ui::DomKey::CAPS_LOCK),
1411 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_RELEASED, 995 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_RELEASED,
1412 ui::VKEY_LWIN, ui::DomCode::OS_LEFT, 996 ui::VKEY_LWIN, ui::DomCode::OS_LEFT,
1413 ui::EF_NONE, ui::DomKey::OS, 0)); 997 ui::EF_NONE, ui::DomKey::OS));
1414 // Confirm that the Caps Lock status is not changed. 998 // Confirm that the Caps Lock status is not changed.
1415 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); 999 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_);
1416 1000
1417 // Press Caps Lock (on an external keyboard). 1001 // Press Caps Lock (on an external keyboard).
1418 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL, 1002 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL,
1419 ui::DomCode::CAPS_LOCK, 1003 ui::DomCode::CAPS_LOCK,
1420 ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN, 1004 ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN,
1421 ui::DomKey::CAPS_LOCK, 0), 1005 ui::DomKey::CAPS_LOCK),
1422 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, 1006 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED,
1423 ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK, 1007 ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
1424 ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN, 1008 ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN,
1425 ui::DomKey::CAPS_LOCK, 0)); 1009 ui::DomKey::CAPS_LOCK));
1426 1010
1427 #if defined(USE_X11) 1011 #if defined(USE_X11)
1428 // Confirm that calling RewriteForTesting() does not change the state of 1012 // Confirm that calling RewriteForTesting() does not change the state of
1429 // |ime_keyboard|. In this case, X Window system itself should change the 1013 // |ime_keyboard|. In this case, X Window system itself should change the
1430 // Caps Lock state, not ash::EventRewriter. 1014 // Caps Lock state, not ash::EventRewriter.
1431 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); 1015 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_);
1432 #elif defined(USE_OZONE) 1016 #elif defined(USE_OZONE)
1433 // Under Ozone the rewriter is responsible for changing the caps lock 1017 // Under Ozone the rewriter is responsible for changing the caps lock
1434 // state when the final key is Caps Lock, regardless of whether the 1018 // state when the final key is Caps Lock, regardless of whether the
1435 // initial key is Caps Lock. 1019 // initial key is Caps Lock.
1436 EXPECT_TRUE(ime_keyboard.caps_lock_is_enabled_); 1020 EXPECT_TRUE(ime_keyboard.caps_lock_is_enabled_);
1437 #endif 1021 #endif
1438 1022
1439 // Release Caps Lock (on an external keyboard). 1023 // Release Caps Lock (on an external keyboard).
1440 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL, 1024 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL,
1441 ui::DomCode::CAPS_LOCK, ui::EF_NONE, 1025 ui::DomCode::CAPS_LOCK, ui::EF_NONE,
1442 ui::DomKey::CAPS_LOCK, 0), 1026 ui::DomKey::CAPS_LOCK),
1443 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_RELEASED, 1027 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_RELEASED,
1444 ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK, 1028 ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
1445 ui::EF_NONE, ui::DomKey::CAPS_LOCK, 0)); 1029 ui::EF_NONE, ui::DomKey::CAPS_LOCK));
1446 #if defined(USE_X11) 1030 #if defined(USE_X11)
1447 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); 1031 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_);
1448 #elif defined(USE_OZONE) 1032 #elif defined(USE_OZONE)
1449 EXPECT_TRUE(ime_keyboard.caps_lock_is_enabled_); 1033 EXPECT_TRUE(ime_keyboard.caps_lock_is_enabled_);
1450 #endif 1034 #endif
1451 } 1035 }
1452 1036
1453 TEST_F(EventRewriterTest, TestRewriteCapsLock) { 1037 TEST_F(EventRewriterTest, TestRewriteCapsLock) {
1454 TestingPrefServiceSyncable prefs; 1038 TestingPrefServiceSyncable prefs;
1455 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1039 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1456 1040
1457 chromeos::input_method::FakeImeKeyboard ime_keyboard; 1041 chromeos::input_method::FakeImeKeyboard ime_keyboard;
1458 EventRewriter rewriter(NULL); 1042 EventRewriter rewriter(NULL);
1459 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard"); 1043 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
1460 rewriter.set_pref_service_for_testing(&prefs); 1044 rewriter.set_pref_service_for_testing(&prefs);
1461 rewriter.set_ime_keyboard_for_testing(&ime_keyboard); 1045 rewriter.set_ime_keyboard_for_testing(&ime_keyboard);
1462 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); 1046 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_);
1463 1047
1464 // On Chrome OS, CapsLock is mapped to F16 with Mod3Mask. 1048 // On Chrome OS, CapsLock is mapped to F16 with Mod3Mask.
1465 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL, 1049 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL,
1466 ui::DomCode::CAPS_LOCK, 1050 ui::DomCode::CAPS_LOCK,
1467 ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN, 1051 ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN,
1468 ui::DomKey::CAPS_LOCK, 0), 1052 ui::DomKey::CAPS_LOCK),
1469 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, 1053 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED,
1470 ui::VKEY_F16, ui::DomCode::F16, 1054 ui::VKEY_F16, ui::DomCode::F16,
1471 ui::EF_MOD3_DOWN, ui::DomKey::F16, 0)); 1055 ui::EF_MOD3_DOWN, ui::DomKey::F16));
1472 EXPECT_TRUE(ime_keyboard.caps_lock_is_enabled_); 1056 EXPECT_TRUE(ime_keyboard.caps_lock_is_enabled_);
1473 } 1057 }
1474 1058
1475 TEST_F(EventRewriterTest, TestRewriteDiamondKey) { 1059 TEST_F(EventRewriterTest, TestRewriteDiamondKey) {
1476 TestingPrefServiceSyncable prefs; 1060 TestingPrefServiceSyncable prefs;
1477 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1061 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1478 1062
1479 chromeos::input_method::FakeImeKeyboard ime_keyboard; 1063 chromeos::input_method::FakeImeKeyboard ime_keyboard;
1480 EventRewriter rewriter(NULL); 1064 EventRewriter rewriter(NULL);
1481 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard"); 1065 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
1482 rewriter.set_pref_service_for_testing(&prefs); 1066 rewriter.set_pref_service_for_testing(&prefs);
1483 rewriter.set_ime_keyboard_for_testing(&ime_keyboard); 1067 rewriter.set_ime_keyboard_for_testing(&ime_keyboard);
1484 1068
1485 KeyTestCase tests[] = { 1069 KeyTestCase tests[] = {
1486 // F15 should work as Ctrl when --has-chromeos-diamond-key is not 1070 // F15 should work as Ctrl when --has-chromeos-diamond-key is not
1487 // specified. 1071 // specified.
1488 {ui::ET_KEY_PRESSED, 1072 {ui::ET_KEY_PRESSED,
1489 {ui::VKEY_F15, ui::DomCode::F15, ui::EF_NONE, ui::DomKey::F15, 0}, 1073 {ui::VKEY_F15, ui::DomCode::F15, ui::EF_NONE, ui::DomKey::F15},
1490 {ui::VKEY_CONTROL, 1074 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
1491 ui::DomCode::CONTROL_LEFT, 1075 ui::DomKey::CONTROL}},
1492 ui::EF_CONTROL_DOWN,
1493 ui::DomKey::CONTROL,
1494 0}},
1495 1076
1496 {ui::ET_KEY_RELEASED, 1077 {ui::ET_KEY_RELEASED,
1497 {ui::VKEY_F15, ui::DomCode::F15, ui::EF_NONE, ui::DomKey::F15, 0}, 1078 {ui::VKEY_F15, ui::DomCode::F15, ui::EF_NONE, ui::DomKey::F15},
1498 {ui::VKEY_CONTROL, 1079 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_NONE,
1499 ui::DomCode::CONTROL_LEFT, 1080 ui::DomKey::CONTROL}},
1500 ui::EF_NONE,
1501 ui::DomKey::CONTROL,
1502 0}},
1503 1081
1504 // However, Mod2Mask should not be rewritten to CtrlMask when 1082 // However, Mod2Mask should not be rewritten to CtrlMask when
1505 // --has-chromeos-diamond-key is not specified. 1083 // --has-chromeos-diamond-key is not specified.
1506 {ui::ET_KEY_PRESSED, 1084 {ui::ET_KEY_PRESSED,
1507 {ui::VKEY_A, 1085 {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_NONE,
1508 ui::DomCode::KEY_A, 1086 ui::DomKey::Constant<'a'>::Character},
1509 ui::EF_NONE, 1087 {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_NONE,
1510 ui::DomKey::CHARACTER, 1088 ui::DomKey::Constant<'a'>::Character}},
1511 'a'},
1512 {ui::VKEY_A,
1513 ui::DomCode::KEY_A,
1514 ui::EF_NONE,
1515 ui::DomKey::CHARACTER,
1516 'a'}},
1517 }; 1089 };
1518 1090
1519 for (const auto& test : tests) { 1091 for (const auto& test : tests) {
1520 CheckKeyTestCase(&rewriter, test); 1092 CheckKeyTestCase(&rewriter, test);
1521 } 1093 }
1522 } 1094 }
1523 1095
1524 TEST_F(EventRewriterTest, TestRewriteDiamondKeyWithFlag) { 1096 TEST_F(EventRewriterTest, TestRewriteDiamondKeyWithFlag) {
1525 const base::CommandLine original_cl(*base::CommandLine::ForCurrentProcess()); 1097 const base::CommandLine original_cl(*base::CommandLine::ForCurrentProcess());
1526 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( 1098 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
1527 chromeos::switches::kHasChromeOSDiamondKey, ""); 1099 chromeos::switches::kHasChromeOSDiamondKey, "");
1528 1100
1529 TestingPrefServiceSyncable prefs; 1101 TestingPrefServiceSyncable prefs;
1530 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1102 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1531 1103
1532 chromeos::input_method::FakeImeKeyboard ime_keyboard; 1104 chromeos::input_method::FakeImeKeyboard ime_keyboard;
1533 EventRewriter rewriter(NULL); 1105 EventRewriter rewriter(NULL);
1534 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard"); 1106 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
1535 rewriter.set_pref_service_for_testing(&prefs); 1107 rewriter.set_pref_service_for_testing(&prefs);
1536 rewriter.set_ime_keyboard_for_testing(&ime_keyboard); 1108 rewriter.set_ime_keyboard_for_testing(&ime_keyboard);
1537 1109
1538 // By default, F15 should work as Control. 1110 // By default, F15 should work as Control.
1539 EXPECT_EQ(GetExpectedResultAsString( 1111 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL,
1540 ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, 1112 ui::DomCode::CONTROL_LEFT,
1541 ui::EF_CONTROL_DOWN, ui::DomKey::CONTROL, 0), 1113 ui::EF_CONTROL_DOWN, ui::DomKey::CONTROL),
1542 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, 1114 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED,
1543 ui::VKEY_F15, ui::DomCode::F15, 1115 ui::VKEY_F15, ui::DomCode::F15,
1544 ui::EF_NONE, ui::DomKey::F15, 0)); 1116 ui::EF_NONE, ui::DomKey::F15));
1545 // Check that Control is applied to a subsequent key press. 1117 // Check that Control is applied to a subsequent key press.
1546 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A, 1118 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A,
1547 ui::DomCode::KEY_A, ui::EF_CONTROL_DOWN, 1119 ui::DomCode::KEY_A, ui::EF_CONTROL_DOWN,
1548 ui::DomKey::CHARACTER, 0x01), 1120 ui::DomKey::Constant<0x01>::Character),
1549 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_A, 1121 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_A,
1550 ui::DomCode::KEY_A, ui::EF_NONE, 1122 ui::DomCode::KEY_A, ui::EF_NONE,
1551 ui::DomKey::CHARACTER, 'a')); 1123 ui::DomKey::Constant<'a'>::Character));
1552 // Release F15 1124 // Release F15
1553 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CONTROL, 1125 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CONTROL,
1554 ui::DomCode::CONTROL_LEFT, ui::EF_NONE, 1126 ui::DomCode::CONTROL_LEFT, ui::EF_NONE,
1555 ui::DomKey::CONTROL, 0), 1127 ui::DomKey::CONTROL),
1556 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_RELEASED, 1128 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_RELEASED,
1557 ui::VKEY_F15, ui::DomCode::F15, 1129 ui::VKEY_F15, ui::DomCode::F15,
1558 ui::EF_NONE, ui::DomKey::F15, 0)); 1130 ui::EF_NONE, ui::DomKey::F15));
1559 // Check that Control is no longer applied to a subsequent key press. 1131 // Check that Control is no longer applied to a subsequent key press.
1560 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A, 1132 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A,
1561 ui::DomCode::KEY_A, ui::EF_NONE, 1133 ui::DomCode::KEY_A, ui::EF_NONE,
1562 ui::DomKey::CHARACTER, 'a'), 1134 ui::DomKey::Constant<'a'>::Character),
1563 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_A, 1135 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_A,
1564 ui::DomCode::KEY_A, ui::EF_NONE, 1136 ui::DomCode::KEY_A, ui::EF_NONE,
1565 ui::DomKey::CHARACTER, 'a')); 1137 ui::DomKey::Constant<'a'>::Character));
1566 1138
1567 IntegerPrefMember diamond; 1139 IntegerPrefMember diamond;
1568 diamond.Init(prefs::kLanguageRemapDiamondKeyTo, &prefs); 1140 diamond.Init(prefs::kLanguageRemapDiamondKeyTo, &prefs);
1569 diamond.SetValue(chromeos::input_method::kVoidKey); 1141 diamond.SetValue(chromeos::input_method::kVoidKey);
1570 1142
1571 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_UNKNOWN, 1143 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_UNKNOWN,
1572 ui::DomCode::NONE, ui::EF_NONE, 1144 ui::DomCode::NONE, ui::EF_NONE,
1573 ui::DomKey::UNIDENTIFIED, 0), 1145 ui::DomKey::UNIDENTIFIED),
1574 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, 1146 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED,
1575 ui::VKEY_F15, ui::DomCode::F15, 1147 ui::VKEY_F15, ui::DomCode::F15,
1576 ui::EF_NONE, ui::DomKey::F15, 0)); 1148 ui::EF_NONE, ui::DomKey::F15));
1577 // Check that no modifier is applied to another key. 1149 // Check that no modifier is applied to another key.
1578 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A, 1150 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A,
1579 ui::DomCode::KEY_A, ui::EF_NONE, 1151 ui::DomCode::KEY_A, ui::EF_NONE,
1580 ui::DomKey::CHARACTER, 'a'), 1152 ui::DomKey::Constant<'a'>::Character),
1581 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_A, 1153 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_A,
1582 ui::DomCode::KEY_A, ui::EF_NONE, 1154 ui::DomCode::KEY_A, ui::EF_NONE,
1583 ui::DomKey::CHARACTER, 'a')); 1155 ui::DomKey::Constant<'a'>::Character));
1584 1156
1585 diamond.SetValue(chromeos::input_method::kControlKey); 1157 diamond.SetValue(chromeos::input_method::kControlKey);
1586 1158
1587 EXPECT_EQ(GetExpectedResultAsString( 1159 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL,
1588 ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, 1160 ui::DomCode::CONTROL_LEFT,
1589 ui::EF_CONTROL_DOWN, ui::DomKey::CONTROL, 0), 1161 ui::EF_CONTROL_DOWN, ui::DomKey::CONTROL),
1590 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, 1162 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED,
1591 ui::VKEY_F15, ui::DomCode::F15, 1163 ui::VKEY_F15, ui::DomCode::F15,
1592 ui::EF_NONE, ui::DomKey::F15, 0)); 1164 ui::EF_NONE, ui::DomKey::F15));
1593 // Check that Control is applied to a subsequent key press. 1165 // Check that Control is applied to a subsequent key press.
1594 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A, 1166 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A,
1595 ui::DomCode::KEY_A, ui::EF_CONTROL_DOWN, 1167 ui::DomCode::KEY_A, ui::EF_CONTROL_DOWN,
1596 ui::DomKey::CHARACTER, 0x01), 1168 ui::DomKey::Constant<0x01>::Character),
1597 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_A, 1169 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_A,
1598 ui::DomCode::KEY_A, ui::EF_NONE, 1170 ui::DomCode::KEY_A, ui::EF_NONE,
1599 ui::DomKey::CHARACTER, 'a')); 1171 ui::DomKey::Constant<'a'>::Character));
1600 // Release F15 1172 // Release F15
1601 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CONTROL, 1173 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CONTROL,
1602 ui::DomCode::CONTROL_LEFT, ui::EF_NONE, 1174 ui::DomCode::CONTROL_LEFT, ui::EF_NONE,
1603 ui::DomKey::CONTROL, 0), 1175 ui::DomKey::CONTROL),
1604 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_RELEASED, 1176 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_RELEASED,
1605 ui::VKEY_F15, ui::DomCode::F15, 1177 ui::VKEY_F15, ui::DomCode::F15,
1606 ui::EF_NONE, ui::DomKey::F15, 0)); 1178 ui::EF_NONE, ui::DomKey::F15));
1607 // Check that Control is no longer applied to a subsequent key press. 1179 // Check that Control is no longer applied to a subsequent key press.
1608 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A, 1180 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A,
1609 ui::DomCode::KEY_A, ui::EF_NONE, 1181 ui::DomCode::KEY_A, ui::EF_NONE,
1610 ui::DomKey::CHARACTER, 'a'), 1182 ui::DomKey::Constant<'a'>::Character),
1611 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_A, 1183 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_A,
1612 ui::DomCode::KEY_A, ui::EF_NONE, 1184 ui::DomCode::KEY_A, ui::EF_NONE,
1613 ui::DomKey::CHARACTER, 'a')); 1185 ui::DomKey::Constant<'a'>::Character));
1614 1186
1615 diamond.SetValue(chromeos::input_method::kAltKey); 1187 diamond.SetValue(chromeos::input_method::kAltKey);
1616 1188
1617 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_MENU, 1189 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_MENU,
1618 ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, 1190 ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN,
1619 ui::DomKey::ALT, 0), 1191 ui::DomKey::ALT),
1620 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, 1192 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED,
1621 ui::VKEY_F15, ui::DomCode::F15, 1193 ui::VKEY_F15, ui::DomCode::F15,
1622 ui::EF_NONE, ui::DomKey::F15, 0)); 1194 ui::EF_NONE, ui::DomKey::F15));
1623 // Check that Alt is applied to a subsequent key press. 1195 // Check that Alt is applied to a subsequent key press.
1624 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A, 1196 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A,
1625 ui::DomCode::KEY_A, ui::EF_ALT_DOWN, 1197 ui::DomCode::KEY_A, ui::EF_ALT_DOWN,
1626 ui::DomKey::CHARACTER, 'a'), 1198 ui::DomKey::Constant<'a'>::Character),
1627 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_A, 1199 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_A,
1628 ui::DomCode::KEY_A, ui::EF_NONE, 1200 ui::DomCode::KEY_A, ui::EF_NONE,
1629 ui::DomKey::CHARACTER, 'a')); 1201 ui::DomKey::Constant<'a'>::Character));
1630 // Release F15 1202 // Release F15
1631 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_MENU, 1203 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_MENU,
1632 ui::DomCode::ALT_LEFT, ui::EF_NONE, 1204 ui::DomCode::ALT_LEFT, ui::EF_NONE,
1633 ui::DomKey::ALT, 0), 1205 ui::DomKey::ALT),
1634 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_RELEASED, 1206 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_RELEASED,
1635 ui::VKEY_F15, ui::DomCode::F15, 1207 ui::VKEY_F15, ui::DomCode::F15,
1636 ui::EF_NONE, ui::DomKey::F15, 0)); 1208 ui::EF_NONE, ui::DomKey::F15));
1637 // Check that Alt is no longer applied to a subsequent key press. 1209 // Check that Alt is no longer applied to a subsequent key press.
1638 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A, 1210 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A,
1639 ui::DomCode::KEY_A, ui::EF_NONE, 1211 ui::DomCode::KEY_A, ui::EF_NONE,
1640 ui::DomKey::CHARACTER, 'a'), 1212 ui::DomKey::Constant<'a'>::Character),
1641 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_A, 1213 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_A,
1642 ui::DomCode::KEY_A, ui::EF_NONE, 1214 ui::DomCode::KEY_A, ui::EF_NONE,
1643 ui::DomKey::CHARACTER, 'a')); 1215 ui::DomKey::Constant<'a'>::Character));
1644 1216
1645 diamond.SetValue(chromeos::input_method::kCapsLockKey); 1217 diamond.SetValue(chromeos::input_method::kCapsLockKey);
1646 1218
1647 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL, 1219 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL,
1648 ui::DomCode::CAPS_LOCK, 1220 ui::DomCode::CAPS_LOCK,
1649 ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN, 1221 ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN,
1650 ui::DomKey::CAPS_LOCK, 0), 1222 ui::DomKey::CAPS_LOCK),
1651 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, 1223 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED,
1652 ui::VKEY_F15, ui::DomCode::F15, 1224 ui::VKEY_F15, ui::DomCode::F15,
1653 ui::EF_NONE, ui::DomKey::F15, 0)); 1225 ui::EF_NONE, ui::DomKey::F15));
1654 // Check that Caps is applied to a subsequent key press. 1226 // Check that Caps is applied to a subsequent key press.
1655 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A, 1227 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A,
1656 ui::DomCode::KEY_A, 1228 ui::DomCode::KEY_A,
1657 ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN, 1229 ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN,
1658 ui::DomKey::CHARACTER, 'A'), 1230 ui::DomKey::Constant<'A'>::Character),
1659 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_A, 1231 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_A,
1660 ui::DomCode::KEY_A, ui::EF_NONE, 1232 ui::DomCode::KEY_A, ui::EF_NONE,
1661 ui::DomKey::CHARACTER, 'a')); 1233 ui::DomKey::Constant<'a'>::Character));
1662 // Release F15 1234 // Release F15
1663 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL, 1235 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL,
1664 ui::DomCode::CAPS_LOCK, ui::EF_NONE, 1236 ui::DomCode::CAPS_LOCK, ui::EF_NONE,
1665 ui::DomKey::CAPS_LOCK, 0), 1237 ui::DomKey::CAPS_LOCK),
1666 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_RELEASED, 1238 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_RELEASED,
1667 ui::VKEY_F15, ui::DomCode::F15, 1239 ui::VKEY_F15, ui::DomCode::F15,
1668 ui::EF_NONE, ui::DomKey::F15, 0)); 1240 ui::EF_NONE, ui::DomKey::F15));
1669 // Check that Control is no longer applied to a subsequent key press. 1241 // Check that Control is no longer applied to a subsequent key press.
1670 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A, 1242 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A,
1671 ui::DomCode::KEY_A, ui::EF_NONE, 1243 ui::DomCode::KEY_A, ui::EF_NONE,
1672 ui::DomKey::CHARACTER, 'a'), 1244 ui::DomKey::Constant<'a'>::Character),
1673 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_A, 1245 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_A,
1674 ui::DomCode::KEY_A, ui::EF_NONE, 1246 ui::DomCode::KEY_A, ui::EF_NONE,
1675 ui::DomKey::CHARACTER, 'a')); 1247 ui::DomKey::Constant<'a'>::Character));
1676 1248
1677 *base::CommandLine::ForCurrentProcess() = original_cl; 1249 *base::CommandLine::ForCurrentProcess() = original_cl;
1678 } 1250 }
1679 1251
1680 TEST_F(EventRewriterTest, TestRewriteCapsLockToControl) { 1252 TEST_F(EventRewriterTest, TestRewriteCapsLockToControl) {
1681 // Remap CapsLock to Control. 1253 // Remap CapsLock to Control.
1682 TestingPrefServiceSyncable prefs; 1254 TestingPrefServiceSyncable prefs;
1683 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1255 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1684 IntegerPrefMember control; 1256 IntegerPrefMember control;
1685 control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs); 1257 control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs);
1686 control.SetValue(chromeos::input_method::kControlKey); 1258 control.SetValue(chromeos::input_method::kControlKey);
1687 1259
1688 EventRewriter rewriter(NULL); 1260 EventRewriter rewriter(NULL);
1689 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard"); 1261 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
1690 rewriter.set_pref_service_for_testing(&prefs); 1262 rewriter.set_pref_service_for_testing(&prefs);
1691 1263
1692 KeyTestCase tests[] = { 1264 KeyTestCase tests[] = {
1693 // Press CapsLock+a. Confirm that Mod3Mask is rewritten to ControlMask. 1265 // Press CapsLock+a. Confirm that Mod3Mask is rewritten to ControlMask.
1694 // On Chrome OS, CapsLock works as a Mod3 modifier. 1266 // On Chrome OS, CapsLock works as a Mod3 modifier.
1695 {ui::ET_KEY_PRESSED, 1267 {ui::ET_KEY_PRESSED,
1696 {ui::VKEY_A, 1268 {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_MOD3_DOWN,
1697 ui::DomCode::KEY_A, 1269 ui::DomKey::Constant<'a'>::Character},
1698 ui::EF_MOD3_DOWN, 1270 {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_CONTROL_DOWN,
1699 ui::DomKey::CHARACTER, 1271 ui::DomKey::Constant<0x01>::Character}},
1700 'a'},
1701 {ui::VKEY_A,
1702 ui::DomCode::KEY_A,
1703 ui::EF_CONTROL_DOWN,
1704 ui::DomKey::CHARACTER,
1705 0x01}},
1706 1272
1707 // Press Control+CapsLock+a. Confirm that Mod3Mask is rewritten to 1273 // Press Control+CapsLock+a. Confirm that Mod3Mask is rewritten to
1708 // ControlMask 1274 // ControlMask
1709 {ui::ET_KEY_PRESSED, 1275 {ui::ET_KEY_PRESSED,
1710 {ui::VKEY_A, 1276 {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_CONTROL_DOWN | ui::EF_MOD3_DOWN,
1711 ui::DomCode::KEY_A, 1277 ui::DomKey::Constant<'a'>::Character},
1712 ui::EF_CONTROL_DOWN | ui::EF_MOD3_DOWN, 1278 {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_CONTROL_DOWN,
1713 ui::DomKey::CHARACTER, 1279 ui::DomKey::Constant<0x01>::Character}},
1714 'a'},
1715 {ui::VKEY_A,
1716 ui::DomCode::KEY_A,
1717 ui::EF_CONTROL_DOWN,
1718 ui::DomKey::CHARACTER,
1719 0x01}},
1720 1280
1721 // Press Alt+CapsLock+a. Confirm that Mod3Mask is rewritten to 1281 // Press Alt+CapsLock+a. Confirm that Mod3Mask is rewritten to
1722 // ControlMask. 1282 // ControlMask.
1723 {ui::ET_KEY_PRESSED, 1283 {ui::ET_KEY_PRESSED,
1724 {ui::VKEY_A, 1284 {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_ALT_DOWN | ui::EF_MOD3_DOWN,
1725 ui::DomCode::KEY_A, 1285 ui::DomKey::Constant<'a'>::Character},
1726 ui::EF_ALT_DOWN | ui::EF_MOD3_DOWN, 1286 {ui::VKEY_A, ui::DomCode::KEY_A, ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
1727 ui::DomKey::CHARACTER, 1287 ui::DomKey::Constant<0x01>::Character}},
1728 'a'},
1729 {ui::VKEY_A,
1730 ui::DomCode::KEY_A,
1731 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
1732 ui::DomKey::CHARACTER,
1733 0x01}},
1734 }; 1288 };
1735 1289
1736 for (const auto& test : tests) { 1290 for (const auto& test : tests) {
1737 CheckKeyTestCase(&rewriter, test); 1291 CheckKeyTestCase(&rewriter, test);
1738 } 1292 }
1739 } 1293 }
1740 1294
1741 TEST_F(EventRewriterTest, TestRewriteCapsLockMod3InUse) { 1295 TEST_F(EventRewriterTest, TestRewriteCapsLockMod3InUse) {
1742 // Remap CapsLock to Control. 1296 // Remap CapsLock to Control.
1743 TestingPrefServiceSyncable prefs; 1297 TestingPrefServiceSyncable prefs;
1744 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1298 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1745 IntegerPrefMember control; 1299 IntegerPrefMember control;
1746 control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs); 1300 control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs);
1747 control.SetValue(chromeos::input_method::kControlKey); 1301 control.SetValue(chromeos::input_method::kControlKey);
1748 1302
1749 EventRewriter rewriter(NULL); 1303 EventRewriter rewriter(NULL);
1750 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard"); 1304 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
1751 rewriter.set_pref_service_for_testing(&prefs); 1305 rewriter.set_pref_service_for_testing(&prefs);
1752 input_method_manager_mock_->set_mod3_used(true); 1306 input_method_manager_mock_->set_mod3_used(true);
1753 1307
1754 // Press CapsLock+a. Confirm that Mod3Mask is NOT rewritten to ControlMask 1308 // Press CapsLock+a. Confirm that Mod3Mask is NOT rewritten to ControlMask
1755 // when Mod3Mask is already in use by the current XKB layout. 1309 // when Mod3Mask is already in use by the current XKB layout.
1756 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A, 1310 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A,
1757 ui::DomCode::KEY_A, ui::EF_NONE, 1311 ui::DomCode::KEY_A, ui::EF_NONE,
1758 ui::DomKey::CHARACTER, 'a'), 1312 ui::DomKey::Constant<'a'>::Character),
1759 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_A, 1313 GetRewrittenEventAsString(&rewriter, ui::ET_KEY_PRESSED, ui::VKEY_A,
1760 ui::DomCode::KEY_A, ui::EF_NONE, 1314 ui::DomCode::KEY_A, ui::EF_NONE,
1761 ui::DomKey::CHARACTER, 'a')); 1315 ui::DomKey::Constant<'a'>::Character));
1762 1316
1763 input_method_manager_mock_->set_mod3_used(false); 1317 input_method_manager_mock_->set_mod3_used(false);
1764 } 1318 }
1765 1319
1766 TEST_F(EventRewriterTest, TestRewriteExtendedKeys) { 1320 TEST_F(EventRewriterTest, TestRewriteExtendedKeys) {
1767 TestingPrefServiceSyncable prefs; 1321 TestingPrefServiceSyncable prefs;
1768 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1322 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1769 EventRewriter rewriter(NULL); 1323 EventRewriter rewriter(NULL);
1770 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard"); 1324 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
1771 rewriter.set_last_keyboard_device_id_for_testing(kKeyboardDeviceId); 1325 rewriter.set_last_keyboard_device_id_for_testing(kKeyboardDeviceId);
1772 rewriter.set_pref_service_for_testing(&prefs); 1326 rewriter.set_pref_service_for_testing(&prefs);
1773 1327
1774 KeyTestCase tests[] = { 1328 KeyTestCase tests[] = {
1775 // Alt+Backspace -> Delete 1329 // Alt+Backspace -> Delete
1776 {ui::ET_KEY_PRESSED, 1330 {ui::ET_KEY_PRESSED,
1777 {ui::VKEY_BACK, 1331 {ui::VKEY_BACK, ui::DomCode::BACKSPACE, ui::EF_ALT_DOWN,
1778 ui::DomCode::BACKSPACE, 1332 ui::DomKey::BACKSPACE},
1779 ui::EF_ALT_DOWN, 1333 {ui::VKEY_DELETE, ui::DomCode::DEL, ui::EF_NONE, ui::DomKey::DEL}},
1780 ui::DomKey::BACKSPACE,
1781 '\b'},
1782 {ui::VKEY_DELETE, ui::DomCode::DEL, ui::EF_NONE, ui::DomKey::DEL, 0x7F}},
1783 // Control+Alt+Backspace -> Control+Delete 1334 // Control+Alt+Backspace -> Control+Delete
1784 {ui::ET_KEY_PRESSED, 1335 {ui::ET_KEY_PRESSED,
1785 {ui::VKEY_BACK, 1336 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
1786 ui::DomCode::BACKSPACE, 1337 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::BACKSPACE},
1787 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, 1338 {ui::VKEY_DELETE, ui::DomCode::DEL, ui::EF_CONTROL_DOWN,
1788 ui::DomKey::BACKSPACE, 1339 ui::DomKey::DEL}},
1789 '\b'},
1790 {ui::VKEY_DELETE,
1791 ui::DomCode::DEL,
1792 ui::EF_CONTROL_DOWN,
1793 ui::DomKey::DEL,
1794 0x7F}},
1795 // Search+Alt+Backspace -> Alt+Backspace 1340 // Search+Alt+Backspace -> Alt+Backspace
1796 {ui::ET_KEY_PRESSED, 1341 {ui::ET_KEY_PRESSED,
1797 {ui::VKEY_BACK, 1342 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
1798 ui::DomCode::BACKSPACE, 1343 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::BACKSPACE},
1799 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, 1344 {ui::VKEY_BACK, ui::DomCode::BACKSPACE, ui::EF_ALT_DOWN,
1800 ui::DomKey::BACKSPACE, 1345 ui::DomKey::BACKSPACE}},
1801 '\b'},
1802 {ui::VKEY_BACK,
1803 ui::DomCode::BACKSPACE,
1804 ui::EF_ALT_DOWN,
1805 ui::DomKey::BACKSPACE,
1806 '\b'}},
1807 // Search+Control+Alt+Backspace -> Control+Alt+Backspace 1346 // Search+Control+Alt+Backspace -> Control+Alt+Backspace
1808 {ui::ET_KEY_PRESSED, 1347 {ui::ET_KEY_PRESSED,
1809 {ui::VKEY_BACK, 1348 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
1810 ui::DomCode::BACKSPACE,
1811 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, 1349 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
1812 ui::DomKey::BACKSPACE, 1350 ui::DomKey::BACKSPACE},
1813 '\b'}, 1351 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
1814 {ui::VKEY_BACK, 1352 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::BACKSPACE}},
1815 ui::DomCode::BACKSPACE,
1816 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
1817 ui::DomKey::BACKSPACE,
1818 '\b'}},
1819 // Alt+Up -> Prior 1353 // Alt+Up -> Prior
1820 {ui::ET_KEY_PRESSED, 1354 {ui::ET_KEY_PRESSED,
1821 {ui::VKEY_UP, 1355 {ui::VKEY_UP, ui::DomCode::ARROW_UP, ui::EF_ALT_DOWN,
1822 ui::DomCode::ARROW_UP, 1356 ui::DomKey::ARROW_UP},
1823 ui::EF_ALT_DOWN, 1357 {ui::VKEY_PRIOR, ui::DomCode::PAGE_UP, ui::EF_NONE,
1824 ui::DomKey::ARROW_UP, 1358 ui::DomKey::PAGE_UP}},
1825 0},
1826 {ui::VKEY_PRIOR,
1827 ui::DomCode::PAGE_UP,
1828 ui::EF_NONE,
1829 ui::DomKey::PAGE_UP,
1830 0}},
1831 // Alt+Down -> Next 1359 // Alt+Down -> Next
1832 {ui::ET_KEY_PRESSED, 1360 {ui::ET_KEY_PRESSED,
1833 {ui::VKEY_DOWN, 1361 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN, ui::EF_ALT_DOWN,
1834 ui::DomCode::ARROW_DOWN, 1362 ui::DomKey::ARROW_DOWN},
1835 ui::EF_ALT_DOWN, 1363 {ui::VKEY_NEXT, ui::DomCode::PAGE_DOWN, ui::EF_NONE,
1836 ui::DomKey::ARROW_DOWN, 1364 ui::DomKey::PAGE_DOWN}},
1837 0},
1838 {ui::VKEY_NEXT,
1839 ui::DomCode::PAGE_DOWN,
1840 ui::EF_NONE,
1841 ui::DomKey::PAGE_DOWN,
1842 0}},
1843 // Ctrl+Alt+Up -> Home 1365 // Ctrl+Alt+Up -> Home
1844 {ui::ET_KEY_PRESSED, 1366 {ui::ET_KEY_PRESSED,
1845 {ui::VKEY_UP, 1367 {ui::VKEY_UP, ui::DomCode::ARROW_UP,
1846 ui::DomCode::ARROW_UP, 1368 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_UP},
1847 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, 1369 {ui::VKEY_HOME, ui::DomCode::HOME, ui::EF_NONE, ui::DomKey::HOME}},
1848 ui::DomKey::ARROW_UP,
1849 0},
1850 {ui::VKEY_HOME, ui::DomCode::HOME, ui::EF_NONE, ui::DomKey::HOME, 0}},
1851 // Ctrl+Alt+Down -> End 1370 // Ctrl+Alt+Down -> End
1852 {ui::ET_KEY_PRESSED, 1371 {ui::ET_KEY_PRESSED,
1853 {ui::VKEY_DOWN, 1372 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN,
1854 ui::DomCode::ARROW_DOWN, 1373 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_DOWN},
1855 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, 1374 {ui::VKEY_END, ui::DomCode::END, ui::EF_NONE, ui::DomKey::END}},
1856 ui::DomKey::ARROW_DOWN,
1857 0},
1858 {ui::VKEY_END, ui::DomCode::END, ui::EF_NONE, ui::DomKey::END, 0}},
1859 1375
1860 // Search+Alt+Up -> Alt+Up 1376 // Search+Alt+Up -> Alt+Up
1861 {ui::ET_KEY_PRESSED, 1377 {ui::ET_KEY_PRESSED,
1862 {ui::VKEY_UP, 1378 {ui::VKEY_UP, ui::DomCode::ARROW_UP,
1863 ui::DomCode::ARROW_UP, 1379 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ARROW_UP},
1864 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, 1380 {ui::VKEY_UP, ui::DomCode::ARROW_UP, ui::EF_ALT_DOWN,
1865 ui::DomKey::ARROW_UP, 1381 ui::DomKey::ARROW_UP}},
1866 0},
1867 {ui::VKEY_UP,
1868 ui::DomCode::ARROW_UP,
1869 ui::EF_ALT_DOWN,
1870 ui::DomKey::ARROW_UP,
1871 0}},
1872 // Search+Alt+Down -> Alt+Down 1382 // Search+Alt+Down -> Alt+Down
1873 {ui::ET_KEY_PRESSED, 1383 {ui::ET_KEY_PRESSED,
1874 {ui::VKEY_DOWN, 1384 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN,
1875 ui::DomCode::ARROW_DOWN, 1385 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ARROW_DOWN},
1876 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, 1386 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN, ui::EF_ALT_DOWN,
1877 ui::DomKey::ARROW_DOWN, 1387 ui::DomKey::ARROW_DOWN}},
1878 0},
1879 {ui::VKEY_DOWN,
1880 ui::DomCode::ARROW_DOWN,
1881 ui::EF_ALT_DOWN,
1882 ui::DomKey::ARROW_DOWN,
1883 0}},
1884 // Search+Ctrl+Alt+Up -> Search+Ctrl+Alt+Up 1388 // Search+Ctrl+Alt+Up -> Search+Ctrl+Alt+Up
1885 {ui::ET_KEY_PRESSED, 1389 {ui::ET_KEY_PRESSED,
1886 {ui::VKEY_UP, 1390 {ui::VKEY_UP, ui::DomCode::ARROW_UP,
1887 ui::DomCode::ARROW_UP,
1888 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, 1391 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
1889 ui::DomKey::ARROW_UP, 1392 ui::DomKey::ARROW_UP},
1890 0}, 1393 {ui::VKEY_UP, ui::DomCode::ARROW_UP,
1891 {ui::VKEY_UP, 1394 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_UP}},
1892 ui::DomCode::ARROW_UP,
1893 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
1894 ui::DomKey::ARROW_UP,
1895 0}},
1896 // Search+Ctrl+Alt+Down -> Ctrl+Alt+Down 1395 // Search+Ctrl+Alt+Down -> Ctrl+Alt+Down
1897 {ui::ET_KEY_PRESSED, 1396 {ui::ET_KEY_PRESSED,
1898 {ui::VKEY_DOWN, 1397 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN,
1899 ui::DomCode::ARROW_DOWN,
1900 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, 1398 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
1901 ui::DomKey::ARROW_DOWN, 1399 ui::DomKey::ARROW_DOWN},
1902 0}, 1400 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN,
1903 {ui::VKEY_DOWN, 1401 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_DOWN}},
1904 ui::DomCode::ARROW_DOWN,
1905 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
1906 ui::DomKey::ARROW_DOWN,
1907 0}},
1908 1402
1909 // Period -> Period 1403 // Period -> Period
1910 {ui::ET_KEY_PRESSED, 1404 {ui::ET_KEY_PRESSED,
1911 {ui::VKEY_OEM_PERIOD, 1405 {ui::VKEY_OEM_PERIOD, ui::DomCode::PERIOD, ui::EF_NONE,
1912 ui::DomCode::PERIOD, 1406 ui::DomKey::Constant<'.'>::Character},
1913 ui::EF_NONE, 1407 {ui::VKEY_OEM_PERIOD, ui::DomCode::PERIOD, ui::EF_NONE,
1914 ui::DomKey::CHARACTER, 1408 ui::DomKey::Constant<'.'>::Character}},
1915 '.'},
1916 {ui::VKEY_OEM_PERIOD,
1917 ui::DomCode::PERIOD,
1918 ui::EF_NONE,
1919 ui::DomKey::CHARACTER,
1920 '.'}},
1921 1409
1922 // Search+Backspace -> Delete 1410 // Search+Backspace -> Delete
1923 {ui::ET_KEY_PRESSED, 1411 {ui::ET_KEY_PRESSED,
1924 {ui::VKEY_BACK, 1412 {ui::VKEY_BACK, ui::DomCode::BACKSPACE, ui::EF_COMMAND_DOWN,
1925 ui::DomCode::BACKSPACE, 1413 ui::DomKey::BACKSPACE},
1926 ui::EF_COMMAND_DOWN, 1414 {ui::VKEY_DELETE, ui::DomCode::DEL, ui::EF_NONE, ui::DomKey::DEL}},
1927 ui::DomKey::BACKSPACE,
1928 '\b'},
1929 {ui::VKEY_DELETE, ui::DomCode::DEL, ui::EF_NONE, ui::DomKey::DEL, 0x7F}},
1930 // Search+Up -> Prior 1415 // Search+Up -> Prior
1931 {ui::ET_KEY_PRESSED, 1416 {ui::ET_KEY_PRESSED,
1932 {ui::VKEY_UP, 1417 {ui::VKEY_UP, ui::DomCode::ARROW_UP, ui::EF_COMMAND_DOWN,
1933 ui::DomCode::ARROW_UP, 1418 ui::DomKey::ARROW_UP},
1934 ui::EF_COMMAND_DOWN, 1419 {ui::VKEY_PRIOR, ui::DomCode::PAGE_UP, ui::EF_NONE,
1935 ui::DomKey::ARROW_UP, 1420 ui::DomKey::PAGE_UP}},
1936 0},
1937 {ui::VKEY_PRIOR,
1938 ui::DomCode::PAGE_UP,
1939 ui::EF_NONE,
1940 ui::DomKey::PAGE_UP,
1941 0}},
1942 // Search+Down -> Next 1421 // Search+Down -> Next
1943 {ui::ET_KEY_PRESSED, 1422 {ui::ET_KEY_PRESSED,
1944 {ui::VKEY_DOWN, 1423 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN, ui::EF_COMMAND_DOWN,
1945 ui::DomCode::ARROW_DOWN, 1424 ui::DomKey::ARROW_DOWN},
1946 ui::EF_COMMAND_DOWN, 1425 {ui::VKEY_NEXT, ui::DomCode::PAGE_DOWN, ui::EF_NONE,
1947 ui::DomKey::ARROW_DOWN, 1426 ui::DomKey::PAGE_DOWN}},
1948 0},
1949 {ui::VKEY_NEXT,
1950 ui::DomCode::PAGE_DOWN,
1951 ui::EF_NONE,
1952 ui::DomKey::PAGE_DOWN,
1953 0}},
1954 // Search+Left -> Home 1427 // Search+Left -> Home
1955 {ui::ET_KEY_PRESSED, 1428 {ui::ET_KEY_PRESSED,
1956 {ui::VKEY_LEFT, 1429 {ui::VKEY_LEFT, ui::DomCode::ARROW_LEFT, ui::EF_COMMAND_DOWN,
1957 ui::DomCode::ARROW_LEFT, 1430 ui::DomKey::ARROW_LEFT},
1958 ui::EF_COMMAND_DOWN, 1431 {ui::VKEY_HOME, ui::DomCode::HOME, ui::EF_NONE, ui::DomKey::HOME}},
1959 ui::DomKey::ARROW_LEFT,
1960 0},
1961 {ui::VKEY_HOME, ui::DomCode::HOME, ui::EF_NONE, ui::DomKey::HOME, 0}},
1962 // Control+Search+Left -> Home 1432 // Control+Search+Left -> Home
1963 {ui::ET_KEY_PRESSED, 1433 {ui::ET_KEY_PRESSED,
1964 {ui::VKEY_LEFT, 1434 {ui::VKEY_LEFT, ui::DomCode::ARROW_LEFT,
1965 ui::DomCode::ARROW_LEFT, 1435 ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_LEFT},
1966 ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN, 1436 {ui::VKEY_HOME, ui::DomCode::HOME, ui::EF_CONTROL_DOWN,
1967 ui::DomKey::ARROW_LEFT, 1437 ui::DomKey::HOME}},
1968 0},
1969 {ui::VKEY_HOME,
1970 ui::DomCode::HOME,
1971 ui::EF_CONTROL_DOWN,
1972 ui::DomKey::HOME,
1973 0}},
1974 // Search+Right -> End 1438 // Search+Right -> End
1975 {ui::ET_KEY_PRESSED, 1439 {ui::ET_KEY_PRESSED,
1976 {ui::VKEY_RIGHT, 1440 {ui::VKEY_RIGHT, ui::DomCode::ARROW_RIGHT, ui::EF_COMMAND_DOWN,
1977 ui::DomCode::ARROW_RIGHT, 1441 ui::DomKey::ARROW_RIGHT},
1978 ui::EF_COMMAND_DOWN, 1442 {ui::VKEY_END, ui::DomCode::END, ui::EF_NONE, ui::DomKey::END}},
1979 ui::DomKey::ARROW_RIGHT,
1980 0},
1981 {ui::VKEY_END, ui::DomCode::END, ui::EF_NONE, ui::DomKey::END, 0}},
1982 // Control+Search+Right -> End 1443 // Control+Search+Right -> End
1983 {ui::ET_KEY_PRESSED, 1444 {ui::ET_KEY_PRESSED,
1984 {ui::VKEY_RIGHT, 1445 {ui::VKEY_RIGHT, ui::DomCode::ARROW_RIGHT,
1985 ui::DomCode::ARROW_RIGHT, 1446 ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_RIGHT},
1986 ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN, 1447 {ui::VKEY_END, ui::DomCode::END, ui::EF_CONTROL_DOWN, ui::DomKey::END}},
1987 ui::DomKey::ARROW_RIGHT,
1988 0},
1989 {ui::VKEY_END,
1990 ui::DomCode::END,
1991 ui::EF_CONTROL_DOWN,
1992 ui::DomKey::END,
1993 0}},
1994 // Search+Period -> Insert 1448 // Search+Period -> Insert
1995 {ui::ET_KEY_PRESSED, 1449 {ui::ET_KEY_PRESSED,
1996 {ui::VKEY_OEM_PERIOD, 1450 {ui::VKEY_OEM_PERIOD, ui::DomCode::PERIOD, ui::EF_COMMAND_DOWN,
1997 ui::DomCode::PERIOD, 1451 ui::DomKey::Constant<'.'>::Character},
1998 ui::EF_COMMAND_DOWN, 1452 {ui::VKEY_INSERT, ui::DomCode::INSERT, ui::EF_NONE, ui::DomKey::INSERT}},
1999 ui::DomKey::CHARACTER,
2000 '.'},
2001 {ui::VKEY_INSERT,
2002 ui::DomCode::INSERT,
2003 ui::EF_NONE,
2004 ui::DomKey::INSERT,
2005 0}},
2006 // Control+Search+Period -> Control+Insert 1453 // Control+Search+Period -> Control+Insert
2007 {ui::ET_KEY_PRESSED, 1454 {ui::ET_KEY_PRESSED,
2008 {ui::VKEY_OEM_PERIOD, 1455 {ui::VKEY_OEM_PERIOD, ui::DomCode::PERIOD,
2009 ui::DomCode::PERIOD,
2010 ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN, 1456 ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN,
2011 ui::DomKey::CHARACTER, 1457 ui::DomKey::Constant<'.'>::Character},
2012 '.'}, 1458 {ui::VKEY_INSERT, ui::DomCode::INSERT, ui::EF_CONTROL_DOWN,
2013 {ui::VKEY_INSERT, 1459 ui::DomKey::INSERT}}};
2014 ui::DomCode::INSERT,
2015 ui::EF_CONTROL_DOWN,
2016 ui::DomKey::INSERT,
2017 0}}};
2018 1460
2019 for (const auto& test : tests) { 1461 for (const auto& test : tests) {
2020 CheckKeyTestCase(&rewriter, test); 1462 CheckKeyTestCase(&rewriter, test);
2021 } 1463 }
2022 } 1464 }
2023 1465
2024 TEST_F(EventRewriterTest, TestRewriteFunctionKeys) { 1466 TEST_F(EventRewriterTest, TestRewriteFunctionKeys) {
2025 TestingPrefServiceSyncable prefs; 1467 TestingPrefServiceSyncable prefs;
2026 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1468 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
2027 EventRewriter rewriter(NULL); 1469 EventRewriter rewriter(NULL);
2028 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard"); 1470 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
2029 rewriter.set_pref_service_for_testing(&prefs); 1471 rewriter.set_pref_service_for_testing(&prefs);
2030 1472
2031 KeyTestCase tests[] = { 1473 KeyTestCase tests[] = {
2032 // F1 -> Back 1474 // F1 -> Back
2033 {ui::ET_KEY_PRESSED, 1475 {ui::ET_KEY_PRESSED,
2034 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1, 0}, 1476 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1},
2035 {ui::VKEY_BROWSER_BACK, 1477 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_NONE,
2036 ui::DomCode::BROWSER_BACK, 1478 ui::DomKey::BROWSER_BACK}},
2037 ui::EF_NONE, 1479 {ui::ET_KEY_PRESSED,
2038 ui::DomKey::BROWSER_BACK, 1480 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_CONTROL_DOWN, ui::DomKey::F1},
2039 0}}, 1481 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_CONTROL_DOWN,
2040 {ui::ET_KEY_PRESSED, 1482 ui::DomKey::BROWSER_BACK}},
2041 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_CONTROL_DOWN, ui::DomKey::F1, 0}, 1483 {ui::ET_KEY_PRESSED,
2042 {ui::VKEY_BROWSER_BACK, 1484 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_ALT_DOWN, ui::DomKey::F1},
2043 ui::DomCode::BROWSER_BACK, 1485 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_ALT_DOWN,
2044 ui::EF_CONTROL_DOWN, 1486 ui::DomKey::BROWSER_BACK}},
2045 ui::DomKey::BROWSER_BACK,
2046 0}},
2047 {ui::ET_KEY_PRESSED,
2048 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_ALT_DOWN, ui::DomKey::F1, 0},
2049 {ui::VKEY_BROWSER_BACK,
2050 ui::DomCode::BROWSER_BACK,
2051 ui::EF_ALT_DOWN,
2052 ui::DomKey::BROWSER_BACK,
2053 0}},
2054 // F2 -> Forward 1487 // F2 -> Forward
2055 {ui::ET_KEY_PRESSED, 1488 {ui::ET_KEY_PRESSED,
2056 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2, 0}, 1489 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2},
2057 {ui::VKEY_BROWSER_FORWARD, 1490 {ui::VKEY_BROWSER_FORWARD, ui::DomCode::BROWSER_FORWARD, ui::EF_NONE,
2058 ui::DomCode::BROWSER_FORWARD, 1491 ui::DomKey::BROWSER_FORWARD}},
2059 ui::EF_NONE, 1492 {ui::ET_KEY_PRESSED,
2060 ui::DomKey::BROWSER_FORWARD, 1493 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_CONTROL_DOWN, ui::DomKey::F2},
2061 0}}, 1494 {ui::VKEY_BROWSER_FORWARD, ui::DomCode::BROWSER_FORWARD,
2062 {ui::ET_KEY_PRESSED, 1495 ui::EF_CONTROL_DOWN, ui::DomKey::BROWSER_FORWARD}},
2063 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_CONTROL_DOWN, ui::DomKey::F2, 0}, 1496 {ui::ET_KEY_PRESSED,
2064 {ui::VKEY_BROWSER_FORWARD, 1497 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_ALT_DOWN, ui::DomKey::F2},
2065 ui::DomCode::BROWSER_FORWARD, 1498 {ui::VKEY_BROWSER_FORWARD, ui::DomCode::BROWSER_FORWARD, ui::EF_ALT_DOWN,
2066 ui::EF_CONTROL_DOWN, 1499 ui::DomKey::BROWSER_FORWARD}},
2067 ui::DomKey::BROWSER_FORWARD,
2068 0}},
2069 {ui::ET_KEY_PRESSED,
2070 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_ALT_DOWN, ui::DomKey::F2, 0},
2071 {ui::VKEY_BROWSER_FORWARD,
2072 ui::DomCode::BROWSER_FORWARD,
2073 ui::EF_ALT_DOWN,
2074 ui::DomKey::BROWSER_FORWARD,
2075 0}},
2076 // F3 -> Refresh 1500 // F3 -> Refresh
2077 {ui::ET_KEY_PRESSED, 1501 {ui::ET_KEY_PRESSED,
2078 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3, 0}, 1502 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3},
2079 {ui::VKEY_BROWSER_REFRESH, 1503 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_NONE,
2080 ui::DomCode::BROWSER_REFRESH, 1504 ui::DomKey::BROWSER_REFRESH}},
2081 ui::EF_NONE, 1505 {ui::ET_KEY_PRESSED,
2082 ui::DomKey::BROWSER_REFRESH, 1506 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_CONTROL_DOWN, ui::DomKey::F3},
2083 0}}, 1507 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH,
2084 {ui::ET_KEY_PRESSED, 1508 ui::EF_CONTROL_DOWN, ui::DomKey::BROWSER_REFRESH}},
2085 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_CONTROL_DOWN, ui::DomKey::F3, 0}, 1509 {ui::ET_KEY_PRESSED,
2086 {ui::VKEY_BROWSER_REFRESH, 1510 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_ALT_DOWN, ui::DomKey::F3},
2087 ui::DomCode::BROWSER_REFRESH, 1511 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_ALT_DOWN,
2088 ui::EF_CONTROL_DOWN, 1512 ui::DomKey::BROWSER_REFRESH}},
2089 ui::DomKey::BROWSER_REFRESH,
2090 0}},
2091 {ui::ET_KEY_PRESSED,
2092 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_ALT_DOWN, ui::DomKey::F3, 0},
2093 {ui::VKEY_BROWSER_REFRESH,
2094 ui::DomCode::BROWSER_REFRESH,
2095 ui::EF_ALT_DOWN,
2096 ui::DomKey::BROWSER_REFRESH,
2097 0}},
2098 // F4 -> Launch App 2 1513 // F4 -> Launch App 2
2099 {ui::ET_KEY_PRESSED, 1514 {ui::ET_KEY_PRESSED,
2100 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4, 0}, 1515 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4},
2101 {ui::VKEY_MEDIA_LAUNCH_APP2, 1516 {ui::VKEY_MEDIA_LAUNCH_APP2, ui::DomCode::ZOOM_TOGGLE, ui::EF_NONE,
2102 ui::DomCode::ZOOM_TOGGLE, 1517 ui::DomKey::ZOOM_TOGGLE}},
2103 ui::EF_NONE, 1518 {ui::ET_KEY_PRESSED,
2104 ui::DomKey::ZOOM_TOGGLE, 1519 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_CONTROL_DOWN, ui::DomKey::F4},
2105 0}}, 1520 {ui::VKEY_MEDIA_LAUNCH_APP2, ui::DomCode::ZOOM_TOGGLE,
2106 {ui::ET_KEY_PRESSED, 1521 ui::EF_CONTROL_DOWN, ui::DomKey::ZOOM_TOGGLE}},
2107 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_CONTROL_DOWN, ui::DomKey::F4, 0}, 1522 {ui::ET_KEY_PRESSED,
2108 {ui::VKEY_MEDIA_LAUNCH_APP2, 1523 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_ALT_DOWN, ui::DomKey::F4},
2109 ui::DomCode::ZOOM_TOGGLE, 1524 {ui::VKEY_MEDIA_LAUNCH_APP2, ui::DomCode::ZOOM_TOGGLE, ui::EF_ALT_DOWN,
2110 ui::EF_CONTROL_DOWN, 1525 ui::DomKey::ZOOM_TOGGLE}},
2111 ui::DomKey::ZOOM_TOGGLE,
2112 0}},
2113 {ui::ET_KEY_PRESSED,
2114 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_ALT_DOWN, ui::DomKey::F4, 0},
2115 {ui::VKEY_MEDIA_LAUNCH_APP2,
2116 ui::DomCode::ZOOM_TOGGLE,
2117 ui::EF_ALT_DOWN,
2118 ui::DomKey::ZOOM_TOGGLE,
2119 0}},
2120 // F5 -> Launch App 1 1526 // F5 -> Launch App 1
2121 {ui::ET_KEY_PRESSED, 1527 {ui::ET_KEY_PRESSED,
2122 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5, 0}, 1528 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5},
2123 {ui::VKEY_MEDIA_LAUNCH_APP1, 1529 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::SELECT_TASK, ui::EF_NONE,
2124 ui::DomCode::SELECT_TASK, 1530 ui::DomKey::LAUNCH_MY_COMPUTER}},
2125 ui::EF_NONE, 1531 {ui::ET_KEY_PRESSED,
2126 ui::DomKey::LAUNCH_MY_COMPUTER, 1532 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_CONTROL_DOWN, ui::DomKey::F5},
2127 0}}, 1533 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::SELECT_TASK,
2128 {ui::ET_KEY_PRESSED, 1534 ui::EF_CONTROL_DOWN, ui::DomKey::LAUNCH_MY_COMPUTER}},
2129 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_CONTROL_DOWN, ui::DomKey::F5, 0}, 1535 {ui::ET_KEY_PRESSED,
2130 {ui::VKEY_MEDIA_LAUNCH_APP1, 1536 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_ALT_DOWN, ui::DomKey::F5},
2131 ui::DomCode::SELECT_TASK, 1537 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::SELECT_TASK, ui::EF_ALT_DOWN,
2132 ui::EF_CONTROL_DOWN, 1538 ui::DomKey::LAUNCH_MY_COMPUTER}},
2133 ui::DomKey::LAUNCH_MY_COMPUTER,
2134 0}},
2135 {ui::ET_KEY_PRESSED,
2136 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_ALT_DOWN, ui::DomKey::F5, 0},
2137 {ui::VKEY_MEDIA_LAUNCH_APP1,
2138 ui::DomCode::SELECT_TASK,
2139 ui::EF_ALT_DOWN,
2140 ui::DomKey::LAUNCH_MY_COMPUTER,
2141 0}},
2142 // F6 -> Brightness down 1539 // F6 -> Brightness down
2143 {ui::ET_KEY_PRESSED, 1540 {ui::ET_KEY_PRESSED,
2144 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6, 0}, 1541 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6},
2145 {ui::VKEY_BRIGHTNESS_DOWN, 1542 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN, ui::EF_NONE,
2146 ui::DomCode::BRIGHTNESS_DOWN, 1543 ui::DomKey::BRIGHTNESS_DOWN}},
2147 ui::EF_NONE, 1544 {ui::ET_KEY_PRESSED,
2148 ui::DomKey::BRIGHTNESS_DOWN, 1545 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_CONTROL_DOWN, ui::DomKey::F6},
2149 0}}, 1546 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN,
2150 {ui::ET_KEY_PRESSED, 1547 ui::EF_CONTROL_DOWN, ui::DomKey::BRIGHTNESS_DOWN}},
2151 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_CONTROL_DOWN, ui::DomKey::F6, 0}, 1548 {ui::ET_KEY_PRESSED,
2152 {ui::VKEY_BRIGHTNESS_DOWN, 1549 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_ALT_DOWN, ui::DomKey::F6},
2153 ui::DomCode::BRIGHTNESS_DOWN, 1550 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN, ui::EF_ALT_DOWN,
2154 ui::EF_CONTROL_DOWN, 1551 ui::DomKey::BRIGHTNESS_DOWN}},
2155 ui::DomKey::BRIGHTNESS_DOWN,
2156 0}},
2157 {ui::ET_KEY_PRESSED,
2158 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_ALT_DOWN, ui::DomKey::F6, 0},
2159 {ui::VKEY_BRIGHTNESS_DOWN,
2160 ui::DomCode::BRIGHTNESS_DOWN,
2161 ui::EF_ALT_DOWN,
2162 ui::DomKey::BRIGHTNESS_DOWN,
2163 0}},
2164 // F7 -> Brightness up 1552 // F7 -> Brightness up
2165 {ui::ET_KEY_PRESSED, 1553 {ui::ET_KEY_PRESSED,
2166 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7, 0}, 1554 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7},
2167 {ui::VKEY_BRIGHTNESS_UP, 1555 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_NONE,
2168 ui::DomCode::BRIGHTNESS_UP, 1556 ui::DomKey::BRIGHTNESS_UP}},
2169 ui::EF_NONE, 1557 {ui::ET_KEY_PRESSED,
2170 ui::DomKey::BRIGHTNESS_UP, 1558 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_CONTROL_DOWN, ui::DomKey::F7},
2171 0}}, 1559 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_CONTROL_DOWN,
2172 {ui::ET_KEY_PRESSED, 1560 ui::DomKey::BRIGHTNESS_UP}},
2173 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_CONTROL_DOWN, ui::DomKey::F7, 0}, 1561 {ui::ET_KEY_PRESSED,
2174 {ui::VKEY_BRIGHTNESS_UP, 1562 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_ALT_DOWN, ui::DomKey::F7},
2175 ui::DomCode::BRIGHTNESS_UP, 1563 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_ALT_DOWN,
2176 ui::EF_CONTROL_DOWN, 1564 ui::DomKey::BRIGHTNESS_UP}},
2177 ui::DomKey::BRIGHTNESS_UP,
2178 0}},
2179 {ui::ET_KEY_PRESSED,
2180 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_ALT_DOWN, ui::DomKey::F7, 0},
2181 {ui::VKEY_BRIGHTNESS_UP,
2182 ui::DomCode::BRIGHTNESS_UP,
2183 ui::EF_ALT_DOWN,
2184 ui::DomKey::BRIGHTNESS_UP,
2185 0}},
2186 // F8 -> Volume Mute 1565 // F8 -> Volume Mute
2187 {ui::ET_KEY_PRESSED, 1566 {ui::ET_KEY_PRESSED,
2188 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8, 0}, 1567 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8},
2189 {ui::VKEY_VOLUME_MUTE, 1568 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_NONE,
2190 ui::DomCode::VOLUME_MUTE, 1569 ui::DomKey::VOLUME_MUTE}},
2191 ui::EF_NONE, 1570 {ui::ET_KEY_PRESSED,
2192 ui::DomKey::VOLUME_MUTE, 1571 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_CONTROL_DOWN, ui::DomKey::F8},
2193 0}}, 1572 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_CONTROL_DOWN,
2194 {ui::ET_KEY_PRESSED, 1573 ui::DomKey::VOLUME_MUTE}},
2195 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_CONTROL_DOWN, ui::DomKey::F8, 0}, 1574 {ui::ET_KEY_PRESSED,
2196 {ui::VKEY_VOLUME_MUTE, 1575 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_ALT_DOWN, ui::DomKey::F8},
2197 ui::DomCode::VOLUME_MUTE, 1576 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_ALT_DOWN,
2198 ui::EF_CONTROL_DOWN, 1577 ui::DomKey::VOLUME_MUTE}},
2199 ui::DomKey::VOLUME_MUTE,
2200 0}},
2201 {ui::ET_KEY_PRESSED,
2202 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_ALT_DOWN, ui::DomKey::F8, 0},
2203 {ui::VKEY_VOLUME_MUTE,
2204 ui::DomCode::VOLUME_MUTE,
2205 ui::EF_ALT_DOWN,
2206 ui::DomKey::VOLUME_MUTE,
2207 0}},
2208 // F9 -> Volume Down 1578 // F9 -> Volume Down
2209 {ui::ET_KEY_PRESSED, 1579 {ui::ET_KEY_PRESSED,
2210 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9, 0}, 1580 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9},
2211 {ui::VKEY_VOLUME_DOWN, 1581 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_NONE,
2212 ui::DomCode::VOLUME_DOWN, 1582 ui::DomKey::VOLUME_DOWN}},
2213 ui::EF_NONE, 1583 {ui::ET_KEY_PRESSED,
2214 ui::DomKey::VOLUME_DOWN, 1584 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_CONTROL_DOWN, ui::DomKey::F9},
2215 0}}, 1585 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_CONTROL_DOWN,
2216 {ui::ET_KEY_PRESSED, 1586 ui::DomKey::VOLUME_DOWN}},
2217 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_CONTROL_DOWN, ui::DomKey::F9, 0}, 1587 {ui::ET_KEY_PRESSED,
2218 {ui::VKEY_VOLUME_DOWN, 1588 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_ALT_DOWN, ui::DomKey::F9},
2219 ui::DomCode::VOLUME_DOWN, 1589 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_ALT_DOWN,
2220 ui::EF_CONTROL_DOWN, 1590 ui::DomKey::VOLUME_DOWN}},
2221 ui::DomKey::VOLUME_DOWN,
2222 0}},
2223 {ui::ET_KEY_PRESSED,
2224 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_ALT_DOWN, ui::DomKey::F9, 0},
2225 {ui::VKEY_VOLUME_DOWN,
2226 ui::DomCode::VOLUME_DOWN,
2227 ui::EF_ALT_DOWN,
2228 ui::DomKey::VOLUME_DOWN,
2229 0}},
2230 // F10 -> Volume Up 1591 // F10 -> Volume Up
2231 {ui::ET_KEY_PRESSED, 1592 {ui::ET_KEY_PRESSED,
2232 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10, 0}, 1593 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10},
2233 {ui::VKEY_VOLUME_UP, 1594 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_NONE,
2234 ui::DomCode::VOLUME_UP, 1595 ui::DomKey::VOLUME_UP}},
2235 ui::EF_NONE, 1596 {ui::ET_KEY_PRESSED,
2236 ui::DomKey::VOLUME_UP, 1597 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_CONTROL_DOWN, ui::DomKey::F10},
2237 0}}, 1598 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_CONTROL_DOWN,
2238 {ui::ET_KEY_PRESSED, 1599 ui::DomKey::VOLUME_UP}},
2239 {ui::VKEY_F10, 1600 {ui::ET_KEY_PRESSED,
2240 ui::DomCode::F10, 1601 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_ALT_DOWN, ui::DomKey::F10},
2241 ui::EF_CONTROL_DOWN, 1602 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_ALT_DOWN,
2242 ui::DomKey::F10, 1603 ui::DomKey::VOLUME_UP}},
2243 0},
2244 {ui::VKEY_VOLUME_UP,
2245 ui::DomCode::VOLUME_UP,
2246 ui::EF_CONTROL_DOWN,
2247 ui::DomKey::VOLUME_UP,
2248 0}},
2249 {ui::ET_KEY_PRESSED,
2250 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_ALT_DOWN, ui::DomKey::F10, 0},
2251 {ui::VKEY_VOLUME_UP,
2252 ui::DomCode::VOLUME_UP,
2253 ui::EF_ALT_DOWN,
2254 ui::DomKey::VOLUME_UP,
2255 0}},
2256 // F11 -> F11 1604 // F11 -> F11
2257 {ui::ET_KEY_PRESSED, 1605 {ui::ET_KEY_PRESSED,
2258 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11, 0}, 1606 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11},
2259 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11, 0}}, 1607 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}},
2260 {ui::ET_KEY_PRESSED, 1608 {ui::ET_KEY_PRESSED,
2261 {ui::VKEY_F11, 1609 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_CONTROL_DOWN, ui::DomKey::F11},
2262 ui::DomCode::F11, 1610 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_CONTROL_DOWN, ui::DomKey::F11}},
2263 ui::EF_CONTROL_DOWN, 1611 {ui::ET_KEY_PRESSED,
2264 ui::DomKey::F11, 1612 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_ALT_DOWN, ui::DomKey::F11},
2265 0}, 1613 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_ALT_DOWN, ui::DomKey::F11}},
2266 {ui::VKEY_F11,
2267 ui::DomCode::F11,
2268 ui::EF_CONTROL_DOWN,
2269 ui::DomKey::F11,
2270 0}},
2271 {ui::ET_KEY_PRESSED,
2272 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_ALT_DOWN, ui::DomKey::F11, 0},
2273 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_ALT_DOWN, ui::DomKey::F11, 0}},
2274 // F12 -> F12 1614 // F12 -> F12
2275 {ui::ET_KEY_PRESSED, 1615 {ui::ET_KEY_PRESSED,
2276 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12, 0}, 1616 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12},
2277 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12, 0}}, 1617 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
2278 {ui::ET_KEY_PRESSED, 1618 {ui::ET_KEY_PRESSED,
2279 {ui::VKEY_F12, 1619 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12},
2280 ui::DomCode::F12, 1620 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12}},
2281 ui::EF_CONTROL_DOWN, 1621 {ui::ET_KEY_PRESSED,
2282 ui::DomKey::F12, 1622 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_ALT_DOWN, ui::DomKey::F12},
2283 0}, 1623 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_ALT_DOWN, ui::DomKey::F12}},
2284 {ui::VKEY_F12,
2285 ui::DomCode::F12,
2286 ui::EF_CONTROL_DOWN,
2287 ui::DomKey::F12,
2288 0}},
2289 {ui::ET_KEY_PRESSED,
2290 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_ALT_DOWN, ui::DomKey::F12, 0},
2291 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_ALT_DOWN, ui::DomKey::F12, 0}},
2292 1624
2293 // The number row should not be rewritten without Search key. 1625 // The number row should not be rewritten without Search key.
2294 {ui::ET_KEY_PRESSED, 1626 {ui::ET_KEY_PRESSED,
2295 {ui::VKEY_1, 1627 {ui::VKEY_1, ui::DomCode::DIGIT1, ui::EF_NONE,
2296 ui::DomCode::DIGIT1, 1628 ui::DomKey::Constant<'1'>::Character},
2297 ui::EF_NONE, 1629 {ui::VKEY_1, ui::DomCode::DIGIT1, ui::EF_NONE,
2298 ui::DomKey::CHARACTER, 1630 ui::DomKey::Constant<'1'>::Character}},
2299 '1'}, 1631 {ui::ET_KEY_PRESSED,
2300 {ui::VKEY_1, 1632 {ui::VKEY_2, ui::DomCode::DIGIT2, ui::EF_NONE,
2301 ui::DomCode::DIGIT1, 1633 ui::DomKey::Constant<'2'>::Character},
2302 ui::EF_NONE, 1634 {ui::VKEY_2, ui::DomCode::DIGIT2, ui::EF_NONE,
2303 ui::DomKey::CHARACTER, 1635 ui::DomKey::Constant<'2'>::Character}},
2304 '1'}}, 1636 {ui::ET_KEY_PRESSED,
2305 {ui::ET_KEY_PRESSED, 1637 {ui::VKEY_3, ui::DomCode::DIGIT3, ui::EF_NONE,
2306 {ui::VKEY_2, 1638 ui::DomKey::Constant<'3'>::Character},
2307 ui::DomCode::DIGIT2, 1639 {ui::VKEY_3, ui::DomCode::DIGIT3, ui::EF_NONE,
2308 ui::EF_NONE, 1640 ui::DomKey::Constant<'3'>::Character}},
2309 ui::DomKey::CHARACTER, 1641 {ui::ET_KEY_PRESSED,
2310 '2'}, 1642 {ui::VKEY_4, ui::DomCode::DIGIT4, ui::EF_NONE,
2311 {ui::VKEY_2, 1643 ui::DomKey::Constant<'4'>::Character},
2312 ui::DomCode::DIGIT2, 1644 {ui::VKEY_4, ui::DomCode::DIGIT4, ui::EF_NONE,
2313 ui::EF_NONE, 1645 ui::DomKey::Constant<'4'>::Character}},
2314 ui::DomKey::CHARACTER, 1646 {ui::ET_KEY_PRESSED,
2315 '2'}}, 1647 {ui::VKEY_5, ui::DomCode::DIGIT5, ui::EF_NONE,
2316 {ui::ET_KEY_PRESSED, 1648 ui::DomKey::Constant<'5'>::Character},
2317 {ui::VKEY_3, 1649 {ui::VKEY_5, ui::DomCode::DIGIT5, ui::EF_NONE,
2318 ui::DomCode::DIGIT3, 1650 ui::DomKey::Constant<'5'>::Character}},
2319 ui::EF_NONE, 1651 {ui::ET_KEY_PRESSED,
2320 ui::DomKey::CHARACTER, 1652 {ui::VKEY_6, ui::DomCode::DIGIT6, ui::EF_NONE,
2321 '3'}, 1653 ui::DomKey::Constant<'6'>::Character},
2322 {ui::VKEY_3, 1654 {ui::VKEY_6, ui::DomCode::DIGIT6, ui::EF_NONE,
2323 ui::DomCode::DIGIT3, 1655 ui::DomKey::Constant<'6'>::Character}},
2324 ui::EF_NONE, 1656 {ui::ET_KEY_PRESSED,
2325 ui::DomKey::CHARACTER, 1657 {ui::VKEY_7, ui::DomCode::DIGIT7, ui::EF_NONE,
2326 '3'}}, 1658 ui::DomKey::Constant<'7'>::Character},
2327 {ui::ET_KEY_PRESSED, 1659 {ui::VKEY_7, ui::DomCode::DIGIT7, ui::EF_NONE,
2328 {ui::VKEY_4, 1660 ui::DomKey::Constant<'7'>::Character}},
2329 ui::DomCode::DIGIT4, 1661 {ui::ET_KEY_PRESSED,
2330 ui::EF_NONE, 1662 {ui::VKEY_8, ui::DomCode::DIGIT8, ui::EF_NONE,
2331 ui::DomKey::CHARACTER, 1663 ui::DomKey::Constant<'8'>::Character},
2332 '4'}, 1664 {ui::VKEY_8, ui::DomCode::DIGIT8, ui::EF_NONE,
2333 {ui::VKEY_4, 1665 ui::DomKey::Constant<'8'>::Character}},
2334 ui::DomCode::DIGIT4, 1666 {ui::ET_KEY_PRESSED,
2335 ui::EF_NONE, 1667 {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_NONE,
2336 ui::DomKey::CHARACTER, 1668 ui::DomKey::Constant<'9'>::Character},
2337 '4'}}, 1669 {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_NONE,
2338 {ui::ET_KEY_PRESSED, 1670 ui::DomKey::Constant<'9'>::Character}},
2339 {ui::VKEY_5, 1671 {ui::ET_KEY_PRESSED,
2340 ui::DomCode::DIGIT5, 1672 {ui::VKEY_0, ui::DomCode::DIGIT0, ui::EF_NONE,
2341 ui::EF_NONE, 1673 ui::DomKey::Constant<'0'>::Character},
2342 ui::DomKey::CHARACTER, 1674 {ui::VKEY_0, ui::DomCode::DIGIT0, ui::EF_NONE,
2343 '5'}, 1675 ui::DomKey::Constant<'0'>::Character}},
2344 {ui::VKEY_5, 1676 {ui::ET_KEY_PRESSED,
2345 ui::DomCode::DIGIT5, 1677 {ui::VKEY_OEM_MINUS, ui::DomCode::MINUS, ui::EF_NONE,
2346 ui::EF_NONE, 1678 ui::DomKey::Constant<'-'>::Character},
2347 ui::DomKey::CHARACTER, 1679 {ui::VKEY_OEM_MINUS, ui::DomCode::MINUS, ui::EF_NONE,
2348 '5'}}, 1680 ui::DomKey::Constant<'-'>::Character}},
2349 {ui::ET_KEY_PRESSED, 1681 {ui::ET_KEY_PRESSED,
2350 {ui::VKEY_6, 1682 {ui::VKEY_OEM_PLUS, ui::DomCode::EQUAL, ui::EF_NONE,
2351 ui::DomCode::DIGIT6, 1683 ui::DomKey::Constant<'='>::Character},
2352 ui::EF_NONE, 1684 {ui::VKEY_OEM_PLUS, ui::DomCode::EQUAL, ui::EF_NONE,
2353 ui::DomKey::CHARACTER, 1685 ui::DomKey::Constant<'='>::Character}},
2354 '6'},
2355 {ui::VKEY_6,
2356 ui::DomCode::DIGIT6,
2357 ui::EF_NONE,
2358 ui::DomKey::CHARACTER,
2359 '6'}},
2360 {ui::ET_KEY_PRESSED,
2361 {ui::VKEY_7,
2362 ui::DomCode::DIGIT7,
2363 ui::EF_NONE,
2364 ui::DomKey::CHARACTER,
2365 '7'},
2366 {ui::VKEY_7,
2367 ui::DomCode::DIGIT7,
2368 ui::EF_NONE,
2369 ui::DomKey::CHARACTER,
2370 '7'}},
2371 {ui::ET_KEY_PRESSED,
2372 {ui::VKEY_8,
2373 ui::DomCode::DIGIT8,
2374 ui::EF_NONE,
2375 ui::DomKey::CHARACTER,
2376 '8'},
2377 {ui::VKEY_8,
2378 ui::DomCode::DIGIT8,
2379 ui::EF_NONE,
2380 ui::DomKey::CHARACTER,
2381 '8'}},
2382 {ui::ET_KEY_PRESSED,
2383 {ui::VKEY_9,
2384 ui::DomCode::DIGIT9,
2385 ui::EF_NONE,
2386 ui::DomKey::CHARACTER,
2387 '9'},
2388 {ui::VKEY_9,
2389 ui::DomCode::DIGIT9,
2390 ui::EF_NONE,
2391 ui::DomKey::CHARACTER,
2392 '9'}},
2393 {ui::ET_KEY_PRESSED,
2394 {ui::VKEY_0,
2395 ui::DomCode::DIGIT0,
2396 ui::EF_NONE,
2397 ui::DomKey::CHARACTER,
2398 '0'},
2399 {ui::VKEY_0,
2400 ui::DomCode::DIGIT0,
2401 ui::EF_NONE,
2402 ui::DomKey::CHARACTER,
2403 '0'}},
2404 {ui::ET_KEY_PRESSED,
2405 {ui::VKEY_OEM_MINUS,
2406 ui::DomCode::MINUS,
2407 ui::EF_NONE,
2408 ui::DomKey::CHARACTER,
2409 '-'},
2410 {ui::VKEY_OEM_MINUS,
2411 ui::DomCode::MINUS,
2412 ui::EF_NONE,
2413 ui::DomKey::CHARACTER,
2414 '-'}},
2415 {ui::ET_KEY_PRESSED,
2416 {ui::VKEY_OEM_PLUS,
2417 ui::DomCode::EQUAL,
2418 ui::EF_NONE,
2419 ui::DomKey::CHARACTER,
2420 '='},
2421 {ui::VKEY_OEM_PLUS,
2422 ui::DomCode::EQUAL,
2423 ui::EF_NONE,
2424 ui::DomKey::CHARACTER,
2425 '='}},
2426 1686
2427 // The number row should be rewritten as the F<number> row with Search 1687 // The number row should be rewritten as the F<number> row with Search
2428 // key. 1688 // key.
2429 {ui::ET_KEY_PRESSED, 1689 {ui::ET_KEY_PRESSED,
2430 {ui::VKEY_1, 1690 {ui::VKEY_1, ui::DomCode::DIGIT1, ui::EF_COMMAND_DOWN,
2431 ui::DomCode::DIGIT1, 1691 ui::DomKey::Constant<'1'>::Character},
2432 ui::EF_COMMAND_DOWN, 1692 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1}},
2433 ui::DomKey::CHARACTER, 1693 {ui::ET_KEY_PRESSED,
2434 '1'}, 1694 {ui::VKEY_2, ui::DomCode::DIGIT2, ui::EF_COMMAND_DOWN,
2435 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1, 0}}, 1695 ui::DomKey::Constant<'2'>::Character},
2436 {ui::ET_KEY_PRESSED, 1696 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2}},
2437 {ui::VKEY_2, 1697 {ui::ET_KEY_PRESSED,
2438 ui::DomCode::DIGIT2, 1698 {ui::VKEY_3, ui::DomCode::DIGIT3, ui::EF_COMMAND_DOWN,
2439 ui::EF_COMMAND_DOWN, 1699 ui::DomKey::Constant<'3'>::Character},
2440 ui::DomKey::CHARACTER, 1700 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3}},
2441 '2'}, 1701 {ui::ET_KEY_PRESSED,
2442 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2, 0}}, 1702 {ui::VKEY_4, ui::DomCode::DIGIT4, ui::EF_COMMAND_DOWN,
2443 {ui::ET_KEY_PRESSED, 1703 ui::DomKey::Constant<'4'>::Character},
2444 {ui::VKEY_3, 1704 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4}},
2445 ui::DomCode::DIGIT3, 1705 {ui::ET_KEY_PRESSED,
2446 ui::EF_COMMAND_DOWN, 1706 {ui::VKEY_5, ui::DomCode::DIGIT5, ui::EF_COMMAND_DOWN,
2447 ui::DomKey::CHARACTER, 1707 ui::DomKey::Constant<'5'>::Character},
2448 '3'}, 1708 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5}},
2449 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3, 0}}, 1709 {ui::ET_KEY_PRESSED,
2450 {ui::ET_KEY_PRESSED, 1710 {ui::VKEY_6, ui::DomCode::DIGIT6, ui::EF_COMMAND_DOWN,
2451 {ui::VKEY_4, 1711 ui::DomKey::Constant<'6'>::Character},
2452 ui::DomCode::DIGIT4, 1712 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6}},
2453 ui::EF_COMMAND_DOWN, 1713 {ui::ET_KEY_PRESSED,
2454 ui::DomKey::CHARACTER, 1714 {ui::VKEY_7, ui::DomCode::DIGIT7, ui::EF_COMMAND_DOWN,
2455 '4'}, 1715 ui::DomKey::Constant<'7'>::Character},
2456 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4, 0}}, 1716 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7}},
2457 {ui::ET_KEY_PRESSED, 1717 {ui::ET_KEY_PRESSED,
2458 {ui::VKEY_5, 1718 {ui::VKEY_8, ui::DomCode::DIGIT8, ui::EF_COMMAND_DOWN,
2459 ui::DomCode::DIGIT5, 1719 ui::DomKey::Constant<'8'>::Character},
2460 ui::EF_COMMAND_DOWN, 1720 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8}},
2461 ui::DomKey::CHARACTER, 1721 {ui::ET_KEY_PRESSED,
2462 '5'}, 1722 {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_COMMAND_DOWN,
2463 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5, 0}}, 1723 ui::DomKey::Constant<'9'>::Character},
2464 {ui::ET_KEY_PRESSED, 1724 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9}},
2465 {ui::VKEY_6, 1725 {ui::ET_KEY_PRESSED,
2466 ui::DomCode::DIGIT6, 1726 {ui::VKEY_0, ui::DomCode::DIGIT0, ui::EF_COMMAND_DOWN,
2467 ui::EF_COMMAND_DOWN, 1727 ui::DomKey::Constant<'0'>::Character},
2468 ui::DomKey::CHARACTER, 1728 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10}},
2469 '6'}, 1729 {ui::ET_KEY_PRESSED,
2470 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6, 0}}, 1730 {ui::VKEY_OEM_MINUS, ui::DomCode::MINUS, ui::EF_COMMAND_DOWN,
2471 {ui::ET_KEY_PRESSED, 1731 ui::DomKey::Constant<'-'>::Character},
2472 {ui::VKEY_7, 1732 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}},
2473 ui::DomCode::DIGIT7, 1733 {ui::ET_KEY_PRESSED,
2474 ui::EF_COMMAND_DOWN, 1734 {ui::VKEY_OEM_PLUS, ui::DomCode::EQUAL, ui::EF_COMMAND_DOWN,
2475 ui::DomKey::CHARACTER, 1735 ui::DomKey::Constant<'='>::Character},
2476 '7'}, 1736 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
2477 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7, 0}},
2478 {ui::ET_KEY_PRESSED,
2479 {ui::VKEY_8,
2480 ui::DomCode::DIGIT8,
2481 ui::EF_COMMAND_DOWN,
2482 ui::DomKey::CHARACTER,
2483 '8'},
2484 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8, 0}},
2485 {ui::ET_KEY_PRESSED,
2486 {ui::VKEY_9,
2487 ui::DomCode::DIGIT9,
2488 ui::EF_COMMAND_DOWN,
2489 ui::DomKey::CHARACTER,
2490 '9'},
2491 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9, 0}},
2492 {ui::ET_KEY_PRESSED,
2493 {ui::VKEY_0,
2494 ui::DomCode::DIGIT0,
2495 ui::EF_COMMAND_DOWN,
2496 ui::DomKey::CHARACTER,
2497 '0'},
2498 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10, 0}},
2499 {ui::ET_KEY_PRESSED,
2500 {ui::VKEY_OEM_MINUS,
2501 ui::DomCode::MINUS,
2502 ui::EF_COMMAND_DOWN,
2503 ui::DomKey::CHARACTER,
2504 '-'},
2505 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11, 0}},
2506 {ui::ET_KEY_PRESSED,
2507 {ui::VKEY_OEM_PLUS,
2508 ui::DomCode::EQUAL,
2509 ui::EF_COMMAND_DOWN,
2510 ui::DomKey::CHARACTER,
2511 '='},
2512 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12, 0}},
2513 1737
2514 // The function keys should not be rewritten with Search key pressed. 1738 // The function keys should not be rewritten with Search key pressed.
2515 {ui::ET_KEY_PRESSED, 1739 {ui::ET_KEY_PRESSED,
2516 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_COMMAND_DOWN, ui::DomKey::F1, 0}, 1740 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_COMMAND_DOWN, ui::DomKey::F1},
2517 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1, 0}}, 1741 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1}},
2518 {ui::ET_KEY_PRESSED, 1742 {ui::ET_KEY_PRESSED,
2519 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_COMMAND_DOWN, ui::DomKey::F2, 0}, 1743 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_COMMAND_DOWN, ui::DomKey::F2},
2520 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2, 0}}, 1744 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2}},
2521 {ui::ET_KEY_PRESSED, 1745 {ui::ET_KEY_PRESSED,
2522 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_COMMAND_DOWN, ui::DomKey::F3, 0}, 1746 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_COMMAND_DOWN, ui::DomKey::F3},
2523 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3, 0}}, 1747 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3}},
2524 {ui::ET_KEY_PRESSED, 1748 {ui::ET_KEY_PRESSED,
2525 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_COMMAND_DOWN, ui::DomKey::F4, 0}, 1749 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_COMMAND_DOWN, ui::DomKey::F4},
2526 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4, 0}}, 1750 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4}},
2527 {ui::ET_KEY_PRESSED, 1751 {ui::ET_KEY_PRESSED,
2528 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_COMMAND_DOWN, ui::DomKey::F5, 0}, 1752 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_COMMAND_DOWN, ui::DomKey::F5},
2529 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5, 0}}, 1753 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5}},
2530 {ui::ET_KEY_PRESSED, 1754 {ui::ET_KEY_PRESSED,
2531 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_COMMAND_DOWN, ui::DomKey::F6, 0}, 1755 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_COMMAND_DOWN, ui::DomKey::F6},
2532 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6, 0}}, 1756 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6}},
2533 {ui::ET_KEY_PRESSED, 1757 {ui::ET_KEY_PRESSED,
2534 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_COMMAND_DOWN, ui::DomKey::F7, 0}, 1758 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_COMMAND_DOWN, ui::DomKey::F7},
2535 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7, 0}}, 1759 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7}},
2536 {ui::ET_KEY_PRESSED, 1760 {ui::ET_KEY_PRESSED,
2537 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_COMMAND_DOWN, ui::DomKey::F8, 0}, 1761 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_COMMAND_DOWN, ui::DomKey::F8},
2538 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8, 0}}, 1762 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8}},
2539 {ui::ET_KEY_PRESSED, 1763 {ui::ET_KEY_PRESSED,
2540 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_COMMAND_DOWN, ui::DomKey::F9, 0}, 1764 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_COMMAND_DOWN, ui::DomKey::F9},
2541 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9, 0}}, 1765 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9}},
2542 {ui::ET_KEY_PRESSED, 1766 {ui::ET_KEY_PRESSED,
2543 {ui::VKEY_F10, 1767 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_COMMAND_DOWN, ui::DomKey::F10},
2544 ui::DomCode::F10, 1768 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10}},
2545 ui::EF_COMMAND_DOWN, 1769 {ui::ET_KEY_PRESSED,
2546 ui::DomKey::F10, 1770 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_COMMAND_DOWN, ui::DomKey::F11},
2547 0}, 1771 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}},
2548 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10, 0}}, 1772 {ui::ET_KEY_PRESSED,
2549 {ui::ET_KEY_PRESSED, 1773 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_COMMAND_DOWN, ui::DomKey::F12},
2550 {ui::VKEY_F11, 1774 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}}};
2551 ui::DomCode::F11,
2552 ui::EF_COMMAND_DOWN,
2553 ui::DomKey::F11,
2554 0},
2555 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11, 0}},
2556 {ui::ET_KEY_PRESSED,
2557 {ui::VKEY_F12,
2558 ui::DomCode::F12,
2559 ui::EF_COMMAND_DOWN,
2560 ui::DomKey::F12,
2561 0},
2562 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12, 0}}};
2563 1775
2564 for (const auto& test : tests) { 1776 for (const auto& test : tests) {
2565 CheckKeyTestCase(&rewriter, test); 1777 CheckKeyTestCase(&rewriter, test);
2566 } 1778 }
2567 } 1779 }
2568 1780
2569 TEST_F(EventRewriterTest, TestRewriteExtendedKeysWithSearchRemapped) { 1781 TEST_F(EventRewriterTest, TestRewriteExtendedKeysWithSearchRemapped) {
2570 // Remap Search to Control. 1782 // Remap Search to Control.
2571 TestingPrefServiceSyncable prefs; 1783 TestingPrefServiceSyncable prefs;
2572 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1784 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
2573 IntegerPrefMember search; 1785 IntegerPrefMember search;
2574 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); 1786 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs);
2575 search.SetValue(chromeos::input_method::kControlKey); 1787 search.SetValue(chromeos::input_method::kControlKey);
2576 1788
2577 EventRewriter rewriter(NULL); 1789 EventRewriter rewriter(NULL);
2578 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard"); 1790 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
2579 rewriter.set_pref_service_for_testing(&prefs); 1791 rewriter.set_pref_service_for_testing(&prefs);
2580 1792
2581 KeyTestCase tests[] = { 1793 KeyTestCase tests[] = {
2582 // Alt+Search+Down -> End 1794 // Alt+Search+Down -> End
2583 {ui::ET_KEY_PRESSED, 1795 {ui::ET_KEY_PRESSED,
2584 {ui::VKEY_DOWN, 1796 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN,
2585 ui::DomCode::ARROW_DOWN, 1797 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, ui::DomKey::ARROW_DOWN},
2586 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, 1798 {ui::VKEY_END, ui::DomCode::END, ui::EF_NONE, ui::DomKey::END}},
2587 ui::DomKey::ARROW_DOWN,
2588 0},
2589 {ui::VKEY_END, ui::DomCode::END, ui::EF_NONE, ui::DomKey::END, 0}},
2590 1799
2591 // Shift+Alt+Search+Down -> Shift+End 1800 // Shift+Alt+Search+Down -> Shift+End
2592 {ui::ET_KEY_PRESSED, 1801 {ui::ET_KEY_PRESSED,
2593 {ui::VKEY_DOWN, 1802 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN,
2594 ui::DomCode::ARROW_DOWN,
2595 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, 1803 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
2596 ui::DomKey::ARROW_DOWN, 1804 ui::DomKey::ARROW_DOWN},
2597 0}, 1805 {ui::VKEY_END, ui::DomCode::END, ui::EF_SHIFT_DOWN, ui::DomKey::END}},
2598 {ui::VKEY_END, ui::DomCode::END, ui::EF_SHIFT_DOWN, ui::DomKey::END, 0}},
2599 }; 1806 };
2600 1807
2601 for (const auto& test : tests) { 1808 for (const auto& test : tests) {
2602 CheckKeyTestCase(&rewriter, test); 1809 CheckKeyTestCase(&rewriter, test);
2603 } 1810 }
2604 } 1811 }
2605 1812
2606 TEST_F(EventRewriterTest, TestRewriteKeyEventSentByXSendEvent) { 1813 TEST_F(EventRewriterTest, TestRewriteKeyEventSentByXSendEvent) {
2607 // Remap Control to Alt. 1814 // Remap Control to Alt.
2608 TestingPrefServiceSyncable prefs; 1815 TestingPrefServiceSyncable prefs;
2609 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1816 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
2610 IntegerPrefMember control; 1817 IntegerPrefMember control;
2611 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); 1818 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs);
2612 control.SetValue(chromeos::input_method::kAltKey); 1819 control.SetValue(chromeos::input_method::kAltKey);
2613 1820
2614 EventRewriter rewriter(NULL); 1821 EventRewriter rewriter(NULL);
2615 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard"); 1822 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
2616 rewriter.set_pref_service_for_testing(&prefs); 1823 rewriter.set_pref_service_for_testing(&prefs);
2617 1824
2618 // Send left control press. 1825 // Send left control press.
2619 { 1826 {
2620 ui::KeyEvent keyevent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 1827 ui::KeyEvent keyevent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL,
2621 ui::DomCode::CONTROL_LEFT, ui::EF_FINAL, 1828 ui::DomCode::CONTROL_LEFT, ui::EF_FINAL,
2622 ui::DomKey::CONTROL, 0, ui::EventTimeForNow()); 1829 ui::DomKey::CONTROL, ui::EventTimeForNow());
2623 scoped_ptr<ui::Event> new_event; 1830 scoped_ptr<ui::Event> new_event;
2624 // Control should NOT be remapped to Alt if EF_FINAL is set. 1831 // Control should NOT be remapped to Alt if EF_FINAL is set.
2625 EXPECT_EQ(ui::EVENT_REWRITE_CONTINUE, 1832 EXPECT_EQ(ui::EVENT_REWRITE_CONTINUE,
2626 rewriter.RewriteEvent(keyevent, &new_event)); 1833 rewriter.RewriteEvent(keyevent, &new_event));
2627 EXPECT_FALSE(new_event); 1834 EXPECT_FALSE(new_event);
2628 } 1835 }
2629 #if defined(USE_X11) 1836 #if defined(USE_X11)
2630 // Send left control press, using XI2 native events. 1837 // Send left control press, using XI2 native events.
2631 { 1838 {
2632 ui::ScopedXI2Event xev; 1839 ui::ScopedXI2Event xev;
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
2733 return rewriter_->RewriteEvent(event, rewritten_event); 1940 return rewriter_->RewriteEvent(event, rewritten_event);
2734 } 1941 }
2735 1942
2736 ui::EventDispatchDetails Send(ui::Event* event) { 1943 ui::EventDispatchDetails Send(ui::Event* event) {
2737 return source_.Send(event); 1944 return source_.Send(event);
2738 } 1945 }
2739 1946
2740 void SendKeyEvent(ui::EventType type, 1947 void SendKeyEvent(ui::EventType type,
2741 ui::KeyboardCode key_code, 1948 ui::KeyboardCode key_code,
2742 ui::DomCode code, 1949 ui::DomCode code,
2743 ui::DomKey key, 1950 ui::DomKey key) {
2744 base::char16 character) { 1951 ui::KeyEvent press(type, key_code, code, ui::EF_NONE, key,
2745 ui::KeyEvent press(type, key_code, code, ui::EF_NONE, key, character,
2746 ui::EventTimeForNow()); 1952 ui::EventTimeForNow());
2747 ui::EventDispatchDetails details = Send(&press); 1953 ui::EventDispatchDetails details = Send(&press);
2748 CHECK(!details.dispatcher_destroyed); 1954 CHECK(!details.dispatcher_destroyed);
2749 } 1955 }
2750 1956
2751 void SendActivateStickyKeyPattern(ui::KeyboardCode key_code, 1957 void SendActivateStickyKeyPattern(ui::KeyboardCode key_code,
2752 ui::DomCode code, 1958 ui::DomCode code,
2753 ui::DomKey key, 1959 ui::DomKey key) {
2754 base::char16 character) { 1960 SendKeyEvent(ui::ET_KEY_PRESSED, key_code, code, key);
2755 SendKeyEvent(ui::ET_KEY_PRESSED, key_code, code, key, character); 1961 SendKeyEvent(ui::ET_KEY_RELEASED, key_code, code, key);
2756 SendKeyEvent(ui::ET_KEY_RELEASED, key_code, code, key, character);
2757 } 1962 }
2758 1963
2759 protected: 1964 protected:
2760 TestingPrefServiceSyncable* prefs() { return &prefs_; } 1965 TestingPrefServiceSyncable* prefs() { return &prefs_; }
2761 1966
2762 void PopEvents(ScopedVector<ui::Event>* events) { buffer_.PopEvents(events); } 1967 void PopEvents(ScopedVector<ui::Event>* events) { buffer_.PopEvents(events); }
2763 1968
2764 void SetUp() override { 1969 void SetUp() override {
2765 AshTestBase::SetUp(); 1970 AshTestBase::SetUp();
2766 sticky_keys_controller_ = 1971 sticky_keys_controller_ =
(...skipping 30 matching lines...) Expand all
2797 }; 2002 };
2798 2003
2799 TEST_F(EventRewriterAshTest, TopRowKeysAreFunctionKeys) { 2004 TEST_F(EventRewriterAshTest, TopRowKeysAreFunctionKeys) {
2800 scoped_ptr<aura::Window> window(CreateTestWindowInShellWithId(1)); 2005 scoped_ptr<aura::Window> window(CreateTestWindowInShellWithId(1));
2801 ash::wm::WindowState* window_state = ash::wm::GetWindowState(window.get()); 2006 ash::wm::WindowState* window_state = ash::wm::GetWindowState(window.get());
2802 window_state->Activate(); 2007 window_state->Activate();
2803 ScopedVector<ui::Event> events; 2008 ScopedVector<ui::Event> events;
2804 2009
2805 // Create a simulated keypress of F1 targetted at the window. 2010 // Create a simulated keypress of F1 targetted at the window.
2806 ui::KeyEvent press_f1(ui::ET_KEY_PRESSED, ui::VKEY_F1, ui::DomCode::F1, 2011 ui::KeyEvent press_f1(ui::ET_KEY_PRESSED, ui::VKEY_F1, ui::DomCode::F1,
2807 ui::EF_NONE, ui::DomKey::F1, 0, ui::EventTimeForNow()); 2012 ui::EF_NONE, ui::DomKey::F1, ui::EventTimeForNow());
2808 2013
2809 // Simulate an apps v2 window that has requested top row keys as function 2014 // Simulate an apps v2 window that has requested top row keys as function
2810 // keys. The event should not be rewritten. 2015 // keys. The event should not be rewritten.
2811 window_state->set_top_row_keys_are_function_keys(true); 2016 window_state->set_top_row_keys_are_function_keys(true);
2812 ui::EventDispatchDetails details = Send(&press_f1); 2017 ui::EventDispatchDetails details = Send(&press_f1);
2813 ASSERT_FALSE(details.dispatcher_destroyed); 2018 ASSERT_FALSE(details.dispatcher_destroyed);
2814 PopEvents(&events); 2019 PopEvents(&events);
2815 EXPECT_EQ(1u, events.size()); 2020 EXPECT_EQ(1u, events.size());
2816 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_F1, 2021 EXPECT_EQ(
2817 ui::DomCode::F1, ui::EF_NONE, 2022 GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_F1,
2818 ui::DomKey::F1, 0), 2023 ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1),
2819 GetKeyEventAsString(*static_cast<ui::KeyEvent*>(events[0]))); 2024 GetKeyEventAsString(*static_cast<ui::KeyEvent*>(events[0])));
2820 2025
2821 // The event should also not be rewritten if the send-function-keys pref is 2026 // The event should also not be rewritten if the send-function-keys pref is
2822 // additionally set, for both apps v2 and regular windows. 2027 // additionally set, for both apps v2 and regular windows.
2823 BooleanPrefMember send_function_keys_pref; 2028 BooleanPrefMember send_function_keys_pref;
2824 send_function_keys_pref.Init(prefs::kLanguageSendFunctionKeys, prefs()); 2029 send_function_keys_pref.Init(prefs::kLanguageSendFunctionKeys, prefs());
2825 send_function_keys_pref.SetValue(true); 2030 send_function_keys_pref.SetValue(true);
2826 window_state->set_top_row_keys_are_function_keys(false); 2031 window_state->set_top_row_keys_are_function_keys(false);
2827 details = Send(&press_f1); 2032 details = Send(&press_f1);
2828 ASSERT_FALSE(details.dispatcher_destroyed); 2033 ASSERT_FALSE(details.dispatcher_destroyed);
2829 PopEvents(&events); 2034 PopEvents(&events);
2830 EXPECT_EQ(1u, events.size()); 2035 EXPECT_EQ(1u, events.size());
2831 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_F1, 2036 EXPECT_EQ(
2832 ui::DomCode::F1, ui::EF_NONE, 2037 GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_F1,
2833 ui::DomKey::F1, 0), 2038 ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1),
2834 GetKeyEventAsString(*static_cast<ui::KeyEvent*>(events[0]))); 2039 GetKeyEventAsString(*static_cast<ui::KeyEvent*>(events[0])));
2835 2040
2836 // If the pref isn't set when an event is sent to a regular window, F1 is 2041 // If the pref isn't set when an event is sent to a regular window, F1 is
2837 // rewritten to the back key. 2042 // rewritten to the back key.
2838 send_function_keys_pref.SetValue(false); 2043 send_function_keys_pref.SetValue(false);
2839 details = Send(&press_f1); 2044 details = Send(&press_f1);
2840 ASSERT_FALSE(details.dispatcher_destroyed); 2045 ASSERT_FALSE(details.dispatcher_destroyed);
2841 PopEvents(&events); 2046 PopEvents(&events);
2842 EXPECT_EQ(1u, events.size()); 2047 EXPECT_EQ(1u, events.size());
2843 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_BROWSER_BACK, 2048 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_BROWSER_BACK,
2844 ui::DomCode::BROWSER_BACK, ui::EF_NONE, 2049 ui::DomCode::BROWSER_BACK, ui::EF_NONE,
2845 ui::DomKey::BROWSER_BACK, 0), 2050 ui::DomKey::BROWSER_BACK),
2846 GetKeyEventAsString(*static_cast<ui::KeyEvent*>(events[0]))); 2051 GetKeyEventAsString(*static_cast<ui::KeyEvent*>(events[0])));
2847 } 2052 }
2848 2053
2849 TEST_F(EventRewriterTest, TestRewrittenModifierClick) { 2054 TEST_F(EventRewriterTest, TestRewrittenModifierClick) {
2850 #if defined(USE_X11) 2055 #if defined(USE_X11)
2851 std::vector<int> device_list; 2056 std::vector<int> device_list;
2852 device_list.push_back(10); 2057 device_list.push_back(10);
2853 ui::TouchFactory::GetInstance()->SetPointerDeviceForTest(device_list); 2058 ui::TouchFactory::GetInstance()->SetPointerDeviceForTest(device_list);
2854 2059
2855 // Remap Control to Alt. 2060 // Remap Control to Alt.
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
3086 EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, result->changed_button_flags()); 2291 EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, result->changed_button_flags());
3087 } 2292 }
3088 #endif 2293 #endif
3089 } 2294 }
3090 2295
3091 TEST_F(EventRewriterAshTest, StickyKeyEventDispatchImpl) { 2296 TEST_F(EventRewriterAshTest, StickyKeyEventDispatchImpl) {
3092 // Test the actual key event dispatch implementation. 2297 // Test the actual key event dispatch implementation.
3093 ScopedVector<ui::Event> events; 2298 ScopedVector<ui::Event> events;
3094 2299
3095 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, 2300 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
3096 ui::DomKey::CONTROL, 0); 2301 ui::DomKey::CONTROL);
3097 PopEvents(&events); 2302 PopEvents(&events);
3098 EXPECT_EQ(1u, events.size()); 2303 EXPECT_EQ(1u, events.size());
3099 EXPECT_EQ(ui::ET_KEY_PRESSED, events[0]->type()); 2304 EXPECT_EQ(ui::ET_KEY_PRESSED, events[0]->type());
3100 EXPECT_EQ(ui::VKEY_CONTROL, 2305 EXPECT_EQ(ui::VKEY_CONTROL,
3101 static_cast<ui::KeyEvent*>(events[0])->key_code()); 2306 static_cast<ui::KeyEvent*>(events[0])->key_code());
3102 2307
3103 // Test key press event is correctly modified and modifier release 2308 // Test key press event is correctly modified and modifier release
3104 // event is sent. 2309 // event is sent.
3105 ui::KeyEvent press(ui::ET_KEY_PRESSED, ui::VKEY_C, ui::DomCode::KEY_C, 2310 ui::KeyEvent press(ui::ET_KEY_PRESSED, ui::VKEY_C, ui::DomCode::KEY_C,
3106 ui::EF_NONE, ui::DomKey::CHARACTER, 'c', 2311 ui::EF_NONE, ui::DomKey::Constant<'c'>::Character,
3107 ui::EventTimeForNow()); 2312 ui::EventTimeForNow());
3108 ui::EventDispatchDetails details = Send(&press); 2313 ui::EventDispatchDetails details = Send(&press);
3109 PopEvents(&events); 2314 PopEvents(&events);
3110 EXPECT_EQ(2u, events.size()); 2315 EXPECT_EQ(2u, events.size());
3111 EXPECT_EQ(ui::ET_KEY_PRESSED, events[0]->type()); 2316 EXPECT_EQ(ui::ET_KEY_PRESSED, events[0]->type());
3112 EXPECT_EQ(ui::VKEY_C, static_cast<ui::KeyEvent*>(events[0])->key_code()); 2317 EXPECT_EQ(ui::VKEY_C, static_cast<ui::KeyEvent*>(events[0])->key_code());
3113 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); 2318 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
3114 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); 2319 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type());
3115 EXPECT_EQ(ui::VKEY_CONTROL, 2320 EXPECT_EQ(ui::VKEY_CONTROL,
3116 static_cast<ui::KeyEvent*>(events[1])->key_code()); 2321 static_cast<ui::KeyEvent*>(events[1])->key_code());
3117 2322
3118 // Test key release event is not modified. 2323 // Test key release event is not modified.
3119 ui::KeyEvent release(ui::ET_KEY_RELEASED, ui::VKEY_C, ui::DomCode::KEY_C, 2324 ui::KeyEvent release(ui::ET_KEY_RELEASED, ui::VKEY_C, ui::DomCode::KEY_C,
3120 ui::EF_NONE, ui::DomKey::CHARACTER, 'c', 2325 ui::EF_NONE, ui::DomKey::Constant<'c'>::Character,
3121 ui::EventTimeForNow()); 2326 ui::EventTimeForNow());
3122 details = Send(&release); 2327 details = Send(&release);
3123 ASSERT_FALSE(details.dispatcher_destroyed); 2328 ASSERT_FALSE(details.dispatcher_destroyed);
3124 PopEvents(&events); 2329 PopEvents(&events);
3125 EXPECT_EQ(1u, events.size()); 2330 EXPECT_EQ(1u, events.size());
3126 EXPECT_EQ(ui::ET_KEY_RELEASED, events[0]->type()); 2331 EXPECT_EQ(ui::ET_KEY_RELEASED, events[0]->type());
3127 EXPECT_EQ(ui::VKEY_C, static_cast<ui::KeyEvent*>(events[0])->key_code()); 2332 EXPECT_EQ(ui::VKEY_C, static_cast<ui::KeyEvent*>(events[0])->key_code());
3128 EXPECT_FALSE(events[0]->flags() & ui::EF_CONTROL_DOWN); 2333 EXPECT_FALSE(events[0]->flags() & ui::EF_CONTROL_DOWN);
3129 } 2334 }
3130 2335
3131 TEST_F(EventRewriterAshTest, MouseEventDispatchImpl) { 2336 TEST_F(EventRewriterAshTest, MouseEventDispatchImpl) {
3132 ScopedVector<ui::Event> events; 2337 ScopedVector<ui::Event> events;
3133 2338
3134 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, 2339 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
3135 ui::DomKey::CONTROL, 0); 2340 ui::DomKey::CONTROL);
3136 PopEvents(&events); 2341 PopEvents(&events);
3137 2342
3138 // Test mouse press event is correctly modified. 2343 // Test mouse press event is correctly modified.
3139 gfx::Point location(0, 0); 2344 gfx::Point location(0, 0);
3140 ui::MouseEvent press(ui::ET_MOUSE_PRESSED, location, location, 2345 ui::MouseEvent press(ui::ET_MOUSE_PRESSED, location, location,
3141 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, 2346 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
3142 ui::EF_LEFT_MOUSE_BUTTON); 2347 ui::EF_LEFT_MOUSE_BUTTON);
3143 ui::EventDispatchDetails details = Send(&press); 2348 ui::EventDispatchDetails details = Send(&press);
3144 ASSERT_FALSE(details.dispatcher_destroyed); 2349 ASSERT_FALSE(details.dispatcher_destroyed);
3145 PopEvents(&events); 2350 PopEvents(&events);
(...skipping 16 matching lines...) Expand all
3162 EXPECT_EQ(ui::VKEY_CONTROL, 2367 EXPECT_EQ(ui::VKEY_CONTROL,
3163 static_cast<ui::KeyEvent*>(events[1])->key_code()); 2368 static_cast<ui::KeyEvent*>(events[1])->key_code());
3164 } 2369 }
3165 2370
3166 TEST_F(EventRewriterAshTest, MouseWheelEventDispatchImpl) { 2371 TEST_F(EventRewriterAshTest, MouseWheelEventDispatchImpl) {
3167 ScopedVector<ui::Event> events; 2372 ScopedVector<ui::Event> events;
3168 2373
3169 // Test positive mouse wheel event is correctly modified and modifier release 2374 // Test positive mouse wheel event is correctly modified and modifier release
3170 // event is sent. 2375 // event is sent.
3171 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, 2376 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
3172 ui::DomKey::CONTROL, 0); 2377 ui::DomKey::CONTROL);
3173 PopEvents(&events); 2378 PopEvents(&events);
3174 gfx::Point location(0, 0); 2379 gfx::Point location(0, 0);
3175 ui::MouseEvent mev(ui::ET_MOUSEWHEEL, location, location, 2380 ui::MouseEvent mev(ui::ET_MOUSEWHEEL, location, location,
3176 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, 2381 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
3177 ui::EF_LEFT_MOUSE_BUTTON); 2382 ui::EF_LEFT_MOUSE_BUTTON);
3178 ui::MouseWheelEvent positive(mev, 0, ui::MouseWheelEvent::kWheelDelta); 2383 ui::MouseWheelEvent positive(mev, 0, ui::MouseWheelEvent::kWheelDelta);
3179 ui::EventDispatchDetails details = Send(&positive); 2384 ui::EventDispatchDetails details = Send(&positive);
3180 ASSERT_FALSE(details.dispatcher_destroyed); 2385 ASSERT_FALSE(details.dispatcher_destroyed);
3181 PopEvents(&events); 2386 PopEvents(&events);
3182 EXPECT_EQ(2u, events.size()); 2387 EXPECT_EQ(2u, events.size());
3183 EXPECT_TRUE(events[0]->IsMouseWheelEvent()); 2388 EXPECT_TRUE(events[0]->IsMouseWheelEvent());
3184 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); 2389 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
3185 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); 2390 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type());
3186 EXPECT_EQ(ui::VKEY_CONTROL, 2391 EXPECT_EQ(ui::VKEY_CONTROL,
3187 static_cast<ui::KeyEvent*>(events[1])->key_code()); 2392 static_cast<ui::KeyEvent*>(events[1])->key_code());
3188 2393
3189 // Test negative mouse wheel event is correctly modified and modifier release 2394 // Test negative mouse wheel event is correctly modified and modifier release
3190 // event is sent. 2395 // event is sent.
3191 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, 2396 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
3192 ui::DomKey::CONTROL, 0); 2397 ui::DomKey::CONTROL);
3193 PopEvents(&events); 2398 PopEvents(&events);
3194 ui::MouseWheelEvent negative(mev, 0, -ui::MouseWheelEvent::kWheelDelta); 2399 ui::MouseWheelEvent negative(mev, 0, -ui::MouseWheelEvent::kWheelDelta);
3195 details = Send(&negative); 2400 details = Send(&negative);
3196 ASSERT_FALSE(details.dispatcher_destroyed); 2401 ASSERT_FALSE(details.dispatcher_destroyed);
3197 PopEvents(&events); 2402 PopEvents(&events);
3198 EXPECT_EQ(2u, events.size()); 2403 EXPECT_EQ(2u, events.size());
3199 EXPECT_TRUE(events[0]->IsMouseWheelEvent()); 2404 EXPECT_TRUE(events[0]->IsMouseWheelEvent());
3200 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); 2405 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
3201 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); 2406 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type());
3202 EXPECT_EQ(ui::VKEY_CONTROL, 2407 EXPECT_EQ(ui::VKEY_CONTROL,
(...skipping 15 matching lines...) Expand all
3218 ash::StickyKeysOverlay* overlay_; 2423 ash::StickyKeysOverlay* overlay_;
3219 }; 2424 };
3220 2425
3221 TEST_F(StickyKeysOverlayTest, OneModifierEnabled) { 2426 TEST_F(StickyKeysOverlayTest, OneModifierEnabled) {
3222 EXPECT_FALSE(overlay_->is_visible()); 2427 EXPECT_FALSE(overlay_->is_visible());
3223 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, 2428 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
3224 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); 2429 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
3225 2430
3226 // Pressing modifier key should show overlay. 2431 // Pressing modifier key should show overlay.
3227 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, 2432 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
3228 ui::DomKey::CONTROL, 0); 2433 ui::DomKey::CONTROL);
3229 EXPECT_TRUE(overlay_->is_visible()); 2434 EXPECT_TRUE(overlay_->is_visible());
3230 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED, 2435 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED,
3231 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); 2436 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
3232 2437
3233 // Pressing a normal key should hide overlay. 2438 // Pressing a normal key should hide overlay.
3234 SendActivateStickyKeyPattern(ui::VKEY_T, ui::DomCode::KEY_T, 2439 SendActivateStickyKeyPattern(ui::VKEY_T, ui::DomCode::KEY_T,
3235 ui::DomKey::CHARACTER, 't'); 2440 ui::DomKey::Constant<'t'>::Character);
3236 EXPECT_FALSE(overlay_->is_visible()); 2441 EXPECT_FALSE(overlay_->is_visible());
3237 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, 2442 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
3238 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); 2443 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
3239 } 2444 }
3240 2445
3241 TEST_F(StickyKeysOverlayTest, TwoModifiersEnabled) { 2446 TEST_F(StickyKeysOverlayTest, TwoModifiersEnabled) {
3242 EXPECT_FALSE(overlay_->is_visible()); 2447 EXPECT_FALSE(overlay_->is_visible());
3243 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, 2448 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
3244 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); 2449 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
3245 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, 2450 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
3246 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); 2451 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
3247 2452
3248 // Pressing two modifiers should show overlay. 2453 // Pressing two modifiers should show overlay.
3249 SendActivateStickyKeyPattern(ui::VKEY_SHIFT, ui::DomCode::SHIFT_LEFT, 2454 SendActivateStickyKeyPattern(ui::VKEY_SHIFT, ui::DomCode::SHIFT_LEFT,
3250 ui::DomKey::SHIFT, 0); 2455 ui::DomKey::SHIFT);
3251 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, 2456 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
3252 ui::DomKey::CONTROL, 0); 2457 ui::DomKey::CONTROL);
3253 EXPECT_TRUE(overlay_->is_visible()); 2458 EXPECT_TRUE(overlay_->is_visible());
3254 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED, 2459 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED,
3255 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); 2460 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
3256 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED, 2461 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED,
3257 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); 2462 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
3258 2463
3259 // Pressing a normal key should hide overlay. 2464 // Pressing a normal key should hide overlay.
3260 SendActivateStickyKeyPattern(ui::VKEY_N, ui::DomCode::KEY_N, 2465 SendActivateStickyKeyPattern(ui::VKEY_N, ui::DomCode::KEY_N,
3261 ui::DomKey::CHARACTER, 'n'); 2466 ui::DomKey::Constant<'n'>::Character);
3262 EXPECT_FALSE(overlay_->is_visible()); 2467 EXPECT_FALSE(overlay_->is_visible());
3263 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, 2468 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
3264 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); 2469 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
3265 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, 2470 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
3266 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); 2471 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
3267 } 2472 }
3268 2473
3269 TEST_F(StickyKeysOverlayTest, LockedModifier) { 2474 TEST_F(StickyKeysOverlayTest, LockedModifier) {
3270 EXPECT_FALSE(overlay_->is_visible()); 2475 EXPECT_FALSE(overlay_->is_visible());
3271 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, 2476 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
3272 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN)); 2477 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
3273 2478
3274 // Pressing a modifier key twice should lock modifier and show overlay. 2479 // Pressing a modifier key twice should lock modifier and show overlay.
3275 SendActivateStickyKeyPattern(ui::VKEY_LMENU, ui::DomCode::ALT_LEFT, 2480 SendActivateStickyKeyPattern(ui::VKEY_LMENU, ui::DomCode::ALT_LEFT,
3276 ui::DomKey::ALT, 0); 2481 ui::DomKey::ALT);
3277 SendActivateStickyKeyPattern(ui::VKEY_LMENU, ui::DomCode::ALT_LEFT, 2482 SendActivateStickyKeyPattern(ui::VKEY_LMENU, ui::DomCode::ALT_LEFT,
3278 ui::DomKey::ALT, 0); 2483 ui::DomKey::ALT);
3279 EXPECT_TRUE(overlay_->is_visible()); 2484 EXPECT_TRUE(overlay_->is_visible());
3280 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED, 2485 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED,
3281 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN)); 2486 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
3282 2487
3283 // Pressing a normal key should not hide overlay. 2488 // Pressing a normal key should not hide overlay.
3284 SendActivateStickyKeyPattern(ui::VKEY_D, ui::DomCode::KEY_D, 2489 SendActivateStickyKeyPattern(ui::VKEY_D, ui::DomCode::KEY_D,
3285 ui::DomKey::CHARACTER, 'd'); 2490 ui::DomKey::Constant<'d'>::Character);
3286 EXPECT_TRUE(overlay_->is_visible()); 2491 EXPECT_TRUE(overlay_->is_visible());
3287 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED, 2492 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED,
3288 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN)); 2493 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
3289 } 2494 }
3290 2495
3291 TEST_F(StickyKeysOverlayTest, LockedAndNormalModifier) { 2496 TEST_F(StickyKeysOverlayTest, LockedAndNormalModifier) {
3292 EXPECT_FALSE(overlay_->is_visible()); 2497 EXPECT_FALSE(overlay_->is_visible());
3293 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, 2498 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
3294 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); 2499 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
3295 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, 2500 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
3296 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); 2501 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
3297 2502
3298 // Pressing a modifier key twice should lock modifier and show overlay. 2503 // Pressing a modifier key twice should lock modifier and show overlay.
3299 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, 2504 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
3300 ui::DomKey::CONTROL, 0); 2505 ui::DomKey::CONTROL);
3301 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, 2506 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
3302 ui::DomKey::CONTROL, 0); 2507 ui::DomKey::CONTROL);
3303 EXPECT_TRUE(overlay_->is_visible()); 2508 EXPECT_TRUE(overlay_->is_visible());
3304 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED, 2509 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED,
3305 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); 2510 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
3306 2511
3307 // Pressing another modifier key should still show overlay. 2512 // Pressing another modifier key should still show overlay.
3308 SendActivateStickyKeyPattern(ui::VKEY_SHIFT, ui::DomCode::SHIFT_LEFT, 2513 SendActivateStickyKeyPattern(ui::VKEY_SHIFT, ui::DomCode::SHIFT_LEFT,
3309 ui::DomKey::SHIFT, 0); 2514 ui::DomKey::SHIFT);
3310 EXPECT_TRUE(overlay_->is_visible()); 2515 EXPECT_TRUE(overlay_->is_visible());
3311 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED, 2516 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED,
3312 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); 2517 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
3313 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED, 2518 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED,
3314 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); 2519 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
3315 2520
3316 // Pressing a normal key should not hide overlay but disable normal modifier. 2521 // Pressing a normal key should not hide overlay but disable normal modifier.
3317 SendActivateStickyKeyPattern(ui::VKEY_D, ui::DomCode::KEY_D, 2522 SendActivateStickyKeyPattern(ui::VKEY_D, ui::DomCode::KEY_D,
3318 ui::DomKey::CHARACTER, 'd'); 2523 ui::DomKey::Constant<'d'>::Character);
3319 EXPECT_TRUE(overlay_->is_visible()); 2524 EXPECT_TRUE(overlay_->is_visible());
3320 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED, 2525 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED,
3321 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); 2526 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
3322 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, 2527 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
3323 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); 2528 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
3324 } 2529 }
3325 2530
3326 TEST_F(StickyKeysOverlayTest, ModifiersDisabled) { 2531 TEST_F(StickyKeysOverlayTest, ModifiersDisabled) {
3327 EXPECT_FALSE(overlay_->is_visible()); 2532 EXPECT_FALSE(overlay_->is_visible());
3328 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, 2533 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
3329 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); 2534 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
3330 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, 2535 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
3331 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); 2536 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
3332 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, 2537 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
3333 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN)); 2538 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
3334 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, 2539 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
3335 overlay_->GetModifierKeyState(ui::EF_COMMAND_DOWN)); 2540 overlay_->GetModifierKeyState(ui::EF_COMMAND_DOWN));
3336 2541
3337 // Enable modifiers. 2542 // Enable modifiers.
3338 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, 2543 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
3339 ui::DomKey::CONTROL, 0); 2544 ui::DomKey::CONTROL);
3340 SendActivateStickyKeyPattern(ui::VKEY_SHIFT, ui::DomCode::SHIFT_LEFT, 2545 SendActivateStickyKeyPattern(ui::VKEY_SHIFT, ui::DomCode::SHIFT_LEFT,
3341 ui::DomKey::SHIFT, 0); 2546 ui::DomKey::SHIFT);
3342 SendActivateStickyKeyPattern(ui::VKEY_SHIFT, ui::DomCode::SHIFT_LEFT, 2547 SendActivateStickyKeyPattern(ui::VKEY_SHIFT, ui::DomCode::SHIFT_LEFT,
3343 ui::DomKey::SHIFT, 0); 2548 ui::DomKey::SHIFT);
3344 SendActivateStickyKeyPattern(ui::VKEY_LMENU, ui::DomCode::ALT_LEFT, 2549 SendActivateStickyKeyPattern(ui::VKEY_LMENU, ui::DomCode::ALT_LEFT,
3345 ui::DomKey::ALT, 0); 2550 ui::DomKey::ALT);
3346 SendActivateStickyKeyPattern(ui::VKEY_COMMAND, ui::DomCode::OS_LEFT, 2551 SendActivateStickyKeyPattern(ui::VKEY_COMMAND, ui::DomCode::OS_LEFT,
3347 ui::DomKey::OS, 0); 2552 ui::DomKey::OS);
3348 SendActivateStickyKeyPattern(ui::VKEY_COMMAND, ui::DomCode::OS_LEFT, 2553 SendActivateStickyKeyPattern(ui::VKEY_COMMAND, ui::DomCode::OS_LEFT,
3349 ui::DomKey::OS, 0); 2554 ui::DomKey::OS);
3350 2555
3351 EXPECT_TRUE(overlay_->is_visible()); 2556 EXPECT_TRUE(overlay_->is_visible());
3352 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED, 2557 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED,
3353 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); 2558 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
3354 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED, 2559 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED,
3355 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); 2560 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
3356 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED, 2561 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED,
3357 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN)); 2562 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
3358 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED, 2563 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED,
3359 overlay_->GetModifierKeyState(ui::EF_COMMAND_DOWN)); 2564 overlay_->GetModifierKeyState(ui::EF_COMMAND_DOWN));
3360 2565
3361 // Disable modifiers and overlay should be hidden. 2566 // Disable modifiers and overlay should be hidden.
3362 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, 2567 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
3363 ui::DomKey::CONTROL, 0); 2568 ui::DomKey::CONTROL);
3364 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, 2569 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
3365 ui::DomKey::CONTROL, 0); 2570 ui::DomKey::CONTROL);
3366 SendActivateStickyKeyPattern(ui::VKEY_SHIFT, ui::DomCode::SHIFT_LEFT, 2571 SendActivateStickyKeyPattern(ui::VKEY_SHIFT, ui::DomCode::SHIFT_LEFT,
3367 ui::DomKey::SHIFT, 0); 2572 ui::DomKey::SHIFT);
3368 SendActivateStickyKeyPattern(ui::VKEY_LMENU, ui::DomCode::ALT_LEFT, 2573 SendActivateStickyKeyPattern(ui::VKEY_LMENU, ui::DomCode::ALT_LEFT,
3369 ui::DomKey::ALT, 0); 2574 ui::DomKey::ALT);
3370 SendActivateStickyKeyPattern(ui::VKEY_LMENU, ui::DomCode::ALT_LEFT, 2575 SendActivateStickyKeyPattern(ui::VKEY_LMENU, ui::DomCode::ALT_LEFT,
3371 ui::DomKey::ALT, 0); 2576 ui::DomKey::ALT);
3372 SendActivateStickyKeyPattern(ui::VKEY_COMMAND, ui::DomCode::OS_LEFT, 2577 SendActivateStickyKeyPattern(ui::VKEY_COMMAND, ui::DomCode::OS_LEFT,
3373 ui::DomKey::OS, 0); 2578 ui::DomKey::OS);
3374 2579
3375 EXPECT_FALSE(overlay_->is_visible()); 2580 EXPECT_FALSE(overlay_->is_visible());
3376 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, 2581 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
3377 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); 2582 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
3378 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, 2583 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
3379 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); 2584 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
3380 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, 2585 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
3381 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN)); 2586 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
3382 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, 2587 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
3383 overlay_->GetModifierKeyState(ui::EF_COMMAND_DOWN)); 2588 overlay_->GetModifierKeyState(ui::EF_COMMAND_DOWN));
(...skipping 27 matching lines...) Expand all
3411 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN)); 2616 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
3412 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN)); 2617 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));
3413 2618
3414 // Turn off AltGr and Mod3. 2619 // Turn off AltGr and Mod3.
3415 sticky_keys_controller_->SetModifiersEnabled(false, false); 2620 sticky_keys_controller_->SetModifiersEnabled(false, false);
3416 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN)); 2621 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
3417 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN)); 2622 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));
3418 } 2623 }
3419 2624
3420 } // namespace chromeos 2625 } // namespace chromeos
OLDNEW
« no previous file with comments | « chrome/browser/chromeos/events/event_rewriter.cc ('k') | chrome/browser/chromeos/events/keyboard_driven_event_rewriter.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698