OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/chromeos/events/event_rewriter.h" | 5 #include "chrome/browser/chromeos/events/event_rewriter.h" |
6 | 6 |
7 #include <X11/keysym.h> | |
8 #include <X11/XF86keysym.h> | |
9 #include <X11/Xlib.h> | |
10 #undef Bool | |
11 #undef None | |
12 #undef RootWindow | |
13 | |
14 #include <vector> | 7 #include <vector> |
15 | 8 |
| 9 #include "ash/shell.h" |
| 10 #include "ash/sticky_keys/sticky_keys_controller.h" |
16 #include "ash/test/ash_test_base.h" | 11 #include "ash/test/ash_test_base.h" |
17 #include "ash/wm/window_state.h" | 12 #include "ash/wm/window_state.h" |
18 #include "base/basictypes.h" | 13 #include "base/basictypes.h" |
19 #include "base/command_line.h" | 14 #include "base/command_line.h" |
20 #include "base/prefs/pref_member.h" | 15 #include "base/prefs/pref_member.h" |
21 #include "base/strings/stringprintf.h" | 16 #include "base/strings/stringprintf.h" |
22 #include "chrome/browser/chromeos/input_method/input_method_configuration.h" | 17 #include "chrome/browser/chromeos/input_method/input_method_configuration.h" |
23 #include "chrome/browser/chromeos/input_method/mock_input_method_manager.h" | 18 #include "chrome/browser/chromeos/input_method/mock_input_method_manager.h" |
24 #include "chrome/browser/chromeos/login/users/mock_user_manager.h" | 19 #include "chrome/browser/chromeos/login/users/mock_user_manager.h" |
25 #include "chrome/browser/chromeos/login/users/user_manager.h" | 20 #include "chrome/browser/chromeos/login/users/user_manager.h" |
26 #include "chrome/browser/chromeos/preferences.h" | 21 #include "chrome/browser/chromeos/preferences.h" |
27 #include "chrome/common/pref_names.h" | 22 #include "chrome/common/pref_names.h" |
28 #include "chrome/test/base/testing_pref_service_syncable.h" | 23 #include "chrome/test/base/testing_pref_service_syncable.h" |
29 #include "chromeos/chromeos_switches.h" | 24 #include "chromeos/chromeos_switches.h" |
30 #include "chromeos/ime/fake_ime_keyboard.h" | 25 #include "chromeos/ime/fake_ime_keyboard.h" |
31 #include "testing/gtest/include/gtest/gtest.h" | 26 #include "testing/gtest/include/gtest/gtest.h" |
32 #include "ui/aura/window.h" | 27 #include "ui/aura/window.h" |
33 #include "ui/events/event.h" | 28 #include "ui/events/event.h" |
34 #include "ui/events/event_rewriter.h" | 29 #include "ui/events/event_rewriter.h" |
| 30 #include "ui/events/test/test_event_processor.h" |
| 31 |
| 32 #if defined(USE_X11) |
| 33 #include <X11/keysym.h> |
| 34 |
35 #include "ui/events/test/events_test_utils_x11.h" | 35 #include "ui/events/test/events_test_utils_x11.h" |
36 #include "ui/events/x/touch_factory_x11.h" | 36 #include "ui/events/x/touch_factory_x11.h" |
37 #include "ui/gfx/x/x11_types.h" | 37 #include "ui/gfx/x/x11_types.h" |
| 38 #endif |
38 | 39 |
39 namespace { | 40 namespace { |
40 | 41 |
| 42 // The device id of the test touchpad device. |
| 43 const unsigned int kTouchPadDeviceId = 1; |
| 44 |
41 std::string GetExpectedResultAsString(ui::KeyboardCode ui_keycode, | 45 std::string GetExpectedResultAsString(ui::KeyboardCode ui_keycode, |
42 int ui_flags, | 46 int ui_flags, |
43 ui::EventType ui_type) { | 47 ui::EventType ui_type) { |
44 return base::StringPrintf("ui_keycode=0x%X ui_flags=0x%X ui_type=%d", | 48 return base::StringPrintf("ui_keycode=0x%X ui_flags=0x%X ui_type=%d", |
45 ui_keycode, | 49 ui_keycode, |
46 ui_flags & ~ui::EF_IS_REPEAT, | 50 ui_flags & ~ui::EF_IS_REPEAT, |
47 ui_type); | 51 ui_type); |
48 } | 52 } |
49 | 53 |
50 std::string GetKeyEventAsString(const ui::KeyEvent& keyevent) { | 54 std::string GetKeyEventAsString(const ui::KeyEvent& keyevent) { |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
185 #endif | 189 #endif |
186 } | 190 } |
187 | 191 |
188 } // namespace | 192 } // namespace |
189 | 193 |
190 namespace chromeos { | 194 namespace chromeos { |
191 | 195 |
192 class EventRewriterTest : public ash::test::AshTestBase { | 196 class EventRewriterTest : public ash::test::AshTestBase { |
193 public: | 197 public: |
194 EventRewriterTest() | 198 EventRewriterTest() |
195 : display_(gfx::GetXDisplay()), | 199 : mock_user_manager_(new chromeos::MockUserManager), |
196 mock_user_manager_(new chromeos::MockUserManager), | |
197 user_manager_enabler_(mock_user_manager_), | 200 user_manager_enabler_(mock_user_manager_), |
198 input_method_manager_mock_(NULL) {} | 201 input_method_manager_mock_(NULL) {} |
199 virtual ~EventRewriterTest() {} | 202 virtual ~EventRewriterTest() {} |
200 | 203 |
201 virtual void SetUp() { | 204 virtual void SetUp() { |
202 // Mocking user manager because the real one needs to be called on UI thread | 205 // Mocking user manager because the real one needs to be called on UI thread |
203 EXPECT_CALL(*mock_user_manager_, IsLoggedInAsGuest()) | 206 EXPECT_CALL(*mock_user_manager_, IsLoggedInAsGuest()) |
204 .WillRepeatedly(testing::Return(false)); | 207 .WillRepeatedly(testing::Return(false)); |
205 input_method_manager_mock_ = | 208 input_method_manager_mock_ = |
206 new chromeos::input_method::MockInputMethodManager; | 209 new chromeos::input_method::MockInputMethodManager; |
(...skipping 13 matching lines...) Expand all Loading... |
220 void TestRewriteNumPadKeys(); | 223 void TestRewriteNumPadKeys(); |
221 void TestRewriteNumPadKeysOnAppleKeyboard(); | 224 void TestRewriteNumPadKeysOnAppleKeyboard(); |
222 | 225 |
223 int RewriteMouseEvent(chromeos::EventRewriter* rewriter, | 226 int RewriteMouseEvent(chromeos::EventRewriter* rewriter, |
224 const ui::MouseEvent& event) { | 227 const ui::MouseEvent& event) { |
225 int flags = event.flags(); | 228 int flags = event.flags(); |
226 rewriter->RewriteLocatedEventForTesting(event, &flags); | 229 rewriter->RewriteLocatedEventForTesting(event, &flags); |
227 return flags; | 230 return flags; |
228 } | 231 } |
229 | 232 |
230 Display* display_; | |
231 chromeos::MockUserManager* mock_user_manager_; // Not owned. | 233 chromeos::MockUserManager* mock_user_manager_; // Not owned. |
232 chromeos::ScopedUserManagerEnabler user_manager_enabler_; | 234 chromeos::ScopedUserManagerEnabler user_manager_enabler_; |
233 chromeos::input_method::MockInputMethodManager* input_method_manager_mock_; | 235 chromeos::input_method::MockInputMethodManager* input_method_manager_mock_; |
234 }; | 236 }; |
235 | 237 |
236 TEST_F(EventRewriterTest, TestRewriteCommandToControl) { | 238 TEST_F(EventRewriterTest, TestRewriteCommandToControl) { |
237 // First, test with a PC keyboard. | 239 // First, test with a PC keyboard. |
238 TestingPrefServiceSyncable prefs; | 240 TestingPrefServiceSyncable prefs; |
239 EventRewriter rewriter; | 241 EventRewriter rewriter(NULL); |
240 rewriter.DeviceAddedForTesting(0, "PC Keyboard"); | 242 rewriter.DeviceAddedForTesting(0, "PC Keyboard"); |
241 rewriter.set_last_device_id_for_testing(0); | 243 rewriter.set_last_device_id_for_testing(0); |
242 rewriter.set_pref_service_for_testing(&prefs); | 244 rewriter.set_pref_service_for_testing(&prefs); |
243 | 245 |
244 KeyTestCase pc_keyboard_tests[] = { | 246 KeyTestCase pc_keyboard_tests[] = { |
245 // VKEY_A, Alt modifier. | 247 // VKEY_A, Alt modifier. |
246 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 248 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
247 {ui::VKEY_A, ui::EF_ALT_DOWN}, | 249 {ui::VKEY_A, ui::EF_ALT_DOWN}, |
248 {ui::VKEY_A, ui::EF_ALT_DOWN}}, | 250 {ui::VKEY_A, ui::EF_ALT_DOWN}}, |
249 | 251 |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
310 | 312 |
311 // For crbug.com/133896. | 313 // For crbug.com/133896. |
312 TEST_F(EventRewriterTest, TestRewriteCommandToControlWithControlRemapped) { | 314 TEST_F(EventRewriterTest, TestRewriteCommandToControlWithControlRemapped) { |
313 // Remap Control to Alt. | 315 // Remap Control to Alt. |
314 TestingPrefServiceSyncable prefs; | 316 TestingPrefServiceSyncable prefs; |
315 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 317 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
316 IntegerPrefMember control; | 318 IntegerPrefMember control; |
317 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); | 319 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); |
318 control.SetValue(chromeos::input_method::kAltKey); | 320 control.SetValue(chromeos::input_method::kAltKey); |
319 | 321 |
320 EventRewriter rewriter; | 322 EventRewriter rewriter(NULL); |
321 rewriter.set_pref_service_for_testing(&prefs); | 323 rewriter.set_pref_service_for_testing(&prefs); |
322 rewriter.DeviceAddedForTesting(0, "PC Keyboard"); | 324 rewriter.DeviceAddedForTesting(0, "PC Keyboard"); |
323 rewriter.set_last_device_id_for_testing(0); | 325 rewriter.set_last_device_id_for_testing(0); |
324 | 326 |
325 KeyTestCase pc_keyboard_tests[] = {// Control should be remapped to Alt. | 327 KeyTestCase pc_keyboard_tests[] = {// Control should be remapped to Alt. |
326 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 328 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
327 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN}, | 329 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN}, |
328 {ui::VKEY_MENU, ui::EF_ALT_DOWN}}, | 330 {ui::VKEY_MENU, ui::EF_ALT_DOWN}}, |
329 }; | 331 }; |
330 | 332 |
(...skipping 19 matching lines...) Expand all Loading... |
350 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN}}, | 352 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN}}, |
351 }; | 353 }; |
352 | 354 |
353 for (size_t i = 0; i < arraysize(apple_keyboard_tests); ++i) { | 355 for (size_t i = 0; i < arraysize(apple_keyboard_tests); ++i) { |
354 CheckKeyTestCase(2000 + i, &rewriter, apple_keyboard_tests[i]); | 356 CheckKeyTestCase(2000 + i, &rewriter, apple_keyboard_tests[i]); |
355 } | 357 } |
356 } | 358 } |
357 | 359 |
358 void EventRewriterTest::TestRewriteNumPadKeys() { | 360 void EventRewriterTest::TestRewriteNumPadKeys() { |
359 TestingPrefServiceSyncable prefs; | 361 TestingPrefServiceSyncable prefs; |
360 EventRewriter rewriter; | 362 EventRewriter rewriter(NULL); |
361 rewriter.set_pref_service_for_testing(&prefs); | 363 rewriter.set_pref_service_for_testing(&prefs); |
362 | 364 |
363 KeyTestCase tests[] = { | 365 KeyTestCase tests[] = { |
364 // XK_KP_Insert (= NumPad 0 without Num Lock), no modifier. | 366 // XK_KP_Insert (= NumPad 0 without Num Lock), no modifier. |
365 {KeyTestCase::TEST_ALL|KeyTestCase::NUMPAD, ui::ET_KEY_PRESSED, | 367 {KeyTestCase::TEST_ALL|KeyTestCase::NUMPAD, ui::ET_KEY_PRESSED, |
366 {ui::VKEY_INSERT, ui::EF_NUMPAD_KEY}, | 368 {ui::VKEY_INSERT, ui::EF_NUMPAD_KEY}, |
367 {ui::VKEY_NUMPAD0, ui::EF_NUMPAD_KEY}}, | 369 {ui::VKEY_NUMPAD0, ui::EF_NUMPAD_KEY}}, |
368 | 370 |
369 // XK_KP_Insert (= NumPad 0 without Num Lock), Alt modifier. | 371 // XK_KP_Insert (= NumPad 0 without Num Lock), Alt modifier. |
370 {KeyTestCase::TEST_ALL|KeyTestCase::NUMPAD, ui::ET_KEY_PRESSED, | 372 {KeyTestCase::TEST_ALL|KeyTestCase::NUMPAD, ui::ET_KEY_PRESSED, |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
492 CommandLine::ForCurrentProcess()->AppendSwitchASCII( | 494 CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
493 chromeos::switches::kHasChromeOSDiamondKey, ""); | 495 chromeos::switches::kHasChromeOSDiamondKey, ""); |
494 | 496 |
495 TestRewriteNumPadKeys(); | 497 TestRewriteNumPadKeys(); |
496 *CommandLine::ForCurrentProcess() = original_cl; | 498 *CommandLine::ForCurrentProcess() = original_cl; |
497 } | 499 } |
498 | 500 |
499 // Tests if the rewriter can handle a Command + Num Pad event. | 501 // Tests if the rewriter can handle a Command + Num Pad event. |
500 void EventRewriterTest::TestRewriteNumPadKeysOnAppleKeyboard() { | 502 void EventRewriterTest::TestRewriteNumPadKeysOnAppleKeyboard() { |
501 TestingPrefServiceSyncable prefs; | 503 TestingPrefServiceSyncable prefs; |
502 EventRewriter rewriter; | 504 EventRewriter rewriter(NULL); |
503 rewriter.DeviceAddedForTesting(0, "Apple Keyboard"); | 505 rewriter.DeviceAddedForTesting(0, "Apple Keyboard"); |
504 rewriter.set_last_device_id_for_testing(0); | 506 rewriter.set_last_device_id_for_testing(0); |
505 rewriter.set_pref_service_for_testing(&prefs); | 507 rewriter.set_pref_service_for_testing(&prefs); |
506 | 508 |
507 KeyTestCase tests[] = { | 509 KeyTestCase tests[] = { |
508 // XK_KP_End (= NumPad 1 without Num Lock), Win modifier. | 510 // XK_KP_End (= NumPad 1 without Num Lock), Win modifier. |
509 // 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". |
510 {KeyTestCase::TEST_ALL|KeyTestCase::NUMPAD, ui::ET_KEY_PRESSED, | 512 {KeyTestCase::TEST_ALL|KeyTestCase::NUMPAD, ui::ET_KEY_PRESSED, |
511 {ui::VKEY_END, ui::EF_COMMAND_DOWN | ui::EF_NUMPAD_KEY}, | 513 {ui::VKEY_END, ui::EF_COMMAND_DOWN | ui::EF_NUMPAD_KEY}, |
512 {ui::VKEY_NUMPAD1, ui::EF_CONTROL_DOWN | ui::EF_NUMPAD_KEY}}, | 514 {ui::VKEY_NUMPAD1, ui::EF_CONTROL_DOWN | ui::EF_NUMPAD_KEY}}, |
(...skipping 21 matching lines...) Expand all Loading... |
534 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); | 536 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); |
535 CommandLine::ForCurrentProcess()->AppendSwitchASCII( | 537 CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
536 chromeos::switches::kHasChromeOSDiamondKey, ""); | 538 chromeos::switches::kHasChromeOSDiamondKey, ""); |
537 | 539 |
538 TestRewriteNumPadKeysOnAppleKeyboard(); | 540 TestRewriteNumPadKeysOnAppleKeyboard(); |
539 *CommandLine::ForCurrentProcess() = original_cl; | 541 *CommandLine::ForCurrentProcess() = original_cl; |
540 } | 542 } |
541 | 543 |
542 TEST_F(EventRewriterTest, TestRewriteModifiersNoRemap) { | 544 TEST_F(EventRewriterTest, TestRewriteModifiersNoRemap) { |
543 TestingPrefServiceSyncable prefs; | 545 TestingPrefServiceSyncable prefs; |
544 EventRewriter rewriter; | 546 EventRewriter rewriter(NULL); |
545 rewriter.set_pref_service_for_testing(&prefs); | 547 rewriter.set_pref_service_for_testing(&prefs); |
546 | 548 |
547 KeyTestCase tests[] = { | 549 KeyTestCase tests[] = { |
548 // Press Search. Confirm the event is not rewritten. | 550 // Press Search. Confirm the event is not rewritten. |
549 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 551 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
550 {ui::VKEY_LWIN, ui::EF_NONE}, | 552 {ui::VKEY_LWIN, ui::EF_NONE}, |
551 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN}}, | 553 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN}}, |
552 | 554 |
553 // Press left Control. Confirm the event is not rewritten. | 555 // Press left Control. Confirm the event is not rewritten. |
554 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 556 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
(...skipping 22 matching lines...) Expand all Loading... |
577 {ui::VKEY_LWIN, ui::EF_NONE}}, | 579 {ui::VKEY_LWIN, ui::EF_NONE}}, |
578 }; | 580 }; |
579 | 581 |
580 for (size_t i = 0; i < arraysize(tests); ++i) { | 582 for (size_t i = 0; i < arraysize(tests); ++i) { |
581 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); | 583 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); |
582 } | 584 } |
583 } | 585 } |
584 | 586 |
585 TEST_F(EventRewriterTest, TestRewriteModifiersNoRemapMultipleKeys) { | 587 TEST_F(EventRewriterTest, TestRewriteModifiersNoRemapMultipleKeys) { |
586 TestingPrefServiceSyncable prefs; | 588 TestingPrefServiceSyncable prefs; |
587 EventRewriter rewriter; | 589 EventRewriter rewriter(NULL); |
588 rewriter.set_pref_service_for_testing(&prefs); | 590 rewriter.set_pref_service_for_testing(&prefs); |
589 | 591 |
590 KeyTestCase tests[] = { | 592 KeyTestCase tests[] = { |
591 // Press Alt with Shift. Confirm the event is not rewritten. | 593 // Press Alt with Shift. Confirm the event is not rewritten. |
592 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 594 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
593 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}, | 595 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}, |
594 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}}, | 596 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}}, |
595 | 597 |
596 // Press Search with Caps Lock mask. Confirm the event is not rewritten. | 598 // Press Search with Caps Lock mask. Confirm the event is not rewritten. |
597 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 599 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
(...skipping 22 matching lines...) Expand all Loading... |
620 // Disable Search and Control keys. | 622 // Disable Search and Control keys. |
621 TestingPrefServiceSyncable prefs; | 623 TestingPrefServiceSyncable prefs; |
622 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 624 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
623 IntegerPrefMember search; | 625 IntegerPrefMember search; |
624 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); | 626 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); |
625 search.SetValue(chromeos::input_method::kVoidKey); | 627 search.SetValue(chromeos::input_method::kVoidKey); |
626 IntegerPrefMember control; | 628 IntegerPrefMember control; |
627 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); | 629 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); |
628 control.SetValue(chromeos::input_method::kVoidKey); | 630 control.SetValue(chromeos::input_method::kVoidKey); |
629 | 631 |
630 EventRewriter rewriter; | 632 EventRewriter rewriter(NULL); |
631 rewriter.set_pref_service_for_testing(&prefs); | 633 rewriter.set_pref_service_for_testing(&prefs); |
632 | 634 |
633 KeyTestCase disabled_modifier_tests[] = { | 635 KeyTestCase disabled_modifier_tests[] = { |
634 // Press Alt with Shift. This key press shouldn't be affected by the | 636 // Press Alt with Shift. This key press shouldn't be affected by the |
635 // pref. Confirm the event is not rewritten. | 637 // pref. Confirm the event is not rewritten. |
636 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 638 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
637 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}, | 639 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}, |
638 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}}, | 640 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}}, |
639 | 641 |
640 // Press Search. Confirm the event is now VKEY_UNKNOWN. | 642 // Press Search. Confirm the event is now VKEY_UNKNOWN. |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
695 } | 697 } |
696 | 698 |
697 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToControl) { | 699 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToControl) { |
698 // Remap Search to Control. | 700 // Remap Search to Control. |
699 TestingPrefServiceSyncable prefs; | 701 TestingPrefServiceSyncable prefs; |
700 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 702 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
701 IntegerPrefMember search; | 703 IntegerPrefMember search; |
702 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); | 704 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); |
703 search.SetValue(chromeos::input_method::kControlKey); | 705 search.SetValue(chromeos::input_method::kControlKey); |
704 | 706 |
705 EventRewriter rewriter; | 707 EventRewriter rewriter(NULL); |
706 rewriter.set_pref_service_for_testing(&prefs); | 708 rewriter.set_pref_service_for_testing(&prefs); |
707 | 709 |
708 KeyTestCase s_tests[] = { | 710 KeyTestCase s_tests[] = { |
709 // Press Search. Confirm the event is now VKEY_CONTROL. | 711 // Press Search. Confirm the event is now VKEY_CONTROL. |
710 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 712 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
711 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN}, | 713 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN}, |
712 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN}}, | 714 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN}}, |
713 }; | 715 }; |
714 | 716 |
715 for (size_t i = 0; i < arraysize(s_tests); ++i) { | 717 for (size_t i = 0; i < arraysize(s_tests); ++i) { |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
759 } | 761 } |
760 | 762 |
761 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToEscape) { | 763 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToEscape) { |
762 // Remap Search to ESC. | 764 // Remap Search to ESC. |
763 TestingPrefServiceSyncable prefs; | 765 TestingPrefServiceSyncable prefs; |
764 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 766 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
765 IntegerPrefMember search; | 767 IntegerPrefMember search; |
766 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); | 768 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); |
767 search.SetValue(chromeos::input_method::kEscapeKey); | 769 search.SetValue(chromeos::input_method::kEscapeKey); |
768 | 770 |
769 EventRewriter rewriter; | 771 EventRewriter rewriter(NULL); |
770 rewriter.set_pref_service_for_testing(&prefs); | 772 rewriter.set_pref_service_for_testing(&prefs); |
771 | 773 |
772 KeyTestCase tests[] = {// Press Search. Confirm the event is now VKEY_ESCAPE. | 774 KeyTestCase tests[] = {// Press Search. Confirm the event is now VKEY_ESCAPE. |
773 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 775 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
774 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN}, | 776 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN}, |
775 {ui::VKEY_ESCAPE, ui::EF_NONE}}, | 777 {ui::VKEY_ESCAPE, ui::EF_NONE}}, |
776 }; | 778 }; |
777 | 779 |
778 for (size_t i = 0; i < arraysize(tests); ++i) { | 780 for (size_t i = 0; i < arraysize(tests); ++i) { |
779 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); | 781 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); |
780 } | 782 } |
781 } | 783 } |
782 | 784 |
783 TEST_F(EventRewriterTest, TestRewriteModifiersRemapMany) { | 785 TEST_F(EventRewriterTest, TestRewriteModifiersRemapMany) { |
784 // Remap Search to Alt. | 786 // Remap Search to Alt. |
785 TestingPrefServiceSyncable prefs; | 787 TestingPrefServiceSyncable prefs; |
786 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 788 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
787 IntegerPrefMember search; | 789 IntegerPrefMember search; |
788 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); | 790 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); |
789 search.SetValue(chromeos::input_method::kAltKey); | 791 search.SetValue(chromeos::input_method::kAltKey); |
790 | 792 |
791 EventRewriter rewriter; | 793 EventRewriter rewriter(NULL); |
792 rewriter.set_pref_service_for_testing(&prefs); | 794 rewriter.set_pref_service_for_testing(&prefs); |
793 | 795 |
794 KeyTestCase s2a_tests[] = { | 796 KeyTestCase s2a_tests[] = { |
795 // Press Search. Confirm the event is now VKEY_MENU. | 797 // Press Search. Confirm the event is now VKEY_MENU. |
796 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 798 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
797 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN}, | 799 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN}, |
798 {ui::VKEY_MENU, ui::EF_ALT_DOWN}}, | 800 {ui::VKEY_MENU, ui::EF_ALT_DOWN}}, |
799 }; | 801 }; |
800 | 802 |
801 for (size_t i = 0; i < arraysize(s2a_tests); ++i) { | 803 for (size_t i = 0; i < arraysize(s2a_tests); ++i) { |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
858 | 860 |
859 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToCapsLock) { | 861 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToCapsLock) { |
860 // Remap Search to Caps Lock. | 862 // Remap Search to Caps Lock. |
861 TestingPrefServiceSyncable prefs; | 863 TestingPrefServiceSyncable prefs; |
862 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 864 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
863 IntegerPrefMember search; | 865 IntegerPrefMember search; |
864 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); | 866 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); |
865 search.SetValue(chromeos::input_method::kCapsLockKey); | 867 search.SetValue(chromeos::input_method::kCapsLockKey); |
866 | 868 |
867 chromeos::input_method::FakeImeKeyboard ime_keyboard; | 869 chromeos::input_method::FakeImeKeyboard ime_keyboard; |
868 EventRewriter rewriter; | 870 EventRewriter rewriter(NULL); |
869 rewriter.set_pref_service_for_testing(&prefs); | 871 rewriter.set_pref_service_for_testing(&prefs); |
870 rewriter.set_ime_keyboard_for_testing(&ime_keyboard); | 872 rewriter.set_ime_keyboard_for_testing(&ime_keyboard); |
871 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); | 873 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); |
872 | 874 |
873 // Press Search. | 875 // Press Search. |
874 EXPECT_EQ( | 876 EXPECT_EQ( |
875 GetExpectedResultAsString(ui::VKEY_CAPITAL, | 877 GetExpectedResultAsString(ui::VKEY_CAPITAL, |
876 ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN, | 878 ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN, |
877 ui::ET_KEY_PRESSED), | 879 ui::ET_KEY_PRESSED), |
878 GetRewrittenEventAsString( | 880 GetRewrittenEventAsString( |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
928 GetRewrittenEventAsString( | 930 GetRewrittenEventAsString( |
929 &rewriter, ui::VKEY_CAPITAL, ui::EF_NONE, ui::ET_KEY_RELEASED)); | 931 &rewriter, ui::VKEY_CAPITAL, ui::EF_NONE, ui::ET_KEY_RELEASED)); |
930 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); | 932 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); |
931 } | 933 } |
932 | 934 |
933 TEST_F(EventRewriterTest, TestRewriteCapsLock) { | 935 TEST_F(EventRewriterTest, TestRewriteCapsLock) { |
934 TestingPrefServiceSyncable prefs; | 936 TestingPrefServiceSyncable prefs; |
935 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 937 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
936 | 938 |
937 chromeos::input_method::FakeImeKeyboard ime_keyboard; | 939 chromeos::input_method::FakeImeKeyboard ime_keyboard; |
938 EventRewriter rewriter; | 940 EventRewriter rewriter(NULL); |
939 rewriter.set_pref_service_for_testing(&prefs); | 941 rewriter.set_pref_service_for_testing(&prefs); |
940 rewriter.set_ime_keyboard_for_testing(&ime_keyboard); | 942 rewriter.set_ime_keyboard_for_testing(&ime_keyboard); |
941 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); | 943 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); |
942 | 944 |
943 // On Chrome OS, CapsLock is mapped to F16 with Mod3Mask. | 945 // On Chrome OS, CapsLock is mapped to F16 with Mod3Mask. |
944 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, | 946 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, |
945 ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN, | 947 ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN, |
946 ui::ET_KEY_PRESSED), | 948 ui::ET_KEY_PRESSED), |
947 GetRewrittenEventAsString( | 949 GetRewrittenEventAsString( |
948 &rewriter, ui::VKEY_F16, ui::EF_MOD3_DOWN, ui::ET_KEY_PRESSED)); | 950 &rewriter, ui::VKEY_F16, ui::EF_MOD3_DOWN, ui::ET_KEY_PRESSED)); |
949 EXPECT_TRUE(ime_keyboard.caps_lock_is_enabled_); | 951 EXPECT_TRUE(ime_keyboard.caps_lock_is_enabled_); |
950 } | 952 } |
951 | 953 |
952 TEST_F(EventRewriterTest, TestRewriteDiamondKey) { | 954 TEST_F(EventRewriterTest, TestRewriteDiamondKey) { |
953 TestingPrefServiceSyncable prefs; | 955 TestingPrefServiceSyncable prefs; |
954 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 956 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
955 | 957 |
956 chromeos::input_method::FakeImeKeyboard ime_keyboard; | 958 chromeos::input_method::FakeImeKeyboard ime_keyboard; |
957 EventRewriter rewriter; | 959 EventRewriter rewriter(NULL); |
958 rewriter.set_pref_service_for_testing(&prefs); | 960 rewriter.set_pref_service_for_testing(&prefs); |
959 rewriter.set_ime_keyboard_for_testing(&ime_keyboard); | 961 rewriter.set_ime_keyboard_for_testing(&ime_keyboard); |
960 | 962 |
961 KeyTestCase tests[] = { | 963 KeyTestCase tests[] = { |
962 // F15 should work as Ctrl when --has-chromeos-diamond-key is not | 964 // F15 should work as Ctrl when --has-chromeos-diamond-key is not |
963 // specified. | 965 // specified. |
964 {KeyTestCase::TEST_VKEY, | 966 {KeyTestCase::TEST_VKEY, |
965 ui::ET_KEY_PRESSED, | 967 ui::ET_KEY_PRESSED, |
966 {ui::VKEY_F15, ui::EF_NONE}, | 968 {ui::VKEY_F15, ui::EF_NONE}, |
967 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN}}, | 969 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN}}, |
(...skipping 12 matching lines...) Expand all Loading... |
980 } | 982 } |
981 TEST_F(EventRewriterTest, TestRewriteDiamondKeyWithFlag) { | 983 TEST_F(EventRewriterTest, TestRewriteDiamondKeyWithFlag) { |
982 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); | 984 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); |
983 CommandLine::ForCurrentProcess()->AppendSwitchASCII( | 985 CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
984 chromeos::switches::kHasChromeOSDiamondKey, ""); | 986 chromeos::switches::kHasChromeOSDiamondKey, ""); |
985 | 987 |
986 TestingPrefServiceSyncable prefs; | 988 TestingPrefServiceSyncable prefs; |
987 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 989 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
988 | 990 |
989 chromeos::input_method::FakeImeKeyboard ime_keyboard; | 991 chromeos::input_method::FakeImeKeyboard ime_keyboard; |
990 EventRewriter rewriter; | 992 EventRewriter rewriter(NULL); |
991 rewriter.set_pref_service_for_testing(&prefs); | 993 rewriter.set_pref_service_for_testing(&prefs); |
992 rewriter.set_ime_keyboard_for_testing(&ime_keyboard); | 994 rewriter.set_ime_keyboard_for_testing(&ime_keyboard); |
993 | 995 |
994 // By default, F15 should work as Control. | 996 // By default, F15 should work as Control. |
995 EXPECT_EQ(GetExpectedResultAsString( | 997 EXPECT_EQ(GetExpectedResultAsString( |
996 ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN, ui::ET_KEY_PRESSED), | 998 ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN, ui::ET_KEY_PRESSED), |
997 GetRewrittenEventAsString( | 999 GetRewrittenEventAsString( |
998 &rewriter, ui::VKEY_F15, ui::EF_NONE, ui::ET_KEY_PRESSED)); | 1000 &rewriter, ui::VKEY_F15, ui::EF_NONE, ui::ET_KEY_PRESSED)); |
999 | 1001 |
1000 IntegerPrefMember diamond; | 1002 IntegerPrefMember diamond; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1032 } | 1034 } |
1033 | 1035 |
1034 TEST_F(EventRewriterTest, TestRewriteCapsLockToControl) { | 1036 TEST_F(EventRewriterTest, TestRewriteCapsLockToControl) { |
1035 // Remap CapsLock to Control. | 1037 // Remap CapsLock to Control. |
1036 TestingPrefServiceSyncable prefs; | 1038 TestingPrefServiceSyncable prefs; |
1037 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 1039 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
1038 IntegerPrefMember control; | 1040 IntegerPrefMember control; |
1039 control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs); | 1041 control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs); |
1040 control.SetValue(chromeos::input_method::kControlKey); | 1042 control.SetValue(chromeos::input_method::kControlKey); |
1041 | 1043 |
1042 EventRewriter rewriter; | 1044 EventRewriter rewriter(NULL); |
1043 rewriter.set_pref_service_for_testing(&prefs); | 1045 rewriter.set_pref_service_for_testing(&prefs); |
1044 | 1046 |
1045 KeyTestCase tests[] = { | 1047 KeyTestCase tests[] = { |
1046 // Press CapsLock+a. Confirm that Mod3Mask is rewritten to ControlMask. | 1048 // Press CapsLock+a. Confirm that Mod3Mask is rewritten to ControlMask. |
1047 // On Chrome OS, CapsLock works as a Mod3 modifier. | 1049 // On Chrome OS, CapsLock works as a Mod3 modifier. |
1048 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 1050 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
1049 {ui::VKEY_A, ui::EF_MOD3_DOWN}, | 1051 {ui::VKEY_A, ui::EF_MOD3_DOWN}, |
1050 {ui::VKEY_A, ui::EF_CONTROL_DOWN}}, | 1052 {ui::VKEY_A, ui::EF_CONTROL_DOWN}}, |
1051 | 1053 |
1052 // Press Control+CapsLock+a. Confirm that Mod3Mask is rewritten to | 1054 // Press Control+CapsLock+a. Confirm that Mod3Mask is rewritten to |
(...skipping 15 matching lines...) Expand all Loading... |
1068 } | 1070 } |
1069 | 1071 |
1070 TEST_F(EventRewriterTest, TestRewriteCapsLockMod3InUse) { | 1072 TEST_F(EventRewriterTest, TestRewriteCapsLockMod3InUse) { |
1071 // Remap CapsLock to Control. | 1073 // Remap CapsLock to Control. |
1072 TestingPrefServiceSyncable prefs; | 1074 TestingPrefServiceSyncable prefs; |
1073 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 1075 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
1074 IntegerPrefMember control; | 1076 IntegerPrefMember control; |
1075 control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs); | 1077 control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs); |
1076 control.SetValue(chromeos::input_method::kControlKey); | 1078 control.SetValue(chromeos::input_method::kControlKey); |
1077 | 1079 |
1078 EventRewriter rewriter; | 1080 EventRewriter rewriter(NULL); |
1079 rewriter.set_pref_service_for_testing(&prefs); | 1081 rewriter.set_pref_service_for_testing(&prefs); |
1080 input_method_manager_mock_->set_mod3_used(true); | 1082 input_method_manager_mock_->set_mod3_used(true); |
1081 | 1083 |
1082 // Press CapsLock+a. Confirm that Mod3Mask is NOT rewritten to ControlMask | 1084 // Press CapsLock+a. Confirm that Mod3Mask is NOT rewritten to ControlMask |
1083 // when Mod3Mask is already in use by the current XKB layout. | 1085 // when Mod3Mask is already in use by the current XKB layout. |
1084 EXPECT_EQ( | 1086 EXPECT_EQ( |
1085 GetExpectedResultAsString(ui::VKEY_A, ui::EF_NONE, ui::ET_KEY_PRESSED), | 1087 GetExpectedResultAsString(ui::VKEY_A, ui::EF_NONE, ui::ET_KEY_PRESSED), |
1086 GetRewrittenEventAsString( | 1088 GetRewrittenEventAsString( |
1087 &rewriter, ui::VKEY_A, ui::EF_NONE, ui::ET_KEY_PRESSED)); | 1089 &rewriter, ui::VKEY_A, ui::EF_NONE, ui::ET_KEY_PRESSED)); |
1088 | 1090 |
1089 input_method_manager_mock_->set_mod3_used(false); | 1091 input_method_manager_mock_->set_mod3_used(false); |
1090 } | 1092 } |
1091 | 1093 |
1092 TEST_F(EventRewriterTest, TestRewriteExtendedKeys) { | 1094 TEST_F(EventRewriterTest, TestRewriteExtendedKeys) { |
1093 TestingPrefServiceSyncable prefs; | 1095 TestingPrefServiceSyncable prefs; |
1094 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 1096 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
1095 EventRewriter rewriter; | 1097 EventRewriter rewriter(NULL); |
1096 rewriter.DeviceAddedForTesting(0, "PC Keyboard"); | 1098 rewriter.DeviceAddedForTesting(0, "PC Keyboard"); |
1097 rewriter.set_last_device_id_for_testing(0); | 1099 rewriter.set_last_device_id_for_testing(0); |
1098 rewriter.set_pref_service_for_testing(&prefs); | 1100 rewriter.set_pref_service_for_testing(&prefs); |
1099 | 1101 |
1100 KeyTestCase tests[] = { | 1102 KeyTestCase tests[] = { |
1101 // Alt+Backspace -> Delete | 1103 // Alt+Backspace -> Delete |
1102 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 1104 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
1103 {ui::VKEY_BACK, ui::EF_ALT_DOWN}, | 1105 {ui::VKEY_BACK, ui::EF_ALT_DOWN}, |
1104 {ui::VKEY_DELETE, ui::EF_NONE}}, | 1106 {ui::VKEY_DELETE, ui::EF_NONE}}, |
1105 // Control+Alt+Backspace -> Control+Delete | 1107 // Control+Alt+Backspace -> Control+Delete |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1194 {ui::VKEY_INSERT, ui::EF_CONTROL_DOWN}}}; | 1196 {ui::VKEY_INSERT, ui::EF_CONTROL_DOWN}}}; |
1195 | 1197 |
1196 for (size_t i = 0; i < arraysize(tests); ++i) { | 1198 for (size_t i = 0; i < arraysize(tests); ++i) { |
1197 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); | 1199 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); |
1198 } | 1200 } |
1199 } | 1201 } |
1200 | 1202 |
1201 TEST_F(EventRewriterTest, TestRewriteFunctionKeys) { | 1203 TEST_F(EventRewriterTest, TestRewriteFunctionKeys) { |
1202 TestingPrefServiceSyncable prefs; | 1204 TestingPrefServiceSyncable prefs; |
1203 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 1205 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
1204 EventRewriter rewriter; | 1206 EventRewriter rewriter(NULL); |
1205 rewriter.set_pref_service_for_testing(&prefs); | 1207 rewriter.set_pref_service_for_testing(&prefs); |
1206 | 1208 |
1207 FunctionKeyTestCase tests[] = { | 1209 FunctionKeyTestCase tests[] = { |
1208 // F1 -> Back | 1210 // F1 -> Back |
1209 {ui::ET_KEY_PRESSED, | 1211 {ui::ET_KEY_PRESSED, |
1210 {ui::VKEY_F1, ui::EF_NONE}, | 1212 {ui::VKEY_F1, ui::EF_NONE}, |
1211 {ui::VKEY_BROWSER_BACK, ui::EF_NONE}, | 1213 {ui::VKEY_BROWSER_BACK, ui::EF_NONE}, |
1212 {ui::VKEY_BROWSER_BACK, ui::EF_FUNCTION_KEY}}, | 1214 {ui::VKEY_BROWSER_BACK, ui::EF_FUNCTION_KEY}}, |
1213 {ui::ET_KEY_PRESSED, | 1215 {ui::ET_KEY_PRESSED, |
1214 {ui::VKEY_F1, ui::EF_CONTROL_DOWN}, | 1216 {ui::VKEY_F1, ui::EF_CONTROL_DOWN}, |
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1522 TEST_F(EventRewriterTest, TestRewriteExtendedKeysWithSearchRemapped) { | 1524 TEST_F(EventRewriterTest, TestRewriteExtendedKeysWithSearchRemapped) { |
1523 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); | 1525 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); |
1524 | 1526 |
1525 // Remap Search to Control. | 1527 // Remap Search to Control. |
1526 TestingPrefServiceSyncable prefs; | 1528 TestingPrefServiceSyncable prefs; |
1527 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 1529 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
1528 IntegerPrefMember search; | 1530 IntegerPrefMember search; |
1529 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); | 1531 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); |
1530 search.SetValue(chromeos::input_method::kControlKey); | 1532 search.SetValue(chromeos::input_method::kControlKey); |
1531 | 1533 |
1532 EventRewriter rewriter; | 1534 EventRewriter rewriter(NULL); |
1533 rewriter.set_pref_service_for_testing(&prefs); | 1535 rewriter.set_pref_service_for_testing(&prefs); |
1534 | 1536 |
1535 CommandLine::ForCurrentProcess()->AppendSwitchASCII( | 1537 CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
1536 chromeos::switches::kHasChromeOSKeyboard, ""); | 1538 chromeos::switches::kHasChromeOSKeyboard, ""); |
1537 | 1539 |
1538 KeyTestCase tests[] = { | 1540 KeyTestCase tests[] = { |
1539 // Alt+Search+Down -> End | 1541 // Alt+Search+Down -> End |
1540 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 1542 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
1541 {ui::VKEY_DOWN, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN}, | 1543 {ui::VKEY_DOWN, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN}, |
1542 {ui::VKEY_END, ui::EF_NONE}}, | 1544 {ui::VKEY_END, ui::EF_NONE}}, |
1543 | 1545 |
1544 // Shift+Alt+Search+Down -> Shift+End | 1546 // Shift+Alt+Search+Down -> Shift+End |
1545 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 1547 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
1546 {ui::VKEY_DOWN, | 1548 {ui::VKEY_DOWN, |
1547 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN}, | 1549 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN}, |
1548 {ui::VKEY_END, ui::EF_SHIFT_DOWN}}, | 1550 {ui::VKEY_END, ui::EF_SHIFT_DOWN}}, |
1549 }; | 1551 }; |
1550 | 1552 |
1551 for (size_t i = 0; i < arraysize(tests); ++i) { | 1553 for (size_t i = 0; i < arraysize(tests); ++i) { |
1552 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); | 1554 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); |
1553 } | 1555 } |
1554 | 1556 |
1555 *CommandLine::ForCurrentProcess() = original_cl; | 1557 *CommandLine::ForCurrentProcess() = original_cl; |
1556 } | 1558 } |
1557 | 1559 |
1558 TEST_F(EventRewriterTest, TestRewriteKeyEventSentByXSendEvent) { | 1560 TEST_F(EventRewriterTest, TestRewriteKeyEventSentByXSendEvent) { |
| 1561 #if defined(USE_X11) |
| 1562 // TODO(kpschoedel): pending alternative to xevent.xany.send_event |
1559 // Remap Control to Alt. | 1563 // Remap Control to Alt. |
1560 TestingPrefServiceSyncable prefs; | 1564 TestingPrefServiceSyncable prefs; |
1561 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 1565 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
1562 IntegerPrefMember control; | 1566 IntegerPrefMember control; |
1563 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); | 1567 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); |
1564 control.SetValue(chromeos::input_method::kAltKey); | 1568 control.SetValue(chromeos::input_method::kAltKey); |
1565 | 1569 |
1566 EventRewriter rewriter; | 1570 EventRewriter rewriter(NULL); |
1567 rewriter.set_pref_service_for_testing(&prefs); | 1571 rewriter.set_pref_service_for_testing(&prefs); |
1568 | 1572 |
1569 // Send left control press. | 1573 // Send left control press. |
1570 std::string rewritten_event; | 1574 std::string rewritten_event; |
1571 { | 1575 { |
1572 ui::ScopedXI2Event xev; | 1576 ui::ScopedXI2Event xev; |
1573 xev.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 0); | 1577 xev.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 0); |
1574 XEvent* xevent = xev; | 1578 XEvent* xevent = xev; |
1575 xevent->xkey.keycode = XKeysymToKeycode(gfx::GetXDisplay(), XK_Control_L); | 1579 xevent->xkey.keycode = XKeysymToKeycode(gfx::GetXDisplay(), XK_Control_L); |
1576 xevent->xkey.send_event = True; // XSendEvent() always does this. | 1580 xevent->xkey.send_event = True; // XSendEvent() always does this. |
1577 ui::KeyEvent keyevent(xev, false /* is_char */); | 1581 ui::KeyEvent keyevent(xev, false /* is_char */); |
1578 scoped_ptr<ui::Event> new_event; | 1582 scoped_ptr<ui::Event> new_event; |
1579 // Control should NOT be remapped to Alt if send_event | 1583 // Control should NOT be remapped to Alt if send_event |
1580 // flag in the event is True. | 1584 // flag in the event is True. |
1581 EXPECT_EQ(ui::EVENT_REWRITE_CONTINUE, | 1585 EXPECT_EQ(ui::EVENT_REWRITE_CONTINUE, |
1582 rewriter.RewriteEvent(keyevent, &new_event)); | 1586 rewriter.RewriteEvent(keyevent, &new_event)); |
1583 EXPECT_FALSE(new_event); | 1587 EXPECT_FALSE(new_event); |
1584 } | 1588 } |
| 1589 #endif |
1585 } | 1590 } |
1586 | 1591 |
1587 TEST_F(EventRewriterTest, TestRewriteNonNativeEvent) { | 1592 TEST_F(EventRewriterTest, TestRewriteNonNativeEvent) { |
1588 // Remap Control to Alt. | 1593 // Remap Control to Alt. |
1589 TestingPrefServiceSyncable prefs; | 1594 TestingPrefServiceSyncable prefs; |
1590 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 1595 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
1591 IntegerPrefMember control; | 1596 IntegerPrefMember control; |
1592 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); | 1597 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); |
1593 control.SetValue(chromeos::input_method::kAltKey); | 1598 control.SetValue(chromeos::input_method::kAltKey); |
1594 | 1599 |
1595 EventRewriter rewriter; | 1600 EventRewriter rewriter(NULL); |
1596 rewriter.set_pref_service_for_testing(&prefs); | 1601 rewriter.set_pref_service_for_testing(&prefs); |
1597 | 1602 |
1598 const int kTouchId = 2; | 1603 const int kTouchId = 2; |
1599 gfx::Point location(0, 0); | 1604 gfx::Point location(0, 0); |
1600 ui::TouchEvent press( | 1605 ui::TouchEvent press( |
1601 ui::ET_TOUCH_PRESSED, location, kTouchId, base::TimeDelta()); | 1606 ui::ET_TOUCH_PRESSED, location, kTouchId, base::TimeDelta()); |
1602 press.set_flags(ui::EF_CONTROL_DOWN); | 1607 press.set_flags(ui::EF_CONTROL_DOWN); |
1603 | 1608 |
1604 scoped_ptr<ui::Event> new_event; | 1609 scoped_ptr<ui::Event> new_event; |
1605 rewriter.RewriteEvent(press, &new_event); | 1610 rewriter.RewriteEvent(press, &new_event); |
1606 EXPECT_TRUE(new_event); | 1611 EXPECT_TRUE(new_event); |
1607 // Control should be remapped to Alt. | 1612 // Control should be remapped to Alt. |
1608 EXPECT_EQ(ui::EF_ALT_DOWN, | 1613 EXPECT_EQ(ui::EF_ALT_DOWN, |
1609 new_event->flags() & (ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN)); | 1614 new_event->flags() & (ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN)); |
1610 } | 1615 } |
1611 | 1616 |
| 1617 // Keeps a buffer of handled events. |
| 1618 class EventBuffer : public ui::test::TestEventProcessor { |
| 1619 public: |
| 1620 EventBuffer() {} |
| 1621 virtual ~EventBuffer() {} |
| 1622 |
| 1623 void PopEvents(ScopedVector<ui::Event>* events) { |
| 1624 events->clear(); |
| 1625 events->swap(events_); |
| 1626 } |
| 1627 |
| 1628 private: |
| 1629 // ui::EventProcessor overrides: |
| 1630 virtual ui::EventDispatchDetails OnEventFromSource( |
| 1631 ui::Event* event) OVERRIDE { |
| 1632 if (event->IsKeyEvent()) { |
| 1633 events_.push_back(new ui::KeyEvent(*static_cast<ui::KeyEvent*>(event))); |
| 1634 } else if (event->IsMouseWheelEvent()) { |
| 1635 events_.push_back( |
| 1636 new ui::MouseWheelEvent(*static_cast<ui::MouseWheelEvent*>(event))); |
| 1637 } else if (event->IsMouseEvent()) { |
| 1638 events_.push_back( |
| 1639 new ui::MouseEvent(*static_cast<ui::MouseEvent*>(event))); |
| 1640 } |
| 1641 return ui::EventDispatchDetails(); |
| 1642 } |
| 1643 |
| 1644 ScopedVector<ui::Event> events_; |
| 1645 |
| 1646 DISALLOW_COPY_AND_ASSIGN(EventBuffer); |
| 1647 }; |
| 1648 |
| 1649 // Trivial EventSource that does nothing but send events. |
| 1650 class TestEventSource : public ui::EventSource { |
| 1651 public: |
| 1652 explicit TestEventSource(ui::EventProcessor* processor) |
| 1653 : processor_(processor) {} |
| 1654 virtual ui::EventProcessor* GetEventProcessor() OVERRIDE { |
| 1655 return processor_; |
| 1656 } |
| 1657 ui::EventDispatchDetails Send(ui::Event* event) { |
| 1658 return SendEventToProcessor(event); |
| 1659 } |
| 1660 |
| 1661 void SendActivateStickyKeyPattern(ui::KeyboardCode key_code) { |
| 1662 ui::KeyEvent press(ui::ET_KEY_PRESSED, key_code, ui::EF_NONE, false); |
| 1663 ui::EventDispatchDetails details = Send(&press); |
| 1664 CHECK(!details.dispatcher_destroyed); |
| 1665 ui::KeyEvent release(ui::ET_KEY_RELEASED, key_code, ui::EF_NONE, false); |
| 1666 details = Send(&release); |
| 1667 CHECK(!details.dispatcher_destroyed); |
| 1668 } |
| 1669 |
| 1670 private: |
| 1671 ui::EventProcessor* processor_; |
| 1672 }; |
| 1673 |
1612 // Tests of event rewriting that depend on the Ash window manager. | 1674 // Tests of event rewriting that depend on the Ash window manager. |
1613 class EventRewriterAshTest : public ash::test::AshTestBase { | 1675 class EventRewriterAshTest : public ash::test::AshTestBase { |
1614 public: | 1676 public: |
1615 EventRewriterAshTest() | 1677 EventRewriterAshTest() |
1616 : mock_user_manager_(new chromeos::MockUserManager), | 1678 : mock_user_manager_(new chromeos::MockUserManager), |
1617 user_manager_enabler_(mock_user_manager_) {} | 1679 user_manager_enabler_(mock_user_manager_) {} |
1618 virtual ~EventRewriterAshTest() {} | 1680 virtual ~EventRewriterAshTest() {} |
1619 | 1681 |
1620 bool RewriteFunctionKeys(const ui::Event& event, | 1682 bool RewriteFunctionKeys(const ui::Event& event, |
1621 scoped_ptr<ui::Event>* rewritten_event) { | 1683 scoped_ptr<ui::Event>* rewritten_event) { |
1622 return rewriter_->RewriteEvent(event, rewritten_event); | 1684 return rewriter_->RewriteEvent(event, rewritten_event); |
1623 } | 1685 } |
1624 | 1686 |
| 1687 EventRewriter* rewriter() const { return rewriter_.get(); } |
| 1688 |
| 1689 ash::StickyKeysController* sticky_keys_controller() const { |
| 1690 return sticky_keys_controller_; |
| 1691 } |
| 1692 |
1625 protected: | 1693 protected: |
1626 virtual void SetUp() OVERRIDE { | 1694 virtual void SetUp() OVERRIDE { |
1627 AshTestBase::SetUp(); | 1695 AshTestBase::SetUp(); |
1628 rewriter_.reset(new EventRewriter()); | 1696 sticky_keys_controller_ = |
| 1697 ash::Shell::GetInstance()->sticky_keys_controller(); |
| 1698 rewriter_.reset(new EventRewriter(sticky_keys_controller_)); |
1629 chromeos::Preferences::RegisterProfilePrefs(prefs_.registry()); | 1699 chromeos::Preferences::RegisterProfilePrefs(prefs_.registry()); |
1630 rewriter_->set_pref_service_for_testing(&prefs_); | 1700 rewriter_->set_pref_service_for_testing(&prefs_); |
| 1701 #if defined(USE_X11) |
| 1702 ui::SetUpTouchPadForTest(kTouchPadDeviceId); |
| 1703 #endif |
1631 } | 1704 } |
1632 | 1705 |
1633 virtual void TearDown() OVERRIDE { | 1706 virtual void TearDown() OVERRIDE { |
1634 rewriter_.reset(); | 1707 rewriter_.reset(); |
1635 AshTestBase::TearDown(); | 1708 AshTestBase::TearDown(); |
1636 } | 1709 } |
1637 | 1710 |
1638 TestingPrefServiceSyncable prefs_; | 1711 TestingPrefServiceSyncable prefs_; |
1639 | 1712 |
1640 private: | 1713 private: |
1641 scoped_ptr<EventRewriter> rewriter_; | 1714 scoped_ptr<EventRewriter> rewriter_; |
1642 | 1715 |
1643 chromeos::MockUserManager* mock_user_manager_; // Not owned. | 1716 chromeos::MockUserManager* mock_user_manager_; // Not owned. |
1644 chromeos::ScopedUserManagerEnabler user_manager_enabler_; | 1717 chromeos::ScopedUserManagerEnabler user_manager_enabler_; |
| 1718 ash::StickyKeysController* sticky_keys_controller_; |
1645 | 1719 |
1646 DISALLOW_COPY_AND_ASSIGN(EventRewriterAshTest); | 1720 DISALLOW_COPY_AND_ASSIGN(EventRewriterAshTest); |
1647 }; | 1721 }; |
1648 | 1722 |
1649 TEST_F(EventRewriterAshTest, TopRowKeysAreFunctionKeys) { | 1723 TEST_F(EventRewriterAshTest, TopRowKeysAreFunctionKeys) { |
1650 scoped_ptr<aura::Window> window(CreateTestWindowInShellWithId(1)); | 1724 scoped_ptr<aura::Window> window(CreateTestWindowInShellWithId(1)); |
1651 ash::wm::WindowState* window_state = ash::wm::GetWindowState(window.get()); | 1725 ash::wm::WindowState* window_state = ash::wm::GetWindowState(window.get()); |
1652 window_state->Activate(); | 1726 window_state->Activate(); |
1653 | 1727 |
1654 // Create a simulated keypress of F1 targetted at the window. | 1728 // Create a simulated keypress of F1 targetted at the window. |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1692 device_list.push_back(10); | 1766 device_list.push_back(10); |
1693 ui::TouchFactory::GetInstance()->SetPointerDeviceForTest(device_list); | 1767 ui::TouchFactory::GetInstance()->SetPointerDeviceForTest(device_list); |
1694 | 1768 |
1695 // Remap Control to Alt. | 1769 // Remap Control to Alt. |
1696 TestingPrefServiceSyncable prefs; | 1770 TestingPrefServiceSyncable prefs; |
1697 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 1771 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
1698 IntegerPrefMember control; | 1772 IntegerPrefMember control; |
1699 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); | 1773 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); |
1700 control.SetValue(chromeos::input_method::kAltKey); | 1774 control.SetValue(chromeos::input_method::kAltKey); |
1701 | 1775 |
1702 EventRewriter rewriter; | 1776 EventRewriter rewriter(NULL); |
1703 rewriter.set_pref_service_for_testing(&prefs); | 1777 rewriter.set_pref_service_for_testing(&prefs); |
1704 | 1778 |
1705 // Check that Control + Left Button is converted (via Alt + Left Button) | 1779 // Check that Control + Left Button is converted (via Alt + Left Button) |
1706 // to Right Button. | 1780 // to Right Button. |
1707 ui::ScopedXI2Event xev; | 1781 ui::ScopedXI2Event xev; |
1708 xev.InitGenericButtonEvent(10, | 1782 xev.InitGenericButtonEvent(10, |
1709 ui::ET_MOUSE_PRESSED, | 1783 ui::ET_MOUSE_PRESSED, |
1710 gfx::Point(), | 1784 gfx::Point(), |
1711 ui::EF_LEFT_MOUSE_BUTTON | ui::EF_CONTROL_DOWN); | 1785 ui::EF_LEFT_MOUSE_BUTTON | ui::EF_CONTROL_DOWN); |
1712 ui::MouseEvent press(xev); | 1786 ui::MouseEvent press(xev); |
1713 // Sanity check. | 1787 // Sanity check. |
1714 EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type()); | 1788 EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type()); |
1715 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON | ui::EF_CONTROL_DOWN, press.flags()); | 1789 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON | ui::EF_CONTROL_DOWN, press.flags()); |
1716 int flags = RewriteMouseEvent(&rewriter, press); | 1790 int flags = RewriteMouseEvent(&rewriter, press); |
1717 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & flags); | 1791 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & flags); |
1718 EXPECT_FALSE(ui::EF_CONTROL_DOWN & flags); | 1792 EXPECT_FALSE(ui::EF_CONTROL_DOWN & flags); |
1719 EXPECT_FALSE(ui::EF_ALT_DOWN & flags); | 1793 EXPECT_FALSE(ui::EF_ALT_DOWN & flags); |
1720 } | 1794 } |
1721 | 1795 |
1722 | 1796 |
1723 TEST_F(EventRewriterTest, DontRewriteIfNotRewritten) { | 1797 TEST_F(EventRewriterTest, DontRewriteIfNotRewritten) { |
| 1798 #if defined(USE_X11) |
| 1799 // TODO(kpschoedel): pending changes for crbug.com/360377 |
| 1800 // to |chromeos::EventRewriter::RewriteLocatedEvent() |
1724 std::vector<unsigned int> device_list; | 1801 std::vector<unsigned int> device_list; |
1725 device_list.push_back(10); | 1802 device_list.push_back(10); |
1726 device_list.push_back(11); | 1803 device_list.push_back(11); |
1727 ui::TouchFactory::GetInstance()->SetPointerDeviceForTest(device_list); | 1804 ui::TouchFactory::GetInstance()->SetPointerDeviceForTest(device_list); |
1728 TestingPrefServiceSyncable prefs; | 1805 TestingPrefServiceSyncable prefs; |
1729 EventRewriter rewriter; | 1806 EventRewriter rewriter(NULL); |
1730 rewriter.set_pref_service_for_testing(&prefs); | 1807 rewriter.set_pref_service_for_testing(&prefs); |
1731 const int kLeftAndAltFlag = ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN; | 1808 const int kLeftAndAltFlag = ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN; |
1732 { | 1809 { |
1733 ui::ScopedXI2Event xev; | 1810 ui::ScopedXI2Event xev; |
1734 xev.InitGenericButtonEvent( | 1811 xev.InitGenericButtonEvent( |
1735 10, ui::ET_MOUSE_PRESSED, gfx::Point(), kLeftAndAltFlag); | 1812 10, ui::ET_MOUSE_PRESSED, gfx::Point(), kLeftAndAltFlag); |
1736 ui::MouseEvent press(xev); | 1813 ui::MouseEvent press(xev); |
1737 // Sanity check. | 1814 // Sanity check. |
1738 EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type()); | 1815 EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type()); |
1739 EXPECT_EQ(kLeftAndAltFlag, press.flags()); | 1816 EXPECT_EQ(kLeftAndAltFlag, press.flags()); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1785 EXPECT_TRUE((ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN) & flags); | 1862 EXPECT_TRUE((ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN) & flags); |
1786 } | 1863 } |
1787 { | 1864 { |
1788 ui::ScopedXI2Event xev; | 1865 ui::ScopedXI2Event xev; |
1789 xev.InitGenericButtonEvent( | 1866 xev.InitGenericButtonEvent( |
1790 11, ui::ET_MOUSE_RELEASED, gfx::Point(), kLeftAndAltFlag); | 1867 11, ui::ET_MOUSE_RELEASED, gfx::Point(), kLeftAndAltFlag); |
1791 ui::MouseEvent release(xev); | 1868 ui::MouseEvent release(xev); |
1792 int flags = RewriteMouseEvent(&rewriter, release); | 1869 int flags = RewriteMouseEvent(&rewriter, release); |
1793 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & flags); | 1870 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & flags); |
1794 } | 1871 } |
| 1872 #endif |
| 1873 } |
| 1874 |
| 1875 TEST_F(EventRewriterAshTest, StickyKeyEventDispatchImpl) { |
| 1876 // Test the actual key event dispatch implementation. |
| 1877 EventBuffer buffer; |
| 1878 TestEventSource source(&buffer); |
| 1879 source.AddEventRewriter(rewriter()); |
| 1880 sticky_keys_controller()->Enable(true); |
| 1881 ScopedVector<ui::Event> events; |
| 1882 |
| 1883 source.SendActivateStickyKeyPattern(ui::VKEY_CONTROL); |
| 1884 buffer.PopEvents(&events); |
| 1885 EXPECT_EQ(1u, events.size()); |
| 1886 EXPECT_EQ(ui::ET_KEY_PRESSED, events[0]->type()); |
| 1887 EXPECT_EQ(ui::VKEY_CONTROL, |
| 1888 static_cast<ui::KeyEvent*>(events[0])->key_code()); |
| 1889 |
| 1890 // Test key press event is correctly modified and modifier release |
| 1891 // event is sent. |
| 1892 ui::KeyEvent press(ui::ET_KEY_PRESSED, ui::VKEY_C, ui::EF_NONE, false); |
| 1893 ui::EventDispatchDetails details = source.Send(&press); |
| 1894 buffer.PopEvents(&events); |
| 1895 EXPECT_EQ(2u, events.size()); |
| 1896 EXPECT_EQ(ui::ET_KEY_PRESSED, events[0]->type()); |
| 1897 EXPECT_EQ(ui::VKEY_C, static_cast<ui::KeyEvent*>(events[0])->key_code()); |
| 1898 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); |
| 1899 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); |
| 1900 EXPECT_EQ(ui::VKEY_CONTROL, |
| 1901 static_cast<ui::KeyEvent*>(events[1])->key_code()); |
| 1902 |
| 1903 // Test key release event is not modified. |
| 1904 ui::KeyEvent release(ui::ET_KEY_RELEASED, ui::VKEY_C, ui::EF_NONE, false); |
| 1905 details = source.Send(&release); |
| 1906 ASSERT_FALSE(details.dispatcher_destroyed); |
| 1907 buffer.PopEvents(&events); |
| 1908 EXPECT_EQ(1u, events.size()); |
| 1909 EXPECT_EQ(ui::ET_KEY_RELEASED, events[0]->type()); |
| 1910 EXPECT_EQ(ui::VKEY_C, static_cast<ui::KeyEvent*>(events[0])->key_code()); |
| 1911 EXPECT_FALSE(events[0]->flags() & ui::EF_CONTROL_DOWN); |
| 1912 } |
| 1913 |
| 1914 TEST_F(EventRewriterAshTest, MouseEventDispatchImpl) { |
| 1915 EventBuffer buffer; |
| 1916 TestEventSource source(&buffer); |
| 1917 source.AddEventRewriter(rewriter()); |
| 1918 sticky_keys_controller()->Enable(true); |
| 1919 ScopedVector<ui::Event> events; |
| 1920 |
| 1921 source.SendActivateStickyKeyPattern(ui::VKEY_CONTROL); |
| 1922 buffer.PopEvents(&events); |
| 1923 |
| 1924 // Test mouse press event is correctly modified. |
| 1925 gfx::Point location(0, 0); |
| 1926 ui::MouseEvent press(ui::ET_MOUSE_PRESSED, |
| 1927 location, |
| 1928 location, |
| 1929 ui::EF_LEFT_MOUSE_BUTTON, |
| 1930 ui::EF_LEFT_MOUSE_BUTTON); |
| 1931 ui::EventDispatchDetails details = source.Send(&press); |
| 1932 ASSERT_FALSE(details.dispatcher_destroyed); |
| 1933 buffer.PopEvents(&events); |
| 1934 EXPECT_EQ(1u, events.size()); |
| 1935 EXPECT_EQ(ui::ET_MOUSE_PRESSED, events[0]->type()); |
| 1936 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); |
| 1937 |
| 1938 // Test mouse release event is correctly modified and modifier release |
| 1939 // event is sent. The mouse event should have the correct DIP location. |
| 1940 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, |
| 1941 location, |
| 1942 location, |
| 1943 ui::EF_LEFT_MOUSE_BUTTON, |
| 1944 ui::EF_LEFT_MOUSE_BUTTON); |
| 1945 details = source.Send(&release); |
| 1946 ASSERT_FALSE(details.dispatcher_destroyed); |
| 1947 buffer.PopEvents(&events); |
| 1948 EXPECT_EQ(2u, events.size()); |
| 1949 EXPECT_EQ(ui::ET_MOUSE_RELEASED, events[0]->type()); |
| 1950 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); |
| 1951 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); |
| 1952 EXPECT_EQ(ui::VKEY_CONTROL, |
| 1953 static_cast<ui::KeyEvent*>(events[1])->key_code()); |
| 1954 } |
| 1955 |
| 1956 TEST_F(EventRewriterAshTest, MouseWheelEventDispatchImpl) { |
| 1957 EventBuffer buffer; |
| 1958 TestEventSource source(&buffer); |
| 1959 source.AddEventRewriter(rewriter()); |
| 1960 sticky_keys_controller()->Enable(true); |
| 1961 ScopedVector<ui::Event> events; |
| 1962 |
| 1963 // Test positive mouse wheel event is correctly modified and modifier release |
| 1964 // event is sent. |
| 1965 source.SendActivateStickyKeyPattern(ui::VKEY_CONTROL); |
| 1966 buffer.PopEvents(&events); |
| 1967 gfx::Point location(0, 0); |
| 1968 ui::MouseEvent mev(ui::ET_MOUSEWHEEL, |
| 1969 location, |
| 1970 location, |
| 1971 ui::EF_LEFT_MOUSE_BUTTON, |
| 1972 ui::EF_LEFT_MOUSE_BUTTON); |
| 1973 ui::MouseWheelEvent positive(mev, 0, ui::MouseWheelEvent::kWheelDelta); |
| 1974 ui::EventDispatchDetails details = source.Send(&positive); |
| 1975 ASSERT_FALSE(details.dispatcher_destroyed); |
| 1976 buffer.PopEvents(&events); |
| 1977 EXPECT_EQ(2u, events.size()); |
| 1978 EXPECT_TRUE(events[0]->IsMouseWheelEvent()); |
| 1979 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); |
| 1980 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); |
| 1981 EXPECT_EQ(ui::VKEY_CONTROL, |
| 1982 static_cast<ui::KeyEvent*>(events[1])->key_code()); |
| 1983 |
| 1984 // Test negative mouse wheel event is correctly modified and modifier release |
| 1985 // event is sent. |
| 1986 source.SendActivateStickyKeyPattern(ui::VKEY_CONTROL); |
| 1987 buffer.PopEvents(&events); |
| 1988 ui::MouseWheelEvent negative(mev, 0, -ui::MouseWheelEvent::kWheelDelta); |
| 1989 details = source.Send(&negative); |
| 1990 ASSERT_FALSE(details.dispatcher_destroyed); |
| 1991 buffer.PopEvents(&events); |
| 1992 EXPECT_EQ(2u, events.size()); |
| 1993 EXPECT_TRUE(events[0]->IsMouseWheelEvent()); |
| 1994 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); |
| 1995 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); |
| 1996 EXPECT_EQ(ui::VKEY_CONTROL, |
| 1997 static_cast<ui::KeyEvent*>(events[1])->key_code()); |
1795 } | 1998 } |
1796 | 1999 |
1797 } // namespace chromeos | 2000 } // namespace chromeos |
OLD | NEW |