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 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
135 #endif | 139 #endif |
136 } | 140 } |
137 | 141 |
138 } // namespace | 142 } // namespace |
139 | 143 |
140 namespace chromeos { | 144 namespace chromeos { |
141 | 145 |
142 class EventRewriterTest : public ash::test::AshTestBase { | 146 class EventRewriterTest : public ash::test::AshTestBase { |
143 public: | 147 public: |
144 EventRewriterTest() | 148 EventRewriterTest() |
145 : display_(gfx::GetXDisplay()), | 149 : mock_user_manager_(new chromeos::MockUserManager), |
146 mock_user_manager_(new chromeos::MockUserManager), | |
147 user_manager_enabler_(mock_user_manager_), | 150 user_manager_enabler_(mock_user_manager_), |
148 input_method_manager_mock_(NULL) {} | 151 input_method_manager_mock_(NULL) {} |
149 virtual ~EventRewriterTest() {} | 152 virtual ~EventRewriterTest() {} |
150 | 153 |
151 virtual void SetUp() { | 154 virtual void SetUp() { |
152 // Mocking user manager because the real one needs to be called on UI thread | 155 // Mocking user manager because the real one needs to be called on UI thread |
153 EXPECT_CALL(*mock_user_manager_, IsLoggedInAsGuest()) | 156 EXPECT_CALL(*mock_user_manager_, IsLoggedInAsGuest()) |
154 .WillRepeatedly(testing::Return(false)); | 157 .WillRepeatedly(testing::Return(false)); |
155 input_method_manager_mock_ = | 158 input_method_manager_mock_ = |
156 new chromeos::input_method::MockInputMethodManager; | 159 new chromeos::input_method::MockInputMethodManager; |
(...skipping 13 matching lines...) Expand all Loading... | |
170 void TestRewriteNumPadKeys(); | 173 void TestRewriteNumPadKeys(); |
171 void TestRewriteNumPadKeysOnAppleKeyboard(); | 174 void TestRewriteNumPadKeysOnAppleKeyboard(); |
172 | 175 |
173 int RewriteMouseEvent(chromeos::EventRewriter* rewriter, | 176 int RewriteMouseEvent(chromeos::EventRewriter* rewriter, |
174 const ui::MouseEvent& event) { | 177 const ui::MouseEvent& event) { |
175 int flags = event.flags(); | 178 int flags = event.flags(); |
176 rewriter->RewriteLocatedEventForTesting(event, &flags); | 179 rewriter->RewriteLocatedEventForTesting(event, &flags); |
177 return flags; | 180 return flags; |
178 } | 181 } |
179 | 182 |
180 Display* display_; | |
181 chromeos::MockUserManager* mock_user_manager_; // Not owned. | 183 chromeos::MockUserManager* mock_user_manager_; // Not owned. |
182 chromeos::ScopedUserManagerEnabler user_manager_enabler_; | 184 chromeos::ScopedUserManagerEnabler user_manager_enabler_; |
183 chromeos::input_method::MockInputMethodManager* input_method_manager_mock_; | 185 chromeos::input_method::MockInputMethodManager* input_method_manager_mock_; |
184 }; | 186 }; |
185 | 187 |
186 TEST_F(EventRewriterTest, TestRewriteCommandToControl) { | 188 TEST_F(EventRewriterTest, TestRewriteCommandToControl) { |
187 // First, test with a PC keyboard. | 189 // First, test with a PC keyboard. |
188 TestingPrefServiceSyncable prefs; | 190 TestingPrefServiceSyncable prefs; |
189 EventRewriter rewriter; | 191 EventRewriter rewriter(NULL); |
190 rewriter.DeviceAddedForTesting(0, "PC Keyboard"); | 192 rewriter.DeviceAddedForTesting(0, "PC Keyboard"); |
191 rewriter.set_last_device_id_for_testing(0); | 193 rewriter.set_last_device_id_for_testing(0); |
192 rewriter.set_pref_service_for_testing(&prefs); | 194 rewriter.set_pref_service_for_testing(&prefs); |
193 | 195 |
194 KeyTestCase pc_keyboard_tests[] = { | 196 KeyTestCase pc_keyboard_tests[] = { |
195 // VKEY_A, Alt modifier. | 197 // VKEY_A, Alt modifier. |
196 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 198 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
197 {ui::VKEY_A, ui::EF_ALT_DOWN}, | 199 {ui::VKEY_A, ui::EF_ALT_DOWN}, |
198 {ui::VKEY_A, ui::EF_ALT_DOWN}}, | 200 {ui::VKEY_A, ui::EF_ALT_DOWN}}, |
199 | 201 |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
260 | 262 |
261 // For crbug.com/133896. | 263 // For crbug.com/133896. |
262 TEST_F(EventRewriterTest, TestRewriteCommandToControlWithControlRemapped) { | 264 TEST_F(EventRewriterTest, TestRewriteCommandToControlWithControlRemapped) { |
263 // Remap Control to Alt. | 265 // Remap Control to Alt. |
264 TestingPrefServiceSyncable prefs; | 266 TestingPrefServiceSyncable prefs; |
265 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 267 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
266 IntegerPrefMember control; | 268 IntegerPrefMember control; |
267 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); | 269 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); |
268 control.SetValue(chromeos::input_method::kAltKey); | 270 control.SetValue(chromeos::input_method::kAltKey); |
269 | 271 |
270 EventRewriter rewriter; | 272 EventRewriter rewriter(NULL); |
271 rewriter.set_pref_service_for_testing(&prefs); | 273 rewriter.set_pref_service_for_testing(&prefs); |
272 rewriter.DeviceAddedForTesting(0, "PC Keyboard"); | 274 rewriter.DeviceAddedForTesting(0, "PC Keyboard"); |
273 rewriter.set_last_device_id_for_testing(0); | 275 rewriter.set_last_device_id_for_testing(0); |
274 | 276 |
275 KeyTestCase pc_keyboard_tests[] = {// Control should be remapped to Alt. | 277 KeyTestCase pc_keyboard_tests[] = {// Control should be remapped to Alt. |
276 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 278 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
277 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN}, | 279 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN}, |
278 {ui::VKEY_MENU, ui::EF_ALT_DOWN}}, | 280 {ui::VKEY_MENU, ui::EF_ALT_DOWN}}, |
279 }; | 281 }; |
280 | 282 |
(...skipping 19 matching lines...) Expand all Loading... | |
300 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN}}, | 302 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN}}, |
301 }; | 303 }; |
302 | 304 |
303 for (size_t i = 0; i < arraysize(apple_keyboard_tests); ++i) { | 305 for (size_t i = 0; i < arraysize(apple_keyboard_tests); ++i) { |
304 CheckKeyTestCase(2000 + i, &rewriter, apple_keyboard_tests[i]); | 306 CheckKeyTestCase(2000 + i, &rewriter, apple_keyboard_tests[i]); |
305 } | 307 } |
306 } | 308 } |
307 | 309 |
308 void EventRewriterTest::TestRewriteNumPadKeys() { | 310 void EventRewriterTest::TestRewriteNumPadKeys() { |
309 TestingPrefServiceSyncable prefs; | 311 TestingPrefServiceSyncable prefs; |
310 EventRewriter rewriter; | 312 EventRewriter rewriter(NULL); |
311 rewriter.set_pref_service_for_testing(&prefs); | 313 rewriter.set_pref_service_for_testing(&prefs); |
312 | 314 |
313 KeyTestCase tests[] = { | 315 KeyTestCase tests[] = { |
314 // XK_KP_Insert (= NumPad 0 without Num Lock), no modifier. | 316 // XK_KP_Insert (= NumPad 0 without Num Lock), no modifier. |
315 {KeyTestCase::TEST_ALL|KeyTestCase::NUMPAD, ui::ET_KEY_PRESSED, | 317 {KeyTestCase::TEST_ALL|KeyTestCase::NUMPAD, ui::ET_KEY_PRESSED, |
316 {ui::VKEY_INSERT, ui::EF_NUMPAD_KEY}, | 318 {ui::VKEY_INSERT, ui::EF_NUMPAD_KEY}, |
317 {ui::VKEY_NUMPAD0, ui::EF_NUMPAD_KEY}}, | 319 {ui::VKEY_NUMPAD0, ui::EF_NUMPAD_KEY}}, |
318 | 320 |
319 // XK_KP_Insert (= NumPad 0 without Num Lock), Alt modifier. | 321 // XK_KP_Insert (= NumPad 0 without Num Lock), Alt modifier. |
320 {KeyTestCase::TEST_ALL|KeyTestCase::NUMPAD, ui::ET_KEY_PRESSED, | 322 {KeyTestCase::TEST_ALL|KeyTestCase::NUMPAD, ui::ET_KEY_PRESSED, |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
442 CommandLine::ForCurrentProcess()->AppendSwitchASCII( | 444 CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
443 chromeos::switches::kHasChromeOSDiamondKey, ""); | 445 chromeos::switches::kHasChromeOSDiamondKey, ""); |
444 | 446 |
445 TestRewriteNumPadKeys(); | 447 TestRewriteNumPadKeys(); |
446 *CommandLine::ForCurrentProcess() = original_cl; | 448 *CommandLine::ForCurrentProcess() = original_cl; |
447 } | 449 } |
448 | 450 |
449 // Tests if the rewriter can handle a Command + Num Pad event. | 451 // Tests if the rewriter can handle a Command + Num Pad event. |
450 void EventRewriterTest::TestRewriteNumPadKeysOnAppleKeyboard() { | 452 void EventRewriterTest::TestRewriteNumPadKeysOnAppleKeyboard() { |
451 TestingPrefServiceSyncable prefs; | 453 TestingPrefServiceSyncable prefs; |
452 EventRewriter rewriter; | 454 EventRewriter rewriter(NULL); |
453 rewriter.DeviceAddedForTesting(0, "Apple Keyboard"); | 455 rewriter.DeviceAddedForTesting(0, "Apple Keyboard"); |
454 rewriter.set_last_device_id_for_testing(0); | 456 rewriter.set_last_device_id_for_testing(0); |
455 rewriter.set_pref_service_for_testing(&prefs); | 457 rewriter.set_pref_service_for_testing(&prefs); |
456 | 458 |
457 KeyTestCase tests[] = { | 459 KeyTestCase tests[] = { |
458 // XK_KP_End (= NumPad 1 without Num Lock), Win modifier. | 460 // XK_KP_End (= NumPad 1 without Num Lock), Win modifier. |
459 // The result should be "Num Pad 1 with Control + Num Lock modifiers". | 461 // The result should be "Num Pad 1 with Control + Num Lock modifiers". |
460 {KeyTestCase::TEST_ALL|KeyTestCase::NUMPAD, ui::ET_KEY_PRESSED, | 462 {KeyTestCase::TEST_ALL|KeyTestCase::NUMPAD, ui::ET_KEY_PRESSED, |
461 {ui::VKEY_END, ui::EF_COMMAND_DOWN | ui::EF_NUMPAD_KEY}, | 463 {ui::VKEY_END, ui::EF_COMMAND_DOWN | ui::EF_NUMPAD_KEY}, |
462 {ui::VKEY_NUMPAD1, ui::EF_CONTROL_DOWN | ui::EF_NUMPAD_KEY}}, | 464 {ui::VKEY_NUMPAD1, ui::EF_CONTROL_DOWN | ui::EF_NUMPAD_KEY}}, |
(...skipping 21 matching lines...) Expand all Loading... | |
484 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); | 486 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); |
485 CommandLine::ForCurrentProcess()->AppendSwitchASCII( | 487 CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
486 chromeos::switches::kHasChromeOSDiamondKey, ""); | 488 chromeos::switches::kHasChromeOSDiamondKey, ""); |
487 | 489 |
488 TestRewriteNumPadKeysOnAppleKeyboard(); | 490 TestRewriteNumPadKeysOnAppleKeyboard(); |
489 *CommandLine::ForCurrentProcess() = original_cl; | 491 *CommandLine::ForCurrentProcess() = original_cl; |
490 } | 492 } |
491 | 493 |
492 TEST_F(EventRewriterTest, TestRewriteModifiersNoRemap) { | 494 TEST_F(EventRewriterTest, TestRewriteModifiersNoRemap) { |
493 TestingPrefServiceSyncable prefs; | 495 TestingPrefServiceSyncable prefs; |
494 EventRewriter rewriter; | 496 EventRewriter rewriter(NULL); |
495 rewriter.set_pref_service_for_testing(&prefs); | 497 rewriter.set_pref_service_for_testing(&prefs); |
496 | 498 |
497 KeyTestCase tests[] = { | 499 KeyTestCase tests[] = { |
498 // Press Search. Confirm the event is not rewritten. | 500 // Press Search. Confirm the event is not rewritten. |
499 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 501 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
500 {ui::VKEY_LWIN, ui::EF_NONE}, | 502 {ui::VKEY_LWIN, ui::EF_NONE}, |
501 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN}}, | 503 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN}}, |
502 | 504 |
503 // Press left Control. Confirm the event is not rewritten. | 505 // Press left Control. Confirm the event is not rewritten. |
504 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 506 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
(...skipping 22 matching lines...) Expand all Loading... | |
527 {ui::VKEY_LWIN, ui::EF_NONE}}, | 529 {ui::VKEY_LWIN, ui::EF_NONE}}, |
528 }; | 530 }; |
529 | 531 |
530 for (size_t i = 0; i < arraysize(tests); ++i) { | 532 for (size_t i = 0; i < arraysize(tests); ++i) { |
531 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); | 533 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); |
532 } | 534 } |
533 } | 535 } |
534 | 536 |
535 TEST_F(EventRewriterTest, TestRewriteModifiersNoRemapMultipleKeys) { | 537 TEST_F(EventRewriterTest, TestRewriteModifiersNoRemapMultipleKeys) { |
536 TestingPrefServiceSyncable prefs; | 538 TestingPrefServiceSyncable prefs; |
537 EventRewriter rewriter; | 539 EventRewriter rewriter(NULL); |
538 rewriter.set_pref_service_for_testing(&prefs); | 540 rewriter.set_pref_service_for_testing(&prefs); |
539 | 541 |
540 KeyTestCase tests[] = { | 542 KeyTestCase tests[] = { |
541 // Press Alt with Shift. Confirm the event is not rewritten. | 543 // Press Alt with Shift. Confirm the event is not rewritten. |
542 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 544 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
543 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}, | 545 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}, |
544 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}}, | 546 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}}, |
545 | 547 |
546 // Press Search with Caps Lock mask. Confirm the event is not rewritten. | 548 // Press Search with Caps Lock mask. Confirm the event is not rewritten. |
547 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 549 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
(...skipping 22 matching lines...) Expand all Loading... | |
570 // Disable Search and Control keys. | 572 // Disable Search and Control keys. |
571 TestingPrefServiceSyncable prefs; | 573 TestingPrefServiceSyncable prefs; |
572 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 574 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
573 IntegerPrefMember search; | 575 IntegerPrefMember search; |
574 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); | 576 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); |
575 search.SetValue(chromeos::input_method::kVoidKey); | 577 search.SetValue(chromeos::input_method::kVoidKey); |
576 IntegerPrefMember control; | 578 IntegerPrefMember control; |
577 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); | 579 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); |
578 control.SetValue(chromeos::input_method::kVoidKey); | 580 control.SetValue(chromeos::input_method::kVoidKey); |
579 | 581 |
580 EventRewriter rewriter; | 582 EventRewriter rewriter(NULL); |
581 rewriter.set_pref_service_for_testing(&prefs); | 583 rewriter.set_pref_service_for_testing(&prefs); |
582 | 584 |
583 KeyTestCase disabled_modifier_tests[] = { | 585 KeyTestCase disabled_modifier_tests[] = { |
584 // Press Alt with Shift. This key press shouldn't be affected by the | 586 // Press Alt with Shift. This key press shouldn't be affected by the |
585 // pref. Confirm the event is not rewritten. | 587 // pref. Confirm the event is not rewritten. |
586 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 588 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
587 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}, | 589 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}, |
588 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}}, | 590 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}}, |
589 | 591 |
590 // Press Search. Confirm the event is now VKEY_UNKNOWN. | 592 // Press Search. Confirm the event is now VKEY_UNKNOWN. |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
645 } | 647 } |
646 | 648 |
647 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToControl) { | 649 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToControl) { |
648 // Remap Search to Control. | 650 // Remap Search to Control. |
649 TestingPrefServiceSyncable prefs; | 651 TestingPrefServiceSyncable prefs; |
650 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 652 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
651 IntegerPrefMember search; | 653 IntegerPrefMember search; |
652 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); | 654 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); |
653 search.SetValue(chromeos::input_method::kControlKey); | 655 search.SetValue(chromeos::input_method::kControlKey); |
654 | 656 |
655 EventRewriter rewriter; | 657 EventRewriter rewriter(NULL); |
656 rewriter.set_pref_service_for_testing(&prefs); | 658 rewriter.set_pref_service_for_testing(&prefs); |
657 | 659 |
658 KeyTestCase s_tests[] = { | 660 KeyTestCase s_tests[] = { |
659 // Press Search. Confirm the event is now VKEY_CONTROL. | 661 // Press Search. Confirm the event is now VKEY_CONTROL. |
660 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 662 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
661 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN}, | 663 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN}, |
662 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN}}, | 664 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN}}, |
663 }; | 665 }; |
664 | 666 |
665 for (size_t i = 0; i < arraysize(s_tests); ++i) { | 667 for (size_t i = 0; i < arraysize(s_tests); ++i) { |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
709 } | 711 } |
710 | 712 |
711 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToEscape) { | 713 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToEscape) { |
712 // Remap Search to ESC. | 714 // Remap Search to ESC. |
713 TestingPrefServiceSyncable prefs; | 715 TestingPrefServiceSyncable prefs; |
714 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 716 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
715 IntegerPrefMember search; | 717 IntegerPrefMember search; |
716 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); | 718 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); |
717 search.SetValue(chromeos::input_method::kEscapeKey); | 719 search.SetValue(chromeos::input_method::kEscapeKey); |
718 | 720 |
719 EventRewriter rewriter; | 721 EventRewriter rewriter(NULL); |
720 rewriter.set_pref_service_for_testing(&prefs); | 722 rewriter.set_pref_service_for_testing(&prefs); |
721 | 723 |
722 KeyTestCase tests[] = {// Press Search. Confirm the event is now VKEY_ESCAPE. | 724 KeyTestCase tests[] = {// Press Search. Confirm the event is now VKEY_ESCAPE. |
723 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 725 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
724 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN}, | 726 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN}, |
725 {ui::VKEY_ESCAPE, ui::EF_NONE}}, | 727 {ui::VKEY_ESCAPE, ui::EF_NONE}}, |
726 }; | 728 }; |
727 | 729 |
728 for (size_t i = 0; i < arraysize(tests); ++i) { | 730 for (size_t i = 0; i < arraysize(tests); ++i) { |
729 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); | 731 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); |
730 } | 732 } |
731 } | 733 } |
732 | 734 |
733 TEST_F(EventRewriterTest, TestRewriteModifiersRemapMany) { | 735 TEST_F(EventRewriterTest, TestRewriteModifiersRemapMany) { |
734 // Remap Search to Alt. | 736 // Remap Search to Alt. |
735 TestingPrefServiceSyncable prefs; | 737 TestingPrefServiceSyncable prefs; |
736 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 738 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
737 IntegerPrefMember search; | 739 IntegerPrefMember search; |
738 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); | 740 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); |
739 search.SetValue(chromeos::input_method::kAltKey); | 741 search.SetValue(chromeos::input_method::kAltKey); |
740 | 742 |
741 EventRewriter rewriter; | 743 EventRewriter rewriter(NULL); |
742 rewriter.set_pref_service_for_testing(&prefs); | 744 rewriter.set_pref_service_for_testing(&prefs); |
743 | 745 |
744 KeyTestCase s2a_tests[] = { | 746 KeyTestCase s2a_tests[] = { |
745 // Press Search. Confirm the event is now VKEY_MENU. | 747 // Press Search. Confirm the event is now VKEY_MENU. |
746 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 748 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
747 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN}, | 749 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN}, |
748 {ui::VKEY_MENU, ui::EF_ALT_DOWN}}, | 750 {ui::VKEY_MENU, ui::EF_ALT_DOWN}}, |
749 }; | 751 }; |
750 | 752 |
751 for (size_t i = 0; i < arraysize(s2a_tests); ++i) { | 753 for (size_t i = 0; i < arraysize(s2a_tests); ++i) { |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
808 | 810 |
809 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToCapsLock) { | 811 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToCapsLock) { |
810 // Remap Search to Caps Lock. | 812 // Remap Search to Caps Lock. |
811 TestingPrefServiceSyncable prefs; | 813 TestingPrefServiceSyncable prefs; |
812 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 814 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
813 IntegerPrefMember search; | 815 IntegerPrefMember search; |
814 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); | 816 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); |
815 search.SetValue(chromeos::input_method::kCapsLockKey); | 817 search.SetValue(chromeos::input_method::kCapsLockKey); |
816 | 818 |
817 chromeos::input_method::FakeImeKeyboard ime_keyboard; | 819 chromeos::input_method::FakeImeKeyboard ime_keyboard; |
818 EventRewriter rewriter; | 820 EventRewriter rewriter(NULL); |
819 rewriter.set_pref_service_for_testing(&prefs); | 821 rewriter.set_pref_service_for_testing(&prefs); |
820 rewriter.set_ime_keyboard_for_testing(&ime_keyboard); | 822 rewriter.set_ime_keyboard_for_testing(&ime_keyboard); |
821 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); | 823 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); |
822 | 824 |
823 // Press Search. | 825 // Press Search. |
824 EXPECT_EQ( | 826 EXPECT_EQ( |
825 GetExpectedResultAsString(ui::VKEY_CAPITAL, | 827 GetExpectedResultAsString(ui::VKEY_CAPITAL, |
826 ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN, | 828 ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN, |
827 ui::ET_KEY_PRESSED), | 829 ui::ET_KEY_PRESSED), |
828 GetRewrittenEventAsString( | 830 GetRewrittenEventAsString( |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
878 GetRewrittenEventAsString( | 880 GetRewrittenEventAsString( |
879 &rewriter, ui::VKEY_CAPITAL, ui::EF_NONE, ui::ET_KEY_RELEASED)); | 881 &rewriter, ui::VKEY_CAPITAL, ui::EF_NONE, ui::ET_KEY_RELEASED)); |
880 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); | 882 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); |
881 } | 883 } |
882 | 884 |
883 TEST_F(EventRewriterTest, TestRewriteCapsLock) { | 885 TEST_F(EventRewriterTest, TestRewriteCapsLock) { |
884 TestingPrefServiceSyncable prefs; | 886 TestingPrefServiceSyncable prefs; |
885 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 887 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
886 | 888 |
887 chromeos::input_method::FakeImeKeyboard ime_keyboard; | 889 chromeos::input_method::FakeImeKeyboard ime_keyboard; |
888 EventRewriter rewriter; | 890 EventRewriter rewriter(NULL); |
889 rewriter.set_pref_service_for_testing(&prefs); | 891 rewriter.set_pref_service_for_testing(&prefs); |
890 rewriter.set_ime_keyboard_for_testing(&ime_keyboard); | 892 rewriter.set_ime_keyboard_for_testing(&ime_keyboard); |
891 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); | 893 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); |
892 | 894 |
893 // On Chrome OS, CapsLock is mapped to F16 with Mod3Mask. | 895 // On Chrome OS, CapsLock is mapped to F16 with Mod3Mask. |
894 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, | 896 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, |
895 ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN, | 897 ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN, |
896 ui::ET_KEY_PRESSED), | 898 ui::ET_KEY_PRESSED), |
897 GetRewrittenEventAsString( | 899 GetRewrittenEventAsString( |
898 &rewriter, ui::VKEY_F16, ui::EF_MOD3_DOWN, ui::ET_KEY_PRESSED)); | 900 &rewriter, ui::VKEY_F16, ui::EF_MOD3_DOWN, ui::ET_KEY_PRESSED)); |
899 EXPECT_TRUE(ime_keyboard.caps_lock_is_enabled_); | 901 EXPECT_TRUE(ime_keyboard.caps_lock_is_enabled_); |
900 } | 902 } |
901 | 903 |
902 TEST_F(EventRewriterTest, TestRewriteDiamondKey) { | 904 TEST_F(EventRewriterTest, TestRewriteDiamondKey) { |
903 TestingPrefServiceSyncable prefs; | 905 TestingPrefServiceSyncable prefs; |
904 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 906 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
905 | 907 |
906 chromeos::input_method::FakeImeKeyboard ime_keyboard; | 908 chromeos::input_method::FakeImeKeyboard ime_keyboard; |
907 EventRewriter rewriter; | 909 EventRewriter rewriter(NULL); |
908 rewriter.set_pref_service_for_testing(&prefs); | 910 rewriter.set_pref_service_for_testing(&prefs); |
909 rewriter.set_ime_keyboard_for_testing(&ime_keyboard); | 911 rewriter.set_ime_keyboard_for_testing(&ime_keyboard); |
910 | 912 |
911 KeyTestCase tests[] = { | 913 KeyTestCase tests[] = { |
912 // F15 should work as Ctrl when --has-chromeos-diamond-key is not | 914 // F15 should work as Ctrl when --has-chromeos-diamond-key is not |
913 // specified. | 915 // specified. |
914 {KeyTestCase::TEST_VKEY, | 916 {KeyTestCase::TEST_VKEY, |
915 ui::ET_KEY_PRESSED, | 917 ui::ET_KEY_PRESSED, |
916 {ui::VKEY_F15, ui::EF_NONE}, | 918 {ui::VKEY_F15, ui::EF_NONE}, |
917 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN}}, | 919 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN}}, |
(...skipping 12 matching lines...) Expand all Loading... | |
930 } | 932 } |
931 TEST_F(EventRewriterTest, TestRewriteDiamondKeyWithFlag) { | 933 TEST_F(EventRewriterTest, TestRewriteDiamondKeyWithFlag) { |
932 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); | 934 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); |
933 CommandLine::ForCurrentProcess()->AppendSwitchASCII( | 935 CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
934 chromeos::switches::kHasChromeOSDiamondKey, ""); | 936 chromeos::switches::kHasChromeOSDiamondKey, ""); |
935 | 937 |
936 TestingPrefServiceSyncable prefs; | 938 TestingPrefServiceSyncable prefs; |
937 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 939 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
938 | 940 |
939 chromeos::input_method::FakeImeKeyboard ime_keyboard; | 941 chromeos::input_method::FakeImeKeyboard ime_keyboard; |
940 EventRewriter rewriter; | 942 EventRewriter rewriter(NULL); |
941 rewriter.set_pref_service_for_testing(&prefs); | 943 rewriter.set_pref_service_for_testing(&prefs); |
942 rewriter.set_ime_keyboard_for_testing(&ime_keyboard); | 944 rewriter.set_ime_keyboard_for_testing(&ime_keyboard); |
943 | 945 |
944 // By default, F15 should work as Control. | 946 // By default, F15 should work as Control. |
945 EXPECT_EQ(GetExpectedResultAsString( | 947 EXPECT_EQ(GetExpectedResultAsString( |
946 ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN, ui::ET_KEY_PRESSED), | 948 ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN, ui::ET_KEY_PRESSED), |
947 GetRewrittenEventAsString( | 949 GetRewrittenEventAsString( |
948 &rewriter, ui::VKEY_F15, ui::EF_NONE, ui::ET_KEY_PRESSED)); | 950 &rewriter, ui::VKEY_F15, ui::EF_NONE, ui::ET_KEY_PRESSED)); |
949 | 951 |
950 IntegerPrefMember diamond; | 952 IntegerPrefMember diamond; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
982 } | 984 } |
983 | 985 |
984 TEST_F(EventRewriterTest, TestRewriteCapsLockToControl) { | 986 TEST_F(EventRewriterTest, TestRewriteCapsLockToControl) { |
985 // Remap CapsLock to Control. | 987 // Remap CapsLock to Control. |
986 TestingPrefServiceSyncable prefs; | 988 TestingPrefServiceSyncable prefs; |
987 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 989 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
988 IntegerPrefMember control; | 990 IntegerPrefMember control; |
989 control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs); | 991 control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs); |
990 control.SetValue(chromeos::input_method::kControlKey); | 992 control.SetValue(chromeos::input_method::kControlKey); |
991 | 993 |
992 EventRewriter rewriter; | 994 EventRewriter rewriter(NULL); |
993 rewriter.set_pref_service_for_testing(&prefs); | 995 rewriter.set_pref_service_for_testing(&prefs); |
994 | 996 |
995 KeyTestCase tests[] = { | 997 KeyTestCase tests[] = { |
996 // Press CapsLock+a. Confirm that Mod3Mask is rewritten to ControlMask. | 998 // Press CapsLock+a. Confirm that Mod3Mask is rewritten to ControlMask. |
997 // On Chrome OS, CapsLock works as a Mod3 modifier. | 999 // On Chrome OS, CapsLock works as a Mod3 modifier. |
998 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 1000 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
999 {ui::VKEY_A, ui::EF_MOD3_DOWN}, | 1001 {ui::VKEY_A, ui::EF_MOD3_DOWN}, |
1000 {ui::VKEY_A, ui::EF_CONTROL_DOWN}}, | 1002 {ui::VKEY_A, ui::EF_CONTROL_DOWN}}, |
1001 | 1003 |
1002 // Press Control+CapsLock+a. Confirm that Mod3Mask is rewritten to | 1004 // Press Control+CapsLock+a. Confirm that Mod3Mask is rewritten to |
(...skipping 15 matching lines...) Expand all Loading... | |
1018 } | 1020 } |
1019 | 1021 |
1020 TEST_F(EventRewriterTest, TestRewriteCapsLockMod3InUse) { | 1022 TEST_F(EventRewriterTest, TestRewriteCapsLockMod3InUse) { |
1021 // Remap CapsLock to Control. | 1023 // Remap CapsLock to Control. |
1022 TestingPrefServiceSyncable prefs; | 1024 TestingPrefServiceSyncable prefs; |
1023 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 1025 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
1024 IntegerPrefMember control; | 1026 IntegerPrefMember control; |
1025 control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs); | 1027 control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs); |
1026 control.SetValue(chromeos::input_method::kControlKey); | 1028 control.SetValue(chromeos::input_method::kControlKey); |
1027 | 1029 |
1028 EventRewriter rewriter; | 1030 EventRewriter rewriter(NULL); |
1029 rewriter.set_pref_service_for_testing(&prefs); | 1031 rewriter.set_pref_service_for_testing(&prefs); |
1030 input_method_manager_mock_->set_mod3_used(true); | 1032 input_method_manager_mock_->set_mod3_used(true); |
1031 | 1033 |
1032 // Press CapsLock+a. Confirm that Mod3Mask is NOT rewritten to ControlMask | 1034 // Press CapsLock+a. Confirm that Mod3Mask is NOT rewritten to ControlMask |
1033 // when Mod3Mask is already in use by the current XKB layout. | 1035 // when Mod3Mask is already in use by the current XKB layout. |
1034 EXPECT_EQ( | 1036 EXPECT_EQ( |
1035 GetExpectedResultAsString(ui::VKEY_A, ui::EF_NONE, ui::ET_KEY_PRESSED), | 1037 GetExpectedResultAsString(ui::VKEY_A, ui::EF_NONE, ui::ET_KEY_PRESSED), |
1036 GetRewrittenEventAsString( | 1038 GetRewrittenEventAsString( |
1037 &rewriter, ui::VKEY_A, ui::EF_NONE, ui::ET_KEY_PRESSED)); | 1039 &rewriter, ui::VKEY_A, ui::EF_NONE, ui::ET_KEY_PRESSED)); |
1038 | 1040 |
1039 input_method_manager_mock_->set_mod3_used(false); | 1041 input_method_manager_mock_->set_mod3_used(false); |
1040 } | 1042 } |
1041 | 1043 |
1042 TEST_F(EventRewriterTest, TestRewriteExtendedKeys) { | 1044 TEST_F(EventRewriterTest, TestRewriteExtendedKeys) { |
1043 TestingPrefServiceSyncable prefs; | 1045 TestingPrefServiceSyncable prefs; |
1044 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 1046 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
1045 EventRewriter rewriter; | 1047 EventRewriter rewriter(NULL); |
1046 rewriter.DeviceAddedForTesting(0, "PC Keyboard"); | 1048 rewriter.DeviceAddedForTesting(0, "PC Keyboard"); |
1047 rewriter.set_last_device_id_for_testing(0); | 1049 rewriter.set_last_device_id_for_testing(0); |
1048 rewriter.set_pref_service_for_testing(&prefs); | 1050 rewriter.set_pref_service_for_testing(&prefs); |
1049 | 1051 |
1050 KeyTestCase tests[] = { | 1052 KeyTestCase tests[] = { |
1051 // Alt+Backspace -> Delete | 1053 // Alt+Backspace -> Delete |
1052 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 1054 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
1053 {ui::VKEY_BACK, ui::EF_ALT_DOWN}, | 1055 {ui::VKEY_BACK, ui::EF_ALT_DOWN}, |
1054 {ui::VKEY_DELETE, ui::EF_NONE}}, | 1056 {ui::VKEY_DELETE, ui::EF_NONE}}, |
1055 // Control+Alt+Backspace -> Control+Delete | 1057 // Control+Alt+Backspace -> Control+Delete |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1144 {ui::VKEY_INSERT, ui::EF_CONTROL_DOWN}}}; | 1146 {ui::VKEY_INSERT, ui::EF_CONTROL_DOWN}}}; |
1145 | 1147 |
1146 for (size_t i = 0; i < arraysize(tests); ++i) { | 1148 for (size_t i = 0; i < arraysize(tests); ++i) { |
1147 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); | 1149 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); |
1148 } | 1150 } |
1149 } | 1151 } |
1150 | 1152 |
1151 TEST_F(EventRewriterTest, TestRewriteFunctionKeys) { | 1153 TEST_F(EventRewriterTest, TestRewriteFunctionKeys) { |
1152 TestingPrefServiceSyncable prefs; | 1154 TestingPrefServiceSyncable prefs; |
1153 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 1155 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
1154 EventRewriter rewriter; | 1156 EventRewriter rewriter(NULL); |
1155 rewriter.set_pref_service_for_testing(&prefs); | 1157 rewriter.set_pref_service_for_testing(&prefs); |
1156 | 1158 |
1157 KeyTestCase tests[] = { | 1159 KeyTestCase tests[] = { |
1158 // F1 -> Back | 1160 // F1 -> Back |
1159 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 1161 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
1160 {ui::VKEY_F1, ui::EF_NONE}, | 1162 {ui::VKEY_F1, ui::EF_NONE}, |
1161 {ui::VKEY_BROWSER_BACK, ui::EF_NONE}}, | 1163 {ui::VKEY_BROWSER_BACK, ui::EF_NONE}}, |
1162 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 1164 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
1163 {ui::VKEY_F1, ui::EF_CONTROL_DOWN}, | 1165 {ui::VKEY_F1, ui::EF_CONTROL_DOWN}, |
1164 {ui::VKEY_BROWSER_BACK, ui::EF_CONTROL_DOWN}}, | 1166 {ui::VKEY_BROWSER_BACK, ui::EF_CONTROL_DOWN}}, |
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1400 TEST_F(EventRewriterTest, TestRewriteExtendedKeysWithSearchRemapped) { | 1402 TEST_F(EventRewriterTest, TestRewriteExtendedKeysWithSearchRemapped) { |
1401 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); | 1403 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); |
1402 | 1404 |
1403 // Remap Search to Control. | 1405 // Remap Search to Control. |
1404 TestingPrefServiceSyncable prefs; | 1406 TestingPrefServiceSyncable prefs; |
1405 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 1407 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
1406 IntegerPrefMember search; | 1408 IntegerPrefMember search; |
1407 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); | 1409 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); |
1408 search.SetValue(chromeos::input_method::kControlKey); | 1410 search.SetValue(chromeos::input_method::kControlKey); |
1409 | 1411 |
1410 EventRewriter rewriter; | 1412 EventRewriter rewriter(NULL); |
1411 rewriter.set_pref_service_for_testing(&prefs); | 1413 rewriter.set_pref_service_for_testing(&prefs); |
1412 | 1414 |
1413 CommandLine::ForCurrentProcess()->AppendSwitchASCII( | 1415 CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
1414 chromeos::switches::kHasChromeOSKeyboard, ""); | 1416 chromeos::switches::kHasChromeOSKeyboard, ""); |
1415 | 1417 |
1416 KeyTestCase tests[] = { | 1418 KeyTestCase tests[] = { |
1417 // Alt+Search+Down -> End | 1419 // Alt+Search+Down -> End |
1418 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 1420 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
1419 {ui::VKEY_DOWN, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN}, | 1421 {ui::VKEY_DOWN, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN}, |
1420 {ui::VKEY_END, ui::EF_NONE}}, | 1422 {ui::VKEY_END, ui::EF_NONE}}, |
1421 | 1423 |
1422 // Shift+Alt+Search+Down -> Shift+End | 1424 // Shift+Alt+Search+Down -> Shift+End |
1423 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 1425 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
1424 {ui::VKEY_DOWN, | 1426 {ui::VKEY_DOWN, |
1425 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN}, | 1427 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN}, |
1426 {ui::VKEY_END, ui::EF_SHIFT_DOWN}}, | 1428 {ui::VKEY_END, ui::EF_SHIFT_DOWN}}, |
1427 }; | 1429 }; |
1428 | 1430 |
1429 for (size_t i = 0; i < arraysize(tests); ++i) { | 1431 for (size_t i = 0; i < arraysize(tests); ++i) { |
1430 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); | 1432 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); |
1431 } | 1433 } |
1432 | 1434 |
1433 *CommandLine::ForCurrentProcess() = original_cl; | 1435 *CommandLine::ForCurrentProcess() = original_cl; |
1434 } | 1436 } |
1435 | 1437 |
1436 TEST_F(EventRewriterTest, TestRewriteKeyEventSentByXSendEvent) { | 1438 TEST_F(EventRewriterTest, TestRewriteKeyEventSentByXSendEvent) { |
1439 #if defined(USE_X11) | |
1440 // TODO(kpschoedel): pending alternative to xevent.xany.send_event | |
1437 // Remap Control to Alt. | 1441 // Remap Control to Alt. |
1438 TestingPrefServiceSyncable prefs; | 1442 TestingPrefServiceSyncable prefs; |
1439 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 1443 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
1440 IntegerPrefMember control; | 1444 IntegerPrefMember control; |
1441 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); | 1445 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); |
1442 control.SetValue(chromeos::input_method::kAltKey); | 1446 control.SetValue(chromeos::input_method::kAltKey); |
1443 | 1447 |
1444 EventRewriter rewriter; | 1448 EventRewriter rewriter(NULL); |
1445 rewriter.set_pref_service_for_testing(&prefs); | 1449 rewriter.set_pref_service_for_testing(&prefs); |
1446 | 1450 |
1447 // Send left control press. | 1451 // Send left control press. |
1448 std::string rewritten_event; | 1452 std::string rewritten_event; |
1449 { | 1453 { |
1450 ui::ScopedXI2Event xev; | 1454 ui::ScopedXI2Event xev; |
1451 xev.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 0); | 1455 xev.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 0); |
1452 XEvent* xevent = xev; | 1456 XEvent* xevent = xev; |
1453 xevent->xkey.keycode = XKeysymToKeycode(gfx::GetXDisplay(), XK_Control_L); | 1457 xevent->xkey.keycode = XKeysymToKeycode(gfx::GetXDisplay(), XK_Control_L); |
1454 xevent->xkey.send_event = True; // XSendEvent() always does this. | 1458 xevent->xkey.send_event = True; // XSendEvent() always does this. |
1455 ui::KeyEvent keyevent(xev, false /* is_char */); | 1459 ui::KeyEvent keyevent(xev, false /* is_char */); |
1456 scoped_ptr<ui::Event> new_event; | 1460 scoped_ptr<ui::Event> new_event; |
1457 // Control should NOT be remapped to Alt if send_event | 1461 // Control should NOT be remapped to Alt if send_event |
1458 // flag in the event is True. | 1462 // flag in the event is True. |
1459 EXPECT_EQ(ui::EVENT_REWRITE_CONTINUE, | 1463 EXPECT_EQ(ui::EVENT_REWRITE_CONTINUE, |
1460 rewriter.RewriteEvent(keyevent, &new_event)); | 1464 rewriter.RewriteEvent(keyevent, &new_event)); |
1461 EXPECT_FALSE(new_event); | 1465 EXPECT_FALSE(new_event); |
1462 } | 1466 } |
1467 #endif | |
1463 } | 1468 } |
1464 | 1469 |
1465 TEST_F(EventRewriterTest, TestRewriteNonNativeEvent) { | 1470 TEST_F(EventRewriterTest, TestRewriteNonNativeEvent) { |
1466 // Remap Control to Alt. | 1471 // Remap Control to Alt. |
1467 TestingPrefServiceSyncable prefs; | 1472 TestingPrefServiceSyncable prefs; |
1468 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 1473 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
1469 IntegerPrefMember control; | 1474 IntegerPrefMember control; |
1470 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); | 1475 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); |
1471 control.SetValue(chromeos::input_method::kAltKey); | 1476 control.SetValue(chromeos::input_method::kAltKey); |
1472 | 1477 |
1473 EventRewriter rewriter; | 1478 EventRewriter rewriter(0); |
Daniel Erat
2014/06/05 23:16:10
nit: s/0/NULL/
kpschoedel
2014/06/06 17:53:23
Done.
| |
1474 rewriter.set_pref_service_for_testing(&prefs); | 1479 rewriter.set_pref_service_for_testing(&prefs); |
1475 | 1480 |
1476 const int kTouchId = 2; | 1481 const int kTouchId = 2; |
1477 gfx::Point location(0, 0); | 1482 gfx::Point location(0, 0); |
1478 ui::TouchEvent press( | 1483 ui::TouchEvent press( |
1479 ui::ET_TOUCH_PRESSED, location, kTouchId, base::TimeDelta()); | 1484 ui::ET_TOUCH_PRESSED, location, kTouchId, base::TimeDelta()); |
1480 press.set_flags(ui::EF_CONTROL_DOWN); | 1485 press.set_flags(ui::EF_CONTROL_DOWN); |
1481 | 1486 |
1482 scoped_ptr<ui::Event> new_event; | 1487 scoped_ptr<ui::Event> new_event; |
1483 rewriter.RewriteEvent(press, &new_event); | 1488 rewriter.RewriteEvent(press, &new_event); |
1484 EXPECT_TRUE(new_event); | 1489 EXPECT_TRUE(new_event); |
1485 // Control should be remapped to Alt. | 1490 // Control should be remapped to Alt. |
1486 EXPECT_EQ(ui::EF_ALT_DOWN, | 1491 EXPECT_EQ(ui::EF_ALT_DOWN, |
1487 new_event->flags() & (ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN)); | 1492 new_event->flags() & (ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN)); |
1488 } | 1493 } |
1489 | 1494 |
1495 // Keeps a buffer of handled events. | |
1496 class EventBuffer : public ui::test::TestEventProcessor { | |
1497 public: | |
1498 EventBuffer() {} | |
1499 virtual ~EventBuffer() {} | |
1500 | |
1501 void PopEvents(ScopedVector<ui::Event>* events) { | |
1502 events->clear(); | |
1503 events->swap(events_); | |
1504 } | |
1505 | |
1506 private: | |
1507 // ui::EventProcessor overrides: | |
1508 virtual ui::EventDispatchDetails OnEventFromSource( | |
1509 ui::Event* event) OVERRIDE { | |
1510 if (event->IsKeyEvent()) { | |
1511 events_.push_back(new ui::KeyEvent(*static_cast<ui::KeyEvent*>(event))); | |
1512 } else if (event->IsMouseWheelEvent()) { | |
1513 events_.push_back( | |
1514 new ui::MouseWheelEvent(*static_cast<ui::MouseWheelEvent*>(event))); | |
1515 } else if (event->IsMouseEvent()) { | |
1516 events_.push_back( | |
1517 new ui::MouseEvent(*static_cast<ui::MouseEvent*>(event))); | |
1518 } | |
1519 return ui::EventDispatchDetails(); | |
1520 } | |
1521 | |
1522 ScopedVector<ui::Event> events_; | |
1523 | |
1524 DISALLOW_COPY_AND_ASSIGN(EventBuffer); | |
1525 }; | |
1526 | |
1527 // Trivial EventSource that does nothing but send events. | |
1528 class TestEventSource : public ui::EventSource { | |
1529 public: | |
1530 explicit TestEventSource(ui::EventProcessor* processor) | |
1531 : processor_(processor) {} | |
1532 virtual ui::EventProcessor* GetEventProcessor() OVERRIDE { | |
1533 return processor_; | |
1534 } | |
1535 ui::EventDispatchDetails Send(ui::Event* event) { | |
1536 ui::EventDispatchDetails details = SendEventToProcessor(event); | |
Daniel Erat
2014/06/05 23:16:10
return the details directly
kpschoedel
2014/06/06 17:53:23
Done (used to have debug logging in there).
| |
1537 return details; | |
1538 } | |
1539 | |
1540 void SendActivateStickyKeyPattern(ui::KeyboardCode key_code) { | |
1541 ui::KeyEvent press(ui::ET_KEY_PRESSED, key_code, ui::EF_NONE, false); | |
1542 ui::EventDispatchDetails details = Send(&press); | |
1543 CHECK(!details.dispatcher_destroyed); | |
1544 ui::KeyEvent release(ui::ET_KEY_RELEASED, key_code, ui::EF_NONE, false); | |
1545 details = Send(&release); | |
1546 CHECK(!details.dispatcher_destroyed); | |
1547 } | |
1548 | |
1549 private: | |
1550 ui::EventProcessor* processor_; | |
1551 }; | |
1552 | |
1490 // Tests of event rewriting that depend on the Ash window manager. | 1553 // Tests of event rewriting that depend on the Ash window manager. |
1491 class EventRewriterAshTest : public ash::test::AshTestBase { | 1554 class EventRewriterAshTest : public ash::test::AshTestBase { |
1492 public: | 1555 public: |
1493 EventRewriterAshTest() | 1556 EventRewriterAshTest() |
1494 : mock_user_manager_(new chromeos::MockUserManager), | 1557 : mock_user_manager_(new chromeos::MockUserManager), |
1495 user_manager_enabler_(mock_user_manager_) {} | 1558 user_manager_enabler_(mock_user_manager_) {} |
1496 virtual ~EventRewriterAshTest() {} | 1559 virtual ~EventRewriterAshTest() {} |
1497 | 1560 |
1498 bool RewriteFunctionKeys(const ui::Event& event, | 1561 bool RewriteFunctionKeys(const ui::Event& event, |
1499 scoped_ptr<ui::Event>* rewritten_event) { | 1562 scoped_ptr<ui::Event>* rewritten_event) { |
1500 return rewriter_->RewriteEvent(event, rewritten_event); | 1563 return rewriter_->RewriteEvent(event, rewritten_event); |
1501 } | 1564 } |
1502 | 1565 |
1566 EventRewriter* rewriter() const { return rewriter_.get(); } | |
1567 | |
1568 ash::StickyKeysController* sticky_keys_controller() const { | |
1569 return sticky_keys_controller_; | |
1570 } | |
1571 | |
1503 protected: | 1572 protected: |
1504 virtual void SetUp() OVERRIDE { | 1573 virtual void SetUp() OVERRIDE { |
1505 AshTestBase::SetUp(); | 1574 AshTestBase::SetUp(); |
1506 rewriter_.reset(new EventRewriter()); | 1575 sticky_keys_controller_ = |
1576 ash::Shell::GetInstance()->sticky_keys_controller(); | |
1577 rewriter_.reset(new EventRewriter(sticky_keys_controller_)); | |
1507 chromeos::Preferences::RegisterProfilePrefs(prefs_.registry()); | 1578 chromeos::Preferences::RegisterProfilePrefs(prefs_.registry()); |
1508 rewriter_->set_pref_service_for_testing(&prefs_); | 1579 rewriter_->set_pref_service_for_testing(&prefs_); |
1580 #if defined(USE_X11) | |
1581 ui::SetUpTouchPadForTest(kTouchPadDeviceId); | |
1582 #endif | |
1509 } | 1583 } |
1510 | 1584 |
1511 virtual void TearDown() OVERRIDE { | 1585 virtual void TearDown() OVERRIDE { |
1512 rewriter_.reset(); | 1586 rewriter_.reset(); |
1513 AshTestBase::TearDown(); | 1587 AshTestBase::TearDown(); |
1514 } | 1588 } |
1515 | 1589 |
1516 TestingPrefServiceSyncable prefs_; | 1590 TestingPrefServiceSyncable prefs_; |
1517 | 1591 |
1518 private: | 1592 private: |
1519 scoped_ptr<EventRewriter> rewriter_; | 1593 scoped_ptr<EventRewriter> rewriter_; |
1520 | 1594 |
1521 chromeos::MockUserManager* mock_user_manager_; // Not owned. | 1595 chromeos::MockUserManager* mock_user_manager_; // Not owned. |
1522 chromeos::ScopedUserManagerEnabler user_manager_enabler_; | 1596 chromeos::ScopedUserManagerEnabler user_manager_enabler_; |
1597 ash::StickyKeysController* sticky_keys_controller_; | |
1523 | 1598 |
1524 DISALLOW_COPY_AND_ASSIGN(EventRewriterAshTest); | 1599 DISALLOW_COPY_AND_ASSIGN(EventRewriterAshTest); |
1525 }; | 1600 }; |
1526 | 1601 |
1527 TEST_F(EventRewriterAshTest, TopRowKeysAreFunctionKeys) { | 1602 TEST_F(EventRewriterAshTest, TopRowKeysAreFunctionKeys) { |
1528 scoped_ptr<aura::Window> window(CreateTestWindowInShellWithId(1)); | 1603 scoped_ptr<aura::Window> window(CreateTestWindowInShellWithId(1)); |
1529 ash::wm::WindowState* window_state = ash::wm::GetWindowState(window.get()); | 1604 ash::wm::WindowState* window_state = ash::wm::GetWindowState(window.get()); |
1530 window_state->Activate(); | 1605 window_state->Activate(); |
1531 | 1606 |
1532 // Create a simulated keypress of F1 targetted at the window. | 1607 // Create a simulated keypress of F1 targetted at the window. |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1570 device_list.push_back(10); | 1645 device_list.push_back(10); |
1571 ui::TouchFactory::GetInstance()->SetPointerDeviceForTest(device_list); | 1646 ui::TouchFactory::GetInstance()->SetPointerDeviceForTest(device_list); |
1572 | 1647 |
1573 // Remap Control to Alt. | 1648 // Remap Control to Alt. |
1574 TestingPrefServiceSyncable prefs; | 1649 TestingPrefServiceSyncable prefs; |
1575 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 1650 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
1576 IntegerPrefMember control; | 1651 IntegerPrefMember control; |
1577 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); | 1652 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); |
1578 control.SetValue(chromeos::input_method::kAltKey); | 1653 control.SetValue(chromeos::input_method::kAltKey); |
1579 | 1654 |
1580 EventRewriter rewriter; | 1655 EventRewriter rewriter(NULL); |
1581 rewriter.set_pref_service_for_testing(&prefs); | 1656 rewriter.set_pref_service_for_testing(&prefs); |
1582 | 1657 |
1583 // Check that Control + Left Button is converted (via Alt + Left Button) | 1658 // Check that Control + Left Button is converted (via Alt + Left Button) |
1584 // to Right Button. | 1659 // to Right Button. |
1585 ui::ScopedXI2Event xev; | 1660 ui::ScopedXI2Event xev; |
1586 xev.InitGenericButtonEvent(10, | 1661 xev.InitGenericButtonEvent(10, |
1587 ui::ET_MOUSE_PRESSED, | 1662 ui::ET_MOUSE_PRESSED, |
1588 gfx::Point(), | 1663 gfx::Point(), |
1589 ui::EF_LEFT_MOUSE_BUTTON | ui::EF_CONTROL_DOWN); | 1664 ui::EF_LEFT_MOUSE_BUTTON | ui::EF_CONTROL_DOWN); |
1590 ui::MouseEvent press(xev); | 1665 ui::MouseEvent press(xev); |
1591 // Sanity check. | 1666 // Sanity check. |
1592 EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type()); | 1667 EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type()); |
1593 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON | ui::EF_CONTROL_DOWN, press.flags()); | 1668 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON | ui::EF_CONTROL_DOWN, press.flags()); |
1594 int flags = RewriteMouseEvent(&rewriter, press); | 1669 int flags = RewriteMouseEvent(&rewriter, press); |
1595 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & flags); | 1670 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & flags); |
1596 EXPECT_FALSE(ui::EF_CONTROL_DOWN & flags); | 1671 EXPECT_FALSE(ui::EF_CONTROL_DOWN & flags); |
1597 EXPECT_FALSE(ui::EF_ALT_DOWN & flags); | 1672 EXPECT_FALSE(ui::EF_ALT_DOWN & flags); |
1598 } | 1673 } |
1599 | 1674 |
1600 | 1675 |
1601 TEST_F(EventRewriterTest, DontRewriteIfNotRewritten) { | 1676 TEST_F(EventRewriterTest, DontRewriteIfNotRewritten) { |
1677 #if defined(USE_X11) | |
1678 // TODO(kpschoedel): pending changes for crbug.com/360377 | |
1679 // to |chromeos::EventRewriter::RewriteLocatedEvent() | |
1602 std::vector<unsigned int> device_list; | 1680 std::vector<unsigned int> device_list; |
1603 device_list.push_back(10); | 1681 device_list.push_back(10); |
1604 device_list.push_back(11); | 1682 device_list.push_back(11); |
1605 ui::TouchFactory::GetInstance()->SetPointerDeviceForTest(device_list); | 1683 ui::TouchFactory::GetInstance()->SetPointerDeviceForTest(device_list); |
1606 TestingPrefServiceSyncable prefs; | 1684 TestingPrefServiceSyncable prefs; |
1607 EventRewriter rewriter; | 1685 EventRewriter rewriter(NULL); |
1608 rewriter.set_pref_service_for_testing(&prefs); | 1686 rewriter.set_pref_service_for_testing(&prefs); |
1609 const int kLeftAndAltFlag = ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN; | 1687 const int kLeftAndAltFlag = ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN; |
1610 { | 1688 { |
1611 ui::ScopedXI2Event xev; | 1689 ui::ScopedXI2Event xev; |
1612 xev.InitGenericButtonEvent( | 1690 xev.InitGenericButtonEvent( |
1613 10, ui::ET_MOUSE_PRESSED, gfx::Point(), kLeftAndAltFlag); | 1691 10, ui::ET_MOUSE_PRESSED, gfx::Point(), kLeftAndAltFlag); |
1614 ui::MouseEvent press(xev); | 1692 ui::MouseEvent press(xev); |
1615 // Sanity check. | 1693 // Sanity check. |
1616 EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type()); | 1694 EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type()); |
1617 EXPECT_EQ(kLeftAndAltFlag, press.flags()); | 1695 EXPECT_EQ(kLeftAndAltFlag, press.flags()); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1663 EXPECT_TRUE((ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN) & flags); | 1741 EXPECT_TRUE((ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN) & flags); |
1664 } | 1742 } |
1665 { | 1743 { |
1666 ui::ScopedXI2Event xev; | 1744 ui::ScopedXI2Event xev; |
1667 xev.InitGenericButtonEvent( | 1745 xev.InitGenericButtonEvent( |
1668 11, ui::ET_MOUSE_RELEASED, gfx::Point(), kLeftAndAltFlag); | 1746 11, ui::ET_MOUSE_RELEASED, gfx::Point(), kLeftAndAltFlag); |
1669 ui::MouseEvent release(xev); | 1747 ui::MouseEvent release(xev); |
1670 int flags = RewriteMouseEvent(&rewriter, release); | 1748 int flags = RewriteMouseEvent(&rewriter, release); |
1671 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & flags); | 1749 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & flags); |
1672 } | 1750 } |
1751 #endif | |
1752 } | |
1753 | |
1754 TEST_F(EventRewriterAshTest, StickyKeyEventDispatchImpl) { | |
1755 // Test the actual key event dispatch implementation. | |
1756 EventBuffer buffer; | |
1757 TestEventSource source(&buffer); | |
1758 source.AddEventRewriter(rewriter()); | |
1759 sticky_keys_controller()->Enable(true); | |
1760 ScopedVector<ui::Event> events; | |
1761 | |
1762 source.SendActivateStickyKeyPattern(ui::VKEY_CONTROL); | |
1763 buffer.PopEvents(&events); | |
1764 EXPECT_EQ(1u, events.size()); | |
1765 EXPECT_EQ(ui::ET_KEY_PRESSED, events[0]->type()); | |
1766 EXPECT_EQ(ui::VKEY_CONTROL, | |
1767 static_cast<ui::KeyEvent*>(events[0])->key_code()); | |
1768 | |
1769 // Test key press event is correctly modified and modifier release | |
1770 // event is sent. | |
1771 ui::KeyEvent press(ui::ET_KEY_PRESSED, ui::VKEY_C, ui::EF_NONE, false); | |
1772 ui::EventDispatchDetails details = source.Send(&press); | |
1773 buffer.PopEvents(&events); | |
1774 EXPECT_EQ(2u, events.size()); | |
1775 EXPECT_EQ(ui::ET_KEY_PRESSED, events[0]->type()); | |
1776 EXPECT_EQ(ui::VKEY_C, static_cast<ui::KeyEvent*>(events[0])->key_code()); | |
1777 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); | |
1778 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); | |
1779 EXPECT_EQ(ui::VKEY_CONTROL, | |
1780 static_cast<ui::KeyEvent*>(events[1])->key_code()); | |
1781 | |
1782 // Test key release event is not modified. | |
1783 ui::KeyEvent release(ui::ET_KEY_RELEASED, ui::VKEY_C, ui::EF_NONE, false); | |
1784 details = source.Send(&release); | |
1785 ASSERT_FALSE(details.dispatcher_destroyed); | |
1786 buffer.PopEvents(&events); | |
1787 EXPECT_EQ(1u, events.size()); | |
1788 EXPECT_EQ(ui::ET_KEY_RELEASED, events[0]->type()); | |
1789 EXPECT_EQ(ui::VKEY_C, static_cast<ui::KeyEvent*>(events[0])->key_code()); | |
1790 EXPECT_FALSE(events[0]->flags() & ui::EF_CONTROL_DOWN); | |
1791 } | |
1792 | |
1793 TEST_F(EventRewriterAshTest, MouseEventDispatchImpl) { | |
1794 EventBuffer buffer; | |
1795 TestEventSource source(&buffer); | |
1796 source.AddEventRewriter(rewriter()); | |
1797 sticky_keys_controller()->Enable(true); | |
1798 ScopedVector<ui::Event> events; | |
1799 | |
1800 source.SendActivateStickyKeyPattern(ui::VKEY_CONTROL); | |
1801 buffer.PopEvents(&events); | |
1802 | |
1803 // Test mouse press event is correctly modified. | |
1804 gfx::Point location(0, 0); | |
1805 ui::MouseEvent press(ui::ET_MOUSE_PRESSED, | |
1806 location, | |
1807 location, | |
1808 ui::EF_LEFT_MOUSE_BUTTON, | |
1809 ui::EF_LEFT_MOUSE_BUTTON); | |
1810 ui::EventDispatchDetails details = source.Send(&press); | |
1811 ASSERT_FALSE(details.dispatcher_destroyed); | |
1812 buffer.PopEvents(&events); | |
1813 EXPECT_EQ(1u, events.size()); | |
1814 EXPECT_EQ(ui::ET_MOUSE_PRESSED, events[0]->type()); | |
1815 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); | |
1816 | |
1817 // Test mouse release event is correctly modified and modifier release | |
1818 // event is sent. The mouse event should have the correct DIP location. | |
1819 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, | |
1820 location, | |
1821 location, | |
1822 ui::EF_LEFT_MOUSE_BUTTON, | |
1823 ui::EF_LEFT_MOUSE_BUTTON); | |
1824 details = source.Send(&release); | |
1825 ASSERT_FALSE(details.dispatcher_destroyed); | |
1826 buffer.PopEvents(&events); | |
1827 EXPECT_EQ(2u, events.size()); | |
1828 EXPECT_EQ(ui::ET_MOUSE_RELEASED, events[0]->type()); | |
1829 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); | |
1830 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); | |
1831 EXPECT_EQ(ui::VKEY_CONTROL, | |
1832 static_cast<ui::KeyEvent*>(events[1])->key_code()); | |
1833 } | |
1834 | |
1835 TEST_F(EventRewriterAshTest, MouseWheelEventDispatchImpl) { | |
1836 EventBuffer buffer; | |
1837 TestEventSource source(&buffer); | |
1838 source.AddEventRewriter(rewriter()); | |
1839 sticky_keys_controller()->Enable(true); | |
1840 ScopedVector<ui::Event> events; | |
1841 | |
1842 // Test positive mouse wheel event is correctly modified and modifier release | |
1843 // event is sent. | |
1844 source.SendActivateStickyKeyPattern(ui::VKEY_CONTROL); | |
1845 buffer.PopEvents(&events); | |
1846 gfx::Point location(0, 0); | |
1847 ui::MouseEvent mev(ui::ET_MOUSEWHEEL, | |
1848 location, | |
1849 location, | |
1850 ui::EF_LEFT_MOUSE_BUTTON, | |
1851 ui::EF_LEFT_MOUSE_BUTTON); | |
1852 ui::MouseWheelEvent positive(mev, 0, ui::MouseWheelEvent::kWheelDelta); | |
1853 ui::EventDispatchDetails details = source.Send(&positive); | |
1854 ASSERT_FALSE(details.dispatcher_destroyed); | |
1855 buffer.PopEvents(&events); | |
1856 EXPECT_EQ(2u, events.size()); | |
1857 EXPECT_TRUE(events[0]->IsMouseWheelEvent()); | |
1858 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); | |
1859 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); | |
1860 EXPECT_EQ(ui::VKEY_CONTROL, | |
1861 static_cast<ui::KeyEvent*>(events[1])->key_code()); | |
1862 | |
1863 // Test negative mouse wheel event is correctly modified and modifier release | |
1864 // event is sent. | |
1865 source.SendActivateStickyKeyPattern(ui::VKEY_CONTROL); | |
1866 buffer.PopEvents(&events); | |
1867 ui::MouseWheelEvent negative(mev, 0, -ui::MouseWheelEvent::kWheelDelta); | |
1868 details = source.Send(&negative); | |
1869 ASSERT_FALSE(details.dispatcher_destroyed); | |
1870 buffer.PopEvents(&events); | |
1871 EXPECT_EQ(2u, events.size()); | |
1872 EXPECT_TRUE(events[0]->IsMouseWheelEvent()); | |
1873 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); | |
1874 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); | |
1875 EXPECT_EQ(ui::VKEY_CONTROL, | |
1876 static_cast<ui::KeyEvent*>(events[1])->key_code()); | |
1673 } | 1877 } |
1674 | 1878 |
1675 } // namespace chromeos | 1879 } // namespace chromeos |
OLD | NEW |