| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/basictypes.h" | 5 #include "base/basictypes.h" |
| 6 #include "base/stringprintf.h" |
| 7 #include "chrome/browser/prefs/pref_member.h" |
| 6 #include "chrome/browser/ui/views/ash/key_rewriter.h" | 8 #include "chrome/browser/ui/views/ash/key_rewriter.h" |
| 9 #include "chrome/common/pref_names.h" |
| 10 #include "chrome/test/base/testing_pref_service.h" |
| 7 #include "testing/gtest/include/gtest/gtest.h" | 11 #include "testing/gtest/include/gtest/gtest.h" |
| 8 #include "ui/aura/event.h" | 12 #include "ui/aura/event.h" |
| 9 | 13 |
| 10 #if defined(OS_CHROMEOS) | 14 #if defined(OS_CHROMEOS) |
| 11 #include <X11/keysym.h> | 15 #include <X11/keysym.h> |
| 12 #include <X11/Xlib.h> | 16 #include <X11/Xlib.h> |
| 13 | 17 |
| 18 #include "chrome/browser/chromeos/input_method/mock_xkeyboard.h" |
| 19 #include "chrome/browser/chromeos/preferences.h" |
| 14 #include "ui/base/x/x11_util.h" | 20 #include "ui/base/x/x11_util.h" |
| 15 | 21 |
| 16 namespace { | 22 namespace { |
| 17 | 23 |
| 18 void InitXKeyEvent(ui::KeyboardCode ui_keycode, | 24 void InitXKeyEvent(ui::KeyboardCode ui_keycode, |
| 19 int ui_flags, | 25 int ui_flags, |
| 20 unsigned int x_keycode, | 26 ui::EventType ui_type, |
| 27 KeyCode x_keycode, |
| 21 unsigned int x_state, | 28 unsigned int x_state, |
| 22 XEvent* event) { | 29 XEvent* event) { |
| 23 ui::InitXKeyEventForTesting(ui::ET_KEY_PRESSED, | 30 ui::InitXKeyEventForTesting(ui_type, |
| 24 ui_keycode, | 31 ui_keycode, |
| 25 ui_flags, | 32 ui_flags, |
| 26 event); | 33 event); |
| 27 event->xkey.keycode = x_keycode; | 34 event->xkey.keycode = x_keycode; |
| 28 event->xkey.state = x_state; | 35 event->xkey.state = x_state; |
| 29 } | 36 } |
| 30 | 37 |
| 38 std::string GetRewrittenEventAsString(KeyRewriter* rewriter, |
| 39 ui::KeyboardCode ui_keycode, |
| 40 int ui_flags, |
| 41 ui::EventType ui_type, |
| 42 KeyCode x_keycode, |
| 43 unsigned int x_state) { |
| 44 XEvent xev; |
| 45 InitXKeyEvent(ui_keycode, ui_flags, ui_type, x_keycode, x_state, &xev); |
| 46 aura::KeyEvent keyevent(&xev, false /* is_char */); |
| 47 rewriter->RewriteForTesting(&keyevent); |
| 48 return StringPrintf( |
| 49 "ui_keycode=%d ui_flags=%d ui_type=%d x_keycode=%u x_state=%u x_type=%d", |
| 50 keyevent.key_code(), keyevent.flags(), keyevent.type(), |
| 51 xev.xkey.keycode, xev.xkey.state, xev.xkey.type); |
| 52 } |
| 53 |
| 54 std::string GetExpectedResultAsString(ui::KeyboardCode ui_keycode, |
| 55 int ui_flags, |
| 56 ui::EventType ui_type, |
| 57 KeyCode x_keycode, |
| 58 unsigned int x_state, |
| 59 int x_type) { |
| 60 return StringPrintf( |
| 61 "ui_keycode=%d ui_flags=%d ui_type=%d x_keycode=%u x_state=%u x_type=%d", |
| 62 ui_keycode, ui_flags, ui_type, x_keycode, x_state, x_type); |
| 63 } |
| 64 |
| 65 class KeyRewriterTest : public testing::Test { |
| 66 public: |
| 67 KeyRewriterTest() |
| 68 : display_(ui::GetXDisplay()), |
| 69 keycode_a_(XKeysymToKeycode(display_, XK_a)), |
| 70 keycode_alt_l_(XKeysymToKeycode(display_, XK_Alt_L)), |
| 71 keycode_alt_r_(XKeysymToKeycode(display_, XK_Alt_R)), |
| 72 keycode_b_(XKeysymToKeycode(display_, XK_B)), |
| 73 keycode_caps_lock_(XKeysymToKeycode(display_, XK_Caps_Lock)), |
| 74 keycode_control_l_(XKeysymToKeycode(display_, XK_Control_L)), |
| 75 keycode_control_r_(XKeysymToKeycode(display_, XK_Control_R)), |
| 76 keycode_meta_l_(XKeysymToKeycode(display_, XK_Meta_L)), |
| 77 keycode_meta_r_(XKeysymToKeycode(display_, XK_Meta_R)), |
| 78 keycode_num_pad_0_(XKeysymToKeycode(display_, XK_KP_0)), |
| 79 keycode_num_pad_1_(XKeysymToKeycode(display_, XK_KP_1)), |
| 80 keycode_num_pad_2_(XKeysymToKeycode(display_, XK_KP_2)), |
| 81 keycode_num_pad_3_(XKeysymToKeycode(display_, XK_KP_3)), |
| 82 keycode_num_pad_4_(XKeysymToKeycode(display_, XK_KP_4)), |
| 83 keycode_num_pad_5_(XKeysymToKeycode(display_, XK_KP_5)), |
| 84 keycode_num_pad_6_(XKeysymToKeycode(display_, XK_KP_6)), |
| 85 keycode_num_pad_7_(XKeysymToKeycode(display_, XK_KP_7)), |
| 86 keycode_num_pad_8_(XKeysymToKeycode(display_, XK_KP_8)), |
| 87 keycode_num_pad_9_(XKeysymToKeycode(display_, XK_KP_9)), |
| 88 keycode_num_pad_begin_(XKeysymToKeycode(display_, XK_KP_Begin)), |
| 89 keycode_num_pad_decimal_(XKeysymToKeycode(display_, XK_KP_Decimal)), |
| 90 keycode_num_pad_delete_(XKeysymToKeycode(display_, XK_KP_Delete)), |
| 91 keycode_num_pad_down_(XKeysymToKeycode(display_, XK_KP_Down)), |
| 92 keycode_num_pad_end_(XKeysymToKeycode(display_, XK_KP_End)), |
| 93 keycode_num_pad_home_(XKeysymToKeycode(display_, XK_KP_Home)), |
| 94 keycode_num_pad_insert_(XKeysymToKeycode(display_, XK_KP_Insert)), |
| 95 keycode_num_pad_left_(XKeysymToKeycode(display_, XK_KP_Left)), |
| 96 keycode_num_pad_next_(XKeysymToKeycode(display_, XK_KP_Next)), |
| 97 keycode_num_pad_prior_(XKeysymToKeycode(display_, XK_KP_Prior)), |
| 98 keycode_num_pad_right_(XKeysymToKeycode(display_, XK_KP_Right)), |
| 99 keycode_num_pad_up_(XKeysymToKeycode(display_, XK_KP_Up)), |
| 100 keycode_super_l_(XKeysymToKeycode(display_, XK_Super_L)), |
| 101 keycode_super_r_(XKeysymToKeycode(display_, XK_Super_R)), |
| 102 keycode_void_symbol_(XKeysymToKeycode(display_, XK_VoidSymbol)) { |
| 103 } |
| 104 virtual ~KeyRewriterTest() {} |
| 105 |
| 106 protected: |
| 107 Display* display_; |
| 108 const KeyCode keycode_a_; |
| 109 const KeyCode keycode_alt_l_; |
| 110 const KeyCode keycode_alt_r_; |
| 111 const KeyCode keycode_b_; |
| 112 const KeyCode keycode_caps_lock_; |
| 113 const KeyCode keycode_control_l_; |
| 114 const KeyCode keycode_control_r_; |
| 115 const KeyCode keycode_meta_l_; |
| 116 const KeyCode keycode_meta_r_; |
| 117 const KeyCode keycode_num_pad_0_; |
| 118 const KeyCode keycode_num_pad_1_; |
| 119 const KeyCode keycode_num_pad_2_; |
| 120 const KeyCode keycode_num_pad_3_; |
| 121 const KeyCode keycode_num_pad_4_; |
| 122 const KeyCode keycode_num_pad_5_; |
| 123 const KeyCode keycode_num_pad_6_; |
| 124 const KeyCode keycode_num_pad_7_; |
| 125 const KeyCode keycode_num_pad_8_; |
| 126 const KeyCode keycode_num_pad_9_; |
| 127 const KeyCode keycode_num_pad_begin_; |
| 128 const KeyCode keycode_num_pad_decimal_; |
| 129 const KeyCode keycode_num_pad_delete_; |
| 130 const KeyCode keycode_num_pad_down_; |
| 131 const KeyCode keycode_num_pad_end_; |
| 132 const KeyCode keycode_num_pad_home_; |
| 133 const KeyCode keycode_num_pad_insert_; |
| 134 const KeyCode keycode_num_pad_left_; |
| 135 const KeyCode keycode_num_pad_next_; |
| 136 const KeyCode keycode_num_pad_prior_; |
| 137 const KeyCode keycode_num_pad_right_; |
| 138 const KeyCode keycode_num_pad_up_; |
| 139 const KeyCode keycode_super_l_; |
| 140 const KeyCode keycode_super_r_; |
| 141 const KeyCode keycode_void_symbol_; |
| 142 }; |
| 143 |
| 31 } // namespace | 144 } // namespace |
| 32 #endif | 145 #endif |
| 33 | 146 |
| 34 TEST(KeyRewriterTest, TestGetDeviceType) { | 147 TEST_F(KeyRewriterTest, TestGetDeviceType) { |
| 35 // This is the typical string which an Apple keyboard sends. | 148 // This is the typical string which an Apple keyboard sends. |
| 36 EXPECT_EQ(KeyRewriter::kDeviceAppleKeyboard, | 149 EXPECT_EQ(KeyRewriter::kDeviceAppleKeyboard, |
| 37 KeyRewriter::GetDeviceType("Apple Inc. Apple Keyboard")); | 150 KeyRewriter::GetDeviceType("Apple Inc. Apple Keyboard")); |
| 38 | 151 |
| 39 // Other cases we accept. | 152 // Other cases we accept. |
| 40 EXPECT_EQ(KeyRewriter::kDeviceAppleKeyboard, | 153 EXPECT_EQ(KeyRewriter::kDeviceAppleKeyboard, |
| 41 KeyRewriter::GetDeviceType("Apple Keyboard")); | 154 KeyRewriter::GetDeviceType("Apple Keyboard")); |
| 42 EXPECT_EQ(KeyRewriter::kDeviceAppleKeyboard, | 155 EXPECT_EQ(KeyRewriter::kDeviceAppleKeyboard, |
| 43 KeyRewriter::GetDeviceType("apple keyboard")); | 156 KeyRewriter::GetDeviceType("apple keyboard")); |
| 44 EXPECT_EQ(KeyRewriter::kDeviceAppleKeyboard, | 157 EXPECT_EQ(KeyRewriter::kDeviceAppleKeyboard, |
| (...skipping 16 matching lines...) Expand all Loading... |
| 61 EXPECT_EQ(KeyRewriter::kDeviceUnknown, | 174 EXPECT_EQ(KeyRewriter::kDeviceUnknown, |
| 62 KeyRewriter::GetDeviceType(".")); | 175 KeyRewriter::GetDeviceType(".")); |
| 63 EXPECT_EQ(KeyRewriter::kDeviceUnknown, | 176 EXPECT_EQ(KeyRewriter::kDeviceUnknown, |
| 64 KeyRewriter::GetDeviceType(". ")); | 177 KeyRewriter::GetDeviceType(". ")); |
| 65 EXPECT_EQ(KeyRewriter::kDeviceUnknown, | 178 EXPECT_EQ(KeyRewriter::kDeviceUnknown, |
| 66 KeyRewriter::GetDeviceType(" .")); | 179 KeyRewriter::GetDeviceType(" .")); |
| 67 EXPECT_EQ(KeyRewriter::kDeviceUnknown, | 180 EXPECT_EQ(KeyRewriter::kDeviceUnknown, |
| 68 KeyRewriter::GetDeviceType("not-an-apple keyboard")); | 181 KeyRewriter::GetDeviceType("not-an-apple keyboard")); |
| 69 } | 182 } |
| 70 | 183 |
| 71 TEST(KeyRewriterTest, TestDeviceAddedOrRemoved) { | 184 TEST_F(KeyRewriterTest, TestDeviceAddedOrRemoved) { |
| 72 KeyRewriter rewriter; | 185 KeyRewriter rewriter; |
| 73 EXPECT_TRUE(rewriter.device_id_to_type_for_testing().empty()); | 186 EXPECT_TRUE(rewriter.device_id_to_type_for_testing().empty()); |
| 74 EXPECT_EQ(KeyRewriter::kDeviceUnknown, | 187 EXPECT_EQ(KeyRewriter::kDeviceUnknown, |
| 75 rewriter.DeviceAddedForTesting(0, "PC Keyboard")); | 188 rewriter.DeviceAddedForTesting(0, "PC Keyboard")); |
| 76 EXPECT_EQ(1U, rewriter.device_id_to_type_for_testing().size()); | 189 EXPECT_EQ(1U, rewriter.device_id_to_type_for_testing().size()); |
| 77 EXPECT_EQ(KeyRewriter::kDeviceAppleKeyboard, | 190 EXPECT_EQ(KeyRewriter::kDeviceAppleKeyboard, |
| 78 rewriter.DeviceAddedForTesting(1, "Apple Keyboard")); | 191 rewriter.DeviceAddedForTesting(1, "Apple Keyboard")); |
| 79 EXPECT_EQ(2U, rewriter.device_id_to_type_for_testing().size()); | 192 EXPECT_EQ(2U, rewriter.device_id_to_type_for_testing().size()); |
| 80 // Try to reuse the first ID. | 193 // Try to reuse the first ID. |
| 81 EXPECT_EQ(KeyRewriter::kDeviceAppleKeyboard, | 194 EXPECT_EQ(KeyRewriter::kDeviceAppleKeyboard, |
| 82 rewriter.DeviceAddedForTesting(0, "Apple Keyboard")); | 195 rewriter.DeviceAddedForTesting(0, "Apple Keyboard")); |
| 83 EXPECT_EQ(2U, rewriter.device_id_to_type_for_testing().size()); | 196 EXPECT_EQ(2U, rewriter.device_id_to_type_for_testing().size()); |
| 84 } | 197 } |
| 85 | 198 |
| 86 #if defined(OS_CHROMEOS) | 199 #if defined(OS_CHROMEOS) |
| 87 TEST(KeyRewriterTest, TestRewriteCommandToControl) { | 200 TEST_F(KeyRewriterTest, TestRewriteCommandToControl) { |
| 88 XEvent xev; | |
| 89 | |
| 90 const unsigned int kKeycodeA = | |
| 91 XKeysymToKeycode(ui::GetXDisplay(), XK_a); | |
| 92 const unsigned int kKeycodeSuperL = | |
| 93 XKeysymToKeycode(ui::GetXDisplay(), XK_Super_L); | |
| 94 const unsigned int kKeycodeSuperR = | |
| 95 XKeysymToKeycode(ui::GetXDisplay(), XK_Super_R); | |
| 96 const unsigned int kKeycodeControlL = | |
| 97 XKeysymToKeycode(ui::GetXDisplay(), XK_Control_L); | |
| 98 const unsigned int kKeycodeControlR = | |
| 99 XKeysymToKeycode(ui::GetXDisplay(), XK_Control_R); | |
| 100 | |
| 101 // First, test with a PC keyboard. | 201 // First, test with a PC keyboard. |
| 202 TestingPrefService prefs; |
| 102 KeyRewriter rewriter; | 203 KeyRewriter rewriter; |
| 103 rewriter.DeviceAddedForTesting(0, "PC Keyboard"); | 204 rewriter.DeviceAddedForTesting(0, "PC Keyboard"); |
| 104 rewriter.set_last_device_id_for_testing(0); | 205 rewriter.set_last_device_id_for_testing(0); |
| 105 { | 206 rewriter.set_pref_service_for_testing(&prefs); |
| 106 // XK_a, Alt modifier. | 207 |
| 107 InitXKeyEvent(ui::VKEY_A, ui::EF_ALT_DOWN, kKeycodeA, Mod1Mask, &xev); | 208 // XK_a, Alt modifier. |
| 108 aura::KeyEvent keyevent(&xev, false /* is_char */); | 209 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, |
| 109 rewriter.RewriteForTesting(&keyevent); | 210 ui::EF_ALT_DOWN, |
| 110 EXPECT_EQ(ui::VKEY_A, keyevent.key_code()); | 211 ui::ET_KEY_PRESSED, |
| 111 EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags()); | 212 keycode_a_, |
| 112 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 213 Mod1Mask, |
| 113 EXPECT_EQ(kKeycodeA, xkey.keycode); | 214 KeyPress), |
| 114 EXPECT_EQ(static_cast<unsigned int>(Mod1Mask), xkey.state); | 215 GetRewrittenEventAsString(&rewriter, |
| 115 } | 216 ui::VKEY_A, |
| 116 { | 217 ui::EF_ALT_DOWN, |
| 117 // XK_a, Win modifier. | 218 ui::ET_KEY_PRESSED, |
| 118 InitXKeyEvent(ui::VKEY_A, 0, kKeycodeA, Mod4Mask, &xev); | 219 keycode_a_, |
| 119 aura::KeyEvent keyevent(&xev, false /* is_char */); | 220 Mod1Mask)); |
| 120 rewriter.RewriteForTesting(&keyevent); | 221 |
| 121 EXPECT_EQ(ui::VKEY_A, keyevent.key_code()); | 222 // XK_a, Win modifier. |
| 122 EXPECT_EQ(0, keyevent.flags()); | 223 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, |
| 123 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 224 0, |
| 124 EXPECT_EQ(kKeycodeA, xkey.keycode); | 225 ui::ET_KEY_PRESSED, |
| 125 EXPECT_EQ(static_cast<unsigned int>(Mod4Mask), xkey.state); | 226 keycode_a_, |
| 126 } | 227 Mod4Mask, |
| 127 { | 228 KeyPress), |
| 128 // XK_a, Alt+Win modifier. | 229 GetRewrittenEventAsString(&rewriter, |
| 129 InitXKeyEvent(ui::VKEY_A, ui::EF_ALT_DOWN, | 230 ui::VKEY_A, |
| 130 kKeycodeA, Mod1Mask | Mod4Mask, &xev); | 231 0, |
| 131 aura::KeyEvent keyevent(&xev, false /* is_char */); | 232 ui::ET_KEY_PRESSED, |
| 132 rewriter.RewriteForTesting(&keyevent); | 233 keycode_a_, |
| 133 EXPECT_EQ(ui::VKEY_A, keyevent.key_code()); | 234 Mod4Mask)); |
| 134 EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags()); | 235 |
| 135 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 236 // XK_a, Alt+Win modifier. |
| 136 EXPECT_EQ(kKeycodeA, xkey.keycode); | 237 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, |
| 137 EXPECT_EQ(static_cast<unsigned int>(Mod1Mask | Mod4Mask), xkey.state); | 238 ui::EF_ALT_DOWN, |
| 138 } | 239 ui::ET_KEY_PRESSED, |
| 139 { | 240 keycode_a_, |
| 140 // XK_Super_L (left Windows key), Alt modifier. | 241 Mod1Mask | Mod4Mask, |
| 141 InitXKeyEvent(ui::VKEY_LWIN, ui::EF_ALT_DOWN, | 242 KeyPress), |
| 142 kKeycodeSuperL, Mod1Mask, &xev); | 243 GetRewrittenEventAsString(&rewriter, |
| 143 aura::KeyEvent keyevent(&xev, false /* is_char */); | 244 ui::VKEY_A, |
| 144 rewriter.RewriteForTesting(&keyevent); | 245 ui::EF_ALT_DOWN, |
| 145 EXPECT_EQ(ui::VKEY_LWIN, keyevent.key_code()); | 246 ui::ET_KEY_PRESSED, |
| 146 EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags()); | 247 keycode_a_, |
| 147 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 248 Mod1Mask | Mod4Mask)); |
| 148 EXPECT_EQ(kKeycodeSuperL, xkey.keycode); | 249 |
| 149 EXPECT_EQ(static_cast<unsigned int>(Mod1Mask), xkey.state); | 250 // XK_Super_L (left Windows key), Alt modifier. |
| 150 } | 251 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_LWIN, |
| 151 { | 252 ui::EF_ALT_DOWN, |
| 152 // XK_Super_R (right Windows key), Alt modifier. | 253 ui::ET_KEY_PRESSED, |
| 153 InitXKeyEvent(ui::VKEY_RWIN, ui::EF_ALT_DOWN, | 254 keycode_super_l_, |
| 154 kKeycodeSuperR, Mod1Mask, &xev); | 255 Mod1Mask, |
| 155 aura::KeyEvent keyevent(&xev, false /* is_char */); | 256 KeyPress), |
| 156 rewriter.RewriteForTesting(&keyevent); | 257 GetRewrittenEventAsString(&rewriter, |
| 157 EXPECT_EQ(ui::VKEY_RWIN, keyevent.key_code()); | 258 ui::VKEY_LWIN, |
| 158 EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags()); | 259 ui::EF_ALT_DOWN, |
| 159 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 260 ui::ET_KEY_PRESSED, |
| 160 EXPECT_EQ(kKeycodeSuperR, xkey.keycode); | 261 keycode_super_l_, |
| 161 EXPECT_EQ(static_cast<unsigned int>(Mod1Mask), xkey.state); | 262 Mod1Mask)); |
| 162 } | 263 |
| 264 // XK_Super_R (right Windows key), Alt modifier. |
| 265 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_RWIN, |
| 266 ui::EF_ALT_DOWN, |
| 267 ui::ET_KEY_PRESSED, |
| 268 keycode_super_r_, |
| 269 Mod1Mask, |
| 270 KeyPress), |
| 271 GetRewrittenEventAsString(&rewriter, |
| 272 ui::VKEY_RWIN, |
| 273 ui::EF_ALT_DOWN, |
| 274 ui::ET_KEY_PRESSED, |
| 275 keycode_super_r_, |
| 276 Mod1Mask)); |
| 163 | 277 |
| 164 // An Apple keyboard reuse the ID, zero. | 278 // An Apple keyboard reuse the ID, zero. |
| 165 rewriter.DeviceAddedForTesting(0, "Apple Keyboard"); | 279 rewriter.DeviceAddedForTesting(0, "Apple Keyboard"); |
| 166 rewriter.set_last_device_id_for_testing(0); | 280 rewriter.set_last_device_id_for_testing(0); |
| 167 { | 281 |
| 168 // XK_a, Alt modifier. | 282 // XK_a, Alt modifier. |
| 169 InitXKeyEvent(ui::VKEY_A, ui::EF_ALT_DOWN, kKeycodeA, Mod1Mask, &xev); | 283 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, |
| 170 aura::KeyEvent keyevent(&xev, false /* is_char */); | 284 ui::EF_ALT_DOWN, |
| 171 rewriter.RewriteForTesting(&keyevent); | 285 ui::ET_KEY_PRESSED, |
| 172 EXPECT_EQ(ui::VKEY_A, keyevent.key_code()); | 286 keycode_a_, |
| 173 EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags()); | 287 Mod1Mask, |
| 174 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 288 KeyPress), |
| 175 EXPECT_EQ(kKeycodeA, xkey.keycode); | 289 GetRewrittenEventAsString(&rewriter, |
| 176 EXPECT_EQ(static_cast<unsigned int>(Mod1Mask), xkey.state); | 290 ui::VKEY_A, |
| 177 } | 291 ui::EF_ALT_DOWN, |
| 178 { | 292 ui::ET_KEY_PRESSED, |
| 179 // XK_a, Win modifier. | 293 keycode_a_, |
| 180 InitXKeyEvent(ui::VKEY_A, 0, kKeycodeA, Mod4Mask, &xev); | 294 Mod1Mask)); |
| 181 aura::KeyEvent keyevent(&xev, false /* is_char */); | 295 |
| 182 rewriter.RewriteForTesting(&keyevent); | 296 // XK_a, Win modifier. |
| 183 EXPECT_EQ(ui::VKEY_A, keyevent.key_code()); | 297 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, |
| 184 EXPECT_EQ(ui::EF_CONTROL_DOWN, keyevent.flags()); | 298 ui::EF_CONTROL_DOWN, |
| 185 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 299 ui::ET_KEY_PRESSED, |
| 186 EXPECT_EQ(kKeycodeA, xkey.keycode); | 300 keycode_a_, |
| 187 EXPECT_EQ(static_cast<unsigned int>(ControlMask), xkey.state); | 301 ControlMask, |
| 188 } | 302 KeyPress), |
| 189 { | 303 GetRewrittenEventAsString(&rewriter, |
| 190 // XK_a, Alt+Win modifier. | 304 ui::VKEY_A, |
| 191 InitXKeyEvent(ui::VKEY_A, ui::EF_ALT_DOWN, | 305 0, |
| 192 kKeycodeA, Mod1Mask | Mod4Mask, &xev); | 306 ui::ET_KEY_PRESSED, |
| 193 aura::KeyEvent keyevent(&xev, false /* is_char */); | 307 keycode_a_, |
| 194 rewriter.RewriteForTesting(&keyevent); | 308 Mod4Mask)); |
| 195 EXPECT_EQ(ui::VKEY_A, keyevent.key_code()); | 309 |
| 196 EXPECT_EQ(ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, keyevent.flags()); | 310 // XK_a, Alt+Win modifier. |
| 197 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 311 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, |
| 198 EXPECT_EQ(kKeycodeA, xkey.keycode); | 312 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, |
| 199 EXPECT_EQ(static_cast<unsigned int>(Mod1Mask | ControlMask), xkey.state); | 313 ui::ET_KEY_PRESSED, |
| 200 } | 314 keycode_a_, |
| 201 { | 315 Mod1Mask | ControlMask, |
| 202 // XK_Super_L (left Windows key), Alt modifier. | 316 KeyPress), |
| 203 InitXKeyEvent(ui::VKEY_LWIN, ui::EF_ALT_DOWN, | 317 GetRewrittenEventAsString(&rewriter, |
| 204 kKeycodeSuperL, Mod1Mask, &xev); | 318 ui::VKEY_A, |
| 205 aura::KeyEvent keyevent(&xev, false /* is_char */); | 319 ui::EF_ALT_DOWN, |
| 206 rewriter.RewriteForTesting(&keyevent); | 320 ui::ET_KEY_PRESSED, |
| 207 EXPECT_EQ(ui::VKEY_CONTROL, keyevent.key_code()); | 321 keycode_a_, |
| 208 EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags()); | 322 Mod1Mask | Mod4Mask)); |
| 209 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 323 |
| 210 EXPECT_EQ(kKeycodeControlL, xkey.keycode); | 324 // XK_Super_L (left Windows key), Alt modifier. |
| 211 EXPECT_EQ(static_cast<unsigned int>(Mod1Mask), xkey.state); | 325 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, |
| 212 } | 326 ui::EF_ALT_DOWN, |
| 213 { | 327 ui::ET_KEY_PRESSED, |
| 214 // XK_Super_R (right Windows key), Alt modifier. | 328 keycode_control_l_, |
| 215 InitXKeyEvent(ui::VKEY_RWIN, ui::EF_ALT_DOWN, | 329 Mod1Mask, |
| 216 kKeycodeSuperR, Mod1Mask, &xev); | 330 KeyPress), |
| 217 aura::KeyEvent keyevent(&xev, false /* is_char */); | 331 GetRewrittenEventAsString(&rewriter, |
| 218 rewriter.RewriteForTesting(&keyevent); | 332 ui::VKEY_LWIN, |
| 219 EXPECT_EQ(ui::VKEY_CONTROL, keyevent.key_code()); | 333 ui::EF_ALT_DOWN, |
| 220 EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags()); | 334 ui::ET_KEY_PRESSED, |
| 221 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 335 keycode_super_l_, |
| 222 EXPECT_EQ(kKeycodeControlR, xkey.keycode); | 336 Mod1Mask)); |
| 223 EXPECT_EQ(static_cast<unsigned int>(Mod1Mask), xkey.state); | 337 |
| 224 } | 338 // XK_Super_R (right Windows key), Alt modifier. |
| 339 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, |
| 340 ui::EF_ALT_DOWN, |
| 341 ui::ET_KEY_PRESSED, |
| 342 keycode_control_r_, |
| 343 Mod1Mask, |
| 344 KeyPress), |
| 345 GetRewrittenEventAsString(&rewriter, |
| 346 ui::VKEY_RWIN, |
| 347 ui::EF_ALT_DOWN, |
| 348 ui::ET_KEY_PRESSED, |
| 349 keycode_super_r_, |
| 350 Mod1Mask)); |
| 225 } | 351 } |
| 226 | 352 |
| 227 TEST(KeyRewriterTest, TestRewriteNumPadKeys) { | 353 TEST_F(KeyRewriterTest, TestRewriteNumPadKeys) { |
| 228 XEvent xev; | 354 TestingPrefService prefs; |
| 229 Display* display = ui::GetXDisplay(); | |
| 230 | |
| 231 const unsigned int kKeycodeNumPad0 = XKeysymToKeycode(display, XK_KP_0); | |
| 232 const unsigned int kKeycodeNumPadDecimal = | |
| 233 XKeysymToKeycode(display, XK_KP_Decimal); | |
| 234 const unsigned int kKeycodeNumPad1 = XKeysymToKeycode(display, XK_KP_1); | |
| 235 const unsigned int kKeycodeNumPad2 = XKeysymToKeycode(display, XK_KP_2); | |
| 236 const unsigned int kKeycodeNumPad3 = XKeysymToKeycode(display, XK_KP_3); | |
| 237 const unsigned int kKeycodeNumPad4 = XKeysymToKeycode(display, XK_KP_4); | |
| 238 const unsigned int kKeycodeNumPad5 = XKeysymToKeycode(display, XK_KP_5); | |
| 239 const unsigned int kKeycodeNumPad6 = XKeysymToKeycode(display, XK_KP_6); | |
| 240 const unsigned int kKeycodeNumPad7 = XKeysymToKeycode(display, XK_KP_7); | |
| 241 const unsigned int kKeycodeNumPad8 = XKeysymToKeycode(display, XK_KP_8); | |
| 242 const unsigned int kKeycodeNumPad9 = XKeysymToKeycode(display, XK_KP_9); | |
| 243 | |
| 244 const unsigned int kKeycodeNumPadInsert = | |
| 245 XKeysymToKeycode(display, XK_KP_Insert); | |
| 246 const unsigned int kKeycodeNumPadDelete = | |
| 247 XKeysymToKeycode(display, XK_KP_Delete); | |
| 248 const unsigned int kKeycodeNumPadEnd = XKeysymToKeycode(display, XK_KP_End); | |
| 249 const unsigned int kKeycodeNumPadDown = XKeysymToKeycode(display, XK_KP_Down); | |
| 250 const unsigned int kKeycodeNumPadNext = XKeysymToKeycode(display, XK_KP_Next); | |
| 251 const unsigned int kKeycodeNumPadLeft = XKeysymToKeycode(display, XK_KP_Left); | |
| 252 const unsigned int kKeycodeNumPadBegin = | |
| 253 XKeysymToKeycode(display, XK_KP_Begin); | |
| 254 const unsigned int kKeycodeNumPadRight = | |
| 255 XKeysymToKeycode(display, XK_KP_Right); | |
| 256 const unsigned int kKeycodeNumPadHome = XKeysymToKeycode(display, XK_KP_Home); | |
| 257 const unsigned int kKeycodeNumPadUp = XKeysymToKeycode(display, XK_KP_Up); | |
| 258 const unsigned int kKeycodeNumPadPrior = | |
| 259 XKeysymToKeycode(display, XK_KP_Prior); | |
| 260 | |
| 261 KeyRewriter rewriter; | 355 KeyRewriter rewriter; |
| 262 { | 356 rewriter.set_pref_service_for_testing(&prefs); |
| 263 // XK_KP_Insert (= NumPad 0 without Num Lock), no modifier. | 357 |
| 264 InitXKeyEvent(ui::VKEY_INSERT, 0, kKeycodeNumPadInsert, 0, &xev); | 358 // XK_KP_Insert (= NumPad 0 without Num Lock), no modifier. |
| 265 aura::KeyEvent keyevent(&xev, false /* is_char */); | 359 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD0, |
| 266 rewriter.RewriteForTesting(&keyevent); | 360 0, |
| 267 EXPECT_EQ(ui::VKEY_NUMPAD0, keyevent.key_code()); | 361 ui::ET_KEY_PRESSED, |
| 268 EXPECT_EQ(0, keyevent.flags()); | 362 keycode_num_pad_0_, |
| 269 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 363 Mod2Mask, // Num Lock |
| 270 EXPECT_EQ(kKeycodeNumPad0, xkey.keycode); | 364 KeyPress), |
| 271 // Mod2Mask means Num Lock. | 365 GetRewrittenEventAsString(&rewriter, |
| 272 EXPECT_EQ(static_cast<unsigned int>(Mod2Mask), xkey.state); | 366 ui::VKEY_INSERT, |
| 273 } | 367 0, |
| 274 { | 368 ui::ET_KEY_PRESSED, |
| 275 // XK_KP_Insert (= NumPad 0 without Num Lock), Alt modifier. | 369 keycode_num_pad_insert_, |
| 276 InitXKeyEvent(ui::VKEY_INSERT, ui::EF_ALT_DOWN, | 370 0)); |
| 277 kKeycodeNumPadInsert, Mod1Mask, &xev); | 371 |
| 278 aura::KeyEvent keyevent(&xev, false /* is_char */); | 372 // XK_KP_Insert (= NumPad 0 without Num Lock), Alt modifier. |
| 279 rewriter.RewriteForTesting(&keyevent); | 373 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD0, |
| 280 EXPECT_EQ(ui::VKEY_NUMPAD0, keyevent.key_code()); | 374 ui::EF_ALT_DOWN, |
| 281 EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags()); | 375 ui::ET_KEY_PRESSED, |
| 282 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 376 keycode_num_pad_0_, |
| 283 EXPECT_EQ(kKeycodeNumPad0, xkey.keycode); | 377 Mod1Mask | Mod2Mask, |
| 284 EXPECT_EQ(static_cast<unsigned int>(Mod1Mask | Mod2Mask), xkey.state); | 378 KeyPress), |
| 285 } | 379 GetRewrittenEventAsString(&rewriter, |
| 286 { | 380 ui::VKEY_INSERT, |
| 287 // XK_KP_Delete (= NumPad . without Num Lock), Alt modifier. | 381 ui::EF_ALT_DOWN, |
| 288 InitXKeyEvent(ui::VKEY_DELETE, ui::EF_ALT_DOWN, | 382 ui::ET_KEY_PRESSED, |
| 289 kKeycodeNumPadDelete, Mod1Mask, &xev); | 383 keycode_num_pad_insert_, |
| 290 aura::KeyEvent keyevent(&xev, false /* is_char */); | 384 Mod1Mask)); |
| 291 rewriter.RewriteForTesting(&keyevent); | 385 |
| 292 EXPECT_EQ(ui::VKEY_DECIMAL, keyevent.key_code()); | 386 // XK_KP_Delete (= NumPad . without Num Lock), Alt modifier. |
| 293 EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags()); | 387 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_DECIMAL, |
| 294 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 388 ui::EF_ALT_DOWN, |
| 295 EXPECT_EQ(kKeycodeNumPadDecimal, xkey.keycode); | 389 ui::ET_KEY_PRESSED, |
| 296 EXPECT_EQ(static_cast<unsigned int>(Mod1Mask | Mod2Mask), xkey.state); | 390 keycode_num_pad_decimal_, |
| 297 } | 391 Mod1Mask | Mod2Mask, |
| 298 { | 392 KeyPress), |
| 299 // XK_KP_End (= NumPad 1 without Num Lock), Alt modifier. | 393 GetRewrittenEventAsString(&rewriter, |
| 300 InitXKeyEvent(ui::VKEY_END, ui::EF_ALT_DOWN, | 394 ui::VKEY_DELETE, |
| 301 kKeycodeNumPadEnd, Mod1Mask, &xev); | 395 ui::EF_ALT_DOWN, |
| 302 aura::KeyEvent keyevent(&xev, false /* is_char */); | 396 ui::ET_KEY_PRESSED, |
| 303 rewriter.RewriteForTesting(&keyevent); | 397 keycode_num_pad_delete_, |
| 304 EXPECT_EQ(ui::VKEY_NUMPAD1, keyevent.key_code()); | 398 Mod1Mask)); |
| 305 EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags()); | 399 |
| 306 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 400 // XK_KP_End (= NumPad 1 without Num Lock), Alt modifier. |
| 307 EXPECT_EQ(kKeycodeNumPad1, xkey.keycode); | 401 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD1, |
| 308 EXPECT_EQ(static_cast<unsigned int>(Mod1Mask | Mod2Mask), xkey.state); | 402 ui::EF_ALT_DOWN, |
| 309 } | 403 ui::ET_KEY_PRESSED, |
| 310 { | 404 keycode_num_pad_1_, |
| 311 // XK_KP_Down (= NumPad 2 without Num Lock), Alt modifier. | 405 Mod1Mask | Mod2Mask, |
| 312 InitXKeyEvent(ui::VKEY_DOWN, ui::EF_ALT_DOWN, | 406 KeyPress), |
| 313 kKeycodeNumPadDown, Mod1Mask, &xev); | 407 GetRewrittenEventAsString(&rewriter, |
| 314 aura::KeyEvent keyevent(&xev, false /* is_char */); | 408 ui::VKEY_END, |
| 315 rewriter.RewriteForTesting(&keyevent); | 409 ui::EF_ALT_DOWN, |
| 316 EXPECT_EQ(ui::VKEY_NUMPAD2, keyevent.key_code()); | 410 ui::ET_KEY_PRESSED, |
| 317 EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags()); | 411 keycode_num_pad_end_, |
| 318 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 412 Mod1Mask)); |
| 319 EXPECT_EQ(kKeycodeNumPad2, xkey.keycode); | 413 |
| 320 EXPECT_EQ(static_cast<unsigned int>(Mod1Mask | Mod2Mask), xkey.state); | 414 // XK_KP_Down (= NumPad 2 without Num Lock), Alt modifier. |
| 321 } | 415 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD2, |
| 322 { | 416 ui::EF_ALT_DOWN, |
| 323 // XK_KP_Next (= NumPad 3 without Num Lock), Alt modifier. | 417 ui::ET_KEY_PRESSED, |
| 324 InitXKeyEvent(ui::VKEY_NEXT, ui::EF_ALT_DOWN, | 418 keycode_num_pad_2_, |
| 325 kKeycodeNumPadNext, Mod1Mask, &xev); | 419 Mod1Mask | Mod2Mask, |
| 326 aura::KeyEvent keyevent(&xev, false /* is_char */); | 420 KeyPress), |
| 327 rewriter.RewriteForTesting(&keyevent); | 421 GetRewrittenEventAsString(&rewriter, |
| 328 EXPECT_EQ(ui::VKEY_NUMPAD3, keyevent.key_code()); | 422 ui::VKEY_DOWN, |
| 329 EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags()); | 423 ui::EF_ALT_DOWN, |
| 330 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 424 ui::ET_KEY_PRESSED, |
| 331 EXPECT_EQ(kKeycodeNumPad3, xkey.keycode); | 425 keycode_num_pad_down_, |
| 332 EXPECT_EQ(static_cast<unsigned int>(Mod1Mask | Mod2Mask), xkey.state); | 426 Mod1Mask)); |
| 333 } | 427 |
| 334 { | 428 // XK_KP_Next (= NumPad 3 without Num Lock), Alt modifier. |
| 335 // XK_KP_Left (= NumPad 4 without Num Lock), Alt modifier. | 429 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD3, |
| 336 InitXKeyEvent(ui::VKEY_LEFT, ui::EF_ALT_DOWN, | 430 ui::EF_ALT_DOWN, |
| 337 kKeycodeNumPadLeft, Mod1Mask, &xev); | 431 ui::ET_KEY_PRESSED, |
| 338 aura::KeyEvent keyevent(&xev, false /* is_char */); | 432 keycode_num_pad_3_, |
| 339 rewriter.RewriteForTesting(&keyevent); | 433 Mod1Mask | Mod2Mask, |
| 340 EXPECT_EQ(ui::VKEY_NUMPAD4, keyevent.key_code()); | 434 KeyPress), |
| 341 EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags()); | 435 GetRewrittenEventAsString(&rewriter, |
| 342 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 436 ui::VKEY_NEXT, |
| 343 EXPECT_EQ(kKeycodeNumPad4, xkey.keycode); | 437 ui::EF_ALT_DOWN, |
| 344 EXPECT_EQ(static_cast<unsigned int>(Mod1Mask | Mod2Mask), xkey.state); | 438 ui::ET_KEY_PRESSED, |
| 345 } | 439 keycode_num_pad_next_, |
| 346 { | 440 Mod1Mask)); |
| 347 // XK_KP_Begin (= NumPad 5 without Num Lock), Alt modifier. | 441 |
| 348 InitXKeyEvent(ui::VKEY_CLEAR, ui::EF_ALT_DOWN, | 442 // XK_KP_Left (= NumPad 4 without Num Lock), Alt modifier. |
| 349 kKeycodeNumPadBegin, Mod1Mask, &xev); | 443 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD4, |
| 350 aura::KeyEvent keyevent(&xev, false /* is_char */); | 444 ui::EF_ALT_DOWN, |
| 351 rewriter.RewriteForTesting(&keyevent); | 445 ui::ET_KEY_PRESSED, |
| 352 EXPECT_EQ(ui::VKEY_NUMPAD5, keyevent.key_code()); | 446 keycode_num_pad_4_, |
| 353 EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags()); | 447 Mod1Mask | Mod2Mask, |
| 354 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 448 KeyPress), |
| 355 EXPECT_EQ(kKeycodeNumPad5, xkey.keycode); | 449 GetRewrittenEventAsString(&rewriter, |
| 356 EXPECT_EQ(static_cast<unsigned int>(Mod1Mask | Mod2Mask), xkey.state); | 450 ui::VKEY_LEFT, |
| 357 } | 451 ui::EF_ALT_DOWN, |
| 358 { | 452 ui::ET_KEY_PRESSED, |
| 359 // XK_KP_Right (= NumPad 6 without Num Lock), Alt modifier. | 453 keycode_num_pad_left_, |
| 360 InitXKeyEvent(ui::VKEY_RIGHT, ui::EF_ALT_DOWN, | 454 Mod1Mask)); |
| 361 kKeycodeNumPadRight, Mod1Mask, &xev); | 455 |
| 362 aura::KeyEvent keyevent(&xev, false /* is_char */); | 456 // XK_KP_Begin (= NumPad 5 without Num Lock), Alt modifier. |
| 363 rewriter.RewriteForTesting(&keyevent); | 457 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD5, |
| 364 EXPECT_EQ(ui::VKEY_NUMPAD6, keyevent.key_code()); | 458 ui::EF_ALT_DOWN, |
| 365 EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags()); | 459 ui::ET_KEY_PRESSED, |
| 366 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 460 keycode_num_pad_5_, |
| 367 EXPECT_EQ(kKeycodeNumPad6, xkey.keycode); | 461 Mod1Mask | Mod2Mask, |
| 368 EXPECT_EQ(static_cast<unsigned int>(Mod1Mask | Mod2Mask), xkey.state); | 462 KeyPress), |
| 369 } | 463 GetRewrittenEventAsString(&rewriter, |
| 370 { | 464 ui::VKEY_CLEAR, |
| 371 // XK_KP_Home (= NumPad 7 without Num Lock), Alt modifier. | 465 ui::EF_ALT_DOWN, |
| 372 InitXKeyEvent(ui::VKEY_HOME, ui::EF_ALT_DOWN, | 466 ui::ET_KEY_PRESSED, |
| 373 kKeycodeNumPadHome, Mod1Mask, &xev); | 467 keycode_num_pad_begin_, |
| 374 aura::KeyEvent keyevent(&xev, false /* is_char */); | 468 Mod1Mask)); |
| 375 rewriter.RewriteForTesting(&keyevent); | 469 |
| 376 EXPECT_EQ(ui::VKEY_NUMPAD7, keyevent.key_code()); | 470 // XK_KP_Right (= NumPad 6 without Num Lock), Alt modifier. |
| 377 EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags()); | 471 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD6, |
| 378 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 472 ui::EF_ALT_DOWN, |
| 379 EXPECT_EQ(kKeycodeNumPad7, xkey.keycode); | 473 ui::ET_KEY_PRESSED, |
| 380 EXPECT_EQ(static_cast<unsigned int>(Mod1Mask | Mod2Mask), xkey.state); | 474 keycode_num_pad_6_, |
| 381 } | 475 Mod1Mask | Mod2Mask, |
| 382 { | 476 KeyPress), |
| 383 // XK_KP_Up (= NumPad 8 without Num Lock), Alt modifier. | 477 GetRewrittenEventAsString(&rewriter, |
| 384 InitXKeyEvent(ui::VKEY_UP, ui::EF_ALT_DOWN, | 478 ui::VKEY_RIGHT, |
| 385 kKeycodeNumPadUp, Mod1Mask, &xev); | 479 ui::EF_ALT_DOWN, |
| 386 aura::KeyEvent keyevent(&xev, false /* is_char */); | 480 ui::ET_KEY_PRESSED, |
| 387 rewriter.RewriteForTesting(&keyevent); | 481 keycode_num_pad_right_, |
| 388 EXPECT_EQ(ui::VKEY_NUMPAD8, keyevent.key_code()); | 482 Mod1Mask)); |
| 389 EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags()); | 483 |
| 390 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 484 // XK_KP_Home (= NumPad 7 without Num Lock), Alt modifier. |
| 391 EXPECT_EQ(kKeycodeNumPad8, xkey.keycode); | 485 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD7, |
| 392 EXPECT_EQ(static_cast<unsigned int>(Mod1Mask | Mod2Mask), xkey.state); | 486 ui::EF_ALT_DOWN, |
| 393 } | 487 ui::ET_KEY_PRESSED, |
| 394 { | 488 keycode_num_pad_7_, |
| 395 // XK_KP_Prior (= NumPad 9 without Num Lock), Alt modifier. | 489 Mod1Mask | Mod2Mask, |
| 396 InitXKeyEvent(ui::VKEY_PRIOR, ui::EF_ALT_DOWN, | 490 KeyPress), |
| 397 kKeycodeNumPadPrior, Mod1Mask, &xev); | 491 GetRewrittenEventAsString(&rewriter, |
| 398 aura::KeyEvent keyevent(&xev, false /* is_char */); | 492 ui::VKEY_HOME, |
| 399 rewriter.RewriteForTesting(&keyevent); | 493 ui::EF_ALT_DOWN, |
| 400 EXPECT_EQ(ui::VKEY_NUMPAD9, keyevent.key_code()); | 494 ui::ET_KEY_PRESSED, |
| 401 EXPECT_EQ(ui::EF_ALT_DOWN, keyevent.flags()); | 495 keycode_num_pad_home_, |
| 402 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 496 Mod1Mask)); |
| 403 EXPECT_EQ(kKeycodeNumPad9, xkey.keycode); | 497 |
| 404 EXPECT_EQ(static_cast<unsigned int>(Mod1Mask | Mod2Mask), xkey.state); | 498 // XK_KP_Up (= NumPad 8 without Num Lock), Alt modifier. |
| 405 } | 499 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD8, |
| 406 { | 500 ui::EF_ALT_DOWN, |
| 407 // XK_KP_0 (= NumPad 0 with Num Lock), Num Lock modifier. | 501 ui::ET_KEY_PRESSED, |
| 408 InitXKeyEvent(ui::VKEY_NUMPAD0, 0, kKeycodeNumPad0, Mod2Mask, &xev); | 502 keycode_num_pad_8_, |
| 409 aura::KeyEvent keyevent(&xev, false /* is_char */); | 503 Mod1Mask | Mod2Mask, |
| 410 rewriter.RewriteForTesting(&keyevent); | 504 KeyPress), |
| 411 EXPECT_EQ(ui::VKEY_NUMPAD0, keyevent.key_code()); | 505 GetRewrittenEventAsString(&rewriter, |
| 412 EXPECT_EQ(0, keyevent.flags()); | 506 ui::VKEY_UP, |
| 413 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 507 ui::EF_ALT_DOWN, |
| 414 EXPECT_EQ(kKeycodeNumPad0, xkey.keycode); | 508 ui::ET_KEY_PRESSED, |
| 415 EXPECT_EQ(static_cast<unsigned int>(Mod2Mask), xkey.state); | 509 keycode_num_pad_up_, |
| 416 } | 510 Mod1Mask)); |
| 417 { | 511 |
| 418 // XK_KP_DECIMAL (= NumPad . with Num Lock), Num Lock modifier. | 512 // XK_KP_Prior (= NumPad 9 without Num Lock), Alt modifier. |
| 419 InitXKeyEvent(ui::VKEY_DECIMAL, 0, kKeycodeNumPadDecimal, Mod2Mask, &xev); | 513 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD9, |
| 420 aura::KeyEvent keyevent(&xev, false /* is_char */); | 514 ui::EF_ALT_DOWN, |
| 421 rewriter.RewriteForTesting(&keyevent); | 515 ui::ET_KEY_PRESSED, |
| 422 EXPECT_EQ(ui::VKEY_DECIMAL, keyevent.key_code()); | 516 keycode_num_pad_9_, |
| 423 EXPECT_EQ(0, keyevent.flags()); | 517 Mod1Mask | Mod2Mask, |
| 424 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 518 KeyPress), |
| 425 EXPECT_EQ(kKeycodeNumPadDecimal, xkey.keycode); | 519 GetRewrittenEventAsString(&rewriter, |
| 426 EXPECT_EQ(static_cast<unsigned int>(Mod2Mask), xkey.state); | 520 ui::VKEY_PRIOR, |
| 427 } | 521 ui::EF_ALT_DOWN, |
| 428 { | 522 ui::ET_KEY_PRESSED, |
| 429 // XK_KP_1 (= NumPad 1 with Num Lock), Num Lock modifier. | 523 keycode_num_pad_prior_, |
| 430 InitXKeyEvent(ui::VKEY_NUMPAD1, 0, kKeycodeNumPad1, Mod2Mask, &xev); | 524 Mod1Mask)); |
| 431 aura::KeyEvent keyevent(&xev, false /* is_char */); | 525 |
| 432 rewriter.RewriteForTesting(&keyevent); | 526 // XK_KP_0 (= NumPad 0 with Num Lock), Num Lock modifier. |
| 433 EXPECT_EQ(ui::VKEY_NUMPAD1, keyevent.key_code()); | 527 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD0, |
| 434 EXPECT_EQ(0, keyevent.flags()); | 528 0, |
| 435 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 529 ui::ET_KEY_PRESSED, |
| 436 EXPECT_EQ(kKeycodeNumPad1, xkey.keycode); | 530 keycode_num_pad_0_, |
| 437 EXPECT_EQ(static_cast<unsigned int>(Mod2Mask), xkey.state); | 531 Mod2Mask, |
| 438 } | 532 KeyPress), |
| 439 { | 533 GetRewrittenEventAsString(&rewriter, |
| 440 // XK_KP_2 (= NumPad 2 with Num Lock), Num Lock modifier. | 534 ui::VKEY_NUMPAD0, |
| 441 InitXKeyEvent(ui::VKEY_NUMPAD2, 0, kKeycodeNumPad2, Mod2Mask, &xev); | 535 0, |
| 442 aura::KeyEvent keyevent(&xev, false /* is_char */); | 536 ui::ET_KEY_PRESSED, |
| 443 rewriter.RewriteForTesting(&keyevent); | 537 keycode_num_pad_0_, |
| 444 EXPECT_EQ(ui::VKEY_NUMPAD2, keyevent.key_code()); | 538 Mod2Mask)); |
| 445 EXPECT_EQ(0, keyevent.flags()); | 539 |
| 446 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 540 // XK_KP_DECIMAL (= NumPad . with Num Lock), Num Lock modifier. |
| 447 EXPECT_EQ(kKeycodeNumPad2, xkey.keycode); | 541 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_DECIMAL, |
| 448 EXPECT_EQ(static_cast<unsigned int>(Mod2Mask), xkey.state); | 542 0, |
| 449 } | 543 ui::ET_KEY_PRESSED, |
| 450 { | 544 keycode_num_pad_decimal_, |
| 451 // XK_KP_3 (= NumPad 3 with Num Lock), Num Lock modifier. | 545 Mod2Mask, |
| 452 InitXKeyEvent(ui::VKEY_NUMPAD3, 0, kKeycodeNumPad3, Mod2Mask, &xev); | 546 KeyPress), |
| 453 aura::KeyEvent keyevent(&xev, false /* is_char */); | 547 GetRewrittenEventAsString(&rewriter, |
| 454 rewriter.RewriteForTesting(&keyevent); | 548 ui::VKEY_DECIMAL, |
| 455 EXPECT_EQ(ui::VKEY_NUMPAD3, keyevent.key_code()); | 549 0, |
| 456 EXPECT_EQ(0, keyevent.flags()); | 550 ui::ET_KEY_PRESSED, |
| 457 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 551 keycode_num_pad_decimal_, |
| 458 EXPECT_EQ(kKeycodeNumPad3, xkey.keycode); | 552 Mod2Mask)); |
| 459 EXPECT_EQ(static_cast<unsigned int>(Mod2Mask), xkey.state); | 553 |
| 460 } | 554 // XK_KP_1 (= NumPad 1 with Num Lock), Num Lock modifier. |
| 461 { | 555 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD1, |
| 462 // XK_KP_4 (= NumPad 4 with Num Lock), Num Lock modifier. | 556 0, |
| 463 InitXKeyEvent(ui::VKEY_NUMPAD4, 0, kKeycodeNumPad4, Mod2Mask, &xev); | 557 ui::ET_KEY_PRESSED, |
| 464 aura::KeyEvent keyevent(&xev, false /* is_char */); | 558 keycode_num_pad_1_, |
| 465 rewriter.RewriteForTesting(&keyevent); | 559 Mod2Mask, |
| 466 EXPECT_EQ(ui::VKEY_NUMPAD4, keyevent.key_code()); | 560 KeyPress), |
| 467 EXPECT_EQ(0, keyevent.flags()); | 561 GetRewrittenEventAsString(&rewriter, |
| 468 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 562 ui::VKEY_NUMPAD1, |
| 469 EXPECT_EQ(kKeycodeNumPad4, xkey.keycode); | 563 0, |
| 470 EXPECT_EQ(static_cast<unsigned int>(Mod2Mask), xkey.state); | 564 ui::ET_KEY_PRESSED, |
| 471 } | 565 keycode_num_pad_1_, |
| 472 { | 566 Mod2Mask)); |
| 473 // XK_KP_5 (= NumPad 5 with Num Lock), Num Lock modifier. | 567 |
| 474 InitXKeyEvent(ui::VKEY_NUMPAD5, 0, kKeycodeNumPad5, Mod2Mask, &xev); | 568 // XK_KP_2 (= NumPad 2 with Num Lock), Num Lock modifier. |
| 475 aura::KeyEvent keyevent(&xev, false /* is_char */); | 569 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD2, |
| 476 rewriter.RewriteForTesting(&keyevent); | 570 0, |
| 477 EXPECT_EQ(ui::VKEY_NUMPAD5, keyevent.key_code()); | 571 ui::ET_KEY_PRESSED, |
| 478 EXPECT_EQ(0, keyevent.flags()); | 572 keycode_num_pad_2_, |
| 479 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 573 Mod2Mask, |
| 480 EXPECT_EQ(kKeycodeNumPad5, xkey.keycode); | 574 KeyPress), |
| 481 EXPECT_EQ(static_cast<unsigned int>(Mod2Mask), xkey.state); | 575 GetRewrittenEventAsString(&rewriter, |
| 482 } | 576 ui::VKEY_NUMPAD2, |
| 483 { | 577 0, |
| 484 // XK_KP_6 (= NumPad 6 with Num Lock), Num Lock modifier. | 578 ui::ET_KEY_PRESSED, |
| 485 InitXKeyEvent(ui::VKEY_NUMPAD6, 0, kKeycodeNumPad6, Mod2Mask, &xev); | 579 keycode_num_pad_2_, |
| 486 aura::KeyEvent keyevent(&xev, false /* is_char */); | 580 Mod2Mask)); |
| 487 rewriter.RewriteForTesting(&keyevent); | 581 |
| 488 EXPECT_EQ(ui::VKEY_NUMPAD6, keyevent.key_code()); | 582 // XK_KP_3 (= NumPad 3 with Num Lock), Num Lock modifier. |
| 489 EXPECT_EQ(0, keyevent.flags()); | 583 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD3, |
| 490 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 584 0, |
| 491 EXPECT_EQ(kKeycodeNumPad6, xkey.keycode); | 585 ui::ET_KEY_PRESSED, |
| 492 EXPECT_EQ(static_cast<unsigned int>(Mod2Mask), xkey.state); | 586 keycode_num_pad_3_, |
| 493 } | 587 Mod2Mask, |
| 494 { | 588 KeyPress), |
| 495 // XK_KP_7 (= NumPad 7 with Num Lock), Num Lock modifier. | 589 GetRewrittenEventAsString(&rewriter, |
| 496 InitXKeyEvent(ui::VKEY_NUMPAD7, 0, kKeycodeNumPad7, Mod2Mask, &xev); | 590 ui::VKEY_NUMPAD3, |
| 497 aura::KeyEvent keyevent(&xev, false /* is_char */); | 591 0, |
| 498 rewriter.RewriteForTesting(&keyevent); | 592 ui::ET_KEY_PRESSED, |
| 499 EXPECT_EQ(ui::VKEY_NUMPAD7, keyevent.key_code()); | 593 keycode_num_pad_3_, |
| 500 EXPECT_EQ(0, keyevent.flags()); | 594 Mod2Mask)); |
| 501 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 595 |
| 502 EXPECT_EQ(kKeycodeNumPad7, xkey.keycode); | 596 // XK_KP_4 (= NumPad 4 with Num Lock), Num Lock modifier. |
| 503 EXPECT_EQ(static_cast<unsigned int>(Mod2Mask), xkey.state); | 597 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD4, |
| 504 } | 598 0, |
| 505 { | 599 ui::ET_KEY_PRESSED, |
| 506 // XK_KP_8 (= NumPad 8 with Num Lock), Num Lock modifier. | 600 keycode_num_pad_4_, |
| 507 InitXKeyEvent(ui::VKEY_NUMPAD8, 0, kKeycodeNumPad8, Mod2Mask, &xev); | 601 Mod2Mask, |
| 508 aura::KeyEvent keyevent(&xev, false /* is_char */); | 602 KeyPress), |
| 509 rewriter.RewriteForTesting(&keyevent); | 603 GetRewrittenEventAsString(&rewriter, |
| 510 EXPECT_EQ(ui::VKEY_NUMPAD8, keyevent.key_code()); | 604 ui::VKEY_NUMPAD4, |
| 511 EXPECT_EQ(0, keyevent.flags()); | 605 0, |
| 512 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 606 ui::ET_KEY_PRESSED, |
| 513 EXPECT_EQ(kKeycodeNumPad8, xkey.keycode); | 607 keycode_num_pad_4_, |
| 514 EXPECT_EQ(static_cast<unsigned int>(Mod2Mask), xkey.state); | 608 Mod2Mask)); |
| 515 } | 609 |
| 516 { | 610 // XK_KP_5 (= NumPad 5 with Num Lock), Num Lock modifier. |
| 517 // XK_KP_9 (= NumPad 9 with Num Lock), Num Lock modifier. | 611 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD5, |
| 518 InitXKeyEvent(ui::VKEY_NUMPAD9, 0, kKeycodeNumPad9, Mod2Mask, &xev); | 612 0, |
| 519 aura::KeyEvent keyevent(&xev, false /* is_char */); | 613 ui::ET_KEY_PRESSED, |
| 520 rewriter.RewriteForTesting(&keyevent); | 614 keycode_num_pad_5_, |
| 521 EXPECT_EQ(ui::VKEY_NUMPAD9, keyevent.key_code()); | 615 Mod2Mask, |
| 522 EXPECT_EQ(0, keyevent.flags()); | 616 KeyPress), |
| 523 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 617 GetRewrittenEventAsString(&rewriter, |
| 524 EXPECT_EQ(kKeycodeNumPad9, xkey.keycode); | 618 ui::VKEY_NUMPAD5, |
| 525 EXPECT_EQ(static_cast<unsigned int>(Mod2Mask), xkey.state); | 619 0, |
| 526 } | 620 ui::ET_KEY_PRESSED, |
| 621 keycode_num_pad_5_, |
| 622 Mod2Mask)); |
| 623 |
| 624 // XK_KP_6 (= NumPad 6 with Num Lock), Num Lock modifier. |
| 625 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD6, |
| 626 0, |
| 627 ui::ET_KEY_PRESSED, |
| 628 keycode_num_pad_6_, |
| 629 Mod2Mask, |
| 630 KeyPress), |
| 631 GetRewrittenEventAsString(&rewriter, |
| 632 ui::VKEY_NUMPAD6, |
| 633 0, |
| 634 ui::ET_KEY_PRESSED, |
| 635 keycode_num_pad_6_, |
| 636 Mod2Mask)); |
| 637 |
| 638 // XK_KP_7 (= NumPad 7 with Num Lock), Num Lock modifier. |
| 639 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD7, |
| 640 0, |
| 641 ui::ET_KEY_PRESSED, |
| 642 keycode_num_pad_7_, |
| 643 Mod2Mask, |
| 644 KeyPress), |
| 645 GetRewrittenEventAsString(&rewriter, |
| 646 ui::VKEY_NUMPAD7, |
| 647 0, |
| 648 ui::ET_KEY_PRESSED, |
| 649 keycode_num_pad_7_, |
| 650 Mod2Mask)); |
| 651 |
| 652 // XK_KP_8 (= NumPad 8 with Num Lock), Num Lock modifier. |
| 653 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD8, |
| 654 0, |
| 655 ui::ET_KEY_PRESSED, |
| 656 keycode_num_pad_8_, |
| 657 Mod2Mask, |
| 658 KeyPress), |
| 659 GetRewrittenEventAsString(&rewriter, |
| 660 ui::VKEY_NUMPAD8, |
| 661 0, |
| 662 ui::ET_KEY_PRESSED, |
| 663 keycode_num_pad_8_, |
| 664 Mod2Mask)); |
| 665 |
| 666 // XK_KP_9 (= NumPad 9 with Num Lock), Num Lock modifier. |
| 667 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD9, |
| 668 0, |
| 669 ui::ET_KEY_PRESSED, |
| 670 keycode_num_pad_9_, |
| 671 Mod2Mask, |
| 672 KeyPress), |
| 673 GetRewrittenEventAsString(&rewriter, |
| 674 ui::VKEY_NUMPAD9, |
| 675 0, |
| 676 ui::ET_KEY_PRESSED, |
| 677 keycode_num_pad_9_, |
| 678 Mod2Mask)); |
| 527 } | 679 } |
| 528 | 680 |
| 529 // Tests if the rewriter can handle a Command + Num Pad event. | 681 // Tests if the rewriter can handle a Command + Num Pad event. |
| 530 TEST(KeyRewriterTest, TestRewriteNumPadKeysOnAppleKeyboard) { | 682 TEST_F(KeyRewriterTest, TestRewriteNumPadKeysOnAppleKeyboard) { |
| 531 XEvent xev; | 683 TestingPrefService prefs; |
| 532 Display* display = ui::GetXDisplay(); | |
| 533 | |
| 534 const unsigned int kKeycodeNumPadEnd = XKeysymToKeycode(display, XK_KP_End); | |
| 535 const unsigned int kKeycodeNumPad1 = XKeysymToKeycode(display, XK_KP_1); | |
| 536 | |
| 537 KeyRewriter rewriter; | 684 KeyRewriter rewriter; |
| 538 rewriter.DeviceAddedForTesting(0, "Apple Keyboard"); | 685 rewriter.DeviceAddedForTesting(0, "Apple Keyboard"); |
| 539 rewriter.set_last_device_id_for_testing(0); | 686 rewriter.set_last_device_id_for_testing(0); |
| 540 { | 687 rewriter.set_pref_service_for_testing(&prefs); |
| 541 // XK_KP_End (= NumPad 1 without Num Lock), Win modifier. | 688 |
| 542 InitXKeyEvent(ui::VKEY_END, 0, kKeycodeNumPadEnd, Mod4Mask, &xev); | 689 // XK_KP_End (= NumPad 1 without Num Lock), Win modifier. |
| 543 aura::KeyEvent keyevent(&xev, false /* is_char */); | 690 // The result should be "Num Pad 1 with Control + Num Lock modifiers". |
| 544 rewriter.RewriteForTesting(&keyevent); | 691 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD1, |
| 545 // The result should be "Num Pad 1 with Control + Num Lock modifiers". | 692 ui::EF_CONTROL_DOWN, |
| 546 EXPECT_EQ(ui::VKEY_NUMPAD1, keyevent.key_code()); | 693 ui::ET_KEY_PRESSED, |
| 547 EXPECT_EQ(ui::EF_CONTROL_DOWN, keyevent.flags()); | 694 keycode_num_pad_1_, |
| 548 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 695 ControlMask | Mod2Mask, |
| 549 EXPECT_EQ(kKeycodeNumPad1, xkey.keycode); | 696 KeyPress), |
| 550 EXPECT_EQ(static_cast<unsigned int>(ControlMask | Mod2Mask), xkey.state); | 697 GetRewrittenEventAsString(&rewriter, |
| 551 } | 698 ui::VKEY_END, |
| 552 { | 699 0, |
| 553 // XK_KP_1 (= NumPad 1 without Num Lock), Win modifier. | 700 ui::ET_KEY_PRESSED, |
| 554 InitXKeyEvent(ui::VKEY_NUMPAD1, 0, kKeycodeNumPadEnd, Mod4Mask, &xev); | 701 keycode_num_pad_end_, |
| 555 aura::KeyEvent keyevent(&xev, false /* is_char */); | 702 Mod4Mask)); |
| 556 rewriter.RewriteForTesting(&keyevent); | 703 |
| 557 // The result should also be "Num Pad 1 with Control + Num Lock modifiers". | 704 // XK_KP_1 (= NumPad 1 without Num Lock), Win modifier. |
| 558 EXPECT_EQ(ui::VKEY_NUMPAD1, keyevent.key_code()); | 705 // The result should also be "Num Pad 1 with Control + Num Lock modifiers". |
| 559 EXPECT_EQ(ui::EF_CONTROL_DOWN, keyevent.flags()); | 706 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD1, |
| 560 const XKeyEvent& xkey = keyevent.native_event()->xkey; | 707 ui::EF_CONTROL_DOWN, |
| 561 EXPECT_EQ(kKeycodeNumPad1, xkey.keycode); | 708 ui::ET_KEY_PRESSED, |
| 562 EXPECT_EQ(static_cast<unsigned int>(ControlMask | Mod2Mask), xkey.state); | 709 keycode_num_pad_1_, |
| 563 } | 710 ControlMask | Mod2Mask, |
| 711 KeyPress), |
| 712 GetRewrittenEventAsString(&rewriter, |
| 713 ui::VKEY_NUMPAD1, |
| 714 0, |
| 715 ui::ET_KEY_PRESSED, |
| 716 keycode_num_pad_end_, |
| 717 Mod4Mask)); |
| 564 } | 718 } |
| 565 | 719 |
| 720 TEST_F(KeyRewriterTest, TestRewriteModifiersNoRemap) { |
| 721 TestingPrefService prefs; |
| 722 KeyRewriter rewriter; |
| 723 rewriter.set_pref_service_for_testing(&prefs); |
| 724 |
| 725 // Press Search. Confirm the event is not rewritten. |
| 726 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_LWIN, |
| 727 0, |
| 728 ui::ET_KEY_PRESSED, |
| 729 keycode_super_l_, |
| 730 0U, |
| 731 KeyPress), |
| 732 GetRewrittenEventAsString(&rewriter, |
| 733 ui::VKEY_LWIN, |
| 734 0, |
| 735 ui::ET_KEY_PRESSED, |
| 736 keycode_super_l_, |
| 737 0U)); |
| 738 |
| 739 // Press left Control. Confirm the event is not rewritten. |
| 740 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, |
| 741 0, |
| 742 ui::ET_KEY_PRESSED, |
| 743 keycode_control_l_, |
| 744 0U, |
| 745 KeyPress), |
| 746 GetRewrittenEventAsString(&rewriter, |
| 747 ui::VKEY_CONTROL, |
| 748 0, |
| 749 ui::ET_KEY_PRESSED, |
| 750 keycode_control_l_, |
| 751 0U)); |
| 752 |
| 753 // Press right Control. Confirm the event is not rewritten. |
| 754 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, |
| 755 0, |
| 756 ui::ET_KEY_PRESSED, |
| 757 keycode_control_r_, |
| 758 0U, |
| 759 KeyPress), |
| 760 GetRewrittenEventAsString(&rewriter, |
| 761 ui::VKEY_CONTROL, |
| 762 0, |
| 763 ui::ET_KEY_PRESSED, |
| 764 keycode_control_r_, |
| 765 0U)); |
| 766 |
| 767 // Press left Alt. Confirm the event is not rewritten. |
| 768 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU, |
| 769 0, |
| 770 ui::ET_KEY_PRESSED, |
| 771 keycode_alt_l_, |
| 772 0, |
| 773 KeyPress), |
| 774 GetRewrittenEventAsString(&rewriter, |
| 775 ui::VKEY_MENU, |
| 776 0, |
| 777 ui::ET_KEY_PRESSED, |
| 778 keycode_alt_l_, |
| 779 0U)); |
| 780 |
| 781 // Press right Alt. Confirm the event is not rewritten. |
| 782 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU, |
| 783 0, |
| 784 ui::ET_KEY_PRESSED, |
| 785 keycode_alt_r_, |
| 786 0, |
| 787 KeyPress), |
| 788 GetRewrittenEventAsString(&rewriter, |
| 789 ui::VKEY_MENU, |
| 790 0, |
| 791 ui::ET_KEY_PRESSED, |
| 792 keycode_alt_r_, |
| 793 0U)); |
| 794 |
| 795 // Test KeyRelease event, just in case. |
| 796 // Release Search. Confirm the release event is not rewritten. |
| 797 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_LWIN, |
| 798 0, |
| 799 ui::ET_KEY_RELEASED, |
| 800 keycode_super_l_, |
| 801 Mod4Mask, |
| 802 KeyRelease), |
| 803 GetRewrittenEventAsString(&rewriter, |
| 804 ui::VKEY_LWIN, |
| 805 0, |
| 806 ui::ET_KEY_RELEASED, |
| 807 keycode_super_l_, |
| 808 Mod4Mask)); |
| 809 } |
| 810 |
| 811 TEST_F(KeyRewriterTest, TestRewriteModifiersNoRemapMultipleKeys) { |
| 812 TestingPrefService prefs; |
| 813 KeyRewriter rewriter; |
| 814 rewriter.set_pref_service_for_testing(&prefs); |
| 815 |
| 816 // Press left Alt with Shift. Confirm the event is not rewritten. |
| 817 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU, |
| 818 ui::EF_SHIFT_DOWN, |
| 819 ui::ET_KEY_PRESSED, |
| 820 keycode_meta_l_, |
| 821 ShiftMask, |
| 822 KeyPress), |
| 823 GetRewrittenEventAsString(&rewriter, |
| 824 ui::VKEY_MENU, |
| 825 ui::EF_SHIFT_DOWN, |
| 826 ui::ET_KEY_PRESSED, |
| 827 keycode_meta_l_, |
| 828 ShiftMask)); |
| 829 |
| 830 // Press right Alt with Shift. Confirm the event is not rewritten. |
| 831 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU, |
| 832 ui::EF_SHIFT_DOWN, |
| 833 ui::ET_KEY_PRESSED, |
| 834 keycode_meta_r_, |
| 835 ShiftMask, |
| 836 KeyPress), |
| 837 GetRewrittenEventAsString(&rewriter, |
| 838 ui::VKEY_MENU, |
| 839 ui::EF_SHIFT_DOWN, |
| 840 ui::ET_KEY_PRESSED, |
| 841 keycode_meta_r_, |
| 842 ShiftMask)); |
| 843 |
| 844 // Press Search with Caps Lock mask. Confirm the event is not rewritten. |
| 845 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_LWIN, |
| 846 ui::EF_CAPS_LOCK_DOWN, |
| 847 ui::ET_KEY_PRESSED, |
| 848 keycode_super_l_, |
| 849 LockMask, |
| 850 KeyPress), |
| 851 GetRewrittenEventAsString(&rewriter, |
| 852 ui::VKEY_LWIN, |
| 853 ui::EF_CAPS_LOCK_DOWN, |
| 854 ui::ET_KEY_PRESSED, |
| 855 keycode_super_l_, |
| 856 LockMask)); |
| 857 |
| 858 // Release Search with Caps Lock mask. Confirm the event is not rewritten. |
| 859 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_LWIN, |
| 860 ui::EF_CAPS_LOCK_DOWN, |
| 861 ui::ET_KEY_RELEASED, |
| 862 keycode_super_l_, |
| 863 LockMask | Mod4Mask, |
| 864 KeyRelease), |
| 865 GetRewrittenEventAsString(&rewriter, |
| 866 ui::VKEY_LWIN, |
| 867 ui::EF_CAPS_LOCK_DOWN, |
| 868 ui::ET_KEY_RELEASED, |
| 869 keycode_super_l_, |
| 870 LockMask | Mod4Mask)); |
| 871 |
| 872 // Press Shift+Ctrl+Alt+Search+A. Confirm the event is not rewritten. |
| 873 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_B, |
| 874 ui::EF_SHIFT_DOWN | |
| 875 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, |
| 876 ui::ET_KEY_PRESSED, |
| 877 keycode_b_, |
| 878 ShiftMask | ControlMask | Mod1Mask | |
| 879 Mod4Mask, |
| 880 KeyPress), |
| 881 GetRewrittenEventAsString(&rewriter, |
| 882 ui::VKEY_B, |
| 883 ui::EF_SHIFT_DOWN | |
| 884 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, |
| 885 ui::ET_KEY_PRESSED, |
| 886 keycode_b_, |
| 887 ShiftMask | ControlMask | Mod1Mask | |
| 888 Mod4Mask)); |
| 889 } |
| 890 |
| 891 TEST_F(KeyRewriterTest, TestRewriteModifiersDisableSome) { |
| 892 // Disable Search and Control keys. |
| 893 TestingPrefService prefs; |
| 894 chromeos::Preferences::RegisterUserPrefs(&prefs); |
| 895 IntegerPrefMember search; |
| 896 search.Init(prefs::kLanguageXkbRemapSearchKeyTo, &prefs, NULL); |
| 897 search.SetValue(chromeos::input_method::kVoidKey); |
| 898 IntegerPrefMember control; |
| 899 control.Init(prefs::kLanguageXkbRemapControlKeyTo, &prefs, NULL); |
| 900 control.SetValue(chromeos::input_method::kVoidKey); |
| 901 |
| 902 KeyRewriter rewriter; |
| 903 rewriter.set_pref_service_for_testing(&prefs); |
| 904 |
| 905 // Press left Alt with Shift. This key press shouldn't be affected by the |
| 906 // pref. Confirm the event is not rewritten. |
| 907 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU, |
| 908 ui::EF_SHIFT_DOWN, |
| 909 ui::ET_KEY_PRESSED, |
| 910 keycode_meta_l_, |
| 911 ShiftMask, |
| 912 KeyPress), |
| 913 GetRewrittenEventAsString(&rewriter, |
| 914 ui::VKEY_MENU, |
| 915 ui::EF_SHIFT_DOWN, |
| 916 ui::ET_KEY_PRESSED, |
| 917 keycode_meta_l_, |
| 918 ShiftMask)); |
| 919 |
| 920 // Press Search. Confirm the event is now VKEY_UNKNOWN + XK_VoidSymbol. |
| 921 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_UNKNOWN, |
| 922 0, |
| 923 ui::ET_KEY_PRESSED, |
| 924 keycode_void_symbol_, |
| 925 0U, |
| 926 KeyPress), |
| 927 GetRewrittenEventAsString(&rewriter, |
| 928 ui::VKEY_LWIN, |
| 929 0, |
| 930 ui::ET_KEY_PRESSED, |
| 931 keycode_super_l_, |
| 932 0U)); |
| 933 |
| 934 // Press Control. Confirm the event is now VKEY_UNKNOWN + XK_VoidSymbol. |
| 935 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_UNKNOWN, |
| 936 0, |
| 937 ui::ET_KEY_PRESSED, |
| 938 keycode_void_symbol_, |
| 939 0U, |
| 940 KeyPress), |
| 941 GetRewrittenEventAsString(&rewriter, |
| 942 ui::VKEY_CONTROL, |
| 943 0, |
| 944 ui::ET_KEY_PRESSED, |
| 945 keycode_control_l_, |
| 946 0U)); |
| 947 |
| 948 // Press Control+Search. Confirm the event is now VKEY_UNKNOWN + |
| 949 // XK_VoidSymbol without any modifiers. |
| 950 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_UNKNOWN, |
| 951 0, |
| 952 ui::ET_KEY_PRESSED, |
| 953 keycode_void_symbol_, |
| 954 0U, |
| 955 KeyPress), |
| 956 GetRewrittenEventAsString(&rewriter, |
| 957 ui::VKEY_LWIN, |
| 958 ui::EF_CONTROL_DOWN, |
| 959 ui::ET_KEY_PRESSED, |
| 960 keycode_super_l_, |
| 961 ControlMask)); |
| 962 |
| 963 // Press Control+Search+a. Confirm the event is now VKEY_A without any |
| 964 // modifiers. |
| 965 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, |
| 966 0, |
| 967 ui::ET_KEY_PRESSED, |
| 968 keycode_a_, |
| 969 0U, |
| 970 KeyPress), |
| 971 GetRewrittenEventAsString(&rewriter, |
| 972 ui::VKEY_A, |
| 973 ui::EF_CONTROL_DOWN, |
| 974 ui::ET_KEY_PRESSED, |
| 975 keycode_a_, |
| 976 ControlMask | Mod4Mask)); |
| 977 |
| 978 // Press Control+Search+Alt+a. Confirm the event is now VKEY_A only with |
| 979 // the Alt modifier. |
| 980 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, |
| 981 ui::EF_ALT_DOWN, |
| 982 ui::ET_KEY_PRESSED, |
| 983 keycode_a_, |
| 984 Mod1Mask, |
| 985 KeyPress), |
| 986 GetRewrittenEventAsString(&rewriter, |
| 987 ui::VKEY_A, |
| 988 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, |
| 989 ui::ET_KEY_PRESSED, |
| 990 keycode_a_, |
| 991 ControlMask | Mod1Mask | Mod4Mask)); |
| 992 |
| 993 // Remap Alt to Control. |
| 994 IntegerPrefMember alt; |
| 995 alt.Init(prefs::kLanguageXkbRemapAltKeyTo, &prefs, NULL); |
| 996 alt.SetValue(chromeos::input_method::kControlKey); |
| 997 |
| 998 // Press left Alt. Confirm the event is now VKEY_CONTROL + XK_Control_L |
| 999 // even though the Control key itself is disabled. |
| 1000 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, |
| 1001 0, |
| 1002 ui::ET_KEY_PRESSED, |
| 1003 keycode_control_l_, |
| 1004 0U, |
| 1005 KeyPress), |
| 1006 GetRewrittenEventAsString(&rewriter, |
| 1007 ui::VKEY_MENU, |
| 1008 0, |
| 1009 ui::ET_KEY_PRESSED, |
| 1010 keycode_alt_l_, |
| 1011 0U)); |
| 1012 |
| 1013 // Press Alt+a. Confirm the event is now Control+a even though the Control |
| 1014 // key itself is disabled. |
| 1015 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, |
| 1016 ui::EF_CONTROL_DOWN, |
| 1017 ui::ET_KEY_PRESSED, |
| 1018 keycode_a_, |
| 1019 ControlMask, |
| 1020 KeyPress), |
| 1021 GetRewrittenEventAsString(&rewriter, |
| 1022 ui::VKEY_A, |
| 1023 ui::EF_ALT_DOWN, |
| 1024 ui::ET_KEY_PRESSED, |
| 1025 keycode_a_, |
| 1026 Mod1Mask)); |
| 1027 } |
| 1028 |
| 1029 TEST_F(KeyRewriterTest, TestRewriteModifiersRemapToControl) { |
| 1030 // Remap Search to Control. |
| 1031 TestingPrefService prefs; |
| 1032 chromeos::Preferences::RegisterUserPrefs(&prefs); |
| 1033 IntegerPrefMember search; |
| 1034 search.Init(prefs::kLanguageXkbRemapSearchKeyTo, &prefs, NULL); |
| 1035 search.SetValue(chromeos::input_method::kControlKey); |
| 1036 |
| 1037 KeyRewriter rewriter; |
| 1038 rewriter.set_pref_service_for_testing(&prefs); |
| 1039 |
| 1040 // Press Search. Confirm the event is now VKEY_CONTROL + XK_Control_L. |
| 1041 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, |
| 1042 0, |
| 1043 ui::ET_KEY_PRESSED, |
| 1044 keycode_control_l_, |
| 1045 0U, |
| 1046 KeyPress), |
| 1047 GetRewrittenEventAsString(&rewriter, |
| 1048 ui::VKEY_LWIN, |
| 1049 0, |
| 1050 ui::ET_KEY_PRESSED, |
| 1051 keycode_super_l_, |
| 1052 0U)); |
| 1053 |
| 1054 // Remap Alt to Control too. |
| 1055 IntegerPrefMember alt; |
| 1056 alt.Init(prefs::kLanguageXkbRemapAltKeyTo, &prefs, NULL); |
| 1057 alt.SetValue(chromeos::input_method::kControlKey); |
| 1058 |
| 1059 // Press left Alt. Confirm the event is now VKEY_CONTROL + XK_Control_L. |
| 1060 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, |
| 1061 0, |
| 1062 ui::ET_KEY_PRESSED, |
| 1063 keycode_control_l_, |
| 1064 0U, |
| 1065 KeyPress), |
| 1066 GetRewrittenEventAsString(&rewriter, |
| 1067 ui::VKEY_MENU, |
| 1068 0, |
| 1069 ui::ET_KEY_PRESSED, |
| 1070 keycode_alt_l_, |
| 1071 0U)); |
| 1072 |
| 1073 // Press right Alt. Confirm the event is now VKEY_CONTROL + XK_Control_R. |
| 1074 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, |
| 1075 0, |
| 1076 ui::ET_KEY_PRESSED, |
| 1077 keycode_control_r_, |
| 1078 0U, |
| 1079 KeyPress), |
| 1080 GetRewrittenEventAsString(&rewriter, |
| 1081 ui::VKEY_MENU, |
| 1082 0, |
| 1083 ui::ET_KEY_PRESSED, |
| 1084 keycode_alt_r_, |
| 1085 0U)); |
| 1086 |
| 1087 // Press Alt+Search. Confirm the event is now VKEY_CONTROL + XK_Control_L. |
| 1088 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, |
| 1089 ui::EF_CONTROL_DOWN, |
| 1090 ui::ET_KEY_PRESSED, |
| 1091 keycode_control_l_, |
| 1092 ControlMask, |
| 1093 KeyPress), |
| 1094 GetRewrittenEventAsString(&rewriter, |
| 1095 ui::VKEY_LWIN, |
| 1096 ui::EF_ALT_DOWN, |
| 1097 ui::ET_KEY_PRESSED, |
| 1098 keycode_super_l_, |
| 1099 Mod1Mask)); |
| 1100 |
| 1101 // Press Control+Alt+Search. Confirm the event is now VKEY_CONTROL + |
| 1102 // XK_Control_L. |
| 1103 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, |
| 1104 ui::EF_CONTROL_DOWN, |
| 1105 ui::ET_KEY_PRESSED, |
| 1106 keycode_control_l_, |
| 1107 ControlMask, |
| 1108 KeyPress), |
| 1109 GetRewrittenEventAsString(&rewriter, |
| 1110 ui::VKEY_LWIN, |
| 1111 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, |
| 1112 ui::ET_KEY_PRESSED, |
| 1113 keycode_super_l_, |
| 1114 ControlMask | Mod1Mask)); |
| 1115 |
| 1116 // Press Shift+Control+Alt+Search. Confirm the event is now Control with |
| 1117 // Shift and Control modifiers. |
| 1118 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, |
| 1119 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, |
| 1120 ui::ET_KEY_PRESSED, |
| 1121 keycode_control_l_, |
| 1122 ShiftMask | ControlMask, |
| 1123 KeyPress), |
| 1124 GetRewrittenEventAsString(&rewriter, |
| 1125 ui::VKEY_LWIN, |
| 1126 ui::EF_SHIFT_DOWN | |
| 1127 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, |
| 1128 ui::ET_KEY_PRESSED, |
| 1129 keycode_super_l_, |
| 1130 ShiftMask | ControlMask | Mod1Mask)); |
| 1131 |
| 1132 // Press Shift+Control+Alt+Search+B. Confirm the event is now B with Shift |
| 1133 // and Control modifiers. |
| 1134 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_B, |
| 1135 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, |
| 1136 ui::ET_KEY_PRESSED, |
| 1137 keycode_b_, |
| 1138 ShiftMask | ControlMask, |
| 1139 KeyPress), |
| 1140 GetRewrittenEventAsString(&rewriter, |
| 1141 ui::VKEY_B, |
| 1142 ui::EF_SHIFT_DOWN | |
| 1143 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, |
| 1144 ui::ET_KEY_PRESSED, |
| 1145 keycode_b_, |
| 1146 ShiftMask | ControlMask | Mod1Mask)); |
| 1147 } |
| 1148 |
| 1149 TEST_F(KeyRewriterTest, TestRewriteModifiersRemapMany) { |
| 1150 // Remap Search to Alt. |
| 1151 TestingPrefService prefs; |
| 1152 chromeos::Preferences::RegisterUserPrefs(&prefs); |
| 1153 IntegerPrefMember search; |
| 1154 search.Init(prefs::kLanguageXkbRemapSearchKeyTo, &prefs, NULL); |
| 1155 search.SetValue(chromeos::input_method::kAltKey); |
| 1156 |
| 1157 KeyRewriter rewriter; |
| 1158 rewriter.set_pref_service_for_testing(&prefs); |
| 1159 |
| 1160 // Press Search. Confirm the event is now VKEY_MENU + XK_Alt_L. |
| 1161 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU, |
| 1162 0, |
| 1163 ui::ET_KEY_PRESSED, |
| 1164 keycode_alt_l_, |
| 1165 0U, |
| 1166 KeyPress), |
| 1167 GetRewrittenEventAsString(&rewriter, |
| 1168 ui::VKEY_LWIN, |
| 1169 0, |
| 1170 ui::ET_KEY_PRESSED, |
| 1171 keycode_super_l_, |
| 1172 0U)); |
| 1173 |
| 1174 // Remap Alt to Control. |
| 1175 IntegerPrefMember alt; |
| 1176 alt.Init(prefs::kLanguageXkbRemapAltKeyTo, &prefs, NULL); |
| 1177 alt.SetValue(chromeos::input_method::kControlKey); |
| 1178 |
| 1179 // Press left Alt. Confirm the event is now VKEY_CONTROL + XK_Control_L. |
| 1180 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, |
| 1181 0, |
| 1182 ui::ET_KEY_PRESSED, |
| 1183 keycode_control_l_, |
| 1184 0U, |
| 1185 KeyPress), |
| 1186 GetRewrittenEventAsString(&rewriter, |
| 1187 ui::VKEY_MENU, |
| 1188 0, |
| 1189 ui::ET_KEY_PRESSED, |
| 1190 keycode_alt_l_, |
| 1191 0U)); |
| 1192 |
| 1193 // Remap Control to Search. |
| 1194 IntegerPrefMember control; |
| 1195 control.Init(prefs::kLanguageXkbRemapControlKeyTo, &prefs, NULL); |
| 1196 control.SetValue(chromeos::input_method::kSearchKey); |
| 1197 |
| 1198 // Press left Control. Confirm the event is now VKEY_LWIN. |
| 1199 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_LWIN, |
| 1200 0, |
| 1201 ui::ET_KEY_PRESSED, |
| 1202 keycode_super_l_, |
| 1203 0U, |
| 1204 KeyPress), |
| 1205 GetRewrittenEventAsString(&rewriter, |
| 1206 ui::VKEY_CONTROL, |
| 1207 0, |
| 1208 ui::ET_KEY_PRESSED, |
| 1209 keycode_control_l_, |
| 1210 0U)); |
| 1211 |
| 1212 // Then, press all of the three, Control+Alt+Search. |
| 1213 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU, |
| 1214 ui::EF_CONTROL_DOWN, |
| 1215 ui::ET_KEY_PRESSED, |
| 1216 keycode_alt_l_, |
| 1217 ControlMask | Mod4Mask, |
| 1218 KeyPress), |
| 1219 GetRewrittenEventAsString(&rewriter, |
| 1220 ui::VKEY_LWIN, |
| 1221 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, |
| 1222 ui::ET_KEY_PRESSED, |
| 1223 keycode_super_l_, |
| 1224 ControlMask | Mod1Mask)); |
| 1225 |
| 1226 // Press Shift+Control+Alt+Search. |
| 1227 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU, |
| 1228 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, |
| 1229 ui::ET_KEY_PRESSED, |
| 1230 keycode_alt_l_, |
| 1231 ShiftMask | ControlMask | Mod4Mask, |
| 1232 KeyPress), |
| 1233 GetRewrittenEventAsString(&rewriter, |
| 1234 ui::VKEY_LWIN, |
| 1235 ui::EF_SHIFT_DOWN | |
| 1236 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, |
| 1237 ui::ET_KEY_PRESSED, |
| 1238 keycode_super_l_, |
| 1239 ShiftMask | ControlMask | Mod1Mask)); |
| 1240 |
| 1241 // Press Shift+Control+Alt+Search+B |
| 1242 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_B, |
| 1243 ui::EF_SHIFT_DOWN | |
| 1244 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, |
| 1245 ui::ET_KEY_PRESSED, |
| 1246 keycode_b_, |
| 1247 ShiftMask | ControlMask | Mod1Mask | |
| 1248 Mod4Mask, |
| 1249 KeyPress), |
| 1250 GetRewrittenEventAsString(&rewriter, |
| 1251 ui::VKEY_B, |
| 1252 ui::EF_SHIFT_DOWN | |
| 1253 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, |
| 1254 ui::ET_KEY_PRESSED, |
| 1255 keycode_b_, |
| 1256 ShiftMask | ControlMask | Mod1Mask | |
| 1257 Mod4Mask)); |
| 1258 } |
| 1259 |
| 1260 TEST_F(KeyRewriterTest, TestRewriteModifiersRemapToCapsLock) { |
| 1261 // Remap Search to Caps Lock. |
| 1262 TestingPrefService prefs; |
| 1263 chromeos::Preferences::RegisterUserPrefs(&prefs); |
| 1264 IntegerPrefMember search; |
| 1265 search.Init(prefs::kLanguageXkbRemapSearchKeyTo, &prefs, NULL); |
| 1266 search.SetValue(chromeos::input_method::kCapsLockKey); |
| 1267 |
| 1268 chromeos::input_method::MockXKeyboard xkeyboard; |
| 1269 KeyRewriter rewriter; |
| 1270 rewriter.set_pref_service_for_testing(&prefs); |
| 1271 rewriter.set_xkeyboard_for_testing(&xkeyboard); |
| 1272 EXPECT_FALSE(xkeyboard.caps_lock_is_enabled_); |
| 1273 |
| 1274 // Press Search. |
| 1275 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, |
| 1276 0, |
| 1277 ui::ET_KEY_PRESSED, |
| 1278 keycode_caps_lock_, |
| 1279 0U, |
| 1280 KeyPress), |
| 1281 GetRewrittenEventAsString(&rewriter, |
| 1282 ui::VKEY_LWIN, |
| 1283 0, |
| 1284 ui::ET_KEY_PRESSED, |
| 1285 keycode_super_l_, |
| 1286 0U)); |
| 1287 // Confirm that the Caps Lock status is changed. |
| 1288 EXPECT_TRUE(xkeyboard.caps_lock_is_enabled_); |
| 1289 |
| 1290 // Release Search. |
| 1291 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, |
| 1292 ui::EF_CAPS_LOCK_DOWN, |
| 1293 ui::ET_KEY_RELEASED, |
| 1294 keycode_caps_lock_, |
| 1295 LockMask, |
| 1296 KeyRelease), |
| 1297 GetRewrittenEventAsString(&rewriter, |
| 1298 ui::VKEY_LWIN, |
| 1299 ui::EF_CAPS_LOCK_DOWN, |
| 1300 ui::ET_KEY_RELEASED, |
| 1301 keycode_super_l_, |
| 1302 Mod4Mask | LockMask)); |
| 1303 // Confirm that the Caps Lock status is not changed. |
| 1304 EXPECT_TRUE(xkeyboard.caps_lock_is_enabled_); |
| 1305 |
| 1306 // Press Search. |
| 1307 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, |
| 1308 ui::EF_CAPS_LOCK_DOWN, |
| 1309 ui::ET_KEY_PRESSED, |
| 1310 keycode_caps_lock_, |
| 1311 LockMask, |
| 1312 KeyPress), |
| 1313 GetRewrittenEventAsString(&rewriter, |
| 1314 ui::VKEY_LWIN, |
| 1315 ui::EF_CAPS_LOCK_DOWN, |
| 1316 ui::ET_KEY_PRESSED, |
| 1317 keycode_super_l_, |
| 1318 LockMask)); |
| 1319 // Confirm that the Caps Lock status is changed. |
| 1320 EXPECT_FALSE(xkeyboard.caps_lock_is_enabled_); |
| 1321 |
| 1322 // Release Search. |
| 1323 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, |
| 1324 ui::EF_CAPS_LOCK_DOWN, |
| 1325 ui::ET_KEY_RELEASED, |
| 1326 keycode_caps_lock_, |
| 1327 LockMask, |
| 1328 KeyRelease), |
| 1329 GetRewrittenEventAsString(&rewriter, |
| 1330 ui::VKEY_LWIN, |
| 1331 ui::EF_CAPS_LOCK_DOWN, |
| 1332 ui::ET_KEY_RELEASED, |
| 1333 keycode_super_l_, |
| 1334 Mod4Mask | LockMask)); |
| 1335 // Confirm that the Caps Lock status is not changed. |
| 1336 EXPECT_FALSE(xkeyboard.caps_lock_is_enabled_); |
| 1337 |
| 1338 // Press Caps Lock (on an external keyboard). |
| 1339 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, |
| 1340 0, |
| 1341 ui::ET_KEY_PRESSED, |
| 1342 keycode_caps_lock_, |
| 1343 0U, |
| 1344 KeyPress), |
| 1345 GetRewrittenEventAsString(&rewriter, |
| 1346 ui::VKEY_CAPITAL, |
| 1347 0, |
| 1348 ui::ET_KEY_PRESSED, |
| 1349 keycode_caps_lock_, |
| 1350 0U)); |
| 1351 |
| 1352 // Confirm that calling RewriteForTesting() does not change the state of |
| 1353 // |xkeyboard|. In this case, X Window system itself should change the |
| 1354 // Caps Lock state, not ash::KeyRewriter. |
| 1355 EXPECT_FALSE(xkeyboard.caps_lock_is_enabled_); |
| 1356 |
| 1357 // Press Caps Lock (on an external keyboard). |
| 1358 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, |
| 1359 ui::EF_CAPS_LOCK_DOWN, |
| 1360 ui::ET_KEY_RELEASED, |
| 1361 keycode_caps_lock_, |
| 1362 LockMask, |
| 1363 KeyRelease), |
| 1364 GetRewrittenEventAsString(&rewriter, |
| 1365 ui::VKEY_CAPITAL, |
| 1366 ui::EF_CAPS_LOCK_DOWN, |
| 1367 ui::ET_KEY_RELEASED, |
| 1368 keycode_caps_lock_, |
| 1369 LockMask)); |
| 1370 EXPECT_FALSE(xkeyboard.caps_lock_is_enabled_); |
| 1371 } |
| 566 #endif // OS_CHROMEOS | 1372 #endif // OS_CHROMEOS |
| OLD | NEW |