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