15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/ash/event_rewriter.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_member.h"
107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/stringprintf.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/pref_names.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/testing_pref_service_syncable.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <X11/keysym.h>
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <X11/XF86keysym.h>
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <X11/Xlib.h>
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/test/ash_test_base.h"
224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/wm/window_state.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/input_method/input_method_configuration.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/input_method/mock_input_method_manager.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/login/mock_user_manager.h"
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/user_manager.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/preferences.h"
28b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "chromeos/chromeos_switches.h"
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/ime/mock_xkeyboard.h"
304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/aura/window.h"
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/events/test/events_test_utils_x11.h"
3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/gfx/x/x11_types.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetRewrittenEventAsString(EventRewriter* rewriter,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::KeyboardCode ui_keycode,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      int ui_flags,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EventType ui_type,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyCode x_keycode,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      unsigned int x_state) {
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ui::ScopedXI2Event xev;
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  xev.InitKeyEvent(ui_type, ui_keycode, ui_flags);
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  XEvent* xevent = xev;
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  xevent->xkey.keycode = x_keycode;
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  xevent->xkey.state = x_state;
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ui::KeyEvent keyevent(xev, false /* is_char */);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rewriter->RewriteForTesting(&keyevent);
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return base::StringPrintf(
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "ui_keycode=%d ui_flags=%d ui_type=%d x_keycode=%u x_state=%u x_type=%d",
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      keyevent.key_code(), keyevent.flags(), keyevent.type(),
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      xevent->xkey.keycode, xevent->xkey.state, xevent->xkey.type);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetExpectedResultAsString(ui::KeyboardCode ui_keycode,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      int ui_flags,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EventType ui_type,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyCode x_keycode,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      unsigned int x_state,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      int x_type) {
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return base::StringPrintf(
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "ui_keycode=%d ui_flags=%d ui_type=%d x_keycode=%u x_state=%u x_type=%d",
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui_keycode, ui_flags, ui_type, x_keycode, x_state, x_type);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class EventRewriterTest : public testing::Test {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EventRewriterTest()
6968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      : display_(gfx::GetXDisplay()),
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_a_(XKeysymToKeycode(display_, XK_a)),
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_alt_l_(XKeysymToKeycode(display_, XK_Alt_L)),
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_alt_r_(XKeysymToKeycode(display_, XK_Alt_R)),
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_b_(XKeysymToKeycode(display_, XK_B)),
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_caps_lock_(XKeysymToKeycode(display_, XK_Caps_Lock)),
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_control_l_(XKeysymToKeycode(display_, XK_Control_L)),
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_control_r_(XKeysymToKeycode(display_, XK_Control_R)),
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_meta_l_(XKeysymToKeycode(display_, XK_Meta_L)),
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_meta_r_(XKeysymToKeycode(display_, XK_Meta_R)),
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_num_pad_0_(XKeysymToKeycode(display_, XK_KP_0)),
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_num_pad_1_(XKeysymToKeycode(display_, XK_KP_1)),
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_num_pad_2_(XKeysymToKeycode(display_, XK_KP_2)),
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_num_pad_3_(XKeysymToKeycode(display_, XK_KP_3)),
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_num_pad_4_(XKeysymToKeycode(display_, XK_KP_4)),
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_num_pad_5_(XKeysymToKeycode(display_, XK_KP_5)),
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_num_pad_6_(XKeysymToKeycode(display_, XK_KP_6)),
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_num_pad_7_(XKeysymToKeycode(display_, XK_KP_7)),
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_num_pad_8_(XKeysymToKeycode(display_, XK_KP_8)),
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_num_pad_9_(XKeysymToKeycode(display_, XK_KP_9)),
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_num_pad_begin_(XKeysymToKeycode(display_, XK_KP_Begin)),
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_num_pad_decimal_(XKeysymToKeycode(display_, XK_KP_Decimal)),
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_num_pad_delete_(XKeysymToKeycode(display_, XK_KP_Delete)),
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_num_pad_down_(XKeysymToKeycode(display_, XK_KP_Down)),
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_num_pad_end_(XKeysymToKeycode(display_, XK_KP_End)),
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_num_pad_home_(XKeysymToKeycode(display_, XK_KP_Home)),
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_num_pad_insert_(XKeysymToKeycode(display_, XK_KP_Insert)),
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_num_pad_left_(XKeysymToKeycode(display_, XK_KP_Left)),
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_num_pad_next_(XKeysymToKeycode(display_, XK_KP_Next)),
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_num_pad_prior_(XKeysymToKeycode(display_, XK_KP_Prior)),
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_num_pad_right_(XKeysymToKeycode(display_, XK_KP_Right)),
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_num_pad_up_(XKeysymToKeycode(display_, XK_KP_Up)),
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_super_l_(XKeysymToKeycode(display_, XK_Super_L)),
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_super_r_(XKeysymToKeycode(display_, XK_Super_R)),
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_void_symbol_(XKeysymToKeycode(display_, XK_VoidSymbol)),
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_delete_(XKeysymToKeycode(display_, XK_Delete)),
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_backspace_(XKeysymToKeycode(display_, XK_BackSpace)),
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_up_(XKeysymToKeycode(display_, XK_Up)),
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_down_(XKeysymToKeycode(display_, XK_Down)),
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_left_(XKeysymToKeycode(display_, XK_Left)),
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_right_(XKeysymToKeycode(display_, XK_Right)),
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_prior_(XKeysymToKeycode(display_, XK_Prior)),
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_next_(XKeysymToKeycode(display_, XK_Next)),
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_home_(XKeysymToKeycode(display_, XK_Home)),
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_end_(XKeysymToKeycode(display_, XK_End)),
114d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        keycode_escape_(XKeysymToKeycode(display_, XK_Escape)),
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_launch6_(XKeysymToKeycode(display_, XF86XK_Launch6)),
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keycode_launch7_(XKeysymToKeycode(display_, XF86XK_Launch7)),
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_f1_(XKeysymToKeycode(display_, XK_F1)),
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_f2_(XKeysymToKeycode(display_, XK_F2)),
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_f3_(XKeysymToKeycode(display_, XK_F3)),
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_f4_(XKeysymToKeycode(display_, XK_F4)),
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_f5_(XKeysymToKeycode(display_, XK_F5)),
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_f6_(XKeysymToKeycode(display_, XK_F6)),
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_f7_(XKeysymToKeycode(display_, XK_F7)),
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_f8_(XKeysymToKeycode(display_, XK_F8)),
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_f9_(XKeysymToKeycode(display_, XK_F9)),
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_f10_(XKeysymToKeycode(display_, XK_F10)),
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_f11_(XKeysymToKeycode(display_, XK_F11)),
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_f12_(XKeysymToKeycode(display_, XK_F12)),
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_browser_back_(XKeysymToKeycode(display_, XF86XK_Back)),
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_browser_forward_(XKeysymToKeycode(display_, XF86XK_Forward)),
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_browser_refresh_(XKeysymToKeycode(display_, XF86XK_Reload)),
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_media_launch_app1_(XKeysymToKeycode(display_, XF86XK_LaunchA)),
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_media_launch_app2_(XKeysymToKeycode(display_, XF86XK_LaunchB)),
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_brightness_down_(XKeysymToKeycode(
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            display_, XF86XK_MonBrightnessDown)),
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_brightness_up_(XKeysymToKeycode(
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            display_, XF86XK_MonBrightnessUp)),
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_volume_mute_(XKeysymToKeycode(display_, XF86XK_AudioMute)),
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_volume_down_(XKeysymToKeycode(
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            display_, XF86XK_AudioLowerVolume)),
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_volume_up_(XKeysymToKeycode(
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            display_, XF86XK_AudioRaiseVolume)),
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_power_(XKeysymToKeycode(display_, XF86XK_PowerOff)),
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_1_(XKeysymToKeycode(display_, XK_1)),
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_2_(XKeysymToKeycode(display_, XK_2)),
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_3_(XKeysymToKeycode(display_, XK_3)),
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_4_(XKeysymToKeycode(display_, XK_4)),
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_5_(XKeysymToKeycode(display_, XK_5)),
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_6_(XKeysymToKeycode(display_, XK_6)),
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_7_(XKeysymToKeycode(display_, XK_7)),
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_8_(XKeysymToKeycode(display_, XK_8)),
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_9_(XKeysymToKeycode(display_, XK_9)),
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_0_(XKeysymToKeycode(display_, XK_0)),
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_minus_(XKeysymToKeycode(display_, XK_minus)),
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_equal_(XKeysymToKeycode(display_, XK_equal)),
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_period_(XKeysymToKeycode(display_, XK_period)),
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        keycode_insert_(XKeysymToKeycode(display_, XK_Insert)),
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        mock_user_manager_(new chromeos::MockUserManager),
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        user_manager_enabler_(mock_user_manager_),
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        input_method_manager_mock_(NULL) {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~EventRewriterTest() {}
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Mocking user manager because the real one needs to be called on UI thread
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_CALL(*mock_user_manager_, IsLoggedInAsGuest())
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(testing::Return(false));
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_method_manager_mock_ =
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new chromeos::input_method::MockInputMethodManager;
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chromeos::input_method::InitializeForTesting(
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        input_method_manager_mock_);  // pass ownership
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Shutdown() deletes the IME mock object.
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chromeos::input_method::Shutdown();
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void TestRewriteNumPadKeys();
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void TestRewriteNumPadKeysOnAppleKeyboard();
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Display* display_;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_a_;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_alt_l_;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_alt_r_;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_b_;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_caps_lock_;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_control_l_;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_control_r_;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_meta_l_;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_meta_r_;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_num_pad_0_;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_num_pad_1_;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_num_pad_2_;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_num_pad_3_;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_num_pad_4_;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_num_pad_5_;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_num_pad_6_;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_num_pad_7_;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_num_pad_8_;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_num_pad_9_;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_num_pad_begin_;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_num_pad_decimal_;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_num_pad_delete_;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_num_pad_down_;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_num_pad_end_;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_num_pad_home_;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_num_pad_insert_;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_num_pad_left_;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_num_pad_next_;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_num_pad_prior_;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_num_pad_right_;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_num_pad_up_;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_super_l_;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_super_r_;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_void_symbol_;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_delete_;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_backspace_;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_up_;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_down_;
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_left_;
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_right_;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_prior_;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_next_;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_home_;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_end_;
228d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  const KeyCode keycode_escape_;
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_launch6_;  // F15
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyCode keycode_launch7_;  // F16
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_f1_;
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_f2_;
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_f3_;
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_f4_;
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_f5_;
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_f6_;
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_f7_;
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_f8_;
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_f9_;
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_f10_;
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_f11_;
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_f12_;
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_browser_back_;
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_browser_forward_;
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_browser_refresh_;
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_media_launch_app1_;
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_media_launch_app2_;
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_brightness_down_;
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_brightness_up_;
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_volume_mute_;
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_volume_down_;
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_volume_up_;
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_power_;
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_1_;
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_2_;
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_3_;
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_4_;
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_5_;
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_6_;
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_7_;
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_8_;
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_9_;
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_0_;
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_minus_;
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_equal_;
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_period_;
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const KeyCode keycode_insert_;
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  chromeos::MockUserManager* mock_user_manager_;  // Not owned.
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  chromeos::ScopedUserManagerEnabler user_manager_enabler_;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chromeos::input_method::MockInputMethodManager* input_method_manager_mock_;
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class EventRewriterTest : public testing::Test {
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EventRewriterTest() {}
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~EventRewriterTest() {}
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(EventRewriterTest, TestGetDeviceType) {
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is the typical string which an Apple keyboard sends.
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard,
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            EventRewriter::GetDeviceType("Apple Inc. Apple Keyboard"));
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Other cases we accept.
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard,
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            EventRewriter::GetDeviceType("Apple Keyboard"));
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard,
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            EventRewriter::GetDeviceType("apple keyboard"));
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard,
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            EventRewriter::GetDeviceType("apple keyboard."));
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard,
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            EventRewriter::GetDeviceType("apple.keyboard."));
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard,
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            EventRewriter::GetDeviceType(".apple.keyboard."));
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Dell, Microsoft, Logitech, ... should be recognized as a kDeviceUnknown.
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(EventRewriter::kDeviceUnknown,
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            EventRewriter::GetDeviceType("Dell Dell USB Entry Keyboard"));
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(EventRewriter::kDeviceUnknown,
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            EventRewriter::GetDeviceType(
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                "Microsoft Natural Ergonomic Keyboard"));
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(EventRewriter::kDeviceUnknown,
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            EventRewriter::GetDeviceType("CHESEN USB Keyboard"));
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Some corner cases.
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(EventRewriter::kDeviceUnknown, EventRewriter::GetDeviceType(""));
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(EventRewriter::kDeviceUnknown,
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            EventRewriter::GetDeviceType("."));
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(EventRewriter::kDeviceUnknown,
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            EventRewriter::GetDeviceType(". "));
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(EventRewriter::kDeviceUnknown,
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            EventRewriter::GetDeviceType(" ."));
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(EventRewriter::kDeviceUnknown,
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            EventRewriter::GetDeviceType("not-an-apple keyboard"));
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(EventRewriterTest, TestDeviceAddedOrRemoved) {
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EventRewriter rewriter;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(rewriter.device_id_to_type_for_testing().empty());
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(EventRewriter::kDeviceUnknown,
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            rewriter.DeviceAddedForTesting(0, "PC Keyboard"));
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, rewriter.device_id_to_type_for_testing().size());
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard,
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            rewriter.DeviceAddedForTesting(1, "Apple Keyboard"));
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, rewriter.device_id_to_type_for_testing().size());
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try to reuse the first ID.
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(EventRewriter::kDeviceAppleKeyboard,
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            rewriter.DeviceAddedForTesting(0, "Apple Keyboard"));
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, rewriter.device_id_to_type_for_testing().size());
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(EventRewriterTest, TestRewriteCommandToControl) {
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First, test with a PC keyboard.
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSyncable prefs;
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EventRewriter rewriter;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rewriter.DeviceAddedForTesting(0, "PC Keyboard");
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rewriter.set_last_device_id_for_testing(0);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rewriter.set_pref_service_for_testing(&prefs);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_a, Alt modifier.
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A,
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_a_,
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask,
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_A,
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_a_,
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask));
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_a, Win modifier.
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A,
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_a_,
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod4Mask,
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_A,
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_a_,
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod4Mask));
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_a, Alt+Win modifier.
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A,
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_a_,
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask | Mod4Mask,
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_A,
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_a_,
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask | Mod4Mask));
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_Super_L (left Windows key), Alt modifier.
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_LWIN,
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_super_l_,
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask,
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_LWIN,
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_super_l_,
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask));
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_Super_R (right Windows key), Alt modifier.
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_RWIN,
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_super_r_,
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask,
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_RWIN,
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_super_r_,
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask));
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An Apple keyboard reusing the ID, zero.
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rewriter.DeviceAddedForTesting(0, "Apple Keyboard");
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rewriter.set_last_device_id_for_testing(0);
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_a, Alt modifier.
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A,
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_a_,
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask,
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_A,
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_a_,
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask));
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_a, Win modifier.
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A,
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CONTROL_DOWN,
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_a_,
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ControlMask,
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_A,
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_a_,
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod4Mask));
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_a, Alt+Win modifier.
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A,
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_a_,
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask | ControlMask,
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_A,
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_a_,
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask | Mod4Mask));
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_Super_L (left Windows key), Alt modifier.
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL,
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_control_l_,
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask,
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_LWIN,
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_super_l_,
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask));
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_Super_R (right Windows key), Alt modifier.
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL,
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_control_r_,
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask,
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_RWIN,
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_super_r_,
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask));
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// For crbug.com/133896.
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(EventRewriterTest, TestRewriteCommandToControlWithControlRemapped) {
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remap Control to Alt.
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSyncable prefs;
4937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IntegerPrefMember control;
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  control.Init(prefs::kLanguageRemapControlKeyTo, &prefs);
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  control.SetValue(chromeos::input_method::kAltKey);
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EventRewriter rewriter;
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rewriter.set_pref_service_for_testing(&prefs);
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rewriter.DeviceAddedForTesting(0, "PC Keyboard");
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rewriter.set_last_device_id_for_testing(0);
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_Control_L (left Control key) should be remapped to Alt.
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU,
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_alt_l_,
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U,
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_CONTROL,
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_control_l_,
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U));
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An Apple keyboard reusing the ID, zero.
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rewriter.DeviceAddedForTesting(0, "Apple Keyboard");
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rewriter.set_last_device_id_for_testing(0);
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_Super_L (left Command key) with  Alt modifier. The remapped Command key
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // should never be re-remapped to Alt.
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL,
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_control_l_,
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask,
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_LWIN,
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_super_l_,
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask));
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_Super_R (right Command key) with  Alt modifier. The remapped Command key
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // should never be re-remapped to Alt.
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL,
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_control_r_,
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask,
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_RWIN,
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_super_r_,
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask));
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void EventRewriterTest::TestRewriteNumPadKeys() {
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSyncable prefs;
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EventRewriter rewriter;
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rewriter.set_pref_service_for_testing(&prefs);
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_KP_Insert (= NumPad 0 without Num Lock), no modifier.
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD0,
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_0_,
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod2Mask,  // Num Lock
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_INSERT,
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_insert_,
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0));
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_KP_Insert (= NumPad 0 without Num Lock), Alt modifier.
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD0,
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_0_,
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask | Mod2Mask,
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_INSERT,
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_insert_,
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask));
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_KP_Delete (= NumPad . without Num Lock), Alt modifier.
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_DECIMAL,
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_decimal_,
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask | Mod2Mask,
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_DELETE,
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_delete_,
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask));
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_KP_End (= NumPad 1 without Num Lock), Alt modifier.
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD1,
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_1_,
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask | Mod2Mask,
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_END,
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_end_,
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask));
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_KP_Down (= NumPad 2 without Num Lock), Alt modifier.
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD2,
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_2_,
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask | Mod2Mask,
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_DOWN,
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_down_,
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask));
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_KP_Next (= NumPad 3 without Num Lock), Alt modifier.
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD3,
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_3_,
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask | Mod2Mask,
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_NEXT,
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_next_,
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask));
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_KP_Left (= NumPad 4 without Num Lock), Alt modifier.
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD4,
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_4_,
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask | Mod2Mask,
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_LEFT,
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_left_,
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask));
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_KP_Begin (= NumPad 5 without Num Lock), Alt modifier.
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD5,
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_5_,
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask | Mod2Mask,
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_CLEAR,
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_begin_,
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask));
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_KP_Right (= NumPad 6 without Num Lock), Alt modifier.
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD6,
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_6_,
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask | Mod2Mask,
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_RIGHT,
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_right_,
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask));
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_KP_Home (= NumPad 7 without Num Lock), Alt modifier.
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD7,
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_7_,
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask | Mod2Mask,
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_HOME,
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_home_,
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask));
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_KP_Up (= NumPad 8 without Num Lock), Alt modifier.
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD8,
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_8_,
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask | Mod2Mask,
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_UP,
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_up_,
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask));
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_KP_Prior (= NumPad 9 without Num Lock), Alt modifier.
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD9,
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_9_,
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask | Mod2Mask,
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_PRIOR,
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_prior_,
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask));
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_KP_0 (= NumPad 0 with Num Lock), Num Lock modifier.
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD0,
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_0_,
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod2Mask,
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_NUMPAD0,
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_0_,
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod2Mask));
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_KP_DECIMAL (= NumPad . with Num Lock), Num Lock modifier.
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_DECIMAL,
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_decimal_,
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod2Mask,
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_DECIMAL,
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_decimal_,
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod2Mask));
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_KP_1 (= NumPad 1 with Num Lock), Num Lock modifier.
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD1,
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_1_,
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod2Mask,
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_NUMPAD1,
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_1_,
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod2Mask));
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_KP_2 (= NumPad 2 with Num Lock), Num Lock modifier.
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD2,
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_2_,
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod2Mask,
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_NUMPAD2,
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_2_,
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod2Mask));
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_KP_3 (= NumPad 3 with Num Lock), Num Lock modifier.
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD3,
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_3_,
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod2Mask,
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_NUMPAD3,
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_3_,
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod2Mask));
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_KP_4 (= NumPad 4 with Num Lock), Num Lock modifier.
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD4,
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_4_,
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod2Mask,
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_NUMPAD4,
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_4_,
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod2Mask));
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_KP_5 (= NumPad 5 with Num Lock), Num Lock modifier.
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD5,
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_5_,
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod2Mask,
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_NUMPAD5,
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_5_,
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod2Mask));
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_KP_6 (= NumPad 6 with Num Lock), Num Lock modifier.
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD6,
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_6_,
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod2Mask,
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_NUMPAD6,
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_6_,
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod2Mask));
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_KP_7 (= NumPad 7 with Num Lock), Num Lock modifier.
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD7,
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_7_,
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod2Mask,
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_NUMPAD7,
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_7_,
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod2Mask));
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_KP_8 (= NumPad 8 with Num Lock), Num Lock modifier.
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD8,
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_8_,
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod2Mask,
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_NUMPAD8,
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_8_,
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod2Mask));
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_KP_9 (= NumPad 9 with Num Lock), Num Lock modifier.
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD9,
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_9_,
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod2Mask,
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_NUMPAD9,
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_9_,
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod2Mask));
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(EventRewriterTest, TestRewriteNumPadKeys) {
8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestRewriteNumPadKeys();
8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(EventRewriterTest, TestRewriteNumPadKeysWithDiamondKeyFlag) {
8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make sure the num lock works correctly even when Diamond key exists.
8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const CommandLine original_cl(*CommandLine::ForCurrentProcess());
8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CommandLine::ForCurrentProcess()->AppendSwitchASCII(
888b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      chromeos::switches::kHasChromeOSDiamondKey, "");
8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestRewriteNumPadKeys();
8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *CommandLine::ForCurrentProcess() = original_cl;
8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests if the rewriter can handle a Command + Num Pad event.
8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void EventRewriterTest::TestRewriteNumPadKeysOnAppleKeyboard() {
8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSyncable prefs;
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EventRewriter rewriter;
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rewriter.DeviceAddedForTesting(0, "Apple Keyboard");
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rewriter.set_last_device_id_for_testing(0);
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rewriter.set_pref_service_for_testing(&prefs);
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_KP_End (= NumPad 1 without Num Lock), Win modifier.
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The result should be "Num Pad 1 with Control + Num Lock modifiers".
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD1,
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CONTROL_DOWN,
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_1_,
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ControlMask | Mod2Mask,
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_END,
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_end_,
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod4Mask));
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_KP_1 (= NumPad 1 without Num Lock), Win modifier.
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The result should also be "Num Pad 1 with Control + Num Lock modifiers".
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_NUMPAD1,
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CONTROL_DOWN,
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_1_,
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ControlMask | Mod2Mask,
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_NUMPAD1,
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_num_pad_end_,
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod4Mask));
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(EventRewriterTest, TestRewriteNumPadKeysOnAppleKeyboard) {
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestRewriteNumPadKeysOnAppleKeyboard();
9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(EventRewriterTest,
9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       TestRewriteNumPadKeysOnAppleKeyboardWithDiamondKeyFlag) {
9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Makes sure the num lock works correctly even when Diamond key exists.
9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const CommandLine original_cl(*CommandLine::ForCurrentProcess());
9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CommandLine::ForCurrentProcess()->AppendSwitchASCII(
942b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      chromeos::switches::kHasChromeOSDiamondKey, "");
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestRewriteNumPadKeysOnAppleKeyboard();
9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *CommandLine::ForCurrentProcess() = original_cl;
9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(EventRewriterTest, TestRewriteModifiersNoRemap) {
9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSyncable prefs;
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EventRewriter rewriter;
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rewriter.set_pref_service_for_testing(&prefs);
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Press Search. Confirm the event is not rewritten.
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_LWIN,
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_super_l_,
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U,
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_LWIN,
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_super_l_,
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U));
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Press left Control. Confirm the event is not rewritten.
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL,
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CONTROL_DOWN,
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_control_l_,
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U,
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_CONTROL,
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_control_l_,
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U));
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Press right Control. Confirm the event is not rewritten.
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL,
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CONTROL_DOWN,
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_control_r_,
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U,
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_CONTROL,
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_control_r_,
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U));
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Press left Alt. Confirm the event is not rewritten.
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU,
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_alt_l_,
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_MENU,
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_alt_l_,
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U));
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Press right Alt. Confirm the event is not rewritten.
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU,
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_alt_r_,
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_MENU,
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_alt_r_,
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U));
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test KeyRelease event, just in case.
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Release Search. Confirm the release event is not rewritten.
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_LWIN,
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_RELEASED,
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_super_l_,
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod4Mask,
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyRelease),
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_LWIN,
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_RELEASED,
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_super_l_,
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod4Mask));
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(EventRewriterTest, TestRewriteModifiersNoRemapMultipleKeys) {
10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSyncable prefs;
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EventRewriter rewriter;
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rewriter.set_pref_service_for_testing(&prefs);
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Press left Alt with Shift. Confirm the event is not rewritten.
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU,
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_meta_l_,
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ShiftMask,
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_MENU,
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_SHIFT_DOWN,
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_meta_l_,
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ShiftMask));
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Press right Alt with Shift. Confirm the event is not rewritten.
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU,
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_meta_r_,
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ShiftMask,
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_MENU,
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_SHIFT_DOWN,
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_meta_r_,
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ShiftMask));
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Press Search with Caps Lock mask. Confirm the event is not rewritten.
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_LWIN,
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CAPS_LOCK_DOWN,
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_super_l_,
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      LockMask,
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_LWIN,
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CAPS_LOCK_DOWN,
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_super_l_,
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      LockMask));
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Release Search with Caps Lock mask. Confirm the event is not rewritten.
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_LWIN,
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CAPS_LOCK_DOWN,
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_RELEASED,
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_super_l_,
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      LockMask | Mod4Mask,
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyRelease),
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_LWIN,
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CAPS_LOCK_DOWN,
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_RELEASED,
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_super_l_,
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      LockMask | Mod4Mask));
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Press Shift+Ctrl+Alt+Search+A. Confirm the event is not rewritten.
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_B,
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_SHIFT_DOWN |
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_b_,
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ShiftMask | ControlMask | Mod1Mask |
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod4Mask,
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_B,
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_SHIFT_DOWN |
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_b_,
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ShiftMask | ControlMask | Mod1Mask |
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod4Mask));
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(EventRewriterTest, TestRewriteModifiersDisableSome) {
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable Search and Control keys.
11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSyncable prefs;
11227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IntegerPrefMember search;
11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs);
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  search.SetValue(chromeos::input_method::kVoidKey);
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IntegerPrefMember control;
11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  control.Init(prefs::kLanguageRemapControlKeyTo, &prefs);
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  control.SetValue(chromeos::input_method::kVoidKey);
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EventRewriter rewriter;
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rewriter.set_pref_service_for_testing(&prefs);
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Press left Alt with Shift. This key press shouldn't be affected by the
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pref. Confirm the event is not rewritten.
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU,
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_meta_l_,
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ShiftMask,
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_MENU,
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_SHIFT_DOWN,
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_meta_l_,
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ShiftMask));
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Press Search. Confirm the event is now VKEY_UNKNOWN + XK_VoidSymbol.
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_UNKNOWN,
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_void_symbol_,
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U,
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_LWIN,
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_super_l_,
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U));
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Press Control. Confirm the event is now VKEY_UNKNOWN + XK_VoidSymbol.
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_UNKNOWN,
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_void_symbol_,
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U,
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_CONTROL,
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_control_l_,
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U));
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Press Control+Search. Confirm the event is now VKEY_UNKNOWN +
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_VoidSymbol without any modifiers.
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_UNKNOWN,
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_void_symbol_,
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U,
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_LWIN,
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CONTROL_DOWN,
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_super_l_,
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ControlMask));
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Press Control+Search+a. Confirm the event is now VKEY_A without any
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // modifiers.
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A,
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_a_,
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U,
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_A,
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CONTROL_DOWN,
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_a_,
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ControlMask | Mod4Mask));
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Press Control+Search+Alt+a. Confirm the event is now VKEY_A only with
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the Alt modifier.
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A,
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_a_,
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask,
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_A,
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_a_,
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ControlMask | Mod1Mask | Mod4Mask));
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remap Alt to Control.
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IntegerPrefMember alt;
12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  alt.Init(prefs::kLanguageRemapAltKeyTo, &prefs);
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alt.SetValue(chromeos::input_method::kControlKey);
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Press left Alt. Confirm the event is now VKEY_CONTROL + XK_Control_L
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // even though the Control key itself is disabled.
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL,
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CONTROL_DOWN,
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_control_l_,
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U,
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_MENU,
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_alt_l_,
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U));
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Press Alt+a. Confirm the event is now Control+a even though the Control
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // key itself is disabled.
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A,
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CONTROL_DOWN,
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_a_,
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ControlMask,
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_A,
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_a_,
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask));
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(EventRewriterTest, TestRewriteModifiersRemapToControl) {
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remap Search to Control.
12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSyncable prefs;
12607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IntegerPrefMember search;
12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs);
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  search.SetValue(chromeos::input_method::kControlKey);
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EventRewriter rewriter;
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rewriter.set_pref_service_for_testing(&prefs);
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Press Search. Confirm the event is now VKEY_CONTROL + XK_Control_L.
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL,
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CONTROL_DOWN,
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_control_l_,
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U,
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_LWIN,
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_super_l_,
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U));
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remap Alt to Control too.
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IntegerPrefMember alt;
12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  alt.Init(prefs::kLanguageRemapAltKeyTo, &prefs);
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alt.SetValue(chromeos::input_method::kControlKey);
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Press left Alt. Confirm the event is now VKEY_CONTROL + XK_Control_L.
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL,
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CONTROL_DOWN,
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_control_l_,
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U,
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_MENU,
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_alt_l_,
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U));
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Press right Alt. Confirm the event is now VKEY_CONTROL + XK_Control_R.
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL,
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CONTROL_DOWN,
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_control_r_,
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U,
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_MENU,
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_alt_r_,
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U));
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Press Alt+Search. Confirm the event is now VKEY_CONTROL + XK_Control_L.
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL,
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CONTROL_DOWN,
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_control_l_,
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ControlMask,
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_LWIN,
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_super_l_,
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask));
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Press Control+Alt+Search. Confirm the event is now VKEY_CONTROL +
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_Control_L.
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL,
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CONTROL_DOWN,
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_control_l_,
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ControlMask,
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_LWIN,
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_super_l_,
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ControlMask | Mod1Mask));
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Press Shift+Control+Alt+Search. Confirm the event is now Control with
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shift and Control modifiers.
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL,
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN,
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_control_l_,
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ShiftMask | ControlMask,
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_LWIN,
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_SHIFT_DOWN |
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_super_l_,
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ShiftMask | ControlMask | Mod1Mask));
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Press Shift+Control+Alt+Search+B. Confirm the event is now B with Shift
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and Control modifiers.
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_B,
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN,
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_b_,
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ShiftMask | ControlMask,
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_B,
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_SHIFT_DOWN |
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_b_,
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ShiftMask | ControlMask | Mod1Mask));
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1377d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST_F(EventRewriterTest, TestRewriteModifiersRemapToEscape) {
1378d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Remap Search to ESC.
1379d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  TestingPrefServiceSyncable prefs;
1380d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
1381d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  IntegerPrefMember search;
1382d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs);
1383d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  search.SetValue(chromeos::input_method::kEscapeKey);
1384d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1385d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EventRewriter rewriter;
1386d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  rewriter.set_pref_service_for_testing(&prefs);
1387d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1388d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Press Search. Confirm the event is now VKEY_ESCAPE.
1389d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_ESCAPE,
1390d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                      ui::EF_NONE,
1391d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                      ui::ET_KEY_PRESSED,
1392d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                      keycode_escape_,
1393d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                      0U,
1394d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                      KeyPress),
1395d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
1396d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                      ui::VKEY_LWIN,
1397d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                      0,
1398d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                      ui::ET_KEY_PRESSED,
1399d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                      keycode_super_l_,
1400d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                      0U));
1401d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
1402d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(EventRewriterTest, TestRewriteModifiersRemapMany) {
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remap Search to Alt.
14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSyncable prefs;
14067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IntegerPrefMember search;
14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs);
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  search.SetValue(chromeos::input_method::kAltKey);
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EventRewriter rewriter;
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rewriter.set_pref_service_for_testing(&prefs);
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Press Search. Confirm the event is now VKEY_MENU + XK_Alt_L.
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU,
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_alt_l_,
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U,
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_LWIN,
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_super_l_,
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U));
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remap Alt to Control.
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IntegerPrefMember alt;
14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  alt.Init(prefs::kLanguageRemapAltKeyTo, &prefs);
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alt.SetValue(chromeos::input_method::kControlKey);
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Press left Alt. Confirm the event is now VKEY_CONTROL + XK_Control_L.
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL,
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CONTROL_DOWN,
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_control_l_,
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U,
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_MENU,
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_alt_l_,
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U));
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remap Control to Search.
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IntegerPrefMember control;
14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  control.Init(prefs::kLanguageRemapControlKeyTo, &prefs);
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  control.SetValue(chromeos::input_method::kSearchKey);
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Press left Control. Confirm the event is now VKEY_LWIN.
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_LWIN,
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_super_l_,
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U,
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_CONTROL,
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_control_l_,
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U));
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Then, press all of the three, Control+Alt+Search.
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU,
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_alt_l_,
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ControlMask | Mod4Mask,
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_LWIN,
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_super_l_,
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ControlMask | Mod1Mask));
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Press Shift+Control+Alt+Search.
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU,
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      (ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN |
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       ui::EF_ALT_DOWN),
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_alt_l_,
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ShiftMask | ControlMask | Mod4Mask,
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_LWIN,
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_SHIFT_DOWN |
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_super_l_,
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ShiftMask | ControlMask | Mod1Mask));
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Press Shift+Control+Alt+Search+B
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_B,
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_SHIFT_DOWN |
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_b_,
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ShiftMask | ControlMask | Mod1Mask |
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod4Mask,
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_B,
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_SHIFT_DOWN |
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_b_,
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ShiftMask | ControlMask | Mod1Mask |
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod4Mask));
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(EventRewriterTest, TestRewriteModifiersRemapToCapsLock) {
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remap Search to Caps Lock.
15172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSyncable prefs;
15187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IntegerPrefMember search;
15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs);
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  search.SetValue(chromeos::input_method::kCapsLockKey);
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chromeos::input_method::MockXKeyboard xkeyboard;
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EventRewriter rewriter;
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rewriter.set_pref_service_for_testing(&prefs);
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rewriter.set_xkeyboard_for_testing(&xkeyboard);
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(xkeyboard.caps_lock_is_enabled_);
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Press Search.
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL,
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CAPS_LOCK_DOWN,
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_caps_lock_,
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U,
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_LWIN,
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_super_l_,
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U));
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Confirm that the Caps Lock status is changed.
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(xkeyboard.caps_lock_is_enabled_);
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Release Search.
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL,
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_NONE,
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_RELEASED,
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_caps_lock_,
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      LockMask,
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyRelease),
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_LWIN,
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CAPS_LOCK_DOWN,
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_RELEASED,
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_super_l_,
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod4Mask | LockMask));
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Confirm that the Caps Lock status is not changed.
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(xkeyboard.caps_lock_is_enabled_);
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Press Search.
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL,
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CAPS_LOCK_DOWN,
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_caps_lock_,
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      LockMask,
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_LWIN,
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CAPS_LOCK_DOWN,
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_super_l_,
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      LockMask));
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Confirm that the Caps Lock status is changed.
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(xkeyboard.caps_lock_is_enabled_);
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Release Search.
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL,
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_NONE,
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_RELEASED,
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_caps_lock_,
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      LockMask,
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyRelease),
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_LWIN,
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CAPS_LOCK_DOWN,
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_RELEASED,
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_super_l_,
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod4Mask | LockMask));
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Confirm that the Caps Lock status is not changed.
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(xkeyboard.caps_lock_is_enabled_);
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Press Caps Lock (on an external keyboard).
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL,
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CAPS_LOCK_DOWN,
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_caps_lock_,
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U,
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_CAPITAL,
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_NONE,
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_caps_lock_,
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U));
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Confirm that calling RewriteForTesting() does not change the state of
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |xkeyboard|. In this case, X Window system itself should change the
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Caps Lock state, not ash::EventRewriter.
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(xkeyboard.caps_lock_is_enabled_);
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1612b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Release Caps Lock (on an external keyboard).
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL,
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_NONE,
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_RELEASED,
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_caps_lock_,
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      LockMask,
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyRelease),
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_CAPITAL,
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CAPS_LOCK_DOWN,
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_RELEASED,
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_caps_lock_,
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      LockMask));
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(xkeyboard.caps_lock_is_enabled_);
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(EventRewriterTest, DISABLED_TestRewriteCapsLock) {
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It seems that the X server running on build servers is too old and does not
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // support F16 (i.e. 'XKeysymToKeycode(display_, XF86XK_Launch7)' call).
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(yusukes): Reenable the test once build servers are upgraded.
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSyncable prefs;
16347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chromeos::input_method::MockXKeyboard xkeyboard;
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EventRewriter rewriter;
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rewriter.set_pref_service_for_testing(&prefs);
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rewriter.set_xkeyboard_for_testing(&xkeyboard);
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(xkeyboard.caps_lock_is_enabled_);
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // On Chrome OS, CapsLock is mapped to F16 with Mod3Mask.
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL,
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CAPS_LOCK_DOWN,
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_caps_lock_,
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U,
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_F16,
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_launch7_,
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U));
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(xkeyboard.caps_lock_is_enabled_);
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(EventRewriterTest, DISABLED_TestRewriteDiamondKey) {
16592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(yusukes): Reenable the test once build servers are upgraded.
16602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSyncable prefs;
16627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
16632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chromeos::input_method::MockXKeyboard xkeyboard;
16652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EventRewriter rewriter;
16662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  rewriter.set_pref_service_for_testing(&prefs);
16672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  rewriter.set_xkeyboard_for_testing(&xkeyboard);
16682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // F15 should work as Ctrl when --has-chromeos-diamond-key is not specified.
16702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL,
16712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      ui::EF_CONTROL_DOWN,
16722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      ui::ET_KEY_PRESSED,
16732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      keycode_control_l_,
16742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      0U,
16752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      KeyPress),
16762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
16772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      ui::VKEY_F15,
16782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      0,
16792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      ui::ET_KEY_PRESSED,
16802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      keycode_launch6_,
16812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      0U));
16822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // However, Mod2Mask should not be rewritten to CtrlMask when
16842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // --has-chromeos-diamond-key is not specified.
16852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A,
16862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      0,
16872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      ui::ET_KEY_PRESSED,
16882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      keycode_a_,
16892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      Mod2Mask,
16902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      KeyPress),
16912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
16922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      ui::VKEY_A,
16932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      0,
16942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      ui::ET_KEY_PRESSED,
16952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      keycode_a_,
16962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      Mod2Mask));
16972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(EventRewriterTest, DISABLED_TestRewriteDiamondKeyWithFlag) {
17002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(yusukes): Reenable the test once build servers are upgraded.
17012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const CommandLine original_cl(*CommandLine::ForCurrentProcess());
17032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CommandLine::ForCurrentProcess()->AppendSwitchASCII(
1704b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      chromeos::switches::kHasChromeOSDiamondKey, "");
17052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSyncable prefs;
17077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
17082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chromeos::input_method::MockXKeyboard xkeyboard;
17102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EventRewriter rewriter;
17112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  rewriter.set_pref_service_for_testing(&prefs);
17122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  rewriter.set_xkeyboard_for_testing(&xkeyboard);
17132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // By default, F15 should work as Control.
17152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL,
17162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      ui::EF_CONTROL_DOWN,
17172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      ui::ET_KEY_PRESSED,
17182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      keycode_control_l_,
17192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      0U,
17202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      KeyPress),
17212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
17222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      ui::VKEY_F15,
17232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      0,
17242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      ui::ET_KEY_PRESSED,
17252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      keycode_launch6_,
17262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      0U));
17272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  IntegerPrefMember diamond;
17292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  diamond.Init(prefs::kLanguageRemapDiamondKeyTo, &prefs);
17302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  diamond.SetValue(chromeos::input_method::kVoidKey);
17312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_UNKNOWN,
17332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      0,
17342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      ui::ET_KEY_PRESSED,
17352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      keycode_void_symbol_,
17362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      0U,
17372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      KeyPress),
17382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
17392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      ui::VKEY_F15,
17402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      0,
17412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      ui::ET_KEY_PRESSED,
17422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      keycode_launch6_,
17432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      0U));
17442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  diamond.SetValue(chromeos::input_method::kControlKey);
17462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL,
17482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      ui::EF_CONTROL_DOWN,
17492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      ui::ET_KEY_PRESSED,
17502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      keycode_control_l_,
17512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      0U,
17522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      KeyPress),
17532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
17542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      ui::VKEY_F15,
17552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      0,
17562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      ui::ET_KEY_PRESSED,
17572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      keycode_launch6_,
17582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      0U));
17592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  diamond.SetValue(chromeos::input_method::kAltKey);
17612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_MENU,
17632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      ui::EF_ALT_DOWN,
17642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      ui::ET_KEY_PRESSED,
17652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      keycode_alt_l_,
17662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      0,
17672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      KeyPress),
17682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
17692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      ui::VKEY_F15,
17702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      0,
17712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      ui::ET_KEY_PRESSED,
17722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      keycode_launch6_,
17732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      0U));
17742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  diamond.SetValue(chromeos::input_method::kCapsLockKey);
17762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CAPITAL,
17782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      ui::EF_CAPS_LOCK_DOWN,
17792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      ui::ET_KEY_PRESSED,
17802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      keycode_caps_lock_,
17812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      0U,
17822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      KeyPress),
17832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
17842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      ui::VKEY_F15,
17852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      0,
17862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      ui::ET_KEY_PRESSED,
17872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      keycode_launch6_,
17882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      0U));
17892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *CommandLine::ForCurrentProcess() = original_cl;
17912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(EventRewriterTest, TestRewriteCapsLockToControl) {
17942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSyncable prefs;
17957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IntegerPrefMember control;
17972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs);
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  control.SetValue(chromeos::input_method::kControlKey);
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EventRewriter rewriter;
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rewriter.set_pref_service_for_testing(&prefs);
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Press CapsLock+a. Confirm that Mod3Mask is rewritten to ControlMask.
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // On Chrome OS, CapsLock works as a Mod3 modifier.
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A,
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CONTROL_DOWN,
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_a_,
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ControlMask,
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_A,
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_a_,
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod3Mask));
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Press Control+CapsLock+a. Confirm that Mod3Mask is rewritten to ControlMask
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A,
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CONTROL_DOWN,
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_a_,
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ControlMask,
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_A,
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CONTROL_DOWN,
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_a_,
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod3Mask | ControlMask));
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Press Alt+CapsLock+a. Confirm that Mod3Mask is rewritten to ControlMask.
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A,
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_a_,
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask | ControlMask,
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_A,
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_a_,
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask | Mod3Mask));
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(EventRewriterTest, TestRewriteCapsLockMod3InUse) {
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remap CapsLock to Control.
18492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSyncable prefs;
18507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IntegerPrefMember control;
18522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  control.Init(prefs::kLanguageRemapCapsLockKeyTo, &prefs);
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  control.SetValue(chromeos::input_method::kControlKey);
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EventRewriter rewriter;
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rewriter.set_pref_service_for_testing(&prefs);
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_method_manager_mock_->SetCurrentInputMethodId("xkb:de:neo:ger");
18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Press CapsLock+a. Confirm that Mod3Mask is NOT rewritten to ControlMask
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when Mod3Mask is already in use by the current XKB layout.
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_A,
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_a_,
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod3Mask,
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_A,
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_a_,
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod3Mask));
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_method_manager_mock_->SetCurrentInputMethodId("xkb:us::eng");
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(EventRewriterTest, TestRewriteExtendedKeys) {
18782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSyncable prefs;
18797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EventRewriter rewriter;
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rewriter.set_pref_service_for_testing(&prefs);
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct {
18842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui::KeyboardCode input;
18852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    KeyCode input_native;
18862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unsigned int input_mods;
18872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unsigned int input_native_mods;
18882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui::KeyboardCode output;
18892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    KeyCode output_native;
18902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unsigned int output_mods;
18912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unsigned int output_native_mods;
18922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } chromeos_tests[] = {
18932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Alt+Backspace -> Delete
18942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_BACK, keycode_backspace_,
18952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::EF_ALT_DOWN, Mod1Mask,
18962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_DELETE, keycode_delete_,
18972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      0, 0, },
18982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Control+Alt+Backspace -> Control+Delete
18992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_BACK, keycode_backspace_,
19002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask,
19012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_DELETE, keycode_delete_,
19022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::EF_CONTROL_DOWN, ControlMask, },
19032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Search+Alt+Backspace -> Alt+Backspace
19042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_BACK, keycode_backspace_,
19052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::EF_ALT_DOWN, Mod1Mask | Mod4Mask,
19062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_BACK, keycode_backspace_,
19072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::EF_ALT_DOWN, Mod1Mask, },
19082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Search+Control+Alt+Backspace -> Control+Alt+Backspace
19092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_BACK, keycode_backspace_,
19102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask | Mod4Mask,
19112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_BACK, keycode_backspace_,
19122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask, },
19132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Alt+Up -> Prior
19142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_UP, keycode_up_,
19152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::EF_ALT_DOWN, Mod1Mask,
19162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_PRIOR, keycode_prior_,
19172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      0, 0, },
19182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Alt+Down -> Next
19192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_DOWN, keycode_down_,
19202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::EF_ALT_DOWN, Mod1Mask,
19212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_NEXT, keycode_next_,
19222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      0, 0, },
19232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Ctrl+Alt+Up -> Home
19242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_UP, keycode_up_,
19252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask,
19262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_HOME, keycode_home_,
19272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      0, 0, },
19282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Ctrl+Alt+Down -> End
19292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_DOWN, keycode_down_,
19302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask,
19312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_END, keycode_end_,
19322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      0, 0, },
19332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Search+Alt+Up -> Alt+Up
19352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_UP, keycode_up_,
19362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::EF_ALT_DOWN, Mod1Mask | Mod4Mask,
19372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_UP, keycode_up_,
19382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::EF_ALT_DOWN, Mod1Mask },
19392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Search+Alt+Down -> Alt+Down
19402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_DOWN, keycode_down_,
19412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::EF_ALT_DOWN, Mod1Mask | Mod4Mask,
19422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_DOWN, keycode_down_,
19432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::EF_ALT_DOWN, Mod1Mask },
19442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Search+Ctrl+Alt+Up -> Search+Ctrl+Alt+Up
19452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_UP, keycode_up_,
19462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask | Mod4Mask,
19472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_UP, keycode_up_,
19482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask },
19492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Search+Ctrl+Alt+Down -> Ctrl+Alt+Down
19502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_DOWN, keycode_down_,
19512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask | Mod4Mask,
19522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_DOWN, keycode_down_,
19532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask },
19542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Period -> Period
19562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_OEM_PERIOD, keycode_period_, 0, 0,
19572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_OEM_PERIOD, keycode_period_, 0, 0 },
19582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Search+Backspace -> Delete
19602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_BACK, keycode_backspace_,
19612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      0, Mod4Mask,
19622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_DELETE, keycode_delete_,
19632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      0, 0, },
19642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Search+Up -> Prior
19652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_UP, keycode_up_,
19662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      0, Mod4Mask,
19672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_PRIOR, keycode_prior_,
19682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      0, 0, },
19692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Search+Down -> Next
19702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_DOWN, keycode_down_,
19712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      0, Mod4Mask,
19722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_NEXT, keycode_next_,
19732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      0, 0, },
19742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Search+Left -> Home
19752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_LEFT, keycode_left_,
19762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      0, Mod4Mask,
19772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_HOME, keycode_home_,
19782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      0, 0, },
19792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Control+Search+Left -> Home
19802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_LEFT, keycode_left_,
19812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::EF_CONTROL_DOWN, Mod4Mask | ControlMask,
19822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_HOME, keycode_home_,
19832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::EF_CONTROL_DOWN, ControlMask },
19842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Search+Right -> End
19852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_RIGHT, keycode_right_,
19862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      0, Mod4Mask,
19872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_END, keycode_end_,
19882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      0, 0, },
19892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Control+Search+Right -> End
19902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_RIGHT, keycode_right_,
19912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::EF_CONTROL_DOWN, Mod4Mask | ControlMask,
19922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_END, keycode_end_,
19932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::EF_CONTROL_DOWN, ControlMask },
19942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Search+Period -> Insert
19952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_OEM_PERIOD, keycode_period_, 0, Mod4Mask,
19962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_INSERT, keycode_insert_, 0, 0 },
19972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Control+Search+Period -> Control+Insert
19982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_OEM_PERIOD, keycode_period_,
19992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::EF_CONTROL_DOWN, Mod4Mask | ControlMask,
20002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_INSERT, keycode_insert_,
20012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::EF_CONTROL_DOWN, ControlMask }
20022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
20032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(chromeos_tests); ++i) {
20052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(GetExpectedResultAsString(chromeos_tests[i].output,
20062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        chromeos_tests[i].output_mods,
20072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        ui::ET_KEY_PRESSED,
20082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        chromeos_tests[i].output_native,
20092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        chromeos_tests[i].output_native_mods,
20102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        KeyPress),
20112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              GetRewrittenEventAsString(&rewriter,
20122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        chromeos_tests[i].input,
20132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        chromeos_tests[i].input_mods,
20142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        ui::ET_KEY_PRESSED,
20152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        chromeos_tests[i].input_native,
20162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        chromeos_tests[i].input_native_mods));
20172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
20182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(EventRewriterTest, TestRewriteFunctionKeys) {
20212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSyncable prefs;
20227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
20232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EventRewriter rewriter;
20242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  rewriter.set_pref_service_for_testing(&prefs);
20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct {
20272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui::KeyboardCode input;
20282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    KeyCode input_native;
20292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unsigned int input_native_mods;
20302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unsigned int input_mods;
20312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui::KeyboardCode output;
20322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    KeyCode output_native;
20332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unsigned int output_native_mods;
20342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unsigned int output_mods;
20352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } tests[] = {
20362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // F1 -> Back
20372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F1, keycode_f1_, 0, 0,
20382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_BROWSER_BACK, keycode_browser_back_, 0, 0 },
20392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F1, keycode_f1_, ControlMask, ui::EF_CONTROL_DOWN,
20402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_BROWSER_BACK, keycode_browser_back_,
20412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ControlMask, ui::EF_CONTROL_DOWN },
20422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F1, keycode_f1_, Mod1Mask, ui::EF_ALT_DOWN,
20432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_BROWSER_BACK, keycode_browser_back_,
20442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Mod1Mask, ui::EF_ALT_DOWN },
20452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // F2 -> Forward
20462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F2, keycode_f2_, 0, 0,
20472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_BROWSER_FORWARD, keycode_browser_forward_, 0, 0 },
20482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F2, keycode_f2_, ControlMask, ui::EF_CONTROL_DOWN,
20492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_BROWSER_FORWARD, keycode_browser_forward_,
20502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ControlMask, ui::EF_CONTROL_DOWN },
20512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F2, keycode_f2_, Mod1Mask, ui::EF_ALT_DOWN,
20522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_BROWSER_FORWARD, keycode_browser_forward_,
20532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Mod1Mask, ui::EF_ALT_DOWN },
20542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // F3 -> Refresh
20552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F3, keycode_f3_, 0, 0,
20562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_BROWSER_REFRESH, keycode_browser_refresh_, 0, 0 },
20572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F3, keycode_f3_, ControlMask, ui::EF_CONTROL_DOWN,
20582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_BROWSER_REFRESH, keycode_browser_refresh_,
20592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ControlMask, ui::EF_CONTROL_DOWN },
20602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F3, keycode_f3_, Mod1Mask, ui::EF_ALT_DOWN,
20612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_BROWSER_REFRESH, keycode_browser_refresh_,
20622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Mod1Mask, ui::EF_ALT_DOWN },
20632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // F4 -> Launch App 2
20642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F4, keycode_f4_, 0, 0,
20652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_MEDIA_LAUNCH_APP2, keycode_media_launch_app2_, 0, 0 },
20662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F4, keycode_f4_, ControlMask, ui::EF_CONTROL_DOWN,
20672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_MEDIA_LAUNCH_APP2, keycode_media_launch_app2_,
20682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ControlMask, ui::EF_CONTROL_DOWN },
20692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F4, keycode_f4_, Mod1Mask, ui::EF_ALT_DOWN,
20702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_MEDIA_LAUNCH_APP2, keycode_media_launch_app2_,
20712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Mod1Mask, ui::EF_ALT_DOWN },
20722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // F5 -> Launch App 1
20732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F5, keycode_f5_, 0, 0,
20742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_MEDIA_LAUNCH_APP1, keycode_media_launch_app1_, 0, 0 },
20752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F5, keycode_f5_, ControlMask, ui::EF_CONTROL_DOWN,
20762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_MEDIA_LAUNCH_APP1, keycode_media_launch_app1_,
20772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ControlMask, ui::EF_CONTROL_DOWN },
20782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F5, keycode_f5_, Mod1Mask, ui::EF_ALT_DOWN,
20792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_MEDIA_LAUNCH_APP1, keycode_media_launch_app1_,
20802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Mod1Mask, ui::EF_ALT_DOWN },
20812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // F6 -> Brightness down
20822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F6, keycode_f6_, 0, 0,
20832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_BRIGHTNESS_DOWN, keycode_brightness_down_, 0, 0 },
20842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F6, keycode_f6_, ControlMask, ui::EF_CONTROL_DOWN,
20852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_BRIGHTNESS_DOWN, keycode_brightness_down_,
20862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ControlMask, ui::EF_CONTROL_DOWN },
20872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F6, keycode_f6_, Mod1Mask, ui::EF_ALT_DOWN,
20882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_BRIGHTNESS_DOWN, keycode_brightness_down_,
20892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Mod1Mask, ui::EF_ALT_DOWN },
20902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // F7 -> Brightness up
20912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F7, keycode_f7_, 0, 0,
20922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_BRIGHTNESS_UP, keycode_brightness_up_, 0, 0 },
20932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F7, keycode_f7_, ControlMask, ui::EF_CONTROL_DOWN,
20942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_BRIGHTNESS_UP, keycode_brightness_up_,
20952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ControlMask, ui::EF_CONTROL_DOWN },
20962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F7, keycode_f7_, Mod1Mask, ui::EF_ALT_DOWN,
20972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_BRIGHTNESS_UP, keycode_brightness_up_,
20982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Mod1Mask, ui::EF_ALT_DOWN },
20992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // F8 -> Volume Mute
21002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F8, keycode_f8_, 0, 0,
21012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_VOLUME_MUTE, keycode_volume_mute_, 0, 0 },
21022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F8, keycode_f8_, ControlMask, ui::EF_CONTROL_DOWN,
21032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_VOLUME_MUTE, keycode_volume_mute_,
21042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ControlMask, ui::EF_CONTROL_DOWN },
21052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F8, keycode_f8_, Mod1Mask, ui::EF_ALT_DOWN,
21062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_VOLUME_MUTE, keycode_volume_mute_,
21072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Mod1Mask, ui::EF_ALT_DOWN },
21082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // F9 -> Volume Down
21092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F9, keycode_f9_, 0, 0,
21102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_VOLUME_DOWN, keycode_volume_down_, 0, 0 },
21112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F9, keycode_f9_, ControlMask, ui::EF_CONTROL_DOWN,
21122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_VOLUME_DOWN, keycode_volume_down_,
21132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ControlMask, ui::EF_CONTROL_DOWN },
21142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F9, keycode_f9_, Mod1Mask, ui::EF_ALT_DOWN,
21152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_VOLUME_DOWN, keycode_volume_down_,
21162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Mod1Mask, ui::EF_ALT_DOWN },
21172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // F10 -> Volume Up
21182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F10, keycode_f10_, 0, 0,
21192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_VOLUME_UP, keycode_volume_up_, 0, 0 },
21202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F10, keycode_f10_, ControlMask, ui::EF_CONTROL_DOWN,
21212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_VOLUME_UP, keycode_volume_up_,
21222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ControlMask, ui::EF_CONTROL_DOWN },
21232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F10, keycode_f10_, Mod1Mask, ui::EF_ALT_DOWN,
21242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_VOLUME_UP, keycode_volume_up_,
21252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Mod1Mask, ui::EF_ALT_DOWN },
21262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // F11 -> F11
21272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F11, keycode_f11_, 0, 0,
21282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_F11, keycode_f11_, 0, 0 },
21292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F11, keycode_f11_, ControlMask, ui::EF_CONTROL_DOWN,
21302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_F11, keycode_f11_, ControlMask, ui::EF_CONTROL_DOWN },
21312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F11, keycode_f11_, Mod1Mask, ui::EF_ALT_DOWN,
21322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_F11, keycode_f11_, Mod1Mask, ui::EF_ALT_DOWN },
21332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // F12 -> F12
21342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F12, keycode_f12_, 0, 0,
21352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_F12, keycode_f12_, 0, 0 },
21362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F12, keycode_f12_, ControlMask, ui::EF_CONTROL_DOWN,
21372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_F12, keycode_f12_, ControlMask, ui::EF_CONTROL_DOWN },
21382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F12, keycode_f12_, Mod1Mask, ui::EF_ALT_DOWN,
21392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_F12, keycode_f12_, Mod1Mask, ui::EF_ALT_DOWN },
21402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The number row should not be rewritten without Search key.
21422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_1, keycode_1_, 0, 0,
21432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_1, keycode_1_, 0, 0 },
21442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_2, keycode_2_, 0, 0,
21452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_2, keycode_2_, 0, 0 },
21462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_3, keycode_3_, 0, 0,
21472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_3, keycode_3_, 0, 0 },
21482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_4, keycode_4_, 0, 0,
21492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_4, keycode_4_, 0, 0 },
21502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_5, keycode_5_, 0, 0,
21512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_5, keycode_5_, 0, 0 },
21522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_6, keycode_6_, 0, 0,
21532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_6, keycode_6_, 0, 0 },
21542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_7, keycode_7_, 0, 0,
21552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_7, keycode_7_, 0, 0 },
21562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_8, keycode_8_, 0, 0,
21572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_8, keycode_8_, 0, 0 },
21582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_9, keycode_9_, 0, 0,
21592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_9, keycode_9_, 0, 0 },
21602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_0, keycode_0_, 0, 0,
21612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_0, keycode_0_, 0, 0 },
21622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_OEM_MINUS, keycode_minus_, 0, 0,
21632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_OEM_MINUS, keycode_minus_, 0, 0 },
21642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_OEM_PLUS, keycode_equal_, 0, 0,
21652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_OEM_PLUS, keycode_equal_, 0, 0 },
21662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The number row should be rewritten as the F<number> row with Search key.
21682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_1, keycode_1_, Mod4Mask, 0,
21692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_F1, keycode_f1_, 0, 0 },
21702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_2, keycode_2_, Mod4Mask, 0,
21712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_F2, keycode_f2_, 0, 0 },
21722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_3, keycode_3_, Mod4Mask, 0,
21732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_F3, keycode_f3_, 0, 0 },
21742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_4, keycode_4_, Mod4Mask, 0,
21752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_F4, keycode_f4_, 0, 0 },
21762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_5, keycode_5_, Mod4Mask, 0,
21772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_F5, keycode_f5_, 0, 0 },
21782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_6, keycode_6_, Mod4Mask, 0,
21792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_F6, keycode_f6_, 0, 0 },
21802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_7, keycode_7_, Mod4Mask, 0,
21812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_F7, keycode_f7_, 0, 0 },
21822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_8, keycode_8_, Mod4Mask, 0,
21832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_F8, keycode_f8_, 0, 0 },
21842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_9, keycode_9_, Mod4Mask, 0,
21852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_F9, keycode_f9_, 0, 0 },
21862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_0, keycode_0_, Mod4Mask, 0,
21872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_F10, keycode_f10_, 0, 0 },
21882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_OEM_MINUS, keycode_minus_, Mod4Mask, 0,
21892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_F11, keycode_f11_, 0, 0 },
21902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_OEM_PLUS, keycode_equal_, Mod4Mask, 0,
21912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_F12, keycode_f12_, 0, 0 },
21922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The function keys should not be rewritten with Search key pressed.
21942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F1, keycode_f1_, Mod4Mask, 0,
21952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_F1, keycode_f1_, 0, 0 },
21962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F2, keycode_f2_, Mod4Mask, 0,
21972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_F2, keycode_f2_, 0, 0 },
21982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F3, keycode_f3_, Mod4Mask, 0,
21992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_F3, keycode_f3_, 0, 0 },
22002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F4, keycode_f4_, Mod4Mask, 0,
22012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_F4, keycode_f4_, 0, 0 },
22022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F5, keycode_f5_, Mod4Mask, 0,
22032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_F5, keycode_f5_, 0, 0 },
22042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F6, keycode_f6_, Mod4Mask, 0,
22052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_F6, keycode_f6_, 0, 0 },
22062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F7, keycode_f7_, Mod4Mask, 0,
22072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_F7, keycode_f7_, 0, 0 },
22082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F8, keycode_f8_, Mod4Mask, 0,
22092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_F8, keycode_f8_, 0, 0 },
22102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F9, keycode_f9_, Mod4Mask, 0,
22112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_F9, keycode_f9_, 0, 0 },
22122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F10, keycode_f10_, Mod4Mask, 0,
22132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_F10, keycode_f10_, 0, 0 },
22142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F11, keycode_f11_, Mod4Mask, 0,
22152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_F11, keycode_f11_, 0, 0 },
22162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    { ui::VKEY_F12, keycode_f12_, Mod4Mask, 0,
22172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::VKEY_F12, keycode_f12_, 0, 0 },
22182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
22192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
22212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(GetExpectedResultAsString(tests[i].output,
22222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        tests[i].output_mods,
22232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        ui::ET_KEY_PRESSED,
22242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        tests[i].output_native,
22252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        tests[i].output_native_mods,
22262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        KeyPress),
22272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              GetRewrittenEventAsString(&rewriter,
22282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        tests[i].input,
22292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        tests[i].input_mods,
22302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        ui::ET_KEY_PRESSED,
22312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        tests[i].input_native,
22322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        tests[i].input_native_mods));
22332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(EventRewriterTest, TestRewriteExtendedKeysWithSearchRemapped) {
22372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const CommandLine original_cl(*CommandLine::ForCurrentProcess());
22382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remap Search to Control.
22402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSyncable prefs;
22417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IntegerPrefMember search;
22432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  search.Init(prefs::kLanguageRemapSearchKeyTo, &prefs);
22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  search.SetValue(chromeos::input_method::kControlKey);
22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EventRewriter rewriter;
22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rewriter.set_pref_service_for_testing(&prefs);
22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CommandLine::ForCurrentProcess()->AppendSwitchASCII(
2250b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      chromeos::switches::kHasChromeOSKeyboard, "");
22512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Alt+Search+Down -> End
22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_END,
22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0,
22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_end_,
22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U,
22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_DOWN,
22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_ALT_DOWN,
22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_down_,
22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Mod1Mask | Mod4Mask));
22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Shift+Alt+Search+Down -> Shift+End
22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_END,
22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_SHIFT_DOWN,
22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_end_,
22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ShiftMask,
22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetRewrittenEventAsString(&rewriter,
22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::VKEY_DOWN,
22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_down_,
22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ShiftMask | Mod1Mask | Mod4Mask));
22792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *CommandLine::ForCurrentProcess() = original_cl;
22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(EventRewriterTest, TestRewriteKeyEventSentByXSendEvent) {
22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remap Control to Alt.
22852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefServiceSyncable prefs;
22867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  chromeos::Preferences::RegisterProfilePrefs(prefs.registry());
22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IntegerPrefMember control;
22882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  control.Init(prefs::kLanguageRemapControlKeyTo, &prefs);
22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  control.SetValue(chromeos::input_method::kAltKey);
22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EventRewriter rewriter;
22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rewriter.set_pref_service_for_testing(&prefs);
22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send left control press.
22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string rewritten_event;
22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2297f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ui::ScopedXI2Event xev;
2298f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    xev.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, 0);
2299f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    XEvent* xevent = xev;
2300f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    xevent->xkey.keycode = keycode_control_l_;
2301f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    xevent->xkey.send_event = True;  // XSendEvent() always does this.
2302f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ui::KeyEvent keyevent(xev, false /* is_char */);
23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rewriter.RewriteForTesting(&keyevent);
23042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    rewritten_event = base::StringPrintf(
23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "ui_keycode=%d ui_flags=%d ui_type=%d "
23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "x_keycode=%u x_state=%u x_type=%d",
23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        keyevent.key_code(), keyevent.flags(), keyevent.type(),
2308f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        xevent->xkey.keycode, xevent->xkey.state, xevent->xkey.type);
23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // XK_Control_L (left Control key) should NOT be remapped to Alt if send_event
23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // flag in the event is True.
23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetExpectedResultAsString(ui::VKEY_CONTROL,
23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::EF_CONTROL_DOWN,
23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ui::ET_KEY_PRESSED,
23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      keycode_control_l_,
23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      0U,
23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      KeyPress),
23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            rewritten_event);
23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
23224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Tests of event rewriting that depend on the Ash window manager.
23234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class EventRewriterAshTest : public ash::test::AshTestBase {
23244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
23251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EventRewriterAshTest() {
23261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    chromeos::Preferences::RegisterProfilePrefs(prefs_.registry());
23271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    rewriter_.set_pref_service_for_testing(&prefs_);
23281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
23294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual ~EventRewriterAshTest() {}
23304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
23314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool RewriteFunctionKeys(ui::KeyEvent* event) {
23324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return rewriter_.RewriteFunctionKeys(event);
23334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
23344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
23351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) protected:
23361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  TestingPrefServiceSyncable prefs_;
23371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
23384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private:
23394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EventRewriter rewriter_;
23404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
23414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(EventRewriterAshTest);
23424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
23434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
23444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(EventRewriterAshTest, TopRowKeysAreFunctionKeys) {
23454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<aura::Window> window(CreateTestWindowInShellWithId(1));
23464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ash::wm::WindowState* window_state = ash::wm::GetWindowState(window.get());
23474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  window_state->Activate();
23484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
23494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Create a simulated keypress of F1 targetted at the window.
2350f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ui::ScopedXI2Event xev_f1;
23514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  KeyCode keycode_f1 = XKeysymToKeycode(gfx::GetXDisplay(), XK_F1);
2352f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  xev_f1.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_F1, 0);
2353f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  XEvent* xevent = xev_f1;
2354f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  xevent->xkey.keycode = keycode_f1;
2355f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ui::KeyEvent press_f1(xev_f1, false);
23564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ui::Event::DispatcherApi dispatch_helper(&press_f1);
23574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  dispatch_helper.set_target(window.get());
23584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
23594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Simulate an apps v2 window that has requested top row keys as function
23604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // keys. The event should not be rewritten.
23614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  window_state->set_top_row_keys_are_function_keys(true);
23621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_FALSE(RewriteFunctionKeys(&press_f1));
23631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_EQ(ui::VKEY_F1, press_f1.key_code());
23641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
23651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // The event should also not be rewritten if the send-function-keys pref is
23661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // additionally set, for both apps v2 and regular windows.
23671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  BooleanPrefMember send_function_keys_pref;
23681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  send_function_keys_pref.Init(prefs::kLanguageSendFunctionKeys, &prefs_);
23691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  send_function_keys_pref.SetValue(true);
23701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_FALSE(RewriteFunctionKeys(&press_f1));
23711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_EQ(ui::VKEY_F1, press_f1.key_code());
23724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  window_state->set_top_row_keys_are_function_keys(false);
23731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_FALSE(RewriteFunctionKeys(&press_f1));
23741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_EQ(ui::VKEY_F1, press_f1.key_code());
23751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
23761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // If the pref isn't set when an event is sent to a regular window, F1 is
23771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // rewritten to the back key.
23781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  send_function_keys_pref.SetValue(false);
23791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_TRUE(RewriteFunctionKeys(&press_f1));
23801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_EQ(ui::VKEY_BROWSER_BACK, press_f1.key_code());
23814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
23824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // OS_CHROMEOS
2384