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

Unified 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: style fix 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/views/ash/key_rewriter_unittest.cc
diff --git a/chrome/browser/ui/views/ash/key_rewriter_unittest.cc b/chrome/browser/ui/views/ash/key_rewriter_unittest.cc
index f32e785fc52de9976a2318160be328c38803e623..e34f01b5c32818505406a25d101ebc5d7dd89563 100644
--- a/chrome/browser/ui/views/ash/key_rewriter_unittest.cc
+++ b/chrome/browser/ui/views/ash/key_rewriter_unittest.cc
@@ -3,7 +3,11 @@
// found in the LICENSE file.
#include "base/basictypes.h"
+#include "base/stringprintf.h"
+#include "chrome/browser/prefs/pref_member.h"
#include "chrome/browser/ui/views/ash/key_rewriter.h"
+#include "chrome/common/pref_names.h"
+#include "chrome/test/base/testing_pref_service.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/aura/event.h"
@@ -11,16 +15,19 @@
#include <X11/keysym.h>
#include <X11/Xlib.h>
+#include "chrome/browser/chromeos/input_method/mock_xkeyboard.h"
+#include "chrome/browser/chromeos/preferences.h"
#include "ui/base/x/x11_util.h"
namespace {
void InitXKeyEvent(ui::KeyboardCode ui_keycode,
int ui_flags,
- unsigned int x_keycode,
+ ui::EventType ui_type,
+ KeyCode x_keycode,
unsigned int x_state,
XEvent* event) {
- ui::InitXKeyEventForTesting(ui::ET_KEY_PRESSED,
+ ui::InitXKeyEventForTesting(ui_type,
ui_keycode,
ui_flags,
event);
@@ -28,10 +35,116 @@ void InitXKeyEvent(ui::KeyboardCode ui_keycode,
event->xkey.state = x_state;
}
+std::string GetRewrittenEventAsString(KeyRewriter* rewriter,
+ ui::KeyboardCode ui_keycode,
+ int ui_flags,
+ ui::EventType ui_type,
+ KeyCode x_keycode,
+ unsigned int x_state) {
+ XEvent xev;
+ InitXKeyEvent(ui_keycode, ui_flags, ui_type, x_keycode, x_state, &xev);
+ aura::KeyEvent keyevent(&xev, false /* is_char */);
+ rewriter->RewriteForTesting(&keyevent);
+ return StringPrintf(
+ "ui_keycode=%d ui_flags=%d ui_type=%d x_keycode=%u x_state=%u x_type=%d",
+ keyevent.key_code(), keyevent.flags(), keyevent.type(),
+ xev.xkey.keycode, xev.xkey.state, xev.xkey.type);
+}
+
+std::string GetExpectedResultAsString(ui::KeyboardCode ui_keycode,
+ int ui_flags,
+ ui::EventType ui_type,
+ KeyCode x_keycode,
+ unsigned int x_state,
+ int x_type) {
+ return StringPrintf(
+ "ui_keycode=%d ui_flags=%d ui_type=%d x_keycode=%u x_state=%u x_type=%d",
+ ui_keycode, ui_flags, ui_type, x_keycode, x_state, x_type);
+}
+
+class KeyRewriterTest : public testing::Test {
+ public:
+ KeyRewriterTest()
+ : display_(ui::GetXDisplay()),
+ keycode_a_(XKeysymToKeycode(display_, XK_a)),
+ keycode_alt_l_(XKeysymToKeycode(display_, XK_Alt_L)),
+ keycode_alt_r_(XKeysymToKeycode(display_, XK_Alt_R)),
+ keycode_b_(XKeysymToKeycode(display_, XK_B)),
+ keycode_caps_lock_(XKeysymToKeycode(display_, XK_Caps_Lock)),
+ keycode_control_l_(XKeysymToKeycode(display_, XK_Control_L)),
+ keycode_control_r_(XKeysymToKeycode(display_, XK_Control_R)),
+ keycode_meta_l_(XKeysymToKeycode(display_, XK_Meta_L)),
+ keycode_meta_r_(XKeysymToKeycode(display_, XK_Meta_R)),
+ keycode_num_pad_0_(XKeysymToKeycode(display_, XK_KP_0)),
+ keycode_num_pad_1_(XKeysymToKeycode(display_, XK_KP_1)),
+ keycode_num_pad_2_(XKeysymToKeycode(display_, XK_KP_2)),
+ keycode_num_pad_3_(XKeysymToKeycode(display_, XK_KP_3)),
+ keycode_num_pad_4_(XKeysymToKeycode(display_, XK_KP_4)),
+ keycode_num_pad_5_(XKeysymToKeycode(display_, XK_KP_5)),
+ keycode_num_pad_6_(XKeysymToKeycode(display_, XK_KP_6)),
+ keycode_num_pad_7_(XKeysymToKeycode(display_, XK_KP_7)),
+ keycode_num_pad_8_(XKeysymToKeycode(display_, XK_KP_8)),
+ keycode_num_pad_9_(XKeysymToKeycode(display_, XK_KP_9)),
+ keycode_num_pad_begin_(XKeysymToKeycode(display_, XK_KP_Begin)),
+ keycode_num_pad_decimal_(XKeysymToKeycode(display_, XK_KP_Decimal)),
+ keycode_num_pad_delete_(XKeysymToKeycode(display_, XK_KP_Delete)),
+ keycode_num_pad_down_(XKeysymToKeycode(display_, XK_KP_Down)),
+ keycode_num_pad_end_(XKeysymToKeycode(display_, XK_KP_End)),
+ keycode_num_pad_home_(XKeysymToKeycode(display_, XK_KP_Home)),
+ keycode_num_pad_insert_(XKeysymToKeycode(display_, XK_KP_Insert)),
+ keycode_num_pad_left_(XKeysymToKeycode(display_, XK_KP_Left)),
+ keycode_num_pad_next_(XKeysymToKeycode(display_, XK_KP_Next)),
+ keycode_num_pad_prior_(XKeysymToKeycode(display_, XK_KP_Prior)),
+ keycode_num_pad_right_(XKeysymToKeycode(display_, XK_KP_Right)),
+ keycode_num_pad_up_(XKeysymToKeycode(display_, XK_KP_Up)),
+ keycode_super_l_(XKeysymToKeycode(display_, XK_Super_L)),
+ keycode_super_r_(XKeysymToKeycode(display_, XK_Super_R)),
+ keycode_void_symbol_(XKeysymToKeycode(display_, XK_VoidSymbol)) {
+ }
+ virtual ~KeyRewriterTest() {}
+
+ protected:
+ Display* display_;
+ const KeyCode keycode_a_;
+ const KeyCode keycode_alt_l_;
+ const KeyCode keycode_alt_r_;
+ const KeyCode keycode_b_;
+ const KeyCode keycode_caps_lock_;
+ const KeyCode keycode_control_l_;
+ const KeyCode keycode_control_r_;
+ const KeyCode keycode_meta_l_;
+ const KeyCode keycode_meta_r_;
+ const KeyCode keycode_num_pad_0_;
+ const KeyCode keycode_num_pad_1_;
+ const KeyCode keycode_num_pad_2_;
+ const KeyCode keycode_num_pad_3_;
+ const KeyCode keycode_num_pad_4_;
+ const KeyCode keycode_num_pad_5_;
+ const KeyCode keycode_num_pad_6_;
+ const KeyCode keycode_num_pad_7_;
+ const KeyCode keycode_num_pad_8_;
+ const KeyCode keycode_num_pad_9_;
+ const KeyCode keycode_num_pad_begin_;
+ const KeyCode keycode_num_pad_decimal_;
+ const KeyCode keycode_num_pad_delete_;
+ const KeyCode keycode_num_pad_down_;
+ const KeyCode keycode_num_pad_end_;
+ const KeyCode keycode_num_pad_home_;
+ const KeyCode keycode_num_pad_insert_;
+ const KeyCode keycode_num_pad_left_;
+ const KeyCode keycode_num_pad_next_;
+ const KeyCode keycode_num_pad_prior_;
+ const KeyCode keycode_num_pad_right_;
+ const KeyCode keycode_num_pad_up_;
+ const KeyCode keycode_super_l_;
+ const KeyCode keycode_super_r_;
+ const KeyCode keycode_void_symbol_;
+};
+
} // namespace
#endif
-TEST(KeyRewriterTest, TestGetDeviceType) {
+TEST_F(KeyRewriterTest, TestGetDeviceType) {
// This is the typical string which an Apple keyboard sends.
EXPECT_EQ(KeyRewriter::kDeviceAppleKeyboard,
KeyRewriter::GetDeviceType("Apple Inc. Apple Keyboard"));
@@ -68,7 +181,7 @@ TEST(KeyRewriterTest, TestGetDeviceType) {
KeyRewriter::GetDeviceType("not-an-apple keyboard"));
}
-TEST(KeyRewriterTest, TestDeviceAddedOrRemoved) {
+TEST_F(KeyRewriterTest, TestDeviceAddedOrRemoved) {
KeyRewriter rewriter;
EXPECT_TRUE(rewriter.device_id_to_type_for_testing().empty());
EXPECT_EQ(KeyRewriter::kDeviceUnknown,
@@ -84,483 +197,1176 @@ TEST(KeyRewriterTest, TestDeviceAddedOrRemoved) {
}
#if defined(OS_CHROMEOS)
-TEST(KeyRewriterTest, TestRewriteCommandToControl) {
- XEvent xev;
-
- const unsigned int kKeycodeA =
- XKeysymToKeycode(ui::GetXDisplay(), XK_a);
- const unsigned int kKeycodeSuperL =
- XKeysymToKeycode(ui::GetXDisplay(), XK_Super_L);
- const unsigned int kKeycodeSuperR =
- XKeysymToKeycode(ui::GetXDisplay(), XK_Super_R);
- const unsigned int kKeycodeControlL =
- XKeysymToKeycode(ui::GetXDisplay(), XK_Control_L);
- const unsigned int kKeycodeControlR =
- XKeysymToKeycode(ui::GetXDisplay(), XK_Control_R);
-
+TEST_F(KeyRewriterTest, TestRewriteCommandToControl) {
// First, test with a PC keyboard.
+ TestingPrefService prefs;
KeyRewriter rewriter;
rewriter.DeviceAddedForTesting(0, "PC Keyboard");
rewriter.set_last_device_id_for_testing(0);
- {
- // XK_a, Alt modifier.
- InitXKeyEvent(ui::VKEY_A, ui::EF_ALT_DOWN, kKeycodeA, Mod1Mask, &xev);
- aura::KeyEvent keyevent(&xev, false /* is_char */);
- rewriter.RewriteForTesting(&keyevent);
- EXPECT_EQ(ui::VKEY_A, keyevent.key_code());
- EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags());
- const XKeyEvent& xkey = keyevent.native_event()->xkey;
- EXPECT_EQ(kKeycodeA, xkey.keycode);
- EXPECT_EQ(static_cast<unsigned int>(Mod1Mask), xkey.state);
- }
- {
- // XK_a, Win modifier.
- InitXKeyEvent(ui::VKEY_A, 0, kKeycodeA, Mod4Mask, &xev);
- aura::KeyEvent keyevent(&xev, false /* is_char */);
- rewriter.RewriteForTesting(&keyevent);
- EXPECT_EQ(ui::VKEY_A, keyevent.key_code());
- EXPECT_EQ(0, keyevent.flags());
- const XKeyEvent& xkey = keyevent.native_event()->xkey;
- EXPECT_EQ(kKeycodeA, xkey.keycode);
- EXPECT_EQ(static_cast<unsigned int>(Mod4Mask), xkey.state);
- }
- {
- // XK_a, Alt+Win modifier.
- InitXKeyEvent(ui::VKEY_A, ui::EF_ALT_DOWN,
- kKeycodeA, Mod1Mask | Mod4Mask, &xev);
- aura::KeyEvent keyevent(&xev, false /* is_char */);
- rewriter.RewriteForTesting(&keyevent);
- EXPECT_EQ(ui::VKEY_A, keyevent.key_code());
- EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags());
- const XKeyEvent& xkey = keyevent.native_event()->xkey;
- EXPECT_EQ(kKeycodeA, xkey.keycode);
- EXPECT_EQ(static_cast<unsigned int>(Mod1Mask | Mod4Mask), xkey.state);
- }
- {
- // XK_Super_L (left Windows key), Alt modifier.
- InitXKeyEvent(ui::VKEY_LWIN, ui::EF_ALT_DOWN,
- kKeycodeSuperL, Mod1Mask, &xev);
- aura::KeyEvent keyevent(&xev, false /* is_char */);
- rewriter.RewriteForTesting(&keyevent);
- EXPECT_EQ(ui::VKEY_LWIN, keyevent.key_code());
- EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags());
- const XKeyEvent& xkey = keyevent.native_event()->xkey;
- EXPECT_EQ(kKeycodeSuperL, xkey.keycode);
- EXPECT_EQ(static_cast<unsigned int>(Mod1Mask), xkey.state);
- }
- {
- // XK_Super_R (right Windows key), Alt modifier.
- InitXKeyEvent(ui::VKEY_RWIN, ui::EF_ALT_DOWN,
- kKeycodeSuperR, Mod1Mask, &xev);
- aura::KeyEvent keyevent(&xev, false /* is_char */);
- rewriter.RewriteForTesting(&keyevent);
- EXPECT_EQ(ui::VKEY_RWIN, keyevent.key_code());
- EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags());
- const XKeyEvent& xkey = keyevent.native_event()->xkey;
- EXPECT_EQ(kKeycodeSuperR, xkey.keycode);
- EXPECT_EQ(static_cast<unsigned int>(Mod1Mask), xkey.state);
- }
+ rewriter.set_pref_service_for_testing(&prefs);
+
+ // XK_a, Alt modifier.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_a_,
+ Mod1Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_A,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_a_,
+ Mod1Mask));
+
+ // XK_a, Win modifier.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_a_,
+ Mod4Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_A,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_a_,
+ Mod4Mask));
+
+ // XK_a, Alt+Win modifier.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_a_,
+ Mod1Mask | Mod4Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_A,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_a_,
+ Mod1Mask | Mod4Mask));
+
+ // XK_Super_L (left Windows key), Alt modifier.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_LWIN,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_super_l_,
+ Mod1Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_LWIN,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_super_l_,
+ Mod1Mask));
+
+ // XK_Super_R (right Windows key), Alt modifier.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_RWIN,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_super_r_,
+ Mod1Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_RWIN,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_super_r_,
+ Mod1Mask));
// An Apple keyboard reuse the ID, zero.
rewriter.DeviceAddedForTesting(0, "Apple Keyboard");
rewriter.set_last_device_id_for_testing(0);
- {
- // XK_a, Alt modifier.
- InitXKeyEvent(ui::VKEY_A, ui::EF_ALT_DOWN, kKeycodeA, Mod1Mask, &xev);
- aura::KeyEvent keyevent(&xev, false /* is_char */);
- rewriter.RewriteForTesting(&keyevent);
- EXPECT_EQ(ui::VKEY_A, keyevent.key_code());
- EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags());
- const XKeyEvent& xkey = keyevent.native_event()->xkey;
- EXPECT_EQ(kKeycodeA, xkey.keycode);
- EXPECT_EQ(static_cast<unsigned int>(Mod1Mask), xkey.state);
- }
- {
- // XK_a, Win modifier.
- InitXKeyEvent(ui::VKEY_A, 0, kKeycodeA, Mod4Mask, &xev);
- aura::KeyEvent keyevent(&xev, false /* is_char */);
- rewriter.RewriteForTesting(&keyevent);
- EXPECT_EQ(ui::VKEY_A, keyevent.key_code());
- EXPECT_EQ(ui::EF_CONTROL_DOWN, keyevent.flags());
- const XKeyEvent& xkey = keyevent.native_event()->xkey;
- EXPECT_EQ(kKeycodeA, xkey.keycode);
- EXPECT_EQ(static_cast<unsigned int>(ControlMask), xkey.state);
- }
- {
- // XK_a, Alt+Win modifier.
- InitXKeyEvent(ui::VKEY_A, ui::EF_ALT_DOWN,
- kKeycodeA, Mod1Mask | Mod4Mask, &xev);
- aura::KeyEvent keyevent(&xev, false /* is_char */);
- rewriter.RewriteForTesting(&keyevent);
- EXPECT_EQ(ui::VKEY_A, keyevent.key_code());
- EXPECT_EQ(ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, keyevent.flags());
- const XKeyEvent& xkey = keyevent.native_event()->xkey;
- EXPECT_EQ(kKeycodeA, xkey.keycode);
- EXPECT_EQ(static_cast<unsigned int>(Mod1Mask | ControlMask), xkey.state);
- }
- {
- // XK_Super_L (left Windows key), Alt modifier.
- InitXKeyEvent(ui::VKEY_LWIN, ui::EF_ALT_DOWN,
- kKeycodeSuperL, Mod1Mask, &xev);
- aura::KeyEvent keyevent(&xev, false /* is_char */);
- rewriter.RewriteForTesting(&keyevent);
- EXPECT_EQ(ui::VKEY_CONTROL, keyevent.key_code());
- EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags());
- const XKeyEvent& xkey = keyevent.native_event()->xkey;
- EXPECT_EQ(kKeycodeControlL, xkey.keycode);
- EXPECT_EQ(static_cast<unsigned int>(Mod1Mask), xkey.state);
- }
- {
- // XK_Super_R (right Windows key), Alt modifier.
- InitXKeyEvent(ui::VKEY_RWIN, ui::EF_ALT_DOWN,
- kKeycodeSuperR, Mod1Mask, &xev);
- aura::KeyEvent keyevent(&xev, false /* is_char */);
- rewriter.RewriteForTesting(&keyevent);
- EXPECT_EQ(ui::VKEY_CONTROL, keyevent.key_code());
- EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags());
- const XKeyEvent& xkey = keyevent.native_event()->xkey;
- EXPECT_EQ(kKeycodeControlR, xkey.keycode);
- EXPECT_EQ(static_cast<unsigned int>(Mod1Mask), xkey.state);
- }
-}
-TEST(KeyRewriterTest, TestRewriteNumPadKeys) {
- XEvent xev;
- Display* display = ui::GetXDisplay();
-
- const unsigned int kKeycodeNumPad0 = XKeysymToKeycode(display, XK_KP_0);
- const unsigned int kKeycodeNumPadDecimal =
- XKeysymToKeycode(display, XK_KP_Decimal);
- const unsigned int kKeycodeNumPad1 = XKeysymToKeycode(display, XK_KP_1);
- const unsigned int kKeycodeNumPad2 = XKeysymToKeycode(display, XK_KP_2);
- const unsigned int kKeycodeNumPad3 = XKeysymToKeycode(display, XK_KP_3);
- const unsigned int kKeycodeNumPad4 = XKeysymToKeycode(display, XK_KP_4);
- const unsigned int kKeycodeNumPad5 = XKeysymToKeycode(display, XK_KP_5);
- const unsigned int kKeycodeNumPad6 = XKeysymToKeycode(display, XK_KP_6);
- const unsigned int kKeycodeNumPad7 = XKeysymToKeycode(display, XK_KP_7);
- const unsigned int kKeycodeNumPad8 = XKeysymToKeycode(display, XK_KP_8);
- const unsigned int kKeycodeNumPad9 = XKeysymToKeycode(display, XK_KP_9);
-
- const unsigned int kKeycodeNumPadInsert =
- XKeysymToKeycode(display, XK_KP_Insert);
- const unsigned int kKeycodeNumPadDelete =
- XKeysymToKeycode(display, XK_KP_Delete);
- const unsigned int kKeycodeNumPadEnd = XKeysymToKeycode(display, XK_KP_End);
- const unsigned int kKeycodeNumPadDown = XKeysymToKeycode(display, XK_KP_Down);
- const unsigned int kKeycodeNumPadNext = XKeysymToKeycode(display, XK_KP_Next);
- const unsigned int kKeycodeNumPadLeft = XKeysymToKeycode(display, XK_KP_Left);
- const unsigned int kKeycodeNumPadBegin =
- XKeysymToKeycode(display, XK_KP_Begin);
- const unsigned int kKeycodeNumPadRight =
- XKeysymToKeycode(display, XK_KP_Right);
- const unsigned int kKeycodeNumPadHome = XKeysymToKeycode(display, XK_KP_Home);
- const unsigned int kKeycodeNumPadUp = XKeysymToKeycode(display, XK_KP_Up);
- const unsigned int kKeycodeNumPadPrior =
- XKeysymToKeycode(display, XK_KP_Prior);
+ // XK_a, Alt modifier.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_a_,
+ Mod1Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_A,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_a_,
+ Mod1Mask));
- KeyRewriter rewriter;
- {
- // XK_KP_Insert (= NumPad 0 without Num Lock), no modifier.
- InitXKeyEvent(ui::VKEY_INSERT, 0, kKeycodeNumPadInsert, 0, &xev);
- aura::KeyEvent keyevent(&xev, false /* is_char */);
- rewriter.RewriteForTesting(&keyevent);
- EXPECT_EQ(ui::VKEY_NUMPAD0, keyevent.key_code());
- EXPECT_EQ(0, keyevent.flags());
- const XKeyEvent& xkey = keyevent.native_event()->xkey;
- EXPECT_EQ(kKeycodeNumPad0, xkey.keycode);
- // Mod2Mask means Num Lock.
- EXPECT_EQ(static_cast<unsigned int>(Mod2Mask), xkey.state);
- }
- {
- // XK_KP_Insert (= NumPad 0 without Num Lock), Alt modifier.
- InitXKeyEvent(ui::VKEY_INSERT, ui::EF_ALT_DOWN,
- kKeycodeNumPadInsert, Mod1Mask, &xev);
- aura::KeyEvent keyevent(&xev, false /* is_char */);
- rewriter.RewriteForTesting(&keyevent);
- EXPECT_EQ(ui::VKEY_NUMPAD0, keyevent.key_code());
- EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags());
- const XKeyEvent& xkey = keyevent.native_event()->xkey;
- EXPECT_EQ(kKeycodeNumPad0, xkey.keycode);
- EXPECT_EQ(static_cast<unsigned int>(Mod1Mask | Mod2Mask), xkey.state);
- }
- {
- // XK_KP_Delete (= NumPad . without Num Lock), Alt modifier.
- InitXKeyEvent(ui::VKEY_DELETE, ui::EF_ALT_DOWN,
- kKeycodeNumPadDelete, Mod1Mask, &xev);
- aura::KeyEvent keyevent(&xev, false /* is_char */);
- rewriter.RewriteForTesting(&keyevent);
- EXPECT_EQ(ui::VKEY_DECIMAL, keyevent.key_code());
- EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags());
- const XKeyEvent& xkey = keyevent.native_event()->xkey;
- EXPECT_EQ(kKeycodeNumPadDecimal, xkey.keycode);
- EXPECT_EQ(static_cast<unsigned int>(Mod1Mask | Mod2Mask), xkey.state);
- }
- {
- // XK_KP_End (= NumPad 1 without Num Lock), Alt modifier.
- InitXKeyEvent(ui::VKEY_END, ui::EF_ALT_DOWN,
- kKeycodeNumPadEnd, Mod1Mask, &xev);
- aura::KeyEvent keyevent(&xev, false /* is_char */);
- rewriter.RewriteForTesting(&keyevent);
- EXPECT_EQ(ui::VKEY_NUMPAD1, keyevent.key_code());
- EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags());
- const XKeyEvent& xkey = keyevent.native_event()->xkey;
- EXPECT_EQ(kKeycodeNumPad1, xkey.keycode);
- EXPECT_EQ(static_cast<unsigned int>(Mod1Mask | Mod2Mask), xkey.state);
- }
- {
- // XK_KP_Down (= NumPad 2 without Num Lock), Alt modifier.
- InitXKeyEvent(ui::VKEY_DOWN, ui::EF_ALT_DOWN,
- kKeycodeNumPadDown, Mod1Mask, &xev);
- aura::KeyEvent keyevent(&xev, false /* is_char */);
- rewriter.RewriteForTesting(&keyevent);
- EXPECT_EQ(ui::VKEY_NUMPAD2, keyevent.key_code());
- EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags());
- const XKeyEvent& xkey = keyevent.native_event()->xkey;
- EXPECT_EQ(kKeycodeNumPad2, xkey.keycode);
- EXPECT_EQ(static_cast<unsigned int>(Mod1Mask | Mod2Mask), xkey.state);
- }
- {
- // XK_KP_Next (= NumPad 3 without Num Lock), Alt modifier.
- InitXKeyEvent(ui::VKEY_NEXT, ui::EF_ALT_DOWN,
- kKeycodeNumPadNext, Mod1Mask, &xev);
- aura::KeyEvent keyevent(&xev, false /* is_char */);
- rewriter.RewriteForTesting(&keyevent);
- EXPECT_EQ(ui::VKEY_NUMPAD3, keyevent.key_code());
- EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags());
- const XKeyEvent& xkey = keyevent.native_event()->xkey;
- EXPECT_EQ(kKeycodeNumPad3, xkey.keycode);
- EXPECT_EQ(static_cast<unsigned int>(Mod1Mask | Mod2Mask), xkey.state);
- }
- {
- // XK_KP_Left (= NumPad 4 without Num Lock), Alt modifier.
- InitXKeyEvent(ui::VKEY_LEFT, ui::EF_ALT_DOWN,
- kKeycodeNumPadLeft, Mod1Mask, &xev);
- aura::KeyEvent keyevent(&xev, false /* is_char */);
- rewriter.RewriteForTesting(&keyevent);
- EXPECT_EQ(ui::VKEY_NUMPAD4, keyevent.key_code());
- EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags());
- const XKeyEvent& xkey = keyevent.native_event()->xkey;
- EXPECT_EQ(kKeycodeNumPad4, xkey.keycode);
- EXPECT_EQ(static_cast<unsigned int>(Mod1Mask | Mod2Mask), xkey.state);
- }
- {
- // XK_KP_Begin (= NumPad 5 without Num Lock), Alt modifier.
- InitXKeyEvent(ui::VKEY_CLEAR, ui::EF_ALT_DOWN,
- kKeycodeNumPadBegin, Mod1Mask, &xev);
- aura::KeyEvent keyevent(&xev, false /* is_char */);
- rewriter.RewriteForTesting(&keyevent);
- EXPECT_EQ(ui::VKEY_NUMPAD5, keyevent.key_code());
- EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags());
- const XKeyEvent& xkey = keyevent.native_event()->xkey;
- EXPECT_EQ(kKeycodeNumPad5, xkey.keycode);
- EXPECT_EQ(static_cast<unsigned int>(Mod1Mask | Mod2Mask), xkey.state);
- }
- {
- // XK_KP_Right (= NumPad 6 without Num Lock), Alt modifier.
- InitXKeyEvent(ui::VKEY_RIGHT, ui::EF_ALT_DOWN,
- kKeycodeNumPadRight, Mod1Mask, &xev);
- aura::KeyEvent keyevent(&xev, false /* is_char */);
- rewriter.RewriteForTesting(&keyevent);
- EXPECT_EQ(ui::VKEY_NUMPAD6, keyevent.key_code());
- EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags());
- const XKeyEvent& xkey = keyevent.native_event()->xkey;
- EXPECT_EQ(kKeycodeNumPad6, xkey.keycode);
- EXPECT_EQ(static_cast<unsigned int>(Mod1Mask | Mod2Mask), xkey.state);
- }
- {
- // XK_KP_Home (= NumPad 7 without Num Lock), Alt modifier.
- InitXKeyEvent(ui::VKEY_HOME, ui::EF_ALT_DOWN,
- kKeycodeNumPadHome, Mod1Mask, &xev);
- aura::KeyEvent keyevent(&xev, false /* is_char */);
- rewriter.RewriteForTesting(&keyevent);
- EXPECT_EQ(ui::VKEY_NUMPAD7, keyevent.key_code());
- EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags());
- const XKeyEvent& xkey = keyevent.native_event()->xkey;
- EXPECT_EQ(kKeycodeNumPad7, xkey.keycode);
- EXPECT_EQ(static_cast<unsigned int>(Mod1Mask | Mod2Mask), xkey.state);
- }
- {
- // XK_KP_Up (= NumPad 8 without Num Lock), Alt modifier.
- InitXKeyEvent(ui::VKEY_UP, ui::EF_ALT_DOWN,
- kKeycodeNumPadUp, Mod1Mask, &xev);
- aura::KeyEvent keyevent(&xev, false /* is_char */);
- rewriter.RewriteForTesting(&keyevent);
- EXPECT_EQ(ui::VKEY_NUMPAD8, keyevent.key_code());
- EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags());
- const XKeyEvent& xkey = keyevent.native_event()->xkey;
- EXPECT_EQ(kKeycodeNumPad8, xkey.keycode);
- EXPECT_EQ(static_cast<unsigned int>(Mod1Mask | Mod2Mask), xkey.state);
- }
- {
- // XK_KP_Prior (= NumPad 9 without Num Lock), Alt modifier.
- InitXKeyEvent(ui::VKEY_PRIOR, ui::EF_ALT_DOWN,
- kKeycodeNumPadPrior, Mod1Mask, &xev);
- aura::KeyEvent keyevent(&xev, false /* is_char */);
- rewriter.RewriteForTesting(&keyevent);
- EXPECT_EQ(ui::VKEY_NUMPAD9, keyevent.key_code());
- EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags());
- const XKeyEvent& xkey = keyevent.native_event()->xkey;
- EXPECT_EQ(kKeycodeNumPad9, xkey.keycode);
- EXPECT_EQ(static_cast<unsigned int>(Mod1Mask | Mod2Mask), xkey.state);
- }
- {
- // XK_KP_0 (= NumPad 0 with Num Lock), Num Lock modifier.
- InitXKeyEvent(ui::VKEY_NUMPAD0, 0, kKeycodeNumPad0, Mod2Mask, &xev);
- aura::KeyEvent keyevent(&xev, false /* is_char */);
- rewriter.RewriteForTesting(&keyevent);
- EXPECT_EQ(ui::VKEY_NUMPAD0, keyevent.key_code());
- EXPECT_EQ(0, keyevent.flags());
- const XKeyEvent& xkey = keyevent.native_event()->xkey;
- EXPECT_EQ(kKeycodeNumPad0, xkey.keycode);
- EXPECT_EQ(static_cast<unsigned int>(Mod2Mask), xkey.state);
- }
- {
- // XK_KP_DECIMAL (= NumPad . with Num Lock), Num Lock modifier.
- InitXKeyEvent(ui::VKEY_DECIMAL, 0, kKeycodeNumPadDecimal, Mod2Mask, &xev);
- aura::KeyEvent keyevent(&xev, false /* is_char */);
- rewriter.RewriteForTesting(&keyevent);
- EXPECT_EQ(ui::VKEY_DECIMAL, keyevent.key_code());
- EXPECT_EQ(0, keyevent.flags());
- const XKeyEvent& xkey = keyevent.native_event()->xkey;
- EXPECT_EQ(kKeycodeNumPadDecimal, xkey.keycode);
- EXPECT_EQ(static_cast<unsigned int>(Mod2Mask), xkey.state);
- }
- {
- // XK_KP_1 (= NumPad 1 with Num Lock), Num Lock modifier.
- InitXKeyEvent(ui::VKEY_NUMPAD1, 0, kKeycodeNumPad1, Mod2Mask, &xev);
- aura::KeyEvent keyevent(&xev, false /* is_char */);
- rewriter.RewriteForTesting(&keyevent);
- EXPECT_EQ(ui::VKEY_NUMPAD1, keyevent.key_code());
- EXPECT_EQ(0, keyevent.flags());
- const XKeyEvent& xkey = keyevent.native_event()->xkey;
- EXPECT_EQ(kKeycodeNumPad1, xkey.keycode);
- EXPECT_EQ(static_cast<unsigned int>(Mod2Mask), xkey.state);
- }
- {
- // XK_KP_2 (= NumPad 2 with Num Lock), Num Lock modifier.
- InitXKeyEvent(ui::VKEY_NUMPAD2, 0, kKeycodeNumPad2, Mod2Mask, &xev);
- aura::KeyEvent keyevent(&xev, false /* is_char */);
- rewriter.RewriteForTesting(&keyevent);
- EXPECT_EQ(ui::VKEY_NUMPAD2, keyevent.key_code());
- EXPECT_EQ(0, keyevent.flags());
- const XKeyEvent& xkey = keyevent.native_event()->xkey;
- EXPECT_EQ(kKeycodeNumPad2, xkey.keycode);
- EXPECT_EQ(static_cast<unsigned int>(Mod2Mask), xkey.state);
- }
- {
- // XK_KP_3 (= NumPad 3 with Num Lock), Num Lock modifier.
- InitXKeyEvent(ui::VKEY_NUMPAD3, 0, kKeycodeNumPad3, Mod2Mask, &xev);
- aura::KeyEvent keyevent(&xev, false /* is_char */);
- rewriter.RewriteForTesting(&keyevent);
- EXPECT_EQ(ui::VKEY_NUMPAD3, keyevent.key_code());
- EXPECT_EQ(0, keyevent.flags());
- const XKeyEvent& xkey = keyevent.native_event()->xkey;
- EXPECT_EQ(kKeycodeNumPad3, xkey.keycode);
- EXPECT_EQ(static_cast<unsigned int>(Mod2Mask), xkey.state);
- }
- {
- // XK_KP_4 (= NumPad 4 with Num Lock), Num Lock modifier.
- InitXKeyEvent(ui::VKEY_NUMPAD4, 0, kKeycodeNumPad4, Mod2Mask, &xev);
- aura::KeyEvent keyevent(&xev, false /* is_char */);
- rewriter.RewriteForTesting(&keyevent);
- EXPECT_EQ(ui::VKEY_NUMPAD4, keyevent.key_code());
- EXPECT_EQ(0, keyevent.flags());
- const XKeyEvent& xkey = keyevent.native_event()->xkey;
- EXPECT_EQ(kKeycodeNumPad4, xkey.keycode);
- EXPECT_EQ(static_cast<unsigned int>(Mod2Mask), xkey.state);
- }
- {
- // XK_KP_5 (= NumPad 5 with Num Lock), Num Lock modifier.
- InitXKeyEvent(ui::VKEY_NUMPAD5, 0, kKeycodeNumPad5, Mod2Mask, &xev);
- aura::KeyEvent keyevent(&xev, false /* is_char */);
- rewriter.RewriteForTesting(&keyevent);
- EXPECT_EQ(ui::VKEY_NUMPAD5, keyevent.key_code());
- EXPECT_EQ(0, keyevent.flags());
- const XKeyEvent& xkey = keyevent.native_event()->xkey;
- EXPECT_EQ(kKeycodeNumPad5, xkey.keycode);
- EXPECT_EQ(static_cast<unsigned int>(Mod2Mask), xkey.state);
- }
- {
- // XK_KP_6 (= NumPad 6 with Num Lock), Num Lock modifier.
- InitXKeyEvent(ui::VKEY_NUMPAD6, 0, kKeycodeNumPad6, Mod2Mask, &xev);
- aura::KeyEvent keyevent(&xev, false /* is_char */);
- rewriter.RewriteForTesting(&keyevent);
- EXPECT_EQ(ui::VKEY_NUMPAD6, keyevent.key_code());
- EXPECT_EQ(0, keyevent.flags());
- const XKeyEvent& xkey = keyevent.native_event()->xkey;
- EXPECT_EQ(kKeycodeNumPad6, xkey.keycode);
- EXPECT_EQ(static_cast<unsigned int>(Mod2Mask), xkey.state);
- }
- {
- // XK_KP_7 (= NumPad 7 with Num Lock), Num Lock modifier.
- InitXKeyEvent(ui::VKEY_NUMPAD7, 0, kKeycodeNumPad7, Mod2Mask, &xev);
- aura::KeyEvent keyevent(&xev, false /* is_char */);
- rewriter.RewriteForTesting(&keyevent);
- EXPECT_EQ(ui::VKEY_NUMPAD7, keyevent.key_code());
- EXPECT_EQ(0, keyevent.flags());
- const XKeyEvent& xkey = keyevent.native_event()->xkey;
- EXPECT_EQ(kKeycodeNumPad7, xkey.keycode);
- EXPECT_EQ(static_cast<unsigned int>(Mod2Mask), xkey.state);
- }
- {
- // XK_KP_8 (= NumPad 8 with Num Lock), Num Lock modifier.
- InitXKeyEvent(ui::VKEY_NUMPAD8, 0, kKeycodeNumPad8, Mod2Mask, &xev);
- aura::KeyEvent keyevent(&xev, false /* is_char */);
- rewriter.RewriteForTesting(&keyevent);
- EXPECT_EQ(ui::VKEY_NUMPAD8, keyevent.key_code());
- EXPECT_EQ(0, keyevent.flags());
- const XKeyEvent& xkey = keyevent.native_event()->xkey;
- EXPECT_EQ(kKeycodeNumPad8, xkey.keycode);
- EXPECT_EQ(static_cast<unsigned int>(Mod2Mask), xkey.state);
- }
- {
- // XK_KP_9 (= NumPad 9 with Num Lock), Num Lock modifier.
- InitXKeyEvent(ui::VKEY_NUMPAD9, 0, kKeycodeNumPad9, Mod2Mask, &xev);
- aura::KeyEvent keyevent(&xev, false /* is_char */);
- rewriter.RewriteForTesting(&keyevent);
- EXPECT_EQ(ui::VKEY_NUMPAD9, keyevent.key_code());
- EXPECT_EQ(0, keyevent.flags());
- const XKeyEvent& xkey = keyevent.native_event()->xkey;
- EXPECT_EQ(kKeycodeNumPad9, xkey.keycode);
- EXPECT_EQ(static_cast<unsigned int>(Mod2Mask), xkey.state);
- }
+ // XK_a, Win modifier.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A,
+ ui::EF_CONTROL_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_a_,
+ ControlMask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_A,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_a_,
+ Mod4Mask));
+
+ // XK_a, Alt+Win modifier.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A,
+ ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_a_,
+ Mod1Mask | ControlMask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_A,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_a_,
+ Mod1Mask | Mod4Mask));
+
+ // XK_Super_L (left Windows key), Alt modifier.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_control_l_,
+ Mod1Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_LWIN,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_super_l_,
+ Mod1Mask));
+
+ // XK_Super_R (right Windows key), Alt modifier.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_control_r_,
+ Mod1Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_RWIN,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_super_r_,
+ Mod1Mask));
}
-// Tests if the rewriter can handle a Command + Num Pad event.
-TEST(KeyRewriterTest, TestRewriteNumPadKeysOnAppleKeyboard) {
- XEvent xev;
- Display* display = ui::GetXDisplay();
+TEST_F(KeyRewriterTest, TestRewriteNumPadKeys) {
+ TestingPrefService prefs;
+ KeyRewriter rewriter;
+ rewriter.set_pref_service_for_testing(&prefs);
+
+ // XK_KP_Insert (= NumPad 0 without Num Lock), no modifier.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD0,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_0_,
+ Mod2Mask, // Num Lock
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_INSERT,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_insert_,
+ 0));
+
+ // XK_KP_Insert (= NumPad 0 without Num Lock), Alt modifier.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD0,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_0_,
+ Mod1Mask | Mod2Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_INSERT,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_insert_,
+ Mod1Mask));
+
+ // XK_KP_Delete (= NumPad . without Num Lock), Alt modifier.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_DECIMAL,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_decimal_,
+ Mod1Mask | Mod2Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_DELETE,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_delete_,
+ Mod1Mask));
+
+ // XK_KP_End (= NumPad 1 without Num Lock), Alt modifier.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD1,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_1_,
+ Mod1Mask | Mod2Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_END,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_end_,
+ Mod1Mask));
+
+ // XK_KP_Down (= NumPad 2 without Num Lock), Alt modifier.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD2,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_2_,
+ Mod1Mask | Mod2Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_DOWN,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_down_,
+ Mod1Mask));
+
+ // XK_KP_Next (= NumPad 3 without Num Lock), Alt modifier.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD3,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_3_,
+ Mod1Mask | Mod2Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_NEXT,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_next_,
+ Mod1Mask));
+
+ // XK_KP_Left (= NumPad 4 without Num Lock), Alt modifier.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD4,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_4_,
+ Mod1Mask | Mod2Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_LEFT,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_left_,
+ Mod1Mask));
+
+ // XK_KP_Begin (= NumPad 5 without Num Lock), Alt modifier.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD5,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_5_,
+ Mod1Mask | Mod2Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_CLEAR,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_begin_,
+ Mod1Mask));
+
+ // XK_KP_Right (= NumPad 6 without Num Lock), Alt modifier.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD6,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_6_,
+ Mod1Mask | Mod2Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_RIGHT,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_right_,
+ Mod1Mask));
+
+ // XK_KP_Home (= NumPad 7 without Num Lock), Alt modifier.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD7,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_7_,
+ Mod1Mask | Mod2Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_HOME,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_home_,
+ Mod1Mask));
+
+ // XK_KP_Up (= NumPad 8 without Num Lock), Alt modifier.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD8,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_8_,
+ Mod1Mask | Mod2Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_UP,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_up_,
+ Mod1Mask));
+
+ // XK_KP_Prior (= NumPad 9 without Num Lock), Alt modifier.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD9,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_9_,
+ Mod1Mask | Mod2Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_PRIOR,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_prior_,
+ Mod1Mask));
+
+ // XK_KP_0 (= NumPad 0 with Num Lock), Num Lock modifier.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD0,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_0_,
+ Mod2Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_NUMPAD0,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_0_,
+ Mod2Mask));
+
+ // XK_KP_DECIMAL (= NumPad . with Num Lock), Num Lock modifier.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_DECIMAL,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_decimal_,
+ Mod2Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_DECIMAL,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_decimal_,
+ Mod2Mask));
+
+ // XK_KP_1 (= NumPad 1 with Num Lock), Num Lock modifier.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD1,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_1_,
+ Mod2Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_NUMPAD1,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_1_,
+ Mod2Mask));
+
+ // XK_KP_2 (= NumPad 2 with Num Lock), Num Lock modifier.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD2,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_2_,
+ Mod2Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_NUMPAD2,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_2_,
+ Mod2Mask));
+
+ // XK_KP_3 (= NumPad 3 with Num Lock), Num Lock modifier.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD3,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_3_,
+ Mod2Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_NUMPAD3,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_3_,
+ Mod2Mask));
- const unsigned int kKeycodeNumPadEnd = XKeysymToKeycode(display, XK_KP_End);
- const unsigned int kKeycodeNumPad1 = XKeysymToKeycode(display, XK_KP_1);
+ // XK_KP_4 (= NumPad 4 with Num Lock), Num Lock modifier.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD4,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_4_,
+ Mod2Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_NUMPAD4,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_4_,
+ Mod2Mask));
+ // XK_KP_5 (= NumPad 5 with Num Lock), Num Lock modifier.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD5,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_5_,
+ Mod2Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_NUMPAD5,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_5_,
+ Mod2Mask));
+
+ // XK_KP_6 (= NumPad 6 with Num Lock), Num Lock modifier.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD6,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_6_,
+ Mod2Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_NUMPAD6,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_6_,
+ Mod2Mask));
+
+ // XK_KP_7 (= NumPad 7 with Num Lock), Num Lock modifier.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD7,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_7_,
+ Mod2Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_NUMPAD7,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_7_,
+ Mod2Mask));
+
+ // XK_KP_8 (= NumPad 8 with Num Lock), Num Lock modifier.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD8,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_8_,
+ Mod2Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_NUMPAD8,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_8_,
+ Mod2Mask));
+
+ // XK_KP_9 (= NumPad 9 with Num Lock), Num Lock modifier.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD9,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_9_,
+ Mod2Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_NUMPAD9,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_9_,
+ Mod2Mask));
+}
+
+// Tests if the rewriter can handle a Command + Num Pad event.
+TEST_F(KeyRewriterTest, TestRewriteNumPadKeysOnAppleKeyboard) {
+ TestingPrefService prefs;
KeyRewriter rewriter;
rewriter.DeviceAddedForTesting(0, "Apple Keyboard");
rewriter.set_last_device_id_for_testing(0);
- {
- // XK_KP_End (= NumPad 1 without Num Lock), Win modifier.
- InitXKeyEvent(ui::VKEY_END, 0, kKeycodeNumPadEnd, Mod4Mask, &xev);
- aura::KeyEvent keyevent(&xev, false /* is_char */);
- rewriter.RewriteForTesting(&keyevent);
- // The result should be "Num Pad 1 with Control + Num Lock modifiers".
- EXPECT_EQ(ui::VKEY_NUMPAD1, keyevent.key_code());
- EXPECT_EQ(ui::EF_CONTROL_DOWN, keyevent.flags());
- const XKeyEvent& xkey = keyevent.native_event()->xkey;
- EXPECT_EQ(kKeycodeNumPad1, xkey.keycode);
- EXPECT_EQ(static_cast<unsigned int>(ControlMask | Mod2Mask), xkey.state);
- }
- {
- // XK_KP_1 (= NumPad 1 without Num Lock), Win modifier.
- InitXKeyEvent(ui::VKEY_NUMPAD1, 0, kKeycodeNumPadEnd, Mod4Mask, &xev);
- aura::KeyEvent keyevent(&xev, false /* is_char */);
- rewriter.RewriteForTesting(&keyevent);
- // The result should also be "Num Pad 1 with Control + Num Lock modifiers".
- EXPECT_EQ(ui::VKEY_NUMPAD1, keyevent.key_code());
- EXPECT_EQ(ui::EF_CONTROL_DOWN, keyevent.flags());
- const XKeyEvent& xkey = keyevent.native_event()->xkey;
- EXPECT_EQ(kKeycodeNumPad1, xkey.keycode);
- EXPECT_EQ(static_cast<unsigned int>(ControlMask | Mod2Mask), xkey.state);
- }
+ rewriter.set_pref_service_for_testing(&prefs);
+
+ // XK_KP_End (= NumPad 1 without Num Lock), Win modifier.
+ // The result should be "Num Pad 1 with Control + Num Lock modifiers".
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD1,
+ ui::EF_CONTROL_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_1_,
+ ControlMask | Mod2Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_END,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_end_,
+ Mod4Mask));
+
+ // XK_KP_1 (= NumPad 1 without Num Lock), Win modifier.
+ // The result should also be "Num Pad 1 with Control + Num Lock modifiers".
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD1,
+ ui::EF_CONTROL_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_1_,
+ ControlMask | Mod2Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_NUMPAD1,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_num_pad_end_,
+ Mod4Mask));
+}
+
+TEST_F(KeyRewriterTest, TestRewriteModifiersNoRemap) {
+ TestingPrefService prefs;
+ KeyRewriter rewriter;
+ rewriter.set_pref_service_for_testing(&prefs);
+
+ // Press Search. Confirm the event is not rewritten.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_LWIN,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_super_l_,
+ 0U,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_LWIN,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_super_l_,
+ 0U));
+
+ // Press left Control. Confirm the event is not rewritten.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_control_l_,
+ 0U,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_CONTROL,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_control_l_,
+ 0U));
+
+ // Press right Control. Confirm the event is not rewritten.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_control_r_,
+ 0U,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_CONTROL,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_control_r_,
+ 0U));
+
+ // Press left Alt. Confirm the event is not rewritten.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_alt_l_,
+ 0,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_MENU,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_alt_l_,
+ 0U));
+
+ // Press right Alt. Confirm the event is not rewritten.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_alt_r_,
+ 0,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_MENU,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_alt_r_,
+ 0U));
+
+ // Test KeyRelease event, just in case.
+ // Release Search. Confirm the release event is not rewritten.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_LWIN,
+ 0,
+ ui::ET_KEY_RELEASED,
+ keycode_super_l_,
+ Mod4Mask,
+ KeyRelease),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_LWIN,
+ 0,
+ ui::ET_KEY_RELEASED,
+ keycode_super_l_,
+ Mod4Mask));
+}
+
+TEST_F(KeyRewriterTest, TestRewriteModifiersNoRemapMultipleKeys) {
+ TestingPrefService prefs;
+ KeyRewriter rewriter;
+ rewriter.set_pref_service_for_testing(&prefs);
+
+ // Press left Alt with Shift. Confirm the event is not rewritten.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU,
+ ui::EF_SHIFT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_meta_l_,
+ ShiftMask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_MENU,
+ ui::EF_SHIFT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_meta_l_,
+ ShiftMask));
+
+ // Press right Alt with Shift. Confirm the event is not rewritten.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU,
+ ui::EF_SHIFT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_meta_r_,
+ ShiftMask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_MENU,
+ ui::EF_SHIFT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_meta_r_,
+ ShiftMask));
+
+ // Press Search with Caps Lock mask. Confirm the event is not rewritten.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_LWIN,
+ ui::EF_CAPS_LOCK_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_super_l_,
+ LockMask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_LWIN,
+ ui::EF_CAPS_LOCK_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_super_l_,
+ LockMask));
+
+ // Release Search with Caps Lock mask. Confirm the event is not rewritten.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_LWIN,
+ ui::EF_CAPS_LOCK_DOWN,
+ ui::ET_KEY_RELEASED,
+ keycode_super_l_,
+ LockMask | Mod4Mask,
+ KeyRelease),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_LWIN,
+ ui::EF_CAPS_LOCK_DOWN,
+ ui::ET_KEY_RELEASED,
+ keycode_super_l_,
+ LockMask | Mod4Mask));
+
+ // Press Shift+Ctrl+Alt+Search+A. Confirm the event is not rewritten.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_B,
+ ui::EF_SHIFT_DOWN |
+ ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_b_,
+ ShiftMask | ControlMask | Mod1Mask |
+ Mod4Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_B,
+ ui::EF_SHIFT_DOWN |
+ ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_b_,
+ ShiftMask | ControlMask | Mod1Mask |
+ Mod4Mask));
}
+TEST_F(KeyRewriterTest, TestRewriteModifiersDisableSome) {
+ // Disable Search and Control keys.
+ TestingPrefService prefs;
+ chromeos::Preferences::RegisterUserPrefs(&prefs);
+ IntegerPrefMember search;
+ search.Init(prefs::kLanguageXkbRemapSearchKeyTo, &prefs, NULL);
+ search.SetValue(chromeos::input_method::kVoidKey);
+ IntegerPrefMember control;
+ control.Init(prefs::kLanguageXkbRemapControlKeyTo, &prefs, NULL);
+ control.SetValue(chromeos::input_method::kVoidKey);
+
+ KeyRewriter rewriter;
+ rewriter.set_pref_service_for_testing(&prefs);
+
+ // Press left Alt with Shift. This key press shouldn't be affected by the
+ // pref. Confirm the event is not rewritten.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU,
+ ui::EF_SHIFT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_meta_l_,
+ ShiftMask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_MENU,
+ ui::EF_SHIFT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_meta_l_,
+ ShiftMask));
+
+ // Press Search. Confirm the event is now VKEY_UNKNOWN + XK_VoidSymbol.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_UNKNOWN,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_void_symbol_,
+ 0U,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_LWIN,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_super_l_,
+ 0U));
+
+ // Press Control. Confirm the event is now VKEY_UNKNOWN + XK_VoidSymbol.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_UNKNOWN,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_void_symbol_,
+ 0U,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_CONTROL,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_control_l_,
+ 0U));
+
+ // Press Control+Search. Confirm the event is now VKEY_UNKNOWN +
+ // XK_VoidSymbol without any modifiers.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_UNKNOWN,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_void_symbol_,
+ 0U,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_LWIN,
+ ui::EF_CONTROL_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_super_l_,
+ ControlMask));
+
+ // Press Control+Search+a. Confirm the event is now VKEY_A without any
+ // modifiers.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_a_,
+ 0U,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_A,
+ ui::EF_CONTROL_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_a_,
+ ControlMask | Mod4Mask));
+
+ // Press Control+Search+Alt+a. Confirm the event is now VKEY_A only with
+ // the Alt modifier.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_a_,
+ Mod1Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_A,
+ ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_a_,
+ ControlMask | Mod1Mask | Mod4Mask));
+
+ // Remap Alt to Control.
+ IntegerPrefMember alt;
+ alt.Init(prefs::kLanguageXkbRemapAltKeyTo, &prefs, NULL);
+ alt.SetValue(chromeos::input_method::kControlKey);
+
+ // Press left Alt. Confirm the event is now VKEY_CONTROL + XK_Control_L
+ // even though the Control key itself is disabled.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_control_l_,
+ 0U,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_MENU,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_alt_l_,
+ 0U));
+
+ // Press Alt+a. Confirm the event is now Control+a even though the Control
+ // key itself is disabled.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A,
+ ui::EF_CONTROL_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_a_,
+ ControlMask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_A,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_a_,
+ Mod1Mask));
+}
+
+TEST_F(KeyRewriterTest, TestRewriteModifiersRemapToControl) {
+ // Remap Search to Control.
+ TestingPrefService prefs;
+ chromeos::Preferences::RegisterUserPrefs(&prefs);
+ IntegerPrefMember search;
+ search.Init(prefs::kLanguageXkbRemapSearchKeyTo, &prefs, NULL);
+ search.SetValue(chromeos::input_method::kControlKey);
+
+ KeyRewriter rewriter;
+ rewriter.set_pref_service_for_testing(&prefs);
+
+ // Press Search. Confirm the event is now VKEY_CONTROL + XK_Control_L.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_control_l_,
+ 0U,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_LWIN,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_super_l_,
+ 0U));
+
+ // Remap Alt to Control too.
+ IntegerPrefMember alt;
+ alt.Init(prefs::kLanguageXkbRemapAltKeyTo, &prefs, NULL);
+ alt.SetValue(chromeos::input_method::kControlKey);
+
+ // Press left Alt. Confirm the event is now VKEY_CONTROL + XK_Control_L.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_control_l_,
+ 0U,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_MENU,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_alt_l_,
+ 0U));
+
+ // Press right Alt. Confirm the event is now VKEY_CONTROL + XK_Control_R.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_control_r_,
+ 0U,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_MENU,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_alt_r_,
+ 0U));
+
+ // Press Alt+Search. Confirm the event is now VKEY_CONTROL + XK_Control_L.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL,
+ ui::EF_CONTROL_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_control_l_,
+ ControlMask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_LWIN,
+ ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_super_l_,
+ Mod1Mask));
+
+ // Press Control+Alt+Search. Confirm the event is now VKEY_CONTROL +
+ // XK_Control_L.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL,
+ ui::EF_CONTROL_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_control_l_,
+ ControlMask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_LWIN,
+ ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_super_l_,
+ ControlMask | Mod1Mask));
+
+ // Press Shift+Control+Alt+Search. Confirm the event is now Control with
+ // Shift and Control modifiers.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL,
+ ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_control_l_,
+ ShiftMask | ControlMask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_LWIN,
+ ui::EF_SHIFT_DOWN |
+ ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_super_l_,
+ ShiftMask | ControlMask | Mod1Mask));
+
+ // Press Shift+Control+Alt+Search+B. Confirm the event is now B with Shift
+ // and Control modifiers.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_B,
+ ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_b_,
+ ShiftMask | ControlMask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_B,
+ ui::EF_SHIFT_DOWN |
+ ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_b_,
+ ShiftMask | ControlMask | Mod1Mask));
+}
+
+TEST_F(KeyRewriterTest, TestRewriteModifiersRemapMany) {
+ // Remap Search to Alt.
+ TestingPrefService prefs;
+ chromeos::Preferences::RegisterUserPrefs(&prefs);
+ IntegerPrefMember search;
+ search.Init(prefs::kLanguageXkbRemapSearchKeyTo, &prefs, NULL);
+ search.SetValue(chromeos::input_method::kAltKey);
+
+ KeyRewriter rewriter;
+ rewriter.set_pref_service_for_testing(&prefs);
+
+ // Press Search. Confirm the event is now VKEY_MENU + XK_Alt_L.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_alt_l_,
+ 0U,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_LWIN,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_super_l_,
+ 0U));
+
+ // Remap Alt to Control.
+ IntegerPrefMember alt;
+ alt.Init(prefs::kLanguageXkbRemapAltKeyTo, &prefs, NULL);
+ alt.SetValue(chromeos::input_method::kControlKey);
+
+ // Press left Alt. Confirm the event is now VKEY_CONTROL + XK_Control_L.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_control_l_,
+ 0U,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_MENU,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_alt_l_,
+ 0U));
+
+ // Remap Control to Search.
+ IntegerPrefMember control;
+ control.Init(prefs::kLanguageXkbRemapControlKeyTo, &prefs, NULL);
+ control.SetValue(chromeos::input_method::kSearchKey);
+
+ // Press left Control. Confirm the event is now VKEY_LWIN.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_LWIN,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_super_l_,
+ 0U,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_CONTROL,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_control_l_,
+ 0U));
+
+ // Then, press all of the three, Control+Alt+Search.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU,
+ ui::EF_CONTROL_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_alt_l_,
+ ControlMask | Mod4Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_LWIN,
+ ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_super_l_,
+ ControlMask | Mod1Mask));
+
+ // Press Shift+Control+Alt+Search.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU,
+ ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_alt_l_,
+ ShiftMask | ControlMask | Mod4Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_LWIN,
+ ui::EF_SHIFT_DOWN |
+ ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_super_l_,
+ ShiftMask | ControlMask | Mod1Mask));
+
+ // Press Shift+Control+Alt+Search+B
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_B,
+ ui::EF_SHIFT_DOWN |
+ ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_b_,
+ ShiftMask | ControlMask | Mod1Mask |
+ Mod4Mask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_B,
+ ui::EF_SHIFT_DOWN |
+ ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_b_,
+ ShiftMask | ControlMask | Mod1Mask |
+ Mod4Mask));
+}
+
+TEST_F(KeyRewriterTest, TestRewriteModifiersRemapToCapsLock) {
+ // Remap Search to Caps Lock.
+ TestingPrefService prefs;
+ chromeos::Preferences::RegisterUserPrefs(&prefs);
+ IntegerPrefMember search;
+ search.Init(prefs::kLanguageXkbRemapSearchKeyTo, &prefs, NULL);
+ search.SetValue(chromeos::input_method::kCapsLockKey);
+
+ chromeos::input_method::MockXKeyboard xkeyboard;
+ KeyRewriter rewriter;
+ rewriter.set_pref_service_for_testing(&prefs);
+ rewriter.set_xkeyboard_for_testing(&xkeyboard);
+ EXPECT_FALSE(xkeyboard.caps_lock_is_enabled_);
+
+ // Press Search.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_caps_lock_,
+ 0U,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_LWIN,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_super_l_,
+ 0U));
+ // Confirm that the Caps Lock status is changed.
+ EXPECT_TRUE(xkeyboard.caps_lock_is_enabled_);
+
+ // Release Search.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL,
+ ui::EF_CAPS_LOCK_DOWN,
+ ui::ET_KEY_RELEASED,
+ keycode_caps_lock_,
+ LockMask,
+ KeyRelease),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_LWIN,
+ ui::EF_CAPS_LOCK_DOWN,
+ ui::ET_KEY_RELEASED,
+ keycode_super_l_,
+ Mod4Mask | LockMask));
+ // Confirm that the Caps Lock status is not changed.
+ EXPECT_TRUE(xkeyboard.caps_lock_is_enabled_);
+
+ // Press Search.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL,
+ ui::EF_CAPS_LOCK_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_caps_lock_,
+ LockMask,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_LWIN,
+ ui::EF_CAPS_LOCK_DOWN,
+ ui::ET_KEY_PRESSED,
+ keycode_super_l_,
+ LockMask));
+ // Confirm that the Caps Lock status is changed.
+ EXPECT_FALSE(xkeyboard.caps_lock_is_enabled_);
+
+ // Release Search.
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL,
+ ui::EF_CAPS_LOCK_DOWN,
+ ui::ET_KEY_RELEASED,
+ keycode_caps_lock_,
+ LockMask,
+ KeyRelease),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_LWIN,
+ ui::EF_CAPS_LOCK_DOWN,
+ ui::ET_KEY_RELEASED,
+ keycode_super_l_,
+ Mod4Mask | LockMask));
+ // Confirm that the Caps Lock status is not changed.
+ EXPECT_FALSE(xkeyboard.caps_lock_is_enabled_);
+
+ // Press Caps Lock (on an external keyboard).
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_caps_lock_,
+ 0U,
+ KeyPress),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_CAPITAL,
+ 0,
+ ui::ET_KEY_PRESSED,
+ keycode_caps_lock_,
+ 0U));
+
+ // Confirm that calling RewriteForTesting() does not change the state of
+ // |xkeyboard|. In this case, X Window system itself should change the
+ // Caps Lock state, not ash::KeyRewriter.
+ EXPECT_FALSE(xkeyboard.caps_lock_is_enabled_);
+
+ // Press Caps Lock (on an external keyboard).
+ EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL,
+ ui::EF_CAPS_LOCK_DOWN,
+ ui::ET_KEY_RELEASED,
+ keycode_caps_lock_,
+ LockMask,
+ KeyRelease),
+ GetRewrittenEventAsString(&rewriter,
+ ui::VKEY_CAPITAL,
+ ui::EF_CAPS_LOCK_DOWN,
+ ui::ET_KEY_RELEASED,
+ keycode_caps_lock_,
+ LockMask));
+ EXPECT_FALSE(xkeyboard.caps_lock_is_enabled_);
+}
#endif // OS_CHROMEOS

Powered by Google App Engine
This is Rietveld 408576698