blob: 8c3a7a61ba6a04328bb199330c71c951e8ec7ce0 [file] [log] [blame]
[email protected]9d6182f2014-02-16 04:21:561// Copyright 2014 The Chromium Authors. All rights reserved.
[email protected]9822df92012-03-31 03:52:562// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]d13e288992014-05-01 18:00:215#include <vector>
6
[email protected]354520b2014-06-21 04:31:017#include "ash/shell.h"
8#include "ash/sticky_keys/sticky_keys_controller.h"
9#include "ash/sticky_keys/sticky_keys_overlay.h"
[email protected]9d6182f2014-02-16 04:21:5610#include "ash/test/ash_test_base.h"
[email protected]ac8df2f2012-11-01 21:26:3611#include "base/command_line.h"
avi8a07d53892015-12-24 22:13:5312#include "base/macros.h"
avi3dbcc202017-03-13 02:48:3613#include "base/memory/ptr_util.h"
[email protected]b54c2532013-06-12 00:17:4814#include "base/strings/stringprintf.h"
penghuange5df2822017-03-16 22:54:3615#include "chrome/browser/chromeos/events/event_rewriter_delegate_impl.h"
[email protected]c02a4242012-12-11 18:36:3216#include "chrome/browser/chromeos/input_method/input_method_configuration.h"
azurewei045de382017-01-06 02:06:0017#include "chrome/browser/chromeos/input_method/mock_input_method_manager_impl.h"
yoshiki18898fb2016-11-18 15:59:4818#include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
[email protected]4d390782014-08-15 09:22:5819#include "chrome/browser/chromeos/login/users/scoped_user_manager_enabler.h"
[email protected]350c9232012-05-25 04:16:0620#include "chrome/browser/chromeos/preferences.h"
[email protected]9d6182f2014-02-16 04:21:5621#include "chrome/common/pref_names.h"
[email protected]2f2d6c32013-05-10 02:56:2422#include "chromeos/chromeos_switches.h"
brettwb1fc1b82016-02-02 00:19:0823#include "components/prefs/pref_member.h"
maxbogueea16ff412016-10-28 16:35:2924#include "components/sync_preferences/testing_pref_service_syncable.h"
[email protected]9d6182f2014-02-16 04:21:5625#include "testing/gtest/include/gtest/gtest.h"
[email protected]f7ab9b6042013-10-07 23:27:2026#include "ui/aura/window.h"
[email protected]354520b2014-06-21 04:31:0127#include "ui/aura/window_tree_host.h"
shuchen179b1f42014-11-27 17:24:4028#include "ui/base/ime/chromeos/fake_ime_keyboard.h"
penghuange5df2822017-03-16 22:54:3629#include "ui/chromeos/events/event_rewriter_chromeos.h"
Blake O'Hared00831e2017-10-06 12:37:2530#include "ui/chromeos/events/modifier_key.h"
penghuange5df2822017-03-16 22:54:3631#include "ui/chromeos/events/pref_names.h"
[email protected]9d6182f2014-02-16 04:21:5632#include "ui/events/event.h"
[email protected]d13e288992014-05-01 18:00:2133#include "ui/events/event_rewriter.h"
robert.bradfordb3d800b2015-02-18 18:56:1034#include "ui/events/event_utils.h"
kpschoedel3b0960a2015-05-11 17:52:1135#include "ui/events/keycodes/dom/dom_code.h"
36#include "ui/events/keycodes/dom/dom_key.h"
37#include "ui/events/keycodes/dom/keycode_converter.h"
[email protected]595079ce2014-07-11 22:25:1338#include "ui/events/test/events_test_utils.h"
[email protected]354520b2014-06-21 04:31:0139#include "ui/events/test/test_event_processor.h"
James Cook55648272017-09-13 23:14:0140#include "ui/wm/core/window_util.h"
[email protected]354520b2014-06-21 04:31:0141
[email protected]9822df92012-03-31 03:52:5642namespace {
43
kylechar0166bdb2017-08-10 05:15:0544constexpr int kKeyboardDeviceId = 123;
[email protected]354520b2014-06-21 04:31:0145
kpschoedel8226fd152015-05-06 15:48:5946std::string GetExpectedResultAsString(ui::EventType ui_type,
47 ui::KeyboardCode ui_keycode,
48 ui::DomCode code,
49 int ui_flags, // ui::EventFlags
kpschoedel51d2e322015-08-28 15:29:3550 ui::DomKey key) {
kpschoedel02c854d2015-06-16 14:44:2951 return base::StringPrintf(
kpschoedel51d2e322015-08-28 15:29:3552 "type=%d code=0x%06X flags=0x%X vk=0x%02X key=0x%08X", ui_type,
kpschoedel02c854d2015-06-16 14:44:2953 static_cast<unsigned int>(code), ui_flags & ~ui::EF_IS_REPEAT, ui_keycode,
kpschoedel51d2e322015-08-28 15:29:3554 static_cast<unsigned int>(key));
[email protected]106cf972014-05-28 17:28:1755}
56
57std::string GetKeyEventAsString(const ui::KeyEvent& keyevent) {
kpschoedel51d2e322015-08-28 15:29:3558 return GetExpectedResultAsString(keyevent.type(), keyevent.key_code(),
59 keyevent.code(), keyevent.flags(),
60 keyevent.GetDomKey());
[email protected]d13e288992014-05-01 18:00:2161}
62
penghuange5df2822017-03-16 22:54:3663std::string GetRewrittenEventAsString(
64 const std::unique_ptr<ui::EventRewriterChromeOS>& rewriter,
65 ui::EventType ui_type,
66 ui::KeyboardCode ui_keycode,
67 ui::DomCode code,
68 int ui_flags, // ui::EventFlags
69 ui::DomKey key) {
Dmitry Torokhov0bcc3cf2017-07-15 17:50:3070 ui::KeyEvent event(ui_type, ui_keycode, code, ui_flags, key,
71 ui::EventTimeForNow());
72 event.set_source_device_id(kKeyboardDeviceId);
dcheng24002d02016-04-08 02:42:4073 std::unique_ptr<ui::Event> new_event;
[email protected]d13e288992014-05-01 18:00:2174 rewriter->RewriteEvent(event, &new_event);
75 if (new_event)
moshayedi4e6623012016-03-02 04:53:5876 return GetKeyEventAsString(*new_event->AsKeyEvent());
[email protected]d13e288992014-05-01 18:00:2177 return GetKeyEventAsString(event);
[email protected]350c9232012-05-25 04:16:0678}
79
[email protected]106cf972014-05-28 17:28:1780// Table entry for simple single key event rewriting tests.
81struct KeyTestCase {
[email protected]106cf972014-05-28 17:28:1782 ui::EventType type;
kpschoedel8226fd152015-05-06 15:48:5983 struct Event {
[email protected]106cf972014-05-28 17:28:1784 ui::KeyboardCode key_code;
kpschoedel8226fd152015-05-06 15:48:5985 ui::DomCode code;
86 int flags; // ui::EventFlags
kpschoedel51d2e322015-08-28 15:29:3587 ui::DomKey::Base key;
[email protected]106cf972014-05-28 17:28:1788 } input, expected;
89};
[email protected]d13e288992014-05-01 18:00:2190
kpschoedel8226fd152015-05-06 15:48:5991std::string GetTestCaseAsString(ui::EventType ui_type,
92 const KeyTestCase::Event& test) {
93 return GetExpectedResultAsString(ui_type, test.key_code, test.code,
kpschoedel51d2e322015-08-28 15:29:3594 test.flags, test.key);
kpschoedel8226fd152015-05-06 15:48:5995}
96
[email protected]106cf972014-05-28 17:28:1797// Tests a single stateless key rewrite operation.
penghuange5df2822017-03-16 22:54:3698void CheckKeyTestCase(
99 const std::unique_ptr<ui::EventRewriterChromeOS>& rewriter,
100 const KeyTestCase& test) {
kpschoedel02c854d2015-06-16 14:44:29101 SCOPED_TRACE("\nSource: " + GetTestCaseAsString(test.type, test.input));
kpschoedel8226fd152015-05-06 15:48:59102 std::string expected = GetTestCaseAsString(test.type, test.expected);
kpschoedel51d2e322015-08-28 15:29:35103 EXPECT_EQ(expected, GetRewrittenEventAsString(
104 rewriter, test.type, test.input.key_code,
105 test.input.code, test.input.flags, test.input.key));
[email protected]36552d52014-06-06 18:52:03106}
107
[email protected]7f926752014-01-30 09:16:35108} // namespace
109
[email protected]9d6182f2014-02-16 04:21:56110namespace chromeos {
111
James Cook317781a2017-07-18 02:08:06112class EventRewriterTest : public ash::AshTestBase {
[email protected]350c9232012-05-25 04:16:06113 public:
[email protected]b9d224c2012-07-13 01:09:03114 EventRewriterTest()
yoshiki18898fb2016-11-18 15:59:48115 : fake_user_manager_(new chromeos::FakeChromeUserManager),
azurewei045de382017-01-06 02:06:00116 user_manager_enabler_(fake_user_manager_) {}
dchengc97a0282015-01-15 23:04:24117 ~EventRewriterTest() override {}
[email protected]59409342012-09-21 01:03:43118
dchengc97a0282015-01-15 23:04:24119 void SetUp() override {
azurewei045de382017-01-06 02:06:00120 input_method_manager_mock_ = new input_method::MockInputMethodManagerImpl;
[email protected]c02a4242012-12-11 18:36:32121 chromeos::input_method::InitializeForTesting(
[email protected]59409342012-09-21 01:03:43122 input_method_manager_mock_); // pass ownership
penghuange5df2822017-03-16 22:54:36123 delegate_ = base::MakeUnique<EventRewriterDelegateImpl>();
124 delegate_->set_pref_service_for_testing(prefs());
125 rewriter_ =
126 base::MakeUnique<ui::EventRewriterChromeOS>(delegate_.get(), nullptr);
[email protected]9d6182f2014-02-16 04:21:56127 AshTestBase::SetUp();
[email protected]59409342012-09-21 01:03:43128 }
129
dchengc97a0282015-01-15 23:04:24130 void TearDown() override {
[email protected]9d6182f2014-02-16 04:21:56131 AshTestBase::TearDown();
[email protected]59409342012-09-21 01:03:43132 // Shutdown() deletes the IME mock object.
[email protected]c02a4242012-12-11 18:36:32133 chromeos::input_method::Shutdown();
[email protected]18fdab02012-06-25 17:04:53134 }
[email protected]350c9232012-05-25 04:16:06135
136 protected:
[email protected]25ab8f12013-02-01 14:30:15137 void TestRewriteNumPadKeys();
138 void TestRewriteNumPadKeysOnAppleKeyboard();
139
[email protected]595079ce2014-07-11 22:25:13140 const ui::MouseEvent* RewriteMouseButtonEvent(
[email protected]595079ce2014-07-11 22:25:13141 const ui::MouseEvent& event,
dcheng24002d02016-04-08 02:42:40142 std::unique_ptr<ui::Event>* new_event) {
penghuange5df2822017-03-16 22:54:36143 rewriter_->RewriteMouseButtonEventForTesting(event, new_event);
moshayedi4e6623012016-03-02 04:53:58144 return *new_event ? new_event->get()->AsMouseEvent() : &event;
[email protected]7f926752014-01-30 09:16:35145 }
146
penghuange5df2822017-03-16 22:54:36147 sync_preferences::TestingPrefServiceSyncable* prefs() { return &prefs_; }
148
Blake O'Harea09fa45a2017-10-13 04:19:58149 void InitModifierKeyPref(IntegerPrefMember* int_pref,
150 const std::string& pref_name,
151 ui::chromeos::ModifierKey modifierKey) {
152 if (int_pref->GetPrefName() != pref_name) // skip if already initialized.
153 int_pref->Init(pref_name, prefs());
154 int_pref->SetValue(static_cast<int>(modifierKey));
155 }
156
azurewei045de382017-01-06 02:06:00157 FakeChromeUserManager* fake_user_manager_; // Not owned.
158 ScopedUserManagerEnabler user_manager_enabler_;
159 input_method::MockInputMethodManagerImpl* input_method_manager_mock_;
penghuange5df2822017-03-16 22:54:36160
161 sync_preferences::TestingPrefServiceSyncable prefs_;
162 std::unique_ptr<EventRewriterDelegateImpl> delegate_;
163 std::unique_ptr<ui::EventRewriterChromeOS> rewriter_;
[email protected]350c9232012-05-25 04:16:06164};
165
[email protected]b9d224c2012-07-13 01:09:03166TEST_F(EventRewriterTest, TestRewriteCommandToControl) {
[email protected]9822df92012-03-31 03:52:56167 // First, test with a PC keyboard.
penghuange5df2822017-03-16 22:54:36168 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
169 rewriter_->set_last_keyboard_device_id_for_testing(kKeyboardDeviceId);
[email protected]350c9232012-05-25 04:16:06170
[email protected]106cf972014-05-28 17:28:17171 KeyTestCase pc_keyboard_tests[] = {
172 // VKEY_A, Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29173 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19174 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN,
kpschoedel51d2e322015-08-28 15:29:35175 ui::DomKey::UNIDENTIFIED},
kpschoedela281bf12016-01-07 15:08:19176 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN,
kpschoedel51d2e322015-08-28 15:29:35177 ui::DomKey::UNIDENTIFIED}},
[email protected]d13e288992014-05-01 18:00:21178
[email protected]106cf972014-05-28 17:28:17179 // VKEY_A, Win modifier.
kpschoedel02c854d2015-06-16 14:44:29180 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19181 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:35182 ui::DomKey::UNIDENTIFIED},
kpschoedela281bf12016-01-07 15:08:19183 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:35184 ui::DomKey::UNIDENTIFIED}},
[email protected]d13e288992014-05-01 18:00:21185
[email protected]106cf972014-05-28 17:28:17186 // VKEY_A, Alt+Win modifier.
kpschoedel02c854d2015-06-16 14:44:29187 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19188 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:35189 ui::DomKey::UNIDENTIFIED},
kpschoedela281bf12016-01-07 15:08:19190 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:35191 ui::DomKey::UNIDENTIFIED}},
[email protected]350c9232012-05-25 04:16:06192
[email protected]106cf972014-05-28 17:28:17193 // VKEY_LWIN (left Windows key), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29194 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59195 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:13196 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, ui::DomKey::META},
dtapuskaaf863af2016-04-21 14:33:59197 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:13198 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, ui::DomKey::META}},
[email protected]350c9232012-05-25 04:16:06199
[email protected]106cf972014-05-28 17:28:17200 // VKEY_RWIN (right Windows key), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29201 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59202 {ui::VKEY_RWIN, ui::DomCode::META_RIGHT,
kpschoedel0a8b03052016-02-17 15:35:13203 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, ui::DomKey::META},
dtapuskaaf863af2016-04-21 14:33:59204 {ui::VKEY_RWIN, ui::DomCode::META_RIGHT,
kpschoedel0a8b03052016-02-17 15:35:13205 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, ui::DomKey::META}},
[email protected]106cf972014-05-28 17:28:17206 };
207
penghuange5df2822017-03-16 22:54:36208 for (const auto& test : pc_keyboard_tests)
209 CheckKeyTestCase(rewriter_, test);
[email protected]9822df92012-03-31 03:52:56210
[email protected]216d9162012-06-22 01:48:16211 // An Apple keyboard reusing the ID, zero.
penghuange5df2822017-03-16 22:54:36212 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "Apple Keyboard");
213 rewriter_->set_last_keyboard_device_id_for_testing(kKeyboardDeviceId);
[email protected]350c9232012-05-25 04:16:06214
[email protected]106cf972014-05-28 17:28:17215 KeyTestCase apple_keyboard_tests[] = {
216 // VKEY_A, Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29217 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19218 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN,
kpschoedel51d2e322015-08-28 15:29:35219 ui::DomKey::UNIDENTIFIED},
kpschoedela281bf12016-01-07 15:08:19220 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN,
kpschoedel51d2e322015-08-28 15:29:35221 ui::DomKey::UNIDENTIFIED}},
[email protected]350c9232012-05-25 04:16:06222
[email protected]106cf972014-05-28 17:28:17223 // VKEY_A, Win modifier.
kpschoedel02c854d2015-06-16 14:44:29224 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19225 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:35226 ui::DomKey::UNIDENTIFIED},
kpschoedela281bf12016-01-07 15:08:19227 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:53228 ui::DomKey::Constant<'a'>::Character}},
[email protected]350c9232012-05-25 04:16:06229
[email protected]106cf972014-05-28 17:28:17230 // VKEY_A, Alt+Win modifier.
kpschoedel02c854d2015-06-16 14:44:29231 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19232 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:35233 ui::DomKey::UNIDENTIFIED},
kpschoedela281bf12016-01-07 15:08:19234 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:53235 ui::DomKey::Constant<'a'>::Character}},
[email protected]350c9232012-05-25 04:16:06236
[email protected]106cf972014-05-28 17:28:17237 // VKEY_LWIN (left Windows key), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29238 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59239 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:13240 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:35241 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
242 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::CONTROL}},
[email protected]350c9232012-05-25 04:16:06243
[email protected]106cf972014-05-28 17:28:17244 // VKEY_RWIN (right Windows key), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29245 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59246 {ui::VKEY_RWIN, ui::DomCode::META_RIGHT,
kpschoedel0a8b03052016-02-17 15:35:13247 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:35248 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_RIGHT,
249 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::CONTROL}},
[email protected]106cf972014-05-28 17:28:17250 };
251
penghuange5df2822017-03-16 22:54:36252 for (const auto& test : apple_keyboard_tests)
253 CheckKeyTestCase(rewriter_, test);
[email protected]9822df92012-03-31 03:52:56254}
[email protected]2d1934f2012-04-19 18:51:22255
[email protected]216d9162012-06-22 01:48:16256// For crbug.com/133896.
[email protected]b9d224c2012-07-13 01:09:03257TEST_F(EventRewriterTest, TestRewriteCommandToControlWithControlRemapped) {
[email protected]216d9162012-06-22 01:48:16258 // Remap Control to Alt.
penghuange5df2822017-03-16 22:54:36259 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]216d9162012-06-22 01:48:16260 IntegerPrefMember control;
Blake O'Harea09fa45a2017-10-13 04:19:58261 InitModifierKeyPref(&control, prefs::kLanguageRemapControlKeyTo,
262 ui::chromeos::ModifierKey::kAltKey);
[email protected]216d9162012-06-22 01:48:16263
penghuange5df2822017-03-16 22:54:36264 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
265 rewriter_->set_last_keyboard_device_id_for_testing(kKeyboardDeviceId);
[email protected]216d9162012-06-22 01:48:16266
kpschoedel8226fd152015-05-06 15:48:59267 KeyTestCase pc_keyboard_tests[] = {
268 // Control should be remapped to Alt.
kpschoedel02c854d2015-06-16 14:44:29269 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35270 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
271 ui::DomKey::CONTROL},
272 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN,
273 ui::DomKey::ALT}},
[email protected]106cf972014-05-28 17:28:17274 };
275
penghuange5df2822017-03-16 22:54:36276 for (const auto& test : pc_keyboard_tests)
277 CheckKeyTestCase(rewriter_, test);
[email protected]216d9162012-06-22 01:48:16278
279 // An Apple keyboard reusing the ID, zero.
penghuange5df2822017-03-16 22:54:36280 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "Apple Keyboard");
281 rewriter_->set_last_keyboard_device_id_for_testing(kKeyboardDeviceId);
[email protected]216d9162012-06-22 01:48:16282
[email protected]106cf972014-05-28 17:28:17283 KeyTestCase apple_keyboard_tests[] = {
284 // VKEY_LWIN (left Command key) with Alt modifier. The remapped Command
285 // key should never be re-remapped to Alt.
kpschoedel02c854d2015-06-16 14:44:29286 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59287 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:13288 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:35289 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
290 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::CONTROL}},
[email protected]216d9162012-06-22 01:48:16291
[email protected]106cf972014-05-28 17:28:17292 // VKEY_RWIN (right Command key) with Alt modifier. The remapped Command
293 // key should never be re-remapped to Alt.
kpschoedel02c854d2015-06-16 14:44:29294 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59295 {ui::VKEY_RWIN, ui::DomCode::META_RIGHT,
kpschoedel0a8b03052016-02-17 15:35:13296 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:35297 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_RIGHT,
298 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::CONTROL}},
[email protected]106cf972014-05-28 17:28:17299 };
300
penghuange5df2822017-03-16 22:54:36301 for (const auto& test : apple_keyboard_tests)
302 CheckKeyTestCase(rewriter_, test);
[email protected]216d9162012-06-22 01:48:16303}
304
[email protected]25ab8f12013-02-01 14:30:15305void EventRewriterTest::TestRewriteNumPadKeys() {
penghuange5df2822017-03-16 22:54:36306 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
307 rewriter_->set_last_keyboard_device_id_for_testing(kKeyboardDeviceId);
[email protected]350c9232012-05-25 04:16:06308
[email protected]106cf972014-05-28 17:28:17309 KeyTestCase tests[] = {
310 // XK_KP_Insert (= NumPad 0 without Num Lock), no modifier.
kpschoedel02c854d2015-06-16 14:44:29311 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35312 {ui::VKEY_INSERT, ui::DomCode::NUMPAD0, ui::EF_NONE, ui::DomKey::INSERT},
313 {ui::VKEY_NUMPAD0, ui::DomCode::NUMPAD0, ui::EF_NONE,
314 ui::DomKey::Constant<'0'>::Character}},
[email protected]350c9232012-05-25 04:16:06315
[email protected]106cf972014-05-28 17:28:17316 // XK_KP_Insert (= NumPad 0 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29317 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35318 {ui::VKEY_INSERT, ui::DomCode::NUMPAD0, ui::EF_ALT_DOWN,
319 ui::DomKey::INSERT},
320 {ui::VKEY_NUMPAD0, ui::DomCode::NUMPAD0, ui::EF_ALT_DOWN,
321 ui::DomKey::Constant<'0'>::Character}},
[email protected]350c9232012-05-25 04:16:06322
[email protected]106cf972014-05-28 17:28:17323 // XK_KP_Delete (= NumPad . without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29324 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35325 {ui::VKEY_DELETE, ui::DomCode::NUMPAD_DECIMAL, ui::EF_ALT_DOWN,
326 ui::DomKey::DEL},
327 {ui::VKEY_DECIMAL, ui::DomCode::NUMPAD_DECIMAL, ui::EF_ALT_DOWN,
328 ui::DomKey::Constant<'.'>::Character}},
[email protected]350c9232012-05-25 04:16:06329
[email protected]106cf972014-05-28 17:28:17330 // XK_KP_End (= NumPad 1 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29331 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35332 {ui::VKEY_END, ui::DomCode::NUMPAD1, ui::EF_ALT_DOWN, ui::DomKey::END},
333 {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_ALT_DOWN,
334 ui::DomKey::Constant<'1'>::Character}},
[email protected]350c9232012-05-25 04:16:06335
[email protected]106cf972014-05-28 17:28:17336 // XK_KP_Down (= NumPad 2 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29337 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35338 {ui::VKEY_DOWN, ui::DomCode::NUMPAD2, ui::EF_ALT_DOWN,
339 ui::DomKey::ARROW_DOWN},
340 {ui::VKEY_NUMPAD2, ui::DomCode::NUMPAD2, ui::EF_ALT_DOWN,
341 ui::DomKey::Constant<'2'>::Character}},
[email protected]350c9232012-05-25 04:16:06342
[email protected]106cf972014-05-28 17:28:17343 // XK_KP_Next (= NumPad 3 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29344 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35345 {ui::VKEY_NEXT, ui::DomCode::NUMPAD3, ui::EF_ALT_DOWN,
346 ui::DomKey::PAGE_DOWN},
347 {ui::VKEY_NUMPAD3, ui::DomCode::NUMPAD3, ui::EF_ALT_DOWN,
348 ui::DomKey::Constant<'3'>::Character}},
[email protected]350c9232012-05-25 04:16:06349
[email protected]106cf972014-05-28 17:28:17350 // XK_KP_Left (= NumPad 4 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29351 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35352 {ui::VKEY_LEFT, ui::DomCode::NUMPAD4, ui::EF_ALT_DOWN,
353 ui::DomKey::ARROW_LEFT},
354 {ui::VKEY_NUMPAD4, ui::DomCode::NUMPAD4, ui::EF_ALT_DOWN,
355 ui::DomKey::Constant<'4'>::Character}},
[email protected]350c9232012-05-25 04:16:06356
[email protected]106cf972014-05-28 17:28:17357 // XK_KP_Begin (= NumPad 5 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29358 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35359 {ui::VKEY_CLEAR, ui::DomCode::NUMPAD5, ui::EF_ALT_DOWN,
360 ui::DomKey::CLEAR},
361 {ui::VKEY_NUMPAD5, ui::DomCode::NUMPAD5, ui::EF_ALT_DOWN,
362 ui::DomKey::Constant<'5'>::Character}},
[email protected]350c9232012-05-25 04:16:06363
[email protected]106cf972014-05-28 17:28:17364 // XK_KP_Right (= NumPad 6 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29365 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35366 {ui::VKEY_RIGHT, ui::DomCode::NUMPAD6, ui::EF_ALT_DOWN,
367 ui::DomKey::ARROW_RIGHT},
368 {ui::VKEY_NUMPAD6, ui::DomCode::NUMPAD6, ui::EF_ALT_DOWN,
369 ui::DomKey::Constant<'6'>::Character}},
[email protected]350c9232012-05-25 04:16:06370
[email protected]106cf972014-05-28 17:28:17371 // XK_KP_Home (= NumPad 7 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29372 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35373 {ui::VKEY_HOME, ui::DomCode::NUMPAD7, ui::EF_ALT_DOWN, ui::DomKey::HOME},
374 {ui::VKEY_NUMPAD7, ui::DomCode::NUMPAD7, ui::EF_ALT_DOWN,
375 ui::DomKey::Constant<'7'>::Character}},
[email protected]350c9232012-05-25 04:16:06376
[email protected]106cf972014-05-28 17:28:17377 // XK_KP_Up (= NumPad 8 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29378 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35379 {ui::VKEY_UP, ui::DomCode::NUMPAD8, ui::EF_ALT_DOWN,
380 ui::DomKey::ARROW_UP},
381 {ui::VKEY_NUMPAD8, ui::DomCode::NUMPAD8, ui::EF_ALT_DOWN,
382 ui::DomKey::Constant<'8'>::Character}},
[email protected]350c9232012-05-25 04:16:06383
[email protected]106cf972014-05-28 17:28:17384 // XK_KP_Prior (= NumPad 9 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29385 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35386 {ui::VKEY_PRIOR, ui::DomCode::NUMPAD9, ui::EF_ALT_DOWN,
387 ui::DomKey::PAGE_UP},
388 {ui::VKEY_NUMPAD9, ui::DomCode::NUMPAD9, ui::EF_ALT_DOWN,
389 ui::DomKey::Constant<'9'>::Character}},
[email protected]350c9232012-05-25 04:16:06390
[email protected]106cf972014-05-28 17:28:17391 // XK_KP_0 (= NumPad 0 with Num Lock), Num Lock modifier.
kpschoedel02c854d2015-06-16 14:44:29392 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35393 {ui::VKEY_NUMPAD0, ui::DomCode::NUMPAD0, ui::EF_NONE,
394 ui::DomKey::Constant<'0'>::Character},
395 {ui::VKEY_NUMPAD0, ui::DomCode::NUMPAD0, ui::EF_NONE,
396 ui::DomKey::Constant<'0'>::Character}},
[email protected]350c9232012-05-25 04:16:06397
[email protected]106cf972014-05-28 17:28:17398 // XK_KP_DECIMAL (= NumPad . with Num Lock), Num Lock modifier.
kpschoedel02c854d2015-06-16 14:44:29399 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35400 {ui::VKEY_DECIMAL, ui::DomCode::NUMPAD_DECIMAL, ui::EF_NONE,
401 ui::DomKey::Constant<'.'>::Character},
402 {ui::VKEY_DECIMAL, ui::DomCode::NUMPAD_DECIMAL, ui::EF_NONE,
403 ui::DomKey::Constant<'.'>::Character}},
[email protected]350c9232012-05-25 04:16:06404
[email protected]106cf972014-05-28 17:28:17405 // XK_KP_1 (= NumPad 1 with Num Lock), Num Lock modifier.
kpschoedel02c854d2015-06-16 14:44:29406 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35407 {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_NONE,
408 ui::DomKey::Constant<'1'>::Character},
409 {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_NONE,
410 ui::DomKey::Constant<'1'>::Character}},
[email protected]350c9232012-05-25 04:16:06411
[email protected]106cf972014-05-28 17:28:17412 // XK_KP_2 (= NumPad 2 with Num Lock), Num Lock modifier.
kpschoedel02c854d2015-06-16 14:44:29413 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35414 {ui::VKEY_NUMPAD2, ui::DomCode::NUMPAD2, ui::EF_NONE,
415 ui::DomKey::Constant<'2'>::Character},
416 {ui::VKEY_NUMPAD2, ui::DomCode::NUMPAD2, ui::EF_NONE,
417 ui::DomKey::Constant<'2'>::Character}},
[email protected]350c9232012-05-25 04:16:06418
[email protected]106cf972014-05-28 17:28:17419 // XK_KP_3 (= NumPad 3 with Num Lock), Num Lock modifier.
kpschoedel02c854d2015-06-16 14:44:29420 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35421 {ui::VKEY_NUMPAD3, ui::DomCode::NUMPAD3, ui::EF_NONE,
422 ui::DomKey::Constant<'3'>::Character},
423 {ui::VKEY_NUMPAD3, ui::DomCode::NUMPAD3, ui::EF_NONE,
424 ui::DomKey::Constant<'3'>::Character}},
[email protected]350c9232012-05-25 04:16:06425
[email protected]106cf972014-05-28 17:28:17426 // XK_KP_4 (= NumPad 4 with Num Lock), Num Lock modifier.
kpschoedel02c854d2015-06-16 14:44:29427 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35428 {ui::VKEY_NUMPAD4, ui::DomCode::NUMPAD4, ui::EF_NONE,
429 ui::DomKey::Constant<'4'>::Character},
430 {ui::VKEY_NUMPAD4, ui::DomCode::NUMPAD4, ui::EF_NONE,
431 ui::DomKey::Constant<'4'>::Character}},
[email protected]350c9232012-05-25 04:16:06432
kpschoedel8226fd152015-05-06 15:48:59433 // XK_KP_5 (= NumPad 5 with Num Lock), Num Lock
434 // modifier.
kpschoedel02c854d2015-06-16 14:44:29435 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35436 {ui::VKEY_NUMPAD5, ui::DomCode::NUMPAD5, ui::EF_NONE,
437 ui::DomKey::Constant<'5'>::Character},
438 {ui::VKEY_NUMPAD5, ui::DomCode::NUMPAD5, ui::EF_NONE,
439 ui::DomKey::Constant<'5'>::Character}},
[email protected]350c9232012-05-25 04:16:06440
kpschoedel8226fd152015-05-06 15:48:59441 // XK_KP_6 (= NumPad 6 with Num Lock), Num Lock
442 // modifier.
kpschoedel02c854d2015-06-16 14:44:29443 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35444 {ui::VKEY_NUMPAD6, ui::DomCode::NUMPAD6, ui::EF_NONE,
445 ui::DomKey::Constant<'6'>::Character},
446 {ui::VKEY_NUMPAD6, ui::DomCode::NUMPAD6, ui::EF_NONE,
447 ui::DomKey::Constant<'6'>::Character}},
[email protected]350c9232012-05-25 04:16:06448
kpschoedel8226fd152015-05-06 15:48:59449 // XK_KP_7 (= NumPad 7 with Num Lock), Num Lock
450 // modifier.
kpschoedel02c854d2015-06-16 14:44:29451 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35452 {ui::VKEY_NUMPAD7, ui::DomCode::NUMPAD7, ui::EF_NONE,
453 ui::DomKey::Constant<'7'>::Character},
454 {ui::VKEY_NUMPAD7, ui::DomCode::NUMPAD7, ui::EF_NONE,
455 ui::DomKey::Constant<'7'>::Character}},
[email protected]350c9232012-05-25 04:16:06456
kpschoedel8226fd152015-05-06 15:48:59457 // XK_KP_8 (= NumPad 8 with Num Lock), Num Lock
458 // modifier.
kpschoedel02c854d2015-06-16 14:44:29459 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35460 {ui::VKEY_NUMPAD8, ui::DomCode::NUMPAD8, ui::EF_NONE,
461 ui::DomKey::Constant<'8'>::Character},
462 {ui::VKEY_NUMPAD8, ui::DomCode::NUMPAD8, ui::EF_NONE,
463 ui::DomKey::Constant<'8'>::Character}},
[email protected]350c9232012-05-25 04:16:06464
kpschoedel8226fd152015-05-06 15:48:59465 // XK_KP_9 (= NumPad 9 with Num Lock), Num Lock
466 // modifier.
kpschoedel02c854d2015-06-16 14:44:29467 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35468 {ui::VKEY_NUMPAD9, ui::DomCode::NUMPAD9, ui::EF_NONE,
469 ui::DomKey::Constant<'9'>::Character},
470 {ui::VKEY_NUMPAD9, ui::DomCode::NUMPAD9, ui::EF_NONE,
471 ui::DomKey::Constant<'9'>::Character}},
[email protected]106cf972014-05-28 17:28:17472 };
473
penghuange5df2822017-03-16 22:54:36474 for (const auto& test : tests)
475 CheckKeyTestCase(rewriter_, test);
[email protected]2d1934f2012-04-19 18:51:22476}
[email protected]44de6072012-05-17 03:09:27477
[email protected]25ab8f12013-02-01 14:30:15478TEST_F(EventRewriterTest, TestRewriteNumPadKeys) {
479 TestRewriteNumPadKeys();
480}
481
482TEST_F(EventRewriterTest, TestRewriteNumPadKeysWithDiamondKeyFlag) {
483 // Make sure the num lock works correctly even when Diamond key exists.
avi3ef9ec9e2014-12-22 22:50:17484 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
[email protected]2f2d6c32013-05-10 02:56:24485 chromeos::switches::kHasChromeOSDiamondKey, "");
[email protected]25ab8f12013-02-01 14:30:15486 TestRewriteNumPadKeys();
487}
488
[email protected]44de6072012-05-17 03:09:27489// Tests if the rewriter can handle a Command + Num Pad event.
[email protected]25ab8f12013-02-01 14:30:15490void EventRewriterTest::TestRewriteNumPadKeysOnAppleKeyboard() {
penghuange5df2822017-03-16 22:54:36491 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "Apple Keyboard");
492 rewriter_->set_last_keyboard_device_id_for_testing(kKeyboardDeviceId);
[email protected]350c9232012-05-25 04:16:06493
[email protected]106cf972014-05-28 17:28:17494 KeyTestCase tests[] = {
495 // XK_KP_End (= NumPad 1 without Num Lock), Win modifier.
496 // The result should be "Num Pad 1 with Control + Num Lock modifiers".
kpschoedel02c854d2015-06-16 14:44:29497 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35498 {ui::VKEY_END, ui::DomCode::NUMPAD1, ui::EF_COMMAND_DOWN,
499 ui::DomKey::END},
500 {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:53501 ui::DomKey::Constant<'1'>::Character}},
[email protected]350c9232012-05-25 04:16:06502
[email protected]106cf972014-05-28 17:28:17503 // XK_KP_1 (= NumPad 1 with Num Lock), Win modifier.
504 // The result should also be "Num Pad 1 with Control + Num Lock
505 // modifiers".
kpschoedel02c854d2015-06-16 14:44:29506 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35507 {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_COMMAND_DOWN,
508 ui::DomKey::Constant<'1'>::Character},
509 {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:53510 ui::DomKey::Constant<'1'>::Character}}};
[email protected]106cf972014-05-28 17:28:17511
penghuange5df2822017-03-16 22:54:36512 for (const auto& test : tests)
513 CheckKeyTestCase(rewriter_, test);
[email protected]44de6072012-05-17 03:09:27514}
515
[email protected]25ab8f12013-02-01 14:30:15516TEST_F(EventRewriterTest, TestRewriteNumPadKeysOnAppleKeyboard) {
517 TestRewriteNumPadKeysOnAppleKeyboard();
518}
519
520TEST_F(EventRewriterTest,
521 TestRewriteNumPadKeysOnAppleKeyboardWithDiamondKeyFlag) {
522 // Makes sure the num lock works correctly even when Diamond key exists.
avi3ef9ec9e2014-12-22 22:50:17523 const base::CommandLine original_cl(*base::CommandLine::ForCurrentProcess());
524 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
[email protected]2f2d6c32013-05-10 02:56:24525 chromeos::switches::kHasChromeOSDiamondKey, "");
[email protected]25ab8f12013-02-01 14:30:15526
527 TestRewriteNumPadKeysOnAppleKeyboard();
avi3ef9ec9e2014-12-22 22:50:17528 *base::CommandLine::ForCurrentProcess() = original_cl;
[email protected]25ab8f12013-02-01 14:30:15529}
530
[email protected]b9d224c2012-07-13 01:09:03531TEST_F(EventRewriterTest, TestRewriteModifiersNoRemap) {
penghuange5df2822017-03-16 22:54:36532 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
[email protected]350c9232012-05-25 04:16:06533
[email protected]106cf972014-05-28 17:28:17534 KeyTestCase tests[] = {
535 // Press Search. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29536 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59537 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_NONE, ui::DomKey::META},
538 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_COMMAND_DOWN,
kpschoedel0a8b03052016-02-17 15:35:13539 ui::DomKey::META}},
[email protected]350c9232012-05-25 04:16:06540
[email protected]106cf972014-05-28 17:28:17541 // Press left Control. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29542 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35543 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
544 ui::DomKey::CONTROL},
545 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
546 ui::DomKey::CONTROL}},
[email protected]350c9232012-05-25 04:16:06547
[email protected]106cf972014-05-28 17:28:17548 // Press right Control. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29549 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35550 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
551 ui::DomKey::CONTROL},
552 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
553 ui::DomKey::CONTROL}},
[email protected]350c9232012-05-25 04:16:06554
[email protected]106cf972014-05-28 17:28:17555 // Press left Alt. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29556 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35557 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, ui::DomKey::ALT},
558 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN,
559 ui::DomKey::ALT}},
[email protected]350c9232012-05-25 04:16:06560
[email protected]106cf972014-05-28 17:28:17561 // Press right Alt. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29562 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35563 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, ui::DomKey::ALT},
564 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN,
565 ui::DomKey::ALT}},
[email protected]350c9232012-05-25 04:16:06566
[email protected]106cf972014-05-28 17:28:17567 // Test KeyRelease event, just in case.
568 // Release Search. Confirm the release event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29569 {ui::ET_KEY_RELEASED,
dtapuskaaf863af2016-04-21 14:33:59570 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_NONE, ui::DomKey::META},
571 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_NONE, ui::DomKey::META}},
[email protected]106cf972014-05-28 17:28:17572 };
573
penghuange5df2822017-03-16 22:54:36574 for (const auto& test : tests)
575 CheckKeyTestCase(rewriter_, test);
[email protected]350c9232012-05-25 04:16:06576}
577
[email protected]b9d224c2012-07-13 01:09:03578TEST_F(EventRewriterTest, TestRewriteModifiersNoRemapMultipleKeys) {
penghuange5df2822017-03-16 22:54:36579 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
[email protected]350c9232012-05-25 04:16:06580
[email protected]106cf972014-05-28 17:28:17581 KeyTestCase tests[] = {
582 // Press Alt with Shift. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29583 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35584 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT,
585 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ALT},
586 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT,
587 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ALT}},
[email protected]350c9232012-05-25 04:16:06588
michaelpg168ecd72016-08-25 04:00:42589 // Press Escape with Alt and Shift. Confirm the event is not rewritten.
590 {ui::ET_KEY_PRESSED,
591 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE,
592 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ESCAPE},
593 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE,
594 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ESCAPE}},
595
[email protected]106cf972014-05-28 17:28:17596 // Press Search with Caps Lock mask. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29597 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59598 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:13599 ui::EF_CAPS_LOCK_ON | ui::EF_COMMAND_DOWN, ui::DomKey::META},
dtapuskaaf863af2016-04-21 14:33:59600 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:13601 ui::EF_CAPS_LOCK_ON | ui::EF_COMMAND_DOWN, ui::DomKey::META}},
[email protected]350c9232012-05-25 04:16:06602
[email protected]106cf972014-05-28 17:28:17603 // Release Search with Caps Lock mask. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29604 {ui::ET_KEY_RELEASED,
dtapuskaaf863af2016-04-21 14:33:59605 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_CAPS_LOCK_ON,
kpschoedel0a8b03052016-02-17 15:35:13606 ui::DomKey::META},
dtapuskaaf863af2016-04-21 14:33:59607 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_CAPS_LOCK_ON,
kpschoedel0a8b03052016-02-17 15:35:13608 ui::DomKey::META}},
[email protected]350c9232012-05-25 04:16:06609
michaelpg168ecd72016-08-25 04:00:42610 // Press Shift+Ctrl+Alt+Search+Escape. Confirm the event is not rewritten.
611 {ui::ET_KEY_PRESSED,
612 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE,
613 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
614 ui::EF_COMMAND_DOWN,
615 ui::DomKey::ESCAPE},
616 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE,
617 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
618 ui::EF_COMMAND_DOWN,
619 ui::DomKey::ESCAPE}},
620
621 // Press Shift+Ctrl+Alt+Search+B. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29622 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19623 {ui::VKEY_B, ui::DomCode::US_B,
kpschoedel8226fd152015-05-06 15:48:59624 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
625 ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:35626 ui::DomKey::Constant<'B'>::Character},
kpschoedela281bf12016-01-07 15:08:19627 {ui::VKEY_B, ui::DomCode::US_B,
kpschoedel8226fd152015-05-06 15:48:59628 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
629 ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:35630 ui::DomKey::Constant<'B'>::Character}},
[email protected]106cf972014-05-28 17:28:17631 };
632
penghuange5df2822017-03-16 22:54:36633 for (const auto& test : tests)
634 CheckKeyTestCase(rewriter_, test);
[email protected]350c9232012-05-25 04:16:06635}
636
[email protected]b9d224c2012-07-13 01:09:03637TEST_F(EventRewriterTest, TestRewriteModifiersDisableSome) {
michaelpg168ecd72016-08-25 04:00:42638 // Disable Search, Control and Escape keys.
penghuange5df2822017-03-16 22:54:36639 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]350c9232012-05-25 04:16:06640 IntegerPrefMember search;
Blake O'Harea09fa45a2017-10-13 04:19:58641 InitModifierKeyPref(&search, prefs::kLanguageRemapSearchKeyTo,
642 ui::chromeos::ModifierKey::kVoidKey);
[email protected]350c9232012-05-25 04:16:06643 IntegerPrefMember control;
Blake O'Harea09fa45a2017-10-13 04:19:58644 InitModifierKeyPref(&control, prefs::kLanguageRemapControlKeyTo,
645 ui::chromeos::ModifierKey::kVoidKey);
michaelpg168ecd72016-08-25 04:00:42646 IntegerPrefMember escape;
Blake O'Harea09fa45a2017-10-13 04:19:58647 InitModifierKeyPref(&escape, prefs::kLanguageRemapEscapeKeyTo,
648 ui::chromeos::ModifierKey::kVoidKey);
[email protected]350c9232012-05-25 04:16:06649
penghuange5df2822017-03-16 22:54:36650 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
[email protected]350c9232012-05-25 04:16:06651
[email protected]106cf972014-05-28 17:28:17652 KeyTestCase disabled_modifier_tests[] = {
653 // Press Alt with Shift. This key press shouldn't be affected by the
654 // pref. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29655 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35656 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT,
657 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ALT},
658 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT,
659 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ALT}},
[email protected]350c9232012-05-25 04:16:06660
[email protected]106cf972014-05-28 17:28:17661 // Press Search. Confirm the event is now VKEY_UNKNOWN.
kpschoedel02c854d2015-06-16 14:44:29662 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59663 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_NONE, ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:35664 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_NONE,
665 ui::DomKey::UNIDENTIFIED}},
[email protected]350c9232012-05-25 04:16:06666
[email protected]106cf972014-05-28 17:28:17667 // Press Control. Confirm the event is now VKEY_UNKNOWN.
kpschoedel02c854d2015-06-16 14:44:29668 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35669 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
670 ui::DomKey::CONTROL},
671 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_NONE,
672 ui::DomKey::UNIDENTIFIED}},
[email protected]350c9232012-05-25 04:16:06673
michaelpg168ecd72016-08-25 04:00:42674 // Press Escape. Confirm the event is now VKEY_UNKNOWN.
675 {ui::ET_KEY_PRESSED,
676 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE, ui::EF_NONE, ui::DomKey::ESCAPE},
677 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_NONE,
678 ui::DomKey::UNIDENTIFIED}},
679
[email protected]106cf972014-05-28 17:28:17680 // Press Control+Search. Confirm the event is now VKEY_UNKNOWN
681 // without any modifiers.
kpschoedel02c854d2015-06-16 14:44:29682 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59683 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_CONTROL_DOWN,
kpschoedel0a8b03052016-02-17 15:35:13684 ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:35685 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_NONE,
686 ui::DomKey::UNIDENTIFIED}},
[email protected]350c9232012-05-25 04:16:06687
[email protected]106cf972014-05-28 17:28:17688 // Press Control+Search+a. Confirm the event is now VKEY_A without any
689 // modifiers.
kpschoedel02c854d2015-06-16 14:44:29690 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19691 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_CONTROL_DOWN,
kpschoedel51d2e322015-08-28 15:29:35692 ui::DomKey::Constant<'a'>::Character},
kpschoedela281bf12016-01-07 15:08:19693 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:35694 ui::DomKey::Constant<'a'>::Character}},
[email protected]350c9232012-05-25 04:16:06695
[email protected]106cf972014-05-28 17:28:17696 // Press Control+Search+Alt+a. Confirm the event is now VKEY_A only with
697 // the Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29698 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19699 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
kpschoedel51d2e322015-08-28 15:29:35700 ui::DomKey::Constant<'a'>::Character},
kpschoedela281bf12016-01-07 15:08:19701 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN,
kpschoedel51d2e322015-08-28 15:29:35702 ui::DomKey::Constant<'a'>::Character}},
[email protected]106cf972014-05-28 17:28:17703 };
704
penghuange5df2822017-03-16 22:54:36705 for (const auto& test : disabled_modifier_tests)
706 CheckKeyTestCase(rewriter_, test);
[email protected]350c9232012-05-25 04:16:06707
708 // Remap Alt to Control.
709 IntegerPrefMember alt;
Blake O'Harea09fa45a2017-10-13 04:19:58710 InitModifierKeyPref(&alt, prefs::kLanguageRemapAltKeyTo,
711 ui::chromeos::ModifierKey::kControlKey);
[email protected]350c9232012-05-25 04:16:06712
[email protected]106cf972014-05-28 17:28:17713 KeyTestCase tests[] = {
714 // Press left Alt. Confirm the event is now VKEY_CONTROL
715 // even though the Control key itself is disabled.
kpschoedel02c854d2015-06-16 14:44:29716 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35717 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, ui::DomKey::ALT},
718 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
719 ui::DomKey::CONTROL}},
[email protected]350c9232012-05-25 04:16:06720
[email protected]106cf972014-05-28 17:28:17721 // Press Alt+a. Confirm the event is now Control+a even though the Control
722 // key itself is disabled.
kpschoedel02c854d2015-06-16 14:44:29723 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19724 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN,
kpschoedel51d2e322015-08-28 15:29:35725 ui::DomKey::Constant<'a'>::Character},
kpschoedela281bf12016-01-07 15:08:19726 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:53727 ui::DomKey::Constant<'a'>::Character}},
[email protected]106cf972014-05-28 17:28:17728 };
729
penghuange5df2822017-03-16 22:54:36730 for (const auto& test : tests)
731 CheckKeyTestCase(rewriter_, test);
[email protected]350c9232012-05-25 04:16:06732}
733
[email protected]b9d224c2012-07-13 01:09:03734TEST_F(EventRewriterTest, TestRewriteModifiersRemapToControl) {
[email protected]350c9232012-05-25 04:16:06735 // Remap Search to Control.
penghuange5df2822017-03-16 22:54:36736 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]350c9232012-05-25 04:16:06737 IntegerPrefMember search;
Blake O'Harea09fa45a2017-10-13 04:19:58738 InitModifierKeyPref(&search, prefs::kLanguageRemapSearchKeyTo,
739 ui::chromeos::ModifierKey::kControlKey);
[email protected]350c9232012-05-25 04:16:06740
penghuange5df2822017-03-16 22:54:36741 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
[email protected]350c9232012-05-25 04:16:06742
[email protected]106cf972014-05-28 17:28:17743 KeyTestCase s_tests[] = {
744 // Press Search. Confirm the event is now VKEY_CONTROL.
kpschoedel02c854d2015-06-16 14:44:29745 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59746 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_COMMAND_DOWN,
kpschoedel0a8b03052016-02-17 15:35:13747 ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:35748 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
749 ui::DomKey::CONTROL}},
[email protected]106cf972014-05-28 17:28:17750 };
751
penghuange5df2822017-03-16 22:54:36752 for (const auto& test : s_tests)
753 CheckKeyTestCase(rewriter_, test);
[email protected]350c9232012-05-25 04:16:06754
755 // Remap Alt to Control too.
756 IntegerPrefMember alt;
Blake O'Harea09fa45a2017-10-13 04:19:58757 InitModifierKeyPref(&alt, prefs::kLanguageRemapAltKeyTo,
758 ui::chromeos::ModifierKey::kControlKey);
[email protected]350c9232012-05-25 04:16:06759
[email protected]106cf972014-05-28 17:28:17760 KeyTestCase sa_tests[] = {
761 // Press Alt. Confirm the event is now VKEY_CONTROL.
kpschoedel02c854d2015-06-16 14:44:29762 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35763 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, ui::DomKey::ALT},
764 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
765 ui::DomKey::CONTROL}},
[email protected]350c9232012-05-25 04:16:06766
[email protected]106cf972014-05-28 17:28:17767 // Press Alt+Search. Confirm the event is now VKEY_CONTROL.
kpschoedel02c854d2015-06-16 14:44:29768 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59769 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:13770 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:35771 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
772 ui::DomKey::CONTROL}},
[email protected]350c9232012-05-25 04:16:06773
[email protected]106cf972014-05-28 17:28:17774 // Press Control+Alt+Search. Confirm the event is now VKEY_CONTROL.
kpschoedel02c854d2015-06-16 14:44:29775 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59776 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel8226fd152015-05-06 15:48:59777 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
kpschoedel0a8b03052016-02-17 15:35:13778 ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:35779 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
780 ui::DomKey::CONTROL}},
[email protected]350c9232012-05-25 04:16:06781
[email protected]106cf972014-05-28 17:28:17782 // Press Shift+Control+Alt+Search. Confirm the event is now Control with
783 // Shift and Control modifiers.
kpschoedel02c854d2015-06-16 14:44:29784 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59785 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel8226fd152015-05-06 15:48:59786 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
787 ui::EF_COMMAND_DOWN,
kpschoedel0a8b03052016-02-17 15:35:13788 ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:35789 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
790 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::CONTROL}},
[email protected]350c9232012-05-25 04:16:06791
[email protected]106cf972014-05-28 17:28:17792 // Press Shift+Control+Alt+Search+B. Confirm the event is now B with Shift
793 // and Control modifiers.
kpschoedel02c854d2015-06-16 14:44:29794 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19795 {ui::VKEY_B, ui::DomCode::US_B,
kpschoedel8226fd152015-05-06 15:48:59796 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
797 ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:35798 ui::DomKey::Constant<'B'>::Character},
kpschoedela281bf12016-01-07 15:08:19799 {ui::VKEY_B, ui::DomCode::US_B, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:53800 ui::DomKey::Constant<'B'>::Character}},
[email protected]106cf972014-05-28 17:28:17801 };
802
penghuange5df2822017-03-16 22:54:36803 for (const auto& test : sa_tests)
804 CheckKeyTestCase(rewriter_, test);
[email protected]350c9232012-05-25 04:16:06805}
806
[email protected]343b8edd2013-09-17 09:28:11807TEST_F(EventRewriterTest, TestRewriteModifiersRemapToEscape) {
michaelpg168ecd72016-08-25 04:00:42808 // Remap Search to Escape.
penghuange5df2822017-03-16 22:54:36809 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]343b8edd2013-09-17 09:28:11810 IntegerPrefMember search;
Blake O'Harea09fa45a2017-10-13 04:19:58811 InitModifierKeyPref(&search, prefs::kLanguageRemapSearchKeyTo,
812 ui::chromeos::ModifierKey::kEscapeKey);
[email protected]343b8edd2013-09-17 09:28:11813
penghuange5df2822017-03-16 22:54:36814 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
[email protected]343b8edd2013-09-17 09:28:11815
kpschoedel8226fd152015-05-06 15:48:59816 KeyTestCase tests[] = {
817 // Press Search. Confirm the event is now VKEY_ESCAPE.
kpschoedel02c854d2015-06-16 14:44:29818 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59819 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_COMMAND_DOWN,
kpschoedel0a8b03052016-02-17 15:35:13820 ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:35821 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE, ui::EF_NONE, ui::DomKey::ESCAPE}},
[email protected]106cf972014-05-28 17:28:17822 };
823
penghuange5df2822017-03-16 22:54:36824 for (const auto& test : tests)
825 CheckKeyTestCase(rewriter_, test);
[email protected]343b8edd2013-09-17 09:28:11826}
827
[email protected]b9d224c2012-07-13 01:09:03828TEST_F(EventRewriterTest, TestRewriteModifiersRemapMany) {
michaelpg168ecd72016-08-25 04:00:42829 // Remap Escape to Alt.
penghuange5df2822017-03-16 22:54:36830 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
michaelpg168ecd72016-08-25 04:00:42831 IntegerPrefMember escape;
Blake O'Harea09fa45a2017-10-13 04:19:58832 InitModifierKeyPref(&escape, prefs::kLanguageRemapEscapeKeyTo,
833 ui::chromeos::ModifierKey::kAltKey);
[email protected]350c9232012-05-25 04:16:06834
penghuange5df2822017-03-16 22:54:36835 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
[email protected]350c9232012-05-25 04:16:06836
michaelpg168ecd72016-08-25 04:00:42837 KeyTestCase e2a_tests[] = {
838 // Press Escape. Confirm the event is now VKEY_MENU.
kpschoedel02c854d2015-06-16 14:44:29839 {ui::ET_KEY_PRESSED,
michaelpg168ecd72016-08-25 04:00:42840 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE, ui::EF_NONE, ui::DomKey::ESCAPE},
kpschoedel51d2e322015-08-28 15:29:35841 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN,
842 ui::DomKey::ALT}},
michaelpg168ecd72016-08-25 04:00:42843 // Release Escape to clear flags.
844 {ui::ET_KEY_RELEASED,
845 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE, ui::EF_NONE, ui::DomKey::ESCAPE},
846 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_NONE, ui::DomKey::ALT}},
[email protected]106cf972014-05-28 17:28:17847 };
848
penghuange5df2822017-03-16 22:54:36849 for (const auto& test : e2a_tests)
850 CheckKeyTestCase(rewriter_, test);
[email protected]350c9232012-05-25 04:16:06851
852 // Remap Alt to Control.
853 IntegerPrefMember alt;
Blake O'Harea09fa45a2017-10-13 04:19:58854 InitModifierKeyPref(&alt, prefs::kLanguageRemapAltKeyTo,
855 ui::chromeos::ModifierKey::kControlKey);
[email protected]350c9232012-05-25 04:16:06856
[email protected]106cf972014-05-28 17:28:17857 KeyTestCase a2c_tests[] = {
858 // Press left Alt. Confirm the event is now VKEY_CONTROL.
kpschoedel02c854d2015-06-16 14:44:29859 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35860 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, ui::DomKey::ALT},
861 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
862 ui::DomKey::CONTROL}},
[email protected]bc3cca84f2014-07-16 04:19:23863 // Press Shift+comma. Verify that only the flags are changed.
kpschoedel02c854d2015-06-16 14:44:29864 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35865 {ui::VKEY_OEM_COMMA, ui::DomCode::COMMA,
866 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::UNIDENTIFIED},
867 {ui::VKEY_OEM_COMMA, ui::DomCode::COMMA,
kpschoedel728aa8092015-10-20 19:29:53868 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN,
869 ui::DomKey::Constant<'<'>::Character}},
[email protected]bc3cca84f2014-07-16 04:19:23870 // Press Shift+9. Verify that only the flags are changed.
kpschoedel02c854d2015-06-16 14:44:29871 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35872 {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
873 ui::DomKey::UNIDENTIFIED},
874 {ui::VKEY_9, ui::DomCode::DIGIT9,
kpschoedel728aa8092015-10-20 19:29:53875 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN,
876 ui::DomKey::Constant<'('>::Character}},
[email protected]106cf972014-05-28 17:28:17877 };
878
penghuange5df2822017-03-16 22:54:36879 for (const auto& test : a2c_tests)
880 CheckKeyTestCase(rewriter_, test);
[email protected]350c9232012-05-25 04:16:06881
882 // Remap Control to Search.
883 IntegerPrefMember control;
Blake O'Harea09fa45a2017-10-13 04:19:58884 InitModifierKeyPref(&control, prefs::kLanguageRemapControlKeyTo,
885 ui::chromeos::ModifierKey::kSearchKey);
[email protected]350c9232012-05-25 04:16:06886
[email protected]106cf972014-05-28 17:28:17887 KeyTestCase c2s_tests[] = {
888 // Press left Control. Confirm the event is now VKEY_LWIN.
kpschoedel02c854d2015-06-16 14:44:29889 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35890 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
891 ui::DomKey::CONTROL},
dtapuskaaf863af2016-04-21 14:33:59892 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_COMMAND_DOWN,
kpschoedel0a8b03052016-02-17 15:35:13893 ui::DomKey::META}},
[email protected]350c9232012-05-25 04:16:06894
michaelpg168ecd72016-08-25 04:00:42895 // Then, press all of the three, Control+Alt+Escape.
kpschoedel02c854d2015-06-16 14:44:29896 {ui::ET_KEY_PRESSED,
michaelpg168ecd72016-08-25 04:00:42897 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE,
898 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::CONTROL},
kpschoedel51d2e322015-08-28 15:29:35899 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT,
kpschoedel8226fd152015-05-06 15:48:59900 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:35901 ui::DomKey::ALT}},
[email protected]350c9232012-05-25 04:16:06902
michaelpg168ecd72016-08-25 04:00:42903 // Press Shift+Control+Alt+Escape.
kpschoedel02c854d2015-06-16 14:44:29904 {ui::ET_KEY_PRESSED,
michaelpg168ecd72016-08-25 04:00:42905 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE,
906 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
907 ui::DomKey::ESCAPE},
kpschoedel51d2e322015-08-28 15:29:35908 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT,
kpschoedel8226fd152015-05-06 15:48:59909 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
910 ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:35911 ui::DomKey::ALT}},
[email protected]350c9232012-05-25 04:16:06912
michaelpg168ecd72016-08-25 04:00:42913 // Press Shift+Control+Alt+B
kpschoedel02c854d2015-06-16 14:44:29914 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19915 {ui::VKEY_B, ui::DomCode::US_B,
michaelpg168ecd72016-08-25 04:00:42916 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
kpschoedel51d2e322015-08-28 15:29:35917 ui::DomKey::Constant<'B'>::Character},
kpschoedela281bf12016-01-07 15:08:19918 {ui::VKEY_B, ui::DomCode::US_B,
kpschoedel8226fd152015-05-06 15:48:59919 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
920 ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:35921 ui::DomKey::Constant<'B'>::Character}},
[email protected]106cf972014-05-28 17:28:17922 };
923
penghuange5df2822017-03-16 22:54:36924 for (const auto& test : c2s_tests)
925 CheckKeyTestCase(rewriter_, test);
michaelpg168ecd72016-08-25 04:00:42926
927 // Remap Search to Backspace.
928 IntegerPrefMember search;
Blake O'Harea09fa45a2017-10-13 04:19:58929 InitModifierKeyPref(&search, prefs::kLanguageRemapSearchKeyTo,
930 ui::chromeos::ModifierKey::kBackspaceKey);
michaelpg168ecd72016-08-25 04:00:42931
932 KeyTestCase s2b_tests[] = {
933 // Release Control and Escape, as Search and Alt would transform Backspace
934 // to Delete.
935 {ui::ET_KEY_RELEASED,
936 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_NONE,
937 ui::DomKey::CONTROL},
938 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_ALT_DOWN,
939 ui::DomKey::META}},
940 {ui::ET_KEY_RELEASED,
941 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE, ui::EF_NONE, ui::DomKey::ESCAPE},
942 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_NONE, ui::DomKey::ALT}},
943 // Press Search. Confirm the event is now VKEY_BACK.
944 {ui::ET_KEY_PRESSED,
945 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_COMMAND_DOWN,
946 ui::DomKey::META},
947 {ui::VKEY_BACK, ui::DomCode::BACKSPACE, ui::EF_NONE,
948 ui::DomKey::BACKSPACE}},
949 };
950
penghuange5df2822017-03-16 22:54:36951 for (const auto& test : s2b_tests)
952 CheckKeyTestCase(rewriter_, test);
michaelpg168ecd72016-08-25 04:00:42953
954 // Remap Backspace to Escape.
955 IntegerPrefMember backspace;
Blake O'Harea09fa45a2017-10-13 04:19:58956 InitModifierKeyPref(&backspace, prefs::kLanguageRemapBackspaceKeyTo,
957 ui::chromeos::ModifierKey::kEscapeKey);
michaelpg168ecd72016-08-25 04:00:42958
959 KeyTestCase b2e_tests[] = {
960 // Press Backspace. Confirm the event is now VKEY_ESCAPE.
961 {ui::ET_KEY_PRESSED,
962 {ui::VKEY_BACK, ui::DomCode::BACKSPACE, ui::EF_NONE,
963 ui::DomKey::BACKSPACE},
964 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE, ui::EF_NONE, ui::DomKey::ESCAPE}},
965 };
966
penghuange5df2822017-03-16 22:54:36967 for (const auto& test : b2e_tests)
968 CheckKeyTestCase(rewriter_, test);
[email protected]350c9232012-05-25 04:16:06969}
970
[email protected]b9d224c2012-07-13 01:09:03971TEST_F(EventRewriterTest, TestRewriteModifiersRemapToCapsLock) {
[email protected]350c9232012-05-25 04:16:06972 // Remap Search to Caps Lock.
penghuange5df2822017-03-16 22:54:36973 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]350c9232012-05-25 04:16:06974 IntegerPrefMember search;
Blake O'Harea09fa45a2017-10-13 04:19:58975 InitModifierKeyPref(&search, prefs::kLanguageRemapSearchKeyTo,
976 ui::chromeos::ModifierKey::kCapsLockKey);
[email protected]350c9232012-05-25 04:16:06977
penghuange5df2822017-03-16 22:54:36978 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
[email protected]350c9232012-05-25 04:16:06979
980 // Press Search.
pkastingcc7f6ac2016-01-08 23:38:47981 EXPECT_EQ(GetExpectedResultAsString(
982 ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
983 ui::EF_MOD3_DOWN | ui::EF_CAPS_LOCK_ON, ui::DomKey::CAPS_LOCK),
penghuange5df2822017-03-16 22:54:36984 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59985 ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:13986 ui::EF_COMMAND_DOWN, ui::DomKey::META));
[email protected]350c9232012-05-25 04:16:06987
988 // Release Search.
kpschoedel8226fd152015-05-06 15:48:59989 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL,
990 ui::DomCode::CAPS_LOCK, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:35991 ui::DomKey::CAPS_LOCK),
penghuange5df2822017-03-16 22:54:36992 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_RELEASED,
dtapuskaaf863af2016-04-21 14:33:59993 ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:13994 ui::EF_NONE, ui::DomKey::META));
[email protected]350c9232012-05-25 04:16:06995
996 // Press Search.
pkastingcc7f6ac2016-01-08 23:38:47997 EXPECT_EQ(GetExpectedResultAsString(
998 ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
999 ui::EF_CAPS_LOCK_ON | ui::EF_MOD3_DOWN, ui::DomKey::CAPS_LOCK),
penghuange5df2822017-03-16 22:54:361000 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:591001 ui::VKEY_LWIN, ui::DomCode::META_LEFT,
pkastingcc7f6ac2016-01-08 23:38:471002 ui::EF_COMMAND_DOWN | ui::EF_CAPS_LOCK_ON,
kpschoedel0a8b03052016-02-17 15:35:131003 ui::DomKey::META));
[email protected]350c9232012-05-25 04:16:061004
1005 // Release Search.
kpschoedel8226fd152015-05-06 15:48:591006 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL,
1007 ui::DomCode::CAPS_LOCK, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351008 ui::DomKey::CAPS_LOCK),
penghuange5df2822017-03-16 22:54:361009 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_RELEASED,
dtapuskaaf863af2016-04-21 14:33:591010 ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:131011 ui::EF_NONE, ui::DomKey::META));
[email protected]350c9232012-05-25 04:16:061012
1013 // Press Caps Lock (on an external keyboard).
pkastingcc7f6ac2016-01-08 23:38:471014 EXPECT_EQ(GetExpectedResultAsString(
1015 ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
1016 ui::EF_CAPS_LOCK_ON | ui::EF_MOD3_DOWN, ui::DomKey::CAPS_LOCK),
penghuange5df2822017-03-16 22:54:361017 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED,
kpschoedel8226fd152015-05-06 15:48:591018 ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
pkastingcc7f6ac2016-01-08 23:38:471019 ui::EF_CAPS_LOCK_ON | ui::EF_MOD3_DOWN,
kpschoedel51d2e322015-08-28 15:29:351020 ui::DomKey::CAPS_LOCK));
[email protected]350c9232012-05-25 04:16:061021
[email protected]0f424fd92013-05-08 21:12:191022 // Release Caps Lock (on an external keyboard).
kpschoedel8226fd152015-05-06 15:48:591023 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL,
1024 ui::DomCode::CAPS_LOCK, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351025 ui::DomKey::CAPS_LOCK),
penghuange5df2822017-03-16 22:54:361026 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_RELEASED,
kpschoedel8226fd152015-05-06 15:48:591027 ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
kpschoedel51d2e322015-08-28 15:29:351028 ui::EF_NONE, ui::DomKey::CAPS_LOCK));
[email protected]350c9232012-05-25 04:16:061029}
[email protected]4a822092012-06-15 03:42:511030
[email protected]d13e288992014-05-01 18:00:211031TEST_F(EventRewriterTest, TestRewriteCapsLock) {
penghuange5df2822017-03-16 22:54:361032 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]872ead342012-10-31 17:50:011033
[email protected]d13e288992014-05-01 18:00:211034 chromeos::input_method::FakeImeKeyboard ime_keyboard;
penghuange5df2822017-03-16 22:54:361035 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
1036 rewriter_->set_ime_keyboard_for_testing(&ime_keyboard);
[email protected]d13e288992014-05-01 18:00:211037 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_);
[email protected]872ead342012-10-31 17:50:011038
1039 // On Chrome OS, CapsLock is mapped to F16 with Mod3Mask.
pkastingcc7f6ac2016-01-08 23:38:471040 EXPECT_EQ(GetExpectedResultAsString(
1041 ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
1042 ui::EF_CAPS_LOCK_ON | ui::EF_MOD3_DOWN, ui::DomKey::CAPS_LOCK),
penghuange5df2822017-03-16 22:54:361043 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED,
kpschoedel8226fd152015-05-06 15:48:591044 ui::VKEY_F16, ui::DomCode::F16,
kpschoedel51d2e322015-08-28 15:29:351045 ui::EF_MOD3_DOWN, ui::DomKey::F16));
[email protected]872ead342012-10-31 17:50:011046}
1047
[email protected]d13e288992014-05-01 18:00:211048TEST_F(EventRewriterTest, TestRewriteDiamondKey) {
penghuange5df2822017-03-16 22:54:361049 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]25ab8f12013-02-01 14:30:151050
[email protected]d13e288992014-05-01 18:00:211051 chromeos::input_method::FakeImeKeyboard ime_keyboard;
penghuange5df2822017-03-16 22:54:361052 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
1053 rewriter_->set_ime_keyboard_for_testing(&ime_keyboard);
[email protected]25ab8f12013-02-01 14:30:151054
[email protected]106cf972014-05-28 17:28:171055 KeyTestCase tests[] = {
1056 // F15 should work as Ctrl when --has-chromeos-diamond-key is not
1057 // specified.
kpschoedel02c854d2015-06-16 14:44:291058 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351059 {ui::VKEY_F15, ui::DomCode::F15, ui::EF_NONE, ui::DomKey::F15},
1060 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
1061 ui::DomKey::CONTROL}},
[email protected]a0e25352013-02-07 02:03:191062
kpschoedel02c854d2015-06-16 14:44:291063 {ui::ET_KEY_RELEASED,
kpschoedel51d2e322015-08-28 15:29:351064 {ui::VKEY_F15, ui::DomCode::F15, ui::EF_NONE, ui::DomKey::F15},
1065 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_NONE,
1066 ui::DomKey::CONTROL}},
[email protected]d0eb7c92014-07-17 16:20:371067
[email protected]106cf972014-05-28 17:28:171068 // However, Mod2Mask should not be rewritten to CtrlMask when
1069 // --has-chromeos-diamond-key is not specified.
kpschoedel02c854d2015-06-16 14:44:291070 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:191071 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351072 ui::DomKey::Constant<'a'>::Character},
kpschoedela281bf12016-01-07 15:08:191073 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351074 ui::DomKey::Constant<'a'>::Character}},
[email protected]106cf972014-05-28 17:28:171075 };
1076
penghuange5df2822017-03-16 22:54:361077 for (const auto& test : tests)
1078 CheckKeyTestCase(rewriter_, test);
[email protected]25ab8f12013-02-01 14:30:151079}
[email protected]595079ce2014-07-11 22:25:131080
[email protected]d13e288992014-05-01 18:00:211081TEST_F(EventRewriterTest, TestRewriteDiamondKeyWithFlag) {
avi3ef9ec9e2014-12-22 22:50:171082 const base::CommandLine original_cl(*base::CommandLine::ForCurrentProcess());
1083 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
[email protected]2f2d6c32013-05-10 02:56:241084 chromeos::switches::kHasChromeOSDiamondKey, "");
[email protected]25ab8f12013-02-01 14:30:151085
penghuange5df2822017-03-16 22:54:361086 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]25ab8f12013-02-01 14:30:151087
[email protected]d13e288992014-05-01 18:00:211088 chromeos::input_method::FakeImeKeyboard ime_keyboard;
penghuange5df2822017-03-16 22:54:361089 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
1090 rewriter_->set_ime_keyboard_for_testing(&ime_keyboard);
[email protected]25ab8f12013-02-01 14:30:151091
1092 // By default, F15 should work as Control.
kpschoedel51d2e322015-08-28 15:29:351093 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL,
1094 ui::DomCode::CONTROL_LEFT,
1095 ui::EF_CONTROL_DOWN, ui::DomKey::CONTROL),
penghuange5df2822017-03-16 22:54:361096 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED,
kpschoedel8226fd152015-05-06 15:48:591097 ui::VKEY_F15, ui::DomCode::F15,
kpschoedel51d2e322015-08-28 15:29:351098 ui::EF_NONE, ui::DomKey::F15));
[email protected]d0eb7c92014-07-17 16:20:371099 // Check that Control is applied to a subsequent key press.
kpschoedel8226fd152015-05-06 15:48:591100 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191101 ui::DomCode::US_A, ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:531102 ui::DomKey::Constant<'a'>::Character),
penghuange5df2822017-03-16 22:54:361103 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191104 ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351105 ui::DomKey::Constant<'a'>::Character));
[email protected]d0eb7c92014-07-17 16:20:371106 // Release F15
kpschoedel8226fd152015-05-06 15:48:591107 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CONTROL,
1108 ui::DomCode::CONTROL_LEFT, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351109 ui::DomKey::CONTROL),
penghuange5df2822017-03-16 22:54:361110 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_RELEASED,
kpschoedel8226fd152015-05-06 15:48:591111 ui::VKEY_F15, ui::DomCode::F15,
kpschoedel51d2e322015-08-28 15:29:351112 ui::EF_NONE, ui::DomKey::F15));
[email protected]d0eb7c92014-07-17 16:20:371113 // Check that Control is no longer applied to a subsequent key press.
kpschoedel8226fd152015-05-06 15:48:591114 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191115 ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351116 ui::DomKey::Constant<'a'>::Character),
penghuange5df2822017-03-16 22:54:361117 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191118 ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351119 ui::DomKey::Constant<'a'>::Character));
[email protected]25ab8f12013-02-01 14:30:151120
1121 IntegerPrefMember diamond;
Blake O'Harea09fa45a2017-10-13 04:19:581122 InitModifierKeyPref(&diamond, prefs::kLanguageRemapDiamondKeyTo,
1123 ui::chromeos::ModifierKey::kVoidKey);
[email protected]25ab8f12013-02-01 14:30:151124
kpschoedel8226fd152015-05-06 15:48:591125 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_UNKNOWN,
1126 ui::DomCode::NONE, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351127 ui::DomKey::UNIDENTIFIED),
penghuange5df2822017-03-16 22:54:361128 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED,
kpschoedel8226fd152015-05-06 15:48:591129 ui::VKEY_F15, ui::DomCode::F15,
kpschoedel51d2e322015-08-28 15:29:351130 ui::EF_NONE, ui::DomKey::F15));
[email protected]d0eb7c92014-07-17 16:20:371131 // Check that no modifier is applied to another key.
kpschoedel8226fd152015-05-06 15:48:591132 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191133 ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351134 ui::DomKey::Constant<'a'>::Character),
penghuange5df2822017-03-16 22:54:361135 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191136 ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351137 ui::DomKey::Constant<'a'>::Character));
[email protected]25ab8f12013-02-01 14:30:151138
Blake O'Harea09fa45a2017-10-13 04:19:581139 InitModifierKeyPref(&diamond, prefs::kLanguageRemapDiamondKeyTo,
1140 ui::chromeos::ModifierKey::kControlKey);
[email protected]25ab8f12013-02-01 14:30:151141
kpschoedel51d2e322015-08-28 15:29:351142 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL,
1143 ui::DomCode::CONTROL_LEFT,
1144 ui::EF_CONTROL_DOWN, ui::DomKey::CONTROL),
penghuange5df2822017-03-16 22:54:361145 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED,
kpschoedel8226fd152015-05-06 15:48:591146 ui::VKEY_F15, ui::DomCode::F15,
kpschoedel51d2e322015-08-28 15:29:351147 ui::EF_NONE, ui::DomKey::F15));
[email protected]d0eb7c92014-07-17 16:20:371148 // Check that Control is applied to a subsequent key press.
kpschoedel8226fd152015-05-06 15:48:591149 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191150 ui::DomCode::US_A, ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:531151 ui::DomKey::Constant<'a'>::Character),
penghuange5df2822017-03-16 22:54:361152 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191153 ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351154 ui::DomKey::Constant<'a'>::Character));
[email protected]d0eb7c92014-07-17 16:20:371155 // Release F15
kpschoedel8226fd152015-05-06 15:48:591156 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CONTROL,
1157 ui::DomCode::CONTROL_LEFT, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351158 ui::DomKey::CONTROL),
penghuange5df2822017-03-16 22:54:361159 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_RELEASED,
kpschoedel8226fd152015-05-06 15:48:591160 ui::VKEY_F15, ui::DomCode::F15,
kpschoedel51d2e322015-08-28 15:29:351161 ui::EF_NONE, ui::DomKey::F15));
[email protected]d0eb7c92014-07-17 16:20:371162 // Check that Control is no longer applied to a subsequent key press.
kpschoedel8226fd152015-05-06 15:48:591163 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191164 ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351165 ui::DomKey::Constant<'a'>::Character),
penghuange5df2822017-03-16 22:54:361166 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191167 ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351168 ui::DomKey::Constant<'a'>::Character));
[email protected]25ab8f12013-02-01 14:30:151169
Blake O'Harea09fa45a2017-10-13 04:19:581170 InitModifierKeyPref(&diamond, prefs::kLanguageRemapDiamondKeyTo,
1171 ui::chromeos::ModifierKey::kAltKey);
[email protected]25ab8f12013-02-01 14:30:151172
kpschoedel8226fd152015-05-06 15:48:591173 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_MENU,
1174 ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN,
kpschoedel51d2e322015-08-28 15:29:351175 ui::DomKey::ALT),
penghuange5df2822017-03-16 22:54:361176 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED,
kpschoedel8226fd152015-05-06 15:48:591177 ui::VKEY_F15, ui::DomCode::F15,
kpschoedel51d2e322015-08-28 15:29:351178 ui::EF_NONE, ui::DomKey::F15));
[email protected]d0eb7c92014-07-17 16:20:371179 // Check that Alt is applied to a subsequent key press.
kpschoedel8226fd152015-05-06 15:48:591180 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191181 ui::DomCode::US_A, ui::EF_ALT_DOWN,
kpschoedel51d2e322015-08-28 15:29:351182 ui::DomKey::Constant<'a'>::Character),
penghuange5df2822017-03-16 22:54:361183 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191184 ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351185 ui::DomKey::Constant<'a'>::Character));
[email protected]d0eb7c92014-07-17 16:20:371186 // Release F15
kpschoedel8226fd152015-05-06 15:48:591187 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_MENU,
1188 ui::DomCode::ALT_LEFT, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351189 ui::DomKey::ALT),
penghuange5df2822017-03-16 22:54:361190 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_RELEASED,
kpschoedel8226fd152015-05-06 15:48:591191 ui::VKEY_F15, ui::DomCode::F15,
kpschoedel51d2e322015-08-28 15:29:351192 ui::EF_NONE, ui::DomKey::F15));
[email protected]d0eb7c92014-07-17 16:20:371193 // Check that Alt is no longer applied to a subsequent key press.
kpschoedel8226fd152015-05-06 15:48:591194 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191195 ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351196 ui::DomKey::Constant<'a'>::Character),
penghuange5df2822017-03-16 22:54:361197 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191198 ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351199 ui::DomKey::Constant<'a'>::Character));
[email protected]25ab8f12013-02-01 14:30:151200
Blake O'Harea09fa45a2017-10-13 04:19:581201 InitModifierKeyPref(&diamond, prefs::kLanguageRemapDiamondKeyTo,
1202 ui::chromeos::ModifierKey::kCapsLockKey);
[email protected]25ab8f12013-02-01 14:30:151203
pkastingcc7f6ac2016-01-08 23:38:471204 EXPECT_EQ(GetExpectedResultAsString(
1205 ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
1206 ui::EF_CAPS_LOCK_ON | ui::EF_MOD3_DOWN, ui::DomKey::CAPS_LOCK),
penghuange5df2822017-03-16 22:54:361207 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED,
kpschoedel8226fd152015-05-06 15:48:591208 ui::VKEY_F15, ui::DomCode::F15,
kpschoedel51d2e322015-08-28 15:29:351209 ui::EF_NONE, ui::DomKey::F15));
[email protected]d0eb7c92014-07-17 16:20:371210 // Check that Caps is applied to a subsequent key press.
kpschoedel8226fd152015-05-06 15:48:591211 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191212 ui::DomCode::US_A,
pkastingcc7f6ac2016-01-08 23:38:471213 ui::EF_CAPS_LOCK_ON | ui::EF_MOD3_DOWN,
kpschoedel51d2e322015-08-28 15:29:351214 ui::DomKey::Constant<'A'>::Character),
penghuange5df2822017-03-16 22:54:361215 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191216 ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351217 ui::DomKey::Constant<'a'>::Character));
[email protected]d0eb7c92014-07-17 16:20:371218 // Release F15
kpschoedel8226fd152015-05-06 15:48:591219 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL,
1220 ui::DomCode::CAPS_LOCK, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351221 ui::DomKey::CAPS_LOCK),
penghuange5df2822017-03-16 22:54:361222 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_RELEASED,
kpschoedel8226fd152015-05-06 15:48:591223 ui::VKEY_F15, ui::DomCode::F15,
kpschoedel51d2e322015-08-28 15:29:351224 ui::EF_NONE, ui::DomKey::F15));
[email protected]d0eb7c92014-07-17 16:20:371225 // Check that Control is no longer applied to a subsequent key press.
kpschoedel8226fd152015-05-06 15:48:591226 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191227 ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351228 ui::DomKey::Constant<'a'>::Character),
penghuange5df2822017-03-16 22:54:361229 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191230 ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351231 ui::DomKey::Constant<'a'>::Character));
[email protected]a0e25352013-02-07 02:03:191232
avi3ef9ec9e2014-12-22 22:50:171233 *base::CommandLine::ForCurrentProcess() = original_cl;
[email protected]25ab8f12013-02-01 14:30:151234}
1235
[email protected]872ead342012-10-31 17:50:011236TEST_F(EventRewriterTest, TestRewriteCapsLockToControl) {
[email protected]d13e288992014-05-01 18:00:211237 // Remap CapsLock to Control.
penghuange5df2822017-03-16 22:54:361238 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]872ead342012-10-31 17:50:011239 IntegerPrefMember control;
Blake O'Harea09fa45a2017-10-13 04:19:581240 InitModifierKeyPref(&control, prefs::kLanguageRemapCapsLockKeyTo,
1241 ui::chromeos::ModifierKey::kControlKey);
[email protected]872ead342012-10-31 17:50:011242
penghuange5df2822017-03-16 22:54:361243 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
[email protected]59409342012-09-21 01:03:431244
[email protected]106cf972014-05-28 17:28:171245 KeyTestCase tests[] = {
1246 // Press CapsLock+a. Confirm that Mod3Mask is rewritten to ControlMask.
1247 // On Chrome OS, CapsLock works as a Mod3 modifier.
kpschoedel02c854d2015-06-16 14:44:291248 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:191249 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_MOD3_DOWN,
kpschoedel51d2e322015-08-28 15:29:351250 ui::DomKey::Constant<'a'>::Character},
kpschoedela281bf12016-01-07 15:08:191251 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:531252 ui::DomKey::Constant<'a'>::Character}},
[email protected]59409342012-09-21 01:03:431253
[email protected]106cf972014-05-28 17:28:171254 // Press Control+CapsLock+a. Confirm that Mod3Mask is rewritten to
1255 // ControlMask
kpschoedel02c854d2015-06-16 14:44:291256 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:191257 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_CONTROL_DOWN | ui::EF_MOD3_DOWN,
kpschoedel51d2e322015-08-28 15:29:351258 ui::DomKey::Constant<'a'>::Character},
kpschoedela281bf12016-01-07 15:08:191259 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:531260 ui::DomKey::Constant<'a'>::Character}},
[email protected]59409342012-09-21 01:03:431261
[email protected]106cf972014-05-28 17:28:171262 // Press Alt+CapsLock+a. Confirm that Mod3Mask is rewritten to
1263 // ControlMask.
kpschoedel02c854d2015-06-16 14:44:291264 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:191265 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_MOD3_DOWN,
kpschoedel51d2e322015-08-28 15:29:351266 ui::DomKey::Constant<'a'>::Character},
kpschoedela281bf12016-01-07 15:08:191267 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:531268 ui::DomKey::Constant<'a'>::Character}},
[email protected]106cf972014-05-28 17:28:171269 };
1270
penghuange5df2822017-03-16 22:54:361271 for (const auto& test : tests)
1272 CheckKeyTestCase(rewriter_, test);
[email protected]59409342012-09-21 01:03:431273}
1274
[email protected]872ead342012-10-31 17:50:011275TEST_F(EventRewriterTest, TestRewriteCapsLockMod3InUse) {
1276 // Remap CapsLock to Control.
penghuange5df2822017-03-16 22:54:361277 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]872ead342012-10-31 17:50:011278 IntegerPrefMember control;
Blake O'Harea09fa45a2017-10-13 04:19:581279 InitModifierKeyPref(&control, prefs::kLanguageRemapCapsLockKeyTo,
1280 ui::chromeos::ModifierKey::kControlKey);
[email protected]872ead342012-10-31 17:50:011281
penghuange5df2822017-03-16 22:54:361282 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
[email protected]1488a035f2014-03-28 21:12:071283 input_method_manager_mock_->set_mod3_used(true);
[email protected]59409342012-09-21 01:03:431284
[email protected]872ead342012-10-31 17:50:011285 // Press CapsLock+a. Confirm that Mod3Mask is NOT rewritten to ControlMask
1286 // when Mod3Mask is already in use by the current XKB layout.
kpschoedel8226fd152015-05-06 15:48:591287 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191288 ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351289 ui::DomKey::Constant<'a'>::Character),
penghuange5df2822017-03-16 22:54:361290 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191291 ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351292 ui::DomKey::Constant<'a'>::Character));
[email protected]59409342012-09-21 01:03:431293
[email protected]1488a035f2014-03-28 21:12:071294 input_method_manager_mock_->set_mod3_used(false);
[email protected]59409342012-09-21 01:03:431295}
1296
[email protected]ab6e1a12012-12-04 00:13:371297TEST_F(EventRewriterTest, TestRewriteExtendedKeys) {
penghuange5df2822017-03-16 22:54:361298 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
1299 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
1300 rewriter_->set_last_keyboard_device_id_for_testing(kKeyboardDeviceId);
[email protected]4a822092012-06-15 03:42:511301
[email protected]106cf972014-05-28 17:28:171302 KeyTestCase tests[] = {
1303 // Alt+Backspace -> Delete
kpschoedel02c854d2015-06-16 14:44:291304 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351305 {ui::VKEY_BACK, ui::DomCode::BACKSPACE, ui::EF_ALT_DOWN,
1306 ui::DomKey::BACKSPACE},
1307 {ui::VKEY_DELETE, ui::DomCode::DEL, ui::EF_NONE, ui::DomKey::DEL}},
kpschoedel8226fd152015-05-06 15:48:591308 // Control+Alt+Backspace -> Control+Delete
kpschoedel02c854d2015-06-16 14:44:291309 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351310 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
1311 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::BACKSPACE},
1312 {ui::VKEY_DELETE, ui::DomCode::DEL, ui::EF_CONTROL_DOWN,
1313 ui::DomKey::DEL}},
kpschoedel8226fd152015-05-06 15:48:591314 // Search+Alt+Backspace -> Alt+Backspace
kpschoedel02c854d2015-06-16 14:44:291315 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351316 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
1317 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::BACKSPACE},
1318 {ui::VKEY_BACK, ui::DomCode::BACKSPACE, ui::EF_ALT_DOWN,
1319 ui::DomKey::BACKSPACE}},
kpschoedel8226fd152015-05-06 15:48:591320 // Search+Control+Alt+Backspace -> Control+Alt+Backspace
kpschoedel02c854d2015-06-16 14:44:291321 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351322 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
kpschoedel8226fd152015-05-06 15:48:591323 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
kpschoedel51d2e322015-08-28 15:29:351324 ui::DomKey::BACKSPACE},
1325 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
1326 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::BACKSPACE}},
[email protected]106cf972014-05-28 17:28:171327 // Alt+Up -> Prior
kpschoedel02c854d2015-06-16 14:44:291328 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351329 {ui::VKEY_UP, ui::DomCode::ARROW_UP, ui::EF_ALT_DOWN,
1330 ui::DomKey::ARROW_UP},
1331 {ui::VKEY_PRIOR, ui::DomCode::PAGE_UP, ui::EF_NONE,
1332 ui::DomKey::PAGE_UP}},
[email protected]106cf972014-05-28 17:28:171333 // Alt+Down -> Next
kpschoedel02c854d2015-06-16 14:44:291334 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351335 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN, ui::EF_ALT_DOWN,
1336 ui::DomKey::ARROW_DOWN},
1337 {ui::VKEY_NEXT, ui::DomCode::PAGE_DOWN, ui::EF_NONE,
1338 ui::DomKey::PAGE_DOWN}},
[email protected]106cf972014-05-28 17:28:171339 // Ctrl+Alt+Up -> Home
kpschoedel02c854d2015-06-16 14:44:291340 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351341 {ui::VKEY_UP, ui::DomCode::ARROW_UP,
1342 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_UP},
1343 {ui::VKEY_HOME, ui::DomCode::HOME, ui::EF_NONE, ui::DomKey::HOME}},
[email protected]106cf972014-05-28 17:28:171344 // Ctrl+Alt+Down -> End
kpschoedel02c854d2015-06-16 14:44:291345 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351346 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN,
1347 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_DOWN},
1348 {ui::VKEY_END, ui::DomCode::END, ui::EF_NONE, ui::DomKey::END}},
[email protected]750508d2012-12-18 00:52:581349
[email protected]106cf972014-05-28 17:28:171350 // Search+Alt+Up -> Alt+Up
kpschoedel02c854d2015-06-16 14:44:291351 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351352 {ui::VKEY_UP, ui::DomCode::ARROW_UP,
1353 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ARROW_UP},
1354 {ui::VKEY_UP, ui::DomCode::ARROW_UP, ui::EF_ALT_DOWN,
1355 ui::DomKey::ARROW_UP}},
kpschoedel8226fd152015-05-06 15:48:591356 // Search+Alt+Down -> Alt+Down
kpschoedel02c854d2015-06-16 14:44:291357 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351358 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN,
1359 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ARROW_DOWN},
1360 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN, ui::EF_ALT_DOWN,
1361 ui::DomKey::ARROW_DOWN}},
kpschoedel8226fd152015-05-06 15:48:591362 // Search+Ctrl+Alt+Up -> Search+Ctrl+Alt+Up
kpschoedel02c854d2015-06-16 14:44:291363 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351364 {ui::VKEY_UP, ui::DomCode::ARROW_UP,
kpschoedel8226fd152015-05-06 15:48:591365 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
kpschoedel51d2e322015-08-28 15:29:351366 ui::DomKey::ARROW_UP},
1367 {ui::VKEY_UP, ui::DomCode::ARROW_UP,
1368 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_UP}},
kpschoedel8226fd152015-05-06 15:48:591369 // Search+Ctrl+Alt+Down -> Ctrl+Alt+Down
kpschoedel02c854d2015-06-16 14:44:291370 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351371 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN,
kpschoedel8226fd152015-05-06 15:48:591372 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
kpschoedel51d2e322015-08-28 15:29:351373 ui::DomKey::ARROW_DOWN},
1374 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN,
1375 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_DOWN}},
[email protected]750508d2012-12-18 00:52:581376
[email protected]106cf972014-05-28 17:28:171377 // Period -> Period
kpschoedel02c854d2015-06-16 14:44:291378 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351379 {ui::VKEY_OEM_PERIOD, ui::DomCode::PERIOD, ui::EF_NONE,
1380 ui::DomKey::Constant<'.'>::Character},
1381 {ui::VKEY_OEM_PERIOD, ui::DomCode::PERIOD, ui::EF_NONE,
1382 ui::DomKey::Constant<'.'>::Character}},
[email protected]3e035e82012-11-27 20:54:321383
[email protected]106cf972014-05-28 17:28:171384 // Search+Backspace -> Delete
kpschoedel02c854d2015-06-16 14:44:291385 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351386 {ui::VKEY_BACK, ui::DomCode::BACKSPACE, ui::EF_COMMAND_DOWN,
1387 ui::DomKey::BACKSPACE},
1388 {ui::VKEY_DELETE, ui::DomCode::DEL, ui::EF_NONE, ui::DomKey::DEL}},
[email protected]106cf972014-05-28 17:28:171389 // Search+Up -> Prior
kpschoedel02c854d2015-06-16 14:44:291390 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351391 {ui::VKEY_UP, ui::DomCode::ARROW_UP, ui::EF_COMMAND_DOWN,
1392 ui::DomKey::ARROW_UP},
1393 {ui::VKEY_PRIOR, ui::DomCode::PAGE_UP, ui::EF_NONE,
1394 ui::DomKey::PAGE_UP}},
[email protected]106cf972014-05-28 17:28:171395 // Search+Down -> Next
kpschoedel02c854d2015-06-16 14:44:291396 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351397 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN, ui::EF_COMMAND_DOWN,
1398 ui::DomKey::ARROW_DOWN},
1399 {ui::VKEY_NEXT, ui::DomCode::PAGE_DOWN, ui::EF_NONE,
1400 ui::DomKey::PAGE_DOWN}},
[email protected]106cf972014-05-28 17:28:171401 // Search+Left -> Home
kpschoedel02c854d2015-06-16 14:44:291402 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351403 {ui::VKEY_LEFT, ui::DomCode::ARROW_LEFT, ui::EF_COMMAND_DOWN,
1404 ui::DomKey::ARROW_LEFT},
1405 {ui::VKEY_HOME, ui::DomCode::HOME, ui::EF_NONE, ui::DomKey::HOME}},
[email protected]106cf972014-05-28 17:28:171406 // Control+Search+Left -> Home
kpschoedel02c854d2015-06-16 14:44:291407 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351408 {ui::VKEY_LEFT, ui::DomCode::ARROW_LEFT,
1409 ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_LEFT},
1410 {ui::VKEY_HOME, ui::DomCode::HOME, ui::EF_CONTROL_DOWN,
1411 ui::DomKey::HOME}},
[email protected]106cf972014-05-28 17:28:171412 // Search+Right -> End
kpschoedel02c854d2015-06-16 14:44:291413 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351414 {ui::VKEY_RIGHT, ui::DomCode::ARROW_RIGHT, ui::EF_COMMAND_DOWN,
1415 ui::DomKey::ARROW_RIGHT},
1416 {ui::VKEY_END, ui::DomCode::END, ui::EF_NONE, ui::DomKey::END}},
[email protected]106cf972014-05-28 17:28:171417 // Control+Search+Right -> End
kpschoedel02c854d2015-06-16 14:44:291418 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351419 {ui::VKEY_RIGHT, ui::DomCode::ARROW_RIGHT,
1420 ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_RIGHT},
1421 {ui::VKEY_END, ui::DomCode::END, ui::EF_CONTROL_DOWN, ui::DomKey::END}},
[email protected]106cf972014-05-28 17:28:171422 // Search+Period -> Insert
kpschoedel02c854d2015-06-16 14:44:291423 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351424 {ui::VKEY_OEM_PERIOD, ui::DomCode::PERIOD, ui::EF_COMMAND_DOWN,
1425 ui::DomKey::Constant<'.'>::Character},
1426 {ui::VKEY_INSERT, ui::DomCode::INSERT, ui::EF_NONE, ui::DomKey::INSERT}},
[email protected]106cf972014-05-28 17:28:171427 // Control+Search+Period -> Control+Insert
kpschoedel02c854d2015-06-16 14:44:291428 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351429 {ui::VKEY_OEM_PERIOD, ui::DomCode::PERIOD,
kpschoedel8226fd152015-05-06 15:48:591430 ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN,
kpschoedel51d2e322015-08-28 15:29:351431 ui::DomKey::Constant<'.'>::Character},
1432 {ui::VKEY_INSERT, ui::DomCode::INSERT, ui::EF_CONTROL_DOWN,
1433 ui::DomKey::INSERT}}};
[email protected]3e035e82012-11-27 20:54:321434
penghuange5df2822017-03-16 22:54:361435 for (const auto& test : tests)
1436 CheckKeyTestCase(rewriter_, test);
[email protected]f925a1a2012-11-30 07:27:521437}
[email protected]3e035e82012-11-27 20:54:321438
[email protected]f925a1a2012-11-30 07:27:521439TEST_F(EventRewriterTest, TestRewriteFunctionKeys) {
penghuange5df2822017-03-16 22:54:361440 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
1441 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
[email protected]3e035e82012-11-27 20:54:321442
kpschoedel8226fd152015-05-06 15:48:591443 KeyTestCase tests[] = {
[email protected]106cf972014-05-28 17:28:171444 // F1 -> Back
kpschoedel02c854d2015-06-16 14:44:291445 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351446 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1},
1447 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_NONE,
1448 ui::DomKey::BROWSER_BACK}},
kpschoedel02c854d2015-06-16 14:44:291449 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351450 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_CONTROL_DOWN, ui::DomKey::F1},
1451 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_CONTROL_DOWN,
1452 ui::DomKey::BROWSER_BACK}},
kpschoedel02c854d2015-06-16 14:44:291453 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351454 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_ALT_DOWN, ui::DomKey::F1},
1455 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_ALT_DOWN,
1456 ui::DomKey::BROWSER_BACK}},
[email protected]106cf972014-05-28 17:28:171457 // F2 -> Forward
kpschoedel02c854d2015-06-16 14:44:291458 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351459 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2},
1460 {ui::VKEY_BROWSER_FORWARD, ui::DomCode::BROWSER_FORWARD, ui::EF_NONE,
1461 ui::DomKey::BROWSER_FORWARD}},
kpschoedel02c854d2015-06-16 14:44:291462 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351463 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_CONTROL_DOWN, ui::DomKey::F2},
1464 {ui::VKEY_BROWSER_FORWARD, ui::DomCode::BROWSER_FORWARD,
1465 ui::EF_CONTROL_DOWN, ui::DomKey::BROWSER_FORWARD}},
kpschoedel02c854d2015-06-16 14:44:291466 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351467 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_ALT_DOWN, ui::DomKey::F2},
1468 {ui::VKEY_BROWSER_FORWARD, ui::DomCode::BROWSER_FORWARD, ui::EF_ALT_DOWN,
1469 ui::DomKey::BROWSER_FORWARD}},
[email protected]106cf972014-05-28 17:28:171470 // F3 -> Refresh
kpschoedel02c854d2015-06-16 14:44:291471 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351472 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3},
1473 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_NONE,
1474 ui::DomKey::BROWSER_REFRESH}},
kpschoedel02c854d2015-06-16 14:44:291475 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351476 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_CONTROL_DOWN, ui::DomKey::F3},
1477 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH,
1478 ui::EF_CONTROL_DOWN, ui::DomKey::BROWSER_REFRESH}},
kpschoedel02c854d2015-06-16 14:44:291479 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351480 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_ALT_DOWN, ui::DomKey::F3},
1481 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_ALT_DOWN,
1482 ui::DomKey::BROWSER_REFRESH}},
[email protected]106cf972014-05-28 17:28:171483 // F4 -> Launch App 2
kpschoedel02c854d2015-06-16 14:44:291484 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351485 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4},
1486 {ui::VKEY_MEDIA_LAUNCH_APP2, ui::DomCode::ZOOM_TOGGLE, ui::EF_NONE,
1487 ui::DomKey::ZOOM_TOGGLE}},
kpschoedel02c854d2015-06-16 14:44:291488 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351489 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_CONTROL_DOWN, ui::DomKey::F4},
1490 {ui::VKEY_MEDIA_LAUNCH_APP2, ui::DomCode::ZOOM_TOGGLE,
1491 ui::EF_CONTROL_DOWN, ui::DomKey::ZOOM_TOGGLE}},
kpschoedel02c854d2015-06-16 14:44:291492 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351493 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_ALT_DOWN, ui::DomKey::F4},
1494 {ui::VKEY_MEDIA_LAUNCH_APP2, ui::DomCode::ZOOM_TOGGLE, ui::EF_ALT_DOWN,
1495 ui::DomKey::ZOOM_TOGGLE}},
[email protected]106cf972014-05-28 17:28:171496 // F5 -> Launch App 1
kpschoedel02c854d2015-06-16 14:44:291497 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351498 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5},
1499 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::SELECT_TASK, ui::EF_NONE,
1500 ui::DomKey::LAUNCH_MY_COMPUTER}},
kpschoedel02c854d2015-06-16 14:44:291501 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351502 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_CONTROL_DOWN, ui::DomKey::F5},
1503 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::SELECT_TASK,
1504 ui::EF_CONTROL_DOWN, ui::DomKey::LAUNCH_MY_COMPUTER}},
kpschoedel02c854d2015-06-16 14:44:291505 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351506 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_ALT_DOWN, ui::DomKey::F5},
1507 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::SELECT_TASK, ui::EF_ALT_DOWN,
1508 ui::DomKey::LAUNCH_MY_COMPUTER}},
[email protected]106cf972014-05-28 17:28:171509 // F6 -> Brightness down
kpschoedel02c854d2015-06-16 14:44:291510 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351511 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6},
1512 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN, ui::EF_NONE,
1513 ui::DomKey::BRIGHTNESS_DOWN}},
kpschoedel02c854d2015-06-16 14:44:291514 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351515 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_CONTROL_DOWN, ui::DomKey::F6},
1516 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN,
1517 ui::EF_CONTROL_DOWN, ui::DomKey::BRIGHTNESS_DOWN}},
kpschoedel02c854d2015-06-16 14:44:291518 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351519 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_ALT_DOWN, ui::DomKey::F6},
1520 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN, ui::EF_ALT_DOWN,
1521 ui::DomKey::BRIGHTNESS_DOWN}},
[email protected]106cf972014-05-28 17:28:171522 // F7 -> Brightness up
kpschoedel02c854d2015-06-16 14:44:291523 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351524 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7},
1525 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_NONE,
1526 ui::DomKey::BRIGHTNESS_UP}},
kpschoedel02c854d2015-06-16 14:44:291527 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351528 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_CONTROL_DOWN, ui::DomKey::F7},
1529 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_CONTROL_DOWN,
1530 ui::DomKey::BRIGHTNESS_UP}},
kpschoedel02c854d2015-06-16 14:44:291531 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351532 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_ALT_DOWN, ui::DomKey::F7},
1533 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_ALT_DOWN,
1534 ui::DomKey::BRIGHTNESS_UP}},
[email protected]106cf972014-05-28 17:28:171535 // F8 -> Volume Mute
kpschoedel02c854d2015-06-16 14:44:291536 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351537 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8},
1538 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_NONE,
kpschoedel0a8b03052016-02-17 15:35:131539 ui::DomKey::AUDIO_VOLUME_MUTE}},
kpschoedel02c854d2015-06-16 14:44:291540 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351541 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_CONTROL_DOWN, ui::DomKey::F8},
1542 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_CONTROL_DOWN,
kpschoedel0a8b03052016-02-17 15:35:131543 ui::DomKey::AUDIO_VOLUME_MUTE}},
kpschoedel02c854d2015-06-16 14:44:291544 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351545 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_ALT_DOWN, ui::DomKey::F8},
1546 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_ALT_DOWN,
kpschoedel0a8b03052016-02-17 15:35:131547 ui::DomKey::AUDIO_VOLUME_MUTE}},
[email protected]106cf972014-05-28 17:28:171548 // F9 -> Volume Down
kpschoedel02c854d2015-06-16 14:44:291549 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351550 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9},
1551 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_NONE,
kpschoedel0a8b03052016-02-17 15:35:131552 ui::DomKey::AUDIO_VOLUME_DOWN}},
kpschoedel02c854d2015-06-16 14:44:291553 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351554 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_CONTROL_DOWN, ui::DomKey::F9},
1555 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_CONTROL_DOWN,
kpschoedel0a8b03052016-02-17 15:35:131556 ui::DomKey::AUDIO_VOLUME_DOWN}},
kpschoedel02c854d2015-06-16 14:44:291557 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351558 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_ALT_DOWN, ui::DomKey::F9},
1559 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_ALT_DOWN,
kpschoedel0a8b03052016-02-17 15:35:131560 ui::DomKey::AUDIO_VOLUME_DOWN}},
[email protected]106cf972014-05-28 17:28:171561 // F10 -> Volume Up
kpschoedel02c854d2015-06-16 14:44:291562 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351563 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10},
1564 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_NONE,
kpschoedel0a8b03052016-02-17 15:35:131565 ui::DomKey::AUDIO_VOLUME_UP}},
kpschoedel02c854d2015-06-16 14:44:291566 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351567 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_CONTROL_DOWN, ui::DomKey::F10},
1568 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_CONTROL_DOWN,
kpschoedel0a8b03052016-02-17 15:35:131569 ui::DomKey::AUDIO_VOLUME_UP}},
kpschoedel02c854d2015-06-16 14:44:291570 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351571 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_ALT_DOWN, ui::DomKey::F10},
1572 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_ALT_DOWN,
kpschoedel0a8b03052016-02-17 15:35:131573 ui::DomKey::AUDIO_VOLUME_UP}},
[email protected]106cf972014-05-28 17:28:171574 // F11 -> F11
kpschoedel02c854d2015-06-16 14:44:291575 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351576 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11},
1577 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}},
kpschoedel02c854d2015-06-16 14:44:291578 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351579 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_CONTROL_DOWN, ui::DomKey::F11},
1580 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_CONTROL_DOWN, ui::DomKey::F11}},
kpschoedel02c854d2015-06-16 14:44:291581 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351582 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_ALT_DOWN, ui::DomKey::F11},
1583 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_ALT_DOWN, ui::DomKey::F11}},
[email protected]106cf972014-05-28 17:28:171584 // F12 -> F12
kpschoedel02c854d2015-06-16 14:44:291585 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351586 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12},
1587 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
kpschoedel02c854d2015-06-16 14:44:291588 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351589 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12},
1590 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12}},
kpschoedel02c854d2015-06-16 14:44:291591 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351592 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_ALT_DOWN, ui::DomKey::F12},
1593 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_ALT_DOWN, ui::DomKey::F12}},
[email protected]750508d2012-12-18 00:52:581594
[email protected]106cf972014-05-28 17:28:171595 // The number row should not be rewritten without Search key.
kpschoedel02c854d2015-06-16 14:44:291596 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351597 {ui::VKEY_1, ui::DomCode::DIGIT1, ui::EF_NONE,
1598 ui::DomKey::Constant<'1'>::Character},
1599 {ui::VKEY_1, ui::DomCode::DIGIT1, ui::EF_NONE,
1600 ui::DomKey::Constant<'1'>::Character}},
kpschoedel02c854d2015-06-16 14:44:291601 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351602 {ui::VKEY_2, ui::DomCode::DIGIT2, ui::EF_NONE,
1603 ui::DomKey::Constant<'2'>::Character},
1604 {ui::VKEY_2, ui::DomCode::DIGIT2, ui::EF_NONE,
1605 ui::DomKey::Constant<'2'>::Character}},
kpschoedel02c854d2015-06-16 14:44:291606 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351607 {ui::VKEY_3, ui::DomCode::DIGIT3, ui::EF_NONE,
1608 ui::DomKey::Constant<'3'>::Character},
1609 {ui::VKEY_3, ui::DomCode::DIGIT3, ui::EF_NONE,
1610 ui::DomKey::Constant<'3'>::Character}},
kpschoedel02c854d2015-06-16 14:44:291611 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351612 {ui::VKEY_4, ui::DomCode::DIGIT4, ui::EF_NONE,
1613 ui::DomKey::Constant<'4'>::Character},
1614 {ui::VKEY_4, ui::DomCode::DIGIT4, ui::EF_NONE,
1615 ui::DomKey::Constant<'4'>::Character}},
kpschoedel02c854d2015-06-16 14:44:291616 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351617 {ui::VKEY_5, ui::DomCode::DIGIT5, ui::EF_NONE,
1618 ui::DomKey::Constant<'5'>::Character},
1619 {ui::VKEY_5, ui::DomCode::DIGIT5, ui::EF_NONE,
1620 ui::DomKey::Constant<'5'>::Character}},
kpschoedel02c854d2015-06-16 14:44:291621 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351622 {ui::VKEY_6, ui::DomCode::DIGIT6, ui::EF_NONE,
1623 ui::DomKey::Constant<'6'>::Character},
1624 {ui::VKEY_6, ui::DomCode::DIGIT6, ui::EF_NONE,
1625 ui::DomKey::Constant<'6'>::Character}},
kpschoedel02c854d2015-06-16 14:44:291626 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351627 {ui::VKEY_7, ui::DomCode::DIGIT7, ui::EF_NONE,
1628 ui::DomKey::Constant<'7'>::Character},
1629 {ui::VKEY_7, ui::DomCode::DIGIT7, ui::EF_NONE,
1630 ui::DomKey::Constant<'7'>::Character}},
kpschoedel02c854d2015-06-16 14:44:291631 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351632 {ui::VKEY_8, ui::DomCode::DIGIT8, ui::EF_NONE,
1633 ui::DomKey::Constant<'8'>::Character},
1634 {ui::VKEY_8, ui::DomCode::DIGIT8, ui::EF_NONE,
1635 ui::DomKey::Constant<'8'>::Character}},
kpschoedel02c854d2015-06-16 14:44:291636 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351637 {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_NONE,
1638 ui::DomKey::Constant<'9'>::Character},
1639 {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_NONE,
1640 ui::DomKey::Constant<'9'>::Character}},
kpschoedel02c854d2015-06-16 14:44:291641 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351642 {ui::VKEY_0, ui::DomCode::DIGIT0, ui::EF_NONE,
1643 ui::DomKey::Constant<'0'>::Character},
1644 {ui::VKEY_0, ui::DomCode::DIGIT0, ui::EF_NONE,
1645 ui::DomKey::Constant<'0'>::Character}},
kpschoedel02c854d2015-06-16 14:44:291646 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351647 {ui::VKEY_OEM_MINUS, ui::DomCode::MINUS, ui::EF_NONE,
1648 ui::DomKey::Constant<'-'>::Character},
1649 {ui::VKEY_OEM_MINUS, ui::DomCode::MINUS, ui::EF_NONE,
1650 ui::DomKey::Constant<'-'>::Character}},
kpschoedel02c854d2015-06-16 14:44:291651 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351652 {ui::VKEY_OEM_PLUS, ui::DomCode::EQUAL, ui::EF_NONE,
1653 ui::DomKey::Constant<'='>::Character},
1654 {ui::VKEY_OEM_PLUS, ui::DomCode::EQUAL, ui::EF_NONE,
1655 ui::DomKey::Constant<'='>::Character}},
[email protected]750508d2012-12-18 00:52:581656
[email protected]106cf972014-05-28 17:28:171657 // The number row should be rewritten as the F<number> row with Search
1658 // key.
kpschoedel02c854d2015-06-16 14:44:291659 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351660 {ui::VKEY_1, ui::DomCode::DIGIT1, ui::EF_COMMAND_DOWN,
1661 ui::DomKey::Constant<'1'>::Character},
1662 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1}},
kpschoedel02c854d2015-06-16 14:44:291663 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351664 {ui::VKEY_2, ui::DomCode::DIGIT2, ui::EF_COMMAND_DOWN,
1665 ui::DomKey::Constant<'2'>::Character},
1666 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2}},
kpschoedel02c854d2015-06-16 14:44:291667 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351668 {ui::VKEY_3, ui::DomCode::DIGIT3, ui::EF_COMMAND_DOWN,
1669 ui::DomKey::Constant<'3'>::Character},
1670 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3}},
kpschoedel02c854d2015-06-16 14:44:291671 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351672 {ui::VKEY_4, ui::DomCode::DIGIT4, ui::EF_COMMAND_DOWN,
1673 ui::DomKey::Constant<'4'>::Character},
1674 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4}},
kpschoedel02c854d2015-06-16 14:44:291675 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351676 {ui::VKEY_5, ui::DomCode::DIGIT5, ui::EF_COMMAND_DOWN,
1677 ui::DomKey::Constant<'5'>::Character},
1678 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5}},
kpschoedel02c854d2015-06-16 14:44:291679 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351680 {ui::VKEY_6, ui::DomCode::DIGIT6, ui::EF_COMMAND_DOWN,
1681 ui::DomKey::Constant<'6'>::Character},
1682 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6}},
kpschoedel02c854d2015-06-16 14:44:291683 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351684 {ui::VKEY_7, ui::DomCode::DIGIT7, ui::EF_COMMAND_DOWN,
1685 ui::DomKey::Constant<'7'>::Character},
1686 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7}},
kpschoedel02c854d2015-06-16 14:44:291687 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351688 {ui::VKEY_8, ui::DomCode::DIGIT8, ui::EF_COMMAND_DOWN,
1689 ui::DomKey::Constant<'8'>::Character},
1690 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8}},
kpschoedel02c854d2015-06-16 14:44:291691 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351692 {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_COMMAND_DOWN,
1693 ui::DomKey::Constant<'9'>::Character},
1694 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9}},
kpschoedel02c854d2015-06-16 14:44:291695 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351696 {ui::VKEY_0, ui::DomCode::DIGIT0, ui::EF_COMMAND_DOWN,
1697 ui::DomKey::Constant<'0'>::Character},
1698 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10}},
kpschoedel02c854d2015-06-16 14:44:291699 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351700 {ui::VKEY_OEM_MINUS, ui::DomCode::MINUS, ui::EF_COMMAND_DOWN,
1701 ui::DomKey::Constant<'-'>::Character},
1702 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}},
kpschoedel02c854d2015-06-16 14:44:291703 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351704 {ui::VKEY_OEM_PLUS, ui::DomCode::EQUAL, ui::EF_COMMAND_DOWN,
1705 ui::DomKey::Constant<'='>::Character},
1706 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
[email protected]750508d2012-12-18 00:52:581707
[email protected]106cf972014-05-28 17:28:171708 // The function keys should not be rewritten with Search key pressed.
kpschoedel02c854d2015-06-16 14:44:291709 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351710 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_COMMAND_DOWN, ui::DomKey::F1},
1711 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1}},
kpschoedel02c854d2015-06-16 14:44:291712 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351713 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_COMMAND_DOWN, ui::DomKey::F2},
1714 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2}},
kpschoedel02c854d2015-06-16 14:44:291715 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351716 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_COMMAND_DOWN, ui::DomKey::F3},
1717 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3}},
kpschoedel02c854d2015-06-16 14:44:291718 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351719 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_COMMAND_DOWN, ui::DomKey::F4},
1720 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4}},
kpschoedel02c854d2015-06-16 14:44:291721 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351722 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_COMMAND_DOWN, ui::DomKey::F5},
1723 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5}},
kpschoedel02c854d2015-06-16 14:44:291724 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351725 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_COMMAND_DOWN, ui::DomKey::F6},
1726 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6}},
kpschoedel02c854d2015-06-16 14:44:291727 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351728 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_COMMAND_DOWN, ui::DomKey::F7},
1729 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7}},
kpschoedel02c854d2015-06-16 14:44:291730 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351731 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_COMMAND_DOWN, ui::DomKey::F8},
1732 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8}},
kpschoedel02c854d2015-06-16 14:44:291733 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351734 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_COMMAND_DOWN, ui::DomKey::F9},
1735 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9}},
kpschoedel02c854d2015-06-16 14:44:291736 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351737 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_COMMAND_DOWN, ui::DomKey::F10},
1738 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10}},
kpschoedel02c854d2015-06-16 14:44:291739 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351740 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_COMMAND_DOWN, ui::DomKey::F11},
1741 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}},
kpschoedel02c854d2015-06-16 14:44:291742 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351743 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_COMMAND_DOWN, ui::DomKey::F12},
1744 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}}};
[email protected]f925a1a2012-11-30 07:27:521745
penghuange5df2822017-03-16 22:54:361746 for (const auto& test : tests)
1747 CheckKeyTestCase(rewriter_, test);
[email protected]4a822092012-06-15 03:42:511748}
1749
Dmitry Torokhov0bcc3cf2017-07-15 17:50:301750TEST_F(EventRewriterTest, TestRewriteFunctionKeysLayout2) {
1751 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
1752 rewriter_->KeyboardDeviceAddedForTesting(
1753 kKeyboardDeviceId, "PC Keyboard",
1754 ui::EventRewriterChromeOS::kKbdTopRowLayout2);
1755
1756 KeyTestCase tests[] = {
1757 // F1 -> Back
1758 {ui::ET_KEY_PRESSED,
1759 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1},
1760 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_NONE,
1761 ui::DomKey::BROWSER_BACK}},
1762 {ui::ET_KEY_PRESSED,
1763 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_CONTROL_DOWN, ui::DomKey::F1},
1764 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_CONTROL_DOWN,
1765 ui::DomKey::BROWSER_BACK}},
1766 {ui::ET_KEY_PRESSED,
1767 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_ALT_DOWN, ui::DomKey::F1},
1768 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_ALT_DOWN,
1769 ui::DomKey::BROWSER_BACK}},
1770 // F2 -> Refresh
1771 {ui::ET_KEY_PRESSED,
1772 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2},
1773 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_NONE,
1774 ui::DomKey::BROWSER_REFRESH}},
1775 {ui::ET_KEY_PRESSED,
1776 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_CONTROL_DOWN, ui::DomKey::F2},
1777 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH,
1778 ui::EF_CONTROL_DOWN, ui::DomKey::BROWSER_REFRESH}},
1779 {ui::ET_KEY_PRESSED,
1780 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_ALT_DOWN, ui::DomKey::F2},
1781 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_ALT_DOWN,
1782 ui::DomKey::BROWSER_REFRESH}},
1783 // F3 -> Launch App 2
1784 {ui::ET_KEY_PRESSED,
1785 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3},
1786 {ui::VKEY_MEDIA_LAUNCH_APP2, ui::DomCode::ZOOM_TOGGLE, ui::EF_NONE,
1787 ui::DomKey::ZOOM_TOGGLE}},
1788 {ui::ET_KEY_PRESSED,
1789 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_CONTROL_DOWN, ui::DomKey::F3},
1790 {ui::VKEY_MEDIA_LAUNCH_APP2, ui::DomCode::ZOOM_TOGGLE,
1791 ui::EF_CONTROL_DOWN, ui::DomKey::ZOOM_TOGGLE}},
1792 {ui::ET_KEY_PRESSED,
1793 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_ALT_DOWN, ui::DomKey::F3},
1794 {ui::VKEY_MEDIA_LAUNCH_APP2, ui::DomCode::ZOOM_TOGGLE, ui::EF_ALT_DOWN,
1795 ui::DomKey::ZOOM_TOGGLE}},
1796 // F4 -> Launch App 1
1797 {ui::ET_KEY_PRESSED,
1798 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4},
1799 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::SELECT_TASK, ui::EF_NONE,
1800 ui::DomKey::LAUNCH_MY_COMPUTER}},
1801 {ui::ET_KEY_PRESSED,
1802 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_CONTROL_DOWN, ui::DomKey::F4},
1803 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::SELECT_TASK,
1804 ui::EF_CONTROL_DOWN, ui::DomKey::LAUNCH_MY_COMPUTER}},
1805 {ui::ET_KEY_PRESSED,
1806 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_ALT_DOWN, ui::DomKey::F4},
1807 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::SELECT_TASK, ui::EF_ALT_DOWN,
1808 ui::DomKey::LAUNCH_MY_COMPUTER}},
1809 // F5 -> Brightness down
1810 {ui::ET_KEY_PRESSED,
1811 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5},
1812 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN, ui::EF_NONE,
1813 ui::DomKey::BRIGHTNESS_DOWN}},
1814 {ui::ET_KEY_PRESSED,
1815 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_CONTROL_DOWN, ui::DomKey::F5},
1816 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN,
1817 ui::EF_CONTROL_DOWN, ui::DomKey::BRIGHTNESS_DOWN}},
1818 {ui::ET_KEY_PRESSED,
1819 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_ALT_DOWN, ui::DomKey::F5},
1820 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN, ui::EF_ALT_DOWN,
1821 ui::DomKey::BRIGHTNESS_DOWN}},
1822 // F6 -> Brightness up
1823 {ui::ET_KEY_PRESSED,
1824 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6},
1825 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_NONE,
1826 ui::DomKey::BRIGHTNESS_UP}},
1827 {ui::ET_KEY_PRESSED,
1828 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_CONTROL_DOWN, ui::DomKey::F6},
1829 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_CONTROL_DOWN,
1830 ui::DomKey::BRIGHTNESS_UP}},
1831 {ui::ET_KEY_PRESSED,
1832 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_ALT_DOWN, ui::DomKey::F6},
1833 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_ALT_DOWN,
1834 ui::DomKey::BRIGHTNESS_UP}},
1835 // F7 -> Media Play/Pause
1836 {ui::ET_KEY_PRESSED,
1837 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7},
1838 {ui::VKEY_MEDIA_PLAY_PAUSE, ui::DomCode::MEDIA_PLAY_PAUSE, ui::EF_NONE,
1839 ui::DomKey::MEDIA_PLAY_PAUSE}},
1840 {ui::ET_KEY_PRESSED,
1841 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_CONTROL_DOWN, ui::DomKey::F7},
1842 {ui::VKEY_MEDIA_PLAY_PAUSE, ui::DomCode::MEDIA_PLAY_PAUSE,
1843 ui::EF_CONTROL_DOWN, ui::DomKey::MEDIA_PLAY_PAUSE}},
1844 {ui::ET_KEY_PRESSED,
1845 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_ALT_DOWN, ui::DomKey::F7},
1846 {ui::VKEY_MEDIA_PLAY_PAUSE, ui::DomCode::MEDIA_PLAY_PAUSE,
1847 ui::EF_ALT_DOWN, ui::DomKey::MEDIA_PLAY_PAUSE}},
1848 // F8 -> Volume Mute
1849 {ui::ET_KEY_PRESSED,
1850 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8},
1851 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_NONE,
1852 ui::DomKey::AUDIO_VOLUME_MUTE}},
1853 {ui::ET_KEY_PRESSED,
1854 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_CONTROL_DOWN, ui::DomKey::F8},
1855 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_CONTROL_DOWN,
1856 ui::DomKey::AUDIO_VOLUME_MUTE}},
1857 {ui::ET_KEY_PRESSED,
1858 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_ALT_DOWN, ui::DomKey::F8},
1859 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_ALT_DOWN,
1860 ui::DomKey::AUDIO_VOLUME_MUTE}},
1861 // F9 -> Volume Down
1862 {ui::ET_KEY_PRESSED,
1863 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9},
1864 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_NONE,
1865 ui::DomKey::AUDIO_VOLUME_DOWN}},
1866 {ui::ET_KEY_PRESSED,
1867 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_CONTROL_DOWN, ui::DomKey::F9},
1868 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_CONTROL_DOWN,
1869 ui::DomKey::AUDIO_VOLUME_DOWN}},
1870 {ui::ET_KEY_PRESSED,
1871 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_ALT_DOWN, ui::DomKey::F9},
1872 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_ALT_DOWN,
1873 ui::DomKey::AUDIO_VOLUME_DOWN}},
1874 // F10 -> Volume Up
1875 {ui::ET_KEY_PRESSED,
1876 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10},
1877 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_NONE,
1878 ui::DomKey::AUDIO_VOLUME_UP}},
1879 {ui::ET_KEY_PRESSED,
1880 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_CONTROL_DOWN, ui::DomKey::F10},
1881 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_CONTROL_DOWN,
1882 ui::DomKey::AUDIO_VOLUME_UP}},
1883 {ui::ET_KEY_PRESSED,
1884 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_ALT_DOWN, ui::DomKey::F10},
1885 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_ALT_DOWN,
1886 ui::DomKey::AUDIO_VOLUME_UP}},
1887 // F11 -> F11
1888 {ui::ET_KEY_PRESSED,
1889 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11},
1890 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}},
1891 {ui::ET_KEY_PRESSED,
1892 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_CONTROL_DOWN, ui::DomKey::F11},
1893 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_CONTROL_DOWN, ui::DomKey::F11}},
1894 {ui::ET_KEY_PRESSED,
1895 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_ALT_DOWN, ui::DomKey::F11},
1896 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_ALT_DOWN, ui::DomKey::F11}},
1897 // F12 -> F12
1898 {ui::ET_KEY_PRESSED,
1899 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12},
1900 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
1901 {ui::ET_KEY_PRESSED,
1902 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12},
1903 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12}},
1904 {ui::ET_KEY_PRESSED,
1905 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_ALT_DOWN, ui::DomKey::F12},
1906 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_ALT_DOWN, ui::DomKey::F12}}};
1907
1908 for (const auto& test : tests)
1909 CheckKeyTestCase(rewriter_, test);
1910}
1911
[email protected]ab6e1a12012-12-04 00:13:371912TEST_F(EventRewriterTest, TestRewriteExtendedKeysWithSearchRemapped) {
[email protected]4a822092012-06-15 03:42:511913 // Remap Search to Control.
penghuange5df2822017-03-16 22:54:361914 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]4a822092012-06-15 03:42:511915 IntegerPrefMember search;
Blake O'Harea09fa45a2017-10-13 04:19:581916 InitModifierKeyPref(&search, prefs::kLanguageRemapSearchKeyTo,
1917 ui::chromeos::ModifierKey::kControlKey);
[email protected]4a822092012-06-15 03:42:511918
penghuange5df2822017-03-16 22:54:361919 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
[email protected]4a822092012-06-15 03:42:511920
[email protected]106cf972014-05-28 17:28:171921 KeyTestCase tests[] = {
1922 // Alt+Search+Down -> End
kpschoedel02c854d2015-06-16 14:44:291923 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351924 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN,
1925 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, ui::DomKey::ARROW_DOWN},
1926 {ui::VKEY_END, ui::DomCode::END, ui::EF_NONE, ui::DomKey::END}},
[email protected]4a822092012-06-15 03:42:511927
[email protected]106cf972014-05-28 17:28:171928 // Shift+Alt+Search+Down -> Shift+End
kpschoedel02c854d2015-06-16 14:44:291929 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351930 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN,
kpschoedel8226fd152015-05-06 15:48:591931 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:351932 ui::DomKey::ARROW_DOWN},
1933 {ui::VKEY_END, ui::DomCode::END, ui::EF_SHIFT_DOWN, ui::DomKey::END}},
[email protected]106cf972014-05-28 17:28:171934 };
1935
penghuange5df2822017-03-16 22:54:361936 for (const auto& test : tests)
1937 CheckKeyTestCase(rewriter_, test);
[email protected]4a822092012-06-15 03:42:511938}
[email protected]b2a042f02012-07-19 02:41:381939
1940TEST_F(EventRewriterTest, TestRewriteKeyEventSentByXSendEvent) {
1941 // Remap Control to Alt.
penghuange5df2822017-03-16 22:54:361942 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]b2a042f02012-07-19 02:41:381943 IntegerPrefMember control;
Blake O'Harea09fa45a2017-10-13 04:19:581944 InitModifierKeyPref(&control, prefs::kLanguageRemapControlKeyTo,
1945 ui::chromeos::ModifierKey::kAltKey);
[email protected]b2a042f02012-07-19 02:41:381946
penghuange5df2822017-03-16 22:54:361947 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
[email protected]b2a042f02012-07-19 02:41:381948
1949 // Send left control press.
[email protected]1c649772014-07-18 14:06:121950 {
kpschoedel8226fd152015-05-06 15:48:591951 ui::KeyEvent keyevent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL,
1952 ui::DomCode::CONTROL_LEFT, ui::EF_FINAL,
kpschoedel51d2e322015-08-28 15:29:351953 ui::DomKey::CONTROL, ui::EventTimeForNow());
dcheng24002d02016-04-08 02:42:401954 std::unique_ptr<ui::Event> new_event;
[email protected]1c649772014-07-18 14:06:121955 // Control should NOT be remapped to Alt if EF_FINAL is set.
1956 EXPECT_EQ(ui::EVENT_REWRITE_CONTINUE,
penghuange5df2822017-03-16 22:54:361957 rewriter_->RewriteEvent(keyevent, &new_event));
[email protected]1c649772014-07-18 14:06:121958 EXPECT_FALSE(new_event);
1959 }
[email protected]d13e288992014-05-01 18:00:211960}
[email protected]b2a042f02012-07-19 02:41:381961
[email protected]d13e288992014-05-01 18:00:211962TEST_F(EventRewriterTest, TestRewriteNonNativeEvent) {
1963 // Remap Control to Alt.
penghuange5df2822017-03-16 22:54:361964 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]d13e288992014-05-01 18:00:211965 IntegerPrefMember control;
Blake O'Harea09fa45a2017-10-13 04:19:581966 InitModifierKeyPref(&control, prefs::kLanguageRemapControlKeyTo,
1967 ui::chromeos::ModifierKey::kAltKey);
[email protected]d13e288992014-05-01 18:00:211968
penghuange5df2822017-03-16 22:54:361969 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
[email protected]d13e288992014-05-01 18:00:211970
1971 const int kTouchId = 2;
1972 gfx::Point location(0, 0);
lanwei64725672017-03-16 20:56:051973 ui::TouchEvent press(
1974 ui::ET_TOUCH_PRESSED, location, base::TimeTicks(),
1975 ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, kTouchId));
[email protected]d13e288992014-05-01 18:00:211976 press.set_flags(ui::EF_CONTROL_DOWN);
1977
dcheng24002d02016-04-08 02:42:401978 std::unique_ptr<ui::Event> new_event;
penghuange5df2822017-03-16 22:54:361979 rewriter_->RewriteEvent(press, &new_event);
[email protected]d13e288992014-05-01 18:00:211980 EXPECT_TRUE(new_event);
1981 // Control should be remapped to Alt.
1982 EXPECT_EQ(ui::EF_ALT_DOWN,
1983 new_event->flags() & (ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN));
[email protected]b2a042f02012-07-19 02:41:381984}
[email protected]f7ab9b6042013-10-07 23:27:201985
[email protected]354520b2014-06-21 04:31:011986// Keeps a buffer of handled events.
1987class EventBuffer : public ui::test::TestEventProcessor {
1988 public:
1989 EventBuffer() {}
dchengc97a0282015-01-15 23:04:241990 ~EventBuffer() override {}
[email protected]354520b2014-06-21 04:31:011991
avi3dbcc202017-03-13 02:48:361992 void PopEvents(std::vector<std::unique_ptr<ui::Event>>* events) {
[email protected]354520b2014-06-21 04:31:011993 events->clear();
1994 events->swap(events_);
1995 }
1996
1997 private:
penghuang17134c6c2017-03-23 00:01:071998 // ui::EventSink overrides:
dchengc97a0282015-01-15 23:04:241999 ui::EventDispatchDetails OnEventFromSource(ui::Event* event) override {
moshayedi4e6623012016-03-02 04:53:582000 events_.push_back(ui::Event::Clone(*event));
[email protected]354520b2014-06-21 04:31:012001 return ui::EventDispatchDetails();
2002 }
2003
avi3dbcc202017-03-13 02:48:362004 std::vector<std::unique_ptr<ui::Event>> events_;
[email protected]354520b2014-06-21 04:31:012005
2006 DISALLOW_COPY_AND_ASSIGN(EventBuffer);
2007};
2008
2009// Trivial EventSource that does nothing but send events.
2010class TestEventSource : public ui::EventSource {
2011 public:
2012 explicit TestEventSource(ui::EventProcessor* processor)
2013 : processor_(processor) {}
penghuang17134c6c2017-03-23 00:01:072014 ui::EventSink* GetEventSink() override { return processor_; }
[email protected]354520b2014-06-21 04:31:012015 ui::EventDispatchDetails Send(ui::Event* event) {
penghuang17134c6c2017-03-23 00:01:072016 return SendEventToSink(event);
[email protected]354520b2014-06-21 04:31:012017 }
2018
2019 private:
2020 ui::EventProcessor* processor_;
2021};
2022
[email protected]f7ab9b6042013-10-07 23:27:202023// Tests of event rewriting that depend on the Ash window manager.
James Cook317781a2017-07-18 02:08:062024class EventRewriterAshTest : public ash::AshTestBase {
[email protected]f7ab9b6042013-10-07 23:27:202025 public:
[email protected]d13e288992014-05-01 18:00:212026 EventRewriterAshTest()
[email protected]354520b2014-06-21 04:31:012027 : source_(&buffer_),
yoshiki18898fb2016-11-18 15:59:482028 fake_user_manager_(new chromeos::FakeChromeUserManager),
tengs6a04ecf92014-10-09 19:56:112029 user_manager_enabler_(fake_user_manager_) {}
dchengc97a0282015-01-15 23:04:242030 ~EventRewriterAshTest() override {}
[email protected]f7ab9b6042013-10-07 23:27:202031
[email protected]d13e288992014-05-01 18:00:212032 bool RewriteFunctionKeys(const ui::Event& event,
dcheng24002d02016-04-08 02:42:402033 std::unique_ptr<ui::Event>* rewritten_event) {
[email protected]d13e288992014-05-01 18:00:212034 return rewriter_->RewriteEvent(event, rewritten_event);
[email protected]f7ab9b6042013-10-07 23:27:202035 }
2036
[email protected]354520b2014-06-21 04:31:012037 ui::EventDispatchDetails Send(ui::Event* event) {
2038 return source_.Send(event);
2039 }
2040
kpschoedel8226fd152015-05-06 15:48:592041 void SendKeyEvent(ui::EventType type,
2042 ui::KeyboardCode key_code,
2043 ui::DomCode code,
kpschoedel51d2e322015-08-28 15:29:352044 ui::DomKey key) {
2045 ui::KeyEvent press(type, key_code, code, ui::EF_NONE, key,
kpschoedel8226fd152015-05-06 15:48:592046 ui::EventTimeForNow());
[email protected]354520b2014-06-21 04:31:012047 ui::EventDispatchDetails details = Send(&press);
2048 CHECK(!details.dispatcher_destroyed);
2049 }
2050
kpschoedel8226fd152015-05-06 15:48:592051 void SendActivateStickyKeyPattern(ui::KeyboardCode key_code,
2052 ui::DomCode code,
kpschoedel51d2e322015-08-28 15:29:352053 ui::DomKey key) {
2054 SendKeyEvent(ui::ET_KEY_PRESSED, key_code, code, key);
2055 SendKeyEvent(ui::ET_KEY_RELEASED, key_code, code, key);
[email protected]354520b2014-06-21 04:31:012056 }
2057
[email protected]e2204a702013-10-29 21:58:542058 protected:
maxbogueea16ff412016-10-28 16:35:292059 sync_preferences::TestingPrefServiceSyncable* prefs() { return &prefs_; }
[email protected]354520b2014-06-21 04:31:012060
Blake O'Harea09fa45a2017-10-13 04:19:582061 void InitModifierKeyPref(IntegerPrefMember* int_pref,
2062 const std::string& pref_name,
2063 ui::chromeos::ModifierKey modifierKey) {
2064 int_pref->Init(pref_name, prefs());
2065 int_pref->SetValue(static_cast<int>(modifierKey));
2066 }
2067
avi3dbcc202017-03-13 02:48:362068 void PopEvents(std::vector<std::unique_ptr<ui::Event>>* events) {
2069 buffer_.PopEvents(events);
2070 }
[email protected]354520b2014-06-21 04:31:012071
dchengc97a0282015-01-15 23:04:242072 void SetUp() override {
[email protected]e0047752014-04-09 02:18:362073 AshTestBase::SetUp();
skycb4be5b2017-04-06 17:52:452074 sticky_keys_controller_ = ash::Shell::Get()->sticky_keys_controller();
penghuange5df2822017-03-16 22:54:362075 delegate_ = base::MakeUnique<EventRewriterDelegateImpl>();
2076 delegate_->set_pref_service_for_testing(prefs());
2077 rewriter_ = base::MakeUnique<ui::EventRewriterChromeOS>(
2078 delegate_.get(), sticky_keys_controller_);
[email protected]e0047752014-04-09 02:18:362079 chromeos::Preferences::RegisterProfilePrefs(prefs_.registry());
[email protected]354520b2014-06-21 04:31:012080 source_.AddEventRewriter(rewriter_.get());
2081 sticky_keys_controller_->Enable(true);
[email protected]e0047752014-04-09 02:18:362082 }
2083
dchengc97a0282015-01-15 23:04:242084 void TearDown() override {
[email protected]e0047752014-04-09 02:18:362085 rewriter_.reset();
2086 AshTestBase::TearDown();
2087 }
2088
[email protected]354520b2014-06-21 04:31:012089 protected:
2090 ash::StickyKeysController* sticky_keys_controller_;
[email protected]e2204a702013-10-29 21:58:542091
[email protected]f7ab9b6042013-10-07 23:27:202092 private:
penghuange5df2822017-03-16 22:54:362093 std::unique_ptr<EventRewriterDelegateImpl> delegate_;
2094 std::unique_ptr<ui::EventRewriterChromeOS> rewriter_;
[email protected]f7ab9b6042013-10-07 23:27:202095
[email protected]354520b2014-06-21 04:31:012096 EventBuffer buffer_;
2097 TestEventSource source_;
2098
yoshiki18898fb2016-11-18 15:59:482099 chromeos::FakeChromeUserManager* fake_user_manager_; // Not owned.
[email protected]d13e288992014-05-01 18:00:212100 chromeos::ScopedUserManagerEnabler user_manager_enabler_;
maxbogueea16ff412016-10-28 16:35:292101 sync_preferences::TestingPrefServiceSyncable prefs_;
[email protected]d13e288992014-05-01 18:00:212102
[email protected]f7ab9b6042013-10-07 23:27:202103 DISALLOW_COPY_AND_ASSIGN(EventRewriterAshTest);
2104};
2105
2106TEST_F(EventRewriterAshTest, TopRowKeysAreFunctionKeys) {
dcheng24002d02016-04-08 02:42:402107 std::unique_ptr<aura::Window> window(CreateTestWindowInShellWithId(1));
James Cook55648272017-09-13 23:14:012108 wm::ActivateWindow(window.get());
avi3dbcc202017-03-13 02:48:362109 std::vector<std::unique_ptr<ui::Event>> events;
[email protected]f7ab9b6042013-10-07 23:27:202110
2111 // Create a simulated keypress of F1 targetted at the window.
kpschoedel8226fd152015-05-06 15:48:592112 ui::KeyEvent press_f1(ui::ET_KEY_PRESSED, ui::VKEY_F1, ui::DomCode::F1,
kpschoedel51d2e322015-08-28 15:29:352113 ui::EF_NONE, ui::DomKey::F1, ui::EventTimeForNow());
[email protected]f7ab9b6042013-10-07 23:27:202114
[email protected]e2204a702013-10-29 21:58:542115 // The event should also not be rewritten if the send-function-keys pref is
2116 // additionally set, for both apps v2 and regular windows.
2117 BooleanPrefMember send_function_keys_pref;
[email protected]354520b2014-06-21 04:31:012118 send_function_keys_pref.Init(prefs::kLanguageSendFunctionKeys, prefs());
[email protected]e2204a702013-10-29 21:58:542119 send_function_keys_pref.SetValue(true);
sadrulca0e9992016-07-20 22:55:542120 ui::EventDispatchDetails details = Send(&press_f1);
[email protected]354520b2014-06-21 04:31:012121 ASSERT_FALSE(details.dispatcher_destroyed);
2122 PopEvents(&events);
2123 EXPECT_EQ(1u, events.size());
kpschoedel51d2e322015-08-28 15:29:352124 EXPECT_EQ(
2125 GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_F1,
2126 ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1),
avi3dbcc202017-03-13 02:48:362127 GetKeyEventAsString(*static_cast<ui::KeyEvent*>(events[0].get())));
[email protected]e2204a702013-10-29 21:58:542128
2129 // If the pref isn't set when an event is sent to a regular window, F1 is
2130 // rewritten to the back key.
2131 send_function_keys_pref.SetValue(false);
[email protected]354520b2014-06-21 04:31:012132 details = Send(&press_f1);
2133 ASSERT_FALSE(details.dispatcher_destroyed);
2134 PopEvents(&events);
2135 EXPECT_EQ(1u, events.size());
kpschoedel8226fd152015-05-06 15:48:592136 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_BROWSER_BACK,
2137 ui::DomCode::BROWSER_BACK, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:352138 ui::DomKey::BROWSER_BACK),
avi3dbcc202017-03-13 02:48:362139 GetKeyEventAsString(*static_cast<ui::KeyEvent*>(events[0].get())));
[email protected]f7ab9b6042013-10-07 23:27:202140}
2141
[email protected]7f926752014-01-30 09:16:352142TEST_F(EventRewriterTest, DontRewriteIfNotRewritten) {
xdaie54b1fc22015-06-05 00:59:372143 const int kLeftAndAltFlag = ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN;
[email protected]595079ce2014-07-11 22:25:132144
xdaie54b1fc22015-06-05 00:59:372145 // Test Alt + Left click.
[email protected]595079ce2014-07-11 22:25:132146 {
robert.bradfordb3d800b2015-02-18 18:56:102147 ui::MouseEvent press(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
xdaie54b1fc22015-06-05 00:59:372148 ui::EventTimeForNow(), kLeftAndAltFlag,
[email protected]595079ce2014-07-11 22:25:132149 ui::EF_LEFT_MOUSE_BUTTON);
2150 ui::EventTestApi test_press(&press);
2151 test_press.set_source_device_id(10);
2152 // Sanity check.
2153 EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type());
xdaie54b1fc22015-06-05 00:59:372154 EXPECT_EQ(kLeftAndAltFlag, press.flags());
dcheng24002d02016-04-08 02:42:402155 std::unique_ptr<ui::Event> new_event;
penghuange5df2822017-03-16 22:54:362156 const ui::MouseEvent* result = RewriteMouseButtonEvent(press, &new_event);
[email protected]595079ce2014-07-11 22:25:132157 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & result->flags());
xdaie54b1fc22015-06-05 00:59:372158 EXPECT_FALSE(kLeftAndAltFlag & result->flags());
[email protected]595079ce2014-07-11 22:25:132159 EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, result->changed_button_flags());
2160 }
2161 {
robert.bradfordb3d800b2015-02-18 18:56:102162 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(),
xdaie54b1fc22015-06-05 00:59:372163 ui::EventTimeForNow(), kLeftAndAltFlag,
[email protected]595079ce2014-07-11 22:25:132164 ui::EF_LEFT_MOUSE_BUTTON);
2165 ui::EventTestApi test_release(&release);
2166 test_release.set_source_device_id(10);
dcheng24002d02016-04-08 02:42:402167 std::unique_ptr<ui::Event> new_event;
penghuange5df2822017-03-16 22:54:362168 const ui::MouseEvent* result = RewriteMouseButtonEvent(release, &new_event);
[email protected]595079ce2014-07-11 22:25:132169 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & result->flags());
xdaie54b1fc22015-06-05 00:59:372170 EXPECT_FALSE(kLeftAndAltFlag & result->flags());
[email protected]595079ce2014-07-11 22:25:132171 EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, result->changed_button_flags());
2172 }
[email protected]7f926752014-01-30 09:16:352173
xdaie54b1fc22015-06-05 00:59:372174 // No ALT in frst click.
[email protected]7f926752014-01-30 09:16:352175 {
robert.bradfordb3d800b2015-02-18 18:56:102176 ui::MouseEvent press(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
2177 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
[email protected]595079ce2014-07-11 22:25:132178 ui::EF_LEFT_MOUSE_BUTTON);
2179 ui::EventTestApi test_press(&press);
2180 test_press.set_source_device_id(10);
dcheng24002d02016-04-08 02:42:402181 std::unique_ptr<ui::Event> new_event;
penghuange5df2822017-03-16 22:54:362182 const ui::MouseEvent* result = RewriteMouseButtonEvent(press, &new_event);
[email protected]595079ce2014-07-11 22:25:132183 EXPECT_TRUE(ui::EF_LEFT_MOUSE_BUTTON & result->flags());
2184 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, result->changed_button_flags());
2185 }
2186 {
robert.bradfordb3d800b2015-02-18 18:56:102187 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(),
xdaie54b1fc22015-06-05 00:59:372188 ui::EventTimeForNow(), kLeftAndAltFlag,
[email protected]595079ce2014-07-11 22:25:132189 ui::EF_LEFT_MOUSE_BUTTON);
2190 ui::EventTestApi test_release(&release);
2191 test_release.set_source_device_id(10);
dcheng24002d02016-04-08 02:42:402192 std::unique_ptr<ui::Event> new_event;
penghuange5df2822017-03-16 22:54:362193 const ui::MouseEvent* result = RewriteMouseButtonEvent(release, &new_event);
xdaie54b1fc22015-06-05 00:59:372194 EXPECT_TRUE((ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN) & result->flags());
[email protected]595079ce2014-07-11 22:25:132195 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, result->changed_button_flags());
2196 }
[email protected]7f926752014-01-30 09:16:352197
xdaie54b1fc22015-06-05 00:59:372198 // ALT on different device.
[email protected]7f926752014-01-30 09:16:352199 {
robert.bradfordb3d800b2015-02-18 18:56:102200 ui::MouseEvent press(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
xdaie54b1fc22015-06-05 00:59:372201 ui::EventTimeForNow(), kLeftAndAltFlag,
[email protected]595079ce2014-07-11 22:25:132202 ui::EF_LEFT_MOUSE_BUTTON);
2203 ui::EventTestApi test_press(&press);
2204 test_press.set_source_device_id(11);
dcheng24002d02016-04-08 02:42:402205 std::unique_ptr<ui::Event> new_event;
penghuange5df2822017-03-16 22:54:362206 const ui::MouseEvent* result = RewriteMouseButtonEvent(press, &new_event);
[email protected]595079ce2014-07-11 22:25:132207 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & result->flags());
xdaie54b1fc22015-06-05 00:59:372208 EXPECT_FALSE(kLeftAndAltFlag & result->flags());
[email protected]595079ce2014-07-11 22:25:132209 EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, result->changed_button_flags());
2210 }
2211 {
robert.bradfordb3d800b2015-02-18 18:56:102212 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(),
xdaie54b1fc22015-06-05 00:59:372213 ui::EventTimeForNow(), kLeftAndAltFlag,
[email protected]595079ce2014-07-11 22:25:132214 ui::EF_LEFT_MOUSE_BUTTON);
2215 ui::EventTestApi test_release(&release);
2216 test_release.set_source_device_id(10);
dcheng24002d02016-04-08 02:42:402217 std::unique_ptr<ui::Event> new_event;
penghuange5df2822017-03-16 22:54:362218 const ui::MouseEvent* result = RewriteMouseButtonEvent(release, &new_event);
xdaie54b1fc22015-06-05 00:59:372219 EXPECT_TRUE((ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN) & result->flags());
[email protected]595079ce2014-07-11 22:25:132220 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, result->changed_button_flags());
2221 }
2222 {
robert.bradfordb3d800b2015-02-18 18:56:102223 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(),
xdaie54b1fc22015-06-05 00:59:372224 ui::EventTimeForNow(), kLeftAndAltFlag,
[email protected]595079ce2014-07-11 22:25:132225 ui::EF_LEFT_MOUSE_BUTTON);
2226 ui::EventTestApi test_release(&release);
2227 test_release.set_source_device_id(11);
dcheng24002d02016-04-08 02:42:402228 std::unique_ptr<ui::Event> new_event;
penghuange5df2822017-03-16 22:54:362229 const ui::MouseEvent* result = RewriteMouseButtonEvent(release, &new_event);
[email protected]595079ce2014-07-11 22:25:132230 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & result->flags());
xdaie54b1fc22015-06-05 00:59:372231 EXPECT_FALSE(kLeftAndAltFlag & result->flags());
[email protected]595079ce2014-07-11 22:25:132232 EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, result->changed_button_flags());
2233 }
[email protected]354520b2014-06-21 04:31:012234}
2235
2236TEST_F(EventRewriterAshTest, StickyKeyEventDispatchImpl) {
2237 // Test the actual key event dispatch implementation.
avi3dbcc202017-03-13 02:48:362238 std::vector<std::unique_ptr<ui::Event>> events;
[email protected]354520b2014-06-21 04:31:012239
kpschoedel8226fd152015-05-06 15:48:592240 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:352241 ui::DomKey::CONTROL);
[email protected]354520b2014-06-21 04:31:012242 PopEvents(&events);
2243 EXPECT_EQ(1u, events.size());
2244 EXPECT_EQ(ui::ET_KEY_PRESSED, events[0]->type());
2245 EXPECT_EQ(ui::VKEY_CONTROL,
avi3dbcc202017-03-13 02:48:362246 static_cast<ui::KeyEvent*>(events[0].get())->key_code());
[email protected]354520b2014-06-21 04:31:012247
2248 // Test key press event is correctly modified and modifier release
2249 // event is sent.
kpschoedela281bf12016-01-07 15:08:192250 ui::KeyEvent press(ui::ET_KEY_PRESSED, ui::VKEY_C, ui::DomCode::US_C,
kpschoedel51d2e322015-08-28 15:29:352251 ui::EF_NONE, ui::DomKey::Constant<'c'>::Character,
kpschoedel8226fd152015-05-06 15:48:592252 ui::EventTimeForNow());
[email protected]354520b2014-06-21 04:31:012253 ui::EventDispatchDetails details = Send(&press);
2254 PopEvents(&events);
2255 EXPECT_EQ(2u, events.size());
2256 EXPECT_EQ(ui::ET_KEY_PRESSED, events[0]->type());
avi3dbcc202017-03-13 02:48:362257 EXPECT_EQ(ui::VKEY_C,
2258 static_cast<ui::KeyEvent*>(events[0].get())->key_code());
[email protected]354520b2014-06-21 04:31:012259 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
2260 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type());
2261 EXPECT_EQ(ui::VKEY_CONTROL,
avi3dbcc202017-03-13 02:48:362262 static_cast<ui::KeyEvent*>(events[1].get())->key_code());
[email protected]354520b2014-06-21 04:31:012263
2264 // Test key release event is not modified.
kpschoedela281bf12016-01-07 15:08:192265 ui::KeyEvent release(ui::ET_KEY_RELEASED, ui::VKEY_C, ui::DomCode::US_C,
kpschoedel51d2e322015-08-28 15:29:352266 ui::EF_NONE, ui::DomKey::Constant<'c'>::Character,
kpschoedel8226fd152015-05-06 15:48:592267 ui::EventTimeForNow());
[email protected]354520b2014-06-21 04:31:012268 details = Send(&release);
2269 ASSERT_FALSE(details.dispatcher_destroyed);
2270 PopEvents(&events);
2271 EXPECT_EQ(1u, events.size());
2272 EXPECT_EQ(ui::ET_KEY_RELEASED, events[0]->type());
avi3dbcc202017-03-13 02:48:362273 EXPECT_EQ(ui::VKEY_C,
2274 static_cast<ui::KeyEvent*>(events[0].get())->key_code());
[email protected]354520b2014-06-21 04:31:012275 EXPECT_FALSE(events[0]->flags() & ui::EF_CONTROL_DOWN);
2276}
2277
2278TEST_F(EventRewriterAshTest, MouseEventDispatchImpl) {
avi3dbcc202017-03-13 02:48:362279 std::vector<std::unique_ptr<ui::Event>> events;
[email protected]354520b2014-06-21 04:31:012280
kpschoedel8226fd152015-05-06 15:48:592281 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:352282 ui::DomKey::CONTROL);
[email protected]354520b2014-06-21 04:31:012283 PopEvents(&events);
2284
2285 // Test mouse press event is correctly modified.
2286 gfx::Point location(0, 0);
robert.bradfordb3d800b2015-02-18 18:56:102287 ui::MouseEvent press(ui::ET_MOUSE_PRESSED, location, location,
2288 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
[email protected]354520b2014-06-21 04:31:012289 ui::EF_LEFT_MOUSE_BUTTON);
2290 ui::EventDispatchDetails details = Send(&press);
2291 ASSERT_FALSE(details.dispatcher_destroyed);
2292 PopEvents(&events);
2293 EXPECT_EQ(1u, events.size());
2294 EXPECT_EQ(ui::ET_MOUSE_PRESSED, events[0]->type());
2295 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
2296
2297 // Test mouse release event is correctly modified and modifier release
2298 // event is sent. The mouse event should have the correct DIP location.
robert.bradfordb3d800b2015-02-18 18:56:102299 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, location, location,
2300 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
[email protected]354520b2014-06-21 04:31:012301 ui::EF_LEFT_MOUSE_BUTTON);
2302 details = Send(&release);
2303 ASSERT_FALSE(details.dispatcher_destroyed);
2304 PopEvents(&events);
2305 EXPECT_EQ(2u, events.size());
2306 EXPECT_EQ(ui::ET_MOUSE_RELEASED, events[0]->type());
2307 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
2308 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type());
2309 EXPECT_EQ(ui::VKEY_CONTROL,
avi3dbcc202017-03-13 02:48:362310 static_cast<ui::KeyEvent*>(events[1].get())->key_code());
[email protected]354520b2014-06-21 04:31:012311}
2312
2313TEST_F(EventRewriterAshTest, MouseWheelEventDispatchImpl) {
avi3dbcc202017-03-13 02:48:362314 std::vector<std::unique_ptr<ui::Event>> events;
[email protected]354520b2014-06-21 04:31:012315
2316 // Test positive mouse wheel event is correctly modified and modifier release
2317 // event is sent.
kpschoedel8226fd152015-05-06 15:48:592318 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:352319 ui::DomKey::CONTROL);
[email protected]354520b2014-06-21 04:31:012320 PopEvents(&events);
2321 gfx::Point location(0, 0);
riajiang1c49eca2016-08-30 19:36:532322 ui::MouseWheelEvent positive(
2323 gfx::Vector2d(0, ui::MouseWheelEvent::kWheelDelta), location, location,
2324 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
2325 ui::EF_LEFT_MOUSE_BUTTON);
[email protected]354520b2014-06-21 04:31:012326 ui::EventDispatchDetails details = Send(&positive);
2327 ASSERT_FALSE(details.dispatcher_destroyed);
2328 PopEvents(&events);
2329 EXPECT_EQ(2u, events.size());
2330 EXPECT_TRUE(events[0]->IsMouseWheelEvent());
2331 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
2332 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type());
2333 EXPECT_EQ(ui::VKEY_CONTROL,
avi3dbcc202017-03-13 02:48:362334 static_cast<ui::KeyEvent*>(events[1].get())->key_code());
[email protected]354520b2014-06-21 04:31:012335
2336 // Test negative mouse wheel event is correctly modified and modifier release
2337 // event is sent.
kpschoedel8226fd152015-05-06 15:48:592338 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:352339 ui::DomKey::CONTROL);
[email protected]354520b2014-06-21 04:31:012340 PopEvents(&events);
riajiang1c49eca2016-08-30 19:36:532341 ui::MouseWheelEvent negative(
2342 gfx::Vector2d(0, -ui::MouseWheelEvent::kWheelDelta), location, location,
2343 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
2344 ui::EF_LEFT_MOUSE_BUTTON);
[email protected]354520b2014-06-21 04:31:012345 details = Send(&negative);
2346 ASSERT_FALSE(details.dispatcher_destroyed);
2347 PopEvents(&events);
2348 EXPECT_EQ(2u, events.size());
2349 EXPECT_TRUE(events[0]->IsMouseWheelEvent());
2350 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
2351 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type());
2352 EXPECT_EQ(ui::VKEY_CONTROL,
avi3dbcc202017-03-13 02:48:362353 static_cast<ui::KeyEvent*>(events[1].get())->key_code());
[email protected]354520b2014-06-21 04:31:012354}
2355
afakhry1688ee312016-04-15 16:36:332356// Tests that if modifier keys are remapped, the flags of a mouse wheel event
2357// will be rewritten properly.
2358TEST_F(EventRewriterAshTest, MouseWheelEventModifiersRewritten) {
2359 // Remap Control to Alt.
2360 IntegerPrefMember control;
Blake O'Harea09fa45a2017-10-13 04:19:582361 InitModifierKeyPref(&control, prefs::kLanguageRemapControlKeyTo,
2362 ui::chromeos::ModifierKey::kAltKey);
afakhry1688ee312016-04-15 16:36:332363
2364 // Generate a mouse wheel event that has a CONTROL_DOWN modifier flag and
2365 // expect that it will be rewritten to ALT_DOWN.
avi3dbcc202017-03-13 02:48:362366 std::vector<std::unique_ptr<ui::Event>> events;
afakhry1688ee312016-04-15 16:36:332367 gfx::Point location(0, 0);
riajiang1c49eca2016-08-30 19:36:532368 ui::MouseWheelEvent positive(
2369 gfx::Vector2d(0, ui::MouseWheelEvent::kWheelDelta), location, location,
2370 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON | ui::EF_CONTROL_DOWN,
2371 ui::EF_LEFT_MOUSE_BUTTON);
afakhry1688ee312016-04-15 16:36:332372 ui::EventDispatchDetails details = Send(&positive);
2373 ASSERT_FALSE(details.dispatcher_destroyed);
2374 PopEvents(&events);
2375 EXPECT_EQ(1u, events.size());
2376 EXPECT_TRUE(events[0]->IsMouseWheelEvent());
2377 EXPECT_FALSE(events[0]->flags() & ui::EF_CONTROL_DOWN);
2378 EXPECT_TRUE(events[0]->flags() & ui::EF_ALT_DOWN);
2379}
2380
[email protected]354520b2014-06-21 04:31:012381class StickyKeysOverlayTest : public EventRewriterAshTest {
2382 public:
2383 StickyKeysOverlayTest() : overlay_(NULL) {}
2384
dchengc97a0282015-01-15 23:04:242385 ~StickyKeysOverlayTest() override {}
[email protected]354520b2014-06-21 04:31:012386
dchengc97a0282015-01-15 23:04:242387 void SetUp() override {
[email protected]354520b2014-06-21 04:31:012388 EventRewriterAshTest::SetUp();
2389 overlay_ = sticky_keys_controller_->GetOverlayForTest();
2390 ASSERT_TRUE(overlay_);
2391 }
2392
2393 ash::StickyKeysOverlay* overlay_;
2394};
2395
2396TEST_F(StickyKeysOverlayTest, OneModifierEnabled) {
2397 EXPECT_FALSE(overlay_->is_visible());
2398 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2399 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2400
2401 // Pressing modifier key should show overlay.
kpschoedel8226fd152015-05-06 15:48:592402 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:352403 ui::DomKey::CONTROL);
[email protected]354520b2014-06-21 04:31:012404 EXPECT_TRUE(overlay_->is_visible());
2405 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED,
2406 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2407
2408 // Pressing a normal key should hide overlay.
kpschoedela281bf12016-01-07 15:08:192409 SendActivateStickyKeyPattern(ui::VKEY_T, ui::DomCode::US_T,
kpschoedel51d2e322015-08-28 15:29:352410 ui::DomKey::Constant<'t'>::Character);
[email protected]354520b2014-06-21 04:31:012411 EXPECT_FALSE(overlay_->is_visible());
2412 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2413 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2414}
2415
2416TEST_F(StickyKeysOverlayTest, TwoModifiersEnabled) {
2417 EXPECT_FALSE(overlay_->is_visible());
2418 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2419 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2420 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2421 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
2422
2423 // Pressing two modifiers should show overlay.
kpschoedel8226fd152015-05-06 15:48:592424 SendActivateStickyKeyPattern(ui::VKEY_SHIFT, ui::DomCode::SHIFT_LEFT,
kpschoedel51d2e322015-08-28 15:29:352425 ui::DomKey::SHIFT);
kpschoedel8226fd152015-05-06 15:48:592426 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:352427 ui::DomKey::CONTROL);
[email protected]354520b2014-06-21 04:31:012428 EXPECT_TRUE(overlay_->is_visible());
2429 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED,
2430 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
2431 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED,
2432 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2433
2434 // Pressing a normal key should hide overlay.
kpschoedela281bf12016-01-07 15:08:192435 SendActivateStickyKeyPattern(ui::VKEY_N, ui::DomCode::US_N,
kpschoedel51d2e322015-08-28 15:29:352436 ui::DomKey::Constant<'n'>::Character);
[email protected]354520b2014-06-21 04:31:012437 EXPECT_FALSE(overlay_->is_visible());
2438 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2439 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2440 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2441 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
2442}
2443
2444TEST_F(StickyKeysOverlayTest, LockedModifier) {
2445 EXPECT_FALSE(overlay_->is_visible());
2446 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2447 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
2448
2449 // Pressing a modifier key twice should lock modifier and show overlay.
kpschoedel8226fd152015-05-06 15:48:592450 SendActivateStickyKeyPattern(ui::VKEY_LMENU, ui::DomCode::ALT_LEFT,
kpschoedel51d2e322015-08-28 15:29:352451 ui::DomKey::ALT);
kpschoedel8226fd152015-05-06 15:48:592452 SendActivateStickyKeyPattern(ui::VKEY_LMENU, ui::DomCode::ALT_LEFT,
kpschoedel51d2e322015-08-28 15:29:352453 ui::DomKey::ALT);
[email protected]354520b2014-06-21 04:31:012454 EXPECT_TRUE(overlay_->is_visible());
2455 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED,
2456 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
2457
2458 // Pressing a normal key should not hide overlay.
kpschoedela281bf12016-01-07 15:08:192459 SendActivateStickyKeyPattern(ui::VKEY_D, ui::DomCode::US_D,
kpschoedel51d2e322015-08-28 15:29:352460 ui::DomKey::Constant<'d'>::Character);
[email protected]354520b2014-06-21 04:31:012461 EXPECT_TRUE(overlay_->is_visible());
2462 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED,
2463 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
2464}
2465
2466TEST_F(StickyKeysOverlayTest, LockedAndNormalModifier) {
2467 EXPECT_FALSE(overlay_->is_visible());
2468 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2469 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2470 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2471 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
2472
2473 // Pressing a modifier key twice should lock modifier and show overlay.
kpschoedel8226fd152015-05-06 15:48:592474 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:352475 ui::DomKey::CONTROL);
kpschoedel8226fd152015-05-06 15:48:592476 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:352477 ui::DomKey::CONTROL);
[email protected]354520b2014-06-21 04:31:012478 EXPECT_TRUE(overlay_->is_visible());
2479 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED,
2480 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2481
2482 // Pressing another modifier key should still show overlay.
kpschoedel8226fd152015-05-06 15:48:592483 SendActivateStickyKeyPattern(ui::VKEY_SHIFT, ui::DomCode::SHIFT_LEFT,
kpschoedel51d2e322015-08-28 15:29:352484 ui::DomKey::SHIFT);
[email protected]354520b2014-06-21 04:31:012485 EXPECT_TRUE(overlay_->is_visible());
2486 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED,
2487 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2488 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED,
2489 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
2490
2491 // Pressing a normal key should not hide overlay but disable normal modifier.
kpschoedela281bf12016-01-07 15:08:192492 SendActivateStickyKeyPattern(ui::VKEY_D, ui::DomCode::US_D,
kpschoedel51d2e322015-08-28 15:29:352493 ui::DomKey::Constant<'d'>::Character);
[email protected]354520b2014-06-21 04:31:012494 EXPECT_TRUE(overlay_->is_visible());
2495 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED,
2496 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2497 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2498 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
2499}
2500
2501TEST_F(StickyKeysOverlayTest, ModifiersDisabled) {
2502 EXPECT_FALSE(overlay_->is_visible());
2503 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2504 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2505 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2506 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
2507 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2508 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
tengs6a04ecf92014-10-09 19:56:112509 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2510 overlay_->GetModifierKeyState(ui::EF_COMMAND_DOWN));
[email protected]354520b2014-06-21 04:31:012511
2512 // Enable modifiers.
kpschoedel8226fd152015-05-06 15:48:592513 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:352514 ui::DomKey::CONTROL);
kpschoedel8226fd152015-05-06 15:48:592515 SendActivateStickyKeyPattern(ui::VKEY_SHIFT, ui::DomCode::SHIFT_LEFT,
kpschoedel51d2e322015-08-28 15:29:352516 ui::DomKey::SHIFT);
kpschoedel8226fd152015-05-06 15:48:592517 SendActivateStickyKeyPattern(ui::VKEY_SHIFT, ui::DomCode::SHIFT_LEFT,
kpschoedel51d2e322015-08-28 15:29:352518 ui::DomKey::SHIFT);
kpschoedel8226fd152015-05-06 15:48:592519 SendActivateStickyKeyPattern(ui::VKEY_LMENU, ui::DomCode::ALT_LEFT,
kpschoedel51d2e322015-08-28 15:29:352520 ui::DomKey::ALT);
dtapuskaaf863af2016-04-21 14:33:592521 SendActivateStickyKeyPattern(ui::VKEY_COMMAND, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:132522 ui::DomKey::META);
dtapuskaaf863af2016-04-21 14:33:592523 SendActivateStickyKeyPattern(ui::VKEY_COMMAND, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:132524 ui::DomKey::META);
[email protected]354520b2014-06-21 04:31:012525
2526 EXPECT_TRUE(overlay_->is_visible());
2527 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED,
2528 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2529 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED,
2530 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
2531 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED,
2532 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
tengs6a04ecf92014-10-09 19:56:112533 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED,
2534 overlay_->GetModifierKeyState(ui::EF_COMMAND_DOWN));
[email protected]354520b2014-06-21 04:31:012535
2536 // Disable modifiers and overlay should be hidden.
kpschoedel8226fd152015-05-06 15:48:592537 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:352538 ui::DomKey::CONTROL);
kpschoedel8226fd152015-05-06 15:48:592539 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:352540 ui::DomKey::CONTROL);
kpschoedel8226fd152015-05-06 15:48:592541 SendActivateStickyKeyPattern(ui::VKEY_SHIFT, ui::DomCode::SHIFT_LEFT,
kpschoedel51d2e322015-08-28 15:29:352542 ui::DomKey::SHIFT);
kpschoedel8226fd152015-05-06 15:48:592543 SendActivateStickyKeyPattern(ui::VKEY_LMENU, ui::DomCode::ALT_LEFT,
kpschoedel51d2e322015-08-28 15:29:352544 ui::DomKey::ALT);
kpschoedel8226fd152015-05-06 15:48:592545 SendActivateStickyKeyPattern(ui::VKEY_LMENU, ui::DomCode::ALT_LEFT,
kpschoedel51d2e322015-08-28 15:29:352546 ui::DomKey::ALT);
dtapuskaaf863af2016-04-21 14:33:592547 SendActivateStickyKeyPattern(ui::VKEY_COMMAND, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:132548 ui::DomKey::META);
[email protected]354520b2014-06-21 04:31:012549
2550 EXPECT_FALSE(overlay_->is_visible());
2551 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2552 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2553 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2554 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
2555 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2556 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
tengs6a04ecf92014-10-09 19:56:112557 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2558 overlay_->GetModifierKeyState(ui::EF_COMMAND_DOWN));
[email protected]354520b2014-06-21 04:31:012559}
2560
2561TEST_F(StickyKeysOverlayTest, ModifierVisibility) {
2562 // All but AltGr and Mod3 should initially be visible.
2563 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_CONTROL_DOWN));
2564 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_SHIFT_DOWN));
2565 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_ALT_DOWN));
tengs6a04ecf92014-10-09 19:56:112566 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_COMMAND_DOWN));
[email protected]354520b2014-06-21 04:31:012567 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
2568 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));
2569
2570 // Turn all modifiers on.
2571 sticky_keys_controller_->SetModifiersEnabled(true, true);
2572 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_CONTROL_DOWN));
2573 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_SHIFT_DOWN));
2574 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_ALT_DOWN));
tengs6a04ecf92014-10-09 19:56:112575 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_COMMAND_DOWN));
[email protected]354520b2014-06-21 04:31:012576 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
2577 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));
2578
2579 // Turn off Mod3.
2580 sticky_keys_controller_->SetModifiersEnabled(false, true);
2581 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
2582 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));
2583
2584 // Turn off AltGr.
2585 sticky_keys_controller_->SetModifiersEnabled(true, false);
2586 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
2587 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));
2588
2589 // Turn off AltGr and Mod3.
2590 sticky_keys_controller_->SetModifiersEnabled(false, false);
2591 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
2592 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));
[email protected]7f926752014-01-30 09:16:352593}
2594
[email protected]9d6182f2014-02-16 04:21:562595} // namespace chromeos