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

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

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

Powered by Google App Engine
This is Rietveld 408576698