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 |