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 3 // found in the LICENSE file. 4 5 #include "chrome/browser/ui/ash/event_rewriter.h" 6 7 #include "base/basictypes.h" 8 #include "base/command_line.h" 9 #include "base/prefs/pref_member.h" 10 #include "base/strings/stringprintf.h" 11 #include "chrome/common/pref_names.h" 12 #include "chrome/test/base/testing_pref_service_syncable.h" 13 #include "testing/gtest/include/gtest/gtest.h" 14 #include "ui/base/events/event.h" 15 16 #if defined(OS_CHROMEOS) 17 #include <X11/keysym.h> 18 #include <X11/XF86keysym.h> 19 #include <X11/Xlib.h> 20 21 #include "chrome/browser/chromeos/input_method/input_method_configuration.h" 22 #include "chrome/browser/chromeos/input_method/mock_input_method_manager.h" 23 #include "chrome/browser/chromeos/login/mock_user_manager.h" 24 #include "chrome/browser/chromeos/login/user_manager.h" 25 #include "chrome/browser/chromeos/preferences.h" 26 #include "chromeos/chromeos_switches.h" 27 #include "chromeos/ime/mock_xkeyboard.h" 28 #include "ui/base/x/x11_util.h" 29 30 namespace { 31 32 void InitXKeyEvent(ui::KeyboardCode ui_keycode, 33 int ui_flags, 34 ui::EventType ui_type, 35 KeyCode x_keycode, 36 unsigned int x_state, 37 XEvent* event) { 38 ui::InitXKeyEventForTesting(ui_type, 39 ui_keycode, 40 ui_flags, 41 event); 42 event->xkey.keycode = x_keycode; 43 event->xkey.state = x_state; 44 } 45 46 std::string GetRewrittenEventAsString(EventRewriter* rewriter, 47 ui::KeyboardCode ui_keycode, 48 int ui_flags, 49 ui::EventType ui_type, 50 KeyCode x_keycode, 51 unsigned int x_state) { 52 XEvent xev; 53 InitXKeyEvent(ui_keycode, ui_flags, ui_type, x_keycode, x_state, &xev); 54 ui::KeyEvent keyevent(&xev, false /* is_char */); 55 rewriter->RewriteForTesting(&keyevent); 56 return base::StringPrintf( 57 "ui_keycode=%d ui_flags=%d ui_type=%d x_keycode=%u x_state=%u x_type=%d", 58 keyevent.key_code(), keyevent.flags(), keyevent.type(), 59 xev.xkey.keycode, xev.xkey.state, xev.xkey.type); 60 } 61 62 std::string GetExpectedResultAsString(ui::KeyboardCode ui_keycode, 63 int ui_flags, 64 ui::EventType ui_type, 65 KeyCode x_keycode, 66 unsigned int x_state, 67 int x_type) { 68 return base::StringPrintf( 69 "ui_keycode=%d ui_flags=%d ui_type=%d x_keycode=%u x_state=%u x_type=%d", 70 ui_keycode, ui_flags, ui_type, x_keycode, x_state, x_type); 71 } 72 73 class EventRewriterTest : public testing::Test { 74 public: 75 EventRewriterTest() 76 : display_(ui::GetXDisplay()), 77 keycode_a_(XKeysymToKeycode(display_, XK_a)), 78 keycode_alt_l_(XKeysymToKeycode(display_, XK_Alt_L)), 79 keycode_alt_r_(XKeysymToKeycode(display_, XK_Alt_R)), 80 keycode_b_(XKeysymToKeycode(display_, XK_B)), 81 keycode_caps_lock_(XKeysymToKeycode(display_, XK_Caps_Lock)), 82 keycode_control_l_(XKeysymToKeycode(display_, XK_Control_L)), 83 keycode_control_r_(XKeysymToKeycode(display_, XK_Control_R)), 84 keycode_meta_l_(XKeysymToKeycode(display_, XK_Meta_L)), 85 keycode_meta_r_(XKeysymToKeycode(display_, XK_Meta_R)), 86 keycode_num_pad_0_(XKeysymToKeycode(display_, XK_KP_0)), 87 keycode_num_pad_1_(XKeysymToKeycode(display_, XK_KP_1)), 88 keycode_num_pad_2_(XKeysymToKeycode(display_, XK_KP_2)), 89 keycode_num_pad_3_(XKeysymToKeycode(display_, XK_KP_3)), 90 keycode_num_pad_4_(XKeysymToKeycode(display_, XK_KP_4)), 91 keycode_num_pad_5_(XKeysymToKeycode(display_, XK_KP_5)), 92 keycode_num_pad_6_(XKeysymToKeycode(display_, XK_KP_6)), 93 keycode_num_pad_7_(XKeysymToKeycode(display_, XK_KP_7)), 94 keycode_num_pad_8_(XKeysymToKeycode(display_, XK_KP_8)), 95 keycode_num_pad_9_(XKeysymToKeycode(display_, XK_KP_9)), 96 keycode_num_pad_begin_(XKeysymToKeycode(display_, XK_KP_Begin)), 97 keycode_num_pad_decimal_(XKeysymToKeycode(display_, XK_KP_Decimal)), 98 keycode_num_pad_delete_(XKeysymToKeycode(display_, XK_KP_Delete)), 99 keycode_num_pad_down_(XKeysymToKeycode(display_, XK_KP_Down)), 100 keycode_num_pad_end_(XKeysymToKeycode(display_, XK_KP_End)), 101 keycode_num_pad_home_(XKeysymToKeycode(display_, XK_KP_Home)), 102 keycode_num_pad_insert_(XKeysymToKeycode(display_, XK_KP_Insert)), 103 keycode_num_pad_left_(XKeysymToKeycode(display_, XK_KP_Left)), 104 keycode_num_pad_next_(XKeysymToKeycode(display_, XK_KP_Next)), 105 keycode_num_pad_prior_(XKeysymToKeycode(display_, XK_KP_Prior)), 106 keycode_num_pad_right_(XKeysymToKeycode(display_, XK_KP_Right)), 107 keycode_num_pad_up_(XKeysymToKeycode(display_, XK_KP_Up)), 108 keycode_super_l_(XKeysymToKeycode(display_, XK_Super_L)), 109 keycode_super_r_(XKeysymToKeycode(display_, XK_Super_R)), 110 keycode_void_symbol_(XKeysymToKeycode(display_, XK_VoidSymbol)), 111 keycode_delete_(XKeysymToKeycode(display_, XK_Delete)), 112 keycode_backspace_(XKeysymToKeycode(display_, XK_BackSpace)), 113 keycode_up_(XKeysymToKeycode(display_, XK_Up)), 114 keycode_down_(XKeysymToKeycode(display_, XK_Down)), 115 keycode_left_(XKeysymToKeycode(display_, XK_Left)), 116 keycode_right_(XKeysymToKeycode(display_, XK_Right)), 117 keycode_prior_(XKeysymToKeycode(display_, XK_Prior)), 118 keycode_next_(XKeysymToKeycode(display_, XK_Next)), 119 keycode_home_(XKeysymToKeycode(display_, XK_Home)), 120 keycode_end_(XKeysymToKeycode(display_, XK_End)), 121 keycode_launch6_(XKeysymToKeycode(display_, XF86XK_Launch6)), 122 keycode_launch7_(XKeysymToKeycode(display_, XF86XK_Launch7)), 123 keycode_f1_(XKeysymToKeycode(display_, XK_F1)), 124 keycode_f2_(XKeysymToKeycode(display_, XK_F2)), 125 keycode_f3_(XKeysymToKeycode(display_, XK_F3)), 126 keycode_f4_(XKeysymToKeycode(display_, XK_F4)), 127 keycode_f5_(XKeysymToKeycode(display_, XK_F5)), 128 keycode_f6_(XKeysymToKeycode(display_, XK_F6)), 129 keycode_f7_(XKeysymToKeycode(display_, XK_F7)), 130 keycode_f8_(XKeysymToKeycode(display_, XK_F8)), 131 keycode_f9_(XKeysymToKeycode(display_, XK_F9)), 132 keycode_f10_(XKeysymToKeycode(display_, XK_F10)), 133 keycode_f11_(XKeysymToKeycode(display_, XK_F11)), 134 keycode_f12_(XKeysymToKeycode(display_, XK_F12)), 135 keycode_browser_back_(XKeysymToKeycode(display_, XF86XK_Back)), 136 keycode_browser_forward_(XKeysymToKeycode(display_, XF86XK_Forward)), 137 keycode_browser_refresh_(XKeysymToKeycode(display_, XF86XK_Reload)), 138 keycode_media_launch_app1_(XKeysymToKeycode(display_, XF86XK_LaunchA)), 139 keycode_media_launch_app2_(XKeysymToKeycode(display_, XF86XK_LaunchB)), 140 keycode_brightness_down_(XKeysymToKeycode( 141 display_, XF86XK_MonBrightnessDown)), 142 keycode_brightness_up_(XKeysymToKeycode( 143 display_, XF86XK_MonBrightnessUp)), 144 keycode_volume_mute_(XKeysymToKeycode(display_, XF86XK_AudioMute)), 145 keycode_volume_down_(XKeysymToKeycode( 146 display_, XF86XK_AudioLowerVolume)), 147 keycode_volume_up_(XKeysymToKeycode( 148 display_, XF86XK_AudioRaiseVolume)), 149 keycode_power_(XKeysymToKeycode(display_, XF86XK_PowerOff)), 150 keycode_1_(XKeysymToKeycode(display_, XK_1)), 151 keycode_2_(XKeysymToKeycode(display_, XK_2)), 152 keycode_3_(XKeysymToKeycode(display_, XK_3)), 153 keycode_4_(XKeysymToKeycode(display_, XK_4)), 154 keycode_5_(XKeysymToKeycode(display_, XK_5)), 155 keycode_6_(XKeysymToKeycode(display_, XK_6)), 156 keycode_7_(XKeysymToKeycode(display_, XK_7)), 157 keycode_8_(XKeysymToKeycode(display_, XK_8)), 158 keycode_9_(XKeysymToKeycode(display_, XK_9)), 159 keycode_0_(XKeysymToKeycode(display_, XK_0)), 160 keycode_minus_(XKeysymToKeycode(display_, XK_minus)), 161 keycode_equal_(XKeysymToKeycode(display_, XK_equal)), 162 keycode_period_(XKeysymToKeycode(display_, XK_period)), 163 keycode_insert_(XKeysymToKeycode(display_, XK_Insert)), 164 mock_user_manager_(new chromeos::MockUserManager), 165 user_manager_enabler_(mock_user_manager_), 166 input_method_manager_mock_(NULL) { 167 } 168 virtual ~EventRewriterTest() {} 169 170 virtual void SetUp() { 171 // Mocking user manager because the real one needs to be called on UI thread 172 EXPECT_CALL(*mock_user_manager_, IsLoggedInAsGuest()) 173 .WillRepeatedly(testing::Return(false)); 174 input_method_manager_mock_ = 175 new chromeos::input_method::MockInputMethodManager; 176 chromeos::input_method::InitializeForTesting( 177 input_method_manager_mock_); // pass ownership 178 } 179 180 virtual void TearDown() { 181 // Shutdown() deletes the IME mock object. 182 chromeos::input_method::Shutdown(); 183 } 184 185 protected: 186 void TestRewriteNumPadKeys(); 187 void TestRewriteNumPadKeysOnAppleKeyboard(); 188 189 Display* display_; 190 const KeyCode keycode_a_; 191 const KeyCode keycode_alt_l_; 192 const KeyCode keycode_alt_r_; 193 const KeyCode keycode_b_; 194 const KeyCode keycode_caps_lock_; 195 const KeyCode keycode_control_l_; 196 const KeyCode keycode_control_r_; 197 const KeyCode keycode_meta_l_; 198 const KeyCode keycode_meta_r_; 199 const KeyCode keycode_num_pad_0_; 200 const KeyCode keycode_num_pad_1_; 201 const KeyCode keycode_num_pad_2_; 202 const KeyCode keycode_num_pad_3_; 203 const KeyCode keycode_num_pad_4_; 204 const KeyCode keycode_num_pad_5_; 205 const KeyCode keycode_num_pad_6_; 206 const KeyCode keycode_num_pad_7_; 207 const KeyCode keycode_num_pad_8_; 208 const KeyCode keycode_num_pad_9_; 209 const KeyCode keycode_num_pad_begin_; 210 const KeyCode keycode_num_pad_decimal_; 211 const KeyCode keycode_num_pad_delete_; 212 const KeyCode keycode_num_pad_down_; 213 const KeyCode keycode_num_pad_end_; 214 const KeyCode keycode_num_pad_home_; 215 const KeyCode keycode_num_pad_insert_; 216 const KeyCode keycode_num_pad_left_; 217 const KeyCode keycode_num_pad_next_; 218 const KeyCode keycode_num_pad_prior_; 219 const KeyCode keycode_num_pad_right_; 220 const KeyCode keycode_num_pad_up_; 221 const KeyCode keycode_super_l_; 222 const KeyCode keycode_super_r_; 223 const KeyCode keycode_void_symbol_; 224 const KeyCode keycode_delete_; 225 const KeyCode keycode_backspace_; 226 const KeyCode keycode_up_; 227 const KeyCode keycode_down_; 228 const KeyCode keycode_left_; 229 const KeyCode keycode_right_; 230 const KeyCode keycode_prior_; 231 const KeyCode keycode_next_; 232 const KeyCode keycode_home_; 233 const KeyCode keycode_end_; 234 const KeyCode keycode_launch6_; // F15 235 const KeyCode keycode_launch7_; // F16 236 const KeyCode keycode_f1_; 237 const KeyCode keycode_f2_; 238 const KeyCode keycode_f3_; 239 const KeyCode keycode_f4_; 240 const KeyCode keycode_f5_; 241 const KeyCode keycode_f6_; 242 const KeyCode keycode_f7_; 243 const KeyCode keycode_f8_; 244 const KeyCode keycode_f9_; 245 const KeyCode keycode_f10_; 246 const KeyCode keycode_f11_; 247 const KeyCode keycode_f12_; 248 const KeyCode keycode_browser_back_; 249 const KeyCode keycode_browser_forward_; 250 const KeyCode keycode_browser_refresh_; 251 const KeyCode keycode_media_launch_app1_; 252 const KeyCode keycode_media_launch_app2_; 253 const KeyCode keycode_brightness_down_; 254 const KeyCode keycode_brightness_up_; 255 const KeyCode keycode_volume_mute_; 256 const KeyCode keycode_volume_down_; 257 const KeyCode keycode_volume_up_; 258 const KeyCode keycode_power_; 259 const KeyCode keycode_1_; 260 const KeyCode keycode_2_; 261 const KeyCode keycode_3_; 262 const KeyCode keycode_4_; 263 const KeyCode keycode_5_; 264 const KeyCode keycode_6_; 265 const KeyCode keycode_7_; 266 const KeyCode keycode_8_; 267 const KeyCode keycode_9_; 268 const KeyCode keycode_0_; 269 const KeyCode keycode_minus_; 270 const KeyCode keycode_equal_; 271 const KeyCode keycode_period_; 272 const KeyCode keycode_insert_; 273 chromeos::MockUserManager* mock_user_manager_; // Not owned. 274 chromeos::ScopedUserManagerEnabler user_manager_enabler_; 275 chromeos::input_method::MockInputMethodManager* input_method_manager_mock_; 276 }; 277 278 } // namespace 279 #else 280 class EventRewriterTest : public testing::Test { 281 public: 282 EventRewriterTest() {} 283 virtual ~EventRewriterTest() {} 284 }; 285 #endif 286 287 TEST_F(EventRewriterTest, TestGetDeviceType) { 288 // This is the typical string which an Apple keyboard sends. 289 EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard, 290 EventRewriter::GetDeviceType("Apple Inc. Apple Keyboard")); 291 292 // Other cases we accept. 293 EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard, 294 EventRewriter::GetDeviceType("Apple Keyboard")); 295 EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard, 296 EventRewriter::GetDeviceType("apple keyboard")); 297 EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard, 298 EventRewriter::GetDeviceType("apple keyboard.")); 299 EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard, 300 EventRewriter::GetDeviceType("apple.keyboard.")); 301 EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard, 302 EventRewriter::GetDeviceType(".apple.keyboard.")); 303 304 // Dell, Microsoft, Logitech, ... should be recognized as a kDeviceUnknown. 305 EXPECT_EQ(EventRewriter::kDeviceUnknown, 306 EventRewriter::GetDeviceType("Dell Dell USB Entry Keyboard")); 307 EXPECT_EQ(EventRewriter::kDeviceUnknown, 308 EventRewriter::GetDeviceType( 309 "Microsoft Natural Ergonomic Keyboard")); 310 EXPECT_EQ(EventRewriter::kDeviceUnknown, 311 EventRewriter::GetDeviceType("CHESEN USB Keyboard")); 312 313 // Some corner cases. 314 EXPECT_EQ(EventRewriter::kDeviceUnknown, EventRewriter::GetDeviceType("")); 315 EXPECT_EQ(EventRewriter::kDeviceUnknown, 316 EventRewriter::GetDeviceType(".")); 317 EXPECT_EQ(EventRewriter::kDeviceUnknown, 318 EventRewriter::GetDeviceType(". ")); 319 EXPECT_EQ(EventRewriter::kDeviceUnknown, 320 EventRewriter::GetDeviceType(" .")); 321 EXPECT_EQ(EventRewriter::kDeviceUnknown, 322 EventRewriter::GetDeviceType("not-an-apple keyboard")); 323 } 324 325 TEST_F(EventRewriterTest, TestDeviceAddedOrRemoved) { 326 EventRewriter rewriter; 327 EXPECT_TRUE(rewriter.device_id_to_type_for_testing().empty()); 328 EXPECT_EQ(EventRewriter::kDeviceUnknown, 329 rewriter.DeviceAddedForTesting(0, "PC Keyboard")); 330 EXPECT_EQ(1U, rewriter.device_id_to_type_for_testing().size()); 331 EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard, 332 rewriter.DeviceAddedForTesting(1, "Apple Keyboard")); 333 EXPECT_EQ(2U, rewriter.device_id_to_type_for_testing().size()); 334 // Try to reuse the first ID. 335 EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard, 336 rewriter.DeviceAddedForTesting(0, "Apple Keyboard")); 337 EXPECT_EQ(2U, rewriter.device_id_to_type_for_testing().size()); 338 } 339 340 #if defined(OS_CHROMEOS) 341 TEST_F(EventRewriterTest, TestRewriteCommandToControl) { 342 // First, test with a PC keyboard. 343 TestingPrefServiceSyncable prefs; 344 EventRewriter rewriter; 345 rewriter.DeviceAddedForTesting(0, "PC Keyboard"); 346 rewriter.set_last_device_id_for_testing(0); 347 rewriter.set_pref_service_for_testing(&prefs); 348 349 // XK_a, Alt modifier. 350 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, 351 ui::EF_ALT_DOWN, 352 ui::ET_KEY_PRESSED, 353 keycode_a_, 354 Mod1Mask, 355 KeyPress), 356 GetRewrittenEventAsString(&rewriter, 357 ui::VKEY_A, 358 ui::EF_ALT_DOWN, 359 ui::ET_KEY_PRESSED, 360 keycode_a_, 361 Mod1Mask)); 362 363 // XK_a, Win modifier. 364 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, 365 0, 366 ui::ET_KEY_PRESSED, 367 keycode_a_, 368 Mod4Mask, 369 KeyPress), 370 GetRewrittenEventAsString(&rewriter, 371 ui::VKEY_A, 372 0, 373 ui::ET_KEY_PRESSED, 374 keycode_a_, 375 Mod4Mask)); 376 377 // XK_a, Alt+Win modifier. 378 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, 379 ui::EF_ALT_DOWN, 380 ui::ET_KEY_PRESSED, 381 keycode_a_, 382 Mod1Mask | Mod4Mask, 383 KeyPress), 384 GetRewrittenEventAsString(&rewriter, 385 ui::VKEY_A, 386 ui::EF_ALT_DOWN, 387 ui::ET_KEY_PRESSED, 388 keycode_a_, 389 Mod1Mask | Mod4Mask)); 390 391 // XK_Super_L (left Windows key), Alt modifier. 392 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_LWIN, 393 ui::EF_ALT_DOWN, 394 ui::ET_KEY_PRESSED, 395 keycode_super_l_, 396 Mod1Mask, 397 KeyPress), 398 GetRewrittenEventAsString(&rewriter, 399 ui::VKEY_LWIN, 400 ui::EF_ALT_DOWN, 401 ui::ET_KEY_PRESSED, 402 keycode_super_l_, 403 Mod1Mask)); 404 405 // XK_Super_R (right Windows key), Alt modifier. 406 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_RWIN, 407 ui::EF_ALT_DOWN, 408 ui::ET_KEY_PRESSED, 409 keycode_super_r_, 410 Mod1Mask, 411 KeyPress), 412 GetRewrittenEventAsString(&rewriter, 413 ui::VKEY_RWIN, 414 ui::EF_ALT_DOWN, 415 ui::ET_KEY_PRESSED, 416 keycode_super_r_, 417 Mod1Mask)); 418 419 // An Apple keyboard reusing the ID, zero. 420 rewriter.DeviceAddedForTesting(0, "Apple Keyboard"); 421 rewriter.set_last_device_id_for_testing(0); 422 423 // XK_a, Alt modifier. 424 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, 425 ui::EF_ALT_DOWN, 426 ui::ET_KEY_PRESSED, 427 keycode_a_, 428 Mod1Mask, 429 KeyPress), 430 GetRewrittenEventAsString(&rewriter, 431 ui::VKEY_A, 432 ui::EF_ALT_DOWN, 433 ui::ET_KEY_PRESSED, 434 keycode_a_, 435 Mod1Mask)); 436 437 // XK_a, Win modifier. 438 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, 439 ui::EF_CONTROL_DOWN, 440 ui::ET_KEY_PRESSED, 441 keycode_a_, 442 ControlMask, 443 KeyPress), 444 GetRewrittenEventAsString(&rewriter, 445 ui::VKEY_A, 446 0, 447 ui::ET_KEY_PRESSED, 448 keycode_a_, 449 Mod4Mask)); 450 451 // XK_a, Alt+Win modifier. 452 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, 453 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, 454 ui::ET_KEY_PRESSED, 455 keycode_a_, 456 Mod1Mask | ControlMask, 457 KeyPress), 458 GetRewrittenEventAsString(&rewriter, 459 ui::VKEY_A, 460 ui::EF_ALT_DOWN, 461 ui::ET_KEY_PRESSED, 462 keycode_a_, 463 Mod1Mask | Mod4Mask)); 464 465 // XK_Super_L (left Windows key), Alt modifier. 466 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, 467 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, 468 ui::ET_KEY_PRESSED, 469 keycode_control_l_, 470 Mod1Mask, 471 KeyPress), 472 GetRewrittenEventAsString(&rewriter, 473 ui::VKEY_LWIN, 474 ui::EF_ALT_DOWN, 475 ui::ET_KEY_PRESSED, 476 keycode_super_l_, 477 Mod1Mask)); 478 479 // XK_Super_R (right Windows key), Alt modifier. 480 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, 481 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, 482 ui::ET_KEY_PRESSED, 483 keycode_control_r_, 484 Mod1Mask, 485 KeyPress), 486 GetRewrittenEventAsString(&rewriter, 487 ui::VKEY_RWIN, 488 ui::EF_ALT_DOWN, 489 ui::ET_KEY_PRESSED, 490 keycode_super_r_, 491 Mod1Mask)); 492 } 493 494 // For crbug.com/133896. 495 TEST_F(EventRewriterTest, TestRewriteCommandToControlWithControlRemapped) { 496 // Remap Control to Alt. 497 TestingPrefServiceSyncable prefs; 498 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 499 IntegerPrefMember control; 500 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); 501 control.SetValue(chromeos::input_method::kAltKey); 502 503 EventRewriter rewriter; 504 rewriter.set_pref_service_for_testing(&prefs); 505 rewriter.DeviceAddedForTesting(0, "PC Keyboard"); 506 rewriter.set_last_device_id_for_testing(0); 507 508 // XK_Control_L (left Control key) should be remapped to Alt. 509 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU, 510 ui::EF_ALT_DOWN, 511 ui::ET_KEY_PRESSED, 512 keycode_alt_l_, 513 0U, 514 KeyPress), 515 GetRewrittenEventAsString(&rewriter, 516 ui::VKEY_CONTROL, 517 0, 518 ui::ET_KEY_PRESSED, 519 keycode_control_l_, 520 0U)); 521 522 // An Apple keyboard reusing the ID, zero. 523 rewriter.DeviceAddedForTesting(0, "Apple Keyboard"); 524 rewriter.set_last_device_id_for_testing(0); 525 526 // XK_Super_L (left Command key) with Alt modifier. The remapped Command key 527 // should never be re-remapped to Alt. 528 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, 529 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, 530 ui::ET_KEY_PRESSED, 531 keycode_control_l_, 532 Mod1Mask, 533 KeyPress), 534 GetRewrittenEventAsString(&rewriter, 535 ui::VKEY_LWIN, 536 ui::EF_ALT_DOWN, 537 ui::ET_KEY_PRESSED, 538 keycode_super_l_, 539 Mod1Mask)); 540 541 // XK_Super_R (right Command key) with Alt modifier. The remapped Command key 542 // should never be re-remapped to Alt. 543 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, 544 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, 545 ui::ET_KEY_PRESSED, 546 keycode_control_r_, 547 Mod1Mask, 548 KeyPress), 549 GetRewrittenEventAsString(&rewriter, 550 ui::VKEY_RWIN, 551 ui::EF_ALT_DOWN, 552 ui::ET_KEY_PRESSED, 553 keycode_super_r_, 554 Mod1Mask)); 555 } 556 557 void EventRewriterTest::TestRewriteNumPadKeys() { 558 TestingPrefServiceSyncable prefs; 559 EventRewriter rewriter; 560 rewriter.set_pref_service_for_testing(&prefs); 561 562 // XK_KP_Insert (= NumPad 0 without Num Lock), no modifier. 563 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD0, 564 0, 565 ui::ET_KEY_PRESSED, 566 keycode_num_pad_0_, 567 Mod2Mask, // Num Lock 568 KeyPress), 569 GetRewrittenEventAsString(&rewriter, 570 ui::VKEY_INSERT, 571 0, 572 ui::ET_KEY_PRESSED, 573 keycode_num_pad_insert_, 574 0)); 575 576 // XK_KP_Insert (= NumPad 0 without Num Lock), Alt modifier. 577 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD0, 578 ui::EF_ALT_DOWN, 579 ui::ET_KEY_PRESSED, 580 keycode_num_pad_0_, 581 Mod1Mask | Mod2Mask, 582 KeyPress), 583 GetRewrittenEventAsString(&rewriter, 584 ui::VKEY_INSERT, 585 ui::EF_ALT_DOWN, 586 ui::ET_KEY_PRESSED, 587 keycode_num_pad_insert_, 588 Mod1Mask)); 589 590 // XK_KP_Delete (= NumPad . without Num Lock), Alt modifier. 591 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_DECIMAL, 592 ui::EF_ALT_DOWN, 593 ui::ET_KEY_PRESSED, 594 keycode_num_pad_decimal_, 595 Mod1Mask | Mod2Mask, 596 KeyPress), 597 GetRewrittenEventAsString(&rewriter, 598 ui::VKEY_DELETE, 599 ui::EF_ALT_DOWN, 600 ui::ET_KEY_PRESSED, 601 keycode_num_pad_delete_, 602 Mod1Mask)); 603 604 // XK_KP_End (= NumPad 1 without Num Lock), Alt modifier. 605 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD1, 606 ui::EF_ALT_DOWN, 607 ui::ET_KEY_PRESSED, 608 keycode_num_pad_1_, 609 Mod1Mask | Mod2Mask, 610 KeyPress), 611 GetRewrittenEventAsString(&rewriter, 612 ui::VKEY_END, 613 ui::EF_ALT_DOWN, 614 ui::ET_KEY_PRESSED, 615 keycode_num_pad_end_, 616 Mod1Mask)); 617 618 // XK_KP_Down (= NumPad 2 without Num Lock), Alt modifier. 619 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD2, 620 ui::EF_ALT_DOWN, 621 ui::ET_KEY_PRESSED, 622 keycode_num_pad_2_, 623 Mod1Mask | Mod2Mask, 624 KeyPress), 625 GetRewrittenEventAsString(&rewriter, 626 ui::VKEY_DOWN, 627 ui::EF_ALT_DOWN, 628 ui::ET_KEY_PRESSED, 629 keycode_num_pad_down_, 630 Mod1Mask)); 631 632 // XK_KP_Next (= NumPad 3 without Num Lock), Alt modifier. 633 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD3, 634 ui::EF_ALT_DOWN, 635 ui::ET_KEY_PRESSED, 636 keycode_num_pad_3_, 637 Mod1Mask | Mod2Mask, 638 KeyPress), 639 GetRewrittenEventAsString(&rewriter, 640 ui::VKEY_NEXT, 641 ui::EF_ALT_DOWN, 642 ui::ET_KEY_PRESSED, 643 keycode_num_pad_next_, 644 Mod1Mask)); 645 646 // XK_KP_Left (= NumPad 4 without Num Lock), Alt modifier. 647 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD4, 648 ui::EF_ALT_DOWN, 649 ui::ET_KEY_PRESSED, 650 keycode_num_pad_4_, 651 Mod1Mask | Mod2Mask, 652 KeyPress), 653 GetRewrittenEventAsString(&rewriter, 654 ui::VKEY_LEFT, 655 ui::EF_ALT_DOWN, 656 ui::ET_KEY_PRESSED, 657 keycode_num_pad_left_, 658 Mod1Mask)); 659 660 // XK_KP_Begin (= NumPad 5 without Num Lock), Alt modifier. 661 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD5, 662 ui::EF_ALT_DOWN, 663 ui::ET_KEY_PRESSED, 664 keycode_num_pad_5_, 665 Mod1Mask | Mod2Mask, 666 KeyPress), 667 GetRewrittenEventAsString(&rewriter, 668 ui::VKEY_CLEAR, 669 ui::EF_ALT_DOWN, 670 ui::ET_KEY_PRESSED, 671 keycode_num_pad_begin_, 672 Mod1Mask)); 673 674 // XK_KP_Right (= NumPad 6 without Num Lock), Alt modifier. 675 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD6, 676 ui::EF_ALT_DOWN, 677 ui::ET_KEY_PRESSED, 678 keycode_num_pad_6_, 679 Mod1Mask | Mod2Mask, 680 KeyPress), 681 GetRewrittenEventAsString(&rewriter, 682 ui::VKEY_RIGHT, 683 ui::EF_ALT_DOWN, 684 ui::ET_KEY_PRESSED, 685 keycode_num_pad_right_, 686 Mod1Mask)); 687 688 // XK_KP_Home (= NumPad 7 without Num Lock), Alt modifier. 689 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD7, 690 ui::EF_ALT_DOWN, 691 ui::ET_KEY_PRESSED, 692 keycode_num_pad_7_, 693 Mod1Mask | Mod2Mask, 694 KeyPress), 695 GetRewrittenEventAsString(&rewriter, 696 ui::VKEY_HOME, 697 ui::EF_ALT_DOWN, 698 ui::ET_KEY_PRESSED, 699 keycode_num_pad_home_, 700 Mod1Mask)); 701 702 // XK_KP_Up (= NumPad 8 without Num Lock), Alt modifier. 703 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD8, 704 ui::EF_ALT_DOWN, 705 ui::ET_KEY_PRESSED, 706 keycode_num_pad_8_, 707 Mod1Mask | Mod2Mask, 708 KeyPress), 709 GetRewrittenEventAsString(&rewriter, 710 ui::VKEY_UP, 711 ui::EF_ALT_DOWN, 712 ui::ET_KEY_PRESSED, 713 keycode_num_pad_up_, 714 Mod1Mask)); 715 716 // XK_KP_Prior (= NumPad 9 without Num Lock), Alt modifier. 717 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD9, 718 ui::EF_ALT_DOWN, 719 ui::ET_KEY_PRESSED, 720 keycode_num_pad_9_, 721 Mod1Mask | Mod2Mask, 722 KeyPress), 723 GetRewrittenEventAsString(&rewriter, 724 ui::VKEY_PRIOR, 725 ui::EF_ALT_DOWN, 726 ui::ET_KEY_PRESSED, 727 keycode_num_pad_prior_, 728 Mod1Mask)); 729 730 // XK_KP_0 (= NumPad 0 with Num Lock), Num Lock modifier. 731 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD0, 732 0, 733 ui::ET_KEY_PRESSED, 734 keycode_num_pad_0_, 735 Mod2Mask, 736 KeyPress), 737 GetRewrittenEventAsString(&rewriter, 738 ui::VKEY_NUMPAD0, 739 0, 740 ui::ET_KEY_PRESSED, 741 keycode_num_pad_0_, 742 Mod2Mask)); 743 744 // XK_KP_DECIMAL (= NumPad . with Num Lock), Num Lock modifier. 745 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_DECIMAL, 746 0, 747 ui::ET_KEY_PRESSED, 748 keycode_num_pad_decimal_, 749 Mod2Mask, 750 KeyPress), 751 GetRewrittenEventAsString(&rewriter, 752 ui::VKEY_DECIMAL, 753 0, 754 ui::ET_KEY_PRESSED, 755 keycode_num_pad_decimal_, 756 Mod2Mask)); 757 758 // XK_KP_1 (= NumPad 1 with Num Lock), Num Lock modifier. 759 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD1, 760 0, 761 ui::ET_KEY_PRESSED, 762 keycode_num_pad_1_, 763 Mod2Mask, 764 KeyPress), 765 GetRewrittenEventAsString(&rewriter, 766 ui::VKEY_NUMPAD1, 767 0, 768 ui::ET_KEY_PRESSED, 769 keycode_num_pad_1_, 770 Mod2Mask)); 771 772 // XK_KP_2 (= NumPad 2 with Num Lock), Num Lock modifier. 773 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD2, 774 0, 775 ui::ET_KEY_PRESSED, 776 keycode_num_pad_2_, 777 Mod2Mask, 778 KeyPress), 779 GetRewrittenEventAsString(&rewriter, 780 ui::VKEY_NUMPAD2, 781 0, 782 ui::ET_KEY_PRESSED, 783 keycode_num_pad_2_, 784 Mod2Mask)); 785 786 // XK_KP_3 (= NumPad 3 with Num Lock), Num Lock modifier. 787 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD3, 788 0, 789 ui::ET_KEY_PRESSED, 790 keycode_num_pad_3_, 791 Mod2Mask, 792 KeyPress), 793 GetRewrittenEventAsString(&rewriter, 794 ui::VKEY_NUMPAD3, 795 0, 796 ui::ET_KEY_PRESSED, 797 keycode_num_pad_3_, 798 Mod2Mask)); 799 800 // XK_KP_4 (= NumPad 4 with Num Lock), Num Lock modifier. 801 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD4, 802 0, 803 ui::ET_KEY_PRESSED, 804 keycode_num_pad_4_, 805 Mod2Mask, 806 KeyPress), 807 GetRewrittenEventAsString(&rewriter, 808 ui::VKEY_NUMPAD4, 809 0, 810 ui::ET_KEY_PRESSED, 811 keycode_num_pad_4_, 812 Mod2Mask)); 813 814 // XK_KP_5 (= NumPad 5 with Num Lock), Num Lock modifier. 815 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD5, 816 0, 817 ui::ET_KEY_PRESSED, 818 keycode_num_pad_5_, 819 Mod2Mask, 820 KeyPress), 821 GetRewrittenEventAsString(&rewriter, 822 ui::VKEY_NUMPAD5, 823 0, 824 ui::ET_KEY_PRESSED, 825 keycode_num_pad_5_, 826 Mod2Mask)); 827 828 // XK_KP_6 (= NumPad 6 with Num Lock), Num Lock modifier. 829 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD6, 830 0, 831 ui::ET_KEY_PRESSED, 832 keycode_num_pad_6_, 833 Mod2Mask, 834 KeyPress), 835 GetRewrittenEventAsString(&rewriter, 836 ui::VKEY_NUMPAD6, 837 0, 838 ui::ET_KEY_PRESSED, 839 keycode_num_pad_6_, 840 Mod2Mask)); 841 842 // XK_KP_7 (= NumPad 7 with Num Lock), Num Lock modifier. 843 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD7, 844 0, 845 ui::ET_KEY_PRESSED, 846 keycode_num_pad_7_, 847 Mod2Mask, 848 KeyPress), 849 GetRewrittenEventAsString(&rewriter, 850 ui::VKEY_NUMPAD7, 851 0, 852 ui::ET_KEY_PRESSED, 853 keycode_num_pad_7_, 854 Mod2Mask)); 855 856 // XK_KP_8 (= NumPad 8 with Num Lock), Num Lock modifier. 857 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD8, 858 0, 859 ui::ET_KEY_PRESSED, 860 keycode_num_pad_8_, 861 Mod2Mask, 862 KeyPress), 863 GetRewrittenEventAsString(&rewriter, 864 ui::VKEY_NUMPAD8, 865 0, 866 ui::ET_KEY_PRESSED, 867 keycode_num_pad_8_, 868 Mod2Mask)); 869 870 // XK_KP_9 (= NumPad 9 with Num Lock), Num Lock modifier. 871 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD9, 872 0, 873 ui::ET_KEY_PRESSED, 874 keycode_num_pad_9_, 875 Mod2Mask, 876 KeyPress), 877 GetRewrittenEventAsString(&rewriter, 878 ui::VKEY_NUMPAD9, 879 0, 880 ui::ET_KEY_PRESSED, 881 keycode_num_pad_9_, 882 Mod2Mask)); 883 } 884 885 TEST_F(EventRewriterTest, TestRewriteNumPadKeys) { 886 TestRewriteNumPadKeys(); 887 } 888 889 TEST_F(EventRewriterTest, TestRewriteNumPadKeysWithDiamondKeyFlag) { 890 // Make sure the num lock works correctly even when Diamond key exists. 891 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); 892 CommandLine::ForCurrentProcess()->AppendSwitchASCII( 893 chromeos::switches::kHasChromeOSDiamondKey, ""); 894 895 TestRewriteNumPadKeys(); 896 *CommandLine::ForCurrentProcess() = original_cl; 897 } 898 899 // Tests if the rewriter can handle a Command + Num Pad event. 900 void EventRewriterTest::TestRewriteNumPadKeysOnAppleKeyboard() { 901 TestingPrefServiceSyncable prefs; 902 EventRewriter rewriter; 903 rewriter.DeviceAddedForTesting(0, "Apple Keyboard"); 904 rewriter.set_last_device_id_for_testing(0); 905 rewriter.set_pref_service_for_testing(&prefs); 906 907 // XK_KP_End (= NumPad 1 without Num Lock), Win modifier. 908 // The result should be "Num Pad 1 with Control + Num Lock modifiers". 909 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD1, 910 ui::EF_CONTROL_DOWN, 911 ui::ET_KEY_PRESSED, 912 keycode_num_pad_1_, 913 ControlMask | Mod2Mask, 914 KeyPress), 915 GetRewrittenEventAsString(&rewriter, 916 ui::VKEY_END, 917 0, 918 ui::ET_KEY_PRESSED, 919 keycode_num_pad_end_, 920 Mod4Mask)); 921 922 // XK_KP_1 (= NumPad 1 without Num Lock), Win modifier. 923 // The result should also be "Num Pad 1 with Control + Num Lock modifiers". 924 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD1, 925 ui::EF_CONTROL_DOWN, 926 ui::ET_KEY_PRESSED, 927 keycode_num_pad_1_, 928 ControlMask | Mod2Mask, 929 KeyPress), 930 GetRewrittenEventAsString(&rewriter, 931 ui::VKEY_NUMPAD1, 932 0, 933 ui::ET_KEY_PRESSED, 934 keycode_num_pad_end_, 935 Mod4Mask)); 936 } 937 938 TEST_F(EventRewriterTest, TestRewriteNumPadKeysOnAppleKeyboard) { 939 TestRewriteNumPadKeysOnAppleKeyboard(); 940 } 941 942 TEST_F(EventRewriterTest, 943 TestRewriteNumPadKeysOnAppleKeyboardWithDiamondKeyFlag) { 944 // Makes sure the num lock works correctly even when Diamond key exists. 945 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); 946 CommandLine::ForCurrentProcess()->AppendSwitchASCII( 947 chromeos::switches::kHasChromeOSDiamondKey, ""); 948 949 TestRewriteNumPadKeysOnAppleKeyboard(); 950 *CommandLine::ForCurrentProcess() = original_cl; 951 } 952 953 TEST_F(EventRewriterTest, TestRewriteModifiersNoRemap) { 954 TestingPrefServiceSyncable prefs; 955 EventRewriter rewriter; 956 rewriter.set_pref_service_for_testing(&prefs); 957 958 // Press Search. Confirm the event is not rewritten. 959 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_LWIN, 960 0, 961 ui::ET_KEY_PRESSED, 962 keycode_super_l_, 963 0U, 964 KeyPress), 965 GetRewrittenEventAsString(&rewriter, 966 ui::VKEY_LWIN, 967 0, 968 ui::ET_KEY_PRESSED, 969 keycode_super_l_, 970 0U)); 971 972 // Press left Control. Confirm the event is not rewritten. 973 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, 974 ui::EF_CONTROL_DOWN, 975 ui::ET_KEY_PRESSED, 976 keycode_control_l_, 977 0U, 978 KeyPress), 979 GetRewrittenEventAsString(&rewriter, 980 ui::VKEY_CONTROL, 981 0, 982 ui::ET_KEY_PRESSED, 983 keycode_control_l_, 984 0U)); 985 986 // Press right Control. Confirm the event is not rewritten. 987 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, 988 ui::EF_CONTROL_DOWN, 989 ui::ET_KEY_PRESSED, 990 keycode_control_r_, 991 0U, 992 KeyPress), 993 GetRewrittenEventAsString(&rewriter, 994 ui::VKEY_CONTROL, 995 0, 996 ui::ET_KEY_PRESSED, 997 keycode_control_r_, 998 0U)); 999 1000 // Press left Alt. Confirm the event is not rewritten. 1001 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU, 1002 ui::EF_ALT_DOWN, 1003 ui::ET_KEY_PRESSED, 1004 keycode_alt_l_, 1005 0, 1006 KeyPress), 1007 GetRewrittenEventAsString(&rewriter, 1008 ui::VKEY_MENU, 1009 0, 1010 ui::ET_KEY_PRESSED, 1011 keycode_alt_l_, 1012 0U)); 1013 1014 // Press right Alt. Confirm the event is not rewritten. 1015 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU, 1016 ui::EF_ALT_DOWN, 1017 ui::ET_KEY_PRESSED, 1018 keycode_alt_r_, 1019 0, 1020 KeyPress), 1021 GetRewrittenEventAsString(&rewriter, 1022 ui::VKEY_MENU, 1023 0, 1024 ui::ET_KEY_PRESSED, 1025 keycode_alt_r_, 1026 0U)); 1027 1028 // Test KeyRelease event, just in case. 1029 // Release Search. Confirm the release event is not rewritten. 1030 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_LWIN, 1031 0, 1032 ui::ET_KEY_RELEASED, 1033 keycode_super_l_, 1034 Mod4Mask, 1035 KeyRelease), 1036 GetRewrittenEventAsString(&rewriter, 1037 ui::VKEY_LWIN, 1038 0, 1039 ui::ET_KEY_RELEASED, 1040 keycode_super_l_, 1041 Mod4Mask)); 1042 } 1043 1044 TEST_F(EventRewriterTest, TestRewriteModifiersNoRemapMultipleKeys) { 1045 TestingPrefServiceSyncable prefs; 1046 EventRewriter rewriter; 1047 rewriter.set_pref_service_for_testing(&prefs); 1048 1049 // Press left Alt with Shift. Confirm the event is not rewritten. 1050 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU, 1051 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, 1052 ui::ET_KEY_PRESSED, 1053 keycode_meta_l_, 1054 ShiftMask, 1055 KeyPress), 1056 GetRewrittenEventAsString(&rewriter, 1057 ui::VKEY_MENU, 1058 ui::EF_SHIFT_DOWN, 1059 ui::ET_KEY_PRESSED, 1060 keycode_meta_l_, 1061 ShiftMask)); 1062 1063 // Press right Alt with Shift. Confirm the event is not rewritten. 1064 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU, 1065 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, 1066 ui::ET_KEY_PRESSED, 1067 keycode_meta_r_, 1068 ShiftMask, 1069 KeyPress), 1070 GetRewrittenEventAsString(&rewriter, 1071 ui::VKEY_MENU, 1072 ui::EF_SHIFT_DOWN, 1073 ui::ET_KEY_PRESSED, 1074 keycode_meta_r_, 1075 ShiftMask)); 1076 1077 // Press Search with Caps Lock mask. Confirm the event is not rewritten. 1078 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_LWIN, 1079 ui::EF_CAPS_LOCK_DOWN, 1080 ui::ET_KEY_PRESSED, 1081 keycode_super_l_, 1082 LockMask, 1083 KeyPress), 1084 GetRewrittenEventAsString(&rewriter, 1085 ui::VKEY_LWIN, 1086 ui::EF_CAPS_LOCK_DOWN, 1087 ui::ET_KEY_PRESSED, 1088 keycode_super_l_, 1089 LockMask)); 1090 1091 // Release Search with Caps Lock mask. Confirm the event is not rewritten. 1092 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_LWIN, 1093 ui::EF_CAPS_LOCK_DOWN, 1094 ui::ET_KEY_RELEASED, 1095 keycode_super_l_, 1096 LockMask | Mod4Mask, 1097 KeyRelease), 1098 GetRewrittenEventAsString(&rewriter, 1099 ui::VKEY_LWIN, 1100 ui::EF_CAPS_LOCK_DOWN, 1101 ui::ET_KEY_RELEASED, 1102 keycode_super_l_, 1103 LockMask | Mod4Mask)); 1104 1105 // Press Shift+Ctrl+Alt+Search+A. Confirm the event is not rewritten. 1106 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_B, 1107 ui::EF_SHIFT_DOWN | 1108 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, 1109 ui::ET_KEY_PRESSED, 1110 keycode_b_, 1111 ShiftMask | ControlMask | Mod1Mask | 1112 Mod4Mask, 1113 KeyPress), 1114 GetRewrittenEventAsString(&rewriter, 1115 ui::VKEY_B, 1116 ui::EF_SHIFT_DOWN | 1117 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, 1118 ui::ET_KEY_PRESSED, 1119 keycode_b_, 1120 ShiftMask | ControlMask | Mod1Mask | 1121 Mod4Mask)); 1122 } 1123 1124 TEST_F(EventRewriterTest, TestRewriteModifiersDisableSome) { 1125 // Disable Search and Control keys. 1126 TestingPrefServiceSyncable prefs; 1127 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1128 IntegerPrefMember search; 1129 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); 1130 search.SetValue(chromeos::input_method::kVoidKey); 1131 IntegerPrefMember control; 1132 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); 1133 control.SetValue(chromeos::input_method::kVoidKey); 1134 1135 EventRewriter rewriter; 1136 rewriter.set_pref_service_for_testing(&prefs); 1137 1138 // Press left Alt with Shift. This key press shouldn't be affected by the 1139 // pref. Confirm the event is not rewritten. 1140 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU, 1141 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, 1142 ui::ET_KEY_PRESSED, 1143 keycode_meta_l_, 1144 ShiftMask, 1145 KeyPress), 1146 GetRewrittenEventAsString(&rewriter, 1147 ui::VKEY_MENU, 1148 ui::EF_SHIFT_DOWN, 1149 ui::ET_KEY_PRESSED, 1150 keycode_meta_l_, 1151 ShiftMask)); 1152 1153 // Press Search. Confirm the event is now VKEY_UNKNOWN + XK_VoidSymbol. 1154 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_UNKNOWN, 1155 0, 1156 ui::ET_KEY_PRESSED, 1157 keycode_void_symbol_, 1158 0U, 1159 KeyPress), 1160 GetRewrittenEventAsString(&rewriter, 1161 ui::VKEY_LWIN, 1162 0, 1163 ui::ET_KEY_PRESSED, 1164 keycode_super_l_, 1165 0U)); 1166 1167 // Press Control. Confirm the event is now VKEY_UNKNOWN + XK_VoidSymbol. 1168 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_UNKNOWN, 1169 0, 1170 ui::ET_KEY_PRESSED, 1171 keycode_void_symbol_, 1172 0U, 1173 KeyPress), 1174 GetRewrittenEventAsString(&rewriter, 1175 ui::VKEY_CONTROL, 1176 0, 1177 ui::ET_KEY_PRESSED, 1178 keycode_control_l_, 1179 0U)); 1180 1181 // Press Control+Search. Confirm the event is now VKEY_UNKNOWN + 1182 // XK_VoidSymbol without any modifiers. 1183 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_UNKNOWN, 1184 0, 1185 ui::ET_KEY_PRESSED, 1186 keycode_void_symbol_, 1187 0U, 1188 KeyPress), 1189 GetRewrittenEventAsString(&rewriter, 1190 ui::VKEY_LWIN, 1191 ui::EF_CONTROL_DOWN, 1192 ui::ET_KEY_PRESSED, 1193 keycode_super_l_, 1194 ControlMask)); 1195 1196 // Press Control+Search+a. Confirm the event is now VKEY_A without any 1197 // modifiers. 1198 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, 1199 0, 1200 ui::ET_KEY_PRESSED, 1201 keycode_a_, 1202 0U, 1203 KeyPress), 1204 GetRewrittenEventAsString(&rewriter, 1205 ui::VKEY_A, 1206 ui::EF_CONTROL_DOWN, 1207 ui::ET_KEY_PRESSED, 1208 keycode_a_, 1209 ControlMask | Mod4Mask)); 1210 1211 // Press Control+Search+Alt+a. Confirm the event is now VKEY_A only with 1212 // the Alt modifier. 1213 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, 1214 ui::EF_ALT_DOWN, 1215 ui::ET_KEY_PRESSED, 1216 keycode_a_, 1217 Mod1Mask, 1218 KeyPress), 1219 GetRewrittenEventAsString(&rewriter, 1220 ui::VKEY_A, 1221 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, 1222 ui::ET_KEY_PRESSED, 1223 keycode_a_, 1224 ControlMask | Mod1Mask | Mod4Mask)); 1225 1226 // Remap Alt to Control. 1227 IntegerPrefMember alt; 1228 alt.Init(prefs::kLanguageRemapAltKeyTo, &prefs); 1229 alt.SetValue(chromeos::input_method::kControlKey); 1230 1231 // Press left Alt. Confirm the event is now VKEY_CONTROL + XK_Control_L 1232 // even though the Control key itself is disabled. 1233 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, 1234 ui::EF_CONTROL_DOWN, 1235 ui::ET_KEY_PRESSED, 1236 keycode_control_l_, 1237 0U, 1238 KeyPress), 1239 GetRewrittenEventAsString(&rewriter, 1240 ui::VKEY_MENU, 1241 0, 1242 ui::ET_KEY_PRESSED, 1243 keycode_alt_l_, 1244 0U)); 1245 1246 // Press Alt+a. Confirm the event is now Control+a even though the Control 1247 // key itself is disabled. 1248 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, 1249 ui::EF_CONTROL_DOWN, 1250 ui::ET_KEY_PRESSED, 1251 keycode_a_, 1252 ControlMask, 1253 KeyPress), 1254 GetRewrittenEventAsString(&rewriter, 1255 ui::VKEY_A, 1256 ui::EF_ALT_DOWN, 1257 ui::ET_KEY_PRESSED, 1258 keycode_a_, 1259 Mod1Mask)); 1260 } 1261 1262 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToControl) { 1263 // Remap Search to Control. 1264 TestingPrefServiceSyncable prefs; 1265 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1266 IntegerPrefMember search; 1267 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); 1268 search.SetValue(chromeos::input_method::kControlKey); 1269 1270 EventRewriter rewriter; 1271 rewriter.set_pref_service_for_testing(&prefs); 1272 1273 // Press Search. Confirm the event is now VKEY_CONTROL + XK_Control_L. 1274 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, 1275 ui::EF_CONTROL_DOWN, 1276 ui::ET_KEY_PRESSED, 1277 keycode_control_l_, 1278 0U, 1279 KeyPress), 1280 GetRewrittenEventAsString(&rewriter, 1281 ui::VKEY_LWIN, 1282 0, 1283 ui::ET_KEY_PRESSED, 1284 keycode_super_l_, 1285 0U)); 1286 1287 // Remap Alt to Control too. 1288 IntegerPrefMember alt; 1289 alt.Init(prefs::kLanguageRemapAltKeyTo, &prefs); 1290 alt.SetValue(chromeos::input_method::kControlKey); 1291 1292 // Press left Alt. Confirm the event is now VKEY_CONTROL + XK_Control_L. 1293 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, 1294 ui::EF_CONTROL_DOWN, 1295 ui::ET_KEY_PRESSED, 1296 keycode_control_l_, 1297 0U, 1298 KeyPress), 1299 GetRewrittenEventAsString(&rewriter, 1300 ui::VKEY_MENU, 1301 0, 1302 ui::ET_KEY_PRESSED, 1303 keycode_alt_l_, 1304 0U)); 1305 1306 // Press right Alt. Confirm the event is now VKEY_CONTROL + XK_Control_R. 1307 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, 1308 ui::EF_CONTROL_DOWN, 1309 ui::ET_KEY_PRESSED, 1310 keycode_control_r_, 1311 0U, 1312 KeyPress), 1313 GetRewrittenEventAsString(&rewriter, 1314 ui::VKEY_MENU, 1315 0, 1316 ui::ET_KEY_PRESSED, 1317 keycode_alt_r_, 1318 0U)); 1319 1320 // Press Alt+Search. Confirm the event is now VKEY_CONTROL + XK_Control_L. 1321 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, 1322 ui::EF_CONTROL_DOWN, 1323 ui::ET_KEY_PRESSED, 1324 keycode_control_l_, 1325 ControlMask, 1326 KeyPress), 1327 GetRewrittenEventAsString(&rewriter, 1328 ui::VKEY_LWIN, 1329 ui::EF_ALT_DOWN, 1330 ui::ET_KEY_PRESSED, 1331 keycode_super_l_, 1332 Mod1Mask)); 1333 1334 // Press Control+Alt+Search. Confirm the event is now VKEY_CONTROL + 1335 // XK_Control_L. 1336 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, 1337 ui::EF_CONTROL_DOWN, 1338 ui::ET_KEY_PRESSED, 1339 keycode_control_l_, 1340 ControlMask, 1341 KeyPress), 1342 GetRewrittenEventAsString(&rewriter, 1343 ui::VKEY_LWIN, 1344 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, 1345 ui::ET_KEY_PRESSED, 1346 keycode_super_l_, 1347 ControlMask | Mod1Mask)); 1348 1349 // Press Shift+Control+Alt+Search. Confirm the event is now Control with 1350 // Shift and Control modifiers. 1351 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, 1352 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, 1353 ui::ET_KEY_PRESSED, 1354 keycode_control_l_, 1355 ShiftMask | ControlMask, 1356 KeyPress), 1357 GetRewrittenEventAsString(&rewriter, 1358 ui::VKEY_LWIN, 1359 ui::EF_SHIFT_DOWN | 1360 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, 1361 ui::ET_KEY_PRESSED, 1362 keycode_super_l_, 1363 ShiftMask | ControlMask | Mod1Mask)); 1364 1365 // Press Shift+Control+Alt+Search+B. Confirm the event is now B with Shift 1366 // and Control modifiers. 1367 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_B, 1368 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, 1369 ui::ET_KEY_PRESSED, 1370 keycode_b_, 1371 ShiftMask | ControlMask, 1372 KeyPress), 1373 GetRewrittenEventAsString(&rewriter, 1374 ui::VKEY_B, 1375 ui::EF_SHIFT_DOWN | 1376 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, 1377 ui::ET_KEY_PRESSED, 1378 keycode_b_, 1379 ShiftMask | ControlMask | Mod1Mask)); 1380 } 1381 1382 TEST_F(EventRewriterTest, TestRewriteModifiersRemapMany) { 1383 // Remap Search to Alt. 1384 TestingPrefServiceSyncable prefs; 1385 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1386 IntegerPrefMember search; 1387 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); 1388 search.SetValue(chromeos::input_method::kAltKey); 1389 1390 EventRewriter rewriter; 1391 rewriter.set_pref_service_for_testing(&prefs); 1392 1393 // Press Search. Confirm the event is now VKEY_MENU + XK_Alt_L. 1394 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU, 1395 ui::EF_ALT_DOWN, 1396 ui::ET_KEY_PRESSED, 1397 keycode_alt_l_, 1398 0U, 1399 KeyPress), 1400 GetRewrittenEventAsString(&rewriter, 1401 ui::VKEY_LWIN, 1402 0, 1403 ui::ET_KEY_PRESSED, 1404 keycode_super_l_, 1405 0U)); 1406 1407 // Remap Alt to Control. 1408 IntegerPrefMember alt; 1409 alt.Init(prefs::kLanguageRemapAltKeyTo, &prefs); 1410 alt.SetValue(chromeos::input_method::kControlKey); 1411 1412 // Press left Alt. Confirm the event is now VKEY_CONTROL + XK_Control_L. 1413 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, 1414 ui::EF_CONTROL_DOWN, 1415 ui::ET_KEY_PRESSED, 1416 keycode_control_l_, 1417 0U, 1418 KeyPress), 1419 GetRewrittenEventAsString(&rewriter, 1420 ui::VKEY_MENU, 1421 0, 1422 ui::ET_KEY_PRESSED, 1423 keycode_alt_l_, 1424 0U)); 1425 1426 // Remap Control to Search. 1427 IntegerPrefMember control; 1428 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); 1429 control.SetValue(chromeos::input_method::kSearchKey); 1430 1431 // Press left Control. Confirm the event is now VKEY_LWIN. 1432 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_LWIN, 1433 0, 1434 ui::ET_KEY_PRESSED, 1435 keycode_super_l_, 1436 0U, 1437 KeyPress), 1438 GetRewrittenEventAsString(&rewriter, 1439 ui::VKEY_CONTROL, 1440 0, 1441 ui::ET_KEY_PRESSED, 1442 keycode_control_l_, 1443 0U)); 1444 1445 // Then, press all of the three, Control+Alt+Search. 1446 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU, 1447 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, 1448 ui::ET_KEY_PRESSED, 1449 keycode_alt_l_, 1450 ControlMask | Mod4Mask, 1451 KeyPress), 1452 GetRewrittenEventAsString(&rewriter, 1453 ui::VKEY_LWIN, 1454 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, 1455 ui::ET_KEY_PRESSED, 1456 keycode_super_l_, 1457 ControlMask | Mod1Mask)); 1458 1459 // Press Shift+Control+Alt+Search. 1460 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU, 1461 (ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | 1462 ui::EF_ALT_DOWN), 1463 ui::ET_KEY_PRESSED, 1464 keycode_alt_l_, 1465 ShiftMask | ControlMask | Mod4Mask, 1466 KeyPress), 1467 GetRewrittenEventAsString(&rewriter, 1468 ui::VKEY_LWIN, 1469 ui::EF_SHIFT_DOWN | 1470 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, 1471 ui::ET_KEY_PRESSED, 1472 keycode_super_l_, 1473 ShiftMask | ControlMask | Mod1Mask)); 1474 1475 // Press Shift+Control+Alt+Search+B 1476 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_B, 1477 ui::EF_SHIFT_DOWN | 1478 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, 1479 ui::ET_KEY_PRESSED, 1480 keycode_b_, 1481 ShiftMask | ControlMask | Mod1Mask | 1482 Mod4Mask, 1483 KeyPress), 1484 GetRewrittenEventAsString(&rewriter, 1485 ui::VKEY_B, 1486 ui::EF_SHIFT_DOWN | 1487 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, 1488 ui::ET_KEY_PRESSED, 1489 keycode_b_, 1490 ShiftMask | ControlMask | Mod1Mask | 1491 Mod4Mask)); 1492 } 1493 1494 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToCapsLock) { 1495 // Remap Search to Caps Lock. 1496 TestingPrefServiceSyncable prefs; 1497 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1498 IntegerPrefMember search; 1499 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); 1500 search.SetValue(chromeos::input_method::kCapsLockKey); 1501 1502 chromeos::input_method::MockXKeyboard xkeyboard; 1503 EventRewriter rewriter; 1504 rewriter.set_pref_service_for_testing(&prefs); 1505 rewriter.set_xkeyboard_for_testing(&xkeyboard); 1506 EXPECT_FALSE(xkeyboard.caps_lock_is_enabled_); 1507 1508 // Press Search. 1509 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, 1510 ui::EF_CAPS_LOCK_DOWN, 1511 ui::ET_KEY_PRESSED, 1512 keycode_caps_lock_, 1513 0U, 1514 KeyPress), 1515 GetRewrittenEventAsString(&rewriter, 1516 ui::VKEY_LWIN, 1517 0, 1518 ui::ET_KEY_PRESSED, 1519 keycode_super_l_, 1520 0U)); 1521 // Confirm that the Caps Lock status is changed. 1522 EXPECT_TRUE(xkeyboard.caps_lock_is_enabled_); 1523 1524 // Release Search. 1525 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, 1526 ui::EF_NONE, 1527 ui::ET_KEY_RELEASED, 1528 keycode_caps_lock_, 1529 LockMask, 1530 KeyRelease), 1531 GetRewrittenEventAsString(&rewriter, 1532 ui::VKEY_LWIN, 1533 ui::EF_CAPS_LOCK_DOWN, 1534 ui::ET_KEY_RELEASED, 1535 keycode_super_l_, 1536 Mod4Mask | LockMask)); 1537 // Confirm that the Caps Lock status is not changed. 1538 EXPECT_TRUE(xkeyboard.caps_lock_is_enabled_); 1539 1540 // Press Search. 1541 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, 1542 ui::EF_CAPS_LOCK_DOWN, 1543 ui::ET_KEY_PRESSED, 1544 keycode_caps_lock_, 1545 LockMask, 1546 KeyPress), 1547 GetRewrittenEventAsString(&rewriter, 1548 ui::VKEY_LWIN, 1549 ui::EF_CAPS_LOCK_DOWN, 1550 ui::ET_KEY_PRESSED, 1551 keycode_super_l_, 1552 LockMask)); 1553 // Confirm that the Caps Lock status is changed. 1554 EXPECT_FALSE(xkeyboard.caps_lock_is_enabled_); 1555 1556 // Release Search. 1557 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, 1558 ui::EF_NONE, 1559 ui::ET_KEY_RELEASED, 1560 keycode_caps_lock_, 1561 LockMask, 1562 KeyRelease), 1563 GetRewrittenEventAsString(&rewriter, 1564 ui::VKEY_LWIN, 1565 ui::EF_CAPS_LOCK_DOWN, 1566 ui::ET_KEY_RELEASED, 1567 keycode_super_l_, 1568 Mod4Mask | LockMask)); 1569 // Confirm that the Caps Lock status is not changed. 1570 EXPECT_FALSE(xkeyboard.caps_lock_is_enabled_); 1571 1572 // Press Caps Lock (on an external keyboard). 1573 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, 1574 ui::EF_CAPS_LOCK_DOWN, 1575 ui::ET_KEY_PRESSED, 1576 keycode_caps_lock_, 1577 0U, 1578 KeyPress), 1579 GetRewrittenEventAsString(&rewriter, 1580 ui::VKEY_CAPITAL, 1581 ui::EF_NONE, 1582 ui::ET_KEY_PRESSED, 1583 keycode_caps_lock_, 1584 0U)); 1585 1586 // Confirm that calling RewriteForTesting() does not change the state of 1587 // |xkeyboard|. In this case, X Window system itself should change the 1588 // Caps Lock state, not ash::EventRewriter. 1589 EXPECT_FALSE(xkeyboard.caps_lock_is_enabled_); 1590 1591 // Release Caps Lock (on an external keyboard). 1592 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, 1593 ui::EF_NONE, 1594 ui::ET_KEY_RELEASED, 1595 keycode_caps_lock_, 1596 LockMask, 1597 KeyRelease), 1598 GetRewrittenEventAsString(&rewriter, 1599 ui::VKEY_CAPITAL, 1600 ui::EF_CAPS_LOCK_DOWN, 1601 ui::ET_KEY_RELEASED, 1602 keycode_caps_lock_, 1603 LockMask)); 1604 EXPECT_FALSE(xkeyboard.caps_lock_is_enabled_); 1605 } 1606 1607 TEST_F(EventRewriterTest, DISABLED_TestRewriteCapsLock) { 1608 // It seems that the X server running on build servers is too old and does not 1609 // support F16 (i.e. 'XKeysymToKeycode(display_, XF86XK_Launch7)' call). 1610 // TODO(yusukes): Reenable the test once build servers are upgraded. 1611 1612 TestingPrefServiceSyncable prefs; 1613 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1614 1615 chromeos::input_method::MockXKeyboard xkeyboard; 1616 EventRewriter rewriter; 1617 rewriter.set_pref_service_for_testing(&prefs); 1618 rewriter.set_xkeyboard_for_testing(&xkeyboard); 1619 EXPECT_FALSE(xkeyboard.caps_lock_is_enabled_); 1620 1621 // On Chrome OS, CapsLock is mapped to F16 with Mod3Mask. 1622 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, 1623 ui::EF_CAPS_LOCK_DOWN, 1624 ui::ET_KEY_PRESSED, 1625 keycode_caps_lock_, 1626 0U, 1627 KeyPress), 1628 GetRewrittenEventAsString(&rewriter, 1629 ui::VKEY_F16, 1630 0, 1631 ui::ET_KEY_PRESSED, 1632 keycode_launch7_, 1633 0U)); 1634 EXPECT_TRUE(xkeyboard.caps_lock_is_enabled_); 1635 } 1636 1637 TEST_F(EventRewriterTest, DISABLED_TestRewriteDiamondKey) { 1638 // TODO(yusukes): Reenable the test once build servers are upgraded. 1639 1640 TestingPrefServiceSyncable prefs; 1641 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1642 1643 chromeos::input_method::MockXKeyboard xkeyboard; 1644 EventRewriter rewriter; 1645 rewriter.set_pref_service_for_testing(&prefs); 1646 rewriter.set_xkeyboard_for_testing(&xkeyboard); 1647 1648 // F15 should work as Ctrl when --has-chromeos-diamond-key is not specified. 1649 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, 1650 ui::EF_CONTROL_DOWN, 1651 ui::ET_KEY_PRESSED, 1652 keycode_control_l_, 1653 0U, 1654 KeyPress), 1655 GetRewrittenEventAsString(&rewriter, 1656 ui::VKEY_F15, 1657 0, 1658 ui::ET_KEY_PRESSED, 1659 keycode_launch6_, 1660 0U)); 1661 1662 // However, Mod2Mask should not be rewritten to CtrlMask when 1663 // --has-chromeos-diamond-key is not specified. 1664 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, 1665 0, 1666 ui::ET_KEY_PRESSED, 1667 keycode_a_, 1668 Mod2Mask, 1669 KeyPress), 1670 GetRewrittenEventAsString(&rewriter, 1671 ui::VKEY_A, 1672 0, 1673 ui::ET_KEY_PRESSED, 1674 keycode_a_, 1675 Mod2Mask)); 1676 } 1677 1678 TEST_F(EventRewriterTest, DISABLED_TestRewriteDiamondKeyWithFlag) { 1679 // TODO(yusukes): Reenable the test once build servers are upgraded. 1680 1681 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); 1682 CommandLine::ForCurrentProcess()->AppendSwitchASCII( 1683 chromeos::switches::kHasChromeOSDiamondKey, ""); 1684 1685 TestingPrefServiceSyncable prefs; 1686 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1687 1688 chromeos::input_method::MockXKeyboard xkeyboard; 1689 EventRewriter rewriter; 1690 rewriter.set_pref_service_for_testing(&prefs); 1691 rewriter.set_xkeyboard_for_testing(&xkeyboard); 1692 1693 // By default, F15 should work as Control. 1694 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, 1695 ui::EF_CONTROL_DOWN, 1696 ui::ET_KEY_PRESSED, 1697 keycode_control_l_, 1698 0U, 1699 KeyPress), 1700 GetRewrittenEventAsString(&rewriter, 1701 ui::VKEY_F15, 1702 0, 1703 ui::ET_KEY_PRESSED, 1704 keycode_launch6_, 1705 0U)); 1706 1707 IntegerPrefMember diamond; 1708 diamond.Init(prefs::kLanguageRemapDiamondKeyTo, &prefs); 1709 diamond.SetValue(chromeos::input_method::kVoidKey); 1710 1711 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_UNKNOWN, 1712 0, 1713 ui::ET_KEY_PRESSED, 1714 keycode_void_symbol_, 1715 0U, 1716 KeyPress), 1717 GetRewrittenEventAsString(&rewriter, 1718 ui::VKEY_F15, 1719 0, 1720 ui::ET_KEY_PRESSED, 1721 keycode_launch6_, 1722 0U)); 1723 1724 diamond.SetValue(chromeos::input_method::kControlKey); 1725 1726 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, 1727 ui::EF_CONTROL_DOWN, 1728 ui::ET_KEY_PRESSED, 1729 keycode_control_l_, 1730 0U, 1731 KeyPress), 1732 GetRewrittenEventAsString(&rewriter, 1733 ui::VKEY_F15, 1734 0, 1735 ui::ET_KEY_PRESSED, 1736 keycode_launch6_, 1737 0U)); 1738 1739 diamond.SetValue(chromeos::input_method::kAltKey); 1740 1741 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU, 1742 ui::EF_ALT_DOWN, 1743 ui::ET_KEY_PRESSED, 1744 keycode_alt_l_, 1745 0, 1746 KeyPress), 1747 GetRewrittenEventAsString(&rewriter, 1748 ui::VKEY_F15, 1749 0, 1750 ui::ET_KEY_PRESSED, 1751 keycode_launch6_, 1752 0U)); 1753 1754 diamond.SetValue(chromeos::input_method::kCapsLockKey); 1755 1756 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, 1757 ui::EF_CAPS_LOCK_DOWN, 1758 ui::ET_KEY_PRESSED, 1759 keycode_caps_lock_, 1760 0U, 1761 KeyPress), 1762 GetRewrittenEventAsString(&rewriter, 1763 ui::VKEY_F15, 1764 0, 1765 ui::ET_KEY_PRESSED, 1766 keycode_launch6_, 1767 0U)); 1768 1769 *CommandLine::ForCurrentProcess() = original_cl; 1770 } 1771 1772 TEST_F(EventRewriterTest, TestRewriteCapsLockToControl) { 1773 TestingPrefServiceSyncable prefs; 1774 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1775 IntegerPrefMember control; 1776 control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs); 1777 control.SetValue(chromeos::input_method::kControlKey); 1778 1779 EventRewriter rewriter; 1780 rewriter.set_pref_service_for_testing(&prefs); 1781 1782 // Press CapsLock+a. Confirm that Mod3Mask is rewritten to ControlMask. 1783 // On Chrome OS, CapsLock works as a Mod3 modifier. 1784 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, 1785 ui::EF_CONTROL_DOWN, 1786 ui::ET_KEY_PRESSED, 1787 keycode_a_, 1788 ControlMask, 1789 KeyPress), 1790 GetRewrittenEventAsString(&rewriter, 1791 ui::VKEY_A, 1792 0, 1793 ui::ET_KEY_PRESSED, 1794 keycode_a_, 1795 Mod3Mask)); 1796 1797 // Press Control+CapsLock+a. Confirm that Mod3Mask is rewritten to ControlMask 1798 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, 1799 ui::EF_CONTROL_DOWN, 1800 ui::ET_KEY_PRESSED, 1801 keycode_a_, 1802 ControlMask, 1803 KeyPress), 1804 GetRewrittenEventAsString(&rewriter, 1805 ui::VKEY_A, 1806 ui::EF_CONTROL_DOWN, 1807 ui::ET_KEY_PRESSED, 1808 keycode_a_, 1809 Mod3Mask | ControlMask)); 1810 1811 // Press Alt+CapsLock+a. Confirm that Mod3Mask is rewritten to ControlMask. 1812 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, 1813 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, 1814 ui::ET_KEY_PRESSED, 1815 keycode_a_, 1816 Mod1Mask | ControlMask, 1817 KeyPress), 1818 GetRewrittenEventAsString(&rewriter, 1819 ui::VKEY_A, 1820 ui::EF_ALT_DOWN, 1821 ui::ET_KEY_PRESSED, 1822 keycode_a_, 1823 Mod1Mask | Mod3Mask)); 1824 } 1825 1826 TEST_F(EventRewriterTest, TestRewriteCapsLockMod3InUse) { 1827 // Remap CapsLock to Control. 1828 TestingPrefServiceSyncable prefs; 1829 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1830 IntegerPrefMember control; 1831 control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs); 1832 control.SetValue(chromeos::input_method::kControlKey); 1833 1834 EventRewriter rewriter; 1835 rewriter.set_pref_service_for_testing(&prefs); 1836 input_method_manager_mock_->SetCurrentInputMethodId("xkb:de:neo:ger"); 1837 1838 // Press CapsLock+a. Confirm that Mod3Mask is NOT rewritten to ControlMask 1839 // when Mod3Mask is already in use by the current XKB layout. 1840 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A, 1841 0, 1842 ui::ET_KEY_PRESSED, 1843 keycode_a_, 1844 Mod3Mask, 1845 KeyPress), 1846 GetRewrittenEventAsString(&rewriter, 1847 ui::VKEY_A, 1848 0, 1849 ui::ET_KEY_PRESSED, 1850 keycode_a_, 1851 Mod3Mask)); 1852 1853 input_method_manager_mock_->SetCurrentInputMethodId("xkb:us::eng"); 1854 } 1855 1856 TEST_F(EventRewriterTest, TestRewriteExtendedKeys) { 1857 TestingPrefServiceSyncable prefs; 1858 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1859 EventRewriter rewriter; 1860 rewriter.set_pref_service_for_testing(&prefs); 1861 1862 struct { 1863 ui::KeyboardCode input; 1864 KeyCode input_native; 1865 unsigned int input_mods; 1866 unsigned int input_native_mods; 1867 ui::KeyboardCode output; 1868 KeyCode output_native; 1869 unsigned int output_mods; 1870 unsigned int output_native_mods; 1871 } chromeos_tests[] = { 1872 // Alt+Backspace -> Delete 1873 { ui::VKEY_BACK, keycode_backspace_, 1874 ui::EF_ALT_DOWN, Mod1Mask, 1875 ui::VKEY_DELETE, keycode_delete_, 1876 0, 0, }, 1877 // Control+Alt+Backspace -> Control+Delete 1878 { ui::VKEY_BACK, keycode_backspace_, 1879 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask, 1880 ui::VKEY_DELETE, keycode_delete_, 1881 ui::EF_CONTROL_DOWN, ControlMask, }, 1882 // Search+Alt+Backspace -> Alt+Backspace 1883 { ui::VKEY_BACK, keycode_backspace_, 1884 ui::EF_ALT_DOWN, Mod1Mask | Mod4Mask, 1885 ui::VKEY_BACK, keycode_backspace_, 1886 ui::EF_ALT_DOWN, Mod1Mask, }, 1887 // Search+Control+Alt+Backspace -> Control+Alt+Backspace 1888 { ui::VKEY_BACK, keycode_backspace_, 1889 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask | Mod4Mask, 1890 ui::VKEY_BACK, keycode_backspace_, 1891 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask, }, 1892 // Alt+Up -> Prior 1893 { ui::VKEY_UP, keycode_up_, 1894 ui::EF_ALT_DOWN, Mod1Mask, 1895 ui::VKEY_PRIOR, keycode_prior_, 1896 0, 0, }, 1897 // Alt+Down -> Next 1898 { ui::VKEY_DOWN, keycode_down_, 1899 ui::EF_ALT_DOWN, Mod1Mask, 1900 ui::VKEY_NEXT, keycode_next_, 1901 0, 0, }, 1902 // Ctrl+Alt+Up -> Home 1903 { ui::VKEY_UP, keycode_up_, 1904 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask, 1905 ui::VKEY_HOME, keycode_home_, 1906 0, 0, }, 1907 // Ctrl+Alt+Down -> End 1908 { ui::VKEY_DOWN, keycode_down_, 1909 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask, 1910 ui::VKEY_END, keycode_end_, 1911 0, 0, }, 1912 1913 // Search+Alt+Up -> Alt+Up 1914 { ui::VKEY_UP, keycode_up_, 1915 ui::EF_ALT_DOWN, Mod1Mask | Mod4Mask, 1916 ui::VKEY_UP, keycode_up_, 1917 ui::EF_ALT_DOWN, Mod1Mask }, 1918 // Search+Alt+Down -> Alt+Down 1919 { ui::VKEY_DOWN, keycode_down_, 1920 ui::EF_ALT_DOWN, Mod1Mask | Mod4Mask, 1921 ui::VKEY_DOWN, keycode_down_, 1922 ui::EF_ALT_DOWN, Mod1Mask }, 1923 // Search+Ctrl+Alt+Up -> Search+Ctrl+Alt+Up 1924 { ui::VKEY_UP, keycode_up_, 1925 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask | Mod4Mask, 1926 ui::VKEY_UP, keycode_up_, 1927 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask }, 1928 // Search+Ctrl+Alt+Down -> Ctrl+Alt+Down 1929 { ui::VKEY_DOWN, keycode_down_, 1930 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask | Mod4Mask, 1931 ui::VKEY_DOWN, keycode_down_, 1932 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask }, 1933 1934 // Period -> Period 1935 { ui::VKEY_OEM_PERIOD, keycode_period_, 0, 0, 1936 ui::VKEY_OEM_PERIOD, keycode_period_, 0, 0 }, 1937 1938 // Search+Backspace -> Delete 1939 { ui::VKEY_BACK, keycode_backspace_, 1940 0, Mod4Mask, 1941 ui::VKEY_DELETE, keycode_delete_, 1942 0, 0, }, 1943 // Search+Up -> Prior 1944 { ui::VKEY_UP, keycode_up_, 1945 0, Mod4Mask, 1946 ui::VKEY_PRIOR, keycode_prior_, 1947 0, 0, }, 1948 // Search+Down -> Next 1949 { ui::VKEY_DOWN, keycode_down_, 1950 0, Mod4Mask, 1951 ui::VKEY_NEXT, keycode_next_, 1952 0, 0, }, 1953 // Search+Left -> Home 1954 { ui::VKEY_LEFT, keycode_left_, 1955 0, Mod4Mask, 1956 ui::VKEY_HOME, keycode_home_, 1957 0, 0, }, 1958 // Control+Search+Left -> Home 1959 { ui::VKEY_LEFT, keycode_left_, 1960 ui::EF_CONTROL_DOWN, Mod4Mask | ControlMask, 1961 ui::VKEY_HOME, keycode_home_, 1962 ui::EF_CONTROL_DOWN, ControlMask }, 1963 // Search+Right -> End 1964 { ui::VKEY_RIGHT, keycode_right_, 1965 0, Mod4Mask, 1966 ui::VKEY_END, keycode_end_, 1967 0, 0, }, 1968 // Control+Search+Right -> End 1969 { ui::VKEY_RIGHT, keycode_right_, 1970 ui::EF_CONTROL_DOWN, Mod4Mask | ControlMask, 1971 ui::VKEY_END, keycode_end_, 1972 ui::EF_CONTROL_DOWN, ControlMask }, 1973 // Search+Period -> Insert 1974 { ui::VKEY_OEM_PERIOD, keycode_period_, 0, Mod4Mask, 1975 ui::VKEY_INSERT, keycode_insert_, 0, 0 }, 1976 // Control+Search+Period -> Control+Insert 1977 { ui::VKEY_OEM_PERIOD, keycode_period_, 1978 ui::EF_CONTROL_DOWN, Mod4Mask | ControlMask, 1979 ui::VKEY_INSERT, keycode_insert_, 1980 ui::EF_CONTROL_DOWN, ControlMask } 1981 }; 1982 1983 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(chromeos_tests); ++i) { 1984 EXPECT_EQ(GetExpectedResultAsString(chromeos_tests[i].output, 1985 chromeos_tests[i].output_mods, 1986 ui::ET_KEY_PRESSED, 1987 chromeos_tests[i].output_native, 1988 chromeos_tests[i].output_native_mods, 1989 KeyPress), 1990 GetRewrittenEventAsString(&rewriter, 1991 chromeos_tests[i].input, 1992 chromeos_tests[i].input_mods, 1993 ui::ET_KEY_PRESSED, 1994 chromeos_tests[i].input_native, 1995 chromeos_tests[i].input_native_mods)); 1996 } 1997 } 1998 1999 TEST_F(EventRewriterTest, TestRewriteFunctionKeys) { 2000 TestingPrefServiceSyncable prefs; 2001 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 2002 EventRewriter rewriter; 2003 rewriter.set_pref_service_for_testing(&prefs); 2004 2005 struct { 2006 ui::KeyboardCode input; 2007 KeyCode input_native; 2008 unsigned int input_native_mods; 2009 unsigned int input_mods; 2010 ui::KeyboardCode output; 2011 KeyCode output_native; 2012 unsigned int output_native_mods; 2013 unsigned int output_mods; 2014 } tests[] = { 2015 // F1 -> Back 2016 { ui::VKEY_F1, keycode_f1_, 0, 0, 2017 ui::VKEY_BROWSER_BACK, keycode_browser_back_, 0, 0 }, 2018 { ui::VKEY_F1, keycode_f1_, ControlMask, ui::EF_CONTROL_DOWN, 2019 ui::VKEY_BROWSER_BACK, keycode_browser_back_, 2020 ControlMask, ui::EF_CONTROL_DOWN }, 2021 { ui::VKEY_F1, keycode_f1_, Mod1Mask, ui::EF_ALT_DOWN, 2022 ui::VKEY_BROWSER_BACK, keycode_browser_back_, 2023 Mod1Mask, ui::EF_ALT_DOWN }, 2024 // F2 -> Forward 2025 { ui::VKEY_F2, keycode_f2_, 0, 0, 2026 ui::VKEY_BROWSER_FORWARD, keycode_browser_forward_, 0, 0 }, 2027 { ui::VKEY_F2, keycode_f2_, ControlMask, ui::EF_CONTROL_DOWN, 2028 ui::VKEY_BROWSER_FORWARD, keycode_browser_forward_, 2029 ControlMask, ui::EF_CONTROL_DOWN }, 2030 { ui::VKEY_F2, keycode_f2_, Mod1Mask, ui::EF_ALT_DOWN, 2031 ui::VKEY_BROWSER_FORWARD, keycode_browser_forward_, 2032 Mod1Mask, ui::EF_ALT_DOWN }, 2033 // F3 -> Refresh 2034 { ui::VKEY_F3, keycode_f3_, 0, 0, 2035 ui::VKEY_BROWSER_REFRESH, keycode_browser_refresh_, 0, 0 }, 2036 { ui::VKEY_F3, keycode_f3_, ControlMask, ui::EF_CONTROL_DOWN, 2037 ui::VKEY_BROWSER_REFRESH, keycode_browser_refresh_, 2038 ControlMask, ui::EF_CONTROL_DOWN }, 2039 { ui::VKEY_F3, keycode_f3_, Mod1Mask, ui::EF_ALT_DOWN, 2040 ui::VKEY_BROWSER_REFRESH, keycode_browser_refresh_, 2041 Mod1Mask, ui::EF_ALT_DOWN }, 2042 // F4 -> Launch App 2 2043 { ui::VKEY_F4, keycode_f4_, 0, 0, 2044 ui::VKEY_MEDIA_LAUNCH_APP2, keycode_media_launch_app2_, 0, 0 }, 2045 { ui::VKEY_F4, keycode_f4_, ControlMask, ui::EF_CONTROL_DOWN, 2046 ui::VKEY_MEDIA_LAUNCH_APP2, keycode_media_launch_app2_, 2047 ControlMask, ui::EF_CONTROL_DOWN }, 2048 { ui::VKEY_F4, keycode_f4_, Mod1Mask, ui::EF_ALT_DOWN, 2049 ui::VKEY_MEDIA_LAUNCH_APP2, keycode_media_launch_app2_, 2050 Mod1Mask, ui::EF_ALT_DOWN }, 2051 // F5 -> Launch App 1 2052 { ui::VKEY_F5, keycode_f5_, 0, 0, 2053 ui::VKEY_MEDIA_LAUNCH_APP1, keycode_media_launch_app1_, 0, 0 }, 2054 { ui::VKEY_F5, keycode_f5_, ControlMask, ui::EF_CONTROL_DOWN, 2055 ui::VKEY_MEDIA_LAUNCH_APP1, keycode_media_launch_app1_, 2056 ControlMask, ui::EF_CONTROL_DOWN }, 2057 { ui::VKEY_F5, keycode_f5_, Mod1Mask, ui::EF_ALT_DOWN, 2058 ui::VKEY_MEDIA_LAUNCH_APP1, keycode_media_launch_app1_, 2059 Mod1Mask, ui::EF_ALT_DOWN }, 2060 // F6 -> Brightness down 2061 { ui::VKEY_F6, keycode_f6_, 0, 0, 2062 ui::VKEY_BRIGHTNESS_DOWN, keycode_brightness_down_, 0, 0 }, 2063 { ui::VKEY_F6, keycode_f6_, ControlMask, ui::EF_CONTROL_DOWN, 2064 ui::VKEY_BRIGHTNESS_DOWN, keycode_brightness_down_, 2065 ControlMask, ui::EF_CONTROL_DOWN }, 2066 { ui::VKEY_F6, keycode_f6_, Mod1Mask, ui::EF_ALT_DOWN, 2067 ui::VKEY_BRIGHTNESS_DOWN, keycode_brightness_down_, 2068 Mod1Mask, ui::EF_ALT_DOWN }, 2069 // F7 -> Brightness up 2070 { ui::VKEY_F7, keycode_f7_, 0, 0, 2071 ui::VKEY_BRIGHTNESS_UP, keycode_brightness_up_, 0, 0 }, 2072 { ui::VKEY_F7, keycode_f7_, ControlMask, ui::EF_CONTROL_DOWN, 2073 ui::VKEY_BRIGHTNESS_UP, keycode_brightness_up_, 2074 ControlMask, ui::EF_CONTROL_DOWN }, 2075 { ui::VKEY_F7, keycode_f7_, Mod1Mask, ui::EF_ALT_DOWN, 2076 ui::VKEY_BRIGHTNESS_UP, keycode_brightness_up_, 2077 Mod1Mask, ui::EF_ALT_DOWN }, 2078 // F8 -> Volume Mute 2079 { ui::VKEY_F8, keycode_f8_, 0, 0, 2080 ui::VKEY_VOLUME_MUTE, keycode_volume_mute_, 0, 0 }, 2081 { ui::VKEY_F8, keycode_f8_, ControlMask, ui::EF_CONTROL_DOWN, 2082 ui::VKEY_VOLUME_MUTE, keycode_volume_mute_, 2083 ControlMask, ui::EF_CONTROL_DOWN }, 2084 { ui::VKEY_F8, keycode_f8_, Mod1Mask, ui::EF_ALT_DOWN, 2085 ui::VKEY_VOLUME_MUTE, keycode_volume_mute_, 2086 Mod1Mask, ui::EF_ALT_DOWN }, 2087 // F9 -> Volume Down 2088 { ui::VKEY_F9, keycode_f9_, 0, 0, 2089 ui::VKEY_VOLUME_DOWN, keycode_volume_down_, 0, 0 }, 2090 { ui::VKEY_F9, keycode_f9_, ControlMask, ui::EF_CONTROL_DOWN, 2091 ui::VKEY_VOLUME_DOWN, keycode_volume_down_, 2092 ControlMask, ui::EF_CONTROL_DOWN }, 2093 { ui::VKEY_F9, keycode_f9_, Mod1Mask, ui::EF_ALT_DOWN, 2094 ui::VKEY_VOLUME_DOWN, keycode_volume_down_, 2095 Mod1Mask, ui::EF_ALT_DOWN }, 2096 // F10 -> Volume Up 2097 { ui::VKEY_F10, keycode_f10_, 0, 0, 2098 ui::VKEY_VOLUME_UP, keycode_volume_up_, 0, 0 }, 2099 { ui::VKEY_F10, keycode_f10_, ControlMask, ui::EF_CONTROL_DOWN, 2100 ui::VKEY_VOLUME_UP, keycode_volume_up_, 2101 ControlMask, ui::EF_CONTROL_DOWN }, 2102 { ui::VKEY_F10, keycode_f10_, Mod1Mask, ui::EF_ALT_DOWN, 2103 ui::VKEY_VOLUME_UP, keycode_volume_up_, 2104 Mod1Mask, ui::EF_ALT_DOWN }, 2105 // F11 -> F11 2106 { ui::VKEY_F11, keycode_f11_, 0, 0, 2107 ui::VKEY_F11, keycode_f11_, 0, 0 }, 2108 { ui::VKEY_F11, keycode_f11_, ControlMask, ui::EF_CONTROL_DOWN, 2109 ui::VKEY_F11, keycode_f11_, ControlMask, ui::EF_CONTROL_DOWN }, 2110 { ui::VKEY_F11, keycode_f11_, Mod1Mask, ui::EF_ALT_DOWN, 2111 ui::VKEY_F11, keycode_f11_, Mod1Mask, ui::EF_ALT_DOWN }, 2112 // F12 -> F12 2113 { ui::VKEY_F12, keycode_f12_, 0, 0, 2114 ui::VKEY_F12, keycode_f12_, 0, 0 }, 2115 { ui::VKEY_F12, keycode_f12_, ControlMask, ui::EF_CONTROL_DOWN, 2116 ui::VKEY_F12, keycode_f12_, ControlMask, ui::EF_CONTROL_DOWN }, 2117 { ui::VKEY_F12, keycode_f12_, Mod1Mask, ui::EF_ALT_DOWN, 2118 ui::VKEY_F12, keycode_f12_, Mod1Mask, ui::EF_ALT_DOWN }, 2119 2120 // The number row should not be rewritten without Search key. 2121 { ui::VKEY_1, keycode_1_, 0, 0, 2122 ui::VKEY_1, keycode_1_, 0, 0 }, 2123 { ui::VKEY_2, keycode_2_, 0, 0, 2124 ui::VKEY_2, keycode_2_, 0, 0 }, 2125 { ui::VKEY_3, keycode_3_, 0, 0, 2126 ui::VKEY_3, keycode_3_, 0, 0 }, 2127 { ui::VKEY_4, keycode_4_, 0, 0, 2128 ui::VKEY_4, keycode_4_, 0, 0 }, 2129 { ui::VKEY_5, keycode_5_, 0, 0, 2130 ui::VKEY_5, keycode_5_, 0, 0 }, 2131 { ui::VKEY_6, keycode_6_, 0, 0, 2132 ui::VKEY_6, keycode_6_, 0, 0 }, 2133 { ui::VKEY_7, keycode_7_, 0, 0, 2134 ui::VKEY_7, keycode_7_, 0, 0 }, 2135 { ui::VKEY_8, keycode_8_, 0, 0, 2136 ui::VKEY_8, keycode_8_, 0, 0 }, 2137 { ui::VKEY_9, keycode_9_, 0, 0, 2138 ui::VKEY_9, keycode_9_, 0, 0 }, 2139 { ui::VKEY_0, keycode_0_, 0, 0, 2140 ui::VKEY_0, keycode_0_, 0, 0 }, 2141 { ui::VKEY_OEM_MINUS, keycode_minus_, 0, 0, 2142 ui::VKEY_OEM_MINUS, keycode_minus_, 0, 0 }, 2143 { ui::VKEY_OEM_PLUS, keycode_equal_, 0, 0, 2144 ui::VKEY_OEM_PLUS, keycode_equal_, 0, 0 }, 2145 2146 // The number row should be rewritten as the F<number> row with Search key. 2147 { ui::VKEY_1, keycode_1_, Mod4Mask, 0, 2148 ui::VKEY_F1, keycode_f1_, 0, 0 }, 2149 { ui::VKEY_2, keycode_2_, Mod4Mask, 0, 2150 ui::VKEY_F2, keycode_f2_, 0, 0 }, 2151 { ui::VKEY_3, keycode_3_, Mod4Mask, 0, 2152 ui::VKEY_F3, keycode_f3_, 0, 0 }, 2153 { ui::VKEY_4, keycode_4_, Mod4Mask, 0, 2154 ui::VKEY_F4, keycode_f4_, 0, 0 }, 2155 { ui::VKEY_5, keycode_5_, Mod4Mask, 0, 2156 ui::VKEY_F5, keycode_f5_, 0, 0 }, 2157 { ui::VKEY_6, keycode_6_, Mod4Mask, 0, 2158 ui::VKEY_F6, keycode_f6_, 0, 0 }, 2159 { ui::VKEY_7, keycode_7_, Mod4Mask, 0, 2160 ui::VKEY_F7, keycode_f7_, 0, 0 }, 2161 { ui::VKEY_8, keycode_8_, Mod4Mask, 0, 2162 ui::VKEY_F8, keycode_f8_, 0, 0 }, 2163 { ui::VKEY_9, keycode_9_, Mod4Mask, 0, 2164 ui::VKEY_F9, keycode_f9_, 0, 0 }, 2165 { ui::VKEY_0, keycode_0_, Mod4Mask, 0, 2166 ui::VKEY_F10, keycode_f10_, 0, 0 }, 2167 { ui::VKEY_OEM_MINUS, keycode_minus_, Mod4Mask, 0, 2168 ui::VKEY_F11, keycode_f11_, 0, 0 }, 2169 { ui::VKEY_OEM_PLUS, keycode_equal_, Mod4Mask, 0, 2170 ui::VKEY_F12, keycode_f12_, 0, 0 }, 2171 2172 // The function keys should not be rewritten with Search key pressed. 2173 { ui::VKEY_F1, keycode_f1_, Mod4Mask, 0, 2174 ui::VKEY_F1, keycode_f1_, 0, 0 }, 2175 { ui::VKEY_F2, keycode_f2_, Mod4Mask, 0, 2176 ui::VKEY_F2, keycode_f2_, 0, 0 }, 2177 { ui::VKEY_F3, keycode_f3_, Mod4Mask, 0, 2178 ui::VKEY_F3, keycode_f3_, 0, 0 }, 2179 { ui::VKEY_F4, keycode_f4_, Mod4Mask, 0, 2180 ui::VKEY_F4, keycode_f4_, 0, 0 }, 2181 { ui::VKEY_F5, keycode_f5_, Mod4Mask, 0, 2182 ui::VKEY_F5, keycode_f5_, 0, 0 }, 2183 { ui::VKEY_F6, keycode_f6_, Mod4Mask, 0, 2184 ui::VKEY_F6, keycode_f6_, 0, 0 }, 2185 { ui::VKEY_F7, keycode_f7_, Mod4Mask, 0, 2186 ui::VKEY_F7, keycode_f7_, 0, 0 }, 2187 { ui::VKEY_F8, keycode_f8_, Mod4Mask, 0, 2188 ui::VKEY_F8, keycode_f8_, 0, 0 }, 2189 { ui::VKEY_F9, keycode_f9_, Mod4Mask, 0, 2190 ui::VKEY_F9, keycode_f9_, 0, 0 }, 2191 { ui::VKEY_F10, keycode_f10_, Mod4Mask, 0, 2192 ui::VKEY_F10, keycode_f10_, 0, 0 }, 2193 { ui::VKEY_F11, keycode_f11_, Mod4Mask, 0, 2194 ui::VKEY_F11, keycode_f11_, 0, 0 }, 2195 { ui::VKEY_F12, keycode_f12_, Mod4Mask, 0, 2196 ui::VKEY_F12, keycode_f12_, 0, 0 }, 2197 }; 2198 2199 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 2200 EXPECT_EQ(GetExpectedResultAsString(tests[i].output, 2201 tests[i].output_mods, 2202 ui::ET_KEY_PRESSED, 2203 tests[i].output_native, 2204 tests[i].output_native_mods, 2205 KeyPress), 2206 GetRewrittenEventAsString(&rewriter, 2207 tests[i].input, 2208 tests[i].input_mods, 2209 ui::ET_KEY_PRESSED, 2210 tests[i].input_native, 2211 tests[i].input_native_mods)); 2212 } 2213 } 2214 2215 TEST_F(EventRewriterTest, TestRewriteExtendedKeysWithSearchRemapped) { 2216 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); 2217 2218 // Remap Search to Control. 2219 TestingPrefServiceSyncable prefs; 2220 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 2221 IntegerPrefMember search; 2222 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); 2223 search.SetValue(chromeos::input_method::kControlKey); 2224 2225 EventRewriter rewriter; 2226 rewriter.set_pref_service_for_testing(&prefs); 2227 2228 CommandLine::ForCurrentProcess()->AppendSwitchASCII( 2229 chromeos::switches::kHasChromeOSKeyboard, ""); 2230 2231 // Alt+Search+Down -> End 2232 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_END, 2233 0, 2234 ui::ET_KEY_PRESSED, 2235 keycode_end_, 2236 0U, 2237 KeyPress), 2238 GetRewrittenEventAsString(&rewriter, 2239 ui::VKEY_DOWN, 2240 ui::EF_ALT_DOWN, 2241 ui::ET_KEY_PRESSED, 2242 keycode_down_, 2243 Mod1Mask | Mod4Mask)); 2244 2245 // Shift+Alt+Search+Down -> Shift+End 2246 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_END, 2247 ui::EF_SHIFT_DOWN, 2248 ui::ET_KEY_PRESSED, 2249 keycode_end_, 2250 ShiftMask, 2251 KeyPress), 2252 GetRewrittenEventAsString(&rewriter, 2253 ui::VKEY_DOWN, 2254 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, 2255 ui::ET_KEY_PRESSED, 2256 keycode_down_, 2257 ShiftMask | Mod1Mask | Mod4Mask)); 2258 2259 *CommandLine::ForCurrentProcess() = original_cl; 2260 } 2261 2262 TEST_F(EventRewriterTest, TestRewriteKeyEventSentByXSendEvent) { 2263 // Remap Control to Alt. 2264 TestingPrefServiceSyncable prefs; 2265 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 2266 IntegerPrefMember control; 2267 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); 2268 control.SetValue(chromeos::input_method::kAltKey); 2269 2270 EventRewriter rewriter; 2271 rewriter.set_pref_service_for_testing(&prefs); 2272 2273 // Send left control press. 2274 std::string rewritten_event; 2275 { 2276 XEvent xev; 2277 InitXKeyEvent(ui::VKEY_CONTROL, 0, ui::ET_KEY_PRESSED, 2278 keycode_control_l_, 0U, &xev); 2279 xev.xkey.send_event = True; // XSendEvent() always does this. 2280 ui::KeyEvent keyevent(&xev, false /* is_char */); 2281 rewriter.RewriteForTesting(&keyevent); 2282 rewritten_event = base::StringPrintf( 2283 "ui_keycode=%d ui_flags=%d ui_type=%d " 2284 "x_keycode=%u x_state=%u x_type=%d", 2285 keyevent.key_code(), keyevent.flags(), keyevent.type(), 2286 xev.xkey.keycode, xev.xkey.state, xev.xkey.type); 2287 } 2288 2289 // XK_Control_L (left Control key) should NOT be remapped to Alt if send_event 2290 // flag in the event is True. 2291 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL, 2292 ui::EF_CONTROL_DOWN, 2293 ui::ET_KEY_PRESSED, 2294 keycode_control_l_, 2295 0U, 2296 KeyPress), 2297 rewritten_event); 2298 } 2299 #endif // OS_CHROMEOS 2300