| 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
|
|
|