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

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

Issue 336403005: Use XInput2 events for keyboard events. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address review comments (derat). Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
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 <vector> 7 #include <vector>
8 8
9 #include "ash/shell.h" 9 #include "ash/shell.h"
10 #include "ash/sticky_keys/sticky_keys_controller.h" 10 #include "ash/sticky_keys/sticky_keys_controller.h"
(...skipping 25 matching lines...) Expand all
36 36
37 #include "ui/events/test/events_test_utils_x11.h" 37 #include "ui/events/test/events_test_utils_x11.h"
38 #include "ui/events/x/touch_factory_x11.h" 38 #include "ui/events/x/touch_factory_x11.h"
39 #include "ui/gfx/x/x11_types.h" 39 #include "ui/gfx/x/x11_types.h"
40 #endif 40 #endif
41 41
42 namespace { 42 namespace {
43 43
44 // The device id of the test touchpad device. 44 // The device id of the test touchpad device.
45 const unsigned int kTouchPadDeviceId = 1; 45 const unsigned int kTouchPadDeviceId = 1;
46 const int kKeyboardDeviceId = 2;
46 47
47 std::string GetExpectedResultAsString(ui::KeyboardCode ui_keycode, 48 std::string GetExpectedResultAsString(ui::KeyboardCode ui_keycode,
48 int ui_flags, 49 int ui_flags,
49 ui::EventType ui_type) { 50 ui::EventType ui_type) {
50 return base::StringPrintf("ui_keycode=0x%X ui_flags=0x%X ui_type=%d", 51 return base::StringPrintf("ui_keycode=0x%X ui_flags=0x%X ui_type=%d",
51 ui_keycode, 52 ui_keycode,
52 ui_flags & ~ui::EF_IS_REPEAT, 53 ui_flags & ~ui::EF_IS_REPEAT,
53 ui_type); 54 ui_type);
54 } 55 }
55 56
(...skipping 28 matching lines...) Expand all
84 // between pairs like XK_Insert and XK_KP_Insert. 85 // between pairs like XK_Insert and XK_KP_Insert.
85 }; 86 };
86 int test; 87 int test;
87 ui::EventType type; 88 ui::EventType type;
88 struct { 89 struct {
89 ui::KeyboardCode key_code; 90 ui::KeyboardCode key_code;
90 int flags; 91 int flags;
91 } input, expected; 92 } input, expected;
92 }; 93 };
93 94
95 #if defined(USE_X11)
96 // Check rewriting of an X11-based key event.
97 void CheckX11KeyTestCase(const std::string& expected,
98 chromeos::EventRewriter* rewriter,
99 const KeyTestCase& test,
100 XEvent* xevent) {
101 ui::KeyEvent xkey_event(xevent, false);
102 if (test.test & KeyTestCase::NUMPAD)
103 xkey_event.set_flags(xkey_event.flags() | ui::EF_NUMPAD_KEY);
104 // Verify that the X11-based key event is as expected.
105 EXPECT_EQ(GetExpectedResultAsString(
106 test.input.key_code, test.input.flags, test.type),
107 GetKeyEventAsString(xkey_event));
108 // Rewrite the event and check the result.
109 scoped_ptr<ui::Event> new_event;
110 rewriter->RewriteEvent(xkey_event, &new_event);
111 ui::KeyEvent& rewritten_key_event =
112 new_event ? *static_cast<ui::KeyEvent*>(new_event.get()) : xkey_event;
113 EXPECT_EQ(expected, GetKeyEventAsString(rewritten_key_event));
114 if ((rewritten_key_event.key_code() != ui::VKEY_UNKNOWN) &&
115 (rewritten_key_event.native_event()->xkey.keycode != 0)) {
116 // Build a new ui::KeyEvent from the rewritten native component,
117 // and check that it also matches the rewritten event.
118 EXPECT_TRUE(rewritten_key_event.native_event());
119 ui::KeyEvent from_native_event(rewritten_key_event.native_event(), false);
120 EXPECT_EQ(expected, GetKeyEventAsString(from_native_event));
121 }
122 }
123 #endif
124
94 // Tests a single stateless key rewrite operation. 125 // Tests a single stateless key rewrite operation.
95 // |i| is a an identifying number to locate failing tests in the tables. 126 // |i| is a an identifying number to locate failing tests in the tables.
96 void CheckKeyTestCase(size_t i, 127 void CheckKeyTestCase(chromeos::EventRewriter* rewriter,
97 chromeos::EventRewriter* rewriter,
98 const KeyTestCase& test) { 128 const KeyTestCase& test) {
99 std::string id = base::StringPrintf("(%zu) ", i);
100 std::string expected = 129 std::string expected =
101 id + GetExpectedResultAsString( 130 GetExpectedResultAsString(
102 test.expected.key_code, test.expected.flags, test.type); 131 test.expected.key_code, test.expected.flags, test.type);
103 132
104 if (test.test & KeyTestCase::TEST_VKEY) { 133 if (test.test & KeyTestCase::TEST_VKEY) {
105 // Check rewriting of a non-native-based key event. 134 // Check rewriting of a non-native-based key event.
106 EXPECT_EQ( 135 EXPECT_EQ(
107 expected, 136 expected,
108 id + GetRewrittenEventAsString( 137 GetRewrittenEventAsString(
109 rewriter, test.input.key_code, test.input.flags, test.type)); 138 rewriter, test.input.key_code, test.input.flags, test.type));
110 } 139 }
111 140
112 #if defined(USE_X11) 141 #if defined(USE_X11)
113 if (test.test & KeyTestCase::TEST_X11) { 142 if (test.test & KeyTestCase::TEST_X11) {
114 ui::ScopedXI2Event xev; 143 ui::ScopedXI2Event xev;
144 // Test an XKeyEvent.
115 xev.InitKeyEvent(test.type, test.input.key_code, test.input.flags); 145 xev.InitKeyEvent(test.type, test.input.key_code, test.input.flags);
116 XEvent* xevent = xev; 146 XEvent* xevent = xev;
117 if (xevent->xkey.keycode) { 147 DCHECK((xevent->type == KeyPress) || (xevent->type == KeyRelease));
118 ui::KeyEvent xkey_event(xevent, false); 148 if (xevent->xkey.keycode)
119 if (test.test & KeyTestCase::NUMPAD) 149 CheckX11KeyTestCase(expected, rewriter, test, xevent);
120 xkey_event.set_flags(xkey_event.flags() | ui::EF_NUMPAD_KEY); 150 // Test an XI2 GenericEvent.
121 // Verify that the X11-based key event is as expected. 151 xev.InitGenericKeyEvent(
122 EXPECT_EQ(id + GetExpectedResultAsString( 152 kKeyboardDeviceId, test.type, test.input.key_code, test.input.flags);
123 test.input.key_code, test.input.flags, test.type), 153 xevent = xev;
124 id + GetKeyEventAsString(xkey_event)); 154 DCHECK(xevent->type == GenericEvent);
125 // Rewrite the event and check the result. 155 XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xevent->xcookie.data);
126 scoped_ptr<ui::Event> new_event; 156 DCHECK((xievent->evtype == XI_KeyPress) ||
127 rewriter->RewriteEvent(xkey_event, &new_event); 157 (xievent->evtype == XI_KeyRelease));
128 ui::KeyEvent& rewritten_key_event = 158 if (xievent->detail)
129 new_event ? *static_cast<ui::KeyEvent*>(new_event.get()) : xkey_event; 159 CheckX11KeyTestCase(expected, rewriter, test, xevent);
130 EXPECT_EQ(expected, id + GetKeyEventAsString(rewritten_key_event));
131 if ((rewritten_key_event.key_code() != ui::VKEY_UNKNOWN) &&
132 (rewritten_key_event.native_event()->xkey.keycode != 0)) {
133 // Build a new ui::KeyEvent from the rewritten native component,
134 // and check that it also matches the rewritten event.
135 ui::KeyEvent from_native_event(rewritten_key_event.native_event(),
136 false);
137 EXPECT_EQ(expected, id + GetKeyEventAsString(from_native_event));
138 }
139 }
140 } 160 }
141 #endif 161 #endif
142 } 162 }
143 163
144 // Table entry for simple single function key event rewriting tests. 164 // Table entry for simple single function key event rewriting tests.
145 struct FunctionKeyTestCase { 165 struct FunctionKeyTestCase {
146 ui::EventType type; 166 ui::EventType type;
147 struct { 167 struct {
148 ui::KeyboardCode key_code; 168 ui::KeyboardCode key_code;
149 int flags; 169 int flags;
150 } input, vkey_expected, native_expected; 170 } input, vkey_expected, native_expected;
151 }; 171 };
152 172
153 // Tests a single stateless function key rewrite operation. 173 // Tests a single stateless function key rewrite operation.
154 // |i| is a an identifying number to locate failing tests in the tables. 174 // |i| is a an identifying number to locate failing tests in the tables.
155 // Function key mapping differs from the other key mappings because the 175 // Function key mapping differs from the other key mappings because the
156 // EF_FUNCTION_KEY flag is set during ui::KeyEvent construction when passing in 176 // EF_FUNCTION_KEY flag is set during ui::KeyEvent construction when passing in
157 // a native X11 event and the flag is not set when using other constructors. 177 // a native X11 event and the flag is not set when using other constructors.
158 void CheckFunctionKeyTestCase(size_t i, 178 void CheckFunctionKeyTestCase(chromeos::EventRewriter* rewriter,
159 chromeos::EventRewriter* rewriter,
160 const FunctionKeyTestCase& test) { 179 const FunctionKeyTestCase& test) {
161 std::string id = base::StringPrintf("(%zu) ", i);
162 std::string vkey_expected = 180 std::string vkey_expected =
163 id + GetExpectedResultAsString( 181 GetExpectedResultAsString(
164 test.vkey_expected.key_code, 182 test.vkey_expected.key_code,
165 test.vkey_expected.flags, 183 test.vkey_expected.flags,
166 test.type); 184 test.type);
167 // Check rewriting of a non-native-based key event. 185 // Check rewriting of a non-native-based key event.
168 EXPECT_EQ( 186 EXPECT_EQ(
169 vkey_expected, 187 vkey_expected,
170 id + GetRewrittenEventAsString( 188 GetRewrittenEventAsString(
171 rewriter, test.input.key_code, test.input.flags, test.type)); 189 rewriter, test.input.key_code, test.input.flags, test.type));
172 190
173 #if defined(USE_X11) 191 #if defined(USE_X11)
174 ui::ScopedXI2Event xev; 192 ui::ScopedXI2Event xev;
175 xev.InitKeyEvent(test.type, test.input.key_code, test.input.flags); 193 xev.InitKeyEvent(test.type, test.input.key_code, test.input.flags);
176 XEvent* xevent = xev; 194 XEvent* xevent = xev;
177 if (xevent->xkey.keycode) { 195 if (xevent->xkey.keycode) {
178 ui::KeyEvent xkey_event(xevent, false); 196 ui::KeyEvent xkey_event(xevent, false);
179 // Rewrite the event and check the result. 197 // Rewrite the event and check the result.
180 scoped_ptr<ui::Event> new_event; 198 scoped_ptr<ui::Event> new_event;
181 rewriter->RewriteEvent(xkey_event, &new_event); 199 rewriter->RewriteEvent(xkey_event, &new_event);
182 ui::KeyEvent& rewritten_key_event = 200 ui::KeyEvent& rewritten_key_event =
183 new_event ? *static_cast<ui::KeyEvent*>(new_event.get()) : xkey_event; 201 new_event ? *static_cast<ui::KeyEvent*>(new_event.get()) : xkey_event;
184 std::string native_expected = 202 std::string native_expected =
185 id + GetExpectedResultAsString( 203 GetExpectedResultAsString(
186 test.native_expected.key_code, 204 test.native_expected.key_code,
187 test.native_expected.flags, 205 test.native_expected.flags,
188 test.type); 206 test.type);
189 EXPECT_EQ(native_expected, id + GetKeyEventAsString(rewritten_key_event)); 207 EXPECT_EQ(native_expected, GetKeyEventAsString(rewritten_key_event));
190 } 208 }
191 #endif 209 #endif
192 } 210 }
193 211
194 } // namespace 212 } // namespace
195 213
196 namespace chromeos { 214 namespace chromeos {
197 215
198 class EventRewriterTest : public ash::test::AshTestBase { 216 class EventRewriterTest : public ash::test::AshTestBase {
199 public: 217 public:
(...skipping 18 matching lines...) Expand all
218 virtual void TearDown() { 236 virtual void TearDown() {
219 AshTestBase::TearDown(); 237 AshTestBase::TearDown();
220 // Shutdown() deletes the IME mock object. 238 // Shutdown() deletes the IME mock object.
221 chromeos::input_method::Shutdown(); 239 chromeos::input_method::Shutdown();
222 } 240 }
223 241
224 protected: 242 protected:
225 void TestRewriteNumPadKeys(); 243 void TestRewriteNumPadKeys();
226 void TestRewriteNumPadKeysOnAppleKeyboard(); 244 void TestRewriteNumPadKeysOnAppleKeyboard();
227 245
228 int RewriteMouseEvent(chromeos::EventRewriter* rewriter, 246 const ui::MouseEvent* RewriteMouseButtonEvent(
229 const ui::MouseEvent& event) { 247 chromeos::EventRewriter* rewriter,
230 int flags = event.flags(); 248 const ui::MouseEvent& event,
231 rewriter->RewriteLocatedEventForTesting(event, &flags); 249 scoped_ptr<ui::Event>* new_event) {
232 return flags; 250 rewriter->RewriteMouseButtonEventForTesting(event, new_event);
251 return *new_event ? static_cast<const ui::MouseEvent*>(new_event->get())
252 : &event;
233 } 253 }
234 254
235 chromeos::MockUserManager* mock_user_manager_; // Not owned. 255 chromeos::MockUserManager* mock_user_manager_; // Not owned.
236 chromeos::ScopedUserManagerEnabler user_manager_enabler_; 256 chromeos::ScopedUserManagerEnabler user_manager_enabler_;
237 chromeos::input_method::MockInputMethodManager* input_method_manager_mock_; 257 chromeos::input_method::MockInputMethodManager* input_method_manager_mock_;
238 }; 258 };
239 259
240 TEST_F(EventRewriterTest, TestRewriteCommandToControl) { 260 TEST_F(EventRewriterTest, TestRewriteCommandToControl) {
241 // First, test with a PC keyboard. 261 // First, test with a PC keyboard.
242 TestingPrefServiceSyncable prefs; 262 TestingPrefServiceSyncable prefs;
243 EventRewriter rewriter(NULL); 263 EventRewriter rewriter(NULL);
244 rewriter.DeviceAddedForTesting(0, "PC Keyboard"); 264 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
245 rewriter.set_last_device_id_for_testing(0); 265 rewriter.set_last_keyboard_device_id_for_testing(kKeyboardDeviceId);
246 rewriter.set_pref_service_for_testing(&prefs); 266 rewriter.set_pref_service_for_testing(&prefs);
247 267
248 KeyTestCase pc_keyboard_tests[] = { 268 KeyTestCase pc_keyboard_tests[] = {
249 // VKEY_A, Alt modifier. 269 // VKEY_A, Alt modifier.
250 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 270 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
251 {ui::VKEY_A, ui::EF_ALT_DOWN}, 271 {ui::VKEY_A, ui::EF_ALT_DOWN},
252 {ui::VKEY_A, ui::EF_ALT_DOWN}}, 272 {ui::VKEY_A, ui::EF_ALT_DOWN}},
253 273
254 // VKEY_A, Win modifier. 274 // VKEY_A, Win modifier.
255 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 275 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
(...skipping 10 matching lines...) Expand all
266 {ui::VKEY_LWIN, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN}, 286 {ui::VKEY_LWIN, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN},
267 {ui::VKEY_LWIN, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN}}, 287 {ui::VKEY_LWIN, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN}},
268 288
269 // VKEY_RWIN (right Windows key), Alt modifier. 289 // VKEY_RWIN (right Windows key), Alt modifier.
270 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 290 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
271 {ui::VKEY_RWIN, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN}, 291 {ui::VKEY_RWIN, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN},
272 {ui::VKEY_RWIN, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN}}, 292 {ui::VKEY_RWIN, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN}},
273 }; 293 };
274 294
275 for (size_t i = 0; i < arraysize(pc_keyboard_tests); ++i) { 295 for (size_t i = 0; i < arraysize(pc_keyboard_tests); ++i) {
276 CheckKeyTestCase(1000 + i, &rewriter, pc_keyboard_tests[i]); 296 SCOPED_TRACE(1000 + i);
Daniel Erat 2014/06/25 20:06:13 nit: probably don't need the "1000" now, right? i
kpschoedel 2014/06/25 21:10:40 Done.
297 CheckKeyTestCase(&rewriter, pc_keyboard_tests[i]);
277 } 298 }
278 299
279 // An Apple keyboard reusing the ID, zero. 300 // An Apple keyboard reusing the ID, zero.
280 rewriter.DeviceAddedForTesting(0, "Apple Keyboard"); 301 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "Apple Keyboard");
281 rewriter.set_last_device_id_for_testing(0); 302 rewriter.set_last_keyboard_device_id_for_testing(kKeyboardDeviceId);
282 303
283 KeyTestCase apple_keyboard_tests[] = { 304 KeyTestCase apple_keyboard_tests[] = {
284 // VKEY_A, Alt modifier. 305 // VKEY_A, Alt modifier.
285 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 306 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
286 {ui::VKEY_A, ui::EF_ALT_DOWN}, 307 {ui::VKEY_A, ui::EF_ALT_DOWN},
287 {ui::VKEY_A, ui::EF_ALT_DOWN}}, 308 {ui::VKEY_A, ui::EF_ALT_DOWN}},
288 309
289 // VKEY_A, Win modifier. 310 // VKEY_A, Win modifier.
290 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 311 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
291 {ui::VKEY_A, ui::EF_COMMAND_DOWN}, 312 {ui::VKEY_A, ui::EF_COMMAND_DOWN},
292 {ui::VKEY_A, ui::EF_CONTROL_DOWN}}, 313 {ui::VKEY_A, ui::EF_CONTROL_DOWN}},
293 314
294 // VKEY_A, Alt+Win modifier. 315 // VKEY_A, Alt+Win modifier.
295 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 316 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
296 {ui::VKEY_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN}, 317 {ui::VKEY_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN},
297 {ui::VKEY_A, ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN}}, 318 {ui::VKEY_A, ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN}},
298 319
299 // VKEY_LWIN (left Windows key), Alt modifier. 320 // VKEY_LWIN (left Windows key), Alt modifier.
300 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 321 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
301 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN}, 322 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN},
302 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN}}, 323 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN}},
303 324
304 // VKEY_RWIN (right Windows key), Alt modifier. 325 // VKEY_RWIN (right Windows key), Alt modifier.
305 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 326 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
306 {ui::VKEY_RWIN, ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN}, 327 {ui::VKEY_RWIN, ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN},
307 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN}}, 328 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN}},
308 }; 329 };
309 330
310 for (size_t i = 0; i < arraysize(apple_keyboard_tests); ++i) { 331 for (size_t i = 0; i < arraysize(apple_keyboard_tests); ++i) {
311 CheckKeyTestCase(2000 + i, &rewriter, apple_keyboard_tests[i]); 332 SCOPED_TRACE(2000 + i);
333 CheckKeyTestCase(&rewriter, apple_keyboard_tests[i]);
312 } 334 }
313 } 335 }
314 336
315 // For crbug.com/133896. 337 // For crbug.com/133896.
316 TEST_F(EventRewriterTest, TestRewriteCommandToControlWithControlRemapped) { 338 TEST_F(EventRewriterTest, TestRewriteCommandToControlWithControlRemapped) {
317 // Remap Control to Alt. 339 // Remap Control to Alt.
318 TestingPrefServiceSyncable prefs; 340 TestingPrefServiceSyncable prefs;
319 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 341 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
320 IntegerPrefMember control; 342 IntegerPrefMember control;
321 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); 343 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs);
322 control.SetValue(chromeos::input_method::kAltKey); 344 control.SetValue(chromeos::input_method::kAltKey);
323 345
324 EventRewriter rewriter(NULL); 346 EventRewriter rewriter(NULL);
325 rewriter.set_pref_service_for_testing(&prefs); 347 rewriter.set_pref_service_for_testing(&prefs);
326 rewriter.DeviceAddedForTesting(0, "PC Keyboard"); 348 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
327 rewriter.set_last_device_id_for_testing(0); 349 rewriter.set_last_keyboard_device_id_for_testing(kKeyboardDeviceId);
328 350
329 KeyTestCase pc_keyboard_tests[] = {// Control should be remapped to Alt. 351 KeyTestCase pc_keyboard_tests[] = {// Control should be remapped to Alt.
330 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 352 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
331 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN}, 353 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN},
332 {ui::VKEY_MENU, ui::EF_ALT_DOWN}}, 354 {ui::VKEY_MENU, ui::EF_ALT_DOWN}},
333 }; 355 };
334 356
335 for (size_t i = 0; i < arraysize(pc_keyboard_tests); ++i) { 357 for (size_t i = 0; i < arraysize(pc_keyboard_tests); ++i) {
336 CheckKeyTestCase(1000 + i, &rewriter, pc_keyboard_tests[i]); 358 SCOPED_TRACE(1000 + i);
359 CheckKeyTestCase(&rewriter, pc_keyboard_tests[i]);
337 } 360 }
338 361
339 // An Apple keyboard reusing the ID, zero. 362 // An Apple keyboard reusing the ID, zero.
340 rewriter.DeviceAddedForTesting(0, "Apple Keyboard"); 363 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "Apple Keyboard");
341 rewriter.set_last_device_id_for_testing(0); 364 rewriter.set_last_keyboard_device_id_for_testing(kKeyboardDeviceId);
342 365
343 KeyTestCase apple_keyboard_tests[] = { 366 KeyTestCase apple_keyboard_tests[] = {
344 // VKEY_LWIN (left Command key) with Alt modifier. The remapped Command 367 // VKEY_LWIN (left Command key) with Alt modifier. The remapped Command
345 // key should never be re-remapped to Alt. 368 // key should never be re-remapped to Alt.
346 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 369 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
347 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN}, 370 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN},
348 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN}}, 371 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN}},
349 372
350 // VKEY_RWIN (right Command key) with Alt modifier. The remapped Command 373 // VKEY_RWIN (right Command key) with Alt modifier. The remapped Command
351 // key should never be re-remapped to Alt. 374 // key should never be re-remapped to Alt.
352 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 375 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
353 {ui::VKEY_RWIN, ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN}, 376 {ui::VKEY_RWIN, ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN},
354 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN}}, 377 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN}},
355 }; 378 };
356 379
357 for (size_t i = 0; i < arraysize(apple_keyboard_tests); ++i) { 380 for (size_t i = 0; i < arraysize(apple_keyboard_tests); ++i) {
358 CheckKeyTestCase(2000 + i, &rewriter, apple_keyboard_tests[i]); 381 SCOPED_TRACE(2000 + i);
382 CheckKeyTestCase(&rewriter, apple_keyboard_tests[i]);
359 } 383 }
360 } 384 }
361 385
362 void EventRewriterTest::TestRewriteNumPadKeys() { 386 void EventRewriterTest::TestRewriteNumPadKeys() {
363 TestingPrefServiceSyncable prefs; 387 TestingPrefServiceSyncable prefs;
364 EventRewriter rewriter(NULL); 388 EventRewriter rewriter(NULL);
389 rewriter.set_last_keyboard_device_id_for_testing(kKeyboardDeviceId);
365 rewriter.set_pref_service_for_testing(&prefs); 390 rewriter.set_pref_service_for_testing(&prefs);
366 391
367 KeyTestCase tests[] = { 392 KeyTestCase tests[] = {
368 // XK_KP_Insert (= NumPad 0 without Num Lock), no modifier. 393 // XK_KP_Insert (= NumPad 0 without Num Lock), no modifier.
369 {KeyTestCase::TEST_ALL|KeyTestCase::NUMPAD, ui::ET_KEY_PRESSED, 394 {KeyTestCase::TEST_ALL|KeyTestCase::NUMPAD, ui::ET_KEY_PRESSED,
370 {ui::VKEY_INSERT, ui::EF_NUMPAD_KEY}, 395 {ui::VKEY_INSERT, ui::EF_NUMPAD_KEY},
371 {ui::VKEY_NUMPAD0, ui::EF_NUMPAD_KEY}}, 396 {ui::VKEY_NUMPAD0, ui::EF_NUMPAD_KEY}},
372 397
373 // XK_KP_Insert (= NumPad 0 without Num Lock), Alt modifier. 398 // XK_KP_Insert (= NumPad 0 without Num Lock), Alt modifier.
374 {KeyTestCase::TEST_ALL|KeyTestCase::NUMPAD, ui::ET_KEY_PRESSED, 399 {KeyTestCase::TEST_ALL|KeyTestCase::NUMPAD, ui::ET_KEY_PRESSED,
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
475 {ui::VKEY_NUMPAD8, ui::EF_NUMPAD_KEY}, 500 {ui::VKEY_NUMPAD8, ui::EF_NUMPAD_KEY},
476 {ui::VKEY_NUMPAD8, ui::EF_NUMPAD_KEY}}, 501 {ui::VKEY_NUMPAD8, ui::EF_NUMPAD_KEY}},
477 502
478 // XK_KP_9 (= NumPad 9 with Num Lock), Num Lock modifier. 503 // XK_KP_9 (= NumPad 9 with Num Lock), Num Lock modifier.
479 {KeyTestCase::TEST_ALL|KeyTestCase::NUMPAD, ui::ET_KEY_PRESSED, 504 {KeyTestCase::TEST_ALL|KeyTestCase::NUMPAD, ui::ET_KEY_PRESSED,
480 {ui::VKEY_NUMPAD9, ui::EF_NUMPAD_KEY}, 505 {ui::VKEY_NUMPAD9, ui::EF_NUMPAD_KEY},
481 {ui::VKEY_NUMPAD9, ui::EF_NUMPAD_KEY}}, 506 {ui::VKEY_NUMPAD9, ui::EF_NUMPAD_KEY}},
482 }; 507 };
483 508
484 for (size_t i = 0; i < arraysize(tests); ++i) { 509 for (size_t i = 0; i < arraysize(tests); ++i) {
485 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); 510 SCOPED_TRACE(1000 + i);
511 CheckKeyTestCase(&rewriter, tests[i]);
486 } 512 }
487 } 513 }
488 514
489 TEST_F(EventRewriterTest, TestRewriteNumPadKeys) { 515 TEST_F(EventRewriterTest, TestRewriteNumPadKeys) {
490 TestRewriteNumPadKeys(); 516 TestRewriteNumPadKeys();
491 } 517 }
492 518
493 TEST_F(EventRewriterTest, TestRewriteNumPadKeysWithDiamondKeyFlag) { 519 TEST_F(EventRewriterTest, TestRewriteNumPadKeysWithDiamondKeyFlag) {
494 // Make sure the num lock works correctly even when Diamond key exists. 520 // Make sure the num lock works correctly even when Diamond key exists.
495 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); 521 const CommandLine original_cl(*CommandLine::ForCurrentProcess());
496 CommandLine::ForCurrentProcess()->AppendSwitchASCII( 522 CommandLine::ForCurrentProcess()->AppendSwitchASCII(
497 chromeos::switches::kHasChromeOSDiamondKey, ""); 523 chromeos::switches::kHasChromeOSDiamondKey, "");
498 524
499 TestRewriteNumPadKeys(); 525 TestRewriteNumPadKeys();
500 *CommandLine::ForCurrentProcess() = original_cl; 526 *CommandLine::ForCurrentProcess() = original_cl;
501 } 527 }
502 528
503 // Tests if the rewriter can handle a Command + Num Pad event. 529 // Tests if the rewriter can handle a Command + Num Pad event.
504 void EventRewriterTest::TestRewriteNumPadKeysOnAppleKeyboard() { 530 void EventRewriterTest::TestRewriteNumPadKeysOnAppleKeyboard() {
505 TestingPrefServiceSyncable prefs; 531 TestingPrefServiceSyncable prefs;
506 EventRewriter rewriter(NULL); 532 EventRewriter rewriter(NULL);
507 rewriter.DeviceAddedForTesting(0, "Apple Keyboard"); 533 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "Apple Keyboard");
508 rewriter.set_last_device_id_for_testing(0); 534 rewriter.set_last_keyboard_device_id_for_testing(kKeyboardDeviceId);
509 rewriter.set_pref_service_for_testing(&prefs); 535 rewriter.set_pref_service_for_testing(&prefs);
510 536
511 KeyTestCase tests[] = { 537 KeyTestCase tests[] = {
512 // XK_KP_End (= NumPad 1 without Num Lock), Win modifier. 538 // XK_KP_End (= NumPad 1 without Num Lock), Win modifier.
513 // The result should be "Num Pad 1 with Control + Num Lock modifiers". 539 // The result should be "Num Pad 1 with Control + Num Lock modifiers".
514 {KeyTestCase::TEST_ALL|KeyTestCase::NUMPAD, ui::ET_KEY_PRESSED, 540 {KeyTestCase::TEST_ALL|KeyTestCase::NUMPAD, ui::ET_KEY_PRESSED,
515 {ui::VKEY_END, ui::EF_COMMAND_DOWN | ui::EF_NUMPAD_KEY}, 541 {ui::VKEY_END, ui::EF_COMMAND_DOWN | ui::EF_NUMPAD_KEY},
516 {ui::VKEY_NUMPAD1, ui::EF_CONTROL_DOWN | ui::EF_NUMPAD_KEY}}, 542 {ui::VKEY_NUMPAD1, ui::EF_CONTROL_DOWN | ui::EF_NUMPAD_KEY}},
517 543
518 // XK_KP_1 (= NumPad 1 with Num Lock), Win modifier. 544 // XK_KP_1 (= NumPad 1 with Num Lock), Win modifier.
519 // The result should also be "Num Pad 1 with Control + Num Lock 545 // The result should also be "Num Pad 1 with Control + Num Lock
520 // modifiers". 546 // modifiers".
521 {KeyTestCase::TEST_ALL|KeyTestCase::NUMPAD, ui::ET_KEY_PRESSED, 547 {KeyTestCase::TEST_ALL|KeyTestCase::NUMPAD, ui::ET_KEY_PRESSED,
522 {ui::VKEY_NUMPAD1, ui::EF_COMMAND_DOWN | ui::EF_NUMPAD_KEY}, 548 {ui::VKEY_NUMPAD1, ui::EF_COMMAND_DOWN | ui::EF_NUMPAD_KEY},
523 {ui::VKEY_NUMPAD1, ui::EF_CONTROL_DOWN | ui::EF_NUMPAD_KEY}}, 549 {ui::VKEY_NUMPAD1, ui::EF_CONTROL_DOWN | ui::EF_NUMPAD_KEY}},
524 }; 550 };
525 551
526 for (size_t i = 0; i < arraysize(tests); ++i) { 552 for (size_t i = 0; i < arraysize(tests); ++i) {
527 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); 553 SCOPED_TRACE(1000 + i);
554 CheckKeyTestCase(&rewriter, tests[i]);
528 } 555 }
529 } 556 }
530 557
531 TEST_F(EventRewriterTest, TestRewriteNumPadKeysOnAppleKeyboard) { 558 TEST_F(EventRewriterTest, TestRewriteNumPadKeysOnAppleKeyboard) {
532 TestRewriteNumPadKeysOnAppleKeyboard(); 559 TestRewriteNumPadKeysOnAppleKeyboard();
533 } 560 }
534 561
535 TEST_F(EventRewriterTest, 562 TEST_F(EventRewriterTest,
536 TestRewriteNumPadKeysOnAppleKeyboardWithDiamondKeyFlag) { 563 TestRewriteNumPadKeysOnAppleKeyboardWithDiamondKeyFlag) {
537 // Makes sure the num lock works correctly even when Diamond key exists. 564 // Makes sure the num lock works correctly even when Diamond key exists.
538 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); 565 const CommandLine original_cl(*CommandLine::ForCurrentProcess());
539 CommandLine::ForCurrentProcess()->AppendSwitchASCII( 566 CommandLine::ForCurrentProcess()->AppendSwitchASCII(
540 chromeos::switches::kHasChromeOSDiamondKey, ""); 567 chromeos::switches::kHasChromeOSDiamondKey, "");
541 568
542 TestRewriteNumPadKeysOnAppleKeyboard(); 569 TestRewriteNumPadKeysOnAppleKeyboard();
543 *CommandLine::ForCurrentProcess() = original_cl; 570 *CommandLine::ForCurrentProcess() = original_cl;
544 } 571 }
545 572
546 TEST_F(EventRewriterTest, TestRewriteModifiersNoRemap) { 573 TEST_F(EventRewriterTest, TestRewriteModifiersNoRemap) {
547 TestingPrefServiceSyncable prefs; 574 TestingPrefServiceSyncable prefs;
548 EventRewriter rewriter(NULL); 575 EventRewriter rewriter(NULL);
576 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
549 rewriter.set_pref_service_for_testing(&prefs); 577 rewriter.set_pref_service_for_testing(&prefs);
550 578
551 KeyTestCase tests[] = { 579 KeyTestCase tests[] = {
552 // Press Search. Confirm the event is not rewritten. 580 // Press Search. Confirm the event is not rewritten.
553 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 581 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
554 {ui::VKEY_LWIN, ui::EF_NONE}, 582 {ui::VKEY_LWIN, ui::EF_NONE},
555 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN}}, 583 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN}},
556 584
557 // Press left Control. Confirm the event is not rewritten. 585 // Press left Control. Confirm the event is not rewritten.
558 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 586 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
(...skipping 16 matching lines...) Expand all
575 {ui::VKEY_MENU, ui::EF_ALT_DOWN}}, 603 {ui::VKEY_MENU, ui::EF_ALT_DOWN}},
576 604
577 // Test KeyRelease event, just in case. 605 // Test KeyRelease event, just in case.
578 // Release Search. Confirm the release event is not rewritten. 606 // Release Search. Confirm the release event is not rewritten.
579 {KeyTestCase::TEST_ALL, ui::ET_KEY_RELEASED, 607 {KeyTestCase::TEST_ALL, ui::ET_KEY_RELEASED,
580 {ui::VKEY_LWIN, ui::EF_NONE}, 608 {ui::VKEY_LWIN, ui::EF_NONE},
581 {ui::VKEY_LWIN, ui::EF_NONE}}, 609 {ui::VKEY_LWIN, ui::EF_NONE}},
582 }; 610 };
583 611
584 for (size_t i = 0; i < arraysize(tests); ++i) { 612 for (size_t i = 0; i < arraysize(tests); ++i) {
585 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); 613 SCOPED_TRACE(1000 + i);
614 CheckKeyTestCase(&rewriter, tests[i]);
586 } 615 }
587 } 616 }
588 617
589 TEST_F(EventRewriterTest, TestRewriteModifiersNoRemapMultipleKeys) { 618 TEST_F(EventRewriterTest, TestRewriteModifiersNoRemapMultipleKeys) {
590 TestingPrefServiceSyncable prefs; 619 TestingPrefServiceSyncable prefs;
591 EventRewriter rewriter(NULL); 620 EventRewriter rewriter(NULL);
621 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
592 rewriter.set_pref_service_for_testing(&prefs); 622 rewriter.set_pref_service_for_testing(&prefs);
593 623
594 KeyTestCase tests[] = { 624 KeyTestCase tests[] = {
595 // Press Alt with Shift. Confirm the event is not rewritten. 625 // Press Alt with Shift. Confirm the event is not rewritten.
596 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 626 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
597 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}, 627 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN},
598 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}}, 628 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}},
599 629
600 // Press Search with Caps Lock mask. Confirm the event is not rewritten. 630 // Press Search with Caps Lock mask. Confirm the event is not rewritten.
601 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 631 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
602 {ui::VKEY_LWIN, ui::EF_CAPS_LOCK_DOWN | ui::EF_COMMAND_DOWN}, 632 {ui::VKEY_LWIN, ui::EF_CAPS_LOCK_DOWN | ui::EF_COMMAND_DOWN},
603 {ui::VKEY_LWIN, ui::EF_CAPS_LOCK_DOWN | ui::EF_COMMAND_DOWN}}, 633 {ui::VKEY_LWIN, ui::EF_CAPS_LOCK_DOWN | ui::EF_COMMAND_DOWN}},
604 634
605 // Release Search with Caps Lock mask. Confirm the event is not rewritten. 635 // Release Search with Caps Lock mask. Confirm the event is not rewritten.
606 {KeyTestCase::TEST_ALL, ui::ET_KEY_RELEASED, 636 {KeyTestCase::TEST_ALL, ui::ET_KEY_RELEASED,
607 {ui::VKEY_LWIN, ui::EF_CAPS_LOCK_DOWN}, 637 {ui::VKEY_LWIN, ui::EF_CAPS_LOCK_DOWN},
608 {ui::VKEY_LWIN, ui::EF_CAPS_LOCK_DOWN}}, 638 {ui::VKEY_LWIN, ui::EF_CAPS_LOCK_DOWN}},
609 639
610 // Press Shift+Ctrl+Alt+Search+A. Confirm the event is not rewritten. 640 // Press Shift+Ctrl+Alt+Search+A. Confirm the event is not rewritten.
611 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 641 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
612 {ui::VKEY_B, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | 642 {ui::VKEY_B, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
613 ui::EF_COMMAND_DOWN}, 643 ui::EF_COMMAND_DOWN},
614 {ui::VKEY_B, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | 644 {ui::VKEY_B, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
615 ui::EF_COMMAND_DOWN}}, 645 ui::EF_COMMAND_DOWN}},
616 }; 646 };
617 647
618 for (size_t i = 0; i < arraysize(tests); ++i) { 648 for (size_t i = 0; i < arraysize(tests); ++i) {
619 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); 649 SCOPED_TRACE(1000 + i);
650 CheckKeyTestCase(&rewriter, tests[i]);
620 } 651 }
621 } 652 }
622 653
623 TEST_F(EventRewriterTest, TestRewriteModifiersDisableSome) { 654 TEST_F(EventRewriterTest, TestRewriteModifiersDisableSome) {
624 // Disable Search and Control keys. 655 // Disable Search and Control keys.
625 TestingPrefServiceSyncable prefs; 656 TestingPrefServiceSyncable prefs;
626 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 657 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
627 IntegerPrefMember search; 658 IntegerPrefMember search;
628 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); 659 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs);
629 search.SetValue(chromeos::input_method::kVoidKey); 660 search.SetValue(chromeos::input_method::kVoidKey);
630 IntegerPrefMember control; 661 IntegerPrefMember control;
631 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); 662 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs);
632 control.SetValue(chromeos::input_method::kVoidKey); 663 control.SetValue(chromeos::input_method::kVoidKey);
633 664
634 EventRewriter rewriter(NULL); 665 EventRewriter rewriter(NULL);
666 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
635 rewriter.set_pref_service_for_testing(&prefs); 667 rewriter.set_pref_service_for_testing(&prefs);
636 668
637 KeyTestCase disabled_modifier_tests[] = { 669 KeyTestCase disabled_modifier_tests[] = {
638 // Press Alt with Shift. This key press shouldn't be affected by the 670 // Press Alt with Shift. This key press shouldn't be affected by the
639 // pref. Confirm the event is not rewritten. 671 // pref. Confirm the event is not rewritten.
640 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 672 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
641 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}, 673 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN},
642 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}}, 674 {ui::VKEY_MENU, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN}},
643 675
644 // Press Search. Confirm the event is now VKEY_UNKNOWN. 676 // Press Search. Confirm the event is now VKEY_UNKNOWN.
(...skipping 19 matching lines...) Expand all
664 {ui::VKEY_A, ui::EF_NONE}}, 696 {ui::VKEY_A, ui::EF_NONE}},
665 697
666 // Press Control+Search+Alt+a. Confirm the event is now VKEY_A only with 698 // Press Control+Search+Alt+a. Confirm the event is now VKEY_A only with
667 // the Alt modifier. 699 // the Alt modifier.
668 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 700 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
669 {ui::VKEY_A, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN}, 701 {ui::VKEY_A, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN},
670 {ui::VKEY_A, ui::EF_ALT_DOWN}}, 702 {ui::VKEY_A, ui::EF_ALT_DOWN}},
671 }; 703 };
672 704
673 for (size_t i = 0; i < arraysize(disabled_modifier_tests); ++i) { 705 for (size_t i = 0; i < arraysize(disabled_modifier_tests); ++i) {
674 CheckKeyTestCase(1000 + i, &rewriter, disabled_modifier_tests[i]); 706 SCOPED_TRACE(1000 + i);
707 CheckKeyTestCase(&rewriter, disabled_modifier_tests[i]);
675 } 708 }
676 709
677 // Remap Alt to Control. 710 // Remap Alt to Control.
678 IntegerPrefMember alt; 711 IntegerPrefMember alt;
679 alt.Init(prefs::kLanguageRemapAltKeyTo, &prefs); 712 alt.Init(prefs::kLanguageRemapAltKeyTo, &prefs);
680 alt.SetValue(chromeos::input_method::kControlKey); 713 alt.SetValue(chromeos::input_method::kControlKey);
681 714
682 KeyTestCase tests[] = { 715 KeyTestCase tests[] = {
683 // Press left Alt. Confirm the event is now VKEY_CONTROL 716 // Press left Alt. Confirm the event is now VKEY_CONTROL
684 // even though the Control key itself is disabled. 717 // even though the Control key itself is disabled.
685 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 718 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
686 {ui::VKEY_MENU, ui::EF_ALT_DOWN}, 719 {ui::VKEY_MENU, ui::EF_ALT_DOWN},
687 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN}}, 720 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN}},
688 721
689 // Press Alt+a. Confirm the event is now Control+a even though the Control 722 // Press Alt+a. Confirm the event is now Control+a even though the Control
690 // key itself is disabled. 723 // key itself is disabled.
691 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 724 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
692 {ui::VKEY_A, ui::EF_ALT_DOWN}, 725 {ui::VKEY_A, ui::EF_ALT_DOWN},
693 {ui::VKEY_A, ui::EF_CONTROL_DOWN}}, 726 {ui::VKEY_A, ui::EF_CONTROL_DOWN}},
694 }; 727 };
695 728
696 for (size_t i = 0; i < arraysize(tests); ++i) { 729 for (size_t i = 0; i < arraysize(tests); ++i) {
697 CheckKeyTestCase(2000 + i, &rewriter, tests[i]); 730 SCOPED_TRACE(2000 + i);
731 CheckKeyTestCase(&rewriter, tests[i]);
698 } 732 }
699 } 733 }
700 734
701 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToControl) { 735 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToControl) {
702 // Remap Search to Control. 736 // Remap Search to Control.
703 TestingPrefServiceSyncable prefs; 737 TestingPrefServiceSyncable prefs;
704 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 738 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
705 IntegerPrefMember search; 739 IntegerPrefMember search;
706 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); 740 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs);
707 search.SetValue(chromeos::input_method::kControlKey); 741 search.SetValue(chromeos::input_method::kControlKey);
708 742
709 EventRewriter rewriter(NULL); 743 EventRewriter rewriter(NULL);
744 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
710 rewriter.set_pref_service_for_testing(&prefs); 745 rewriter.set_pref_service_for_testing(&prefs);
711 746
712 KeyTestCase s_tests[] = { 747 KeyTestCase s_tests[] = {
713 // Press Search. Confirm the event is now VKEY_CONTROL. 748 // Press Search. Confirm the event is now VKEY_CONTROL.
714 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 749 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
715 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN}, 750 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN},
716 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN}}, 751 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN}},
717 }; 752 };
718 753
719 for (size_t i = 0; i < arraysize(s_tests); ++i) { 754 for (size_t i = 0; i < arraysize(s_tests); ++i) {
720 CheckKeyTestCase(1000 + i, &rewriter, s_tests[i]); 755 SCOPED_TRACE(1000 + i);
756 CheckKeyTestCase(&rewriter, s_tests[i]);
721 } 757 }
722 758
723 // Remap Alt to Control too. 759 // Remap Alt to Control too.
724 IntegerPrefMember alt; 760 IntegerPrefMember alt;
725 alt.Init(prefs::kLanguageRemapAltKeyTo, &prefs); 761 alt.Init(prefs::kLanguageRemapAltKeyTo, &prefs);
726 alt.SetValue(chromeos::input_method::kControlKey); 762 alt.SetValue(chromeos::input_method::kControlKey);
727 763
728 KeyTestCase sa_tests[] = { 764 KeyTestCase sa_tests[] = {
729 // Press Alt. Confirm the event is now VKEY_CONTROL. 765 // Press Alt. Confirm the event is now VKEY_CONTROL.
730 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 766 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
(...skipping 20 matching lines...) Expand all
751 787
752 // Press Shift+Control+Alt+Search+B. Confirm the event is now B with Shift 788 // Press Shift+Control+Alt+Search+B. Confirm the event is now B with Shift
753 // and Control modifiers. 789 // and Control modifiers.
754 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 790 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
755 {ui::VKEY_B, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | 791 {ui::VKEY_B, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
756 ui::EF_COMMAND_DOWN}, 792 ui::EF_COMMAND_DOWN},
757 {ui::VKEY_B, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN}}, 793 {ui::VKEY_B, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN}},
758 }; 794 };
759 795
760 for (size_t i = 0; i < arraysize(sa_tests); ++i) { 796 for (size_t i = 0; i < arraysize(sa_tests); ++i) {
761 CheckKeyTestCase(2000 + i, &rewriter, sa_tests[i]); 797 SCOPED_TRACE(2000 + i);
798 CheckKeyTestCase(&rewriter, sa_tests[i]);
762 } 799 }
763 } 800 }
764 801
765 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToEscape) { 802 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToEscape) {
766 // Remap Search to ESC. 803 // Remap Search to ESC.
767 TestingPrefServiceSyncable prefs; 804 TestingPrefServiceSyncable prefs;
768 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 805 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
769 IntegerPrefMember search; 806 IntegerPrefMember search;
770 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); 807 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs);
771 search.SetValue(chromeos::input_method::kEscapeKey); 808 search.SetValue(chromeos::input_method::kEscapeKey);
772 809
773 EventRewriter rewriter(NULL); 810 EventRewriter rewriter(NULL);
811 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
774 rewriter.set_pref_service_for_testing(&prefs); 812 rewriter.set_pref_service_for_testing(&prefs);
775 813
776 KeyTestCase tests[] = {// Press Search. Confirm the event is now VKEY_ESCAPE. 814 KeyTestCase tests[] = {// Press Search. Confirm the event is now VKEY_ESCAPE.
777 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 815 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
778 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN}, 816 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN},
779 {ui::VKEY_ESCAPE, ui::EF_NONE}}, 817 {ui::VKEY_ESCAPE, ui::EF_NONE}},
780 }; 818 };
781 819
782 for (size_t i = 0; i < arraysize(tests); ++i) { 820 for (size_t i = 0; i < arraysize(tests); ++i) {
783 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); 821 SCOPED_TRACE(1000 + i);
822 CheckKeyTestCase(&rewriter, tests[i]);
784 } 823 }
785 } 824 }
786 825
787 TEST_F(EventRewriterTest, TestRewriteModifiersRemapMany) { 826 TEST_F(EventRewriterTest, TestRewriteModifiersRemapMany) {
788 // Remap Search to Alt. 827 // Remap Search to Alt.
789 TestingPrefServiceSyncable prefs; 828 TestingPrefServiceSyncable prefs;
790 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 829 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
791 IntegerPrefMember search; 830 IntegerPrefMember search;
792 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); 831 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs);
793 search.SetValue(chromeos::input_method::kAltKey); 832 search.SetValue(chromeos::input_method::kAltKey);
794 833
795 EventRewriter rewriter(NULL); 834 EventRewriter rewriter(NULL);
835 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
796 rewriter.set_pref_service_for_testing(&prefs); 836 rewriter.set_pref_service_for_testing(&prefs);
797 837
798 KeyTestCase s2a_tests[] = { 838 KeyTestCase s2a_tests[] = {
799 // Press Search. Confirm the event is now VKEY_MENU. 839 // Press Search. Confirm the event is now VKEY_MENU.
800 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 840 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
801 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN}, 841 {ui::VKEY_LWIN, ui::EF_COMMAND_DOWN},
802 {ui::VKEY_MENU, ui::EF_ALT_DOWN}}, 842 {ui::VKEY_MENU, ui::EF_ALT_DOWN}},
803 }; 843 };
804 844
805 for (size_t i = 0; i < arraysize(s2a_tests); ++i) { 845 for (size_t i = 0; i < arraysize(s2a_tests); ++i) {
806 CheckKeyTestCase(1000 + i, &rewriter, s2a_tests[i]); 846 SCOPED_TRACE(1000 + i);
847 CheckKeyTestCase(&rewriter, s2a_tests[i]);
807 } 848 }
808 849
809 // Remap Alt to Control. 850 // Remap Alt to Control.
810 IntegerPrefMember alt; 851 IntegerPrefMember alt;
811 alt.Init(prefs::kLanguageRemapAltKeyTo, &prefs); 852 alt.Init(prefs::kLanguageRemapAltKeyTo, &prefs);
812 alt.SetValue(chromeos::input_method::kControlKey); 853 alt.SetValue(chromeos::input_method::kControlKey);
813 854
814 KeyTestCase a2c_tests[] = { 855 KeyTestCase a2c_tests[] = {
815 // Press left Alt. Confirm the event is now VKEY_CONTROL. 856 // Press left Alt. Confirm the event is now VKEY_CONTROL.
816 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 857 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
817 {ui::VKEY_MENU, ui::EF_ALT_DOWN}, 858 {ui::VKEY_MENU, ui::EF_ALT_DOWN},
818 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN}}, 859 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN}},
819 }; 860 };
820 861
821 for (size_t i = 0; i < arraysize(a2c_tests); ++i) { 862 for (size_t i = 0; i < arraysize(a2c_tests); ++i) {
822 CheckKeyTestCase(2000 + i, &rewriter, a2c_tests[i]); 863 SCOPED_TRACE(2000 + i);
864 CheckKeyTestCase(&rewriter, a2c_tests[i]);
823 } 865 }
824 866
825 // Remap Control to Search. 867 // Remap Control to Search.
826 IntegerPrefMember control; 868 IntegerPrefMember control;
827 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); 869 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs);
828 control.SetValue(chromeos::input_method::kSearchKey); 870 control.SetValue(chromeos::input_method::kSearchKey);
829 871
830 KeyTestCase c2s_tests[] = { 872 KeyTestCase c2s_tests[] = {
831 // Press left Control. Confirm the event is now VKEY_LWIN. 873 // Press left Control. Confirm the event is now VKEY_LWIN.
832 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 874 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
(...skipping 16 matching lines...) Expand all
849 891
850 // Press Shift+Control+Alt+Search+B 892 // Press Shift+Control+Alt+Search+B
851 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 893 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
852 {ui::VKEY_B, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | 894 {ui::VKEY_B, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
853 ui::EF_COMMAND_DOWN}, 895 ui::EF_COMMAND_DOWN},
854 {ui::VKEY_B, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | 896 {ui::VKEY_B, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
855 ui::EF_COMMAND_DOWN}}, 897 ui::EF_COMMAND_DOWN}},
856 }; 898 };
857 899
858 for (size_t i = 0; i < arraysize(c2s_tests); ++i) { 900 for (size_t i = 0; i < arraysize(c2s_tests); ++i) {
859 CheckKeyTestCase(3000 + i, &rewriter, c2s_tests[i]); 901 SCOPED_TRACE(3000 + i);
902 CheckKeyTestCase(&rewriter, c2s_tests[i]);
860 } 903 }
861 } 904 }
862 905
863 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToCapsLock) { 906 TEST_F(EventRewriterTest, TestRewriteModifiersRemapToCapsLock) {
864 // Remap Search to Caps Lock. 907 // Remap Search to Caps Lock.
865 TestingPrefServiceSyncable prefs; 908 TestingPrefServiceSyncable prefs;
866 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 909 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
867 IntegerPrefMember search; 910 IntegerPrefMember search;
868 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); 911 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs);
869 search.SetValue(chromeos::input_method::kCapsLockKey); 912 search.SetValue(chromeos::input_method::kCapsLockKey);
870 913
871 chromeos::input_method::FakeImeKeyboard ime_keyboard; 914 chromeos::input_method::FakeImeKeyboard ime_keyboard;
872 EventRewriter rewriter(NULL); 915 EventRewriter rewriter(NULL);
916 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
873 rewriter.set_pref_service_for_testing(&prefs); 917 rewriter.set_pref_service_for_testing(&prefs);
874 rewriter.set_ime_keyboard_for_testing(&ime_keyboard); 918 rewriter.set_ime_keyboard_for_testing(&ime_keyboard);
875 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); 919 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_);
876 920
877 // Press Search. 921 // Press Search.
878 EXPECT_EQ( 922 EXPECT_EQ(
879 GetExpectedResultAsString(ui::VKEY_CAPITAL, 923 GetExpectedResultAsString(ui::VKEY_CAPITAL,
880 ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN, 924 ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN,
881 ui::ET_KEY_PRESSED), 925 ui::ET_KEY_PRESSED),
882 GetRewrittenEventAsString( 926 GetRewrittenEventAsString(
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
933 &rewriter, ui::VKEY_CAPITAL, ui::EF_NONE, ui::ET_KEY_RELEASED)); 977 &rewriter, ui::VKEY_CAPITAL, ui::EF_NONE, ui::ET_KEY_RELEASED));
934 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); 978 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_);
935 } 979 }
936 980
937 TEST_F(EventRewriterTest, TestRewriteCapsLock) { 981 TEST_F(EventRewriterTest, TestRewriteCapsLock) {
938 TestingPrefServiceSyncable prefs; 982 TestingPrefServiceSyncable prefs;
939 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 983 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
940 984
941 chromeos::input_method::FakeImeKeyboard ime_keyboard; 985 chromeos::input_method::FakeImeKeyboard ime_keyboard;
942 EventRewriter rewriter(NULL); 986 EventRewriter rewriter(NULL);
987 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
943 rewriter.set_pref_service_for_testing(&prefs); 988 rewriter.set_pref_service_for_testing(&prefs);
944 rewriter.set_ime_keyboard_for_testing(&ime_keyboard); 989 rewriter.set_ime_keyboard_for_testing(&ime_keyboard);
945 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_); 990 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_);
946 991
947 // On Chrome OS, CapsLock is mapped to F16 with Mod3Mask. 992 // On Chrome OS, CapsLock is mapped to F16 with Mod3Mask.
948 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL, 993 EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL,
949 ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN, 994 ui::EF_CAPS_LOCK_DOWN | ui::EF_MOD3_DOWN,
950 ui::ET_KEY_PRESSED), 995 ui::ET_KEY_PRESSED),
951 GetRewrittenEventAsString( 996 GetRewrittenEventAsString(
952 &rewriter, ui::VKEY_F16, ui::EF_MOD3_DOWN, ui::ET_KEY_PRESSED)); 997 &rewriter, ui::VKEY_F16, ui::EF_MOD3_DOWN, ui::ET_KEY_PRESSED));
953 EXPECT_TRUE(ime_keyboard.caps_lock_is_enabled_); 998 EXPECT_TRUE(ime_keyboard.caps_lock_is_enabled_);
954 } 999 }
955 1000
956 TEST_F(EventRewriterTest, TestRewriteDiamondKey) { 1001 TEST_F(EventRewriterTest, TestRewriteDiamondKey) {
957 TestingPrefServiceSyncable prefs; 1002 TestingPrefServiceSyncable prefs;
958 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1003 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
959 1004
960 chromeos::input_method::FakeImeKeyboard ime_keyboard; 1005 chromeos::input_method::FakeImeKeyboard ime_keyboard;
961 EventRewriter rewriter(NULL); 1006 EventRewriter rewriter(NULL);
1007 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
962 rewriter.set_pref_service_for_testing(&prefs); 1008 rewriter.set_pref_service_for_testing(&prefs);
963 rewriter.set_ime_keyboard_for_testing(&ime_keyboard); 1009 rewriter.set_ime_keyboard_for_testing(&ime_keyboard);
964 1010
965 KeyTestCase tests[] = { 1011 KeyTestCase tests[] = {
966 // F15 should work as Ctrl when --has-chromeos-diamond-key is not 1012 // F15 should work as Ctrl when --has-chromeos-diamond-key is not
967 // specified. 1013 // specified.
968 {KeyTestCase::TEST_VKEY, 1014 {KeyTestCase::TEST_VKEY,
969 ui::ET_KEY_PRESSED, 1015 ui::ET_KEY_PRESSED,
970 {ui::VKEY_F15, ui::EF_NONE}, 1016 {ui::VKEY_F15, ui::EF_NONE},
971 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN}}, 1017 {ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN}},
972 1018
973 // However, Mod2Mask should not be rewritten to CtrlMask when 1019 // However, Mod2Mask should not be rewritten to CtrlMask when
974 // --has-chromeos-diamond-key is not specified. 1020 // --has-chromeos-diamond-key is not specified.
975 {KeyTestCase::TEST_VKEY, 1021 {KeyTestCase::TEST_VKEY,
976 ui::ET_KEY_PRESSED, 1022 ui::ET_KEY_PRESSED,
977 {ui::VKEY_A, ui::EF_NONE}, 1023 {ui::VKEY_A, ui::EF_NONE},
978 {ui::VKEY_A, ui::EF_NONE}}, 1024 {ui::VKEY_A, ui::EF_NONE}},
979 }; 1025 };
980 1026
981 for (size_t i = 0; i < arraysize(tests); ++i) { 1027 for (size_t i = 0; i < arraysize(tests); ++i) {
982 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); 1028 SCOPED_TRACE(1000 + i);
1029 CheckKeyTestCase(&rewriter, tests[i]);
983 } 1030 }
984 } 1031 }
1032
985 TEST_F(EventRewriterTest, TestRewriteDiamondKeyWithFlag) { 1033 TEST_F(EventRewriterTest, TestRewriteDiamondKeyWithFlag) {
986 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); 1034 const CommandLine original_cl(*CommandLine::ForCurrentProcess());
987 CommandLine::ForCurrentProcess()->AppendSwitchASCII( 1035 CommandLine::ForCurrentProcess()->AppendSwitchASCII(
988 chromeos::switches::kHasChromeOSDiamondKey, ""); 1036 chromeos::switches::kHasChromeOSDiamondKey, "");
989 1037
990 TestingPrefServiceSyncable prefs; 1038 TestingPrefServiceSyncable prefs;
991 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1039 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
992 1040
993 chromeos::input_method::FakeImeKeyboard ime_keyboard; 1041 chromeos::input_method::FakeImeKeyboard ime_keyboard;
994 EventRewriter rewriter(NULL); 1042 EventRewriter rewriter(NULL);
1043 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
995 rewriter.set_pref_service_for_testing(&prefs); 1044 rewriter.set_pref_service_for_testing(&prefs);
996 rewriter.set_ime_keyboard_for_testing(&ime_keyboard); 1045 rewriter.set_ime_keyboard_for_testing(&ime_keyboard);
997 1046
998 // By default, F15 should work as Control. 1047 // By default, F15 should work as Control.
999 EXPECT_EQ(GetExpectedResultAsString( 1048 EXPECT_EQ(GetExpectedResultAsString(
1000 ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN, ui::ET_KEY_PRESSED), 1049 ui::VKEY_CONTROL, ui::EF_CONTROL_DOWN, ui::ET_KEY_PRESSED),
1001 GetRewrittenEventAsString( 1050 GetRewrittenEventAsString(
1002 &rewriter, ui::VKEY_F15, ui::EF_NONE, ui::ET_KEY_PRESSED)); 1051 &rewriter, ui::VKEY_F15, ui::EF_NONE, ui::ET_KEY_PRESSED));
1003 1052
1004 IntegerPrefMember diamond; 1053 IntegerPrefMember diamond;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1037 1086
1038 TEST_F(EventRewriterTest, TestRewriteCapsLockToControl) { 1087 TEST_F(EventRewriterTest, TestRewriteCapsLockToControl) {
1039 // Remap CapsLock to Control. 1088 // Remap CapsLock to Control.
1040 TestingPrefServiceSyncable prefs; 1089 TestingPrefServiceSyncable prefs;
1041 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1090 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1042 IntegerPrefMember control; 1091 IntegerPrefMember control;
1043 control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs); 1092 control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs);
1044 control.SetValue(chromeos::input_method::kControlKey); 1093 control.SetValue(chromeos::input_method::kControlKey);
1045 1094
1046 EventRewriter rewriter(NULL); 1095 EventRewriter rewriter(NULL);
1096 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
1047 rewriter.set_pref_service_for_testing(&prefs); 1097 rewriter.set_pref_service_for_testing(&prefs);
1048 1098
1049 KeyTestCase tests[] = { 1099 KeyTestCase tests[] = {
1050 // Press CapsLock+a. Confirm that Mod3Mask is rewritten to ControlMask. 1100 // Press CapsLock+a. Confirm that Mod3Mask is rewritten to ControlMask.
1051 // On Chrome OS, CapsLock works as a Mod3 modifier. 1101 // On Chrome OS, CapsLock works as a Mod3 modifier.
1052 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 1102 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
1053 {ui::VKEY_A, ui::EF_MOD3_DOWN}, 1103 {ui::VKEY_A, ui::EF_MOD3_DOWN},
1054 {ui::VKEY_A, ui::EF_CONTROL_DOWN}}, 1104 {ui::VKEY_A, ui::EF_CONTROL_DOWN}},
1055 1105
1056 // Press Control+CapsLock+a. Confirm that Mod3Mask is rewritten to 1106 // Press Control+CapsLock+a. Confirm that Mod3Mask is rewritten to
1057 // ControlMask 1107 // ControlMask
1058 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 1108 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
1059 {ui::VKEY_A, ui::EF_CONTROL_DOWN | ui::EF_MOD3_DOWN}, 1109 {ui::VKEY_A, ui::EF_CONTROL_DOWN | ui::EF_MOD3_DOWN},
1060 {ui::VKEY_A, ui::EF_CONTROL_DOWN}}, 1110 {ui::VKEY_A, ui::EF_CONTROL_DOWN}},
1061 1111
1062 // Press Alt+CapsLock+a. Confirm that Mod3Mask is rewritten to 1112 // Press Alt+CapsLock+a. Confirm that Mod3Mask is rewritten to
1063 // ControlMask. 1113 // ControlMask.
1064 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 1114 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
1065 {ui::VKEY_A, ui::EF_ALT_DOWN | ui::EF_MOD3_DOWN}, 1115 {ui::VKEY_A, ui::EF_ALT_DOWN | ui::EF_MOD3_DOWN},
1066 {ui::VKEY_A, ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN}}, 1116 {ui::VKEY_A, ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN}},
1067 }; 1117 };
1068 1118
1069 for (size_t i = 0; i < arraysize(tests); ++i) { 1119 for (size_t i = 0; i < arraysize(tests); ++i) {
1070 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); 1120 SCOPED_TRACE(1000 + i);
1121 CheckKeyTestCase(&rewriter, tests[i]);
1071 } 1122 }
1072 } 1123 }
1073 1124
1074 TEST_F(EventRewriterTest, TestRewriteCapsLockMod3InUse) { 1125 TEST_F(EventRewriterTest, TestRewriteCapsLockMod3InUse) {
1075 // Remap CapsLock to Control. 1126 // Remap CapsLock to Control.
1076 TestingPrefServiceSyncable prefs; 1127 TestingPrefServiceSyncable prefs;
1077 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1128 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1078 IntegerPrefMember control; 1129 IntegerPrefMember control;
1079 control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs); 1130 control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs);
1080 control.SetValue(chromeos::input_method::kControlKey); 1131 control.SetValue(chromeos::input_method::kControlKey);
1081 1132
1082 EventRewriter rewriter(NULL); 1133 EventRewriter rewriter(NULL);
1134 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
1083 rewriter.set_pref_service_for_testing(&prefs); 1135 rewriter.set_pref_service_for_testing(&prefs);
1084 input_method_manager_mock_->set_mod3_used(true); 1136 input_method_manager_mock_->set_mod3_used(true);
1085 1137
1086 // Press CapsLock+a. Confirm that Mod3Mask is NOT rewritten to ControlMask 1138 // Press CapsLock+a. Confirm that Mod3Mask is NOT rewritten to ControlMask
1087 // when Mod3Mask is already in use by the current XKB layout. 1139 // when Mod3Mask is already in use by the current XKB layout.
1088 EXPECT_EQ( 1140 EXPECT_EQ(
1089 GetExpectedResultAsString(ui::VKEY_A, ui::EF_NONE, ui::ET_KEY_PRESSED), 1141 GetExpectedResultAsString(ui::VKEY_A, ui::EF_NONE, ui::ET_KEY_PRESSED),
1090 GetRewrittenEventAsString( 1142 GetRewrittenEventAsString(
1091 &rewriter, ui::VKEY_A, ui::EF_NONE, ui::ET_KEY_PRESSED)); 1143 &rewriter, ui::VKEY_A, ui::EF_NONE, ui::ET_KEY_PRESSED));
1092 1144
1093 input_method_manager_mock_->set_mod3_used(false); 1145 input_method_manager_mock_->set_mod3_used(false);
1094 } 1146 }
1095 1147
1096 TEST_F(EventRewriterTest, TestRewriteExtendedKeys) { 1148 TEST_F(EventRewriterTest, TestRewriteExtendedKeys) {
1097 TestingPrefServiceSyncable prefs; 1149 TestingPrefServiceSyncable prefs;
1098 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1150 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1099 EventRewriter rewriter(NULL); 1151 EventRewriter rewriter(NULL);
1100 rewriter.DeviceAddedForTesting(0, "PC Keyboard"); 1152 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
1101 rewriter.set_last_device_id_for_testing(0); 1153 rewriter.set_last_keyboard_device_id_for_testing(kKeyboardDeviceId);
1102 rewriter.set_pref_service_for_testing(&prefs); 1154 rewriter.set_pref_service_for_testing(&prefs);
1103 1155
1104 KeyTestCase tests[] = { 1156 KeyTestCase tests[] = {
1105 // Alt+Backspace -> Delete 1157 // Alt+Backspace -> Delete
1106 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 1158 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
1107 {ui::VKEY_BACK, ui::EF_ALT_DOWN}, 1159 {ui::VKEY_BACK, ui::EF_ALT_DOWN},
1108 {ui::VKEY_DELETE, ui::EF_NONE}}, 1160 {ui::VKEY_DELETE, ui::EF_NONE}},
1109 // Control+Alt+Backspace -> Control+Delete 1161 // Control+Alt+Backspace -> Control+Delete
1110 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 1162 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
1111 {ui::VKEY_BACK, ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN}, 1163 {ui::VKEY_BACK, ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN},
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
1191 // Search+Period -> Insert 1243 // Search+Period -> Insert
1192 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 1244 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
1193 {ui::VKEY_OEM_PERIOD, ui::EF_COMMAND_DOWN}, 1245 {ui::VKEY_OEM_PERIOD, ui::EF_COMMAND_DOWN},
1194 {ui::VKEY_INSERT, ui::EF_NONE}}, 1246 {ui::VKEY_INSERT, ui::EF_NONE}},
1195 // Control+Search+Period -> Control+Insert 1247 // Control+Search+Period -> Control+Insert
1196 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 1248 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
1197 {ui::VKEY_OEM_PERIOD, ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN}, 1249 {ui::VKEY_OEM_PERIOD, ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN},
1198 {ui::VKEY_INSERT, ui::EF_CONTROL_DOWN}}}; 1250 {ui::VKEY_INSERT, ui::EF_CONTROL_DOWN}}};
1199 1251
1200 for (size_t i = 0; i < arraysize(tests); ++i) { 1252 for (size_t i = 0; i < arraysize(tests); ++i) {
1201 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); 1253 SCOPED_TRACE(1000 + i);
1254 CheckKeyTestCase(&rewriter, tests[i]);
1202 } 1255 }
1203 } 1256 }
1204 1257
1205 TEST_F(EventRewriterTest, TestRewriteFunctionKeys) { 1258 TEST_F(EventRewriterTest, TestRewriteFunctionKeys) {
1206 TestingPrefServiceSyncable prefs; 1259 TestingPrefServiceSyncable prefs;
1207 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1260 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1208 EventRewriter rewriter(NULL); 1261 EventRewriter rewriter(NULL);
1262 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
1209 rewriter.set_pref_service_for_testing(&prefs); 1263 rewriter.set_pref_service_for_testing(&prefs);
1210 1264
1211 FunctionKeyTestCase tests[] = { 1265 FunctionKeyTestCase tests[] = {
1212 // F1 -> Back 1266 // F1 -> Back
1213 {ui::ET_KEY_PRESSED, 1267 {ui::ET_KEY_PRESSED,
1214 {ui::VKEY_F1, ui::EF_NONE}, 1268 {ui::VKEY_F1, ui::EF_NONE},
1215 {ui::VKEY_BROWSER_BACK, ui::EF_NONE}, 1269 {ui::VKEY_BROWSER_BACK, ui::EF_NONE},
1216 {ui::VKEY_BROWSER_BACK, ui::EF_FUNCTION_KEY}}, 1270 {ui::VKEY_BROWSER_BACK, ui::EF_FUNCTION_KEY}},
1217 {ui::ET_KEY_PRESSED, 1271 {ui::ET_KEY_PRESSED,
1218 {ui::VKEY_F1, ui::EF_CONTROL_DOWN}, 1272 {ui::VKEY_F1, ui::EF_CONTROL_DOWN},
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after
1512 {ui::VKEY_F11, ui::EF_COMMAND_DOWN}, 1566 {ui::VKEY_F11, ui::EF_COMMAND_DOWN},
1513 {ui::VKEY_F11, ui::EF_NONE}, 1567 {ui::VKEY_F11, ui::EF_NONE},
1514 {ui::VKEY_F11, ui::EF_FUNCTION_KEY}}, 1568 {ui::VKEY_F11, ui::EF_FUNCTION_KEY}},
1515 {ui::ET_KEY_PRESSED, 1569 {ui::ET_KEY_PRESSED,
1516 {ui::VKEY_F12, ui::EF_COMMAND_DOWN}, 1570 {ui::VKEY_F12, ui::EF_COMMAND_DOWN},
1517 {ui::VKEY_F12, ui::EF_NONE}, 1571 {ui::VKEY_F12, ui::EF_NONE},
1518 {ui::VKEY_F12, ui::EF_FUNCTION_KEY}}, 1572 {ui::VKEY_F12, ui::EF_FUNCTION_KEY}},
1519 }; 1573 };
1520 1574
1521 for (size_t i = 0; i < arraysize(tests); ++i) { 1575 for (size_t i = 0; i < arraysize(tests); ++i) {
1522 CheckFunctionKeyTestCase(1000 + i, &rewriter, tests[i]); 1576 SCOPED_TRACE(1000 + i);
1577 CheckFunctionKeyTestCase(&rewriter, tests[i]);
1523 } 1578 }
1524 } 1579 }
1525 1580
1526 TEST_F(EventRewriterTest, TestRewriteExtendedKeysWithSearchRemapped) { 1581 TEST_F(EventRewriterTest, TestRewriteExtendedKeysWithSearchRemapped) {
1527 const CommandLine original_cl(*CommandLine::ForCurrentProcess()); 1582 const CommandLine original_cl(*CommandLine::ForCurrentProcess());
1528 1583
1529 // Remap Search to Control. 1584 // Remap Search to Control.
1530 TestingPrefServiceSyncable prefs; 1585 TestingPrefServiceSyncable prefs;
1531 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1586 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1532 IntegerPrefMember search; 1587 IntegerPrefMember search;
1533 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs); 1588 search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs);
1534 search.SetValue(chromeos::input_method::kControlKey); 1589 search.SetValue(chromeos::input_method::kControlKey);
1535 1590
1536 EventRewriter rewriter(NULL); 1591 EventRewriter rewriter(NULL);
1592 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
1537 rewriter.set_pref_service_for_testing(&prefs); 1593 rewriter.set_pref_service_for_testing(&prefs);
1538 1594
1539 CommandLine::ForCurrentProcess()->AppendSwitchASCII( 1595 CommandLine::ForCurrentProcess()->AppendSwitchASCII(
1540 chromeos::switches::kHasChromeOSKeyboard, ""); 1596 chromeos::switches::kHasChromeOSKeyboard, "");
1541 1597
1542 KeyTestCase tests[] = { 1598 KeyTestCase tests[] = {
1543 // Alt+Search+Down -> End 1599 // Alt+Search+Down -> End
1544 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 1600 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
1545 {ui::VKEY_DOWN, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN}, 1601 {ui::VKEY_DOWN, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN},
1546 {ui::VKEY_END, ui::EF_NONE}}, 1602 {ui::VKEY_END, ui::EF_NONE}},
1547 1603
1548 // Shift+Alt+Search+Down -> Shift+End 1604 // Shift+Alt+Search+Down -> Shift+End
1549 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED, 1605 {KeyTestCase::TEST_ALL, ui::ET_KEY_PRESSED,
1550 {ui::VKEY_DOWN, 1606 {ui::VKEY_DOWN,
1551 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN}, 1607 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN},
1552 {ui::VKEY_END, ui::EF_SHIFT_DOWN}}, 1608 {ui::VKEY_END, ui::EF_SHIFT_DOWN}},
1553 }; 1609 };
1554 1610
1555 for (size_t i = 0; i < arraysize(tests); ++i) { 1611 for (size_t i = 0; i < arraysize(tests); ++i) {
1556 CheckKeyTestCase(1000 + i, &rewriter, tests[i]); 1612 SCOPED_TRACE(1000 + i);
1613 CheckKeyTestCase(&rewriter, tests[i]);
1557 } 1614 }
1558 1615
1559 *CommandLine::ForCurrentProcess() = original_cl; 1616 *CommandLine::ForCurrentProcess() = original_cl;
1560 } 1617 }
1561 1618
1562 TEST_F(EventRewriterTest, TestRewriteKeyEventSentByXSendEvent) { 1619 TEST_F(EventRewriterTest, TestRewriteKeyEventSentByXSendEvent) {
1563 #if defined(USE_X11) 1620 #if defined(USE_X11)
1564 // TODO(kpschoedel): pending alternative to xevent.xany.send_event 1621 // TODO(kpschoedel): pending alternative to xevent.xany.send_event
1565 // Remap Control to Alt. 1622 // Remap Control to Alt.
1566 TestingPrefServiceSyncable prefs; 1623 TestingPrefServiceSyncable prefs;
1567 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1624 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1568 IntegerPrefMember control; 1625 IntegerPrefMember control;
1569 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); 1626 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs);
1570 control.SetValue(chromeos::input_method::kAltKey); 1627 control.SetValue(chromeos::input_method::kAltKey);
1571 1628
1572 EventRewriter rewriter(NULL); 1629 EventRewriter rewriter(NULL);
1630 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
1573 rewriter.set_pref_service_for_testing(&prefs); 1631 rewriter.set_pref_service_for_testing(&prefs);
1574 1632
1575 // Send left control press. 1633 // Send left control press.
1576 std::string rewritten_event; 1634 std::string rewritten_event;
1577 { 1635 {
1578 ui::ScopedXI2Event xev; 1636 ui::ScopedXI2Event xev;
1579 xev.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 0); 1637 xev.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 0);
1580 XEvent* xevent = xev; 1638 XEvent* xevent = xev;
1581 xevent->xkey.keycode = XKeysymToKeycode(gfx::GetXDisplay(), XK_Control_L); 1639 xevent->xkey.keycode = XKeysymToKeycode(gfx::GetXDisplay(), XK_Control_L);
1582 xevent->xkey.send_event = True; // XSendEvent() always does this. 1640 xevent->xkey.send_event = True; // XSendEvent() always does this.
(...skipping 10 matching lines...) Expand all
1593 1651
1594 TEST_F(EventRewriterTest, TestRewriteNonNativeEvent) { 1652 TEST_F(EventRewriterTest, TestRewriteNonNativeEvent) {
1595 // Remap Control to Alt. 1653 // Remap Control to Alt.
1596 TestingPrefServiceSyncable prefs; 1654 TestingPrefServiceSyncable prefs;
1597 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1655 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1598 IntegerPrefMember control; 1656 IntegerPrefMember control;
1599 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); 1657 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs);
1600 control.SetValue(chromeos::input_method::kAltKey); 1658 control.SetValue(chromeos::input_method::kAltKey);
1601 1659
1602 EventRewriter rewriter(NULL); 1660 EventRewriter rewriter(NULL);
1661 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
1603 rewriter.set_pref_service_for_testing(&prefs); 1662 rewriter.set_pref_service_for_testing(&prefs);
1604 1663
1605 const int kTouchId = 2; 1664 const int kTouchId = 2;
1606 gfx::Point location(0, 0); 1665 gfx::Point location(0, 0);
1607 ui::TouchEvent press( 1666 ui::TouchEvent press(
1608 ui::ET_TOUCH_PRESSED, location, kTouchId, base::TimeDelta()); 1667 ui::ET_TOUCH_PRESSED, location, kTouchId, base::TimeDelta());
1609 press.set_flags(ui::EF_CONTROL_DOWN); 1668 press.set_flags(ui::EF_CONTROL_DOWN);
1610 1669
1611 scoped_ptr<ui::Event> new_event; 1670 scoped_ptr<ui::Event> new_event;
1612 rewriter.RewriteEvent(press, &new_event); 1671 rewriter.RewriteEvent(press, &new_event);
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
1787 ui::TouchFactory::GetInstance()->SetPointerDeviceForTest(device_list); 1846 ui::TouchFactory::GetInstance()->SetPointerDeviceForTest(device_list);
1788 1847
1789 // Remap Control to Alt. 1848 // Remap Control to Alt.
1790 TestingPrefServiceSyncable prefs; 1849 TestingPrefServiceSyncable prefs;
1791 chromeos::Preferences::RegisterProfilePrefs(prefs.registry()); 1850 chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1792 IntegerPrefMember control; 1851 IntegerPrefMember control;
1793 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs); 1852 control.Init(prefs::kLanguageRemapControlKeyTo, &prefs);
1794 control.SetValue(chromeos::input_method::kAltKey); 1853 control.SetValue(chromeos::input_method::kAltKey);
1795 1854
1796 EventRewriter rewriter(NULL); 1855 EventRewriter rewriter(NULL);
1856 rewriter.KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
1797 rewriter.set_pref_service_for_testing(&prefs); 1857 rewriter.set_pref_service_for_testing(&prefs);
1798 1858
1799 // Check that Control + Left Button is converted (via Alt + Left Button) 1859 // Check that Control + Left Button is converted (via Alt + Left Button)
1800 // to Right Button. 1860 // to Right Button.
1801 ui::ScopedXI2Event xev; 1861 ui::ScopedXI2Event xev;
1802 xev.InitGenericButtonEvent(10, 1862 xev.InitGenericButtonEvent(10,
1803 ui::ET_MOUSE_PRESSED, 1863 ui::ET_MOUSE_PRESSED,
1804 gfx::Point(), 1864 gfx::Point(),
1805 ui::EF_LEFT_MOUSE_BUTTON | ui::EF_CONTROL_DOWN); 1865 ui::EF_LEFT_MOUSE_BUTTON | ui::EF_CONTROL_DOWN);
1806 ui::MouseEvent press(xev); 1866 ui::MouseEvent press(xev);
1807 // Sanity check. 1867 // Sanity check.
1808 EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type()); 1868 EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type());
1809 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON | ui::EF_CONTROL_DOWN, press.flags()); 1869 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON | ui::EF_CONTROL_DOWN, press.flags());
1810 int flags = RewriteMouseEvent(&rewriter, press); 1870 scoped_ptr<ui::Event> new_event;
1811 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & flags); 1871 const ui::MouseEvent* result =
1812 EXPECT_FALSE(ui::EF_CONTROL_DOWN & flags); 1872 RewriteMouseButtonEvent(&rewriter, press, &new_event);
1813 EXPECT_FALSE(ui::EF_ALT_DOWN & flags); 1873 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & result->flags());
1874 EXPECT_FALSE(ui::EF_LEFT_MOUSE_BUTTON & result->flags());
1875 EXPECT_FALSE(ui::EF_CONTROL_DOWN & result->flags());
1876 EXPECT_FALSE(ui::EF_ALT_DOWN & result->flags());
1877 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & result->flags());
1814 } 1878 }
1815 1879
1816
1817 TEST_F(EventRewriterTest, DontRewriteIfNotRewritten) { 1880 TEST_F(EventRewriterTest, DontRewriteIfNotRewritten) {
1818 #if defined(USE_X11)
1819 // TODO(kpschoedel): pending changes for crbug.com/360377 1881 // TODO(kpschoedel): pending changes for crbug.com/360377
1820 // to |chromeos::EventRewriter::RewriteLocatedEvent() 1882 // to |chromeos::EventRewriter::RewriteLocatedEvent()
1821 std::vector<unsigned int> device_list; 1883 std::vector<unsigned int> device_list;
1822 device_list.push_back(10); 1884 device_list.push_back(10);
1823 device_list.push_back(11); 1885 device_list.push_back(11);
1824 ui::TouchFactory::GetInstance()->SetPointerDeviceForTest(device_list); 1886 ui::TouchFactory::GetInstance()->SetPointerDeviceForTest(device_list);
1825 TestingPrefServiceSyncable prefs; 1887 TestingPrefServiceSyncable prefs;
1826 EventRewriter rewriter(NULL); 1888 EventRewriter rewriter(NULL);
1827 rewriter.set_pref_service_for_testing(&prefs); 1889 rewriter.set_pref_service_for_testing(&prefs);
1828 const int kLeftAndAltFlag = ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN; 1890 const int kLeftAndAltFlag = ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN;
1891
1892 // Test Alt + Left click.
1893 {
1894 ui::MouseEvent press(ui::ET_MOUSE_PRESSED,
1895 gfx::Point(),
1896 gfx::Point(),
1897 kLeftAndAltFlag,
1898 ui::EF_LEFT_MOUSE_BUTTON);
1899 press.set_source_device_id(10);
1900 // Sanity check.
1901 EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type());
1902 EXPECT_EQ(kLeftAndAltFlag, press.flags());
1903 scoped_ptr<ui::Event> new_event;
1904 const ui::MouseEvent* result =
1905 RewriteMouseButtonEvent(&rewriter, press, &new_event);
1906 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & result->flags());
1907 EXPECT_FALSE(kLeftAndAltFlag & result->flags());
1908 EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, result->changed_button_flags());
1909 }
1910 {
1911 ui::MouseEvent release(ui::ET_MOUSE_RELEASED,
1912 gfx::Point(),
1913 gfx::Point(),
1914 kLeftAndAltFlag,
1915 ui::EF_LEFT_MOUSE_BUTTON);
1916 release.set_source_device_id(10);
1917 scoped_ptr<ui::Event> new_event;
1918 const ui::MouseEvent* result =
1919 RewriteMouseButtonEvent(&rewriter, release, &new_event);
1920 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & result->flags());
1921 EXPECT_FALSE(kLeftAndAltFlag & result->flags());
1922 EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, result->changed_button_flags());
1923 }
1924 #if defined(USE_X11)
1925 // Test Alt + Left click, using XI2 native events.
1829 { 1926 {
1830 ui::ScopedXI2Event xev; 1927 ui::ScopedXI2Event xev;
1831 xev.InitGenericButtonEvent( 1928 xev.InitGenericButtonEvent(
1832 10, ui::ET_MOUSE_PRESSED, gfx::Point(), kLeftAndAltFlag); 1929 10, ui::ET_MOUSE_PRESSED, gfx::Point(), kLeftAndAltFlag);
1833 ui::MouseEvent press(xev); 1930 ui::MouseEvent press(xev);
1834 // Sanity check. 1931 // Sanity check.
1835 EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type()); 1932 EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type());
1836 EXPECT_EQ(kLeftAndAltFlag, press.flags()); 1933 EXPECT_EQ(kLeftAndAltFlag, press.flags());
1837 int flags = RewriteMouseEvent(&rewriter, press); 1934 scoped_ptr<ui::Event> new_event;
1838 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & flags); 1935 const ui::MouseEvent* result =
1936 RewriteMouseButtonEvent(&rewriter, press, &new_event);
1937 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & result->flags());
1938 EXPECT_FALSE(kLeftAndAltFlag & result->flags());
1939 EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, result->changed_button_flags());
1839 } 1940 }
1840 { 1941 {
1841 ui::ScopedXI2Event xev; 1942 ui::ScopedXI2Event xev;
1842 xev.InitGenericButtonEvent( 1943 xev.InitGenericButtonEvent(
1843 10, ui::ET_MOUSE_RELEASED, gfx::Point(), kLeftAndAltFlag); 1944 10, ui::ET_MOUSE_RELEASED, gfx::Point(), kLeftAndAltFlag);
1844 ui::MouseEvent release(xev); 1945 ui::MouseEvent release(xev);
1845 int flags = RewriteMouseEvent(&rewriter, release); 1946 scoped_ptr<ui::Event> new_event;
1846 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & flags); 1947 const ui::MouseEvent* result =
1948 RewriteMouseButtonEvent(&rewriter, release, &new_event);
1949 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & result->flags());
1950 EXPECT_FALSE(kLeftAndAltFlag & result->flags());
1951 EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, result->changed_button_flags());
1847 } 1952 }
1953 #endif
1848 1954
1849 // No ALT in frst click. 1955 // No ALT in frst click.
1850 { 1956 {
1957 ui::MouseEvent press(ui::ET_MOUSE_PRESSED,
1958 gfx::Point(),
1959 gfx::Point(),
1960 ui::EF_LEFT_MOUSE_BUTTON,
1961 ui::EF_LEFT_MOUSE_BUTTON);
1962 press.set_source_device_id(10);
1963 scoped_ptr<ui::Event> new_event;
1964 const ui::MouseEvent* result =
1965 RewriteMouseButtonEvent(&rewriter, press, &new_event);
1966 EXPECT_TRUE(ui::EF_LEFT_MOUSE_BUTTON & result->flags());
1967 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, result->changed_button_flags());
1968 }
1969 {
1970 ui::MouseEvent release(ui::ET_MOUSE_RELEASED,
1971 gfx::Point(),
1972 gfx::Point(),
1973 kLeftAndAltFlag,
1974 ui::EF_LEFT_MOUSE_BUTTON);
1975 release.set_source_device_id(10);
1976 scoped_ptr<ui::Event> new_event;
1977 const ui::MouseEvent* result =
1978 RewriteMouseButtonEvent(&rewriter, release, &new_event);
1979 EXPECT_TRUE((ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN) & result->flags());
1980 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, result->changed_button_flags());
1981 }
1982 #if defined(USE_X11)
1983 // No ALT in frst click, using XI2 native events.
1984 {
1851 ui::ScopedXI2Event xev; 1985 ui::ScopedXI2Event xev;
1852 xev.InitGenericButtonEvent( 1986 xev.InitGenericButtonEvent(
1853 10, ui::ET_MOUSE_PRESSED, gfx::Point(), ui::EF_LEFT_MOUSE_BUTTON); 1987 10, ui::ET_MOUSE_PRESSED, gfx::Point(), ui::EF_LEFT_MOUSE_BUTTON);
1854 ui::MouseEvent press(xev); 1988 ui::MouseEvent press(xev);
1855 int flags = RewriteMouseEvent(&rewriter, press); 1989 scoped_ptr<ui::Event> new_event;
1856 EXPECT_TRUE(ui::EF_LEFT_MOUSE_BUTTON & flags); 1990 const ui::MouseEvent* result =
1991 RewriteMouseButtonEvent(&rewriter, press, &new_event);
1992 EXPECT_TRUE(ui::EF_LEFT_MOUSE_BUTTON & result->flags());
1993 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, result->changed_button_flags());
1857 } 1994 }
1858 { 1995 {
1859 ui::ScopedXI2Event xev; 1996 ui::ScopedXI2Event xev;
1860 xev.InitGenericButtonEvent( 1997 xev.InitGenericButtonEvent(
1861 10, ui::ET_MOUSE_RELEASED, gfx::Point(), kLeftAndAltFlag); 1998 10, ui::ET_MOUSE_RELEASED, gfx::Point(), kLeftAndAltFlag);
1862 ui::MouseEvent release(xev); 1999 ui::MouseEvent release(xev);
1863 int flags = RewriteMouseEvent(&rewriter, release); 2000 scoped_ptr<ui::Event> new_event;
1864 EXPECT_TRUE((ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN) & flags); 2001 const ui::MouseEvent* result =
2002 RewriteMouseButtonEvent(&rewriter, release, &new_event);
2003 EXPECT_TRUE((ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN) & result->flags());
2004 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, result->changed_button_flags());
1865 } 2005 }
2006 #endif
1866 2007
1867 // ALT on different device. 2008 // ALT on different device.
1868 { 2009 {
2010 ui::MouseEvent press(ui::ET_MOUSE_PRESSED,
2011 gfx::Point(),
2012 gfx::Point(),
2013 kLeftAndAltFlag,
2014 ui::EF_LEFT_MOUSE_BUTTON);
2015 press.set_source_device_id(11);
2016 scoped_ptr<ui::Event> new_event;
2017 const ui::MouseEvent* result =
2018 RewriteMouseButtonEvent(&rewriter, press, &new_event);
2019 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & result->flags());
2020 EXPECT_FALSE(kLeftAndAltFlag & result->flags());
2021 EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, result->changed_button_flags());
2022 }
2023 {
2024 ui::MouseEvent release(ui::ET_MOUSE_RELEASED,
2025 gfx::Point(),
2026 gfx::Point(),
2027 kLeftAndAltFlag,
2028 ui::EF_LEFT_MOUSE_BUTTON);
2029 release.set_source_device_id(10);
2030 scoped_ptr<ui::Event> new_event;
2031 const ui::MouseEvent* result =
2032 RewriteMouseButtonEvent(&rewriter, release, &new_event);
2033 EXPECT_TRUE((ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN) & result->flags());
2034 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, result->changed_button_flags());
2035 }
2036 {
2037 ui::MouseEvent release(ui::ET_MOUSE_RELEASED,
2038 gfx::Point(),
2039 gfx::Point(),
2040 kLeftAndAltFlag,
2041 ui::EF_LEFT_MOUSE_BUTTON);
2042 release.set_source_device_id(11);
2043 scoped_ptr<ui::Event> new_event;
2044 const ui::MouseEvent* result =
2045 RewriteMouseButtonEvent(&rewriter, release, &new_event);
2046 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & result->flags());
2047 EXPECT_FALSE(kLeftAndAltFlag & result->flags());
2048 EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, result->changed_button_flags());
2049 }
2050 #if defined(USE_X11)
2051 // ALT on different device, using XI2 native events.
2052 {
1869 ui::ScopedXI2Event xev; 2053 ui::ScopedXI2Event xev;
1870 xev.InitGenericButtonEvent( 2054 xev.InitGenericButtonEvent(
1871 11, ui::ET_MOUSE_PRESSED, gfx::Point(), kLeftAndAltFlag); 2055 11, ui::ET_MOUSE_PRESSED, gfx::Point(), kLeftAndAltFlag);
1872 ui::MouseEvent press(xev); 2056 ui::MouseEvent press(xev);
1873 int flags = RewriteMouseEvent(&rewriter, press); 2057 scoped_ptr<ui::Event> new_event;
1874 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & flags); 2058 const ui::MouseEvent* result =
2059 RewriteMouseButtonEvent(&rewriter, press, &new_event);
2060 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & result->flags());
2061 EXPECT_FALSE(kLeftAndAltFlag & result->flags());
2062 EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, result->changed_button_flags());
1875 } 2063 }
1876 { 2064 {
1877 ui::ScopedXI2Event xev; 2065 ui::ScopedXI2Event xev;
1878 xev.InitGenericButtonEvent( 2066 xev.InitGenericButtonEvent(
1879 10, ui::ET_MOUSE_RELEASED, gfx::Point(), kLeftAndAltFlag); 2067 10, ui::ET_MOUSE_RELEASED, gfx::Point(), kLeftAndAltFlag);
1880 ui::MouseEvent release(xev); 2068 ui::MouseEvent release(xev);
1881 int flags = RewriteMouseEvent(&rewriter, release); 2069 scoped_ptr<ui::Event> new_event;
1882 EXPECT_TRUE((ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN) & flags); 2070 const ui::MouseEvent* result =
2071 RewriteMouseButtonEvent(&rewriter, release, &new_event);
2072 EXPECT_TRUE((ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN) & result->flags());
2073 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, result->changed_button_flags());
1883 } 2074 }
1884 { 2075 {
1885 ui::ScopedXI2Event xev; 2076 ui::ScopedXI2Event xev;
1886 xev.InitGenericButtonEvent( 2077 xev.InitGenericButtonEvent(
1887 11, ui::ET_MOUSE_RELEASED, gfx::Point(), kLeftAndAltFlag); 2078 11, ui::ET_MOUSE_RELEASED, gfx::Point(), kLeftAndAltFlag);
1888 ui::MouseEvent release(xev); 2079 ui::MouseEvent release(xev);
1889 int flags = RewriteMouseEvent(&rewriter, release); 2080 scoped_ptr<ui::Event> new_event;
1890 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & flags); 2081 const ui::MouseEvent* result =
2082 RewriteMouseButtonEvent(&rewriter, release, &new_event);
2083 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & result->flags());
2084 EXPECT_FALSE(kLeftAndAltFlag & result->flags());
2085 EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, result->changed_button_flags());
1891 } 2086 }
1892 #endif 2087 #endif
1893 } 2088 }
1894 2089
1895 TEST_F(EventRewriterAshTest, StickyKeyEventDispatchImpl) { 2090 TEST_F(EventRewriterAshTest, StickyKeyEventDispatchImpl) {
1896 // Test the actual key event dispatch implementation. 2091 // Test the actual key event dispatch implementation.
1897 ScopedVector<ui::Event> events; 2092 ScopedVector<ui::Event> events;
1898 2093
1899 SendActivateStickyKeyPattern(ui::VKEY_CONTROL); 2094 SendActivateStickyKeyPattern(ui::VKEY_CONTROL);
1900 PopEvents(&events); 2095 PopEvents(&events);
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after
2178 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN)); 2373 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
2179 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN)); 2374 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));
2180 2375
2181 // Turn off AltGr and Mod3. 2376 // Turn off AltGr and Mod3.
2182 sticky_keys_controller_->SetModifiersEnabled(false, false); 2377 sticky_keys_controller_->SetModifiersEnabled(false, false);
2183 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN)); 2378 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
2184 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN)); 2379 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));
2185 } 2380 }
2186 2381
2187 } // namespace chromeos 2382 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698