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

Side by Side Diff: trunk/src/chrome/browser/chromeos/events/event_rewriter_unittest.cc

Issue 341923006: Revert 278342 "Convert sticky keys to a chromeos::EventRewriter ..." (Closed) Base URL: svn://svn.chromium.org/chrome/
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « trunk/src/chrome/browser/chromeos/events/event_rewriter.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/chromeos/events/event_rewriter.h" 5 #include "chrome/browser/chromeos/events/event_rewriter.h"
6 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
7 #include <vector> 14 #include <vector>
8 15
9 #include "ash/shell.h"
10 #include "ash/sticky_keys/sticky_keys_controller.h"
11 #include "ash/sticky_keys/sticky_keys_overlay.h"
12 #include "ash/test/ash_test_base.h" 16 #include "ash/test/ash_test_base.h"
13 #include "ash/wm/window_state.h" 17 #include "ash/wm/window_state.h"
14 #include "base/basictypes.h" 18 #include "base/basictypes.h"
15 #include "base/command_line.h" 19 #include "base/command_line.h"
16 #include "base/prefs/pref_member.h" 20 #include "base/prefs/pref_member.h"
17 #include "base/strings/stringprintf.h" 21 #include "base/strings/stringprintf.h"
18 #include "chrome/browser/chromeos/input_method/input_method_configuration.h" 22 #include "chrome/browser/chromeos/input_method/input_method_configuration.h"
19 #include "chrome/browser/chromeos/input_method/mock_input_method_manager.h" 23 #include "chrome/browser/chromeos/input_method/mock_input_method_manager.h"
20 #include "chrome/browser/chromeos/login/users/mock_user_manager.h" 24 #include "chrome/browser/chromeos/login/users/mock_user_manager.h"
21 #include "chrome/browser/chromeos/login/users/user_manager.h" 25 #include "chrome/browser/chromeos/login/users/user_manager.h"
22 #include "chrome/browser/chromeos/preferences.h" 26 #include "chrome/browser/chromeos/preferences.h"
23 #include "chrome/common/pref_names.h" 27 #include "chrome/common/pref_names.h"
24 #include "chrome/test/base/testing_pref_service_syncable.h" 28 #include "chrome/test/base/testing_pref_service_syncable.h"
25 #include "chromeos/chromeos_switches.h" 29 #include "chromeos/chromeos_switches.h"
26 #include "chromeos/ime/fake_ime_keyboard.h" 30 #include "chromeos/ime/fake_ime_keyboard.h"
27 #include "testing/gtest/include/gtest/gtest.h" 31 #include "testing/gtest/include/gtest/gtest.h"
28 #include "ui/aura/window.h" 32 #include "ui/aura/window.h"
29 #include "ui/aura/window_tree_host.h"
30 #include "ui/events/event.h" 33 #include "ui/events/event.h"
31 #include "ui/events/event_rewriter.h" 34 #include "ui/events/event_rewriter.h"
32 #include "ui/events/test/test_event_processor.h"
33
34 #if defined(USE_X11)
35 #include <X11/keysym.h>
36
37 #include "ui/events/test/events_test_utils_x11.h" 35 #include "ui/events/test/events_test_utils_x11.h"
38 #include "ui/events/x/touch_factory_x11.h" 36 #include "ui/events/x/touch_factory_x11.h"
39 #include "ui/gfx/x/x11_types.h" 37 #include "ui/gfx/x/x11_types.h"
40 #endif
41 38
42 namespace { 39 namespace {
43 40
44 // The device id of the test touchpad device.
45 const unsigned int kTouchPadDeviceId = 1;
46
47 std::string GetExpectedResultAsString(ui::KeyboardCode ui_keycode, 41 std::string GetExpectedResultAsString(ui::KeyboardCode ui_keycode,
48 int ui_flags, 42 int ui_flags,
49 ui::EventType ui_type) { 43 ui::EventType ui_type) {
50 return base::StringPrintf("ui_keycode=0x%X ui_flags=0x%X ui_type=%d", 44 return base::StringPrintf("ui_keycode=0x%X ui_flags=0x%X ui_type=%d",
51 ui_keycode, 45 ui_keycode,
52 ui_flags & ~ui::EF_IS_REPEAT, 46 ui_flags & ~ui::EF_IS_REPEAT,
53 ui_type); 47 ui_type);
54 } 48 }
55 49
56 std::string GetKeyEventAsString(const ui::KeyEvent& keyevent) { 50 std::string GetKeyEventAsString(const ui::KeyEvent& keyevent) {
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 #endif 185 #endif
192 } 186 }
193 187
194 } // namespace 188 } // namespace
195 189
196 namespace chromeos { 190 namespace chromeos {
197 191
198 class EventRewriterTest : public ash::test::AshTestBase { 192 class EventRewriterTest : public ash::test::AshTestBase {
199 public: 193 public:
200 EventRewriterTest() 194 EventRewriterTest()
201 : mock_user_manager_(new chromeos::MockUserManager), 195 : display_(gfx::GetXDisplay()),
196 mock_user_manager_(new chromeos::MockUserManager),
202 user_manager_enabler_(mock_user_manager_), 197 user_manager_enabler_(mock_user_manager_),
203 input_method_manager_mock_(NULL) {} 198 input_method_manager_mock_(NULL) {}
204 virtual ~EventRewriterTest() {} 199 virtual ~EventRewriterTest() {}
205 200
206 virtual void SetUp() { 201 virtual void SetUp() {
207 // Mocking user manager because the real one needs to be called on UI thread 202 // Mocking user manager because the real one needs to be called on UI thread
208 EXPECT_CALL(*mock_user_manager_, IsLoggedInAsGuest()) 203 EXPECT_CALL(*mock_user_manager_, IsLoggedInAsGuest())
209 .WillRepeatedly(testing::Return(false)); 204 .WillRepeatedly(testing::Return(false));
210 input_method_manager_mock_ = 205 input_method_manager_mock_ =
211 new chromeos::input_method::MockInputMethodManager; 206 new chromeos::input_method::MockInputMethodManager;
(...skipping 13 matching lines...) Expand all
225 void TestRewriteNumPadKeys(); 220 void TestRewriteNumPadKeys();
226 void TestRewriteNumPadKeysOnAppleKeyboard(); 221 void TestRewriteNumPadKeysOnAppleKeyboard();
227 222
228 int RewriteMouseEvent(chromeos::EventRewriter* rewriter, 223 int RewriteMouseEvent(chromeos::EventRewriter* rewriter,
229 const ui::MouseEvent& event) { 224 const ui::MouseEvent& event) {
230 int flags = event.flags(); 225 int flags = event.flags();
231 rewriter->RewriteLocatedEventForTesting(event, &flags); 226 rewriter->RewriteLocatedEventForTesting(event, &flags);
232 return flags; 227 return flags;
233 } 228 }
234 229
230 Display* display_;
235 chromeos::MockUserManager* mock_user_manager_; // Not owned. 231 chromeos::MockUserManager* mock_user_manager_; // Not owned.
236 chromeos::ScopedUserManagerEnabler user_manager_enabler_; 232 chromeos::ScopedUserManagerEnabler user_manager_enabler_;
237 chromeos::input_method::MockInputMethodManager* input_method_manager_mock_; 233 chromeos::input_method::MockInputMethodManager* input_method_manager_mock_;
238 }; 234 };
239 235
240 TEST_F(EventRewriterTest, TestRewriteCommandToControl) { 236 TEST_F(EventRewriterTest, TestRewriteCommandToControl) {
241 // First, test with a PC keyboard. 237 // First, test with a PC keyboard.
242 TestingPrefServiceSyncable prefs; 238 TestingPrefServiceSyncable prefs;
243 EventRewriter rewriter(NULL); 239 EventRewriter rewriter;
244 rewriter.DeviceAddedForTesting(0, "PC Keyboard"); 240 rewriter.DeviceAddedForTesting(0, "PC Keyboard");
245 rewriter.set_last_device_id_for_testing(0); 241 rewriter.set_last_device_id_for_testing(0);
246 rewriter.set_pref_service_for_testing(&prefs); 242 rewriter.set_pref_service_for_testing(&prefs);
247 243
248 KeyTestCase pc_keyboard_tests[] = { 244 KeyTestCase pc_keyboard_tests[] = {
249 // VKEY_A, Alt modifier. 245 // VKEY_A, Alt modifier.
250 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 246 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
251 {ui::VKEY_A, ui::EF_ALT_DOWN}, 247 {ui::VKEY_A, ui::EF_ALT_DOWN},
252 {ui::VKEY_A, ui::EF_ALT_DOWN}}, 248 {ui::VKEY_A, ui::EF_ALT_DOWN}},
253 249
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
314 310
315 // For crbug.com/133896. 311 // For crbug.com/133896.
316 TEST_F(EventRewriterTest, TestRewriteCommandToControlWithControlRemapped) { 312 TEST_F(EventRewriterTest, TestRewriteCommandToControlWithControlRemapped) {
317 // Remap Control to Alt. 313 // Remap Control to Alt.
318 TestingPrefServiceSyncable prefs; 314 TestingPrefServiceSyncable prefs;
319 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 315 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
320 IntegerPrefMember control; 316 IntegerPrefMember control;
321 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); 317 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs);
322 control.SetValue(chromeos::input_method::kAltKey); 318 control.SetValue(chromeos::input_method::kAltKey);
323 319
324 EventRewriter rewriter(NULL); 320 EventRewriter rewriter;
325 rewriter.set_pref_service_for_testing(&prefs); 321 rewriter.set_pref_service_for_testing(&prefs);
326 rewriter.DeviceAddedForTesting(0, "PC Keyboard"); 322 rewriter.DeviceAddedForTesting(0, "PC Keyboard");
327 rewriter.set_last_device_id_for_testing(0); 323 rewriter.set_last_device_id_for_testing(0);
328 324
329 KeyTestCase pc_keyboard_tests[] = {// Control should be remapped to Alt. 325 KeyTestCase pc_keyboard_tests[] = {// Control should be remapped to Alt.
330 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 326 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
331 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN}, 327 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN},
332 {ui::VKEY_MENU, ui::EF_ALT_DOWN}}, 328 {ui::VKEY_MENU, ui::EF_ALT_DOWN}},
333 }; 329 };
334 330
(...skipping 19 matching lines...) Expand all
354 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN}}, 350 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN}},
355 }; 351 };
356 352
357 for (size_t i = 0; i < arraysize(apple_keyboard_tests); ++i) { 353 for (size_t i = 0; i < arraysize(apple_keyboard_tests); ++i) {
358 CheckKeyTestCase(2000 + i, &rewriter, apple_keyboard_tests[i]); 354 CheckKeyTestCase(2000 + i, &rewriter, apple_keyboard_tests[i]);
359 } 355 }
360 } 356 }
361 357
362 void EventRewriterTest::TestRewriteNumPadKeys() { 358 void EventRewriterTest::TestRewriteNumPadKeys() {
363 TestingPrefServiceSyncable prefs; 359 TestingPrefServiceSyncable prefs;
364 EventRewriter rewriter(NULL); 360 EventRewriter rewriter;
365 rewriter.set_pref_service_for_testing(&prefs); 361 rewriter.set_pref_service_for_testing(&prefs);
366 362
367 KeyTestCase tests[] = { 363 KeyTestCase tests[] = {
368 // XK_KP_Insert (= NumPad 0 without Num Lock), no modifier. 364 // XK_KP_Insert (= NumPad 0 without Num Lock), no modifier.
369 {KeyTestCase::TEST_ALL|KeyTestCase::NUMPAD, ui::ET_KEY_PRESSED, 365 {KeyTestCase::TEST_ALL|KeyTestCase::NUMPAD, ui::ET_KEY_PRESSED,
370 {ui::VKEY_INSERT, ui::EF_NUMPAD_KEY}, 366 {ui::VKEY_INSERT, ui::EF_NUMPAD_KEY},
371 {ui::VKEY_NUMPAD0, ui::EF_NUMPAD_KEY}}, 367 {ui::VKEY_NUMPAD0, ui::EF_NUMPAD_KEY}},
372 368
373 // XK_KP_Insert (= NumPad 0 without Num Lock), Alt modifier. 369 // XK_KP_Insert (= NumPad 0 without Num Lock), Alt modifier.
374 {KeyTestCase::TEST_ALL|KeyTestCase::NUMPAD, ui::ET_KEY_PRESSED, 370 {KeyTestCase::TEST_ALL|KeyTestCase::NUMPAD, ui::ET_KEY_PRESSED,
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
496 CommandLine::ForCurrentProcess()->AppendSwitchASCII( 492 CommandLine::ForCurrentProcess()->AppendSwitchASCII(
497 chromeos::switches::kHasChromeOSDiamondKey, ""); 493 chromeos::switches::kHasChromeOSDiamondKey, "");
498 494
499 TestRewriteNumPadKeys(); 495 TestRewriteNumPadKeys();
500 *CommandLine::ForCurrentProcess() = original_cl; 496 *CommandLine::ForCurrentProcess() = original_cl;
501 } 497 }
502 498
503 // Tests if the rewriter can handle a Command + Num Pad event. 499 // Tests if the rewriter can handle a Command + Num Pad event.
504 void EventRewriterTest::TestRewriteNumPadKeysOnAppleKeyboard() { 500 void EventRewriterTest::TestRewriteNumPadKeysOnAppleKeyboard() {
505 TestingPrefServiceSyncable prefs; 501 TestingPrefServiceSyncable prefs;
506 EventRewriter rewriter(NULL); 502 EventRewriter rewriter;
507 rewriter.DeviceAddedForTesting(0, "Apple Keyboard"); 503 rewriter.DeviceAddedForTesting(0, "Apple Keyboard");
508 rewriter.set_last_device_id_for_testing(0); 504 rewriter.set_last_device_id_for_testing(0);
509 rewriter.set_pref_service_for_testing(&prefs); 505 rewriter.set_pref_service_for_testing(&prefs);
510 506
511 KeyTestCase tests[] = { 507 KeyTestCase tests[] = {
512 // XK_KP_End (= NumPad 1 without Num Lock), Win modifier. 508 // XK_KP_End (= NumPad 1 without Num Lock), Win modifier.
513 // The result should be "Num Pad 1 with Control + Num Lock modifiers". 509 // The result should be "Num Pad 1 with Control + Num Lock modifiers".
514 {KeyTestCase::TEST_ALL|KeyTestCase::NUMPAD, ui::ET_KEY_PRESSED, 510 {KeyTestCase::TEST_ALL|KeyTestCase::NUMPAD, ui::ET_KEY_PRESSED,
515 {ui::VKEY_END, ui::EF_COMMAND_DOWN | ui::EF_NUMPAD_KEY}, 511 {ui::VKEY_END, ui::EF_COMMAND_DOWN | ui::EF_NUMPAD_KEY},
516 {ui::VKEY_NUMPAD1, ui::EF_CONTROL_DOWN | ui::EF_NUMPAD_KEY}}, 512 {ui::VKEY_NUMPAD1, ui::EF_CONTROL_DOWN | ui::EF_NUMPAD_KEY}},
(...skipping 21 matching lines...) Expand all
538 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); 534 const CommandLine original_cl(*CommandLine::ForCurrentProcess());
539 CommandLine::ForCurrentProcess()->AppendSwitchASCII( 535 CommandLine::ForCurrentProcess()->AppendSwitchASCII(
540 chromeos::switches::kHasChromeOSDiamondKey, ""); 536 chromeos::switches::kHasChromeOSDiamondKey, "");
541 537
542 TestRewriteNumPadKeysOnAppleKeyboard(); 538 TestRewriteNumPadKeysOnAppleKeyboard();
543 *CommandLine::ForCurrentProcess() = original_cl; 539 *CommandLine::ForCurrentProcess() = original_cl;
544 } 540 }
545 541
546 TEST_F(EventRewriterTest, TestRewriteModifiersNoRemap) { 542 TEST_F(EventRewriterTest, TestRewriteModifiersNoRemap) {
547 TestingPrefServiceSyncable prefs; 543 TestingPrefServiceSyncable prefs;
548 EventRewriter rewriter(NULL); 544 EventRewriter rewriter;
549 rewriter.set_pref_service_for_testing(&prefs); 545 rewriter.set_pref_service_for_testing(&prefs);
550 546
551 KeyTestCase tests[] = { 547 KeyTestCase tests[] = {
552 // Press Search. Confirm the event is not rewritten. 548 // Press Search. Confirm the event is not rewritten.
553 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 549 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
554 {ui::VKEY_LWIN, ui::EF_NONE}, 550 {ui::VKEY_LWIN, ui::EF_NONE},
555 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN}}, 551 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN}},
556 552
557 // Press left Control. Confirm the event is not rewritten. 553 // Press left Control. Confirm the event is not rewritten.
558 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 554 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
(...skipping 22 matching lines...) Expand all
581 {ui::VKEY_LWIN, ui::EF_NONE}}, 577 {ui::VKEY_LWIN, ui::EF_NONE}},
582 }; 578 };
583 579
584 for (size_t i = 0; i < arraysize(tests); ++i) { 580 for (size_t i = 0; i < arraysize(tests); ++i) {
585 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); 581 CheckKeyTestCase(1000 + i, &rewriter, tests[i]);
586 } 582 }
587 } 583 }
588 584
589 TEST_F(EventRewriterTest, TestRewriteModifiersNoRemapMultipleKeys) { 585 TEST_F(EventRewriterTest, TestRewriteModifiersNoRemapMultipleKeys) {
590 TestingPrefServiceSyncable prefs; 586 TestingPrefServiceSyncable prefs;
591 EventRewriter rewriter(NULL); 587 EventRewriter rewriter;
592 rewriter.set_pref_service_for_testing(&prefs); 588 rewriter.set_pref_service_for_testing(&prefs);
593 589
594 KeyTestCase tests[] = { 590 KeyTestCase tests[] = {
595 // Press Alt with Shift. Confirm the event is not rewritten. 591 // Press Alt with Shift. Confirm the event is not rewritten.
596 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 592 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
597 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}, 593 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN},
598 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}}, 594 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}},
599 595
600 // Press Search with Caps Lock mask. Confirm the event is not rewritten. 596 // Press Search with Caps Lock mask. Confirm the event is not rewritten.
601 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 597 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
(...skipping 22 matching lines...) Expand all
624 // Disable Search and Control keys. 620 // Disable Search and Control keys.
625 TestingPrefServiceSyncable prefs; 621 TestingPrefServiceSyncable prefs;
626 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 622 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
627 IntegerPrefMember search; 623 IntegerPrefMember search;
628 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); 624 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs);
629 search.SetValue(chromeos::input_method::kVoidKey); 625 search.SetValue(chromeos::input_method::kVoidKey);
630 IntegerPrefMember control; 626 IntegerPrefMember control;
631 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); 627 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs);
632 control.SetValue(chromeos::input_method::kVoidKey); 628 control.SetValue(chromeos::input_method::kVoidKey);
633 629
634 EventRewriter rewriter(NULL); 630 EventRewriter rewriter;
635 rewriter.set_pref_service_for_testing(&prefs); 631 rewriter.set_pref_service_for_testing(&prefs);
636 632
637 KeyTestCase disabled_modifier_tests[] = { 633 KeyTestCase disabled_modifier_tests[] = {
638 // Press Alt with Shift. This key press shouldn't be affected by the 634 // Press Alt with Shift. This key press shouldn't be affected by the
639 // pref. Confirm the event is not rewritten. 635 // pref. Confirm the event is not rewritten.
640 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 636 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
641 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}, 637 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN},
642 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}}, 638 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}},
643 639
644 // Press Search. Confirm the event is now VKEY_UNKNOWN. 640 // Press Search. Confirm the event is now VKEY_UNKNOWN.
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
699 } 695 }
700 696
701 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToControl) { 697 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToControl) {
702 // Remap Search to Control. 698 // Remap Search to Control.
703 TestingPrefServiceSyncable prefs; 699 TestingPrefServiceSyncable prefs;
704 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 700 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
705 IntegerPrefMember search; 701 IntegerPrefMember search;
706 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); 702 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs);
707 search.SetValue(chromeos::input_method::kControlKey); 703 search.SetValue(chromeos::input_method::kControlKey);
708 704
709 EventRewriter rewriter(NULL); 705 EventRewriter rewriter;
710 rewriter.set_pref_service_for_testing(&prefs); 706 rewriter.set_pref_service_for_testing(&prefs);
711 707
712 KeyTestCase s_tests[] = { 708 KeyTestCase s_tests[] = {
713 // Press Search. Confirm the event is now VKEY_CONTROL. 709 // Press Search. Confirm the event is now VKEY_CONTROL.
714 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 710 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
715 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN}, 711 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN},
716 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN}}, 712 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN}},
717 }; 713 };
718 714
719 for (size_t i = 0; i < arraysize(s_tests); ++i) { 715 for (size_t i = 0; i < arraysize(s_tests); ++i) {
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
763 } 759 }
764 760
765 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToEscape) { 761 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToEscape) {
766 // Remap Search to ESC. 762 // Remap Search to ESC.
767 TestingPrefServiceSyncable prefs; 763 TestingPrefServiceSyncable prefs;
768 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 764 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
769 IntegerPrefMember search; 765 IntegerPrefMember search;
770 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); 766 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs);
771 search.SetValue(chromeos::input_method::kEscapeKey); 767 search.SetValue(chromeos::input_method::kEscapeKey);
772 768
773 EventRewriter rewriter(NULL); 769 EventRewriter rewriter;
774 rewriter.set_pref_service_for_testing(&prefs); 770 rewriter.set_pref_service_for_testing(&prefs);
775 771
776 KeyTestCase tests[] = {// Press Search. Confirm the event is now VKEY_ESCAPE. 772 KeyTestCase tests[] = {// Press Search. Confirm the event is now VKEY_ESCAPE.
777 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 773 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
778 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN}, 774 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN},
779 {ui::VKEY_ESCAPE, ui::EF_NONE}}, 775 {ui::VKEY_ESCAPE, ui::EF_NONE}},
780 }; 776 };
781 777
782 for (size_t i = 0; i < arraysize(tests); ++i) { 778 for (size_t i = 0; i < arraysize(tests); ++i) {
783 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); 779 CheckKeyTestCase(1000 + i, &rewriter, tests[i]);
784 } 780 }
785 } 781 }
786 782
787 TEST_F(EventRewriterTest, TestRewriteModifiersRemapMany) { 783 TEST_F(EventRewriterTest, TestRewriteModifiersRemapMany) {
788 // Remap Search to Alt. 784 // Remap Search to Alt.
789 TestingPrefServiceSyncable prefs; 785 TestingPrefServiceSyncable prefs;
790 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 786 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
791 IntegerPrefMember search; 787 IntegerPrefMember search;
792 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); 788 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs);
793 search.SetValue(chromeos::input_method::kAltKey); 789 search.SetValue(chromeos::input_method::kAltKey);
794 790
795 EventRewriter rewriter(NULL); 791 EventRewriter rewriter;
796 rewriter.set_pref_service_for_testing(&prefs); 792 rewriter.set_pref_service_for_testing(&prefs);
797 793
798 KeyTestCase s2a_tests[] = { 794 KeyTestCase s2a_tests[] = {
799 // Press Search. Confirm the event is now VKEY_MENU. 795 // Press Search. Confirm the event is now VKEY_MENU.
800 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 796 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
801 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN}, 797 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN},
802 {ui::VKEY_MENU, ui::EF_ALT_DOWN}}, 798 {ui::VKEY_MENU, ui::EF_ALT_DOWN}},
803 }; 799 };
804 800
805 for (size_t i = 0; i < arraysize(s2a_tests); ++i) { 801 for (size_t i = 0; i < arraysize(s2a_tests); ++i) {
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
862 858
863 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToCapsLock) { 859 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToCapsLock) {
864 // Remap Search to Caps Lock. 860 // Remap Search to Caps Lock.
865 TestingPrefServiceSyncable prefs; 861 TestingPrefServiceSyncable prefs;
866 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 862 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
867 IntegerPrefMember search; 863 IntegerPrefMember search;
868 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); 864 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs);
869 search.SetValue(chromeos::input_method::kCapsLockKey); 865 search.SetValue(chromeos::input_method::kCapsLockKey);
870 866
871 chromeos::input_method::FakeImeKeyboard ime_keyboard; 867 chromeos::input_method::FakeImeKeyboard ime_keyboard;
872 EventRewriter rewriter(NULL); 868 EventRewriter rewriter;
873 rewriter.set_pref_service_for_testing(&prefs); 869 rewriter.set_pref_service_for_testing(&prefs);
874 rewriter.set_ime_keyboard_for_testing(&ime_keyboard); 870 rewriter.set_ime_keyboard_for_testing(&ime_keyboard);
875 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); 871 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_);
876 872
877 // Press Search. 873 // Press Search.
878 EXPECT_EQ( 874 EXPECT_EQ(
879 GetExpectedResultAsString(ui::VKEY_CAPITAL, 875 GetExpectedResultAsString(ui::VKEY_CAPITAL,
880 ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN, 876 ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN,
881 ui::ET_KEY_PRESSED), 877 ui::ET_KEY_PRESSED),
882 GetRewrittenEventAsString( 878 GetRewrittenEventAsString(
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
932 GetRewrittenEventAsString( 928 GetRewrittenEventAsString(
933 &rewriter, ui::VKEY_CAPITAL, ui::EF_NONE, ui::ET_KEY_RELEASED)); 929 &rewriter, ui::VKEY_CAPITAL, ui::EF_NONE, ui::ET_KEY_RELEASED));
934 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); 930 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_);
935 } 931 }
936 932
937 TEST_F(EventRewriterTest, TestRewriteCapsLock) { 933 TEST_F(EventRewriterTest, TestRewriteCapsLock) {
938 TestingPrefServiceSyncable prefs; 934 TestingPrefServiceSyncable prefs;
939 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 935 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
940 936
941 chromeos::input_method::FakeImeKeyboard ime_keyboard; 937 chromeos::input_method::FakeImeKeyboard ime_keyboard;
942 EventRewriter rewriter(NULL); 938 EventRewriter rewriter;
943 rewriter.set_pref_service_for_testing(&prefs); 939 rewriter.set_pref_service_for_testing(&prefs);
944 rewriter.set_ime_keyboard_for_testing(&ime_keyboard); 940 rewriter.set_ime_keyboard_for_testing(&ime_keyboard);
945 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); 941 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_);
946 942
947 // On Chrome OS, CapsLock is mapped to F16 with Mod3Mask. 943 // On Chrome OS, CapsLock is mapped to F16 with Mod3Mask.
948 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, 944 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL,
949 ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN, 945 ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN,
950 ui::ET_KEY_PRESSED), 946 ui::ET_KEY_PRESSED),
951 GetRewrittenEventAsString( 947 GetRewrittenEventAsString(
952 &rewriter, ui::VKEY_F16, ui::EF_MOD3_DOWN, ui::ET_KEY_PRESSED)); 948 &rewriter, ui::VKEY_F16, ui::EF_MOD3_DOWN, ui::ET_KEY_PRESSED));
953 EXPECT_TRUE(ime_keyboard.caps_lock_is_enabled_); 949 EXPECT_TRUE(ime_keyboard.caps_lock_is_enabled_);
954 } 950 }
955 951
956 TEST_F(EventRewriterTest, TestRewriteDiamondKey) { 952 TEST_F(EventRewriterTest, TestRewriteDiamondKey) {
957 TestingPrefServiceSyncable prefs; 953 TestingPrefServiceSyncable prefs;
958 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 954 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
959 955
960 chromeos::input_method::FakeImeKeyboard ime_keyboard; 956 chromeos::input_method::FakeImeKeyboard ime_keyboard;
961 EventRewriter rewriter(NULL); 957 EventRewriter rewriter;
962 rewriter.set_pref_service_for_testing(&prefs); 958 rewriter.set_pref_service_for_testing(&prefs);
963 rewriter.set_ime_keyboard_for_testing(&ime_keyboard); 959 rewriter.set_ime_keyboard_for_testing(&ime_keyboard);
964 960
965 KeyTestCase tests[] = { 961 KeyTestCase tests[] = {
966 // F15 should work as Ctrl when --has-chromeos-diamond-key is not 962 // F15 should work as Ctrl when --has-chromeos-diamond-key is not
967 // specified. 963 // specified.
968 {KeyTestCase::TEST_VKEY, 964 {KeyTestCase::TEST_VKEY,
969 ui::ET_KEY_PRESSED, 965 ui::ET_KEY_PRESSED,
970 {ui::VKEY_F15, ui::EF_NONE}, 966 {ui::VKEY_F15, ui::EF_NONE},
971 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN}}, 967 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN}},
(...skipping 12 matching lines...) Expand all
984 } 980 }
985 TEST_F(EventRewriterTest, TestRewriteDiamondKeyWithFlag) { 981 TEST_F(EventRewriterTest, TestRewriteDiamondKeyWithFlag) {
986 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); 982 const CommandLine original_cl(*CommandLine::ForCurrentProcess());
987 CommandLine::ForCurrentProcess()->AppendSwitchASCII( 983 CommandLine::ForCurrentProcess()->AppendSwitchASCII(
988 chromeos::switches::kHasChromeOSDiamondKey, ""); 984 chromeos::switches::kHasChromeOSDiamondKey, "");
989 985
990 TestingPrefServiceSyncable prefs; 986 TestingPrefServiceSyncable prefs;
991 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 987 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
992 988
993 chromeos::input_method::FakeImeKeyboard ime_keyboard; 989 chromeos::input_method::FakeImeKeyboard ime_keyboard;
994 EventRewriter rewriter(NULL); 990 EventRewriter rewriter;
995 rewriter.set_pref_service_for_testing(&prefs); 991 rewriter.set_pref_service_for_testing(&prefs);
996 rewriter.set_ime_keyboard_for_testing(&ime_keyboard); 992 rewriter.set_ime_keyboard_for_testing(&ime_keyboard);
997 993
998 // By default, F15 should work as Control. 994 // By default, F15 should work as Control.
999 EXPECT_EQ(GetExpectedResultAsString( 995 EXPECT_EQ(GetExpectedResultAsString(
1000 ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN, ui::ET_KEY_PRESSED), 996 ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN, ui::ET_KEY_PRESSED),
1001 GetRewrittenEventAsString( 997 GetRewrittenEventAsString(
1002 &rewriter, ui::VKEY_F15, ui::EF_NONE, ui::ET_KEY_PRESSED)); 998 &rewriter, ui::VKEY_F15, ui::EF_NONE, ui::ET_KEY_PRESSED));
1003 999
1004 IntegerPrefMember diamond; 1000 IntegerPrefMember diamond;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1036 } 1032 }
1037 1033
1038 TEST_F(EventRewriterTest, TestRewriteCapsLockToControl) { 1034 TEST_F(EventRewriterTest, TestRewriteCapsLockToControl) {
1039 // Remap CapsLock to Control. 1035 // Remap CapsLock to Control.
1040 TestingPrefServiceSyncable prefs; 1036 TestingPrefServiceSyncable prefs;
1041 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1037 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1042 IntegerPrefMember control; 1038 IntegerPrefMember control;
1043 control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs); 1039 control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs);
1044 control.SetValue(chromeos::input_method::kControlKey); 1040 control.SetValue(chromeos::input_method::kControlKey);
1045 1041
1046 EventRewriter rewriter(NULL); 1042 EventRewriter rewriter;
1047 rewriter.set_pref_service_for_testing(&prefs); 1043 rewriter.set_pref_service_for_testing(&prefs);
1048 1044
1049 KeyTestCase tests[] = { 1045 KeyTestCase tests[] = {
1050 // Press CapsLock+a. Confirm that Mod3Mask is rewritten to ControlMask. 1046 // Press CapsLock+a. Confirm that Mod3Mask is rewritten to ControlMask.
1051 // On Chrome OS, CapsLock works as a Mod3 modifier. 1047 // On Chrome OS, CapsLock works as a Mod3 modifier.
1052 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 1048 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
1053 {ui::VKEY_A, ui::EF_MOD3_DOWN}, 1049 {ui::VKEY_A, ui::EF_MOD3_DOWN},
1054 {ui::VKEY_A, ui::EF_CONTROL_DOWN}}, 1050 {ui::VKEY_A, ui::EF_CONTROL_DOWN}},
1055 1051
1056 // Press Control+CapsLock+a. Confirm that Mod3Mask is rewritten to 1052 // Press Control+CapsLock+a. Confirm that Mod3Mask is rewritten to
(...skipping 15 matching lines...) Expand all
1072 } 1068 }
1073 1069
1074 TEST_F(EventRewriterTest, TestRewriteCapsLockMod3InUse) { 1070 TEST_F(EventRewriterTest, TestRewriteCapsLockMod3InUse) {
1075 // Remap CapsLock to Control. 1071 // Remap CapsLock to Control.
1076 TestingPrefServiceSyncable prefs; 1072 TestingPrefServiceSyncable prefs;
1077 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1073 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1078 IntegerPrefMember control; 1074 IntegerPrefMember control;
1079 control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs); 1075 control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs);
1080 control.SetValue(chromeos::input_method::kControlKey); 1076 control.SetValue(chromeos::input_method::kControlKey);
1081 1077
1082 EventRewriter rewriter(NULL); 1078 EventRewriter rewriter;
1083 rewriter.set_pref_service_for_testing(&prefs); 1079 rewriter.set_pref_service_for_testing(&prefs);
1084 input_method_manager_mock_->set_mod3_used(true); 1080 input_method_manager_mock_->set_mod3_used(true);
1085 1081
1086 // Press CapsLock+a. Confirm that Mod3Mask is NOT rewritten to ControlMask 1082 // Press CapsLock+a. Confirm that Mod3Mask is NOT rewritten to ControlMask
1087 // when Mod3Mask is already in use by the current XKB layout. 1083 // when Mod3Mask is already in use by the current XKB layout.
1088 EXPECT_EQ( 1084 EXPECT_EQ(
1089 GetExpectedResultAsString(ui::VKEY_A, ui::EF_NONE, ui::ET_KEY_PRESSED), 1085 GetExpectedResultAsString(ui::VKEY_A, ui::EF_NONE, ui::ET_KEY_PRESSED),
1090 GetRewrittenEventAsString( 1086 GetRewrittenEventAsString(
1091 &rewriter, ui::VKEY_A, ui::EF_NONE, ui::ET_KEY_PRESSED)); 1087 &rewriter, ui::VKEY_A, ui::EF_NONE, ui::ET_KEY_PRESSED));
1092 1088
1093 input_method_manager_mock_->set_mod3_used(false); 1089 input_method_manager_mock_->set_mod3_used(false);
1094 } 1090 }
1095 1091
1096 TEST_F(EventRewriterTest, TestRewriteExtendedKeys) { 1092 TEST_F(EventRewriterTest, TestRewriteExtendedKeys) {
1097 TestingPrefServiceSyncable prefs; 1093 TestingPrefServiceSyncable prefs;
1098 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1094 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1099 EventRewriter rewriter(NULL); 1095 EventRewriter rewriter;
1100 rewriter.DeviceAddedForTesting(0, "PC Keyboard"); 1096 rewriter.DeviceAddedForTesting(0, "PC Keyboard");
1101 rewriter.set_last_device_id_for_testing(0); 1097 rewriter.set_last_device_id_for_testing(0);
1102 rewriter.set_pref_service_for_testing(&prefs); 1098 rewriter.set_pref_service_for_testing(&prefs);
1103 1099
1104 KeyTestCase tests[] = { 1100 KeyTestCase tests[] = {
1105 // Alt+Backspace -> Delete 1101 // Alt+Backspace -> Delete
1106 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 1102 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
1107 {ui::VKEY_BACK, ui::EF_ALT_DOWN}, 1103 {ui::VKEY_BACK, ui::EF_ALT_DOWN},
1108 {ui::VKEY_DELETE, ui::EF_NONE}}, 1104 {ui::VKEY_DELETE, ui::EF_NONE}},
1109 // Control+Alt+Backspace -> Control+Delete 1105 // Control+Alt+Backspace -> Control+Delete
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
1198 {ui::VKEY_INSERT, ui::EF_CONTROL_DOWN}}}; 1194 {ui::VKEY_INSERT, ui::EF_CONTROL_DOWN}}};
1199 1195
1200 for (size_t i = 0; i < arraysize(tests); ++i) { 1196 for (size_t i = 0; i < arraysize(tests); ++i) {
1201 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); 1197 CheckKeyTestCase(1000 + i, &rewriter, tests[i]);
1202 } 1198 }
1203 } 1199 }
1204 1200
1205 TEST_F(EventRewriterTest, TestRewriteFunctionKeys) { 1201 TEST_F(EventRewriterTest, TestRewriteFunctionKeys) {
1206 TestingPrefServiceSyncable prefs; 1202 TestingPrefServiceSyncable prefs;
1207 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1203 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1208 EventRewriter rewriter(NULL); 1204 EventRewriter rewriter;
1209 rewriter.set_pref_service_for_testing(&prefs); 1205 rewriter.set_pref_service_for_testing(&prefs);
1210 1206
1211 FunctionKeyTestCase tests[] = { 1207 FunctionKeyTestCase tests[] = {
1212 // F1 -> Back 1208 // F1 -> Back
1213 {ui::ET_KEY_PRESSED, 1209 {ui::ET_KEY_PRESSED,
1214 {ui::VKEY_F1, ui::EF_NONE}, 1210 {ui::VKEY_F1, ui::EF_NONE},
1215 {ui::VKEY_BROWSER_BACK, ui::EF_NONE}, 1211 {ui::VKEY_BROWSER_BACK, ui::EF_NONE},
1216 {ui::VKEY_BROWSER_BACK, ui::EF_FUNCTION_KEY}}, 1212 {ui::VKEY_BROWSER_BACK, ui::EF_FUNCTION_KEY}},
1217 {ui::ET_KEY_PRESSED, 1213 {ui::ET_KEY_PRESSED,
1218 {ui::VKEY_F1, ui::EF_CONTROL_DOWN}, 1214 {ui::VKEY_F1, ui::EF_CONTROL_DOWN},
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after
1526 TEST_F(EventRewriterTest, TestRewriteExtendedKeysWithSearchRemapped) { 1522 TEST_F(EventRewriterTest, TestRewriteExtendedKeysWithSearchRemapped) {
1527 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); 1523 const CommandLine original_cl(*CommandLine::ForCurrentProcess());
1528 1524
1529 // Remap Search to Control. 1525 // Remap Search to Control.
1530 TestingPrefServiceSyncable prefs; 1526 TestingPrefServiceSyncable prefs;
1531 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1527 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1532 IntegerPrefMember search; 1528 IntegerPrefMember search;
1533 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); 1529 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs);
1534 search.SetValue(chromeos::input_method::kControlKey); 1530 search.SetValue(chromeos::input_method::kControlKey);
1535 1531
1536 EventRewriter rewriter(NULL); 1532 EventRewriter rewriter;
1537 rewriter.set_pref_service_for_testing(&prefs); 1533 rewriter.set_pref_service_for_testing(&prefs);
1538 1534
1539 CommandLine::ForCurrentProcess()->AppendSwitchASCII( 1535 CommandLine::ForCurrentProcess()->AppendSwitchASCII(
1540 chromeos::switches::kHasChromeOSKeyboard, ""); 1536 chromeos::switches::kHasChromeOSKeyboard, "");
1541 1537
1542 KeyTestCase tests[] = { 1538 KeyTestCase tests[] = {
1543 // Alt+Search+Down -> End 1539 // Alt+Search+Down -> End
1544 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 1540 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
1545 {ui::VKEY_DOWN, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN}, 1541 {ui::VKEY_DOWN, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN},
1546 {ui::VKEY_END, ui::EF_NONE}}, 1542 {ui::VKEY_END, ui::EF_NONE}},
1547 1543
1548 // Shift+Alt+Search+Down -> Shift+End 1544 // Shift+Alt+Search+Down -> Shift+End
1549 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 1545 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
1550 {ui::VKEY_DOWN, 1546 {ui::VKEY_DOWN,
1551 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN}, 1547 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN},
1552 {ui::VKEY_END, ui::EF_SHIFT_DOWN}}, 1548 {ui::VKEY_END, ui::EF_SHIFT_DOWN}},
1553 }; 1549 };
1554 1550
1555 for (size_t i = 0; i < arraysize(tests); ++i) { 1551 for (size_t i = 0; i < arraysize(tests); ++i) {
1556 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); 1552 CheckKeyTestCase(1000 + i, &rewriter, tests[i]);
1557 } 1553 }
1558 1554
1559 *CommandLine::ForCurrentProcess() = original_cl; 1555 *CommandLine::ForCurrentProcess() = original_cl;
1560 } 1556 }
1561 1557
1562 TEST_F(EventRewriterTest, TestRewriteKeyEventSentByXSendEvent) { 1558 TEST_F(EventRewriterTest, TestRewriteKeyEventSentByXSendEvent) {
1563 #if defined(USE_X11)
1564 // TODO(kpschoedel): pending alternative to xevent.xany.send_event
1565 // Remap Control to Alt. 1559 // Remap Control to Alt.
1566 TestingPrefServiceSyncable prefs; 1560 TestingPrefServiceSyncable prefs;
1567 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1561 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1568 IntegerPrefMember control; 1562 IntegerPrefMember control;
1569 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); 1563 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs);
1570 control.SetValue(chromeos::input_method::kAltKey); 1564 control.SetValue(chromeos::input_method::kAltKey);
1571 1565
1572 EventRewriter rewriter(NULL); 1566 EventRewriter rewriter;
1573 rewriter.set_pref_service_for_testing(&prefs); 1567 rewriter.set_pref_service_for_testing(&prefs);
1574 1568
1575 // Send left control press. 1569 // Send left control press.
1576 std::string rewritten_event; 1570 std::string rewritten_event;
1577 { 1571 {
1578 ui::ScopedXI2Event xev; 1572 ui::ScopedXI2Event xev;
1579 xev.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 0); 1573 xev.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 0);
1580 XEvent* xevent = xev; 1574 XEvent* xevent = xev;
1581 xevent->xkey.keycode = XKeysymToKeycode(gfx::GetXDisplay(), XK_Control_L); 1575 xevent->xkey.keycode = XKeysymToKeycode(gfx::GetXDisplay(), XK_Control_L);
1582 xevent->xkey.send_event = True; // XSendEvent() always does this. 1576 xevent->xkey.send_event = True; // XSendEvent() always does this.
1583 ui::KeyEvent keyevent(xev, false /* is_char */); 1577 ui::KeyEvent keyevent(xev, false /* is_char */);
1584 scoped_ptr<ui::Event> new_event; 1578 scoped_ptr<ui::Event> new_event;
1585 // Control should NOT be remapped to Alt if send_event 1579 // Control should NOT be remapped to Alt if send_event
1586 // flag in the event is True. 1580 // flag in the event is True.
1587 EXPECT_EQ(ui::EVENT_REWRITE_CONTINUE, 1581 EXPECT_EQ(ui::EVENT_REWRITE_CONTINUE,
1588 rewriter.RewriteEvent(keyevent, &new_event)); 1582 rewriter.RewriteEvent(keyevent, &new_event));
1589 EXPECT_FALSE(new_event); 1583 EXPECT_FALSE(new_event);
1590 } 1584 }
1591 #endif
1592 } 1585 }
1593 1586
1594 TEST_F(EventRewriterTest, TestRewriteNonNativeEvent) { 1587 TEST_F(EventRewriterTest, TestRewriteNonNativeEvent) {
1595 // Remap Control to Alt. 1588 // Remap Control to Alt.
1596 TestingPrefServiceSyncable prefs; 1589 TestingPrefServiceSyncable prefs;
1597 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1590 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1598 IntegerPrefMember control; 1591 IntegerPrefMember control;
1599 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); 1592 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs);
1600 control.SetValue(chromeos::input_method::kAltKey); 1593 control.SetValue(chromeos::input_method::kAltKey);
1601 1594
1602 EventRewriter rewriter(NULL); 1595 EventRewriter rewriter;
1603 rewriter.set_pref_service_for_testing(&prefs); 1596 rewriter.set_pref_service_for_testing(&prefs);
1604 1597
1605 const int kTouchId = 2; 1598 const int kTouchId = 2;
1606 gfx::Point location(0, 0); 1599 gfx::Point location(0, 0);
1607 ui::TouchEvent press( 1600 ui::TouchEvent press(
1608 ui::ET_TOUCH_PRESSED, location, kTouchId, base::TimeDelta()); 1601 ui::ET_TOUCH_PRESSED, location, kTouchId, base::TimeDelta());
1609 press.set_flags(ui::EF_CONTROL_DOWN); 1602 press.set_flags(ui::EF_CONTROL_DOWN);
1610 1603
1611 scoped_ptr<ui::Event> new_event; 1604 scoped_ptr<ui::Event> new_event;
1612 rewriter.RewriteEvent(press, &new_event); 1605 rewriter.RewriteEvent(press, &new_event);
1613 EXPECT_TRUE(new_event); 1606 EXPECT_TRUE(new_event);
1614 // Control should be remapped to Alt. 1607 // Control should be remapped to Alt.
1615 EXPECT_EQ(ui::EF_ALT_DOWN, 1608 EXPECT_EQ(ui::EF_ALT_DOWN,
1616 new_event->flags() & (ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN)); 1609 new_event->flags() & (ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN));
1617 } 1610 }
1618 1611
1619 // Keeps a buffer of handled events.
1620 class EventBuffer : public ui::test::TestEventProcessor {
1621 public:
1622 EventBuffer() {}
1623 virtual ~EventBuffer() {}
1624
1625 void PopEvents(ScopedVector<ui::Event>* events) {
1626 events->clear();
1627 events->swap(events_);
1628 }
1629
1630 private:
1631 // ui::EventProcessor overrides:
1632 virtual ui::EventDispatchDetails OnEventFromSource(
1633 ui::Event* event) OVERRIDE {
1634 if (event->IsKeyEvent()) {
1635 events_.push_back(new ui::KeyEvent(*static_cast<ui::KeyEvent*>(event)));
1636 } else if (event->IsMouseWheelEvent()) {
1637 events_.push_back(
1638 new ui::MouseWheelEvent(*static_cast<ui::MouseWheelEvent*>(event)));
1639 } else if (event->IsMouseEvent()) {
1640 events_.push_back(
1641 new ui::MouseEvent(*static_cast<ui::MouseEvent*>(event)));
1642 }
1643 return ui::EventDispatchDetails();
1644 }
1645
1646 ScopedVector<ui::Event> events_;
1647
1648 DISALLOW_COPY_AND_ASSIGN(EventBuffer);
1649 };
1650
1651 // Trivial EventSource that does nothing but send events.
1652 class TestEventSource : public ui::EventSource {
1653 public:
1654 explicit TestEventSource(ui::EventProcessor* processor)
1655 : processor_(processor) {}
1656 virtual ui::EventProcessor* GetEventProcessor() OVERRIDE {
1657 return processor_;
1658 }
1659 ui::EventDispatchDetails Send(ui::Event* event) {
1660 return SendEventToProcessor(event);
1661 }
1662
1663 private:
1664 ui::EventProcessor* processor_;
1665 };
1666
1667 // Tests of event rewriting that depend on the Ash window manager. 1612 // Tests of event rewriting that depend on the Ash window manager.
1668 class EventRewriterAshTest : public ash::test::AshTestBase { 1613 class EventRewriterAshTest : public ash::test::AshTestBase {
1669 public: 1614 public:
1670 EventRewriterAshTest() 1615 EventRewriterAshTest()
1671 : source_(&buffer_), 1616 : mock_user_manager_(new chromeos::MockUserManager),
1672 mock_user_manager_(new chromeos::MockUserManager),
1673 user_manager_enabler_(mock_user_manager_) {} 1617 user_manager_enabler_(mock_user_manager_) {}
1674 virtual ~EventRewriterAshTest() {} 1618 virtual ~EventRewriterAshTest() {}
1675 1619
1676 bool RewriteFunctionKeys(const ui::Event& event, 1620 bool RewriteFunctionKeys(const ui::Event& event,
1677 scoped_ptr<ui::Event>* rewritten_event) { 1621 scoped_ptr<ui::Event>* rewritten_event) {
1678 return rewriter_->RewriteEvent(event, rewritten_event); 1622 return rewriter_->RewriteEvent(event, rewritten_event);
1679 } 1623 }
1680 1624
1681 ui::EventDispatchDetails Send(ui::Event* event) {
1682 return source_.Send(event);
1683 }
1684
1685 void SendKeyEvent(ui::EventType type, ui::KeyboardCode key_code) {
1686 ui::KeyEvent press(type, key_code, ui::EF_NONE, false);
1687 ui::EventDispatchDetails details = Send(&press);
1688 CHECK(!details.dispatcher_destroyed);
1689 }
1690
1691 void SendActivateStickyKeyPattern(ui::KeyboardCode key_code) {
1692 SendKeyEvent(ui::ET_KEY_PRESSED, key_code);
1693 SendKeyEvent(ui::ET_KEY_RELEASED, key_code);
1694 }
1695
1696 protected: 1625 protected:
1697 TestingPrefServiceSyncable* prefs() { return &prefs_; }
1698
1699 void PopEvents(ScopedVector<ui::Event>* events) {
1700 buffer_.PopEvents(events);
1701 }
1702
1703 virtual void SetUp() OVERRIDE { 1626 virtual void SetUp() OVERRIDE {
1704 AshTestBase::SetUp(); 1627 AshTestBase::SetUp();
1705 sticky_keys_controller_ = 1628 rewriter_.reset(new EventRewriter());
1706 ash::Shell::GetInstance()->sticky_keys_controller();
1707 rewriter_.reset(new EventRewriter(sticky_keys_controller_));
1708 chromeos::Preferences::RegisterProfilePrefs(prefs_.registry()); 1629 chromeos::Preferences::RegisterProfilePrefs(prefs_.registry());
1709 rewriter_->set_pref_service_for_testing(&prefs_); 1630 rewriter_->set_pref_service_for_testing(&prefs_);
1710 #if defined(USE_X11)
1711 ui::SetUpTouchPadForTest(kTouchPadDeviceId);
1712 #endif
1713 source_.AddEventRewriter(rewriter_.get());
1714 sticky_keys_controller_->Enable(true);
1715 } 1631 }
1716 1632
1717 virtual void TearDown() OVERRIDE { 1633 virtual void TearDown() OVERRIDE {
1718 rewriter_.reset(); 1634 rewriter_.reset();
1719 AshTestBase::TearDown(); 1635 AshTestBase::TearDown();
1720 } 1636 }
1721 1637
1722 protected: 1638 TestingPrefServiceSyncable prefs_;
1723 ash::StickyKeysController* sticky_keys_controller_;
1724 1639
1725 private: 1640 private:
1726 scoped_ptr<EventRewriter> rewriter_; 1641 scoped_ptr<EventRewriter> rewriter_;
1727 1642
1728 EventBuffer buffer_;
1729 TestEventSource source_;
1730
1731 chromeos::MockUserManager* mock_user_manager_; // Not owned. 1643 chromeos::MockUserManager* mock_user_manager_; // Not owned.
1732 chromeos::ScopedUserManagerEnabler user_manager_enabler_; 1644 chromeos::ScopedUserManagerEnabler user_manager_enabler_;
1733 TestingPrefServiceSyncable prefs_;
1734 1645
1735 DISALLOW_COPY_AND_ASSIGN(EventRewriterAshTest); 1646 DISALLOW_COPY_AND_ASSIGN(EventRewriterAshTest);
1736 }; 1647 };
1737 1648
1738 TEST_F(EventRewriterAshTest, TopRowKeysAreFunctionKeys) { 1649 TEST_F(EventRewriterAshTest, TopRowKeysAreFunctionKeys) {
1739 scoped_ptr<aura::Window> window(CreateTestWindowInShellWithId(1)); 1650 scoped_ptr<aura::Window> window(CreateTestWindowInShellWithId(1));
1740 ash::wm::WindowState* window_state = ash::wm::GetWindowState(window.get()); 1651 ash::wm::WindowState* window_state = ash::wm::GetWindowState(window.get());
1741 window_state->Activate(); 1652 window_state->Activate();
1742 ScopedVector<ui::Event> events;
1743 1653
1744 // Create a simulated keypress of F1 targetted at the window. 1654 // Create a simulated keypress of F1 targetted at the window.
1745 ui::KeyEvent press_f1(ui::ET_KEY_PRESSED, ui::VKEY_F1, 0, false); 1655 ui::KeyEvent press_f1(ui::ET_KEY_PRESSED, ui::VKEY_F1, 0, false);
1746 1656
1747 // Simulate an apps v2 window that has requested top row keys as function 1657 // Simulate an apps v2 window that has requested top row keys as function
1748 // keys. The event should not be rewritten. 1658 // keys. The event should not be rewritten.
1749 window_state->set_top_row_keys_are_function_keys(true); 1659 window_state->set_top_row_keys_are_function_keys(true);
1750 ui::EventDispatchDetails details = Send(&press_f1); 1660 scoped_ptr<ui::Event> rewritten_event;
1751 ASSERT_FALSE(details.dispatcher_destroyed); 1661 ASSERT_FALSE(RewriteFunctionKeys(press_f1, &rewritten_event));
1752 PopEvents(&events); 1662 ASSERT_FALSE(rewritten_event);
1753 EXPECT_EQ(1u, events.size());
1754 EXPECT_EQ( 1663 EXPECT_EQ(
1755 GetExpectedResultAsString(ui::VKEY_F1, ui::EF_NONE, ui::ET_KEY_PRESSED), 1664 GetExpectedResultAsString(ui::VKEY_F1, ui::EF_NONE, ui::ET_KEY_PRESSED),
1756 GetKeyEventAsString(*static_cast<ui::KeyEvent*>(events[0]))); 1665 GetKeyEventAsString(press_f1));
1757 1666
1758 // The event should also not be rewritten if the send-function-keys pref is 1667 // The event should also not be rewritten if the send-function-keys pref is
1759 // additionally set, for both apps v2 and regular windows. 1668 // additionally set, for both apps v2 and regular windows.
1760 BooleanPrefMember send_function_keys_pref; 1669 BooleanPrefMember send_function_keys_pref;
1761 send_function_keys_pref.Init(prefs::kLanguageSendFunctionKeys, prefs()); 1670 send_function_keys_pref.Init(prefs::kLanguageSendFunctionKeys, &prefs_);
1762 send_function_keys_pref.SetValue(true); 1671 send_function_keys_pref.SetValue(true);
1763 window_state->set_top_row_keys_are_function_keys(false); 1672 window_state->set_top_row_keys_are_function_keys(false);
1764 details = Send(&press_f1); 1673 ASSERT_FALSE(RewriteFunctionKeys(press_f1, &rewritten_event));
1765 ASSERT_FALSE(details.dispatcher_destroyed); 1674 ASSERT_FALSE(rewritten_event);
1766 PopEvents(&events);
1767 EXPECT_EQ(1u, events.size());
1768 EXPECT_EQ( 1675 EXPECT_EQ(
1769 GetExpectedResultAsString(ui::VKEY_F1, ui::EF_NONE, ui::ET_KEY_PRESSED), 1676 GetExpectedResultAsString(ui::VKEY_F1, ui::EF_NONE, ui::ET_KEY_PRESSED),
1770 GetKeyEventAsString(*static_cast<ui::KeyEvent*>(events[0]))); 1677 GetKeyEventAsString(press_f1));
1771 1678
1772 // If the pref isn't set when an event is sent to a regular window, F1 is 1679 // If the pref isn't set when an event is sent to a regular window, F1 is
1773 // rewritten to the back key. 1680 // rewritten to the back key.
1774 send_function_keys_pref.SetValue(false); 1681 send_function_keys_pref.SetValue(false);
1775 details = Send(&press_f1); 1682 ASSERT_TRUE(RewriteFunctionKeys(press_f1, &rewritten_event));
1776 ASSERT_FALSE(details.dispatcher_destroyed); 1683 ASSERT_TRUE(rewritten_event);
1777 PopEvents(&events);
1778 EXPECT_EQ(1u, events.size());
1779 EXPECT_EQ(GetExpectedResultAsString( 1684 EXPECT_EQ(GetExpectedResultAsString(
1780 ui::VKEY_BROWSER_BACK, ui::EF_NONE, ui::ET_KEY_PRESSED), 1685 ui::VKEY_BROWSER_BACK, ui::EF_NONE, ui::ET_KEY_PRESSED),
1781 GetKeyEventAsString(*static_cast<ui::KeyEvent*>(events[0]))); 1686 GetKeyEventAsString(
1687 *static_cast<const ui::KeyEvent*>(rewritten_event.get())));
1782 } 1688 }
1783 1689
1784 TEST_F(EventRewriterTest, TestRewrittenModifierClick) { 1690 TEST_F(EventRewriterTest, TestRewrittenModifierClick) {
1785 std::vector<unsigned int> device_list; 1691 std::vector<unsigned int> device_list;
1786 device_list.push_back(10); 1692 device_list.push_back(10);
1787 ui::TouchFactory::GetInstance()->SetPointerDeviceForTest(device_list); 1693 ui::TouchFactory::GetInstance()->SetPointerDeviceForTest(device_list);
1788 1694
1789 // Remap Control to Alt. 1695 // Remap Control to Alt.
1790 TestingPrefServiceSyncable prefs; 1696 TestingPrefServiceSyncable prefs;
1791 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1697 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1792 IntegerPrefMember control; 1698 IntegerPrefMember control;
1793 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); 1699 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs);
1794 control.SetValue(chromeos::input_method::kAltKey); 1700 control.SetValue(chromeos::input_method::kAltKey);
1795 1701
1796 EventRewriter rewriter(NULL); 1702 EventRewriter rewriter;
1797 rewriter.set_pref_service_for_testing(&prefs); 1703 rewriter.set_pref_service_for_testing(&prefs);
1798 1704
1799 // Check that Control + Left Button is converted (via Alt + Left Button) 1705 // Check that Control + Left Button is converted (via Alt + Left Button)
1800 // to Right Button. 1706 // to Right Button.
1801 ui::ScopedXI2Event xev; 1707 ui::ScopedXI2Event xev;
1802 xev.InitGenericButtonEvent(10, 1708 xev.InitGenericButtonEvent(10,
1803 ui::ET_MOUSE_PRESSED, 1709 ui::ET_MOUSE_PRESSED,
1804 gfx::Point(), 1710 gfx::Point(),
1805 ui::EF_LEFT_MOUSE_BUTTON | ui::EF_CONTROL_DOWN); 1711 ui::EF_LEFT_MOUSE_BUTTON | ui::EF_CONTROL_DOWN);
1806 ui::MouseEvent press(xev); 1712 ui::MouseEvent press(xev);
1807 // Sanity check. 1713 // Sanity check.
1808 EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type()); 1714 EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type());
1809 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON | ui::EF_CONTROL_DOWN, press.flags()); 1715 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON | ui::EF_CONTROL_DOWN, press.flags());
1810 int flags = RewriteMouseEvent(&rewriter, press); 1716 int flags = RewriteMouseEvent(&rewriter, press);
1811 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & flags); 1717 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & flags);
1812 EXPECT_FALSE(ui::EF_CONTROL_DOWN & flags); 1718 EXPECT_FALSE(ui::EF_CONTROL_DOWN & flags);
1813 EXPECT_FALSE(ui::EF_ALT_DOWN & flags); 1719 EXPECT_FALSE(ui::EF_ALT_DOWN & flags);
1814 } 1720 }
1815 1721
1816 1722
1817 TEST_F(EventRewriterTest, DontRewriteIfNotRewritten) { 1723 TEST_F(EventRewriterTest, DontRewriteIfNotRewritten) {
1818 #if defined(USE_X11)
1819 // TODO(kpschoedel): pending changes for crbug.com/360377
1820 // to |chromeos::EventRewriter::RewriteLocatedEvent()
1821 std::vector<unsigned int> device_list; 1724 std::vector<unsigned int> device_list;
1822 device_list.push_back(10); 1725 device_list.push_back(10);
1823 device_list.push_back(11); 1726 device_list.push_back(11);
1824 ui::TouchFactory::GetInstance()->SetPointerDeviceForTest(device_list); 1727 ui::TouchFactory::GetInstance()->SetPointerDeviceForTest(device_list);
1825 TestingPrefServiceSyncable prefs; 1728 TestingPrefServiceSyncable prefs;
1826 EventRewriter rewriter(NULL); 1729 EventRewriter rewriter;
1827 rewriter.set_pref_service_for_testing(&prefs); 1730 rewriter.set_pref_service_for_testing(&prefs);
1828 const int kLeftAndAltFlag = ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN; 1731 const int kLeftAndAltFlag = ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN;
1829 { 1732 {
1830 ui::ScopedXI2Event xev; 1733 ui::ScopedXI2Event xev;
1831 xev.InitGenericButtonEvent( 1734 xev.InitGenericButtonEvent(
1832 10, ui::ET_MOUSE_PRESSED, gfx::Point(), kLeftAndAltFlag); 1735 10, ui::ET_MOUSE_PRESSED, gfx::Point(), kLeftAndAltFlag);
1833 ui::MouseEvent press(xev); 1736 ui::MouseEvent press(xev);
1834 // Sanity check. 1737 // Sanity check.
1835 EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type()); 1738 EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type());
1836 EXPECT_EQ(kLeftAndAltFlag, press.flags()); 1739 EXPECT_EQ(kLeftAndAltFlag, press.flags());
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1882 EXPECT_TRUE((ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN) & flags); 1785 EXPECT_TRUE((ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN) & flags);
1883 } 1786 }
1884 { 1787 {
1885 ui::ScopedXI2Event xev; 1788 ui::ScopedXI2Event xev;
1886 xev.InitGenericButtonEvent( 1789 xev.InitGenericButtonEvent(
1887 11, ui::ET_MOUSE_RELEASED, gfx::Point(), kLeftAndAltFlag); 1790 11, ui::ET_MOUSE_RELEASED, gfx::Point(), kLeftAndAltFlag);
1888 ui::MouseEvent release(xev); 1791 ui::MouseEvent release(xev);
1889 int flags = RewriteMouseEvent(&rewriter, release); 1792 int flags = RewriteMouseEvent(&rewriter, release);
1890 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & flags); 1793 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & flags);
1891 } 1794 }
1892 #endif
1893 }
1894
1895 TEST_F(EventRewriterAshTest, StickyKeyEventDispatchImpl) {
1896 // Test the actual key event dispatch implementation.
1897 ScopedVector<ui::Event> events;
1898
1899 SendActivateStickyKeyPattern(ui::VKEY_CONTROL);
1900 PopEvents(&events);
1901 EXPECT_EQ(1u, events.size());
1902 EXPECT_EQ(ui::ET_KEY_PRESSED, events[0]->type());
1903 EXPECT_EQ(ui::VKEY_CONTROL,
1904 static_cast<ui::KeyEvent*>(events[0])->key_code());
1905
1906 // Test key press event is correctly modified and modifier release
1907 // event is sent.
1908 ui::KeyEvent press(ui::ET_KEY_PRESSED, ui::VKEY_C, ui::EF_NONE, false);
1909 ui::EventDispatchDetails details = Send(&press);
1910 PopEvents(&events);
1911 EXPECT_EQ(2u, events.size());
1912 EXPECT_EQ(ui::ET_KEY_PRESSED, events[0]->type());
1913 EXPECT_EQ(ui::VKEY_C, static_cast<ui::KeyEvent*>(events[0])->key_code());
1914 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
1915 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type());
1916 EXPECT_EQ(ui::VKEY_CONTROL,
1917 static_cast<ui::KeyEvent*>(events[1])->key_code());
1918
1919 // Test key release event is not modified.
1920 ui::KeyEvent release(ui::ET_KEY_RELEASED, ui::VKEY_C, ui::EF_NONE, false);
1921 details = Send(&release);
1922 ASSERT_FALSE(details.dispatcher_destroyed);
1923 PopEvents(&events);
1924 EXPECT_EQ(1u, events.size());
1925 EXPECT_EQ(ui::ET_KEY_RELEASED, events[0]->type());
1926 EXPECT_EQ(ui::VKEY_C, static_cast<ui::KeyEvent*>(events[0])->key_code());
1927 EXPECT_FALSE(events[0]->flags() & ui::EF_CONTROL_DOWN);
1928 }
1929
1930 TEST_F(EventRewriterAshTest, MouseEventDispatchImpl) {
1931 ScopedVector<ui::Event> events;
1932
1933 SendActivateStickyKeyPattern(ui::VKEY_CONTROL);
1934 PopEvents(&events);
1935
1936 // Test mouse press event is correctly modified.
1937 gfx::Point location(0, 0);
1938 ui::MouseEvent press(ui::ET_MOUSE_PRESSED,
1939 location,
1940 location,
1941 ui::EF_LEFT_MOUSE_BUTTON,
1942 ui::EF_LEFT_MOUSE_BUTTON);
1943 ui::EventDispatchDetails details = Send(&press);
1944 ASSERT_FALSE(details.dispatcher_destroyed);
1945 PopEvents(&events);
1946 EXPECT_EQ(1u, events.size());
1947 EXPECT_EQ(ui::ET_MOUSE_PRESSED, events[0]->type());
1948 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
1949
1950 // Test mouse release event is correctly modified and modifier release
1951 // event is sent. The mouse event should have the correct DIP location.
1952 ui::MouseEvent release(ui::ET_MOUSE_RELEASED,
1953 location,
1954 location,
1955 ui::EF_LEFT_MOUSE_BUTTON,
1956 ui::EF_LEFT_MOUSE_BUTTON);
1957 details = Send(&release);
1958 ASSERT_FALSE(details.dispatcher_destroyed);
1959 PopEvents(&events);
1960 EXPECT_EQ(2u, events.size());
1961 EXPECT_EQ(ui::ET_MOUSE_RELEASED, events[0]->type());
1962 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
1963 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type());
1964 EXPECT_EQ(ui::VKEY_CONTROL,
1965 static_cast<ui::KeyEvent*>(events[1])->key_code());
1966 }
1967
1968 TEST_F(EventRewriterAshTest, MouseWheelEventDispatchImpl) {
1969 ScopedVector<ui::Event> events;
1970
1971 // Test positive mouse wheel event is correctly modified and modifier release
1972 // event is sent.
1973 SendActivateStickyKeyPattern(ui::VKEY_CONTROL);
1974 PopEvents(&events);
1975 gfx::Point location(0, 0);
1976 ui::MouseEvent mev(ui::ET_MOUSEWHEEL,
1977 location,
1978 location,
1979 ui::EF_LEFT_MOUSE_BUTTON,
1980 ui::EF_LEFT_MOUSE_BUTTON);
1981 ui::MouseWheelEvent positive(mev, 0, ui::MouseWheelEvent::kWheelDelta);
1982 ui::EventDispatchDetails details = Send(&positive);
1983 ASSERT_FALSE(details.dispatcher_destroyed);
1984 PopEvents(&events);
1985 EXPECT_EQ(2u, events.size());
1986 EXPECT_TRUE(events[0]->IsMouseWheelEvent());
1987 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
1988 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type());
1989 EXPECT_EQ(ui::VKEY_CONTROL,
1990 static_cast<ui::KeyEvent*>(events[1])->key_code());
1991
1992 // Test negative mouse wheel event is correctly modified and modifier release
1993 // event is sent.
1994 SendActivateStickyKeyPattern(ui::VKEY_CONTROL);
1995 PopEvents(&events);
1996 ui::MouseWheelEvent negative(mev, 0, -ui::MouseWheelEvent::kWheelDelta);
1997 details = Send(&negative);
1998 ASSERT_FALSE(details.dispatcher_destroyed);
1999 PopEvents(&events);
2000 EXPECT_EQ(2u, events.size());
2001 EXPECT_TRUE(events[0]->IsMouseWheelEvent());
2002 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
2003 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type());
2004 EXPECT_EQ(ui::VKEY_CONTROL,
2005 static_cast<ui::KeyEvent*>(events[1])->key_code());
2006 }
2007
2008 class StickyKeysOverlayTest : public EventRewriterAshTest {
2009 public:
2010 StickyKeysOverlayTest() : overlay_(NULL) {}
2011
2012 virtual ~StickyKeysOverlayTest() {}
2013
2014 virtual void SetUp() OVERRIDE {
2015 EventRewriterAshTest::SetUp();
2016 overlay_ = sticky_keys_controller_->GetOverlayForTest();
2017 ASSERT_TRUE(overlay_);
2018 }
2019
2020 ash::StickyKeysOverlay* overlay_;
2021 };
2022
2023 TEST_F(StickyKeysOverlayTest, OneModifierEnabled) {
2024 EXPECT_FALSE(overlay_->is_visible());
2025 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2026 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2027
2028 // Pressing modifier key should show overlay.
2029 SendActivateStickyKeyPattern(ui::VKEY_CONTROL);
2030 EXPECT_TRUE(overlay_->is_visible());
2031 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED,
2032 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2033
2034 // Pressing a normal key should hide overlay.
2035 SendActivateStickyKeyPattern(ui::VKEY_T);
2036 EXPECT_FALSE(overlay_->is_visible());
2037 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2038 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2039 }
2040
2041 TEST_F(StickyKeysOverlayTest, TwoModifiersEnabled) {
2042 EXPECT_FALSE(overlay_->is_visible());
2043 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2044 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2045 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2046 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
2047
2048 // Pressing two modifiers should show overlay.
2049 SendActivateStickyKeyPattern(ui::VKEY_SHIFT);
2050 SendActivateStickyKeyPattern(ui::VKEY_CONTROL);
2051 EXPECT_TRUE(overlay_->is_visible());
2052 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED,
2053 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
2054 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED,
2055 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2056
2057 // Pressing a normal key should hide overlay.
2058 SendActivateStickyKeyPattern(ui::VKEY_N);
2059 EXPECT_FALSE(overlay_->is_visible());
2060 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2061 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2062 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2063 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
2064 }
2065
2066 TEST_F(StickyKeysOverlayTest, LockedModifier) {
2067 EXPECT_FALSE(overlay_->is_visible());
2068 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2069 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
2070
2071 // Pressing a modifier key twice should lock modifier and show overlay.
2072 SendActivateStickyKeyPattern(ui::VKEY_LMENU);
2073 SendActivateStickyKeyPattern(ui::VKEY_LMENU);
2074 EXPECT_TRUE(overlay_->is_visible());
2075 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED,
2076 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
2077
2078 // Pressing a normal key should not hide overlay.
2079 SendActivateStickyKeyPattern(ui::VKEY_D);
2080 EXPECT_TRUE(overlay_->is_visible());
2081 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED,
2082 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
2083 }
2084
2085 TEST_F(StickyKeysOverlayTest, LockedAndNormalModifier) {
2086 EXPECT_FALSE(overlay_->is_visible());
2087 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2088 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2089 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2090 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
2091
2092 // Pressing a modifier key twice should lock modifier and show overlay.
2093 SendActivateStickyKeyPattern(ui::VKEY_CONTROL);
2094 SendActivateStickyKeyPattern(ui::VKEY_CONTROL);
2095 EXPECT_TRUE(overlay_->is_visible());
2096 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED,
2097 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2098
2099 // Pressing another modifier key should still show overlay.
2100 SendActivateStickyKeyPattern(ui::VKEY_SHIFT);
2101 EXPECT_TRUE(overlay_->is_visible());
2102 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED,
2103 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2104 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED,
2105 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
2106
2107 // Pressing a normal key should not hide overlay but disable normal modifier.
2108 SendActivateStickyKeyPattern(ui::VKEY_D);
2109 EXPECT_TRUE(overlay_->is_visible());
2110 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED,
2111 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2112 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2113 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
2114 }
2115
2116 TEST_F(StickyKeysOverlayTest, ModifiersDisabled) {
2117 EXPECT_FALSE(overlay_->is_visible());
2118 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2119 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2120 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2121 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
2122 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2123 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
2124
2125 // Enable modifiers.
2126 SendActivateStickyKeyPattern(ui::VKEY_CONTROL);
2127 SendActivateStickyKeyPattern(ui::VKEY_SHIFT);
2128 SendActivateStickyKeyPattern(ui::VKEY_SHIFT);
2129 SendActivateStickyKeyPattern(ui::VKEY_LMENU);
2130
2131 EXPECT_TRUE(overlay_->is_visible());
2132 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED,
2133 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2134 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED,
2135 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
2136 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED,
2137 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
2138
2139 // Disable modifiers and overlay should be hidden.
2140 SendActivateStickyKeyPattern(ui::VKEY_CONTROL);
2141 SendActivateStickyKeyPattern(ui::VKEY_CONTROL);
2142 SendActivateStickyKeyPattern(ui::VKEY_SHIFT);
2143 SendActivateStickyKeyPattern(ui::VKEY_LMENU);
2144 SendActivateStickyKeyPattern(ui::VKEY_LMENU);
2145
2146 EXPECT_FALSE(overlay_->is_visible());
2147 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2148 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2149 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2150 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
2151 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2152 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
2153 }
2154
2155 TEST_F(StickyKeysOverlayTest, ModifierVisibility) {
2156 // All but AltGr and Mod3 should initially be visible.
2157 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_CONTROL_DOWN));
2158 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_SHIFT_DOWN));
2159 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_ALT_DOWN));
2160 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
2161 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));
2162
2163 // Turn all modifiers on.
2164 sticky_keys_controller_->SetModifiersEnabled(true, true);
2165 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_CONTROL_DOWN));
2166 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_SHIFT_DOWN));
2167 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_ALT_DOWN));
2168 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
2169 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));
2170
2171 // Turn off Mod3.
2172 sticky_keys_controller_->SetModifiersEnabled(false, true);
2173 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
2174 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));
2175
2176 // Turn off AltGr.
2177 sticky_keys_controller_->SetModifiersEnabled(true, false);
2178 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
2179 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));
2180
2181 // Turn off AltGr and Mod3.
2182 sticky_keys_controller_->SetModifiersEnabled(false, false);
2183 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
2184 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));
2185 } 1795 }
2186 1796
2187 } // namespace chromeos 1797 } // namespace chromeos
OLDNEW
« no previous file with comments | « trunk/src/chrome/browser/chromeos/events/event_rewriter.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698