Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1047)

Side by Side Diff: chrome/browser/ui/views/ash/key_rewriter_unittest.cc

Issue 10383301: Move modifier remapping code from X to Ash (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: review Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698