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

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

Powered by Google App Engine
This is Rietveld 408576698