| 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 |
| 7 #include <vector> | 14 #include <vector> |
| 8 | 15 |
| 9 #include "ash/shell.h" | |
| 10 #include "ash/sticky_keys/sticky_keys_controller.h" | |
| 11 #include "ash/sticky_keys/sticky_keys_overlay.h" | |
| 12 #include "ash/test/ash_test_base.h" | 16 #include "ash/test/ash_test_base.h" |
| 13 #include "ash/wm/window_state.h" | 17 #include "ash/wm/window_state.h" |
| 14 #include "base/basictypes.h" | 18 #include "base/basictypes.h" |
| 15 #include "base/command_line.h" | 19 #include "base/command_line.h" |
| 16 #include "base/prefs/pref_member.h" | 20 #include "base/prefs/pref_member.h" |
| 17 #include "base/strings/stringprintf.h" | 21 #include "base/strings/stringprintf.h" |
| 18 #include "chrome/browser/chromeos/input_method/input_method_configuration.h" | 22 #include "chrome/browser/chromeos/input_method/input_method_configuration.h" |
| 19 #include "chrome/browser/chromeos/input_method/mock_input_method_manager.h" | 23 #include "chrome/browser/chromeos/input_method/mock_input_method_manager.h" |
| 20 #include "chrome/browser/chromeos/login/users/mock_user_manager.h" | 24 #include "chrome/browser/chromeos/login/users/mock_user_manager.h" |
| 21 #include "chrome/browser/chromeos/login/users/user_manager.h" | 25 #include "chrome/browser/chromeos/login/users/user_manager.h" |
| 22 #include "chrome/browser/chromeos/preferences.h" | 26 #include "chrome/browser/chromeos/preferences.h" |
| 23 #include "chrome/common/pref_names.h" | 27 #include "chrome/common/pref_names.h" |
| 24 #include "chrome/test/base/testing_pref_service_syncable.h" | 28 #include "chrome/test/base/testing_pref_service_syncable.h" |
| 25 #include "chromeos/chromeos_switches.h" | 29 #include "chromeos/chromeos_switches.h" |
| 26 #include "chromeos/ime/fake_ime_keyboard.h" | 30 #include "chromeos/ime/fake_ime_keyboard.h" |
| 27 #include "testing/gtest/include/gtest/gtest.h" | 31 #include "testing/gtest/include/gtest/gtest.h" |
| 28 #include "ui/aura/window.h" | 32 #include "ui/aura/window.h" |
| 29 #include "ui/aura/window_tree_host.h" | |
| 30 #include "ui/events/event.h" | 33 #include "ui/events/event.h" |
| 31 #include "ui/events/event_rewriter.h" | 34 #include "ui/events/event_rewriter.h" |
| 32 #include "ui/events/test/test_event_processor.h" | |
| 33 | |
| 34 #if defined(USE_X11) | |
| 35 #include <X11/keysym.h> | |
| 36 | |
| 37 #include "ui/events/test/events_test_utils_x11.h" | 35 #include "ui/events/test/events_test_utils_x11.h" |
| 38 #include "ui/events/x/touch_factory_x11.h" | 36 #include "ui/events/x/touch_factory_x11.h" |
| 39 #include "ui/gfx/x/x11_types.h" | 37 #include "ui/gfx/x/x11_types.h" |
| 40 #endif | |
| 41 | 38 |
| 42 namespace { | 39 namespace { |
| 43 | 40 |
| 44 // The device id of the test touchpad device. | |
| 45 const unsigned int kTouchPadDeviceId = 1; | |
| 46 | |
| 47 std::string GetExpectedResultAsString(ui::KeyboardCode ui_keycode, | 41 std::string GetExpectedResultAsString(ui::KeyboardCode ui_keycode, |
| 48 int ui_flags, | 42 int ui_flags, |
| 49 ui::EventType ui_type) { | 43 ui::EventType ui_type) { |
| 50 return base::StringPrintf("ui_keycode=0x%X ui_flags=0x%X ui_type=%d", | 44 return base::StringPrintf("ui_keycode=0x%X ui_flags=0x%X ui_type=%d", |
| 51 ui_keycode, | 45 ui_keycode, |
| 52 ui_flags & ~ui::EF_IS_REPEAT, | 46 ui_flags & ~ui::EF_IS_REPEAT, |
| 53 ui_type); | 47 ui_type); |
| 54 } | 48 } |
| 55 | 49 |
| 56 std::string GetKeyEventAsString(const ui::KeyEvent& keyevent) { | 50 std::string GetKeyEventAsString(const ui::KeyEvent& keyevent) { |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 191 #endif | 185 #endif |
| 192 } | 186 } |
| 193 | 187 |
| 194 } // namespace | 188 } // namespace |
| 195 | 189 |
| 196 namespace chromeos { | 190 namespace chromeos { |
| 197 | 191 |
| 198 class EventRewriterTest : public ash::test::AshTestBase { | 192 class EventRewriterTest : public ash::test::AshTestBase { |
| 199 public: | 193 public: |
| 200 EventRewriterTest() | 194 EventRewriterTest() |
| 201 : mock_user_manager_(new chromeos::MockUserManager), | 195 : display_(gfx::GetXDisplay()), |
| 196 mock_user_manager_(new chromeos::MockUserManager), |
| 202 user_manager_enabler_(mock_user_manager_), | 197 user_manager_enabler_(mock_user_manager_), |
| 203 input_method_manager_mock_(NULL) {} | 198 input_method_manager_mock_(NULL) {} |
| 204 virtual ~EventRewriterTest() {} | 199 virtual ~EventRewriterTest() {} |
| 205 | 200 |
| 206 virtual void SetUp() { | 201 virtual void SetUp() { |
| 207 // Mocking user manager because the real one needs to be called on UI thread | 202 // Mocking user manager because the real one needs to be called on UI thread |
| 208 EXPECT_CALL(*mock_user_manager_, IsLoggedInAsGuest()) | 203 EXPECT_CALL(*mock_user_manager_, IsLoggedInAsGuest()) |
| 209 .WillRepeatedly(testing::Return(false)); | 204 .WillRepeatedly(testing::Return(false)); |
| 210 input_method_manager_mock_ = | 205 input_method_manager_mock_ = |
| 211 new chromeos::input_method::MockInputMethodManager; | 206 new chromeos::input_method::MockInputMethodManager; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 225 void TestRewriteNumPadKeys(); | 220 void TestRewriteNumPadKeys(); |
| 226 void TestRewriteNumPadKeysOnAppleKeyboard(); | 221 void TestRewriteNumPadKeysOnAppleKeyboard(); |
| 227 | 222 |
| 228 int RewriteMouseEvent(chromeos::EventRewriter* rewriter, | 223 int RewriteMouseEvent(chromeos::EventRewriter* rewriter, |
| 229 const ui::MouseEvent& event) { | 224 const ui::MouseEvent& event) { |
| 230 int flags = event.flags(); | 225 int flags = event.flags(); |
| 231 rewriter->RewriteLocatedEventForTesting(event, &flags); | 226 rewriter->RewriteLocatedEventForTesting(event, &flags); |
| 232 return flags; | 227 return flags; |
| 233 } | 228 } |
| 234 | 229 |
| 230 Display* display_; |
| 235 chromeos::MockUserManager* mock_user_manager_; // Not owned. | 231 chromeos::MockUserManager* mock_user_manager_; // Not owned. |
| 236 chromeos::ScopedUserManagerEnabler user_manager_enabler_; | 232 chromeos::ScopedUserManagerEnabler user_manager_enabler_; |
| 237 chromeos::input_method::MockInputMethodManager* input_method_manager_mock_; | 233 chromeos::input_method::MockInputMethodManager* input_method_manager_mock_; |
| 238 }; | 234 }; |
| 239 | 235 |
| 240 TEST_F(EventRewriterTest, TestRewriteCommandToControl) { | 236 TEST_F(EventRewriterTest, TestRewriteCommandToControl) { |
| 241 // First, test with a PC keyboard. | 237 // First, test with a PC keyboard. |
| 242 TestingPrefServiceSyncable prefs; | 238 TestingPrefServiceSyncable prefs; |
| 243 EventRewriter rewriter(NULL); | 239 EventRewriter rewriter; |
| 244 rewriter.DeviceAddedForTesting(0, "PC Keyboard"); | 240 rewriter.DeviceAddedForTesting(0, "PC Keyboard"); |
| 245 rewriter.set_last_device_id_for_testing(0); | 241 rewriter.set_last_device_id_for_testing(0); |
| 246 rewriter.set_pref_service_for_testing(&prefs); | 242 rewriter.set_pref_service_for_testing(&prefs); |
| 247 | 243 |
| 248 KeyTestCase pc_keyboard_tests[] = { | 244 KeyTestCase pc_keyboard_tests[] = { |
| 249 // VKEY_A, Alt modifier. | 245 // VKEY_A, Alt modifier. |
| 250 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 246 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
| 251 {ui::VKEY_A, ui::EF_ALT_DOWN}, | 247 {ui::VKEY_A, ui::EF_ALT_DOWN}, |
| 252 {ui::VKEY_A, ui::EF_ALT_DOWN}}, | 248 {ui::VKEY_A, ui::EF_ALT_DOWN}}, |
| 253 | 249 |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 314 | 310 |
| 315 // For crbug.com/133896. | 311 // For crbug.com/133896. |
| 316 TEST_F(EventRewriterTest, TestRewriteCommandToControlWithControlRemapped) { | 312 TEST_F(EventRewriterTest, TestRewriteCommandToControlWithControlRemapped) { |
| 317 // Remap Control to Alt. | 313 // Remap Control to Alt. |
| 318 TestingPrefServiceSyncable prefs; | 314 TestingPrefServiceSyncable prefs; |
| 319 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 315 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
| 320 IntegerPrefMember control; | 316 IntegerPrefMember control; |
| 321 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); | 317 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); |
| 322 control.SetValue(chromeos::input_method::kAltKey); | 318 control.SetValue(chromeos::input_method::kAltKey); |
| 323 | 319 |
| 324 EventRewriter rewriter(NULL); | 320 EventRewriter rewriter; |
| 325 rewriter.set_pref_service_for_testing(&prefs); | 321 rewriter.set_pref_service_for_testing(&prefs); |
| 326 rewriter.DeviceAddedForTesting(0, "PC Keyboard"); | 322 rewriter.DeviceAddedForTesting(0, "PC Keyboard"); |
| 327 rewriter.set_last_device_id_for_testing(0); | 323 rewriter.set_last_device_id_for_testing(0); |
| 328 | 324 |
| 329 KeyTestCase pc_keyboard_tests[] = {// Control should be remapped to Alt. | 325 KeyTestCase pc_keyboard_tests[] = {// Control should be remapped to Alt. |
| 330 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 326 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
| 331 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN}, | 327 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN}, |
| 332 {ui::VKEY_MENU, ui::EF_ALT_DOWN}}, | 328 {ui::VKEY_MENU, ui::EF_ALT_DOWN}}, |
| 333 }; | 329 }; |
| 334 | 330 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 354 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN}}, | 350 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN}}, |
| 355 }; | 351 }; |
| 356 | 352 |
| 357 for (size_t i = 0; i < arraysize(apple_keyboard_tests); ++i) { | 353 for (size_t i = 0; i < arraysize(apple_keyboard_tests); ++i) { |
| 358 CheckKeyTestCase(2000 + i, &rewriter, apple_keyboard_tests[i]); | 354 CheckKeyTestCase(2000 + i, &rewriter, apple_keyboard_tests[i]); |
| 359 } | 355 } |
| 360 } | 356 } |
| 361 | 357 |
| 362 void EventRewriterTest::TestRewriteNumPadKeys() { | 358 void EventRewriterTest::TestRewriteNumPadKeys() { |
| 363 TestingPrefServiceSyncable prefs; | 359 TestingPrefServiceSyncable prefs; |
| 364 EventRewriter rewriter(NULL); | 360 EventRewriter rewriter; |
| 365 rewriter.set_pref_service_for_testing(&prefs); | 361 rewriter.set_pref_service_for_testing(&prefs); |
| 366 | 362 |
| 367 KeyTestCase tests[] = { | 363 KeyTestCase tests[] = { |
| 368 // XK_KP_Insert (= NumPad 0 without Num Lock), no modifier. | 364 // XK_KP_Insert (= NumPad 0 without Num Lock), no modifier. |
| 369 {KeyTestCase::TEST_ALL|KeyTestCase::NUMPAD, ui::ET_KEY_PRESSED, | 365 {KeyTestCase::TEST_ALL|KeyTestCase::NUMPAD, ui::ET_KEY_PRESSED, |
| 370 {ui::VKEY_INSERT, ui::EF_NUMPAD_KEY}, | 366 {ui::VKEY_INSERT, ui::EF_NUMPAD_KEY}, |
| 371 {ui::VKEY_NUMPAD0, ui::EF_NUMPAD_KEY}}, | 367 {ui::VKEY_NUMPAD0, ui::EF_NUMPAD_KEY}}, |
| 372 | 368 |
| 373 // XK_KP_Insert (= NumPad 0 without Num Lock), Alt modifier. | 369 // XK_KP_Insert (= NumPad 0 without Num Lock), Alt modifier. |
| 374 {KeyTestCase::TEST_ALL|KeyTestCase::NUMPAD, ui::ET_KEY_PRESSED, | 370 {KeyTestCase::TEST_ALL|KeyTestCase::NUMPAD, ui::ET_KEY_PRESSED, |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 496 CommandLine::ForCurrentProcess()->AppendSwitchASCII( | 492 CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
| 497 chromeos::switches::kHasChromeOSDiamondKey, ""); | 493 chromeos::switches::kHasChromeOSDiamondKey, ""); |
| 498 | 494 |
| 499 TestRewriteNumPadKeys(); | 495 TestRewriteNumPadKeys(); |
| 500 *CommandLine::ForCurrentProcess() = original_cl; | 496 *CommandLine::ForCurrentProcess() = original_cl; |
| 501 } | 497 } |
| 502 | 498 |
| 503 // Tests if the rewriter can handle a Command + Num Pad event. | 499 // Tests if the rewriter can handle a Command + Num Pad event. |
| 504 void EventRewriterTest::TestRewriteNumPadKeysOnAppleKeyboard() { | 500 void EventRewriterTest::TestRewriteNumPadKeysOnAppleKeyboard() { |
| 505 TestingPrefServiceSyncable prefs; | 501 TestingPrefServiceSyncable prefs; |
| 506 EventRewriter rewriter(NULL); | 502 EventRewriter rewriter; |
| 507 rewriter.DeviceAddedForTesting(0, "Apple Keyboard"); | 503 rewriter.DeviceAddedForTesting(0, "Apple Keyboard"); |
| 508 rewriter.set_last_device_id_for_testing(0); | 504 rewriter.set_last_device_id_for_testing(0); |
| 509 rewriter.set_pref_service_for_testing(&prefs); | 505 rewriter.set_pref_service_for_testing(&prefs); |
| 510 | 506 |
| 511 KeyTestCase tests[] = { | 507 KeyTestCase tests[] = { |
| 512 // XK_KP_End (= NumPad 1 without Num Lock), Win modifier. | 508 // XK_KP_End (= NumPad 1 without Num Lock), Win modifier. |
| 513 // The result should be "Num Pad 1 with Control + Num Lock modifiers". | 509 // The result should be "Num Pad 1 with Control + Num Lock modifiers". |
| 514 {KeyTestCase::TEST_ALL|KeyTestCase::NUMPAD, ui::ET_KEY_PRESSED, | 510 {KeyTestCase::TEST_ALL|KeyTestCase::NUMPAD, ui::ET_KEY_PRESSED, |
| 515 {ui::VKEY_END, ui::EF_COMMAND_DOWN | ui::EF_NUMPAD_KEY}, | 511 {ui::VKEY_END, ui::EF_COMMAND_DOWN | ui::EF_NUMPAD_KEY}, |
| 516 {ui::VKEY_NUMPAD1, ui::EF_CONTROL_DOWN | ui::EF_NUMPAD_KEY}}, | 512 {ui::VKEY_NUMPAD1, ui::EF_CONTROL_DOWN | ui::EF_NUMPAD_KEY}}, |
| (...skipping 21 matching lines...) Expand all Loading... |
| 538 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); | 534 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); |
| 539 CommandLine::ForCurrentProcess()->AppendSwitchASCII( | 535 CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
| 540 chromeos::switches::kHasChromeOSDiamondKey, ""); | 536 chromeos::switches::kHasChromeOSDiamondKey, ""); |
| 541 | 537 |
| 542 TestRewriteNumPadKeysOnAppleKeyboard(); | 538 TestRewriteNumPadKeysOnAppleKeyboard(); |
| 543 *CommandLine::ForCurrentProcess() = original_cl; | 539 *CommandLine::ForCurrentProcess() = original_cl; |
| 544 } | 540 } |
| 545 | 541 |
| 546 TEST_F(EventRewriterTest, TestRewriteModifiersNoRemap) { | 542 TEST_F(EventRewriterTest, TestRewriteModifiersNoRemap) { |
| 547 TestingPrefServiceSyncable prefs; | 543 TestingPrefServiceSyncable prefs; |
| 548 EventRewriter rewriter(NULL); | 544 EventRewriter rewriter; |
| 549 rewriter.set_pref_service_for_testing(&prefs); | 545 rewriter.set_pref_service_for_testing(&prefs); |
| 550 | 546 |
| 551 KeyTestCase tests[] = { | 547 KeyTestCase tests[] = { |
| 552 // Press Search. Confirm the event is not rewritten. | 548 // Press Search. Confirm the event is not rewritten. |
| 553 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 549 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
| 554 {ui::VKEY_LWIN, ui::EF_NONE}, | 550 {ui::VKEY_LWIN, ui::EF_NONE}, |
| 555 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN}}, | 551 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN}}, |
| 556 | 552 |
| 557 // Press left Control. Confirm the event is not rewritten. | 553 // Press left Control. Confirm the event is not rewritten. |
| 558 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 554 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
| (...skipping 22 matching lines...) Expand all Loading... |
| 581 {ui::VKEY_LWIN, ui::EF_NONE}}, | 577 {ui::VKEY_LWIN, ui::EF_NONE}}, |
| 582 }; | 578 }; |
| 583 | 579 |
| 584 for (size_t i = 0; i < arraysize(tests); ++i) { | 580 for (size_t i = 0; i < arraysize(tests); ++i) { |
| 585 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); | 581 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); |
| 586 } | 582 } |
| 587 } | 583 } |
| 588 | 584 |
| 589 TEST_F(EventRewriterTest, TestRewriteModifiersNoRemapMultipleKeys) { | 585 TEST_F(EventRewriterTest, TestRewriteModifiersNoRemapMultipleKeys) { |
| 590 TestingPrefServiceSyncable prefs; | 586 TestingPrefServiceSyncable prefs; |
| 591 EventRewriter rewriter(NULL); | 587 EventRewriter rewriter; |
| 592 rewriter.set_pref_service_for_testing(&prefs); | 588 rewriter.set_pref_service_for_testing(&prefs); |
| 593 | 589 |
| 594 KeyTestCase tests[] = { | 590 KeyTestCase tests[] = { |
| 595 // Press Alt with Shift. Confirm the event is not rewritten. | 591 // Press Alt with Shift. Confirm the event is not rewritten. |
| 596 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 592 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
| 597 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}, | 593 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}, |
| 598 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}}, | 594 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}}, |
| 599 | 595 |
| 600 // Press Search with Caps Lock mask. Confirm the event is not rewritten. | 596 // Press Search with Caps Lock mask. Confirm the event is not rewritten. |
| 601 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 597 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
| (...skipping 22 matching lines...) Expand all Loading... |
| 624 // Disable Search and Control keys. | 620 // Disable Search and Control keys. |
| 625 TestingPrefServiceSyncable prefs; | 621 TestingPrefServiceSyncable prefs; |
| 626 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 622 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
| 627 IntegerPrefMember search; | 623 IntegerPrefMember search; |
| 628 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); | 624 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); |
| 629 search.SetValue(chromeos::input_method::kVoidKey); | 625 search.SetValue(chromeos::input_method::kVoidKey); |
| 630 IntegerPrefMember control; | 626 IntegerPrefMember control; |
| 631 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); | 627 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); |
| 632 control.SetValue(chromeos::input_method::kVoidKey); | 628 control.SetValue(chromeos::input_method::kVoidKey); |
| 633 | 629 |
| 634 EventRewriter rewriter(NULL); | 630 EventRewriter rewriter; |
| 635 rewriter.set_pref_service_for_testing(&prefs); | 631 rewriter.set_pref_service_for_testing(&prefs); |
| 636 | 632 |
| 637 KeyTestCase disabled_modifier_tests[] = { | 633 KeyTestCase disabled_modifier_tests[] = { |
| 638 // Press Alt with Shift. This key press shouldn't be affected by the | 634 // Press Alt with Shift. This key press shouldn't be affected by the |
| 639 // pref. Confirm the event is not rewritten. | 635 // pref. Confirm the event is not rewritten. |
| 640 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 636 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
| 641 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}, | 637 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}, |
| 642 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}}, | 638 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}}, |
| 643 | 639 |
| 644 // Press Search. Confirm the event is now VKEY_UNKNOWN. | 640 // Press Search. Confirm the event is now VKEY_UNKNOWN. |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 699 } | 695 } |
| 700 | 696 |
| 701 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToControl) { | 697 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToControl) { |
| 702 // Remap Search to Control. | 698 // Remap Search to Control. |
| 703 TestingPrefServiceSyncable prefs; | 699 TestingPrefServiceSyncable prefs; |
| 704 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 700 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
| 705 IntegerPrefMember search; | 701 IntegerPrefMember search; |
| 706 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); | 702 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); |
| 707 search.SetValue(chromeos::input_method::kControlKey); | 703 search.SetValue(chromeos::input_method::kControlKey); |
| 708 | 704 |
| 709 EventRewriter rewriter(NULL); | 705 EventRewriter rewriter; |
| 710 rewriter.set_pref_service_for_testing(&prefs); | 706 rewriter.set_pref_service_for_testing(&prefs); |
| 711 | 707 |
| 712 KeyTestCase s_tests[] = { | 708 KeyTestCase s_tests[] = { |
| 713 // Press Search. Confirm the event is now VKEY_CONTROL. | 709 // Press Search. Confirm the event is now VKEY_CONTROL. |
| 714 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 710 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
| 715 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN}, | 711 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN}, |
| 716 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN}}, | 712 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN}}, |
| 717 }; | 713 }; |
| 718 | 714 |
| 719 for (size_t i = 0; i < arraysize(s_tests); ++i) { | 715 for (size_t i = 0; i < arraysize(s_tests); ++i) { |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 763 } | 759 } |
| 764 | 760 |
| 765 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToEscape) { | 761 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToEscape) { |
| 766 // Remap Search to ESC. | 762 // Remap Search to ESC. |
| 767 TestingPrefServiceSyncable prefs; | 763 TestingPrefServiceSyncable prefs; |
| 768 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 764 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
| 769 IntegerPrefMember search; | 765 IntegerPrefMember search; |
| 770 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); | 766 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); |
| 771 search.SetValue(chromeos::input_method::kEscapeKey); | 767 search.SetValue(chromeos::input_method::kEscapeKey); |
| 772 | 768 |
| 773 EventRewriter rewriter(NULL); | 769 EventRewriter rewriter; |
| 774 rewriter.set_pref_service_for_testing(&prefs); | 770 rewriter.set_pref_service_for_testing(&prefs); |
| 775 | 771 |
| 776 KeyTestCase tests[] = {// Press Search. Confirm the event is now VKEY_ESCAPE. | 772 KeyTestCase tests[] = {// Press Search. Confirm the event is now VKEY_ESCAPE. |
| 777 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 773 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
| 778 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN}, | 774 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN}, |
| 779 {ui::VKEY_ESCAPE, ui::EF_NONE}}, | 775 {ui::VKEY_ESCAPE, ui::EF_NONE}}, |
| 780 }; | 776 }; |
| 781 | 777 |
| 782 for (size_t i = 0; i < arraysize(tests); ++i) { | 778 for (size_t i = 0; i < arraysize(tests); ++i) { |
| 783 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); | 779 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); |
| 784 } | 780 } |
| 785 } | 781 } |
| 786 | 782 |
| 787 TEST_F(EventRewriterTest, TestRewriteModifiersRemapMany) { | 783 TEST_F(EventRewriterTest, TestRewriteModifiersRemapMany) { |
| 788 // Remap Search to Alt. | 784 // Remap Search to Alt. |
| 789 TestingPrefServiceSyncable prefs; | 785 TestingPrefServiceSyncable prefs; |
| 790 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 786 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
| 791 IntegerPrefMember search; | 787 IntegerPrefMember search; |
| 792 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); | 788 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); |
| 793 search.SetValue(chromeos::input_method::kAltKey); | 789 search.SetValue(chromeos::input_method::kAltKey); |
| 794 | 790 |
| 795 EventRewriter rewriter(NULL); | 791 EventRewriter rewriter; |
| 796 rewriter.set_pref_service_for_testing(&prefs); | 792 rewriter.set_pref_service_for_testing(&prefs); |
| 797 | 793 |
| 798 KeyTestCase s2a_tests[] = { | 794 KeyTestCase s2a_tests[] = { |
| 799 // Press Search. Confirm the event is now VKEY_MENU. | 795 // Press Search. Confirm the event is now VKEY_MENU. |
| 800 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 796 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
| 801 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN}, | 797 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN}, |
| 802 {ui::VKEY_MENU, ui::EF_ALT_DOWN}}, | 798 {ui::VKEY_MENU, ui::EF_ALT_DOWN}}, |
| 803 }; | 799 }; |
| 804 | 800 |
| 805 for (size_t i = 0; i < arraysize(s2a_tests); ++i) { | 801 for (size_t i = 0; i < arraysize(s2a_tests); ++i) { |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 862 | 858 |
| 863 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToCapsLock) { | 859 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToCapsLock) { |
| 864 // Remap Search to Caps Lock. | 860 // Remap Search to Caps Lock. |
| 865 TestingPrefServiceSyncable prefs; | 861 TestingPrefServiceSyncable prefs; |
| 866 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 862 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
| 867 IntegerPrefMember search; | 863 IntegerPrefMember search; |
| 868 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); | 864 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); |
| 869 search.SetValue(chromeos::input_method::kCapsLockKey); | 865 search.SetValue(chromeos::input_method::kCapsLockKey); |
| 870 | 866 |
| 871 chromeos::input_method::FakeImeKeyboard ime_keyboard; | 867 chromeos::input_method::FakeImeKeyboard ime_keyboard; |
| 872 EventRewriter rewriter(NULL); | 868 EventRewriter rewriter; |
| 873 rewriter.set_pref_service_for_testing(&prefs); | 869 rewriter.set_pref_service_for_testing(&prefs); |
| 874 rewriter.set_ime_keyboard_for_testing(&ime_keyboard); | 870 rewriter.set_ime_keyboard_for_testing(&ime_keyboard); |
| 875 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); | 871 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); |
| 876 | 872 |
| 877 // Press Search. | 873 // Press Search. |
| 878 EXPECT_EQ( | 874 EXPECT_EQ( |
| 879 GetExpectedResultAsString(ui::VKEY_CAPITAL, | 875 GetExpectedResultAsString(ui::VKEY_CAPITAL, |
| 880 ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN, | 876 ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN, |
| 881 ui::ET_KEY_PRESSED), | 877 ui::ET_KEY_PRESSED), |
| 882 GetRewrittenEventAsString( | 878 GetRewrittenEventAsString( |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 932 GetRewrittenEventAsString( | 928 GetRewrittenEventAsString( |
| 933 &rewriter, ui::VKEY_CAPITAL, ui::EF_NONE, ui::ET_KEY_RELEASED)); | 929 &rewriter, ui::VKEY_CAPITAL, ui::EF_NONE, ui::ET_KEY_RELEASED)); |
| 934 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); | 930 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); |
| 935 } | 931 } |
| 936 | 932 |
| 937 TEST_F(EventRewriterTest, TestRewriteCapsLock) { | 933 TEST_F(EventRewriterTest, TestRewriteCapsLock) { |
| 938 TestingPrefServiceSyncable prefs; | 934 TestingPrefServiceSyncable prefs; |
| 939 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 935 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
| 940 | 936 |
| 941 chromeos::input_method::FakeImeKeyboard ime_keyboard; | 937 chromeos::input_method::FakeImeKeyboard ime_keyboard; |
| 942 EventRewriter rewriter(NULL); | 938 EventRewriter rewriter; |
| 943 rewriter.set_pref_service_for_testing(&prefs); | 939 rewriter.set_pref_service_for_testing(&prefs); |
| 944 rewriter.set_ime_keyboard_for_testing(&ime_keyboard); | 940 rewriter.set_ime_keyboard_for_testing(&ime_keyboard); |
| 945 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); | 941 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); |
| 946 | 942 |
| 947 // On Chrome OS, CapsLock is mapped to F16 with Mod3Mask. | 943 // On Chrome OS, CapsLock is mapped to F16 with Mod3Mask. |
| 948 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, | 944 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, |
| 949 ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN, | 945 ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN, |
| 950 ui::ET_KEY_PRESSED), | 946 ui::ET_KEY_PRESSED), |
| 951 GetRewrittenEventAsString( | 947 GetRewrittenEventAsString( |
| 952 &rewriter, ui::VKEY_F16, ui::EF_MOD3_DOWN, ui::ET_KEY_PRESSED)); | 948 &rewriter, ui::VKEY_F16, ui::EF_MOD3_DOWN, ui::ET_KEY_PRESSED)); |
| 953 EXPECT_TRUE(ime_keyboard.caps_lock_is_enabled_); | 949 EXPECT_TRUE(ime_keyboard.caps_lock_is_enabled_); |
| 954 } | 950 } |
| 955 | 951 |
| 956 TEST_F(EventRewriterTest, TestRewriteDiamondKey) { | 952 TEST_F(EventRewriterTest, TestRewriteDiamondKey) { |
| 957 TestingPrefServiceSyncable prefs; | 953 TestingPrefServiceSyncable prefs; |
| 958 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 954 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
| 959 | 955 |
| 960 chromeos::input_method::FakeImeKeyboard ime_keyboard; | 956 chromeos::input_method::FakeImeKeyboard ime_keyboard; |
| 961 EventRewriter rewriter(NULL); | 957 EventRewriter rewriter; |
| 962 rewriter.set_pref_service_for_testing(&prefs); | 958 rewriter.set_pref_service_for_testing(&prefs); |
| 963 rewriter.set_ime_keyboard_for_testing(&ime_keyboard); | 959 rewriter.set_ime_keyboard_for_testing(&ime_keyboard); |
| 964 | 960 |
| 965 KeyTestCase tests[] = { | 961 KeyTestCase tests[] = { |
| 966 // F15 should work as Ctrl when --has-chromeos-diamond-key is not | 962 // F15 should work as Ctrl when --has-chromeos-diamond-key is not |
| 967 // specified. | 963 // specified. |
| 968 {KeyTestCase::TEST_VKEY, | 964 {KeyTestCase::TEST_VKEY, |
| 969 ui::ET_KEY_PRESSED, | 965 ui::ET_KEY_PRESSED, |
| 970 {ui::VKEY_F15, ui::EF_NONE}, | 966 {ui::VKEY_F15, ui::EF_NONE}, |
| 971 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN}}, | 967 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN}}, |
| (...skipping 12 matching lines...) Expand all Loading... |
| 984 } | 980 } |
| 985 TEST_F(EventRewriterTest, TestRewriteDiamondKeyWithFlag) { | 981 TEST_F(EventRewriterTest, TestRewriteDiamondKeyWithFlag) { |
| 986 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); | 982 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); |
| 987 CommandLine::ForCurrentProcess()->AppendSwitchASCII( | 983 CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
| 988 chromeos::switches::kHasChromeOSDiamondKey, ""); | 984 chromeos::switches::kHasChromeOSDiamondKey, ""); |
| 989 | 985 |
| 990 TestingPrefServiceSyncable prefs; | 986 TestingPrefServiceSyncable prefs; |
| 991 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 987 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
| 992 | 988 |
| 993 chromeos::input_method::FakeImeKeyboard ime_keyboard; | 989 chromeos::input_method::FakeImeKeyboard ime_keyboard; |
| 994 EventRewriter rewriter(NULL); | 990 EventRewriter rewriter; |
| 995 rewriter.set_pref_service_for_testing(&prefs); | 991 rewriter.set_pref_service_for_testing(&prefs); |
| 996 rewriter.set_ime_keyboard_for_testing(&ime_keyboard); | 992 rewriter.set_ime_keyboard_for_testing(&ime_keyboard); |
| 997 | 993 |
| 998 // By default, F15 should work as Control. | 994 // By default, F15 should work as Control. |
| 999 EXPECT_EQ(GetExpectedResultAsString( | 995 EXPECT_EQ(GetExpectedResultAsString( |
| 1000 ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN, ui::ET_KEY_PRESSED), | 996 ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN, ui::ET_KEY_PRESSED), |
| 1001 GetRewrittenEventAsString( | 997 GetRewrittenEventAsString( |
| 1002 &rewriter, ui::VKEY_F15, ui::EF_NONE, ui::ET_KEY_PRESSED)); | 998 &rewriter, ui::VKEY_F15, ui::EF_NONE, ui::ET_KEY_PRESSED)); |
| 1003 | 999 |
| 1004 IntegerPrefMember diamond; | 1000 IntegerPrefMember diamond; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1036 } | 1032 } |
| 1037 | 1033 |
| 1038 TEST_F(EventRewriterTest, TestRewriteCapsLockToControl) { | 1034 TEST_F(EventRewriterTest, TestRewriteCapsLockToControl) { |
| 1039 // Remap CapsLock to Control. | 1035 // Remap CapsLock to Control. |
| 1040 TestingPrefServiceSyncable prefs; | 1036 TestingPrefServiceSyncable prefs; |
| 1041 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 1037 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
| 1042 IntegerPrefMember control; | 1038 IntegerPrefMember control; |
| 1043 control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs); | 1039 control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs); |
| 1044 control.SetValue(chromeos::input_method::kControlKey); | 1040 control.SetValue(chromeos::input_method::kControlKey); |
| 1045 | 1041 |
| 1046 EventRewriter rewriter(NULL); | 1042 EventRewriter rewriter; |
| 1047 rewriter.set_pref_service_for_testing(&prefs); | 1043 rewriter.set_pref_service_for_testing(&prefs); |
| 1048 | 1044 |
| 1049 KeyTestCase tests[] = { | 1045 KeyTestCase tests[] = { |
| 1050 // Press CapsLock+a. Confirm that Mod3Mask is rewritten to ControlMask. | 1046 // Press CapsLock+a. Confirm that Mod3Mask is rewritten to ControlMask. |
| 1051 // On Chrome OS, CapsLock works as a Mod3 modifier. | 1047 // On Chrome OS, CapsLock works as a Mod3 modifier. |
| 1052 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 1048 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
| 1053 {ui::VKEY_A, ui::EF_MOD3_DOWN}, | 1049 {ui::VKEY_A, ui::EF_MOD3_DOWN}, |
| 1054 {ui::VKEY_A, ui::EF_CONTROL_DOWN}}, | 1050 {ui::VKEY_A, ui::EF_CONTROL_DOWN}}, |
| 1055 | 1051 |
| 1056 // Press Control+CapsLock+a. Confirm that Mod3Mask is rewritten to | 1052 // Press Control+CapsLock+a. Confirm that Mod3Mask is rewritten to |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1072 } | 1068 } |
| 1073 | 1069 |
| 1074 TEST_F(EventRewriterTest, TestRewriteCapsLockMod3InUse) { | 1070 TEST_F(EventRewriterTest, TestRewriteCapsLockMod3InUse) { |
| 1075 // Remap CapsLock to Control. | 1071 // Remap CapsLock to Control. |
| 1076 TestingPrefServiceSyncable prefs; | 1072 TestingPrefServiceSyncable prefs; |
| 1077 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 1073 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
| 1078 IntegerPrefMember control; | 1074 IntegerPrefMember control; |
| 1079 control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs); | 1075 control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs); |
| 1080 control.SetValue(chromeos::input_method::kControlKey); | 1076 control.SetValue(chromeos::input_method::kControlKey); |
| 1081 | 1077 |
| 1082 EventRewriter rewriter(NULL); | 1078 EventRewriter rewriter; |
| 1083 rewriter.set_pref_service_for_testing(&prefs); | 1079 rewriter.set_pref_service_for_testing(&prefs); |
| 1084 input_method_manager_mock_->set_mod3_used(true); | 1080 input_method_manager_mock_->set_mod3_used(true); |
| 1085 | 1081 |
| 1086 // Press CapsLock+a. Confirm that Mod3Mask is NOT rewritten to ControlMask | 1082 // Press CapsLock+a. Confirm that Mod3Mask is NOT rewritten to ControlMask |
| 1087 // when Mod3Mask is already in use by the current XKB layout. | 1083 // when Mod3Mask is already in use by the current XKB layout. |
| 1088 EXPECT_EQ( | 1084 EXPECT_EQ( |
| 1089 GetExpectedResultAsString(ui::VKEY_A, ui::EF_NONE, ui::ET_KEY_PRESSED), | 1085 GetExpectedResultAsString(ui::VKEY_A, ui::EF_NONE, ui::ET_KEY_PRESSED), |
| 1090 GetRewrittenEventAsString( | 1086 GetRewrittenEventAsString( |
| 1091 &rewriter, ui::VKEY_A, ui::EF_NONE, ui::ET_KEY_PRESSED)); | 1087 &rewriter, ui::VKEY_A, ui::EF_NONE, ui::ET_KEY_PRESSED)); |
| 1092 | 1088 |
| 1093 input_method_manager_mock_->set_mod3_used(false); | 1089 input_method_manager_mock_->set_mod3_used(false); |
| 1094 } | 1090 } |
| 1095 | 1091 |
| 1096 TEST_F(EventRewriterTest, TestRewriteExtendedKeys) { | 1092 TEST_F(EventRewriterTest, TestRewriteExtendedKeys) { |
| 1097 TestingPrefServiceSyncable prefs; | 1093 TestingPrefServiceSyncable prefs; |
| 1098 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 1094 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
| 1099 EventRewriter rewriter(NULL); | 1095 EventRewriter rewriter; |
| 1100 rewriter.DeviceAddedForTesting(0, "PC Keyboard"); | 1096 rewriter.DeviceAddedForTesting(0, "PC Keyboard"); |
| 1101 rewriter.set_last_device_id_for_testing(0); | 1097 rewriter.set_last_device_id_for_testing(0); |
| 1102 rewriter.set_pref_service_for_testing(&prefs); | 1098 rewriter.set_pref_service_for_testing(&prefs); |
| 1103 | 1099 |
| 1104 KeyTestCase tests[] = { | 1100 KeyTestCase tests[] = { |
| 1105 // Alt+Backspace -> Delete | 1101 // Alt+Backspace -> Delete |
| 1106 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 1102 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
| 1107 {ui::VKEY_BACK, ui::EF_ALT_DOWN}, | 1103 {ui::VKEY_BACK, ui::EF_ALT_DOWN}, |
| 1108 {ui::VKEY_DELETE, ui::EF_NONE}}, | 1104 {ui::VKEY_DELETE, ui::EF_NONE}}, |
| 1109 // Control+Alt+Backspace -> Control+Delete | 1105 // Control+Alt+Backspace -> Control+Delete |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1198 {ui::VKEY_INSERT, ui::EF_CONTROL_DOWN}}}; | 1194 {ui::VKEY_INSERT, ui::EF_CONTROL_DOWN}}}; |
| 1199 | 1195 |
| 1200 for (size_t i = 0; i < arraysize(tests); ++i) { | 1196 for (size_t i = 0; i < arraysize(tests); ++i) { |
| 1201 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); | 1197 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); |
| 1202 } | 1198 } |
| 1203 } | 1199 } |
| 1204 | 1200 |
| 1205 TEST_F(EventRewriterTest, TestRewriteFunctionKeys) { | 1201 TEST_F(EventRewriterTest, TestRewriteFunctionKeys) { |
| 1206 TestingPrefServiceSyncable prefs; | 1202 TestingPrefServiceSyncable prefs; |
| 1207 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 1203 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
| 1208 EventRewriter rewriter(NULL); | 1204 EventRewriter rewriter; |
| 1209 rewriter.set_pref_service_for_testing(&prefs); | 1205 rewriter.set_pref_service_for_testing(&prefs); |
| 1210 | 1206 |
| 1211 FunctionKeyTestCase tests[] = { | 1207 FunctionKeyTestCase tests[] = { |
| 1212 // F1 -> Back | 1208 // F1 -> Back |
| 1213 {ui::ET_KEY_PRESSED, | 1209 {ui::ET_KEY_PRESSED, |
| 1214 {ui::VKEY_F1, ui::EF_NONE}, | 1210 {ui::VKEY_F1, ui::EF_NONE}, |
| 1215 {ui::VKEY_BROWSER_BACK, ui::EF_NONE}, | 1211 {ui::VKEY_BROWSER_BACK, ui::EF_NONE}, |
| 1216 {ui::VKEY_BROWSER_BACK, ui::EF_FUNCTION_KEY}}, | 1212 {ui::VKEY_BROWSER_BACK, ui::EF_FUNCTION_KEY}}, |
| 1217 {ui::ET_KEY_PRESSED, | 1213 {ui::ET_KEY_PRESSED, |
| 1218 {ui::VKEY_F1, ui::EF_CONTROL_DOWN}, | 1214 {ui::VKEY_F1, ui::EF_CONTROL_DOWN}, |
| (...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1526 TEST_F(EventRewriterTest, TestRewriteExtendedKeysWithSearchRemapped) { | 1522 TEST_F(EventRewriterTest, TestRewriteExtendedKeysWithSearchRemapped) { |
| 1527 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); | 1523 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); |
| 1528 | 1524 |
| 1529 // Remap Search to Control. | 1525 // Remap Search to Control. |
| 1530 TestingPrefServiceSyncable prefs; | 1526 TestingPrefServiceSyncable prefs; |
| 1531 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 1527 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
| 1532 IntegerPrefMember search; | 1528 IntegerPrefMember search; |
| 1533 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); | 1529 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); |
| 1534 search.SetValue(chromeos::input_method::kControlKey); | 1530 search.SetValue(chromeos::input_method::kControlKey); |
| 1535 | 1531 |
| 1536 EventRewriter rewriter(NULL); | 1532 EventRewriter rewriter; |
| 1537 rewriter.set_pref_service_for_testing(&prefs); | 1533 rewriter.set_pref_service_for_testing(&prefs); |
| 1538 | 1534 |
| 1539 CommandLine::ForCurrentProcess()->AppendSwitchASCII( | 1535 CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
| 1540 chromeos::switches::kHasChromeOSKeyboard, ""); | 1536 chromeos::switches::kHasChromeOSKeyboard, ""); |
| 1541 | 1537 |
| 1542 KeyTestCase tests[] = { | 1538 KeyTestCase tests[] = { |
| 1543 // Alt+Search+Down -> End | 1539 // Alt+Search+Down -> End |
| 1544 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 1540 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
| 1545 {ui::VKEY_DOWN, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN}, | 1541 {ui::VKEY_DOWN, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN}, |
| 1546 {ui::VKEY_END, ui::EF_NONE}}, | 1542 {ui::VKEY_END, ui::EF_NONE}}, |
| 1547 | 1543 |
| 1548 // Shift+Alt+Search+Down -> Shift+End | 1544 // Shift+Alt+Search+Down -> Shift+End |
| 1549 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, | 1545 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, |
| 1550 {ui::VKEY_DOWN, | 1546 {ui::VKEY_DOWN, |
| 1551 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN}, | 1547 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN}, |
| 1552 {ui::VKEY_END, ui::EF_SHIFT_DOWN}}, | 1548 {ui::VKEY_END, ui::EF_SHIFT_DOWN}}, |
| 1553 }; | 1549 }; |
| 1554 | 1550 |
| 1555 for (size_t i = 0; i < arraysize(tests); ++i) { | 1551 for (size_t i = 0; i < arraysize(tests); ++i) { |
| 1556 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); | 1552 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); |
| 1557 } | 1553 } |
| 1558 | 1554 |
| 1559 *CommandLine::ForCurrentProcess() = original_cl; | 1555 *CommandLine::ForCurrentProcess() = original_cl; |
| 1560 } | 1556 } |
| 1561 | 1557 |
| 1562 TEST_F(EventRewriterTest, TestRewriteKeyEventSentByXSendEvent) { | 1558 TEST_F(EventRewriterTest, TestRewriteKeyEventSentByXSendEvent) { |
| 1563 #if defined(USE_X11) | |
| 1564 // TODO(kpschoedel): pending alternative to xevent.xany.send_event | |
| 1565 // Remap Control to Alt. | 1559 // Remap Control to Alt. |
| 1566 TestingPrefServiceSyncable prefs; | 1560 TestingPrefServiceSyncable prefs; |
| 1567 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 1561 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
| 1568 IntegerPrefMember control; | 1562 IntegerPrefMember control; |
| 1569 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); | 1563 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); |
| 1570 control.SetValue(chromeos::input_method::kAltKey); | 1564 control.SetValue(chromeos::input_method::kAltKey); |
| 1571 | 1565 |
| 1572 EventRewriter rewriter(NULL); | 1566 EventRewriter rewriter; |
| 1573 rewriter.set_pref_service_for_testing(&prefs); | 1567 rewriter.set_pref_service_for_testing(&prefs); |
| 1574 | 1568 |
| 1575 // Send left control press. | 1569 // Send left control press. |
| 1576 std::string rewritten_event; | 1570 std::string rewritten_event; |
| 1577 { | 1571 { |
| 1578 ui::ScopedXI2Event xev; | 1572 ui::ScopedXI2Event xev; |
| 1579 xev.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 0); | 1573 xev.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 0); |
| 1580 XEvent* xevent = xev; | 1574 XEvent* xevent = xev; |
| 1581 xevent->xkey.keycode = XKeysymToKeycode(gfx::GetXDisplay(), XK_Control_L); | 1575 xevent->xkey.keycode = XKeysymToKeycode(gfx::GetXDisplay(), XK_Control_L); |
| 1582 xevent->xkey.send_event = True; // XSendEvent() always does this. | 1576 xevent->xkey.send_event = True; // XSendEvent() always does this. |
| 1583 ui::KeyEvent keyevent(xev, false /* is_char */); | 1577 ui::KeyEvent keyevent(xev, false /* is_char */); |
| 1584 scoped_ptr<ui::Event> new_event; | 1578 scoped_ptr<ui::Event> new_event; |
| 1585 // Control should NOT be remapped to Alt if send_event | 1579 // Control should NOT be remapped to Alt if send_event |
| 1586 // flag in the event is True. | 1580 // flag in the event is True. |
| 1587 EXPECT_EQ(ui::EVENT_REWRITE_CONTINUE, | 1581 EXPECT_EQ(ui::EVENT_REWRITE_CONTINUE, |
| 1588 rewriter.RewriteEvent(keyevent, &new_event)); | 1582 rewriter.RewriteEvent(keyevent, &new_event)); |
| 1589 EXPECT_FALSE(new_event); | 1583 EXPECT_FALSE(new_event); |
| 1590 } | 1584 } |
| 1591 #endif | |
| 1592 } | 1585 } |
| 1593 | 1586 |
| 1594 TEST_F(EventRewriterTest, TestRewriteNonNativeEvent) { | 1587 TEST_F(EventRewriterTest, TestRewriteNonNativeEvent) { |
| 1595 // Remap Control to Alt. | 1588 // Remap Control to Alt. |
| 1596 TestingPrefServiceSyncable prefs; | 1589 TestingPrefServiceSyncable prefs; |
| 1597 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 1590 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
| 1598 IntegerPrefMember control; | 1591 IntegerPrefMember control; |
| 1599 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); | 1592 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); |
| 1600 control.SetValue(chromeos::input_method::kAltKey); | 1593 control.SetValue(chromeos::input_method::kAltKey); |
| 1601 | 1594 |
| 1602 EventRewriter rewriter(NULL); | 1595 EventRewriter rewriter; |
| 1603 rewriter.set_pref_service_for_testing(&prefs); | 1596 rewriter.set_pref_service_for_testing(&prefs); |
| 1604 | 1597 |
| 1605 const int kTouchId = 2; | 1598 const int kTouchId = 2; |
| 1606 gfx::Point location(0, 0); | 1599 gfx::Point location(0, 0); |
| 1607 ui::TouchEvent press( | 1600 ui::TouchEvent press( |
| 1608 ui::ET_TOUCH_PRESSED, location, kTouchId, base::TimeDelta()); | 1601 ui::ET_TOUCH_PRESSED, location, kTouchId, base::TimeDelta()); |
| 1609 press.set_flags(ui::EF_CONTROL_DOWN); | 1602 press.set_flags(ui::EF_CONTROL_DOWN); |
| 1610 | 1603 |
| 1611 scoped_ptr<ui::Event> new_event; | 1604 scoped_ptr<ui::Event> new_event; |
| 1612 rewriter.RewriteEvent(press, &new_event); | 1605 rewriter.RewriteEvent(press, &new_event); |
| 1613 EXPECT_TRUE(new_event); | 1606 EXPECT_TRUE(new_event); |
| 1614 // Control should be remapped to Alt. | 1607 // Control should be remapped to Alt. |
| 1615 EXPECT_EQ(ui::EF_ALT_DOWN, | 1608 EXPECT_EQ(ui::EF_ALT_DOWN, |
| 1616 new_event->flags() & (ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN)); | 1609 new_event->flags() & (ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN)); |
| 1617 } | 1610 } |
| 1618 | 1611 |
| 1619 // Keeps a buffer of handled events. | |
| 1620 class EventBuffer : public ui::test::TestEventProcessor { | |
| 1621 public: | |
| 1622 EventBuffer() {} | |
| 1623 virtual ~EventBuffer() {} | |
| 1624 | |
| 1625 void PopEvents(ScopedVector<ui::Event>* events) { | |
| 1626 events->clear(); | |
| 1627 events->swap(events_); | |
| 1628 } | |
| 1629 | |
| 1630 private: | |
| 1631 // ui::EventProcessor overrides: | |
| 1632 virtual ui::EventDispatchDetails OnEventFromSource( | |
| 1633 ui::Event* event) OVERRIDE { | |
| 1634 if (event->IsKeyEvent()) { | |
| 1635 events_.push_back(new ui::KeyEvent(*static_cast<ui::KeyEvent*>(event))); | |
| 1636 } else if (event->IsMouseWheelEvent()) { | |
| 1637 events_.push_back( | |
| 1638 new ui::MouseWheelEvent(*static_cast<ui::MouseWheelEvent*>(event))); | |
| 1639 } else if (event->IsMouseEvent()) { | |
| 1640 events_.push_back( | |
| 1641 new ui::MouseEvent(*static_cast<ui::MouseEvent*>(event))); | |
| 1642 } | |
| 1643 return ui::EventDispatchDetails(); | |
| 1644 } | |
| 1645 | |
| 1646 ScopedVector<ui::Event> events_; | |
| 1647 | |
| 1648 DISALLOW_COPY_AND_ASSIGN(EventBuffer); | |
| 1649 }; | |
| 1650 | |
| 1651 // Trivial EventSource that does nothing but send events. | |
| 1652 class TestEventSource : public ui::EventSource { | |
| 1653 public: | |
| 1654 explicit TestEventSource(ui::EventProcessor* processor) | |
| 1655 : processor_(processor) {} | |
| 1656 virtual ui::EventProcessor* GetEventProcessor() OVERRIDE { | |
| 1657 return processor_; | |
| 1658 } | |
| 1659 ui::EventDispatchDetails Send(ui::Event* event) { | |
| 1660 return SendEventToProcessor(event); | |
| 1661 } | |
| 1662 | |
| 1663 private: | |
| 1664 ui::EventProcessor* processor_; | |
| 1665 }; | |
| 1666 | |
| 1667 // Tests of event rewriting that depend on the Ash window manager. | 1612 // Tests of event rewriting that depend on the Ash window manager. |
| 1668 class EventRewriterAshTest : public ash::test::AshTestBase { | 1613 class EventRewriterAshTest : public ash::test::AshTestBase { |
| 1669 public: | 1614 public: |
| 1670 EventRewriterAshTest() | 1615 EventRewriterAshTest() |
| 1671 : source_(&buffer_), | 1616 : mock_user_manager_(new chromeos::MockUserManager), |
| 1672 mock_user_manager_(new chromeos::MockUserManager), | |
| 1673 user_manager_enabler_(mock_user_manager_) {} | 1617 user_manager_enabler_(mock_user_manager_) {} |
| 1674 virtual ~EventRewriterAshTest() {} | 1618 virtual ~EventRewriterAshTest() {} |
| 1675 | 1619 |
| 1676 bool RewriteFunctionKeys(const ui::Event& event, | 1620 bool RewriteFunctionKeys(const ui::Event& event, |
| 1677 scoped_ptr<ui::Event>* rewritten_event) { | 1621 scoped_ptr<ui::Event>* rewritten_event) { |
| 1678 return rewriter_->RewriteEvent(event, rewritten_event); | 1622 return rewriter_->RewriteEvent(event, rewritten_event); |
| 1679 } | 1623 } |
| 1680 | 1624 |
| 1681 ui::EventDispatchDetails Send(ui::Event* event) { | |
| 1682 return source_.Send(event); | |
| 1683 } | |
| 1684 | |
| 1685 void SendKeyEvent(ui::EventType type, ui::KeyboardCode key_code) { | |
| 1686 ui::KeyEvent press(type, key_code, ui::EF_NONE, false); | |
| 1687 ui::EventDispatchDetails details = Send(&press); | |
| 1688 CHECK(!details.dispatcher_destroyed); | |
| 1689 } | |
| 1690 | |
| 1691 void SendActivateStickyKeyPattern(ui::KeyboardCode key_code) { | |
| 1692 SendKeyEvent(ui::ET_KEY_PRESSED, key_code); | |
| 1693 SendKeyEvent(ui::ET_KEY_RELEASED, key_code); | |
| 1694 } | |
| 1695 | |
| 1696 protected: | 1625 protected: |
| 1697 TestingPrefServiceSyncable* prefs() { return &prefs_; } | |
| 1698 | |
| 1699 void PopEvents(ScopedVector<ui::Event>* events) { | |
| 1700 buffer_.PopEvents(events); | |
| 1701 } | |
| 1702 | |
| 1703 virtual void SetUp() OVERRIDE { | 1626 virtual void SetUp() OVERRIDE { |
| 1704 AshTestBase::SetUp(); | 1627 AshTestBase::SetUp(); |
| 1705 sticky_keys_controller_ = | 1628 rewriter_.reset(new EventRewriter()); |
| 1706 ash::Shell::GetInstance()->sticky_keys_controller(); | |
| 1707 rewriter_.reset(new EventRewriter(sticky_keys_controller_)); | |
| 1708 chromeos::Preferences::RegisterProfilePrefs(prefs_.registry()); | 1629 chromeos::Preferences::RegisterProfilePrefs(prefs_.registry()); |
| 1709 rewriter_->set_pref_service_for_testing(&prefs_); | 1630 rewriter_->set_pref_service_for_testing(&prefs_); |
| 1710 #if defined(USE_X11) | |
| 1711 ui::SetUpTouchPadForTest(kTouchPadDeviceId); | |
| 1712 #endif | |
| 1713 source_.AddEventRewriter(rewriter_.get()); | |
| 1714 sticky_keys_controller_->Enable(true); | |
| 1715 } | 1631 } |
| 1716 | 1632 |
| 1717 virtual void TearDown() OVERRIDE { | 1633 virtual void TearDown() OVERRIDE { |
| 1718 rewriter_.reset(); | 1634 rewriter_.reset(); |
| 1719 AshTestBase::TearDown(); | 1635 AshTestBase::TearDown(); |
| 1720 } | 1636 } |
| 1721 | 1637 |
| 1722 protected: | 1638 TestingPrefServiceSyncable prefs_; |
| 1723 ash::StickyKeysController* sticky_keys_controller_; | |
| 1724 | 1639 |
| 1725 private: | 1640 private: |
| 1726 scoped_ptr<EventRewriter> rewriter_; | 1641 scoped_ptr<EventRewriter> rewriter_; |
| 1727 | 1642 |
| 1728 EventBuffer buffer_; | |
| 1729 TestEventSource source_; | |
| 1730 | |
| 1731 chromeos::MockUserManager* mock_user_manager_; // Not owned. | 1643 chromeos::MockUserManager* mock_user_manager_; // Not owned. |
| 1732 chromeos::ScopedUserManagerEnabler user_manager_enabler_; | 1644 chromeos::ScopedUserManagerEnabler user_manager_enabler_; |
| 1733 TestingPrefServiceSyncable prefs_; | |
| 1734 | 1645 |
| 1735 DISALLOW_COPY_AND_ASSIGN(EventRewriterAshTest); | 1646 DISALLOW_COPY_AND_ASSIGN(EventRewriterAshTest); |
| 1736 }; | 1647 }; |
| 1737 | 1648 |
| 1738 TEST_F(EventRewriterAshTest, TopRowKeysAreFunctionKeys) { | 1649 TEST_F(EventRewriterAshTest, TopRowKeysAreFunctionKeys) { |
| 1739 scoped_ptr<aura::Window> window(CreateTestWindowInShellWithId(1)); | 1650 scoped_ptr<aura::Window> window(CreateTestWindowInShellWithId(1)); |
| 1740 ash::wm::WindowState* window_state = ash::wm::GetWindowState(window.get()); | 1651 ash::wm::WindowState* window_state = ash::wm::GetWindowState(window.get()); |
| 1741 window_state->Activate(); | 1652 window_state->Activate(); |
| 1742 ScopedVector<ui::Event> events; | |
| 1743 | 1653 |
| 1744 // Create a simulated keypress of F1 targetted at the window. | 1654 // Create a simulated keypress of F1 targetted at the window. |
| 1745 ui::KeyEvent press_f1(ui::ET_KEY_PRESSED, ui::VKEY_F1, 0, false); | 1655 ui::KeyEvent press_f1(ui::ET_KEY_PRESSED, ui::VKEY_F1, 0, false); |
| 1746 | 1656 |
| 1747 // Simulate an apps v2 window that has requested top row keys as function | 1657 // Simulate an apps v2 window that has requested top row keys as function |
| 1748 // keys. The event should not be rewritten. | 1658 // keys. The event should not be rewritten. |
| 1749 window_state->set_top_row_keys_are_function_keys(true); | 1659 window_state->set_top_row_keys_are_function_keys(true); |
| 1750 ui::EventDispatchDetails details = Send(&press_f1); | 1660 scoped_ptr<ui::Event> rewritten_event; |
| 1751 ASSERT_FALSE(details.dispatcher_destroyed); | 1661 ASSERT_FALSE(RewriteFunctionKeys(press_f1, &rewritten_event)); |
| 1752 PopEvents(&events); | 1662 ASSERT_FALSE(rewritten_event); |
| 1753 EXPECT_EQ(1u, events.size()); | |
| 1754 EXPECT_EQ( | 1663 EXPECT_EQ( |
| 1755 GetExpectedResultAsString(ui::VKEY_F1, ui::EF_NONE, ui::ET_KEY_PRESSED), | 1664 GetExpectedResultAsString(ui::VKEY_F1, ui::EF_NONE, ui::ET_KEY_PRESSED), |
| 1756 GetKeyEventAsString(*static_cast<ui::KeyEvent*>(events[0]))); | 1665 GetKeyEventAsString(press_f1)); |
| 1757 | 1666 |
| 1758 // The event should also not be rewritten if the send-function-keys pref is | 1667 // The event should also not be rewritten if the send-function-keys pref is |
| 1759 // additionally set, for both apps v2 and regular windows. | 1668 // additionally set, for both apps v2 and regular windows. |
| 1760 BooleanPrefMember send_function_keys_pref; | 1669 BooleanPrefMember send_function_keys_pref; |
| 1761 send_function_keys_pref.Init(prefs::kLanguageSendFunctionKeys, prefs()); | 1670 send_function_keys_pref.Init(prefs::kLanguageSendFunctionKeys, &prefs_); |
| 1762 send_function_keys_pref.SetValue(true); | 1671 send_function_keys_pref.SetValue(true); |
| 1763 window_state->set_top_row_keys_are_function_keys(false); | 1672 window_state->set_top_row_keys_are_function_keys(false); |
| 1764 details = Send(&press_f1); | 1673 ASSERT_FALSE(RewriteFunctionKeys(press_f1, &rewritten_event)); |
| 1765 ASSERT_FALSE(details.dispatcher_destroyed); | 1674 ASSERT_FALSE(rewritten_event); |
| 1766 PopEvents(&events); | |
| 1767 EXPECT_EQ(1u, events.size()); | |
| 1768 EXPECT_EQ( | 1675 EXPECT_EQ( |
| 1769 GetExpectedResultAsString(ui::VKEY_F1, ui::EF_NONE, ui::ET_KEY_PRESSED), | 1676 GetExpectedResultAsString(ui::VKEY_F1, ui::EF_NONE, ui::ET_KEY_PRESSED), |
| 1770 GetKeyEventAsString(*static_cast<ui::KeyEvent*>(events[0]))); | 1677 GetKeyEventAsString(press_f1)); |
| 1771 | 1678 |
| 1772 // If the pref isn't set when an event is sent to a regular window, F1 is | 1679 // If the pref isn't set when an event is sent to a regular window, F1 is |
| 1773 // rewritten to the back key. | 1680 // rewritten to the back key. |
| 1774 send_function_keys_pref.SetValue(false); | 1681 send_function_keys_pref.SetValue(false); |
| 1775 details = Send(&press_f1); | 1682 ASSERT_TRUE(RewriteFunctionKeys(press_f1, &rewritten_event)); |
| 1776 ASSERT_FALSE(details.dispatcher_destroyed); | 1683 ASSERT_TRUE(rewritten_event); |
| 1777 PopEvents(&events); | |
| 1778 EXPECT_EQ(1u, events.size()); | |
| 1779 EXPECT_EQ(GetExpectedResultAsString( | 1684 EXPECT_EQ(GetExpectedResultAsString( |
| 1780 ui::VKEY_BROWSER_BACK, ui::EF_NONE, ui::ET_KEY_PRESSED), | 1685 ui::VKEY_BROWSER_BACK, ui::EF_NONE, ui::ET_KEY_PRESSED), |
| 1781 GetKeyEventAsString(*static_cast<ui::KeyEvent*>(events[0]))); | 1686 GetKeyEventAsString( |
| 1687 *static_cast<const ui::KeyEvent*>(rewritten_event.get()))); |
| 1782 } | 1688 } |
| 1783 | 1689 |
| 1784 TEST_F(EventRewriterTest, TestRewrittenModifierClick) { | 1690 TEST_F(EventRewriterTest, TestRewrittenModifierClick) { |
| 1785 std::vector<unsigned int> device_list; | 1691 std::vector<unsigned int> device_list; |
| 1786 device_list.push_back(10); | 1692 device_list.push_back(10); |
| 1787 ui::TouchFactory::GetInstance()->SetPointerDeviceForTest(device_list); | 1693 ui::TouchFactory::GetInstance()->SetPointerDeviceForTest(device_list); |
| 1788 | 1694 |
| 1789 // Remap Control to Alt. | 1695 // Remap Control to Alt. |
| 1790 TestingPrefServiceSyncable prefs; | 1696 TestingPrefServiceSyncable prefs; |
| 1791 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); | 1697 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); |
| 1792 IntegerPrefMember control; | 1698 IntegerPrefMember control; |
| 1793 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); | 1699 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); |
| 1794 control.SetValue(chromeos::input_method::kAltKey); | 1700 control.SetValue(chromeos::input_method::kAltKey); |
| 1795 | 1701 |
| 1796 EventRewriter rewriter(NULL); | 1702 EventRewriter rewriter; |
| 1797 rewriter.set_pref_service_for_testing(&prefs); | 1703 rewriter.set_pref_service_for_testing(&prefs); |
| 1798 | 1704 |
| 1799 // Check that Control + Left Button is converted (via Alt + Left Button) | 1705 // Check that Control + Left Button is converted (via Alt + Left Button) |
| 1800 // to Right Button. | 1706 // to Right Button. |
| 1801 ui::ScopedXI2Event xev; | 1707 ui::ScopedXI2Event xev; |
| 1802 xev.InitGenericButtonEvent(10, | 1708 xev.InitGenericButtonEvent(10, |
| 1803 ui::ET_MOUSE_PRESSED, | 1709 ui::ET_MOUSE_PRESSED, |
| 1804 gfx::Point(), | 1710 gfx::Point(), |
| 1805 ui::EF_LEFT_MOUSE_BUTTON | ui::EF_CONTROL_DOWN); | 1711 ui::EF_LEFT_MOUSE_BUTTON | ui::EF_CONTROL_DOWN); |
| 1806 ui::MouseEvent press(xev); | 1712 ui::MouseEvent press(xev); |
| 1807 // Sanity check. | 1713 // Sanity check. |
| 1808 EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type()); | 1714 EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type()); |
| 1809 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON | ui::EF_CONTROL_DOWN, press.flags()); | 1715 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON | ui::EF_CONTROL_DOWN, press.flags()); |
| 1810 int flags = RewriteMouseEvent(&rewriter, press); | 1716 int flags = RewriteMouseEvent(&rewriter, press); |
| 1811 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & flags); | 1717 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & flags); |
| 1812 EXPECT_FALSE(ui::EF_CONTROL_DOWN & flags); | 1718 EXPECT_FALSE(ui::EF_CONTROL_DOWN & flags); |
| 1813 EXPECT_FALSE(ui::EF_ALT_DOWN & flags); | 1719 EXPECT_FALSE(ui::EF_ALT_DOWN & flags); |
| 1814 } | 1720 } |
| 1815 | 1721 |
| 1816 | 1722 |
| 1817 TEST_F(EventRewriterTest, DontRewriteIfNotRewritten) { | 1723 TEST_F(EventRewriterTest, DontRewriteIfNotRewritten) { |
| 1818 #if defined(USE_X11) | |
| 1819 // TODO(kpschoedel): pending changes for crbug.com/360377 | |
| 1820 // to |chromeos::EventRewriter::RewriteLocatedEvent() | |
| 1821 std::vector<unsigned int> device_list; | 1724 std::vector<unsigned int> device_list; |
| 1822 device_list.push_back(10); | 1725 device_list.push_back(10); |
| 1823 device_list.push_back(11); | 1726 device_list.push_back(11); |
| 1824 ui::TouchFactory::GetInstance()->SetPointerDeviceForTest(device_list); | 1727 ui::TouchFactory::GetInstance()->SetPointerDeviceForTest(device_list); |
| 1825 TestingPrefServiceSyncable prefs; | 1728 TestingPrefServiceSyncable prefs; |
| 1826 EventRewriter rewriter(NULL); | 1729 EventRewriter rewriter; |
| 1827 rewriter.set_pref_service_for_testing(&prefs); | 1730 rewriter.set_pref_service_for_testing(&prefs); |
| 1828 const int kLeftAndAltFlag = ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN; | 1731 const int kLeftAndAltFlag = ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN; |
| 1829 { | 1732 { |
| 1830 ui::ScopedXI2Event xev; | 1733 ui::ScopedXI2Event xev; |
| 1831 xev.InitGenericButtonEvent( | 1734 xev.InitGenericButtonEvent( |
| 1832 10, ui::ET_MOUSE_PRESSED, gfx::Point(), kLeftAndAltFlag); | 1735 10, ui::ET_MOUSE_PRESSED, gfx::Point(), kLeftAndAltFlag); |
| 1833 ui::MouseEvent press(xev); | 1736 ui::MouseEvent press(xev); |
| 1834 // Sanity check. | 1737 // Sanity check. |
| 1835 EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type()); | 1738 EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type()); |
| 1836 EXPECT_EQ(kLeftAndAltFlag, press.flags()); | 1739 EXPECT_EQ(kLeftAndAltFlag, press.flags()); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1882 EXPECT_TRUE((ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN) & flags); | 1785 EXPECT_TRUE((ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN) & flags); |
| 1883 } | 1786 } |
| 1884 { | 1787 { |
| 1885 ui::ScopedXI2Event xev; | 1788 ui::ScopedXI2Event xev; |
| 1886 xev.InitGenericButtonEvent( | 1789 xev.InitGenericButtonEvent( |
| 1887 11, ui::ET_MOUSE_RELEASED, gfx::Point(), kLeftAndAltFlag); | 1790 11, ui::ET_MOUSE_RELEASED, gfx::Point(), kLeftAndAltFlag); |
| 1888 ui::MouseEvent release(xev); | 1791 ui::MouseEvent release(xev); |
| 1889 int flags = RewriteMouseEvent(&rewriter, release); | 1792 int flags = RewriteMouseEvent(&rewriter, release); |
| 1890 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & flags); | 1793 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & flags); |
| 1891 } | 1794 } |
| 1892 #endif | |
| 1893 } | |
| 1894 | |
| 1895 TEST_F(EventRewriterAshTest, StickyKeyEventDispatchImpl) { | |
| 1896 // Test the actual key event dispatch implementation. | |
| 1897 ScopedVector<ui::Event> events; | |
| 1898 | |
| 1899 SendActivateStickyKeyPattern(ui::VKEY_CONTROL); | |
| 1900 PopEvents(&events); | |
| 1901 EXPECT_EQ(1u, events.size()); | |
| 1902 EXPECT_EQ(ui::ET_KEY_PRESSED, events[0]->type()); | |
| 1903 EXPECT_EQ(ui::VKEY_CONTROL, | |
| 1904 static_cast<ui::KeyEvent*>(events[0])->key_code()); | |
| 1905 | |
| 1906 // Test key press event is correctly modified and modifier release | |
| 1907 // event is sent. | |
| 1908 ui::KeyEvent press(ui::ET_KEY_PRESSED, ui::VKEY_C, ui::EF_NONE, false); | |
| 1909 ui::EventDispatchDetails details = Send(&press); | |
| 1910 PopEvents(&events); | |
| 1911 EXPECT_EQ(2u, events.size()); | |
| 1912 EXPECT_EQ(ui::ET_KEY_PRESSED, events[0]->type()); | |
| 1913 EXPECT_EQ(ui::VKEY_C, static_cast<ui::KeyEvent*>(events[0])->key_code()); | |
| 1914 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); | |
| 1915 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); | |
| 1916 EXPECT_EQ(ui::VKEY_CONTROL, | |
| 1917 static_cast<ui::KeyEvent*>(events[1])->key_code()); | |
| 1918 | |
| 1919 // Test key release event is not modified. | |
| 1920 ui::KeyEvent release(ui::ET_KEY_RELEASED, ui::VKEY_C, ui::EF_NONE, false); | |
| 1921 details = Send(&release); | |
| 1922 ASSERT_FALSE(details.dispatcher_destroyed); | |
| 1923 PopEvents(&events); | |
| 1924 EXPECT_EQ(1u, events.size()); | |
| 1925 EXPECT_EQ(ui::ET_KEY_RELEASED, events[0]->type()); | |
| 1926 EXPECT_EQ(ui::VKEY_C, static_cast<ui::KeyEvent*>(events[0])->key_code()); | |
| 1927 EXPECT_FALSE(events[0]->flags() & ui::EF_CONTROL_DOWN); | |
| 1928 } | |
| 1929 | |
| 1930 TEST_F(EventRewriterAshTest, MouseEventDispatchImpl) { | |
| 1931 ScopedVector<ui::Event> events; | |
| 1932 | |
| 1933 SendActivateStickyKeyPattern(ui::VKEY_CONTROL); | |
| 1934 PopEvents(&events); | |
| 1935 | |
| 1936 // Test mouse press event is correctly modified. | |
| 1937 gfx::Point location(0, 0); | |
| 1938 ui::MouseEvent press(ui::ET_MOUSE_PRESSED, | |
| 1939 location, | |
| 1940 location, | |
| 1941 ui::EF_LEFT_MOUSE_BUTTON, | |
| 1942 ui::EF_LEFT_MOUSE_BUTTON); | |
| 1943 ui::EventDispatchDetails details = Send(&press); | |
| 1944 ASSERT_FALSE(details.dispatcher_destroyed); | |
| 1945 PopEvents(&events); | |
| 1946 EXPECT_EQ(1u, events.size()); | |
| 1947 EXPECT_EQ(ui::ET_MOUSE_PRESSED, events[0]->type()); | |
| 1948 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); | |
| 1949 | |
| 1950 // Test mouse release event is correctly modified and modifier release | |
| 1951 // event is sent. The mouse event should have the correct DIP location. | |
| 1952 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, | |
| 1953 location, | |
| 1954 location, | |
| 1955 ui::EF_LEFT_MOUSE_BUTTON, | |
| 1956 ui::EF_LEFT_MOUSE_BUTTON); | |
| 1957 details = Send(&release); | |
| 1958 ASSERT_FALSE(details.dispatcher_destroyed); | |
| 1959 PopEvents(&events); | |
| 1960 EXPECT_EQ(2u, events.size()); | |
| 1961 EXPECT_EQ(ui::ET_MOUSE_RELEASED, events[0]->type()); | |
| 1962 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); | |
| 1963 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); | |
| 1964 EXPECT_EQ(ui::VKEY_CONTROL, | |
| 1965 static_cast<ui::KeyEvent*>(events[1])->key_code()); | |
| 1966 } | |
| 1967 | |
| 1968 TEST_F(EventRewriterAshTest, MouseWheelEventDispatchImpl) { | |
| 1969 ScopedVector<ui::Event> events; | |
| 1970 | |
| 1971 // Test positive mouse wheel event is correctly modified and modifier release | |
| 1972 // event is sent. | |
| 1973 SendActivateStickyKeyPattern(ui::VKEY_CONTROL); | |
| 1974 PopEvents(&events); | |
| 1975 gfx::Point location(0, 0); | |
| 1976 ui::MouseEvent mev(ui::ET_MOUSEWHEEL, | |
| 1977 location, | |
| 1978 location, | |
| 1979 ui::EF_LEFT_MOUSE_BUTTON, | |
| 1980 ui::EF_LEFT_MOUSE_BUTTON); | |
| 1981 ui::MouseWheelEvent positive(mev, 0, ui::MouseWheelEvent::kWheelDelta); | |
| 1982 ui::EventDispatchDetails details = Send(&positive); | |
| 1983 ASSERT_FALSE(details.dispatcher_destroyed); | |
| 1984 PopEvents(&events); | |
| 1985 EXPECT_EQ(2u, events.size()); | |
| 1986 EXPECT_TRUE(events[0]->IsMouseWheelEvent()); | |
| 1987 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); | |
| 1988 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); | |
| 1989 EXPECT_EQ(ui::VKEY_CONTROL, | |
| 1990 static_cast<ui::KeyEvent*>(events[1])->key_code()); | |
| 1991 | |
| 1992 // Test negative mouse wheel event is correctly modified and modifier release | |
| 1993 // event is sent. | |
| 1994 SendActivateStickyKeyPattern(ui::VKEY_CONTROL); | |
| 1995 PopEvents(&events); | |
| 1996 ui::MouseWheelEvent negative(mev, 0, -ui::MouseWheelEvent::kWheelDelta); | |
| 1997 details = Send(&negative); | |
| 1998 ASSERT_FALSE(details.dispatcher_destroyed); | |
| 1999 PopEvents(&events); | |
| 2000 EXPECT_EQ(2u, events.size()); | |
| 2001 EXPECT_TRUE(events[0]->IsMouseWheelEvent()); | |
| 2002 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN); | |
| 2003 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type()); | |
| 2004 EXPECT_EQ(ui::VKEY_CONTROL, | |
| 2005 static_cast<ui::KeyEvent*>(events[1])->key_code()); | |
| 2006 } | |
| 2007 | |
| 2008 class StickyKeysOverlayTest : public EventRewriterAshTest { | |
| 2009 public: | |
| 2010 StickyKeysOverlayTest() : overlay_(NULL) {} | |
| 2011 | |
| 2012 virtual ~StickyKeysOverlayTest() {} | |
| 2013 | |
| 2014 virtual void SetUp() OVERRIDE { | |
| 2015 EventRewriterAshTest::SetUp(); | |
| 2016 overlay_ = sticky_keys_controller_->GetOverlayForTest(); | |
| 2017 ASSERT_TRUE(overlay_); | |
| 2018 } | |
| 2019 | |
| 2020 ash::StickyKeysOverlay* overlay_; | |
| 2021 }; | |
| 2022 | |
| 2023 TEST_F(StickyKeysOverlayTest, OneModifierEnabled) { | |
| 2024 EXPECT_FALSE(overlay_->is_visible()); | |
| 2025 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, | |
| 2026 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); | |
| 2027 | |
| 2028 // Pressing modifier key should show overlay. | |
| 2029 SendActivateStickyKeyPattern(ui::VKEY_CONTROL); | |
| 2030 EXPECT_TRUE(overlay_->is_visible()); | |
| 2031 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED, | |
| 2032 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); | |
| 2033 | |
| 2034 // Pressing a normal key should hide overlay. | |
| 2035 SendActivateStickyKeyPattern(ui::VKEY_T); | |
| 2036 EXPECT_FALSE(overlay_->is_visible()); | |
| 2037 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, | |
| 2038 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); | |
| 2039 } | |
| 2040 | |
| 2041 TEST_F(StickyKeysOverlayTest, TwoModifiersEnabled) { | |
| 2042 EXPECT_FALSE(overlay_->is_visible()); | |
| 2043 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, | |
| 2044 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); | |
| 2045 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, | |
| 2046 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); | |
| 2047 | |
| 2048 // Pressing two modifiers should show overlay. | |
| 2049 SendActivateStickyKeyPattern(ui::VKEY_SHIFT); | |
| 2050 SendActivateStickyKeyPattern(ui::VKEY_CONTROL); | |
| 2051 EXPECT_TRUE(overlay_->is_visible()); | |
| 2052 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED, | |
| 2053 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); | |
| 2054 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED, | |
| 2055 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); | |
| 2056 | |
| 2057 // Pressing a normal key should hide overlay. | |
| 2058 SendActivateStickyKeyPattern(ui::VKEY_N); | |
| 2059 EXPECT_FALSE(overlay_->is_visible()); | |
| 2060 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, | |
| 2061 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); | |
| 2062 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, | |
| 2063 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); | |
| 2064 } | |
| 2065 | |
| 2066 TEST_F(StickyKeysOverlayTest, LockedModifier) { | |
| 2067 EXPECT_FALSE(overlay_->is_visible()); | |
| 2068 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, | |
| 2069 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN)); | |
| 2070 | |
| 2071 // Pressing a modifier key twice should lock modifier and show overlay. | |
| 2072 SendActivateStickyKeyPattern(ui::VKEY_LMENU); | |
| 2073 SendActivateStickyKeyPattern(ui::VKEY_LMENU); | |
| 2074 EXPECT_TRUE(overlay_->is_visible()); | |
| 2075 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED, | |
| 2076 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN)); | |
| 2077 | |
| 2078 // Pressing a normal key should not hide overlay. | |
| 2079 SendActivateStickyKeyPattern(ui::VKEY_D); | |
| 2080 EXPECT_TRUE(overlay_->is_visible()); | |
| 2081 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED, | |
| 2082 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN)); | |
| 2083 } | |
| 2084 | |
| 2085 TEST_F(StickyKeysOverlayTest, LockedAndNormalModifier) { | |
| 2086 EXPECT_FALSE(overlay_->is_visible()); | |
| 2087 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, | |
| 2088 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); | |
| 2089 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, | |
| 2090 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); | |
| 2091 | |
| 2092 // Pressing a modifier key twice should lock modifier and show overlay. | |
| 2093 SendActivateStickyKeyPattern(ui::VKEY_CONTROL); | |
| 2094 SendActivateStickyKeyPattern(ui::VKEY_CONTROL); | |
| 2095 EXPECT_TRUE(overlay_->is_visible()); | |
| 2096 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED, | |
| 2097 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); | |
| 2098 | |
| 2099 // Pressing another modifier key should still show overlay. | |
| 2100 SendActivateStickyKeyPattern(ui::VKEY_SHIFT); | |
| 2101 EXPECT_TRUE(overlay_->is_visible()); | |
| 2102 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED, | |
| 2103 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); | |
| 2104 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED, | |
| 2105 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); | |
| 2106 | |
| 2107 // Pressing a normal key should not hide overlay but disable normal modifier. | |
| 2108 SendActivateStickyKeyPattern(ui::VKEY_D); | |
| 2109 EXPECT_TRUE(overlay_->is_visible()); | |
| 2110 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED, | |
| 2111 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); | |
| 2112 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, | |
| 2113 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); | |
| 2114 } | |
| 2115 | |
| 2116 TEST_F(StickyKeysOverlayTest, ModifiersDisabled) { | |
| 2117 EXPECT_FALSE(overlay_->is_visible()); | |
| 2118 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, | |
| 2119 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); | |
| 2120 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, | |
| 2121 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); | |
| 2122 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, | |
| 2123 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN)); | |
| 2124 | |
| 2125 // Enable modifiers. | |
| 2126 SendActivateStickyKeyPattern(ui::VKEY_CONTROL); | |
| 2127 SendActivateStickyKeyPattern(ui::VKEY_SHIFT); | |
| 2128 SendActivateStickyKeyPattern(ui::VKEY_SHIFT); | |
| 2129 SendActivateStickyKeyPattern(ui::VKEY_LMENU); | |
| 2130 | |
| 2131 EXPECT_TRUE(overlay_->is_visible()); | |
| 2132 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED, | |
| 2133 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); | |
| 2134 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED, | |
| 2135 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); | |
| 2136 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED, | |
| 2137 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN)); | |
| 2138 | |
| 2139 // Disable modifiers and overlay should be hidden. | |
| 2140 SendActivateStickyKeyPattern(ui::VKEY_CONTROL); | |
| 2141 SendActivateStickyKeyPattern(ui::VKEY_CONTROL); | |
| 2142 SendActivateStickyKeyPattern(ui::VKEY_SHIFT); | |
| 2143 SendActivateStickyKeyPattern(ui::VKEY_LMENU); | |
| 2144 SendActivateStickyKeyPattern(ui::VKEY_LMENU); | |
| 2145 | |
| 2146 EXPECT_FALSE(overlay_->is_visible()); | |
| 2147 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, | |
| 2148 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN)); | |
| 2149 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, | |
| 2150 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN)); | |
| 2151 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED, | |
| 2152 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN)); | |
| 2153 } | |
| 2154 | |
| 2155 TEST_F(StickyKeysOverlayTest, ModifierVisibility) { | |
| 2156 // All but AltGr and Mod3 should initially be visible. | |
| 2157 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_CONTROL_DOWN)); | |
| 2158 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_SHIFT_DOWN)); | |
| 2159 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_ALT_DOWN)); | |
| 2160 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN)); | |
| 2161 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN)); | |
| 2162 | |
| 2163 // Turn all modifiers on. | |
| 2164 sticky_keys_controller_->SetModifiersEnabled(true, true); | |
| 2165 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_CONTROL_DOWN)); | |
| 2166 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_SHIFT_DOWN)); | |
| 2167 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_ALT_DOWN)); | |
| 2168 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN)); | |
| 2169 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN)); | |
| 2170 | |
| 2171 // Turn off Mod3. | |
| 2172 sticky_keys_controller_->SetModifiersEnabled(false, true); | |
| 2173 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN)); | |
| 2174 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN)); | |
| 2175 | |
| 2176 // Turn off AltGr. | |
| 2177 sticky_keys_controller_->SetModifiersEnabled(true, false); | |
| 2178 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN)); | |
| 2179 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN)); | |
| 2180 | |
| 2181 // Turn off AltGr and Mod3. | |
| 2182 sticky_keys_controller_->SetModifiersEnabled(false, false); | |
| 2183 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN)); | |
| 2184 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN)); | |
| 2185 } | 1795 } |
| 2186 | 1796 |
| 2187 } // namespace chromeos | 1797 } // namespace chromeos |
| OLD | NEW |