Chromium Code Reviews| 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 |