Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "base/basictypes.h" | 5 #include "base/basictypes.h" |
| 6 #include "chrome/browser/prefs/pref_member.h" | |
| 6 #include "chrome/browser/ui/views/ash/key_rewriter.h" | 7 #include "chrome/browser/ui/views/ash/key_rewriter.h" |
| 8 #include "chrome/common/pref_names.h" | |
| 9 #include "chrome/test/base/testing_pref_service.h" | |
| 7 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
| 8 #include "ui/aura/event.h" | 11 #include "ui/aura/event.h" |
| 9 | 12 |
| 10 #if defined(OS_CHROMEOS) | 13 #if defined(OS_CHROMEOS) |
| 11 #include <X11/keysym.h> | 14 #include <X11/keysym.h> |
| 12 #include <X11/Xlib.h> | 15 #include <X11/Xlib.h> |
| 13 | 16 |
| 17 #include "chrome/browser/chromeos/input_method/mock_xkeyboard.h" | |
| 18 #include "chrome/browser/chromeos/preferences.h" | |
| 14 #include "ui/base/x/x11_util.h" | 19 #include "ui/base/x/x11_util.h" |
| 15 | 20 |
| 16 namespace { | 21 namespace { |
| 17 | 22 |
| 18 void InitXKeyEvent(ui::KeyboardCode ui_keycode, | 23 void InitXKeyEvent(ui::KeyboardCode ui_keycode, |
| 19 int ui_flags, | 24 int ui_flags, |
| 20 unsigned int x_keycode, | 25 unsigned int x_keycode, |
| 21 unsigned int x_state, | 26 unsigned int x_state, |
| 22 XEvent* event) { | 27 XEvent* event) { |
| 23 ui::InitXKeyEventForTesting(ui::ET_KEY_PRESSED, | 28 ui::InitXKeyEventForTesting(ui::ET_KEY_PRESSED, |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 92 const unsigned int kKeycodeSuperL = | 97 const unsigned int kKeycodeSuperL = |
| 93 XKeysymToKeycode(ui::GetXDisplay(), XK_Super_L); | 98 XKeysymToKeycode(ui::GetXDisplay(), XK_Super_L); |
| 94 const unsigned int kKeycodeSuperR = | 99 const unsigned int kKeycodeSuperR = |
| 95 XKeysymToKeycode(ui::GetXDisplay(), XK_Super_R); | 100 XKeysymToKeycode(ui::GetXDisplay(), XK_Super_R); |
| 96 const unsigned int kKeycodeControlL = | 101 const unsigned int kKeycodeControlL = |
| 97 XKeysymToKeycode(ui::GetXDisplay(), XK_Control_L); | 102 XKeysymToKeycode(ui::GetXDisplay(), XK_Control_L); |
| 98 const unsigned int kKeycodeControlR = | 103 const unsigned int kKeycodeControlR = |
| 99 XKeysymToKeycode(ui::GetXDisplay(), XK_Control_R); | 104 XKeysymToKeycode(ui::GetXDisplay(), XK_Control_R); |
| 100 | 105 |
| 101 // First, test with a PC keyboard. | 106 // First, test with a PC keyboard. |
| 107 TestingPrefService prefs; | |
| 102 KeyRewriter rewriter; | 108 KeyRewriter rewriter; |
| 103 rewriter.DeviceAddedForTesting(0, "PC Keyboard"); | 109 rewriter.DeviceAddedForTesting(0, "PC Keyboard"); |
| 104 rewriter.set_last_device_id_for_testing(0); | 110 rewriter.set_last_device_id_for_testing(0); |
| 111 rewriter.set_pref_service_for_testing(&prefs); | |
| 105 { | 112 { |
| 106 // XK_a, Alt modifier. | 113 // XK_a, Alt modifier. |
| 107 InitXKeyEvent(ui::VKEY_A, ui::EF_ALT_DOWN, kKeycodeA, Mod1Mask, &xev); | 114 InitXKeyEvent(ui::VKEY_A, ui::EF_ALT_DOWN, kKeycodeA, Mod1Mask, &xev); |
| 108 aura::KeyEvent keyevent(&xev, false /* is_char */); | 115 aura::KeyEvent keyevent(&xev, false /* is_char */); |
| 109 rewriter.RewriteForTesting(&keyevent); | 116 rewriter.RewriteForTesting(&keyevent); |
| 110 EXPECT_EQ(ui::VKEY_A, keyevent.key_code()); | 117 EXPECT_EQ(ui::VKEY_A, keyevent.key_code()); |
| 111 EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags()); | 118 EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags()); |
| 112 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 119 const XKeyEvent& xkey = keyevent.native_event()->xkey; |
| 113 EXPECT_EQ(kKeycodeA, xkey.keycode); | 120 EXPECT_EQ(kKeycodeA, xkey.keycode); |
| 114 EXPECT_EQ(static_cast<unsigned int>(Mod1Mask), xkey.state); | 121 EXPECT_EQ(static_cast<unsigned int>(Mod1Mask), xkey.state); |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 251 const unsigned int kKeycodeNumPadLeft = XKeysymToKeycode(display, XK_KP_Left); | 258 const unsigned int kKeycodeNumPadLeft = XKeysymToKeycode(display, XK_KP_Left); |
| 252 const unsigned int kKeycodeNumPadBegin = | 259 const unsigned int kKeycodeNumPadBegin = |
| 253 XKeysymToKeycode(display, XK_KP_Begin); | 260 XKeysymToKeycode(display, XK_KP_Begin); |
| 254 const unsigned int kKeycodeNumPadRight = | 261 const unsigned int kKeycodeNumPadRight = |
| 255 XKeysymToKeycode(display, XK_KP_Right); | 262 XKeysymToKeycode(display, XK_KP_Right); |
| 256 const unsigned int kKeycodeNumPadHome = XKeysymToKeycode(display, XK_KP_Home); | 263 const unsigned int kKeycodeNumPadHome = XKeysymToKeycode(display, XK_KP_Home); |
| 257 const unsigned int kKeycodeNumPadUp = XKeysymToKeycode(display, XK_KP_Up); | 264 const unsigned int kKeycodeNumPadUp = XKeysymToKeycode(display, XK_KP_Up); |
| 258 const unsigned int kKeycodeNumPadPrior = | 265 const unsigned int kKeycodeNumPadPrior = |
| 259 XKeysymToKeycode(display, XK_KP_Prior); | 266 XKeysymToKeycode(display, XK_KP_Prior); |
| 260 | 267 |
| 268 TestingPrefService prefs; | |
| 261 KeyRewriter rewriter; | 269 KeyRewriter rewriter; |
| 270 rewriter.set_pref_service_for_testing(&prefs); | |
| 262 { | 271 { |
| 263 // XK_KP_Insert (= NumPad 0 without Num Lock), no modifier. | 272 // XK_KP_Insert (= NumPad 0 without Num Lock), no modifier. |
| 264 InitXKeyEvent(ui::VKEY_INSERT, 0, kKeycodeNumPadInsert, 0, &xev); | 273 InitXKeyEvent(ui::VKEY_INSERT, 0, kKeycodeNumPadInsert, 0, &xev); |
| 265 aura::KeyEvent keyevent(&xev, false /* is_char */); | 274 aura::KeyEvent keyevent(&xev, false /* is_char */); |
| 266 rewriter.RewriteForTesting(&keyevent); | 275 rewriter.RewriteForTesting(&keyevent); |
| 267 EXPECT_EQ(ui::VKEY_NUMPAD0, keyevent.key_code()); | 276 EXPECT_EQ(ui::VKEY_NUMPAD0, keyevent.key_code()); |
| 268 EXPECT_EQ(0, keyevent.flags()); | 277 EXPECT_EQ(0, keyevent.flags()); |
| 269 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 278 const XKeyEvent& xkey = keyevent.native_event()->xkey; |
| 270 EXPECT_EQ(kKeycodeNumPad0, xkey.keycode); | 279 EXPECT_EQ(kKeycodeNumPad0, xkey.keycode); |
| 271 // Mod2Mask means Num Lock. | 280 // Mod2Mask means Num Lock. |
| (...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 527 } | 536 } |
| 528 | 537 |
| 529 // Tests if the rewriter can handle a Command + Num Pad event. | 538 // Tests if the rewriter can handle a Command + Num Pad event. |
| 530 TEST(KeyRewriterTest, TestRewriteNumPadKeysOnAppleKeyboard) { | 539 TEST(KeyRewriterTest, TestRewriteNumPadKeysOnAppleKeyboard) { |
| 531 XEvent xev; | 540 XEvent xev; |
| 532 Display* display = ui::GetXDisplay(); | 541 Display* display = ui::GetXDisplay(); |
| 533 | 542 |
| 534 const unsigned int kKeycodeNumPadEnd = XKeysymToKeycode(display, XK_KP_End); | 543 const unsigned int kKeycodeNumPadEnd = XKeysymToKeycode(display, XK_KP_End); |
| 535 const unsigned int kKeycodeNumPad1 = XKeysymToKeycode(display, XK_KP_1); | 544 const unsigned int kKeycodeNumPad1 = XKeysymToKeycode(display, XK_KP_1); |
| 536 | 545 |
| 546 TestingPrefService prefs; | |
| 537 KeyRewriter rewriter; | 547 KeyRewriter rewriter; |
| 538 rewriter.DeviceAddedForTesting(0, "Apple Keyboard"); | 548 rewriter.DeviceAddedForTesting(0, "Apple Keyboard"); |
| 539 rewriter.set_last_device_id_for_testing(0); | 549 rewriter.set_last_device_id_for_testing(0); |
| 550 rewriter.set_pref_service_for_testing(&prefs); | |
| 540 { | 551 { |
| 541 // XK_KP_End (= NumPad 1 without Num Lock), Win modifier. | 552 // XK_KP_End (= NumPad 1 without Num Lock), Win modifier. |
| 542 InitXKeyEvent(ui::VKEY_END, 0, kKeycodeNumPadEnd, Mod4Mask, &xev); | 553 InitXKeyEvent(ui::VKEY_END, 0, kKeycodeNumPadEnd, Mod4Mask, &xev); |
| 543 aura::KeyEvent keyevent(&xev, false /* is_char */); | 554 aura::KeyEvent keyevent(&xev, false /* is_char */); |
| 544 rewriter.RewriteForTesting(&keyevent); | 555 rewriter.RewriteForTesting(&keyevent); |
| 545 // The result should be "Num Pad 1 with Control + Num Lock modifiers". | 556 // The result should be "Num Pad 1 with Control + Num Lock modifiers". |
| 546 EXPECT_EQ(ui::VKEY_NUMPAD1, keyevent.key_code()); | 557 EXPECT_EQ(ui::VKEY_NUMPAD1, keyevent.key_code()); |
| 547 EXPECT_EQ(ui::EF_CONTROL_DOWN, keyevent.flags()); | 558 EXPECT_EQ(ui::EF_CONTROL_DOWN, keyevent.flags()); |
| 548 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 559 const XKeyEvent& xkey = keyevent.native_event()->xkey; |
| 549 EXPECT_EQ(kKeycodeNumPad1, xkey.keycode); | 560 EXPECT_EQ(kKeycodeNumPad1, xkey.keycode); |
| 550 EXPECT_EQ(static_cast<unsigned int>(ControlMask | Mod2Mask), xkey.state); | 561 EXPECT_EQ(static_cast<unsigned int>(ControlMask | Mod2Mask), xkey.state); |
| 551 } | 562 } |
| 552 { | 563 { |
| 553 // XK_KP_1 (= NumPad 1 without Num Lock), Win modifier. | 564 // XK_KP_1 (= NumPad 1 without Num Lock), Win modifier. |
| 554 InitXKeyEvent(ui::VKEY_NUMPAD1, 0, kKeycodeNumPadEnd, Mod4Mask, &xev); | 565 InitXKeyEvent(ui::VKEY_NUMPAD1, 0, kKeycodeNumPadEnd, Mod4Mask, &xev); |
| 555 aura::KeyEvent keyevent(&xev, false /* is_char */); | 566 aura::KeyEvent keyevent(&xev, false /* is_char */); |
| 556 rewriter.RewriteForTesting(&keyevent); | 567 rewriter.RewriteForTesting(&keyevent); |
| 557 // The result should also be "Num Pad 1 with Control + Num Lock modifiers". | 568 // The result should also be "Num Pad 1 with Control + Num Lock modifiers". |
| 558 EXPECT_EQ(ui::VKEY_NUMPAD1, keyevent.key_code()); | 569 EXPECT_EQ(ui::VKEY_NUMPAD1, keyevent.key_code()); |
| 559 EXPECT_EQ(ui::EF_CONTROL_DOWN, keyevent.flags()); | 570 EXPECT_EQ(ui::EF_CONTROL_DOWN, keyevent.flags()); |
| 560 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 571 const XKeyEvent& xkey = keyevent.native_event()->xkey; |
| 561 EXPECT_EQ(kKeycodeNumPad1, xkey.keycode); | 572 EXPECT_EQ(kKeycodeNumPad1, xkey.keycode); |
| 562 EXPECT_EQ(static_cast<unsigned int>(ControlMask | Mod2Mask), xkey.state); | 573 EXPECT_EQ(static_cast<unsigned int>(ControlMask | Mod2Mask), xkey.state); |
| 563 } | 574 } |
| 564 } | 575 } |
| 565 | 576 |
| 577 TEST(KeyRewriterTest, TestRewriteModifiersNoRemap) { | |
| 578 XEvent xev; | |
| 579 Display* display = ui::GetXDisplay(); | |
| 580 | |
| 581 const unsigned int kKeycodeSuperL = XKeysymToKeycode(display, XK_Super_L); | |
|
Daniel Erat
2012/05/23 16:37:32
nit: KeyCode instead of unsigned int for all of th
Yusuke Sato
2012/05/24 08:24:42
Done.
| |
| 582 const unsigned int kKeycodeControlL = XKeysymToKeycode(display, XK_Control_L); | |
| 583 const unsigned int kKeycodeControlR = XKeysymToKeycode(display, XK_Control_R); | |
| 584 const unsigned int kKeycodeAltL = XKeysymToKeycode(display, XK_Alt_L); | |
| 585 const unsigned int kKeycodeAltR = XKeysymToKeycode(display, XK_Alt_R); | |
| 586 CHECK(kKeycodeAltR); | |
| 587 | |
| 588 TestingPrefService prefs; | |
| 589 KeyRewriter rewriter; | |
| 590 rewriter.set_pref_service_for_testing(&prefs); | |
| 591 { | |
| 592 // Press Search. | |
| 593 InitXKeyEvent(ui::VKEY_LWIN, 0, kKeycodeSuperL, 0U, &xev); | |
|
Daniel Erat
2012/05/23 16:37:32
there's a bunch of duplicate code in this file. d
Yusuke Sato
2012/05/24 08:24:42
Thanks for the suggestion! Done.
| |
| 594 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 595 rewriter.RewriteForTesting(&keyevent); | |
| 596 // Confirm the event is not rewritten. | |
| 597 EXPECT_EQ(ui::VKEY_LWIN, keyevent.key_code()); | |
| 598 EXPECT_EQ(0, keyevent.flags()); | |
| 599 EXPECT_EQ(ui::ET_KEY_PRESSED, keyevent.type()); | |
| 600 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 601 EXPECT_EQ(kKeycodeSuperL, xkey.keycode); | |
| 602 EXPECT_EQ(0U, xkey.state); | |
| 603 EXPECT_EQ(KeyPress, xkey.type); | |
| 604 } | |
| 605 { | |
| 606 // Press left Control. | |
| 607 InitXKeyEvent(ui::VKEY_CONTROL, 0, kKeycodeControlL, 0U, &xev); | |
| 608 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 609 rewriter.RewriteForTesting(&keyevent); | |
| 610 // Confirm the event is not rewritten. | |
| 611 EXPECT_EQ(ui::VKEY_CONTROL, keyevent.key_code()); | |
| 612 EXPECT_EQ(0, keyevent.flags()); | |
| 613 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 614 EXPECT_EQ(kKeycodeControlL, xkey.keycode); | |
| 615 EXPECT_EQ(0U, xkey.state); | |
| 616 } | |
| 617 { | |
| 618 // Press right Control. | |
| 619 InitXKeyEvent(ui::VKEY_CONTROL, 0, kKeycodeControlR, 0U, &xev); | |
| 620 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 621 rewriter.RewriteForTesting(&keyevent); | |
| 622 // Confirm the event is not rewritten. | |
| 623 EXPECT_EQ(ui::VKEY_CONTROL, keyevent.key_code()); | |
| 624 EXPECT_EQ(0, keyevent.flags()); | |
| 625 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 626 EXPECT_EQ(kKeycodeControlR, xkey.keycode); | |
| 627 EXPECT_EQ(0U, xkey.state); | |
| 628 } | |
| 629 { | |
| 630 // Press left Alt. | |
| 631 InitXKeyEvent(ui::VKEY_MENU, 0, kKeycodeAltL, 0U, &xev); | |
| 632 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 633 rewriter.RewriteForTesting(&keyevent); | |
| 634 // Confirm the event is not rewritten. | |
| 635 EXPECT_EQ(ui::VKEY_MENU, keyevent.key_code()); | |
| 636 EXPECT_EQ(0, keyevent.flags()); | |
| 637 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 638 EXPECT_EQ(kKeycodeAltL, xkey.keycode); | |
| 639 EXPECT_EQ(0U, xkey.state); | |
| 640 } | |
| 641 { | |
| 642 // Press right Alt. | |
| 643 InitXKeyEvent(ui::VKEY_MENU, 0, kKeycodeAltR, 0U, &xev); | |
| 644 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 645 rewriter.RewriteForTesting(&keyevent); | |
| 646 // Confirm the event is not rewritten. | |
| 647 EXPECT_EQ(ui::VKEY_MENU, keyevent.key_code()); | |
| 648 EXPECT_EQ(0, keyevent.flags()); | |
| 649 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 650 EXPECT_EQ(kKeycodeAltR, xkey.keycode); | |
| 651 EXPECT_EQ(0U, xkey.state); | |
| 652 } | |
| 653 | |
| 654 // Test KeyRelease event, just in case. | |
| 655 { | |
| 656 // Release Search. | |
| 657 InitXKeyEvent(ui::VKEY_LWIN, 0, kKeycodeSuperL, Mod4Mask, &xev); | |
| 658 xev.type = KeyRelease; | |
| 659 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 660 rewriter.RewriteForTesting(&keyevent); | |
| 661 // Confirm the release event is not rewritten. | |
| 662 EXPECT_EQ(ui::VKEY_LWIN, keyevent.key_code()); | |
| 663 EXPECT_EQ(0, keyevent.flags()); | |
| 664 EXPECT_EQ(ui::ET_KEY_RELEASED, keyevent.type()); | |
| 665 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 666 EXPECT_EQ(kKeycodeSuperL, xkey.keycode); | |
| 667 EXPECT_EQ(static_cast<unsigned int>(Mod4Mask), xkey.state); | |
| 668 EXPECT_EQ(KeyRelease, xkey.type); | |
| 669 } | |
| 670 } | |
| 671 | |
| 672 TEST(KeyRewriterTest, TestRewriteModifiersNoRemapMultipleKeys) { | |
| 673 XEvent xev; | |
| 674 Display* display = ui::GetXDisplay(); | |
| 675 | |
| 676 const unsigned int kKeycodeSuperL = XKeysymToKeycode(display, XK_Super_L); | |
| 677 const unsigned int kKeycodeMetaL = XKeysymToKeycode(display, XK_Meta_L); | |
| 678 const unsigned int kKeycodeMetaR = XKeysymToKeycode(display, XK_Meta_R); | |
| 679 const unsigned int kKeycodeA = XKeysymToKeycode(display, XK_A); | |
| 680 | |
| 681 TestingPrefService prefs; | |
| 682 KeyRewriter rewriter; | |
| 683 rewriter.set_pref_service_for_testing(&prefs); | |
| 684 { | |
| 685 // Press left Alt with Shift. | |
| 686 InitXKeyEvent(ui::VKEY_MENU, ui::EF_SHIFT_DOWN, | |
| 687 kKeycodeMetaL, ShiftMask, &xev); | |
| 688 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 689 rewriter.RewriteForTesting(&keyevent); | |
| 690 // Confirm the event is not rewritten. | |
| 691 EXPECT_EQ(ui::VKEY_MENU, keyevent.key_code()); | |
| 692 EXPECT_EQ(ui::EF_SHIFT_DOWN, keyevent.flags()); | |
| 693 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 694 EXPECT_EQ(kKeycodeMetaL, xkey.keycode); | |
| 695 EXPECT_EQ(static_cast<unsigned int>(ShiftMask), xkey.state); | |
| 696 } | |
| 697 { | |
| 698 // Press right Alt with Shift. | |
| 699 InitXKeyEvent(ui::VKEY_MENU, ui::EF_SHIFT_DOWN, | |
| 700 kKeycodeMetaR, ShiftMask, &xev); | |
| 701 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 702 rewriter.RewriteForTesting(&keyevent); | |
| 703 // Confirm the event is not rewritten. | |
| 704 EXPECT_EQ(ui::VKEY_MENU, keyevent.key_code()); | |
| 705 EXPECT_EQ(ui::EF_SHIFT_DOWN, keyevent.flags()); | |
| 706 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 707 EXPECT_EQ(kKeycodeMetaR, xkey.keycode); | |
| 708 EXPECT_EQ(static_cast<unsigned int>(ShiftMask), xkey.state); | |
| 709 } | |
| 710 { | |
| 711 // Press Search with Caps Lock mask. | |
| 712 InitXKeyEvent(ui::VKEY_LWIN, ui::EF_CAPS_LOCK_DOWN, | |
| 713 kKeycodeSuperL, LockMask, &xev); | |
| 714 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 715 rewriter.RewriteForTesting(&keyevent); | |
| 716 // Confirm the event is not rewritten. | |
| 717 EXPECT_EQ(ui::VKEY_LWIN, keyevent.key_code()); | |
| 718 EXPECT_EQ(ui::EF_CAPS_LOCK_DOWN, keyevent.flags()); | |
| 719 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 720 EXPECT_EQ(kKeycodeSuperL, xkey.keycode); | |
| 721 EXPECT_EQ(static_cast<unsigned int>(LockMask), xkey.state); | |
| 722 } | |
| 723 { | |
| 724 // Release Search with Caps Lock mask. | |
| 725 InitXKeyEvent(ui::VKEY_LWIN, ui::EF_CAPS_LOCK_DOWN, | |
| 726 kKeycodeSuperL, LockMask | Mod4Mask, &xev); | |
| 727 xev.type = KeyRelease; | |
| 728 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 729 rewriter.RewriteForTesting(&keyevent); | |
| 730 // Confirm the event is not rewritten. | |
| 731 EXPECT_EQ(ui::VKEY_LWIN, keyevent.key_code()); | |
| 732 EXPECT_EQ(ui::EF_CAPS_LOCK_DOWN, keyevent.flags()); | |
| 733 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 734 EXPECT_EQ(kKeycodeSuperL, xkey.keycode); | |
| 735 EXPECT_EQ(static_cast<unsigned int>(LockMask | Mod4Mask), xkey.state); | |
| 736 } | |
| 737 { | |
| 738 // Press Shift+Ctrl+Alt+Search+A | |
| 739 InitXKeyEvent(ui::VKEY_A, | |
| 740 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, | |
| 741 kKeycodeA, | |
| 742 ShiftMask | ControlMask | Mod1Mask | Mod4Mask, | |
| 743 &xev); | |
| 744 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 745 rewriter.RewriteForTesting(&keyevent); | |
| 746 // Confirm the event is not rewritten. | |
| 747 EXPECT_EQ(ui::VKEY_A, keyevent.key_code()); | |
| 748 EXPECT_EQ(ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, | |
| 749 keyevent.flags()); | |
| 750 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 751 EXPECT_EQ(kKeycodeA, xkey.keycode); | |
| 752 EXPECT_EQ(static_cast<unsigned int>( | |
| 753 ShiftMask | ControlMask | Mod1Mask | Mod4Mask), xkey.state); | |
| 754 } | |
| 755 } | |
| 756 | |
| 757 TEST(KeyRewriterTest, TestRewriteModifiersDisableSome) { | |
| 758 XEvent xev; | |
| 759 Display* display = ui::GetXDisplay(); | |
| 760 | |
| 761 const unsigned int kKeycodeSuperL = XKeysymToKeycode(display, XK_Super_L); | |
|
Daniel Erat
2012/05/23 16:37:32
nit: KeyCode (also for other unsigned ints in this
Yusuke Sato
2012/05/24 08:24:42
Done.
| |
| 762 const unsigned int kKeycodeControlL = XKeysymToKeycode(display, XK_Control_L); | |
| 763 const unsigned int kKeycodeMetaL = XKeysymToKeycode(display, XK_Meta_L); | |
| 764 const unsigned int kKeycodeVoidSymbol = | |
| 765 XKeysymToKeycode(display, XK_VoidSymbol); | |
| 766 const unsigned int kKeycodeA = XKeysymToKeycode(display, XK_a); | |
| 767 | |
| 768 // Disable Search and Control keys. | |
| 769 TestingPrefService prefs; | |
| 770 chromeos::Preferences::RegisterUserPrefs(&prefs); | |
| 771 IntegerPrefMember search; | |
| 772 search.Init(prefs::kLanguageXkbRemapSearchKeyTo, &prefs, NULL); | |
| 773 search.SetValue(chromeos::input_method::kVoidKey); | |
| 774 IntegerPrefMember control; | |
| 775 control.Init(prefs::kLanguageXkbRemapControlKeyTo, &prefs, NULL); | |
| 776 control.SetValue(chromeos::input_method::kVoidKey); | |
| 777 | |
| 778 KeyRewriter rewriter; | |
| 779 rewriter.set_pref_service_for_testing(&prefs); | |
| 780 { | |
| 781 // Press left Alt with Shift. This key press shouldn't be affected by the | |
| 782 // pref. | |
| 783 InitXKeyEvent(ui::VKEY_MENU, ui::EF_SHIFT_DOWN, | |
| 784 kKeycodeMetaL, ShiftMask, &xev); | |
| 785 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 786 rewriter.RewriteForTesting(&keyevent); | |
| 787 // Confirm the event is not rewritten. | |
| 788 EXPECT_EQ(ui::VKEY_MENU, keyevent.key_code()); | |
| 789 EXPECT_EQ(ui::EF_SHIFT_DOWN, keyevent.flags()); | |
| 790 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 791 EXPECT_EQ(kKeycodeMetaL, xkey.keycode); | |
| 792 EXPECT_EQ(static_cast<unsigned int>(ShiftMask), xkey.state); | |
| 793 } | |
| 794 { | |
| 795 // Press Search. | |
| 796 InitXKeyEvent(ui::VKEY_LWIN, 0, kKeycodeSuperL, 0U, &xev); | |
| 797 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 798 rewriter.RewriteForTesting(&keyevent); | |
| 799 // Confirm the event is now VKEY_UNKNOWN + XK_VoidSymbol. | |
| 800 EXPECT_EQ(ui::VKEY_UNKNOWN, keyevent.key_code()); | |
| 801 EXPECT_EQ(0, keyevent.flags()); | |
| 802 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 803 EXPECT_EQ(kKeycodeVoidSymbol, xkey.keycode); | |
| 804 EXPECT_EQ(0U, xkey.state); | |
| 805 } | |
| 806 { | |
| 807 // Press Control. | |
| 808 InitXKeyEvent(ui::VKEY_CONTROL, 0, kKeycodeControlL, 0U, &xev); | |
| 809 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 810 rewriter.RewriteForTesting(&keyevent); | |
| 811 // Confirm the event is now VKEY_UNKNOWN + XK_VoidSymbol. | |
| 812 EXPECT_EQ(ui::VKEY_UNKNOWN, keyevent.key_code()); | |
| 813 EXPECT_EQ(0, keyevent.flags()); | |
| 814 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 815 EXPECT_EQ(kKeycodeVoidSymbol, xkey.keycode); | |
| 816 EXPECT_EQ(0U, xkey.state); | |
| 817 } | |
| 818 { | |
| 819 // Press Control+Search. | |
| 820 InitXKeyEvent(ui::VKEY_LWIN, ui::EF_CONTROL_DOWN, | |
| 821 kKeycodeSuperL, ControlMask, &xev); | |
| 822 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 823 rewriter.RewriteForTesting(&keyevent); | |
| 824 // Confirm the event is now VKEY_UNKNOWN + XK_VoidSymbol without any | |
| 825 // modifiers. | |
| 826 EXPECT_EQ(ui::VKEY_UNKNOWN, keyevent.key_code()); | |
| 827 EXPECT_EQ(0, keyevent.flags()); | |
| 828 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 829 EXPECT_EQ(kKeycodeVoidSymbol, xkey.keycode); | |
| 830 EXPECT_EQ(0U, xkey.state); | |
| 831 } | |
| 832 { | |
| 833 // Press Control+Search+a. | |
| 834 InitXKeyEvent(ui::VKEY_A, ui::EF_CONTROL_DOWN, | |
| 835 kKeycodeA, ControlMask | Mod4Mask, &xev); | |
| 836 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 837 rewriter.RewriteForTesting(&keyevent); | |
| 838 // Confirm the event is now VKEY_A without any modifiers. | |
| 839 EXPECT_EQ(ui::VKEY_A, keyevent.key_code()); | |
| 840 EXPECT_EQ(0, keyevent.flags()); | |
| 841 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 842 EXPECT_EQ(kKeycodeA, xkey.keycode); | |
| 843 EXPECT_EQ(0U, xkey.state); | |
| 844 } | |
| 845 { | |
| 846 // Press Control+Search+Alt+a. | |
| 847 InitXKeyEvent(ui::VKEY_A, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, | |
| 848 kKeycodeA, ControlMask | Mod1Mask | Mod4Mask, &xev); | |
| 849 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 850 rewriter.RewriteForTesting(&keyevent); | |
| 851 // Confirm the event is now VKEY_A only with the Alt modifier. | |
| 852 EXPECT_EQ(ui::VKEY_A, keyevent.key_code()); | |
| 853 EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags()); | |
| 854 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 855 EXPECT_EQ(kKeycodeA, xkey.keycode); | |
| 856 EXPECT_EQ(static_cast<unsigned int>(Mod1Mask), xkey.state); | |
| 857 } | |
| 858 | |
| 859 | |
| 860 const unsigned int kKeycodeAltL = XKeysymToKeycode(display, XK_Alt_L); | |
| 861 const unsigned int kKeycodeB = XKeysymToKeycode(display, XK_b); | |
| 862 | |
| 863 // Remap Alt to Control. | |
| 864 IntegerPrefMember alt; | |
| 865 alt.Init(prefs::kLanguageXkbRemapAltKeyTo, &prefs, NULL); | |
| 866 alt.SetValue(chromeos::input_method::kControlKey); | |
| 867 { | |
| 868 // Press left Alt. | |
| 869 InitXKeyEvent(ui::VKEY_MENU, 0, kKeycodeAltL, 0U, &xev); | |
| 870 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 871 rewriter.RewriteForTesting(&keyevent); | |
| 872 // Confirm the event is now VKEY_CONTROL + XK_Control_L even though the | |
| 873 // Control key itself is disabled. | |
| 874 EXPECT_EQ(ui::VKEY_CONTROL, keyevent.key_code()); | |
| 875 EXPECT_EQ(0, keyevent.flags()); | |
| 876 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 877 EXPECT_EQ(kKeycodeControlL, xkey.keycode); | |
| 878 EXPECT_EQ(0U, xkey.state); | |
| 879 } | |
| 880 { | |
| 881 // Press Alt+b. | |
| 882 InitXKeyEvent(ui::VKEY_B, ui::EF_ALT_DOWN, kKeycodeB, Mod1Mask, &xev); | |
| 883 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 884 rewriter.RewriteForTesting(&keyevent); | |
| 885 // Confirm the event is now Control+b even though the Control key itself is | |
| 886 // disabled. | |
| 887 EXPECT_EQ(ui::VKEY_B, keyevent.key_code()); | |
| 888 EXPECT_EQ(ui::EF_CONTROL_DOWN, keyevent.flags()); | |
| 889 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 890 EXPECT_EQ(kKeycodeB, xkey.keycode); | |
| 891 EXPECT_EQ(static_cast<unsigned int>(ControlMask), xkey.state); | |
| 892 } | |
| 893 } | |
| 894 | |
| 895 TEST(KeyRewriterTest, TestRewriteModifiersRemapToControl) { | |
| 896 XEvent xev; | |
| 897 Display* display = ui::GetXDisplay(); | |
| 898 | |
| 899 const unsigned int kKeycodeSuperL = XKeysymToKeycode(display, XK_Super_L); | |
| 900 const unsigned int kKeycodeControlL = XKeysymToKeycode(display, XK_Control_L); | |
| 901 const unsigned int kKeycodeControlR = XKeysymToKeycode(display, XK_Control_R); | |
| 902 const unsigned int kKeycodeAltL = XKeysymToKeycode(display, XK_Alt_L); | |
| 903 const unsigned int kKeycodeAltR = XKeysymToKeycode(display, XK_Alt_R); | |
| 904 const unsigned int kKeycodeA = XKeysymToKeycode(display, XK_A); | |
| 905 | |
| 906 // Remap Search to Control. | |
| 907 TestingPrefService prefs; | |
| 908 chromeos::Preferences::RegisterUserPrefs(&prefs); | |
| 909 IntegerPrefMember search; | |
| 910 search.Init(prefs::kLanguageXkbRemapSearchKeyTo, &prefs, NULL); | |
| 911 search.SetValue(chromeos::input_method::kControlKey); | |
| 912 | |
| 913 KeyRewriter rewriter; | |
| 914 rewriter.set_pref_service_for_testing(&prefs); | |
| 915 { | |
| 916 // Press Search. | |
| 917 InitXKeyEvent(ui::VKEY_LWIN, 0, kKeycodeSuperL, 0U, &xev); | |
| 918 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 919 rewriter.RewriteForTesting(&keyevent); | |
| 920 // Confirm the event is now VKEY_CONTROL + XK_Control_L. | |
| 921 EXPECT_EQ(ui::VKEY_CONTROL, keyevent.key_code()); | |
| 922 EXPECT_EQ(0, keyevent.flags()); | |
| 923 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 924 EXPECT_EQ(kKeycodeControlL, xkey.keycode); | |
| 925 EXPECT_EQ(0U, xkey.state); | |
| 926 } | |
| 927 | |
| 928 // Remap Alt to Control too. | |
| 929 IntegerPrefMember alt; | |
| 930 alt.Init(prefs::kLanguageXkbRemapAltKeyTo, &prefs, NULL); | |
| 931 alt.SetValue(chromeos::input_method::kControlKey); | |
| 932 { | |
| 933 // Press left Alt. | |
| 934 InitXKeyEvent(ui::VKEY_MENU, 0, kKeycodeAltL, 0U, &xev); | |
| 935 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 936 rewriter.RewriteForTesting(&keyevent); | |
| 937 // Confirm the event is now VKEY_CONTROL + XK_Control_L. | |
| 938 EXPECT_EQ(ui::VKEY_CONTROL, keyevent.key_code()); | |
| 939 EXPECT_EQ(0, keyevent.flags()); | |
| 940 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 941 EXPECT_EQ(kKeycodeControlL, xkey.keycode); | |
| 942 EXPECT_EQ(0U, xkey.state); | |
| 943 } | |
| 944 { | |
| 945 // Press right Alt. | |
| 946 InitXKeyEvent(ui::VKEY_MENU, 0, kKeycodeAltR, 0U, &xev); | |
| 947 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 948 rewriter.RewriteForTesting(&keyevent); | |
| 949 // Confirm the event is now VKEY_CONTROL + XK_Control_R. | |
| 950 EXPECT_EQ(ui::VKEY_CONTROL, keyevent.key_code()); | |
| 951 EXPECT_EQ(0, keyevent.flags()); | |
| 952 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 953 EXPECT_EQ(kKeycodeControlR, xkey.keycode); | |
| 954 EXPECT_EQ(0U, xkey.state); | |
| 955 } | |
| 956 { | |
| 957 // Press Alt+Search. | |
| 958 InitXKeyEvent(ui::VKEY_LWIN, ui::EF_ALT_DOWN, | |
| 959 kKeycodeSuperL, Mod1Mask, &xev); | |
| 960 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 961 rewriter.RewriteForTesting(&keyevent); | |
| 962 // Confirm the event is now VKEY_CONTROL + XK_Control_L. | |
| 963 EXPECT_EQ(ui::VKEY_CONTROL, keyevent.key_code()); | |
| 964 EXPECT_EQ(ui::EF_CONTROL_DOWN, keyevent.flags()); | |
| 965 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 966 EXPECT_EQ(kKeycodeControlL, xkey.keycode); | |
| 967 EXPECT_EQ(static_cast<unsigned int>(ControlMask), xkey.state); | |
| 968 } | |
| 969 { | |
| 970 // Press Control+Alt+Search. | |
| 971 InitXKeyEvent(ui::VKEY_LWIN, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, | |
| 972 kKeycodeSuperL, ControlMask | Mod1Mask, &xev); | |
| 973 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 974 rewriter.RewriteForTesting(&keyevent); | |
| 975 // Confirm the event is now VKEY_CONTROL + XK_Control_L. | |
| 976 EXPECT_EQ(ui::VKEY_CONTROL, keyevent.key_code()); | |
| 977 EXPECT_EQ(ui::EF_CONTROL_DOWN, keyevent.flags()); | |
| 978 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 979 EXPECT_EQ(kKeycodeControlL, xkey.keycode); | |
| 980 EXPECT_EQ(static_cast<unsigned int>(ControlMask), xkey.state); | |
| 981 } | |
| 982 { | |
| 983 // Press Shift+Control+Alt+Search. | |
| 984 InitXKeyEvent(ui::VKEY_LWIN, | |
| 985 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, | |
| 986 kKeycodeSuperL, ShiftMask | ControlMask | Mod1Mask, &xev); | |
| 987 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 988 rewriter.RewriteForTesting(&keyevent); | |
| 989 // Confirm the event is now Control with Shift and Control modifiers. | |
| 990 EXPECT_EQ(ui::VKEY_CONTROL, keyevent.key_code()); | |
| 991 EXPECT_EQ(ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, keyevent.flags()); | |
| 992 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 993 EXPECT_EQ(kKeycodeControlL, xkey.keycode); | |
| 994 EXPECT_EQ(static_cast<unsigned int>(ShiftMask | ControlMask), xkey.state); | |
| 995 } | |
| 996 { | |
| 997 // Press Shift+Control+Alt+Search+A | |
| 998 InitXKeyEvent(ui::VKEY_A, | |
| 999 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, | |
| 1000 kKeycodeA, ShiftMask | ControlMask | Mod1Mask, &xev); | |
| 1001 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 1002 rewriter.RewriteForTesting(&keyevent); | |
| 1003 // Confirm the event is now A with Shift and Control modifiers. | |
| 1004 EXPECT_EQ(ui::VKEY_A, keyevent.key_code()); | |
| 1005 EXPECT_EQ(ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, keyevent.flags()); | |
| 1006 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 1007 EXPECT_EQ(kKeycodeA, xkey.keycode); | |
| 1008 EXPECT_EQ(static_cast<unsigned int>(ShiftMask | ControlMask), xkey.state); | |
| 1009 } | |
| 1010 } | |
| 1011 | |
| 1012 TEST(KeyRewriterTest, TestRewriteModifiersRemapMany) { | |
| 1013 XEvent xev; | |
| 1014 Display* display = ui::GetXDisplay(); | |
| 1015 | |
| 1016 const unsigned int kKeycodeSuperL = XKeysymToKeycode(display, XK_Super_L); | |
| 1017 const unsigned int kKeycodeControlL = XKeysymToKeycode(display, XK_Control_L); | |
| 1018 const unsigned int kKeycodeAltL = XKeysymToKeycode(display, XK_Alt_L); | |
| 1019 const unsigned int kKeycodeMetaL = XKeysymToKeycode(display, XK_Meta_L); | |
| 1020 const unsigned int kKeycodeA = XKeysymToKeycode(display, XK_A); | |
| 1021 | |
| 1022 // Remap Search to Alt. | |
| 1023 TestingPrefService prefs; | |
| 1024 chromeos::Preferences::RegisterUserPrefs(&prefs); | |
| 1025 IntegerPrefMember search; | |
| 1026 search.Init(prefs::kLanguageXkbRemapSearchKeyTo, &prefs, NULL); | |
| 1027 search.SetValue(chromeos::input_method::kAltKey); | |
| 1028 | |
| 1029 KeyRewriter rewriter; | |
| 1030 rewriter.set_pref_service_for_testing(&prefs); | |
| 1031 { | |
| 1032 // Press Search. | |
| 1033 InitXKeyEvent(ui::VKEY_LWIN, 0, kKeycodeSuperL, 0U, &xev); | |
| 1034 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 1035 rewriter.RewriteForTesting(&keyevent); | |
| 1036 // Confirm the event is now VKEY_MENU + XK_Alt_L. | |
| 1037 EXPECT_EQ(ui::VKEY_MENU, keyevent.key_code()); | |
| 1038 EXPECT_EQ(0, keyevent.flags()); | |
| 1039 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 1040 EXPECT_EQ(kKeycodeAltL, xkey.keycode); | |
| 1041 EXPECT_EQ(0U, xkey.state); | |
| 1042 } | |
| 1043 | |
| 1044 // Remap Alt to Control. | |
| 1045 IntegerPrefMember alt; | |
| 1046 alt.Init(prefs::kLanguageXkbRemapAltKeyTo, &prefs, NULL); | |
| 1047 alt.SetValue(chromeos::input_method::kControlKey); | |
| 1048 { | |
| 1049 // Press left Alt. | |
| 1050 InitXKeyEvent(ui::VKEY_MENU, 0, kKeycodeAltL, 0U, &xev); | |
| 1051 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 1052 rewriter.RewriteForTesting(&keyevent); | |
| 1053 // Confirm the event is now VKEY_CONTROL + XK_Control_L. | |
| 1054 EXPECT_EQ(ui::VKEY_CONTROL, keyevent.key_code()); | |
| 1055 EXPECT_EQ(0, keyevent.flags()); | |
| 1056 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 1057 EXPECT_EQ(kKeycodeControlL, xkey.keycode); | |
| 1058 EXPECT_EQ(0U, xkey.state); | |
| 1059 } | |
| 1060 | |
| 1061 // Remap Control to Search. | |
| 1062 IntegerPrefMember control; | |
| 1063 control.Init(prefs::kLanguageXkbRemapControlKeyTo, &prefs, NULL); | |
| 1064 control.SetValue(chromeos::input_method::kSearchKey); | |
| 1065 { | |
| 1066 // Press left Control. | |
| 1067 InitXKeyEvent(ui::VKEY_CONTROL, 0, kKeycodeControlL, 0U, &xev); | |
| 1068 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 1069 rewriter.RewriteForTesting(&keyevent); | |
| 1070 // Confirm the event is now VKEY_LWIN. | |
| 1071 EXPECT_EQ(ui::VKEY_LWIN, keyevent.key_code()); | |
| 1072 EXPECT_EQ(0, keyevent.flags()); | |
| 1073 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 1074 EXPECT_EQ(kKeycodeSuperL, xkey.keycode); | |
| 1075 EXPECT_EQ(0U, xkey.state); | |
| 1076 } | |
| 1077 | |
| 1078 // Then, press all of the three. | |
| 1079 { | |
| 1080 // Press Control+Alt+Search. | |
| 1081 InitXKeyEvent(ui::VKEY_LWIN, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, | |
| 1082 kKeycodeSuperL, ControlMask | Mod1Mask, &xev); | |
| 1083 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 1084 rewriter.RewriteForTesting(&keyevent); | |
| 1085 // Confirm the event is unchanged. | |
| 1086 EXPECT_EQ(ui::VKEY_MENU, keyevent.key_code()); | |
| 1087 EXPECT_EQ(ui::EF_CONTROL_DOWN, keyevent.flags()); | |
| 1088 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 1089 EXPECT_EQ(kKeycodeAltL, xkey.keycode); | |
| 1090 EXPECT_EQ(static_cast<unsigned int>(ControlMask | Mod4Mask), xkey.state); | |
| 1091 } | |
| 1092 { | |
| 1093 // Press Shift+Control+Alt+Search. | |
| 1094 InitXKeyEvent(ui::VKEY_LWIN, | |
| 1095 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, | |
| 1096 kKeycodeSuperL, ShiftMask | ControlMask | Mod1Mask, &xev); | |
| 1097 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 1098 rewriter.RewriteForTesting(&keyevent); | |
| 1099 EXPECT_EQ(ui::VKEY_MENU, keyevent.key_code()); | |
| 1100 EXPECT_EQ(ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, keyevent.flags()); | |
| 1101 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 1102 EXPECT_EQ(kKeycodeMetaL, xkey.keycode); | |
| 1103 EXPECT_EQ(static_cast<unsigned int>(ShiftMask | ControlMask | Mod4Mask), | |
| 1104 xkey.state); | |
| 1105 } | |
| 1106 { | |
| 1107 // Press Shift+Control+Alt+Search+A | |
| 1108 InitXKeyEvent(ui::VKEY_A, | |
| 1109 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, | |
| 1110 kKeycodeA, ShiftMask | ControlMask | Mod1Mask | Mod4Mask, | |
| 1111 &xev); | |
| 1112 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 1113 rewriter.RewriteForTesting(&keyevent); | |
| 1114 EXPECT_EQ(ui::VKEY_A, keyevent.key_code()); | |
| 1115 EXPECT_EQ(ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, | |
| 1116 keyevent.flags()); | |
| 1117 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 1118 EXPECT_EQ(kKeycodeA, xkey.keycode); | |
| 1119 EXPECT_EQ(static_cast<unsigned int>( | |
| 1120 ShiftMask | ControlMask | Mod1Mask | Mod4Mask), xkey.state); | |
| 1121 } | |
| 1122 } | |
| 1123 | |
| 1124 TEST(KeyRewriterTest, TestRewriteModifiersRemapToCapsLock) { | |
| 1125 XEvent xev; | |
| 1126 Display* display = ui::GetXDisplay(); | |
| 1127 | |
| 1128 const unsigned int kKeycodeSuperL = XKeysymToKeycode(display, XK_Super_L); | |
| 1129 const unsigned int kKeycodeCapsLock = XKeysymToKeycode(display, XK_Caps_Lock); | |
| 1130 | |
| 1131 // Remap Search to Caps Lock. | |
| 1132 TestingPrefService prefs; | |
| 1133 chromeos::Preferences::RegisterUserPrefs(&prefs); | |
| 1134 IntegerPrefMember search; | |
| 1135 search.Init(prefs::kLanguageXkbRemapSearchKeyTo, &prefs, NULL); | |
| 1136 search.SetValue(chromeos::input_method::kCapsLockKey); | |
| 1137 | |
| 1138 chromeos::input_method::MockXKeyboard xkeyboard; | |
| 1139 KeyRewriter rewriter; | |
| 1140 rewriter.set_pref_service_for_testing(&prefs); | |
| 1141 rewriter.set_xkeyboard_for_testing(&xkeyboard); | |
| 1142 EXPECT_FALSE(xkeyboard.caps_lock_is_enabled_); | |
| 1143 { | |
| 1144 // Press Search. | |
| 1145 InitXKeyEvent(ui::VKEY_LWIN, 0, kKeycodeSuperL, 0U, &xev); | |
| 1146 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 1147 rewriter.RewriteForTesting(&keyevent); | |
| 1148 EXPECT_EQ(ui::VKEY_CAPITAL, keyevent.key_code()); | |
| 1149 EXPECT_EQ(0, keyevent.flags()); | |
| 1150 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 1151 EXPECT_EQ(kKeycodeCapsLock, xkey.keycode); | |
| 1152 EXPECT_EQ(0U, xkey.state); | |
| 1153 // Confirm that the Caps Lock status is changed. | |
| 1154 EXPECT_TRUE(xkeyboard.caps_lock_is_enabled_); | |
| 1155 } | |
| 1156 { | |
| 1157 // Release Search. | |
| 1158 InitXKeyEvent(ui::VKEY_LWIN, ui::EF_CAPS_LOCK_DOWN, | |
| 1159 kKeycodeSuperL, Mod4Mask | LockMask, &xev); | |
| 1160 xev.type = KeyRelease; | |
| 1161 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 1162 rewriter.RewriteForTesting(&keyevent); | |
| 1163 EXPECT_EQ(ui::VKEY_CAPITAL, keyevent.key_code()); | |
| 1164 EXPECT_EQ(ui::EF_CAPS_LOCK_DOWN, keyevent.flags()); | |
| 1165 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 1166 EXPECT_EQ(kKeycodeCapsLock, xkey.keycode); | |
| 1167 EXPECT_EQ(static_cast<unsigned int>(LockMask), xkey.state); | |
| 1168 // Confirm that the Caps Lock status is not changed. | |
| 1169 EXPECT_TRUE(xkeyboard.caps_lock_is_enabled_); | |
| 1170 } | |
| 1171 { | |
| 1172 // Press Search. | |
| 1173 InitXKeyEvent(ui::VKEY_LWIN, 0, kKeycodeSuperL, 0U, &xev); | |
| 1174 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 1175 rewriter.RewriteForTesting(&keyevent); | |
| 1176 EXPECT_EQ(ui::VKEY_CAPITAL, keyevent.key_code()); | |
| 1177 EXPECT_EQ(0, keyevent.flags()); | |
| 1178 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 1179 EXPECT_EQ(kKeycodeCapsLock, xkey.keycode); | |
| 1180 EXPECT_EQ(0U, xkey.state); | |
| 1181 // Confirm that the Caps Lock status is changed. | |
| 1182 EXPECT_FALSE(xkeyboard.caps_lock_is_enabled_); | |
| 1183 } | |
| 1184 { | |
| 1185 // Release Search. | |
| 1186 InitXKeyEvent(ui::VKEY_LWIN, ui::EF_CAPS_LOCK_DOWN, | |
| 1187 kKeycodeSuperL, Mod4Mask | LockMask, &xev); | |
| 1188 xev.type = KeyRelease; | |
| 1189 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 1190 rewriter.RewriteForTesting(&keyevent); | |
| 1191 EXPECT_EQ(ui::VKEY_CAPITAL, keyevent.key_code()); | |
| 1192 EXPECT_EQ(ui::EF_CAPS_LOCK_DOWN, keyevent.flags()); | |
| 1193 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 1194 EXPECT_EQ(kKeycodeCapsLock, xkey.keycode); | |
| 1195 EXPECT_EQ(static_cast<unsigned int>(LockMask), xkey.state); | |
| 1196 // Confirm that the Caps Lock status is not changed. | |
| 1197 EXPECT_FALSE(xkeyboard.caps_lock_is_enabled_); | |
| 1198 } | |
| 1199 { | |
| 1200 // Press Caps Lock (on an external keyboard). | |
| 1201 InitXKeyEvent(ui::VKEY_CAPITAL, 0, kKeycodeCapsLock, 0U, &xev); | |
| 1202 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 1203 rewriter.RewriteForTesting(&keyevent); | |
| 1204 EXPECT_EQ(ui::VKEY_CAPITAL, keyevent.key_code()); | |
| 1205 EXPECT_EQ(0, keyevent.flags()); | |
| 1206 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 1207 EXPECT_EQ(kKeycodeCapsLock, xkey.keycode); | |
| 1208 EXPECT_EQ(0U, xkey.state); | |
| 1209 // Confirm that calling RewriteForTesting() does not change the state of | |
| 1210 // |xkeyboard|. In this case, X Window system itself should change the | |
| 1211 // Caps Lock state, not ash::KeyRewriter. | |
| 1212 EXPECT_FALSE(xkeyboard.caps_lock_is_enabled_); | |
| 1213 } | |
| 1214 { | |
| 1215 // Press Caps Lock (on an external keyboard). | |
| 1216 InitXKeyEvent(ui::VKEY_CAPITAL, ui::EF_CAPS_LOCK_DOWN, | |
| 1217 kKeycodeCapsLock, LockMask, &xev); | |
| 1218 xev.type = KeyRelease; | |
| 1219 aura::KeyEvent keyevent(&xev, false /* is_char */); | |
| 1220 rewriter.RewriteForTesting(&keyevent); | |
| 1221 EXPECT_EQ(ui::VKEY_CAPITAL, keyevent.key_code()); | |
| 1222 EXPECT_EQ(ui::EF_CAPS_LOCK_DOWN, keyevent.flags()); | |
| 1223 const XKeyEvent& xkey = keyevent.native_event()->xkey; | |
| 1224 EXPECT_EQ(kKeycodeCapsLock, xkey.keycode); | |
| 1225 EXPECT_EQ(static_cast<unsigned int>(LockMask), xkey.state); | |
| 1226 EXPECT_FALSE(xkeyboard.caps_lock_is_enabled_); | |
| 1227 } | |
| 1228 } | |
| 566 #endif // OS_CHROMEOS | 1229 #endif // OS_CHROMEOS |
| OLD | NEW |