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