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