blob: c7b1d1a438b7ffdee990259125b9c16865f3fadd [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]ac8df2f2012-11-01 21:26:3610#include "base/command_line.h"
avi8a07d53892015-12-24 22:13:5311#include "base/macros.h"
avi3dbcc202017-03-13 02:48:3612#include "base/memory/ptr_util.h"
[email protected]b54c2532013-06-12 00:17:4813#include "base/strings/stringprintf.h"
penghuange5df2822017-03-16 22:54:3614#include "chrome/browser/chromeos/events/event_rewriter_delegate_impl.h"
[email protected]c02a4242012-12-11 18:36:3215#include "chrome/browser/chromeos/input_method/input_method_configuration.h"
azurewei045de382017-01-06 02:06:0016#include "chrome/browser/chromeos/input_method/mock_input_method_manager_impl.h"
yoshiki18898fb2016-11-18 15:59:4817#include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
[email protected]350c9232012-05-25 04:16:0618#include "chrome/browser/chromeos/preferences.h"
[email protected]9d6182f2014-02-16 04:21:5619#include "chrome/common/pref_names.h"
Scott Violet6ac56412018-12-19 17:25:5020#include "chrome/test/base/chrome_ash_test_base.h"
Steven Bennetts38e9bde22019-01-03 17:31:1021#include "chromeos/constants/chromeos_switches.h"
brettwb1fc1b82016-02-02 00:19:0822#include "components/prefs/pref_member.h"
maxbogueea16ff412016-10-28 16:35:2923#include "components/sync_preferences/testing_pref_service_syncable.h"
Xiyuan Xiadfe3a9f2017-11-13 21:46:2624#include "components/user_manager/scoped_user_manager.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"
Ahmed Fakhry719548c2018-10-15 23:47:1932#include "ui/events/devices/device_data_manager.h"
[email protected]9d6182f2014-02-16 04:21:5633#include "ui/events/event.h"
[email protected]d13e288992014-05-01 18:00:2134#include "ui/events/event_rewriter.h"
robert.bradfordb3d800b2015-02-18 18:56:1035#include "ui/events/event_utils.h"
kpschoedel3b0960a2015-05-11 17:52:1136#include "ui/events/keycodes/dom/dom_code.h"
37#include "ui/events/keycodes/dom/dom_key.h"
38#include "ui/events/keycodes/dom/keycode_converter.h"
[email protected]595079ce2014-07-11 22:25:1339#include "ui/events/test/events_test_utils.h"
[email protected]354520b2014-06-21 04:31:0140#include "ui/events/test/test_event_processor.h"
James Cook55648272017-09-13 23:14:0141#include "ui/wm/core/window_util.h"
[email protected]354520b2014-06-21 04:31:0142
[email protected]9822df92012-03-31 03:52:5643namespace {
44
kylechar0166bdb2017-08-10 05:15:0545constexpr int kKeyboardDeviceId = 123;
[email protected]354520b2014-06-21 04:31:0146
kpschoedel8226fd152015-05-06 15:48:5947std::string GetExpectedResultAsString(ui::EventType ui_type,
48 ui::KeyboardCode ui_keycode,
49 ui::DomCode code,
50 int ui_flags, // ui::EventFlags
kpschoedel51d2e322015-08-28 15:29:3551 ui::DomKey key) {
kpschoedel02c854d2015-06-16 14:44:2952 return base::StringPrintf(
kpschoedel51d2e322015-08-28 15:29:3553 "type=%d code=0x%06X flags=0x%X vk=0x%02X key=0x%08X", ui_type,
kpschoedel02c854d2015-06-16 14:44:2954 static_cast<unsigned int>(code), ui_flags & ~ui::EF_IS_REPEAT, ui_keycode,
kpschoedel51d2e322015-08-28 15:29:3555 static_cast<unsigned int>(key));
[email protected]106cf972014-05-28 17:28:1756}
57
58std::string GetKeyEventAsString(const ui::KeyEvent& keyevent) {
kpschoedel51d2e322015-08-28 15:29:3559 return GetExpectedResultAsString(keyevent.type(), keyevent.key_code(),
60 keyevent.code(), keyevent.flags(),
61 keyevent.GetDomKey());
[email protected]d13e288992014-05-01 18:00:2162}
63
penghuange5df2822017-03-16 22:54:3664std::string GetRewrittenEventAsString(
65 const std::unique_ptr<ui::EventRewriterChromeOS>& rewriter,
66 ui::EventType ui_type,
67 ui::KeyboardCode ui_keycode,
68 ui::DomCode code,
69 int ui_flags, // ui::EventFlags
Ahmed Fakhry629985b2018-07-30 20:57:3270 ui::DomKey key,
71 int device_id = kKeyboardDeviceId) {
Dmitry Torokhov0bcc3cf2017-07-15 17:50:3072 ui::KeyEvent event(ui_type, ui_keycode, code, ui_flags, key,
73 ui::EventTimeForNow());
Ahmed Fakhry629985b2018-07-30 20:57:3274 event.set_source_device_id(device_id);
dcheng24002d02016-04-08 02:42:4075 std::unique_ptr<ui::Event> new_event;
[email protected]d13e288992014-05-01 18:00:2176 rewriter->RewriteEvent(event, &new_event);
77 if (new_event)
moshayedi4e6623012016-03-02 04:53:5878 return GetKeyEventAsString(*new_event->AsKeyEvent());
[email protected]d13e288992014-05-01 18:00:2179 return GetKeyEventAsString(event);
[email protected]350c9232012-05-25 04:16:0680}
81
[email protected]106cf972014-05-28 17:28:1782// Table entry for simple single key event rewriting tests.
83struct KeyTestCase {
[email protected]106cf972014-05-28 17:28:1784 ui::EventType type;
kpschoedel8226fd152015-05-06 15:48:5985 struct Event {
[email protected]106cf972014-05-28 17:28:1786 ui::KeyboardCode key_code;
kpschoedel8226fd152015-05-06 15:48:5987 ui::DomCode code;
88 int flags; // ui::EventFlags
kpschoedel51d2e322015-08-28 15:29:3589 ui::DomKey::Base key;
[email protected]106cf972014-05-28 17:28:1790 } input, expected;
Ahmed Fakhry629985b2018-07-30 20:57:3291 int device_id = kKeyboardDeviceId;
[email protected]106cf972014-05-28 17:28:1792};
[email protected]d13e288992014-05-01 18:00:2193
kpschoedel8226fd152015-05-06 15:48:5994std::string GetTestCaseAsString(ui::EventType ui_type,
95 const KeyTestCase::Event& test) {
96 return GetExpectedResultAsString(ui_type, test.key_code, test.code,
kpschoedel51d2e322015-08-28 15:29:3597 test.flags, test.key);
kpschoedel8226fd152015-05-06 15:48:5998}
99
[email protected]106cf972014-05-28 17:28:17100// Tests a single stateless key rewrite operation.
penghuange5df2822017-03-16 22:54:36101void CheckKeyTestCase(
102 const std::unique_ptr<ui::EventRewriterChromeOS>& rewriter,
103 const KeyTestCase& test) {
kpschoedel02c854d2015-06-16 14:44:29104 SCOPED_TRACE("\nSource: " + GetTestCaseAsString(test.type, test.input));
kpschoedel8226fd152015-05-06 15:48:59105 std::string expected = GetTestCaseAsString(test.type, test.expected);
Ahmed Fakhry629985b2018-07-30 20:57:32106 EXPECT_EQ(expected,
107 GetRewrittenEventAsString(rewriter, test.type, test.input.key_code,
108 test.input.code, test.input.flags,
109 test.input.key, test.device_id));
[email protected]36552d52014-06-06 18:52:03110}
111
[email protected]7f926752014-01-30 09:16:35112} // namespace
113
[email protected]9d6182f2014-02-16 04:21:56114namespace chromeos {
115
Scott Violet6ac56412018-12-19 17:25:50116class EventRewriterTest : public ChromeAshTestBase {
[email protected]350c9232012-05-25 04:16:06117 public:
[email protected]b9d224c2012-07-13 01:09:03118 EventRewriterTest()
yoshiki18898fb2016-11-18 15:59:48119 : fake_user_manager_(new chromeos::FakeChromeUserManager),
Xiyuan Xiadfe3a9f2017-11-13 21:46:26120 user_manager_enabler_(base::WrapUnique(fake_user_manager_)) {}
dchengc97a0282015-01-15 23:04:24121 ~EventRewriterTest() override {}
[email protected]59409342012-09-21 01:03:43122
dchengc97a0282015-01-15 23:04:24123 void SetUp() override {
azurewei045de382017-01-06 02:06:00124 input_method_manager_mock_ = new input_method::MockInputMethodManagerImpl;
[email protected]c02a4242012-12-11 18:36:32125 chromeos::input_method::InitializeForTesting(
[email protected]59409342012-09-21 01:03:43126 input_method_manager_mock_); // pass ownership
Yuki Awanoce4c62d32018-06-28 00:36:36127 delegate_ = std::make_unique<EventRewriterDelegateImpl>(nullptr);
penghuange5df2822017-03-16 22:54:36128 delegate_->set_pref_service_for_testing(prefs());
129 rewriter_ =
Jinho Bang341ce5b02018-01-17 22:46:03130 std::make_unique<ui::EventRewriterChromeOS>(delegate_.get(), nullptr);
Scott Violet6ac56412018-12-19 17:25:50131 ChromeAshTestBase::SetUp();
[email protected]59409342012-09-21 01:03:43132 }
133
dchengc97a0282015-01-15 23:04:24134 void TearDown() override {
Scott Violet6ac56412018-12-19 17:25:50135 ChromeAshTestBase::TearDown();
[email protected]59409342012-09-21 01:03:43136 // Shutdown() deletes the IME mock object.
[email protected]c02a4242012-12-11 18:36:32137 chromeos::input_method::Shutdown();
[email protected]18fdab02012-06-25 17:04:53138 }
[email protected]350c9232012-05-25 04:16:06139
140 protected:
[email protected]25ab8f12013-02-01 14:30:15141 void TestRewriteNumPadKeys();
142 void TestRewriteNumPadKeysOnAppleKeyboard();
143
[email protected]595079ce2014-07-11 22:25:13144 const ui::MouseEvent* RewriteMouseButtonEvent(
[email protected]595079ce2014-07-11 22:25:13145 const ui::MouseEvent& event,
dcheng24002d02016-04-08 02:42:40146 std::unique_ptr<ui::Event>* new_event) {
penghuange5df2822017-03-16 22:54:36147 rewriter_->RewriteMouseButtonEventForTesting(event, new_event);
moshayedi4e6623012016-03-02 04:53:58148 return *new_event ? new_event->get()->AsMouseEvent() : &event;
[email protected]7f926752014-01-30 09:16:35149 }
150
penghuange5df2822017-03-16 22:54:36151 sync_preferences::TestingPrefServiceSyncable* prefs() { return &prefs_; }
152
Blake O'Harea09fa45a2017-10-13 04:19:58153 void InitModifierKeyPref(IntegerPrefMember* int_pref,
154 const std::string& pref_name,
155 ui::chromeos::ModifierKey modifierKey) {
156 if (int_pref->GetPrefName() != pref_name) // skip if already initialized.
157 int_pref->Init(pref_name, prefs());
158 int_pref->SetValue(static_cast<int>(modifierKey));
159 }
160
azurewei045de382017-01-06 02:06:00161 FakeChromeUserManager* fake_user_manager_; // Not owned.
Xiyuan Xiadfe3a9f2017-11-13 21:46:26162 user_manager::ScopedUserManager user_manager_enabler_;
azurewei045de382017-01-06 02:06:00163 input_method::MockInputMethodManagerImpl* input_method_manager_mock_;
penghuange5df2822017-03-16 22:54:36164
165 sync_preferences::TestingPrefServiceSyncable prefs_;
166 std::unique_ptr<EventRewriterDelegateImpl> delegate_;
167 std::unique_ptr<ui::EventRewriterChromeOS> rewriter_;
[email protected]350c9232012-05-25 04:16:06168};
169
[email protected]b9d224c2012-07-13 01:09:03170TEST_F(EventRewriterTest, TestRewriteCommandToControl) {
[email protected]9822df92012-03-31 03:52:56171 // First, test with a PC keyboard.
penghuange5df2822017-03-16 22:54:36172 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
173 rewriter_->set_last_keyboard_device_id_for_testing(kKeyboardDeviceId);
[email protected]350c9232012-05-25 04:16:06174
[email protected]106cf972014-05-28 17:28:17175 KeyTestCase pc_keyboard_tests[] = {
176 // VKEY_A, Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29177 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19178 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN,
kpschoedel51d2e322015-08-28 15:29:35179 ui::DomKey::UNIDENTIFIED},
kpschoedela281bf12016-01-07 15:08:19180 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN,
kpschoedel51d2e322015-08-28 15:29:35181 ui::DomKey::UNIDENTIFIED}},
[email protected]d13e288992014-05-01 18:00:21182
[email protected]106cf972014-05-28 17:28:17183 // VKEY_A, Win modifier.
kpschoedel02c854d2015-06-16 14:44:29184 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19185 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:35186 ui::DomKey::UNIDENTIFIED},
kpschoedela281bf12016-01-07 15:08:19187 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:35188 ui::DomKey::UNIDENTIFIED}},
[email protected]d13e288992014-05-01 18:00:21189
[email protected]106cf972014-05-28 17:28:17190 // VKEY_A, Alt+Win modifier.
kpschoedel02c854d2015-06-16 14:44:29191 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19192 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:35193 ui::DomKey::UNIDENTIFIED},
kpschoedela281bf12016-01-07 15:08:19194 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:35195 ui::DomKey::UNIDENTIFIED}},
[email protected]350c9232012-05-25 04:16:06196
[email protected]106cf972014-05-28 17:28:17197 // VKEY_LWIN (left Windows key), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29198 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59199 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:13200 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, ui::DomKey::META},
dtapuskaaf863af2016-04-21 14:33:59201 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:13202 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, ui::DomKey::META}},
[email protected]350c9232012-05-25 04:16:06203
[email protected]106cf972014-05-28 17:28:17204 // VKEY_RWIN (right Windows key), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29205 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59206 {ui::VKEY_RWIN, ui::DomCode::META_RIGHT,
kpschoedel0a8b03052016-02-17 15:35:13207 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, ui::DomKey::META},
dtapuskaaf863af2016-04-21 14:33:59208 {ui::VKEY_RWIN, ui::DomCode::META_RIGHT,
kpschoedel0a8b03052016-02-17 15:35:13209 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, ui::DomKey::META}},
[email protected]106cf972014-05-28 17:28:17210 };
211
penghuange5df2822017-03-16 22:54:36212 for (const auto& test : pc_keyboard_tests)
213 CheckKeyTestCase(rewriter_, test);
[email protected]9822df92012-03-31 03:52:56214
[email protected]216d9162012-06-22 01:48:16215 // An Apple keyboard reusing the ID, zero.
penghuange5df2822017-03-16 22:54:36216 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "Apple Keyboard");
217 rewriter_->set_last_keyboard_device_id_for_testing(kKeyboardDeviceId);
[email protected]350c9232012-05-25 04:16:06218
Ahmed Fakhry629985b2018-07-30 20:57:32219 // Simulate the default initialization of the Apple Command key remap pref to
220 // Ctrl.
221 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
222
[email protected]106cf972014-05-28 17:28:17223 KeyTestCase apple_keyboard_tests[] = {
224 // VKEY_A, Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29225 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19226 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN,
kpschoedel51d2e322015-08-28 15:29:35227 ui::DomKey::UNIDENTIFIED},
kpschoedela281bf12016-01-07 15:08:19228 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN,
kpschoedel51d2e322015-08-28 15:29:35229 ui::DomKey::UNIDENTIFIED}},
[email protected]350c9232012-05-25 04:16:06230
[email protected]106cf972014-05-28 17:28:17231 // VKEY_A, Win modifier.
kpschoedel02c854d2015-06-16 14:44:29232 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19233 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:35234 ui::DomKey::UNIDENTIFIED},
kpschoedela281bf12016-01-07 15:08:19235 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:53236 ui::DomKey::Constant<'a'>::Character}},
[email protected]350c9232012-05-25 04:16:06237
[email protected]106cf972014-05-28 17:28:17238 // VKEY_A, Alt+Win modifier.
kpschoedel02c854d2015-06-16 14:44:29239 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19240 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:35241 ui::DomKey::UNIDENTIFIED},
kpschoedela281bf12016-01-07 15:08:19242 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:53243 ui::DomKey::Constant<'a'>::Character}},
[email protected]350c9232012-05-25 04:16:06244
[email protected]106cf972014-05-28 17:28:17245 // VKEY_LWIN (left Windows key), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29246 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59247 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:13248 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:35249 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
250 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::CONTROL}},
[email protected]350c9232012-05-25 04:16:06251
[email protected]106cf972014-05-28 17:28:17252 // VKEY_RWIN (right Windows key), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29253 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59254 {ui::VKEY_RWIN, ui::DomCode::META_RIGHT,
kpschoedel0a8b03052016-02-17 15:35:13255 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:35256 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_RIGHT,
257 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::CONTROL}},
[email protected]106cf972014-05-28 17:28:17258 };
259
penghuange5df2822017-03-16 22:54:36260 for (const auto& test : apple_keyboard_tests)
261 CheckKeyTestCase(rewriter_, test);
Ahmed Fakhry629985b2018-07-30 20:57:32262
263 // Now simulate the user remapped the Command key back to Search.
264 IntegerPrefMember command;
265 InitModifierKeyPref(&command, prefs::kLanguageRemapExternalCommandKeyTo,
266 ui::chromeos::ModifierKey::kSearchKey);
267
268 KeyTestCase command_remapped_to_search_tests[] = {
269 // VKEY_A, Win modifier.
270 {ui::ET_KEY_PRESSED,
271 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_COMMAND_DOWN,
272 ui::DomKey::UNIDENTIFIED},
273 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_COMMAND_DOWN,
274 ui::DomKey::UNIDENTIFIED}},
275
276 // VKEY_A, Alt+Win modifier.
277 {ui::ET_KEY_PRESSED,
278 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
279 ui::DomKey::UNIDENTIFIED},
280 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
281 ui::DomKey::UNIDENTIFIED}},
282
283 // VKEY_LWIN (left Windows key), Alt modifier.
284 {ui::ET_KEY_PRESSED,
285 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
286 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
287 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
288 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META}},
289
290 // VKEY_RWIN (right Windows key), Alt modifier.
291 {ui::ET_KEY_PRESSED,
292 {ui::VKEY_RWIN, ui::DomCode::META_RIGHT,
293 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
294 {ui::VKEY_LWIN, ui::DomCode::META_RIGHT,
295 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META}},
296 };
297
298 for (const auto& test : command_remapped_to_search_tests)
299 CheckKeyTestCase(rewriter_, test);
300}
301
302TEST_F(EventRewriterTest, TestRewriteExternalMetaKey) {
303 // Simulate the default initialization of the Meta key on external keyboards
304 // remap pref to Search.
305 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
306
307 // Add an internal and external keyboards.
308 rewriter_->KeyboardDeviceAddedForTesting(
309 kKeyboardDeviceId, "Internal Keyboard",
310 ui::EventRewriterChromeOS::kKbdTopRowLayoutDefault,
311 ui::INPUT_DEVICE_INTERNAL);
312 rewriter_->KeyboardDeviceAddedForTesting(
313 kKeyboardDeviceId + 1, "External Keyboard",
Xiaoqian Dai45fbc042018-09-25 21:00:55314 ui::EventRewriterChromeOS::kKbdTopRowLayoutDefault, ui::INPUT_DEVICE_USB);
Ahmed Fakhry629985b2018-07-30 20:57:32315
316 // The Meta key on both external and internal keyboards should produce Search.
317
318 // Test internal keyboard.
319 rewriter_->set_last_keyboard_device_id_for_testing(kKeyboardDeviceId);
320 KeyTestCase default_internal_search_tests[] = {
321 // VKEY_A, Win modifier.
322 {ui::ET_KEY_PRESSED,
323 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_COMMAND_DOWN,
324 ui::DomKey::UNIDENTIFIED},
325 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_COMMAND_DOWN,
326 ui::DomKey::UNIDENTIFIED},
327 kKeyboardDeviceId},
328
329 // VKEY_A, Alt+Win modifier.
330 {ui::ET_KEY_PRESSED,
331 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
332 ui::DomKey::UNIDENTIFIED},
333 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
334 ui::DomKey::UNIDENTIFIED},
335 kKeyboardDeviceId},
336
337 // VKEY_LWIN (left Windows key), Alt modifier.
338 {ui::ET_KEY_PRESSED,
339 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
340 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
341 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
342 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
343 kKeyboardDeviceId},
344
345 // VKEY_RWIN (right Windows key), Alt modifier.
346 {ui::ET_KEY_PRESSED,
347 {ui::VKEY_RWIN, ui::DomCode::META_RIGHT,
348 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
349 {ui::VKEY_LWIN, ui::DomCode::META_RIGHT,
350 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
351 kKeyboardDeviceId},
352 };
353 for (const auto& test : default_internal_search_tests)
354 CheckKeyTestCase(rewriter_, test);
355
356 // Test external Keyboard.
357 KeyTestCase default_external_meta_tests[] = {
358 // VKEY_A, Win modifier.
359 {ui::ET_KEY_PRESSED,
360 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_COMMAND_DOWN,
361 ui::DomKey::UNIDENTIFIED},
362 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_COMMAND_DOWN,
363 ui::DomKey::UNIDENTIFIED},
364 kKeyboardDeviceId + 1},
365
366 // VKEY_A, Alt+Win modifier.
367 {ui::ET_KEY_PRESSED,
368 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
369 ui::DomKey::UNIDENTIFIED},
370 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
371 ui::DomKey::UNIDENTIFIED},
372 kKeyboardDeviceId + 1},
373
374 // VKEY_LWIN (left Windows key), Alt modifier.
375 {ui::ET_KEY_PRESSED,
376 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
377 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
378 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
379 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
380 kKeyboardDeviceId + 1},
381
382 // VKEY_RWIN (right Windows key), Alt modifier.
383 {ui::ET_KEY_PRESSED,
384 {ui::VKEY_RWIN, ui::DomCode::META_RIGHT,
385 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
386 {ui::VKEY_LWIN, ui::DomCode::META_RIGHT,
387 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
388 kKeyboardDeviceId + 1},
389 };
390 rewriter_->set_last_keyboard_device_id_for_testing(kKeyboardDeviceId + 1);
391 for (const auto& test : default_external_meta_tests)
392 CheckKeyTestCase(rewriter_, test);
393
394 // Both preferences for internal Search and external Meta are independent,
395 // even if one or both are modified.
396
397 // Remap internal Search to Ctrl.
398 IntegerPrefMember internal_search;
399 InitModifierKeyPref(&internal_search, prefs::kLanguageRemapSearchKeyTo,
400 ui::chromeos::ModifierKey::kControlKey);
401
402 // Remap external Search to Alt.
403 IntegerPrefMember meta;
404 InitModifierKeyPref(&meta, prefs::kLanguageRemapExternalMetaKeyTo,
405 ui::chromeos::ModifierKey::kAltKey);
406
407 // Test internal keyboard.
408 KeyTestCase remapped_internal_search_tests[] = {
409 // VKEY_A, Win modifier.
410 {ui::ET_KEY_PRESSED,
411 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_COMMAND_DOWN,
412 ui::DomKey::UNIDENTIFIED},
413 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_CONTROL_DOWN,
414 ui::DomKey::Constant<'a'>::Character},
415 kKeyboardDeviceId},
416
417 // VKEY_A, Alt+Win modifier.
418 {ui::ET_KEY_PRESSED,
419 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
420 ui::DomKey::UNIDENTIFIED},
421 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
422 ui::DomKey::Constant<'a'>::Character},
423 kKeyboardDeviceId},
424
425 // VKEY_LWIN (left Windows key), Alt modifier.
426 {ui::ET_KEY_PRESSED,
427 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
428 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
429 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
430 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::CONTROL},
431 kKeyboardDeviceId},
432
433 // VKEY_RWIN (right Windows key), Alt modifier.
434 {ui::ET_KEY_PRESSED,
435 {ui::VKEY_RWIN, ui::DomCode::META_RIGHT,
436 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
437 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_RIGHT,
438 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::CONTROL},
439 kKeyboardDeviceId},
440 };
441 rewriter_->set_last_keyboard_device_id_for_testing(kKeyboardDeviceId);
442 for (const auto& test : remapped_internal_search_tests)
443 CheckKeyTestCase(rewriter_, test);
444
445 // Test external keyboard.
446 KeyTestCase remapped_external_search_tests[] = {
447 // VKEY_A, Win modifier.
448 {ui::ET_KEY_PRESSED,
449 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_COMMAND_DOWN,
450 ui::DomKey::UNIDENTIFIED},
451 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN,
452 ui::DomKey::Constant<'a'>::Character},
453 kKeyboardDeviceId + 1},
454
455 // VKEY_A, Alt+Win modifier.
456 {ui::ET_KEY_PRESSED,
457 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
458 ui::DomKey::UNIDENTIFIED},
459 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN,
460 ui::DomKey::Constant<'a'>::Character},
461 kKeyboardDeviceId + 1},
462
463 // VKEY_LWIN (left Windows key), Alt modifier.
464 {ui::ET_KEY_PRESSED,
465 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
466 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
467 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, ui::DomKey::ALT},
468 kKeyboardDeviceId + 1},
469
470 // VKEY_RWIN (right Windows key), Alt modifier.
471 {ui::ET_KEY_PRESSED,
472 {ui::VKEY_RWIN, ui::DomCode::META_RIGHT,
473 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
474 {ui::VKEY_MENU, ui::DomCode::ALT_RIGHT, ui::EF_ALT_DOWN,
475 ui::DomKey::ALT},
476 kKeyboardDeviceId + 1},
477 };
478 rewriter_->set_last_keyboard_device_id_for_testing(kKeyboardDeviceId + 1);
479 for (const auto& test : remapped_external_search_tests)
480 CheckKeyTestCase(rewriter_, test);
[email protected]9822df92012-03-31 03:52:56481}
[email protected]2d1934f2012-04-19 18:51:22482
[email protected]216d9162012-06-22 01:48:16483// For crbug.com/133896.
[email protected]b9d224c2012-07-13 01:09:03484TEST_F(EventRewriterTest, TestRewriteCommandToControlWithControlRemapped) {
[email protected]216d9162012-06-22 01:48:16485 // Remap Control to Alt.
penghuange5df2822017-03-16 22:54:36486 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]216d9162012-06-22 01:48:16487 IntegerPrefMember control;
Blake O'Harea09fa45a2017-10-13 04:19:58488 InitModifierKeyPref(&control, prefs::kLanguageRemapControlKeyTo,
489 ui::chromeos::ModifierKey::kAltKey);
[email protected]216d9162012-06-22 01:48:16490
penghuange5df2822017-03-16 22:54:36491 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
492 rewriter_->set_last_keyboard_device_id_for_testing(kKeyboardDeviceId);
[email protected]216d9162012-06-22 01:48:16493
kpschoedel8226fd152015-05-06 15:48:59494 KeyTestCase pc_keyboard_tests[] = {
495 // Control should be remapped to Alt.
kpschoedel02c854d2015-06-16 14:44:29496 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35497 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
498 ui::DomKey::CONTROL},
499 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN,
500 ui::DomKey::ALT}},
[email protected]106cf972014-05-28 17:28:17501 };
502
penghuange5df2822017-03-16 22:54:36503 for (const auto& test : pc_keyboard_tests)
504 CheckKeyTestCase(rewriter_, test);
[email protected]216d9162012-06-22 01:48:16505
506 // An Apple keyboard reusing the ID, zero.
penghuange5df2822017-03-16 22:54:36507 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "Apple Keyboard");
508 rewriter_->set_last_keyboard_device_id_for_testing(kKeyboardDeviceId);
[email protected]216d9162012-06-22 01:48:16509
[email protected]106cf972014-05-28 17:28:17510 KeyTestCase apple_keyboard_tests[] = {
511 // VKEY_LWIN (left Command key) with Alt modifier. The remapped Command
512 // key should never be re-remapped to Alt.
kpschoedel02c854d2015-06-16 14:44:29513 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59514 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:13515 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:35516 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
517 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::CONTROL}},
[email protected]216d9162012-06-22 01:48:16518
[email protected]106cf972014-05-28 17:28:17519 // VKEY_RWIN (right Command key) with Alt modifier. The remapped Command
520 // key should never be re-remapped to Alt.
kpschoedel02c854d2015-06-16 14:44:29521 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59522 {ui::VKEY_RWIN, ui::DomCode::META_RIGHT,
kpschoedel0a8b03052016-02-17 15:35:13523 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:35524 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_RIGHT,
525 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::CONTROL}},
[email protected]106cf972014-05-28 17:28:17526 };
527
penghuange5df2822017-03-16 22:54:36528 for (const auto& test : apple_keyboard_tests)
529 CheckKeyTestCase(rewriter_, test);
[email protected]216d9162012-06-22 01:48:16530}
531
[email protected]25ab8f12013-02-01 14:30:15532void EventRewriterTest::TestRewriteNumPadKeys() {
penghuange5df2822017-03-16 22:54:36533 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
534 rewriter_->set_last_keyboard_device_id_for_testing(kKeyboardDeviceId);
[email protected]350c9232012-05-25 04:16:06535
[email protected]106cf972014-05-28 17:28:17536 KeyTestCase tests[] = {
537 // XK_KP_Insert (= NumPad 0 without Num Lock), no modifier.
kpschoedel02c854d2015-06-16 14:44:29538 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35539 {ui::VKEY_INSERT, ui::DomCode::NUMPAD0, ui::EF_NONE, ui::DomKey::INSERT},
540 {ui::VKEY_NUMPAD0, ui::DomCode::NUMPAD0, ui::EF_NONE,
541 ui::DomKey::Constant<'0'>::Character}},
[email protected]350c9232012-05-25 04:16:06542
[email protected]106cf972014-05-28 17:28:17543 // XK_KP_Insert (= NumPad 0 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29544 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35545 {ui::VKEY_INSERT, ui::DomCode::NUMPAD0, ui::EF_ALT_DOWN,
546 ui::DomKey::INSERT},
547 {ui::VKEY_NUMPAD0, ui::DomCode::NUMPAD0, ui::EF_ALT_DOWN,
548 ui::DomKey::Constant<'0'>::Character}},
[email protected]350c9232012-05-25 04:16:06549
[email protected]106cf972014-05-28 17:28:17550 // XK_KP_Delete (= NumPad . without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29551 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35552 {ui::VKEY_DELETE, ui::DomCode::NUMPAD_DECIMAL, ui::EF_ALT_DOWN,
553 ui::DomKey::DEL},
554 {ui::VKEY_DECIMAL, ui::DomCode::NUMPAD_DECIMAL, ui::EF_ALT_DOWN,
555 ui::DomKey::Constant<'.'>::Character}},
[email protected]350c9232012-05-25 04:16:06556
[email protected]106cf972014-05-28 17:28:17557 // XK_KP_End (= NumPad 1 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29558 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35559 {ui::VKEY_END, ui::DomCode::NUMPAD1, ui::EF_ALT_DOWN, ui::DomKey::END},
560 {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_ALT_DOWN,
561 ui::DomKey::Constant<'1'>::Character}},
[email protected]350c9232012-05-25 04:16:06562
[email protected]106cf972014-05-28 17:28:17563 // XK_KP_Down (= NumPad 2 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29564 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35565 {ui::VKEY_DOWN, ui::DomCode::NUMPAD2, ui::EF_ALT_DOWN,
566 ui::DomKey::ARROW_DOWN},
567 {ui::VKEY_NUMPAD2, ui::DomCode::NUMPAD2, ui::EF_ALT_DOWN,
568 ui::DomKey::Constant<'2'>::Character}},
[email protected]350c9232012-05-25 04:16:06569
[email protected]106cf972014-05-28 17:28:17570 // XK_KP_Next (= NumPad 3 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29571 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35572 {ui::VKEY_NEXT, ui::DomCode::NUMPAD3, ui::EF_ALT_DOWN,
573 ui::DomKey::PAGE_DOWN},
574 {ui::VKEY_NUMPAD3, ui::DomCode::NUMPAD3, ui::EF_ALT_DOWN,
575 ui::DomKey::Constant<'3'>::Character}},
[email protected]350c9232012-05-25 04:16:06576
[email protected]106cf972014-05-28 17:28:17577 // XK_KP_Left (= NumPad 4 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29578 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35579 {ui::VKEY_LEFT, ui::DomCode::NUMPAD4, ui::EF_ALT_DOWN,
580 ui::DomKey::ARROW_LEFT},
581 {ui::VKEY_NUMPAD4, ui::DomCode::NUMPAD4, ui::EF_ALT_DOWN,
582 ui::DomKey::Constant<'4'>::Character}},
[email protected]350c9232012-05-25 04:16:06583
[email protected]106cf972014-05-28 17:28:17584 // XK_KP_Begin (= NumPad 5 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29585 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35586 {ui::VKEY_CLEAR, ui::DomCode::NUMPAD5, ui::EF_ALT_DOWN,
587 ui::DomKey::CLEAR},
588 {ui::VKEY_NUMPAD5, ui::DomCode::NUMPAD5, ui::EF_ALT_DOWN,
589 ui::DomKey::Constant<'5'>::Character}},
[email protected]350c9232012-05-25 04:16:06590
[email protected]106cf972014-05-28 17:28:17591 // XK_KP_Right (= NumPad 6 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29592 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35593 {ui::VKEY_RIGHT, ui::DomCode::NUMPAD6, ui::EF_ALT_DOWN,
594 ui::DomKey::ARROW_RIGHT},
595 {ui::VKEY_NUMPAD6, ui::DomCode::NUMPAD6, ui::EF_ALT_DOWN,
596 ui::DomKey::Constant<'6'>::Character}},
[email protected]350c9232012-05-25 04:16:06597
[email protected]106cf972014-05-28 17:28:17598 // XK_KP_Home (= NumPad 7 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29599 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35600 {ui::VKEY_HOME, ui::DomCode::NUMPAD7, ui::EF_ALT_DOWN, ui::DomKey::HOME},
601 {ui::VKEY_NUMPAD7, ui::DomCode::NUMPAD7, ui::EF_ALT_DOWN,
602 ui::DomKey::Constant<'7'>::Character}},
[email protected]350c9232012-05-25 04:16:06603
[email protected]106cf972014-05-28 17:28:17604 // XK_KP_Up (= NumPad 8 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29605 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35606 {ui::VKEY_UP, ui::DomCode::NUMPAD8, ui::EF_ALT_DOWN,
607 ui::DomKey::ARROW_UP},
608 {ui::VKEY_NUMPAD8, ui::DomCode::NUMPAD8, ui::EF_ALT_DOWN,
609 ui::DomKey::Constant<'8'>::Character}},
[email protected]350c9232012-05-25 04:16:06610
[email protected]106cf972014-05-28 17:28:17611 // XK_KP_Prior (= NumPad 9 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29612 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35613 {ui::VKEY_PRIOR, ui::DomCode::NUMPAD9, ui::EF_ALT_DOWN,
614 ui::DomKey::PAGE_UP},
615 {ui::VKEY_NUMPAD9, ui::DomCode::NUMPAD9, ui::EF_ALT_DOWN,
616 ui::DomKey::Constant<'9'>::Character}},
[email protected]350c9232012-05-25 04:16:06617
[email protected]106cf972014-05-28 17:28:17618 // XK_KP_0 (= NumPad 0 with Num Lock), Num Lock modifier.
kpschoedel02c854d2015-06-16 14:44:29619 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35620 {ui::VKEY_NUMPAD0, ui::DomCode::NUMPAD0, ui::EF_NONE,
621 ui::DomKey::Constant<'0'>::Character},
622 {ui::VKEY_NUMPAD0, ui::DomCode::NUMPAD0, ui::EF_NONE,
623 ui::DomKey::Constant<'0'>::Character}},
[email protected]350c9232012-05-25 04:16:06624
[email protected]106cf972014-05-28 17:28:17625 // XK_KP_DECIMAL (= NumPad . with Num Lock), Num Lock modifier.
kpschoedel02c854d2015-06-16 14:44:29626 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35627 {ui::VKEY_DECIMAL, ui::DomCode::NUMPAD_DECIMAL, ui::EF_NONE,
628 ui::DomKey::Constant<'.'>::Character},
629 {ui::VKEY_DECIMAL, ui::DomCode::NUMPAD_DECIMAL, ui::EF_NONE,
630 ui::DomKey::Constant<'.'>::Character}},
[email protected]350c9232012-05-25 04:16:06631
[email protected]106cf972014-05-28 17:28:17632 // XK_KP_1 (= NumPad 1 with Num Lock), Num Lock modifier.
kpschoedel02c854d2015-06-16 14:44:29633 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35634 {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_NONE,
635 ui::DomKey::Constant<'1'>::Character},
636 {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_NONE,
637 ui::DomKey::Constant<'1'>::Character}},
[email protected]350c9232012-05-25 04:16:06638
[email protected]106cf972014-05-28 17:28:17639 // XK_KP_2 (= NumPad 2 with Num Lock), Num Lock modifier.
kpschoedel02c854d2015-06-16 14:44:29640 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35641 {ui::VKEY_NUMPAD2, ui::DomCode::NUMPAD2, ui::EF_NONE,
642 ui::DomKey::Constant<'2'>::Character},
643 {ui::VKEY_NUMPAD2, ui::DomCode::NUMPAD2, ui::EF_NONE,
644 ui::DomKey::Constant<'2'>::Character}},
[email protected]350c9232012-05-25 04:16:06645
[email protected]106cf972014-05-28 17:28:17646 // XK_KP_3 (= NumPad 3 with Num Lock), Num Lock modifier.
kpschoedel02c854d2015-06-16 14:44:29647 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35648 {ui::VKEY_NUMPAD3, ui::DomCode::NUMPAD3, ui::EF_NONE,
649 ui::DomKey::Constant<'3'>::Character},
650 {ui::VKEY_NUMPAD3, ui::DomCode::NUMPAD3, ui::EF_NONE,
651 ui::DomKey::Constant<'3'>::Character}},
[email protected]350c9232012-05-25 04:16:06652
[email protected]106cf972014-05-28 17:28:17653 // XK_KP_4 (= NumPad 4 with Num Lock), Num Lock modifier.
kpschoedel02c854d2015-06-16 14:44:29654 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35655 {ui::VKEY_NUMPAD4, ui::DomCode::NUMPAD4, ui::EF_NONE,
656 ui::DomKey::Constant<'4'>::Character},
657 {ui::VKEY_NUMPAD4, ui::DomCode::NUMPAD4, ui::EF_NONE,
658 ui::DomKey::Constant<'4'>::Character}},
[email protected]350c9232012-05-25 04:16:06659
kpschoedel8226fd152015-05-06 15:48:59660 // XK_KP_5 (= NumPad 5 with Num Lock), Num Lock
661 // modifier.
kpschoedel02c854d2015-06-16 14:44:29662 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35663 {ui::VKEY_NUMPAD5, ui::DomCode::NUMPAD5, ui::EF_NONE,
664 ui::DomKey::Constant<'5'>::Character},
665 {ui::VKEY_NUMPAD5, ui::DomCode::NUMPAD5, ui::EF_NONE,
666 ui::DomKey::Constant<'5'>::Character}},
[email protected]350c9232012-05-25 04:16:06667
kpschoedel8226fd152015-05-06 15:48:59668 // XK_KP_6 (= NumPad 6 with Num Lock), Num Lock
669 // modifier.
kpschoedel02c854d2015-06-16 14:44:29670 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35671 {ui::VKEY_NUMPAD6, ui::DomCode::NUMPAD6, ui::EF_NONE,
672 ui::DomKey::Constant<'6'>::Character},
673 {ui::VKEY_NUMPAD6, ui::DomCode::NUMPAD6, ui::EF_NONE,
674 ui::DomKey::Constant<'6'>::Character}},
[email protected]350c9232012-05-25 04:16:06675
kpschoedel8226fd152015-05-06 15:48:59676 // XK_KP_7 (= NumPad 7 with Num Lock), Num Lock
677 // modifier.
kpschoedel02c854d2015-06-16 14:44:29678 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35679 {ui::VKEY_NUMPAD7, ui::DomCode::NUMPAD7, ui::EF_NONE,
680 ui::DomKey::Constant<'7'>::Character},
681 {ui::VKEY_NUMPAD7, ui::DomCode::NUMPAD7, ui::EF_NONE,
682 ui::DomKey::Constant<'7'>::Character}},
[email protected]350c9232012-05-25 04:16:06683
kpschoedel8226fd152015-05-06 15:48:59684 // XK_KP_8 (= NumPad 8 with Num Lock), Num Lock
685 // modifier.
kpschoedel02c854d2015-06-16 14:44:29686 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35687 {ui::VKEY_NUMPAD8, ui::DomCode::NUMPAD8, ui::EF_NONE,
688 ui::DomKey::Constant<'8'>::Character},
689 {ui::VKEY_NUMPAD8, ui::DomCode::NUMPAD8, ui::EF_NONE,
690 ui::DomKey::Constant<'8'>::Character}},
[email protected]350c9232012-05-25 04:16:06691
kpschoedel8226fd152015-05-06 15:48:59692 // XK_KP_9 (= NumPad 9 with Num Lock), Num Lock
693 // modifier.
kpschoedel02c854d2015-06-16 14:44:29694 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35695 {ui::VKEY_NUMPAD9, ui::DomCode::NUMPAD9, ui::EF_NONE,
696 ui::DomKey::Constant<'9'>::Character},
697 {ui::VKEY_NUMPAD9, ui::DomCode::NUMPAD9, ui::EF_NONE,
698 ui::DomKey::Constant<'9'>::Character}},
[email protected]106cf972014-05-28 17:28:17699 };
700
penghuange5df2822017-03-16 22:54:36701 for (const auto& test : tests)
702 CheckKeyTestCase(rewriter_, test);
[email protected]2d1934f2012-04-19 18:51:22703}
[email protected]44de6072012-05-17 03:09:27704
[email protected]25ab8f12013-02-01 14:30:15705TEST_F(EventRewriterTest, TestRewriteNumPadKeys) {
706 TestRewriteNumPadKeys();
707}
708
709TEST_F(EventRewriterTest, TestRewriteNumPadKeysWithDiamondKeyFlag) {
710 // Make sure the num lock works correctly even when Diamond key exists.
avi3ef9ec9e2014-12-22 22:50:17711 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
[email protected]2f2d6c32013-05-10 02:56:24712 chromeos::switches::kHasChromeOSDiamondKey, "");
[email protected]25ab8f12013-02-01 14:30:15713 TestRewriteNumPadKeys();
714}
715
[email protected]44de6072012-05-17 03:09:27716// Tests if the rewriter can handle a Command + Num Pad event.
[email protected]25ab8f12013-02-01 14:30:15717void EventRewriterTest::TestRewriteNumPadKeysOnAppleKeyboard() {
Ahmed Fakhry629985b2018-07-30 20:57:32718 // Simulate the default initialization of the Apple Command key remap pref to
719 // Ctrl.
720 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
721
penghuange5df2822017-03-16 22:54:36722 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "Apple Keyboard");
723 rewriter_->set_last_keyboard_device_id_for_testing(kKeyboardDeviceId);
[email protected]350c9232012-05-25 04:16:06724
[email protected]106cf972014-05-28 17:28:17725 KeyTestCase tests[] = {
726 // XK_KP_End (= NumPad 1 without Num Lock), Win modifier.
727 // The result should be "Num Pad 1 with Control + Num Lock modifiers".
kpschoedel02c854d2015-06-16 14:44:29728 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35729 {ui::VKEY_END, ui::DomCode::NUMPAD1, ui::EF_COMMAND_DOWN,
730 ui::DomKey::END},
731 {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:53732 ui::DomKey::Constant<'1'>::Character}},
[email protected]350c9232012-05-25 04:16:06733
[email protected]106cf972014-05-28 17:28:17734 // XK_KP_1 (= NumPad 1 with Num Lock), Win modifier.
735 // The result should also be "Num Pad 1 with Control + Num Lock
736 // modifiers".
kpschoedel02c854d2015-06-16 14:44:29737 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35738 {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_COMMAND_DOWN,
739 ui::DomKey::Constant<'1'>::Character},
740 {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:53741 ui::DomKey::Constant<'1'>::Character}}};
[email protected]106cf972014-05-28 17:28:17742
penghuange5df2822017-03-16 22:54:36743 for (const auto& test : tests)
744 CheckKeyTestCase(rewriter_, test);
[email protected]44de6072012-05-17 03:09:27745}
746
[email protected]25ab8f12013-02-01 14:30:15747TEST_F(EventRewriterTest, TestRewriteNumPadKeysOnAppleKeyboard) {
748 TestRewriteNumPadKeysOnAppleKeyboard();
749}
750
751TEST_F(EventRewriterTest,
752 TestRewriteNumPadKeysOnAppleKeyboardWithDiamondKeyFlag) {
753 // Makes sure the num lock works correctly even when Diamond key exists.
avi3ef9ec9e2014-12-22 22:50:17754 const base::CommandLine original_cl(*base::CommandLine::ForCurrentProcess());
755 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
[email protected]2f2d6c32013-05-10 02:56:24756 chromeos::switches::kHasChromeOSDiamondKey, "");
[email protected]25ab8f12013-02-01 14:30:15757
758 TestRewriteNumPadKeysOnAppleKeyboard();
avi3ef9ec9e2014-12-22 22:50:17759 *base::CommandLine::ForCurrentProcess() = original_cl;
[email protected]25ab8f12013-02-01 14:30:15760}
761
[email protected]b9d224c2012-07-13 01:09:03762TEST_F(EventRewriterTest, TestRewriteModifiersNoRemap) {
penghuange5df2822017-03-16 22:54:36763 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
[email protected]350c9232012-05-25 04:16:06764
[email protected]106cf972014-05-28 17:28:17765 KeyTestCase tests[] = {
766 // Press Search. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29767 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59768 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_NONE, ui::DomKey::META},
769 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_COMMAND_DOWN,
kpschoedel0a8b03052016-02-17 15:35:13770 ui::DomKey::META}},
[email protected]350c9232012-05-25 04:16:06771
[email protected]106cf972014-05-28 17:28:17772 // Press left Control. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29773 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35774 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
775 ui::DomKey::CONTROL},
776 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
777 ui::DomKey::CONTROL}},
[email protected]350c9232012-05-25 04:16:06778
[email protected]106cf972014-05-28 17:28:17779 // Press right Control. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29780 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35781 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
782 ui::DomKey::CONTROL},
783 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
784 ui::DomKey::CONTROL}},
[email protected]350c9232012-05-25 04:16:06785
[email protected]106cf972014-05-28 17:28:17786 // Press left Alt. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29787 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35788 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, ui::DomKey::ALT},
789 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN,
790 ui::DomKey::ALT}},
[email protected]350c9232012-05-25 04:16:06791
[email protected]106cf972014-05-28 17:28:17792 // Press right Alt. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29793 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35794 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, ui::DomKey::ALT},
795 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN,
796 ui::DomKey::ALT}},
[email protected]350c9232012-05-25 04:16:06797
[email protected]106cf972014-05-28 17:28:17798 // Test KeyRelease event, just in case.
799 // Release Search. Confirm the release event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29800 {ui::ET_KEY_RELEASED,
dtapuskaaf863af2016-04-21 14:33:59801 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_NONE, ui::DomKey::META},
802 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_NONE, ui::DomKey::META}},
[email protected]106cf972014-05-28 17:28:17803 };
804
penghuange5df2822017-03-16 22:54:36805 for (const auto& test : tests)
806 CheckKeyTestCase(rewriter_, test);
[email protected]350c9232012-05-25 04:16:06807}
808
[email protected]b9d224c2012-07-13 01:09:03809TEST_F(EventRewriterTest, TestRewriteModifiersNoRemapMultipleKeys) {
penghuange5df2822017-03-16 22:54:36810 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
[email protected]350c9232012-05-25 04:16:06811
[email protected]106cf972014-05-28 17:28:17812 KeyTestCase tests[] = {
813 // Press Alt with Shift. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29814 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35815 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT,
816 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ALT},
817 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT,
818 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ALT}},
[email protected]350c9232012-05-25 04:16:06819
michaelpg168ecd72016-08-25 04:00:42820 // Press Escape with Alt and Shift. Confirm the event is not rewritten.
821 {ui::ET_KEY_PRESSED,
822 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE,
823 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ESCAPE},
824 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE,
825 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ESCAPE}},
826
[email protected]106cf972014-05-28 17:28:17827 // Press Search with Caps Lock mask. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29828 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59829 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:13830 ui::EF_CAPS_LOCK_ON | ui::EF_COMMAND_DOWN, ui::DomKey::META},
dtapuskaaf863af2016-04-21 14:33:59831 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:13832 ui::EF_CAPS_LOCK_ON | ui::EF_COMMAND_DOWN, ui::DomKey::META}},
[email protected]350c9232012-05-25 04:16:06833
[email protected]106cf972014-05-28 17:28:17834 // Release Search with Caps Lock mask. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29835 {ui::ET_KEY_RELEASED,
dtapuskaaf863af2016-04-21 14:33:59836 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_CAPS_LOCK_ON,
kpschoedel0a8b03052016-02-17 15:35:13837 ui::DomKey::META},
dtapuskaaf863af2016-04-21 14:33:59838 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_CAPS_LOCK_ON,
kpschoedel0a8b03052016-02-17 15:35:13839 ui::DomKey::META}},
[email protected]350c9232012-05-25 04:16:06840
michaelpg168ecd72016-08-25 04:00:42841 // Press Shift+Ctrl+Alt+Search+Escape. Confirm the event is not rewritten.
842 {ui::ET_KEY_PRESSED,
843 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE,
844 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
845 ui::EF_COMMAND_DOWN,
846 ui::DomKey::ESCAPE},
847 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE,
848 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
849 ui::EF_COMMAND_DOWN,
850 ui::DomKey::ESCAPE}},
851
852 // Press Shift+Ctrl+Alt+Search+B. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29853 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19854 {ui::VKEY_B, ui::DomCode::US_B,
kpschoedel8226fd152015-05-06 15:48:59855 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
856 ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:35857 ui::DomKey::Constant<'B'>::Character},
kpschoedela281bf12016-01-07 15:08:19858 {ui::VKEY_B, ui::DomCode::US_B,
kpschoedel8226fd152015-05-06 15:48:59859 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
860 ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:35861 ui::DomKey::Constant<'B'>::Character}},
[email protected]106cf972014-05-28 17:28:17862 };
863
penghuange5df2822017-03-16 22:54:36864 for (const auto& test : tests)
865 CheckKeyTestCase(rewriter_, test);
[email protected]350c9232012-05-25 04:16:06866}
867
[email protected]b9d224c2012-07-13 01:09:03868TEST_F(EventRewriterTest, TestRewriteModifiersDisableSome) {
michaelpg168ecd72016-08-25 04:00:42869 // Disable Search, Control and Escape keys.
penghuange5df2822017-03-16 22:54:36870 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]350c9232012-05-25 04:16:06871 IntegerPrefMember search;
Blake O'Harea09fa45a2017-10-13 04:19:58872 InitModifierKeyPref(&search, prefs::kLanguageRemapSearchKeyTo,
873 ui::chromeos::ModifierKey::kVoidKey);
[email protected]350c9232012-05-25 04:16:06874 IntegerPrefMember control;
Blake O'Harea09fa45a2017-10-13 04:19:58875 InitModifierKeyPref(&control, prefs::kLanguageRemapControlKeyTo,
876 ui::chromeos::ModifierKey::kVoidKey);
michaelpg168ecd72016-08-25 04:00:42877 IntegerPrefMember escape;
Blake O'Harea09fa45a2017-10-13 04:19:58878 InitModifierKeyPref(&escape, prefs::kLanguageRemapEscapeKeyTo,
879 ui::chromeos::ModifierKey::kVoidKey);
[email protected]350c9232012-05-25 04:16:06880
penghuange5df2822017-03-16 22:54:36881 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
[email protected]350c9232012-05-25 04:16:06882
[email protected]106cf972014-05-28 17:28:17883 KeyTestCase disabled_modifier_tests[] = {
884 // Press Alt with Shift. This key press shouldn't be affected by the
885 // pref. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29886 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35887 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT,
888 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ALT},
889 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT,
890 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ALT}},
[email protected]350c9232012-05-25 04:16:06891
[email protected]106cf972014-05-28 17:28:17892 // Press Search. Confirm the event is now VKEY_UNKNOWN.
kpschoedel02c854d2015-06-16 14:44:29893 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59894 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_NONE, ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:35895 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_NONE,
896 ui::DomKey::UNIDENTIFIED}},
[email protected]350c9232012-05-25 04:16:06897
[email protected]106cf972014-05-28 17:28:17898 // Press Control. Confirm the event is now VKEY_UNKNOWN.
kpschoedel02c854d2015-06-16 14:44:29899 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35900 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
901 ui::DomKey::CONTROL},
902 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_NONE,
903 ui::DomKey::UNIDENTIFIED}},
[email protected]350c9232012-05-25 04:16:06904
michaelpg168ecd72016-08-25 04:00:42905 // Press Escape. Confirm the event is now VKEY_UNKNOWN.
906 {ui::ET_KEY_PRESSED,
907 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE, ui::EF_NONE, ui::DomKey::ESCAPE},
908 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_NONE,
909 ui::DomKey::UNIDENTIFIED}},
910
[email protected]106cf972014-05-28 17:28:17911 // Press Control+Search. Confirm the event is now VKEY_UNKNOWN
912 // without any modifiers.
kpschoedel02c854d2015-06-16 14:44:29913 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59914 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_CONTROL_DOWN,
kpschoedel0a8b03052016-02-17 15:35:13915 ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:35916 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_NONE,
917 ui::DomKey::UNIDENTIFIED}},
[email protected]350c9232012-05-25 04:16:06918
[email protected]106cf972014-05-28 17:28:17919 // Press Control+Search+a. Confirm the event is now VKEY_A without any
920 // modifiers.
kpschoedel02c854d2015-06-16 14:44:29921 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19922 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_CONTROL_DOWN,
kpschoedel51d2e322015-08-28 15:29:35923 ui::DomKey::Constant<'a'>::Character},
kpschoedela281bf12016-01-07 15:08:19924 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:35925 ui::DomKey::Constant<'a'>::Character}},
[email protected]350c9232012-05-25 04:16:06926
[email protected]106cf972014-05-28 17:28:17927 // Press Control+Search+Alt+a. Confirm the event is now VKEY_A only with
928 // the Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29929 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19930 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
kpschoedel51d2e322015-08-28 15:29:35931 ui::DomKey::Constant<'a'>::Character},
kpschoedela281bf12016-01-07 15:08:19932 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN,
kpschoedel51d2e322015-08-28 15:29:35933 ui::DomKey::Constant<'a'>::Character}},
[email protected]106cf972014-05-28 17:28:17934 };
935
penghuange5df2822017-03-16 22:54:36936 for (const auto& test : disabled_modifier_tests)
937 CheckKeyTestCase(rewriter_, test);
[email protected]350c9232012-05-25 04:16:06938
939 // Remap Alt to Control.
940 IntegerPrefMember alt;
Blake O'Harea09fa45a2017-10-13 04:19:58941 InitModifierKeyPref(&alt, prefs::kLanguageRemapAltKeyTo,
942 ui::chromeos::ModifierKey::kControlKey);
[email protected]350c9232012-05-25 04:16:06943
[email protected]106cf972014-05-28 17:28:17944 KeyTestCase tests[] = {
945 // Press left Alt. Confirm the event is now VKEY_CONTROL
946 // even though the Control key itself is disabled.
kpschoedel02c854d2015-06-16 14:44:29947 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35948 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, ui::DomKey::ALT},
949 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
950 ui::DomKey::CONTROL}},
[email protected]350c9232012-05-25 04:16:06951
[email protected]106cf972014-05-28 17:28:17952 // Press Alt+a. Confirm the event is now Control+a even though the Control
953 // key itself is disabled.
kpschoedel02c854d2015-06-16 14:44:29954 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19955 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN,
kpschoedel51d2e322015-08-28 15:29:35956 ui::DomKey::Constant<'a'>::Character},
kpschoedela281bf12016-01-07 15:08:19957 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:53958 ui::DomKey::Constant<'a'>::Character}},
[email protected]106cf972014-05-28 17:28:17959 };
960
penghuange5df2822017-03-16 22:54:36961 for (const auto& test : tests)
962 CheckKeyTestCase(rewriter_, test);
[email protected]350c9232012-05-25 04:16:06963}
964
[email protected]b9d224c2012-07-13 01:09:03965TEST_F(EventRewriterTest, TestRewriteModifiersRemapToControl) {
[email protected]350c9232012-05-25 04:16:06966 // Remap Search to Control.
penghuange5df2822017-03-16 22:54:36967 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]350c9232012-05-25 04:16:06968 IntegerPrefMember search;
Blake O'Harea09fa45a2017-10-13 04:19:58969 InitModifierKeyPref(&search, prefs::kLanguageRemapSearchKeyTo,
970 ui::chromeos::ModifierKey::kControlKey);
[email protected]350c9232012-05-25 04:16:06971
penghuange5df2822017-03-16 22:54:36972 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
[email protected]350c9232012-05-25 04:16:06973
[email protected]106cf972014-05-28 17:28:17974 KeyTestCase s_tests[] = {
975 // Press Search. Confirm the event is now VKEY_CONTROL.
kpschoedel02c854d2015-06-16 14:44:29976 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59977 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_COMMAND_DOWN,
kpschoedel0a8b03052016-02-17 15:35:13978 ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:35979 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
980 ui::DomKey::CONTROL}},
[email protected]106cf972014-05-28 17:28:17981 };
982
penghuange5df2822017-03-16 22:54:36983 for (const auto& test : s_tests)
984 CheckKeyTestCase(rewriter_, test);
[email protected]350c9232012-05-25 04:16:06985
986 // Remap Alt to Control too.
987 IntegerPrefMember alt;
Blake O'Harea09fa45a2017-10-13 04:19:58988 InitModifierKeyPref(&alt, prefs::kLanguageRemapAltKeyTo,
989 ui::chromeos::ModifierKey::kControlKey);
[email protected]350c9232012-05-25 04:16:06990
[email protected]106cf972014-05-28 17:28:17991 KeyTestCase sa_tests[] = {
992 // Press Alt. Confirm the event is now VKEY_CONTROL.
kpschoedel02c854d2015-06-16 14:44:29993 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35994 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, ui::DomKey::ALT},
995 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
996 ui::DomKey::CONTROL}},
[email protected]350c9232012-05-25 04:16:06997
[email protected]106cf972014-05-28 17:28:17998 // Press Alt+Search. Confirm the event is now VKEY_CONTROL.
kpschoedel02c854d2015-06-16 14:44:29999 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:591000 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:131001 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:351002 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
1003 ui::DomKey::CONTROL}},
[email protected]350c9232012-05-25 04:16:061004
[email protected]106cf972014-05-28 17:28:171005 // Press Control+Alt+Search. Confirm the event is now VKEY_CONTROL.
kpschoedel02c854d2015-06-16 14:44:291006 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:591007 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel8226fd152015-05-06 15:48:591008 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
kpschoedel0a8b03052016-02-17 15:35:131009 ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:351010 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
1011 ui::DomKey::CONTROL}},
[email protected]350c9232012-05-25 04:16:061012
[email protected]106cf972014-05-28 17:28:171013 // Press Shift+Control+Alt+Search. Confirm the event is now Control with
1014 // Shift and Control modifiers.
kpschoedel02c854d2015-06-16 14:44:291015 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:591016 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel8226fd152015-05-06 15:48:591017 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
1018 ui::EF_COMMAND_DOWN,
kpschoedel0a8b03052016-02-17 15:35:131019 ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:351020 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
1021 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::CONTROL}},
[email protected]350c9232012-05-25 04:16:061022
[email protected]106cf972014-05-28 17:28:171023 // Press Shift+Control+Alt+Search+B. Confirm the event is now B with Shift
1024 // and Control modifiers.
kpschoedel02c854d2015-06-16 14:44:291025 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:191026 {ui::VKEY_B, ui::DomCode::US_B,
kpschoedel8226fd152015-05-06 15:48:591027 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
1028 ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:351029 ui::DomKey::Constant<'B'>::Character},
kpschoedela281bf12016-01-07 15:08:191030 {ui::VKEY_B, ui::DomCode::US_B, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:531031 ui::DomKey::Constant<'B'>::Character}},
[email protected]106cf972014-05-28 17:28:171032 };
1033
penghuange5df2822017-03-16 22:54:361034 for (const auto& test : sa_tests)
1035 CheckKeyTestCase(rewriter_, test);
[email protected]350c9232012-05-25 04:16:061036}
1037
[email protected]343b8edd2013-09-17 09:28:111038TEST_F(EventRewriterTest, TestRewriteModifiersRemapToEscape) {
michaelpg168ecd72016-08-25 04:00:421039 // Remap Search to Escape.
penghuange5df2822017-03-16 22:54:361040 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]343b8edd2013-09-17 09:28:111041 IntegerPrefMember search;
Blake O'Harea09fa45a2017-10-13 04:19:581042 InitModifierKeyPref(&search, prefs::kLanguageRemapSearchKeyTo,
1043 ui::chromeos::ModifierKey::kEscapeKey);
[email protected]343b8edd2013-09-17 09:28:111044
penghuange5df2822017-03-16 22:54:361045 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
[email protected]343b8edd2013-09-17 09:28:111046
kpschoedel8226fd152015-05-06 15:48:591047 KeyTestCase tests[] = {
1048 // Press Search. Confirm the event is now VKEY_ESCAPE.
kpschoedel02c854d2015-06-16 14:44:291049 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:591050 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_COMMAND_DOWN,
kpschoedel0a8b03052016-02-17 15:35:131051 ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:351052 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE, ui::EF_NONE, ui::DomKey::ESCAPE}},
[email protected]106cf972014-05-28 17:28:171053 };
1054
penghuange5df2822017-03-16 22:54:361055 for (const auto& test : tests)
1056 CheckKeyTestCase(rewriter_, test);
[email protected]343b8edd2013-09-17 09:28:111057}
1058
[email protected]b9d224c2012-07-13 01:09:031059TEST_F(EventRewriterTest, TestRewriteModifiersRemapMany) {
michaelpg168ecd72016-08-25 04:00:421060 // Remap Escape to Alt.
penghuange5df2822017-03-16 22:54:361061 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
michaelpg168ecd72016-08-25 04:00:421062 IntegerPrefMember escape;
Blake O'Harea09fa45a2017-10-13 04:19:581063 InitModifierKeyPref(&escape, prefs::kLanguageRemapEscapeKeyTo,
1064 ui::chromeos::ModifierKey::kAltKey);
[email protected]350c9232012-05-25 04:16:061065
penghuange5df2822017-03-16 22:54:361066 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
[email protected]350c9232012-05-25 04:16:061067
michaelpg168ecd72016-08-25 04:00:421068 KeyTestCase e2a_tests[] = {
1069 // Press Escape. Confirm the event is now VKEY_MENU.
kpschoedel02c854d2015-06-16 14:44:291070 {ui::ET_KEY_PRESSED,
michaelpg168ecd72016-08-25 04:00:421071 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE, ui::EF_NONE, ui::DomKey::ESCAPE},
kpschoedel51d2e322015-08-28 15:29:351072 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN,
1073 ui::DomKey::ALT}},
michaelpg168ecd72016-08-25 04:00:421074 // Release Escape to clear flags.
1075 {ui::ET_KEY_RELEASED,
1076 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE, ui::EF_NONE, ui::DomKey::ESCAPE},
1077 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_NONE, ui::DomKey::ALT}},
[email protected]106cf972014-05-28 17:28:171078 };
1079
penghuange5df2822017-03-16 22:54:361080 for (const auto& test : e2a_tests)
1081 CheckKeyTestCase(rewriter_, test);
[email protected]350c9232012-05-25 04:16:061082
1083 // Remap Alt to Control.
1084 IntegerPrefMember alt;
Blake O'Harea09fa45a2017-10-13 04:19:581085 InitModifierKeyPref(&alt, prefs::kLanguageRemapAltKeyTo,
1086 ui::chromeos::ModifierKey::kControlKey);
[email protected]350c9232012-05-25 04:16:061087
[email protected]106cf972014-05-28 17:28:171088 KeyTestCase a2c_tests[] = {
1089 // Press left Alt. Confirm the event is now VKEY_CONTROL.
kpschoedel02c854d2015-06-16 14:44:291090 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351091 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, ui::DomKey::ALT},
1092 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
1093 ui::DomKey::CONTROL}},
[email protected]bc3cca84f2014-07-16 04:19:231094 // Press Shift+comma. Verify that only the flags are changed.
kpschoedel02c854d2015-06-16 14:44:291095 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351096 {ui::VKEY_OEM_COMMA, ui::DomCode::COMMA,
1097 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::UNIDENTIFIED},
1098 {ui::VKEY_OEM_COMMA, ui::DomCode::COMMA,
kpschoedel728aa8092015-10-20 19:29:531099 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN,
1100 ui::DomKey::Constant<'<'>::Character}},
[email protected]bc3cca84f2014-07-16 04:19:231101 // Press Shift+9. Verify that only the flags are changed.
kpschoedel02c854d2015-06-16 14:44:291102 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351103 {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
1104 ui::DomKey::UNIDENTIFIED},
1105 {ui::VKEY_9, ui::DomCode::DIGIT9,
kpschoedel728aa8092015-10-20 19:29:531106 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN,
1107 ui::DomKey::Constant<'('>::Character}},
[email protected]106cf972014-05-28 17:28:171108 };
1109
penghuange5df2822017-03-16 22:54:361110 for (const auto& test : a2c_tests)
1111 CheckKeyTestCase(rewriter_, test);
[email protected]350c9232012-05-25 04:16:061112
1113 // Remap Control to Search.
1114 IntegerPrefMember control;
Blake O'Harea09fa45a2017-10-13 04:19:581115 InitModifierKeyPref(&control, prefs::kLanguageRemapControlKeyTo,
1116 ui::chromeos::ModifierKey::kSearchKey);
[email protected]350c9232012-05-25 04:16:061117
[email protected]106cf972014-05-28 17:28:171118 KeyTestCase c2s_tests[] = {
1119 // Press left Control. Confirm the event is now VKEY_LWIN.
kpschoedel02c854d2015-06-16 14:44:291120 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351121 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
1122 ui::DomKey::CONTROL},
dtapuskaaf863af2016-04-21 14:33:591123 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_COMMAND_DOWN,
kpschoedel0a8b03052016-02-17 15:35:131124 ui::DomKey::META}},
[email protected]350c9232012-05-25 04:16:061125
michaelpg168ecd72016-08-25 04:00:421126 // Then, press all of the three, Control+Alt+Escape.
kpschoedel02c854d2015-06-16 14:44:291127 {ui::ET_KEY_PRESSED,
michaelpg168ecd72016-08-25 04:00:421128 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE,
1129 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::CONTROL},
kpschoedel51d2e322015-08-28 15:29:351130 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT,
kpschoedel8226fd152015-05-06 15:48:591131 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:351132 ui::DomKey::ALT}},
[email protected]350c9232012-05-25 04:16:061133
michaelpg168ecd72016-08-25 04:00:421134 // Press Shift+Control+Alt+Escape.
kpschoedel02c854d2015-06-16 14:44:291135 {ui::ET_KEY_PRESSED,
michaelpg168ecd72016-08-25 04:00:421136 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE,
1137 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
1138 ui::DomKey::ESCAPE},
kpschoedel51d2e322015-08-28 15:29:351139 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT,
kpschoedel8226fd152015-05-06 15:48:591140 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
1141 ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:351142 ui::DomKey::ALT}},
[email protected]350c9232012-05-25 04:16:061143
michaelpg168ecd72016-08-25 04:00:421144 // Press Shift+Control+Alt+B
kpschoedel02c854d2015-06-16 14:44:291145 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:191146 {ui::VKEY_B, ui::DomCode::US_B,
michaelpg168ecd72016-08-25 04:00:421147 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
kpschoedel51d2e322015-08-28 15:29:351148 ui::DomKey::Constant<'B'>::Character},
kpschoedela281bf12016-01-07 15:08:191149 {ui::VKEY_B, ui::DomCode::US_B,
kpschoedel8226fd152015-05-06 15:48:591150 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
1151 ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:351152 ui::DomKey::Constant<'B'>::Character}},
[email protected]106cf972014-05-28 17:28:171153 };
1154
penghuange5df2822017-03-16 22:54:361155 for (const auto& test : c2s_tests)
1156 CheckKeyTestCase(rewriter_, test);
michaelpg168ecd72016-08-25 04:00:421157
1158 // Remap Search to Backspace.
1159 IntegerPrefMember search;
Blake O'Harea09fa45a2017-10-13 04:19:581160 InitModifierKeyPref(&search, prefs::kLanguageRemapSearchKeyTo,
1161 ui::chromeos::ModifierKey::kBackspaceKey);
michaelpg168ecd72016-08-25 04:00:421162
1163 KeyTestCase s2b_tests[] = {
1164 // Release Control and Escape, as Search and Alt would transform Backspace
1165 // to Delete.
1166 {ui::ET_KEY_RELEASED,
1167 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_NONE,
1168 ui::DomKey::CONTROL},
1169 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_ALT_DOWN,
1170 ui::DomKey::META}},
1171 {ui::ET_KEY_RELEASED,
1172 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE, ui::EF_NONE, ui::DomKey::ESCAPE},
1173 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_NONE, ui::DomKey::ALT}},
1174 // Press Search. Confirm the event is now VKEY_BACK.
1175 {ui::ET_KEY_PRESSED,
1176 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_COMMAND_DOWN,
1177 ui::DomKey::META},
1178 {ui::VKEY_BACK, ui::DomCode::BACKSPACE, ui::EF_NONE,
1179 ui::DomKey::BACKSPACE}},
1180 };
1181
penghuange5df2822017-03-16 22:54:361182 for (const auto& test : s2b_tests)
1183 CheckKeyTestCase(rewriter_, test);
michaelpg168ecd72016-08-25 04:00:421184
1185 // Remap Backspace to Escape.
1186 IntegerPrefMember backspace;
Blake O'Harea09fa45a2017-10-13 04:19:581187 InitModifierKeyPref(&backspace, prefs::kLanguageRemapBackspaceKeyTo,
1188 ui::chromeos::ModifierKey::kEscapeKey);
michaelpg168ecd72016-08-25 04:00:421189
1190 KeyTestCase b2e_tests[] = {
1191 // Press Backspace. Confirm the event is now VKEY_ESCAPE.
1192 {ui::ET_KEY_PRESSED,
1193 {ui::VKEY_BACK, ui::DomCode::BACKSPACE, ui::EF_NONE,
1194 ui::DomKey::BACKSPACE},
1195 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE, ui::EF_NONE, ui::DomKey::ESCAPE}},
1196 };
1197
penghuange5df2822017-03-16 22:54:361198 for (const auto& test : b2e_tests)
1199 CheckKeyTestCase(rewriter_, test);
[email protected]350c9232012-05-25 04:16:061200}
1201
[email protected]b9d224c2012-07-13 01:09:031202TEST_F(EventRewriterTest, TestRewriteModifiersRemapToCapsLock) {
[email protected]350c9232012-05-25 04:16:061203 // Remap Search to Caps Lock.
penghuange5df2822017-03-16 22:54:361204 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]350c9232012-05-25 04:16:061205 IntegerPrefMember search;
Blake O'Harea09fa45a2017-10-13 04:19:581206 InitModifierKeyPref(&search, prefs::kLanguageRemapSearchKeyTo,
1207 ui::chromeos::ModifierKey::kCapsLockKey);
[email protected]350c9232012-05-25 04:16:061208
Weidong Guo9b390042017-10-29 19:07:431209 chromeos::input_method::FakeImeKeyboard ime_keyboard;
penghuange5df2822017-03-16 22:54:361210 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
Weidong Guo9b390042017-10-29 19:07:431211 rewriter_->set_ime_keyboard_for_testing(&ime_keyboard);
1212 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_);
[email protected]350c9232012-05-25 04:16:061213
1214 // Press Search.
pkastingcc7f6ac2016-01-08 23:38:471215 EXPECT_EQ(GetExpectedResultAsString(
1216 ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
1217 ui::EF_MOD3_DOWN | ui::EF_CAPS_LOCK_ON, ui::DomKey::CAPS_LOCK),
penghuange5df2822017-03-16 22:54:361218 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:591219 ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:131220 ui::EF_COMMAND_DOWN, ui::DomKey::META));
Weidong Guo9b390042017-10-29 19:07:431221 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_);
[email protected]350c9232012-05-25 04:16:061222
1223 // Release Search.
kpschoedel8226fd152015-05-06 15:48:591224 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL,
1225 ui::DomCode::CAPS_LOCK, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351226 ui::DomKey::CAPS_LOCK),
penghuange5df2822017-03-16 22:54:361227 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_RELEASED,
dtapuskaaf863af2016-04-21 14:33:591228 ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:131229 ui::EF_NONE, ui::DomKey::META));
Weidong Guo9b390042017-10-29 19:07:431230 EXPECT_TRUE(ime_keyboard.caps_lock_is_enabled_);
[email protected]350c9232012-05-25 04:16:061231
1232 // Press Search.
pkastingcc7f6ac2016-01-08 23:38:471233 EXPECT_EQ(GetExpectedResultAsString(
1234 ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
1235 ui::EF_CAPS_LOCK_ON | ui::EF_MOD3_DOWN, ui::DomKey::CAPS_LOCK),
penghuange5df2822017-03-16 22:54:361236 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:591237 ui::VKEY_LWIN, ui::DomCode::META_LEFT,
pkastingcc7f6ac2016-01-08 23:38:471238 ui::EF_COMMAND_DOWN | ui::EF_CAPS_LOCK_ON,
kpschoedel0a8b03052016-02-17 15:35:131239 ui::DomKey::META));
Weidong Guo9b390042017-10-29 19:07:431240 EXPECT_TRUE(ime_keyboard.caps_lock_is_enabled_);
[email protected]350c9232012-05-25 04:16:061241
1242 // Release Search.
kpschoedel8226fd152015-05-06 15:48:591243 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL,
1244 ui::DomCode::CAPS_LOCK, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351245 ui::DomKey::CAPS_LOCK),
penghuange5df2822017-03-16 22:54:361246 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_RELEASED,
dtapuskaaf863af2016-04-21 14:33:591247 ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:131248 ui::EF_NONE, ui::DomKey::META));
Weidong Guo9b390042017-10-29 19:07:431249 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_);
[email protected]350c9232012-05-25 04:16:061250
1251 // Press Caps Lock (on an external keyboard).
pkastingcc7f6ac2016-01-08 23:38:471252 EXPECT_EQ(GetExpectedResultAsString(
1253 ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
1254 ui::EF_CAPS_LOCK_ON | ui::EF_MOD3_DOWN, ui::DomKey::CAPS_LOCK),
penghuange5df2822017-03-16 22:54:361255 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED,
kpschoedel8226fd152015-05-06 15:48:591256 ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
pkastingcc7f6ac2016-01-08 23:38:471257 ui::EF_CAPS_LOCK_ON | ui::EF_MOD3_DOWN,
kpschoedel51d2e322015-08-28 15:29:351258 ui::DomKey::CAPS_LOCK));
Weidong Guo9b390042017-10-29 19:07:431259 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_);
[email protected]350c9232012-05-25 04:16:061260
[email protected]0f424fd92013-05-08 21:12:191261 // Release Caps Lock (on an external keyboard).
kpschoedel8226fd152015-05-06 15:48:591262 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL,
1263 ui::DomCode::CAPS_LOCK, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351264 ui::DomKey::CAPS_LOCK),
penghuange5df2822017-03-16 22:54:361265 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_RELEASED,
kpschoedel8226fd152015-05-06 15:48:591266 ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
kpschoedel51d2e322015-08-28 15:29:351267 ui::EF_NONE, ui::DomKey::CAPS_LOCK));
Weidong Guo9b390042017-10-29 19:07:431268 EXPECT_TRUE(ime_keyboard.caps_lock_is_enabled_);
[email protected]350c9232012-05-25 04:16:061269}
[email protected]4a822092012-06-15 03:42:511270
[email protected]d13e288992014-05-01 18:00:211271TEST_F(EventRewriterTest, TestRewriteCapsLock) {
penghuange5df2822017-03-16 22:54:361272 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]872ead342012-10-31 17:50:011273
[email protected]d13e288992014-05-01 18:00:211274 chromeos::input_method::FakeImeKeyboard ime_keyboard;
penghuange5df2822017-03-16 22:54:361275 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
1276 rewriter_->set_ime_keyboard_for_testing(&ime_keyboard);
[email protected]d13e288992014-05-01 18:00:211277 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_);
[email protected]872ead342012-10-31 17:50:011278
1279 // On Chrome OS, CapsLock is mapped to F16 with Mod3Mask.
pkastingcc7f6ac2016-01-08 23:38:471280 EXPECT_EQ(GetExpectedResultAsString(
1281 ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
1282 ui::EF_CAPS_LOCK_ON | ui::EF_MOD3_DOWN, ui::DomKey::CAPS_LOCK),
penghuange5df2822017-03-16 22:54:361283 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED,
kpschoedel8226fd152015-05-06 15:48:591284 ui::VKEY_F16, ui::DomCode::F16,
kpschoedel51d2e322015-08-28 15:29:351285 ui::EF_MOD3_DOWN, ui::DomKey::F16));
Weidong Guo9b390042017-10-29 19:07:431286 EXPECT_FALSE(ime_keyboard.caps_lock_is_enabled_);
1287
1288 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL,
1289 ui::DomCode::CAPS_LOCK, ui::EF_NONE,
1290 ui::DomKey::CAPS_LOCK),
1291 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_RELEASED,
1292 ui::VKEY_F16, ui::DomCode::F16,
1293 ui::EF_MOD3_DOWN, ui::DomKey::F16));
1294 EXPECT_TRUE(ime_keyboard.caps_lock_is_enabled_);
Weidong Guo4534b862017-11-10 03:17:051295
1296 // Remap Caps Lock to Control.
1297 IntegerPrefMember caps_lock;
1298 InitModifierKeyPref(&caps_lock, prefs::kLanguageRemapCapsLockKeyTo,
1299 ui::chromeos::ModifierKey::kControlKey);
1300
1301 // Press Caps Lock.
1302 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL,
1303 ui::DomCode::CONTROL_LEFT,
1304 ui::EF_CONTROL_DOWN, ui::DomKey::CONTROL),
1305 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED,
1306 ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
1307 ui::EF_CAPS_LOCK_ON | ui::EF_MOD3_DOWN,
1308 ui::DomKey::CAPS_LOCK));
1309
1310 // Release Caps Lock.
1311 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CONTROL,
1312 ui::DomCode::CONTROL_LEFT, ui::EF_NONE,
1313 ui::DomKey::CONTROL),
1314 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_RELEASED,
1315 ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
1316 ui::EF_NONE, ui::DomKey::CAPS_LOCK));
1317
1318 // Press F16.
1319 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL,
1320 ui::DomCode::CONTROL_LEFT,
1321 ui::EF_CONTROL_DOWN, ui::DomKey::CONTROL),
1322 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED,
1323 ui::VKEY_F16, ui::DomCode::F16,
1324 ui::EF_MOD3_DOWN, ui::DomKey::F16));
1325
1326 // Release F16.
1327 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CONTROL,
1328 ui::DomCode::CONTROL_LEFT, ui::EF_NONE,
1329 ui::DomKey::CONTROL),
1330 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_RELEASED,
1331 ui::VKEY_F16, ui::DomCode::F16,
1332 ui::EF_MOD3_DOWN, ui::DomKey::F16));
[email protected]872ead342012-10-31 17:50:011333}
1334
[email protected]d13e288992014-05-01 18:00:211335TEST_F(EventRewriterTest, TestRewriteDiamondKey) {
penghuange5df2822017-03-16 22:54:361336 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]25ab8f12013-02-01 14:30:151337
[email protected]d13e288992014-05-01 18:00:211338 chromeos::input_method::FakeImeKeyboard ime_keyboard;
penghuange5df2822017-03-16 22:54:361339 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
1340 rewriter_->set_ime_keyboard_for_testing(&ime_keyboard);
[email protected]25ab8f12013-02-01 14:30:151341
[email protected]106cf972014-05-28 17:28:171342 KeyTestCase tests[] = {
1343 // F15 should work as Ctrl when --has-chromeos-diamond-key is not
1344 // specified.
kpschoedel02c854d2015-06-16 14:44:291345 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351346 {ui::VKEY_F15, ui::DomCode::F15, ui::EF_NONE, ui::DomKey::F15},
1347 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
1348 ui::DomKey::CONTROL}},
[email protected]a0e25352013-02-07 02:03:191349
kpschoedel02c854d2015-06-16 14:44:291350 {ui::ET_KEY_RELEASED,
kpschoedel51d2e322015-08-28 15:29:351351 {ui::VKEY_F15, ui::DomCode::F15, ui::EF_NONE, ui::DomKey::F15},
1352 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_NONE,
1353 ui::DomKey::CONTROL}},
[email protected]d0eb7c92014-07-17 16:20:371354
[email protected]106cf972014-05-28 17:28:171355 // However, Mod2Mask should not be rewritten to CtrlMask when
1356 // --has-chromeos-diamond-key is not specified.
kpschoedel02c854d2015-06-16 14:44:291357 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:191358 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351359 ui::DomKey::Constant<'a'>::Character},
kpschoedela281bf12016-01-07 15:08:191360 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351361 ui::DomKey::Constant<'a'>::Character}},
[email protected]106cf972014-05-28 17:28:171362 };
1363
penghuange5df2822017-03-16 22:54:361364 for (const auto& test : tests)
1365 CheckKeyTestCase(rewriter_, test);
[email protected]25ab8f12013-02-01 14:30:151366}
[email protected]595079ce2014-07-11 22:25:131367
[email protected]d13e288992014-05-01 18:00:211368TEST_F(EventRewriterTest, TestRewriteDiamondKeyWithFlag) {
avi3ef9ec9e2014-12-22 22:50:171369 const base::CommandLine original_cl(*base::CommandLine::ForCurrentProcess());
1370 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
[email protected]2f2d6c32013-05-10 02:56:241371 chromeos::switches::kHasChromeOSDiamondKey, "");
[email protected]25ab8f12013-02-01 14:30:151372
penghuange5df2822017-03-16 22:54:361373 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]25ab8f12013-02-01 14:30:151374
[email protected]d13e288992014-05-01 18:00:211375 chromeos::input_method::FakeImeKeyboard ime_keyboard;
penghuange5df2822017-03-16 22:54:361376 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
1377 rewriter_->set_ime_keyboard_for_testing(&ime_keyboard);
[email protected]25ab8f12013-02-01 14:30:151378
1379 // By default, F15 should work as Control.
kpschoedel51d2e322015-08-28 15:29:351380 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL,
1381 ui::DomCode::CONTROL_LEFT,
1382 ui::EF_CONTROL_DOWN, ui::DomKey::CONTROL),
penghuange5df2822017-03-16 22:54:361383 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED,
kpschoedel8226fd152015-05-06 15:48:591384 ui::VKEY_F15, ui::DomCode::F15,
kpschoedel51d2e322015-08-28 15:29:351385 ui::EF_NONE, ui::DomKey::F15));
[email protected]d0eb7c92014-07-17 16:20:371386 // Check that Control is applied to a subsequent key press.
kpschoedel8226fd152015-05-06 15:48:591387 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191388 ui::DomCode::US_A, ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:531389 ui::DomKey::Constant<'a'>::Character),
penghuange5df2822017-03-16 22:54:361390 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191391 ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351392 ui::DomKey::Constant<'a'>::Character));
[email protected]d0eb7c92014-07-17 16:20:371393 // Release F15
kpschoedel8226fd152015-05-06 15:48:591394 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CONTROL,
1395 ui::DomCode::CONTROL_LEFT, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351396 ui::DomKey::CONTROL),
penghuange5df2822017-03-16 22:54:361397 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_RELEASED,
kpschoedel8226fd152015-05-06 15:48:591398 ui::VKEY_F15, ui::DomCode::F15,
kpschoedel51d2e322015-08-28 15:29:351399 ui::EF_NONE, ui::DomKey::F15));
[email protected]d0eb7c92014-07-17 16:20:371400 // Check that Control is no longer applied to a subsequent key press.
kpschoedel8226fd152015-05-06 15:48:591401 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191402 ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351403 ui::DomKey::Constant<'a'>::Character),
penghuange5df2822017-03-16 22:54:361404 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191405 ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351406 ui::DomKey::Constant<'a'>::Character));
[email protected]25ab8f12013-02-01 14:30:151407
1408 IntegerPrefMember diamond;
Blake O'Harea09fa45a2017-10-13 04:19:581409 InitModifierKeyPref(&diamond, prefs::kLanguageRemapDiamondKeyTo,
1410 ui::chromeos::ModifierKey::kVoidKey);
[email protected]25ab8f12013-02-01 14:30:151411
kpschoedel8226fd152015-05-06 15:48:591412 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_UNKNOWN,
1413 ui::DomCode::NONE, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351414 ui::DomKey::UNIDENTIFIED),
penghuange5df2822017-03-16 22:54:361415 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED,
kpschoedel8226fd152015-05-06 15:48:591416 ui::VKEY_F15, ui::DomCode::F15,
kpschoedel51d2e322015-08-28 15:29:351417 ui::EF_NONE, ui::DomKey::F15));
[email protected]d0eb7c92014-07-17 16:20:371418 // Check that no modifier is applied to another key.
kpschoedel8226fd152015-05-06 15:48:591419 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191420 ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351421 ui::DomKey::Constant<'a'>::Character),
penghuange5df2822017-03-16 22:54:361422 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191423 ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351424 ui::DomKey::Constant<'a'>::Character));
[email protected]25ab8f12013-02-01 14:30:151425
Blake O'Harea09fa45a2017-10-13 04:19:581426 InitModifierKeyPref(&diamond, prefs::kLanguageRemapDiamondKeyTo,
1427 ui::chromeos::ModifierKey::kControlKey);
[email protected]25ab8f12013-02-01 14:30:151428
kpschoedel51d2e322015-08-28 15:29:351429 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL,
1430 ui::DomCode::CONTROL_LEFT,
1431 ui::EF_CONTROL_DOWN, ui::DomKey::CONTROL),
penghuange5df2822017-03-16 22:54:361432 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED,
kpschoedel8226fd152015-05-06 15:48:591433 ui::VKEY_F15, ui::DomCode::F15,
kpschoedel51d2e322015-08-28 15:29:351434 ui::EF_NONE, ui::DomKey::F15));
[email protected]d0eb7c92014-07-17 16:20:371435 // Check that Control is applied to a subsequent key press.
kpschoedel8226fd152015-05-06 15:48:591436 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191437 ui::DomCode::US_A, ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:531438 ui::DomKey::Constant<'a'>::Character),
penghuange5df2822017-03-16 22:54:361439 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191440 ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351441 ui::DomKey::Constant<'a'>::Character));
[email protected]d0eb7c92014-07-17 16:20:371442 // Release F15
kpschoedel8226fd152015-05-06 15:48:591443 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CONTROL,
1444 ui::DomCode::CONTROL_LEFT, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351445 ui::DomKey::CONTROL),
penghuange5df2822017-03-16 22:54:361446 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_RELEASED,
kpschoedel8226fd152015-05-06 15:48:591447 ui::VKEY_F15, ui::DomCode::F15,
kpschoedel51d2e322015-08-28 15:29:351448 ui::EF_NONE, ui::DomKey::F15));
[email protected]d0eb7c92014-07-17 16:20:371449 // Check that Control is no longer applied to a subsequent key press.
kpschoedel8226fd152015-05-06 15:48:591450 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191451 ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351452 ui::DomKey::Constant<'a'>::Character),
penghuange5df2822017-03-16 22:54:361453 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191454 ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351455 ui::DomKey::Constant<'a'>::Character));
[email protected]25ab8f12013-02-01 14:30:151456
Blake O'Harea09fa45a2017-10-13 04:19:581457 InitModifierKeyPref(&diamond, prefs::kLanguageRemapDiamondKeyTo,
1458 ui::chromeos::ModifierKey::kAltKey);
[email protected]25ab8f12013-02-01 14:30:151459
kpschoedel8226fd152015-05-06 15:48:591460 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_MENU,
1461 ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN,
kpschoedel51d2e322015-08-28 15:29:351462 ui::DomKey::ALT),
penghuange5df2822017-03-16 22:54:361463 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED,
kpschoedel8226fd152015-05-06 15:48:591464 ui::VKEY_F15, ui::DomCode::F15,
kpschoedel51d2e322015-08-28 15:29:351465 ui::EF_NONE, ui::DomKey::F15));
[email protected]d0eb7c92014-07-17 16:20:371466 // Check that Alt is applied to a subsequent key press.
kpschoedel8226fd152015-05-06 15:48:591467 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191468 ui::DomCode::US_A, ui::EF_ALT_DOWN,
kpschoedel51d2e322015-08-28 15:29:351469 ui::DomKey::Constant<'a'>::Character),
penghuange5df2822017-03-16 22:54:361470 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191471 ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351472 ui::DomKey::Constant<'a'>::Character));
[email protected]d0eb7c92014-07-17 16:20:371473 // Release F15
kpschoedel8226fd152015-05-06 15:48:591474 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_MENU,
1475 ui::DomCode::ALT_LEFT, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351476 ui::DomKey::ALT),
penghuange5df2822017-03-16 22:54:361477 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_RELEASED,
kpschoedel8226fd152015-05-06 15:48:591478 ui::VKEY_F15, ui::DomCode::F15,
kpschoedel51d2e322015-08-28 15:29:351479 ui::EF_NONE, ui::DomKey::F15));
[email protected]d0eb7c92014-07-17 16:20:371480 // Check that Alt is no longer applied to a subsequent key press.
kpschoedel8226fd152015-05-06 15:48:591481 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191482 ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351483 ui::DomKey::Constant<'a'>::Character),
penghuange5df2822017-03-16 22:54:361484 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191485 ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351486 ui::DomKey::Constant<'a'>::Character));
[email protected]25ab8f12013-02-01 14:30:151487
Blake O'Harea09fa45a2017-10-13 04:19:581488 InitModifierKeyPref(&diamond, prefs::kLanguageRemapDiamondKeyTo,
1489 ui::chromeos::ModifierKey::kCapsLockKey);
[email protected]25ab8f12013-02-01 14:30:151490
pkastingcc7f6ac2016-01-08 23:38:471491 EXPECT_EQ(GetExpectedResultAsString(
1492 ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
1493 ui::EF_CAPS_LOCK_ON | ui::EF_MOD3_DOWN, ui::DomKey::CAPS_LOCK),
penghuange5df2822017-03-16 22:54:361494 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED,
kpschoedel8226fd152015-05-06 15:48:591495 ui::VKEY_F15, ui::DomCode::F15,
kpschoedel51d2e322015-08-28 15:29:351496 ui::EF_NONE, ui::DomKey::F15));
[email protected]d0eb7c92014-07-17 16:20:371497 // Check that Caps is applied to a subsequent key press.
kpschoedel8226fd152015-05-06 15:48:591498 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191499 ui::DomCode::US_A,
pkastingcc7f6ac2016-01-08 23:38:471500 ui::EF_CAPS_LOCK_ON | ui::EF_MOD3_DOWN,
kpschoedel51d2e322015-08-28 15:29:351501 ui::DomKey::Constant<'A'>::Character),
penghuange5df2822017-03-16 22:54:361502 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191503 ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351504 ui::DomKey::Constant<'a'>::Character));
[email protected]d0eb7c92014-07-17 16:20:371505 // Release F15
kpschoedel8226fd152015-05-06 15:48:591506 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL,
1507 ui::DomCode::CAPS_LOCK, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351508 ui::DomKey::CAPS_LOCK),
penghuange5df2822017-03-16 22:54:361509 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_RELEASED,
kpschoedel8226fd152015-05-06 15:48:591510 ui::VKEY_F15, ui::DomCode::F15,
kpschoedel51d2e322015-08-28 15:29:351511 ui::EF_NONE, ui::DomKey::F15));
[email protected]d0eb7c92014-07-17 16:20:371512 // Check that Control is no longer applied to a subsequent key press.
kpschoedel8226fd152015-05-06 15:48:591513 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191514 ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351515 ui::DomKey::Constant<'a'>::Character),
penghuange5df2822017-03-16 22:54:361516 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191517 ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351518 ui::DomKey::Constant<'a'>::Character));
[email protected]a0e25352013-02-07 02:03:191519
avi3ef9ec9e2014-12-22 22:50:171520 *base::CommandLine::ForCurrentProcess() = original_cl;
[email protected]25ab8f12013-02-01 14:30:151521}
1522
[email protected]872ead342012-10-31 17:50:011523TEST_F(EventRewriterTest, TestRewriteCapsLockToControl) {
[email protected]d13e288992014-05-01 18:00:211524 // Remap CapsLock to Control.
penghuange5df2822017-03-16 22:54:361525 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]872ead342012-10-31 17:50:011526 IntegerPrefMember control;
Blake O'Harea09fa45a2017-10-13 04:19:581527 InitModifierKeyPref(&control, prefs::kLanguageRemapCapsLockKeyTo,
1528 ui::chromeos::ModifierKey::kControlKey);
[email protected]872ead342012-10-31 17:50:011529
penghuange5df2822017-03-16 22:54:361530 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
[email protected]59409342012-09-21 01:03:431531
[email protected]106cf972014-05-28 17:28:171532 KeyTestCase tests[] = {
1533 // Press CapsLock+a. Confirm that Mod3Mask is rewritten to ControlMask.
1534 // On Chrome OS, CapsLock works as a Mod3 modifier.
kpschoedel02c854d2015-06-16 14:44:291535 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:191536 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_MOD3_DOWN,
kpschoedel51d2e322015-08-28 15:29:351537 ui::DomKey::Constant<'a'>::Character},
kpschoedela281bf12016-01-07 15:08:191538 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:531539 ui::DomKey::Constant<'a'>::Character}},
[email protected]59409342012-09-21 01:03:431540
[email protected]106cf972014-05-28 17:28:171541 // Press Control+CapsLock+a. Confirm that Mod3Mask is rewritten to
1542 // ControlMask
kpschoedel02c854d2015-06-16 14:44:291543 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:191544 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_CONTROL_DOWN | ui::EF_MOD3_DOWN,
kpschoedel51d2e322015-08-28 15:29:351545 ui::DomKey::Constant<'a'>::Character},
kpschoedela281bf12016-01-07 15:08:191546 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:531547 ui::DomKey::Constant<'a'>::Character}},
[email protected]59409342012-09-21 01:03:431548
[email protected]106cf972014-05-28 17:28:171549 // Press Alt+CapsLock+a. Confirm that Mod3Mask is rewritten to
1550 // ControlMask.
kpschoedel02c854d2015-06-16 14:44:291551 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:191552 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_MOD3_DOWN,
kpschoedel51d2e322015-08-28 15:29:351553 ui::DomKey::Constant<'a'>::Character},
kpschoedela281bf12016-01-07 15:08:191554 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:531555 ui::DomKey::Constant<'a'>::Character}},
[email protected]106cf972014-05-28 17:28:171556 };
1557
penghuange5df2822017-03-16 22:54:361558 for (const auto& test : tests)
1559 CheckKeyTestCase(rewriter_, test);
[email protected]59409342012-09-21 01:03:431560}
1561
[email protected]872ead342012-10-31 17:50:011562TEST_F(EventRewriterTest, TestRewriteCapsLockMod3InUse) {
1563 // Remap CapsLock to Control.
penghuange5df2822017-03-16 22:54:361564 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]872ead342012-10-31 17:50:011565 IntegerPrefMember control;
Blake O'Harea09fa45a2017-10-13 04:19:581566 InitModifierKeyPref(&control, prefs::kLanguageRemapCapsLockKeyTo,
1567 ui::chromeos::ModifierKey::kControlKey);
[email protected]872ead342012-10-31 17:50:011568
penghuange5df2822017-03-16 22:54:361569 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
[email protected]1488a035f2014-03-28 21:12:071570 input_method_manager_mock_->set_mod3_used(true);
[email protected]59409342012-09-21 01:03:431571
[email protected]872ead342012-10-31 17:50:011572 // Press CapsLock+a. Confirm that Mod3Mask is NOT rewritten to ControlMask
1573 // when Mod3Mask is already in use by the current XKB layout.
kpschoedel8226fd152015-05-06 15:48:591574 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191575 ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351576 ui::DomKey::Constant<'a'>::Character),
penghuange5df2822017-03-16 22:54:361577 GetRewrittenEventAsString(rewriter_, ui::ET_KEY_PRESSED, ui::VKEY_A,
kpschoedela281bf12016-01-07 15:08:191578 ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:351579 ui::DomKey::Constant<'a'>::Character));
[email protected]59409342012-09-21 01:03:431580
[email protected]1488a035f2014-03-28 21:12:071581 input_method_manager_mock_->set_mod3_used(false);
[email protected]59409342012-09-21 01:03:431582}
1583
[email protected]ab6e1a12012-12-04 00:13:371584TEST_F(EventRewriterTest, TestRewriteExtendedKeys) {
penghuange5df2822017-03-16 22:54:361585 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
1586 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
1587 rewriter_->set_last_keyboard_device_id_for_testing(kKeyboardDeviceId);
[email protected]4a822092012-06-15 03:42:511588
[email protected]106cf972014-05-28 17:28:171589 KeyTestCase tests[] = {
1590 // Alt+Backspace -> Delete
kpschoedel02c854d2015-06-16 14:44:291591 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351592 {ui::VKEY_BACK, ui::DomCode::BACKSPACE, ui::EF_ALT_DOWN,
1593 ui::DomKey::BACKSPACE},
1594 {ui::VKEY_DELETE, ui::DomCode::DEL, ui::EF_NONE, ui::DomKey::DEL}},
kpschoedel8226fd152015-05-06 15:48:591595 // Control+Alt+Backspace -> Control+Delete
kpschoedel02c854d2015-06-16 14:44:291596 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351597 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
1598 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::BACKSPACE},
1599 {ui::VKEY_DELETE, ui::DomCode::DEL, ui::EF_CONTROL_DOWN,
1600 ui::DomKey::DEL}},
kpschoedel8226fd152015-05-06 15:48:591601 // Search+Alt+Backspace -> Alt+Backspace
kpschoedel02c854d2015-06-16 14:44:291602 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351603 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
1604 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::BACKSPACE},
1605 {ui::VKEY_BACK, ui::DomCode::BACKSPACE, ui::EF_ALT_DOWN,
1606 ui::DomKey::BACKSPACE}},
kpschoedel8226fd152015-05-06 15:48:591607 // Search+Control+Alt+Backspace -> Control+Alt+Backspace
kpschoedel02c854d2015-06-16 14:44:291608 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351609 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
kpschoedel8226fd152015-05-06 15:48:591610 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
kpschoedel51d2e322015-08-28 15:29:351611 ui::DomKey::BACKSPACE},
1612 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
1613 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::BACKSPACE}},
[email protected]106cf972014-05-28 17:28:171614 // Alt+Up -> Prior
kpschoedel02c854d2015-06-16 14:44:291615 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351616 {ui::VKEY_UP, ui::DomCode::ARROW_UP, ui::EF_ALT_DOWN,
1617 ui::DomKey::ARROW_UP},
1618 {ui::VKEY_PRIOR, ui::DomCode::PAGE_UP, ui::EF_NONE,
1619 ui::DomKey::PAGE_UP}},
[email protected]106cf972014-05-28 17:28:171620 // Alt+Down -> Next
kpschoedel02c854d2015-06-16 14:44:291621 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351622 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN, ui::EF_ALT_DOWN,
1623 ui::DomKey::ARROW_DOWN},
1624 {ui::VKEY_NEXT, ui::DomCode::PAGE_DOWN, ui::EF_NONE,
1625 ui::DomKey::PAGE_DOWN}},
[email protected]106cf972014-05-28 17:28:171626 // Ctrl+Alt+Up -> Home
kpschoedel02c854d2015-06-16 14:44:291627 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351628 {ui::VKEY_UP, ui::DomCode::ARROW_UP,
1629 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_UP},
1630 {ui::VKEY_HOME, ui::DomCode::HOME, ui::EF_NONE, ui::DomKey::HOME}},
[email protected]106cf972014-05-28 17:28:171631 // Ctrl+Alt+Down -> End
kpschoedel02c854d2015-06-16 14:44:291632 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351633 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN,
1634 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_DOWN},
1635 {ui::VKEY_END, ui::DomCode::END, ui::EF_NONE, ui::DomKey::END}},
[email protected]750508d2012-12-18 00:52:581636
Qiang Xu47c04672017-11-09 03:01:371637 // Search+Ctrl+Alt+Up -> Ctrl+Alt+Up
kpschoedel02c854d2015-06-16 14:44:291638 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351639 {ui::VKEY_UP, ui::DomCode::ARROW_UP,
kpschoedel8226fd152015-05-06 15:48:591640 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
kpschoedel51d2e322015-08-28 15:29:351641 ui::DomKey::ARROW_UP},
1642 {ui::VKEY_UP, ui::DomCode::ARROW_UP,
1643 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_UP}},
kpschoedel8226fd152015-05-06 15:48:591644 // Search+Ctrl+Alt+Down -> Ctrl+Alt+Down
kpschoedel02c854d2015-06-16 14:44:291645 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351646 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN,
kpschoedel8226fd152015-05-06 15:48:591647 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
kpschoedel51d2e322015-08-28 15:29:351648 ui::DomKey::ARROW_DOWN},
1649 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN,
1650 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_DOWN}},
[email protected]750508d2012-12-18 00:52:581651
[email protected]106cf972014-05-28 17:28:171652 // Period -> Period
kpschoedel02c854d2015-06-16 14:44:291653 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351654 {ui::VKEY_OEM_PERIOD, ui::DomCode::PERIOD, ui::EF_NONE,
1655 ui::DomKey::Constant<'.'>::Character},
1656 {ui::VKEY_OEM_PERIOD, ui::DomCode::PERIOD, ui::EF_NONE,
1657 ui::DomKey::Constant<'.'>::Character}},
[email protected]3e035e82012-11-27 20:54:321658
[email protected]106cf972014-05-28 17:28:171659 // Search+Backspace -> Delete
kpschoedel02c854d2015-06-16 14:44:291660 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351661 {ui::VKEY_BACK, ui::DomCode::BACKSPACE, ui::EF_COMMAND_DOWN,
1662 ui::DomKey::BACKSPACE},
1663 {ui::VKEY_DELETE, ui::DomCode::DEL, ui::EF_NONE, ui::DomKey::DEL}},
[email protected]106cf972014-05-28 17:28:171664 // Search+Up -> Prior
kpschoedel02c854d2015-06-16 14:44:291665 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351666 {ui::VKEY_UP, ui::DomCode::ARROW_UP, ui::EF_COMMAND_DOWN,
1667 ui::DomKey::ARROW_UP},
1668 {ui::VKEY_PRIOR, ui::DomCode::PAGE_UP, ui::EF_NONE,
1669 ui::DomKey::PAGE_UP}},
[email protected]106cf972014-05-28 17:28:171670 // Search+Down -> Next
kpschoedel02c854d2015-06-16 14:44:291671 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351672 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN, ui::EF_COMMAND_DOWN,
1673 ui::DomKey::ARROW_DOWN},
1674 {ui::VKEY_NEXT, ui::DomCode::PAGE_DOWN, ui::EF_NONE,
1675 ui::DomKey::PAGE_DOWN}},
[email protected]106cf972014-05-28 17:28:171676 // Search+Left -> Home
kpschoedel02c854d2015-06-16 14:44:291677 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351678 {ui::VKEY_LEFT, ui::DomCode::ARROW_LEFT, ui::EF_COMMAND_DOWN,
1679 ui::DomKey::ARROW_LEFT},
1680 {ui::VKEY_HOME, ui::DomCode::HOME, ui::EF_NONE, ui::DomKey::HOME}},
[email protected]106cf972014-05-28 17:28:171681 // Control+Search+Left -> Home
kpschoedel02c854d2015-06-16 14:44:291682 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351683 {ui::VKEY_LEFT, ui::DomCode::ARROW_LEFT,
1684 ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_LEFT},
1685 {ui::VKEY_HOME, ui::DomCode::HOME, ui::EF_CONTROL_DOWN,
1686 ui::DomKey::HOME}},
[email protected]106cf972014-05-28 17:28:171687 // Search+Right -> End
kpschoedel02c854d2015-06-16 14:44:291688 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351689 {ui::VKEY_RIGHT, ui::DomCode::ARROW_RIGHT, ui::EF_COMMAND_DOWN,
1690 ui::DomKey::ARROW_RIGHT},
1691 {ui::VKEY_END, ui::DomCode::END, ui::EF_NONE, ui::DomKey::END}},
[email protected]106cf972014-05-28 17:28:171692 // Control+Search+Right -> End
kpschoedel02c854d2015-06-16 14:44:291693 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351694 {ui::VKEY_RIGHT, ui::DomCode::ARROW_RIGHT,
1695 ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_RIGHT},
1696 {ui::VKEY_END, ui::DomCode::END, ui::EF_CONTROL_DOWN, ui::DomKey::END}},
[email protected]106cf972014-05-28 17:28:171697 // Search+Period -> Insert
kpschoedel02c854d2015-06-16 14:44:291698 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351699 {ui::VKEY_OEM_PERIOD, ui::DomCode::PERIOD, ui::EF_COMMAND_DOWN,
1700 ui::DomKey::Constant<'.'>::Character},
1701 {ui::VKEY_INSERT, ui::DomCode::INSERT, ui::EF_NONE, ui::DomKey::INSERT}},
[email protected]106cf972014-05-28 17:28:171702 // Control+Search+Period -> Control+Insert
kpschoedel02c854d2015-06-16 14:44:291703 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351704 {ui::VKEY_OEM_PERIOD, ui::DomCode::PERIOD,
kpschoedel8226fd152015-05-06 15:48:591705 ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN,
kpschoedel51d2e322015-08-28 15:29:351706 ui::DomKey::Constant<'.'>::Character},
1707 {ui::VKEY_INSERT, ui::DomCode::INSERT, ui::EF_CONTROL_DOWN,
1708 ui::DomKey::INSERT}}};
[email protected]3e035e82012-11-27 20:54:321709
penghuange5df2822017-03-16 22:54:361710 for (const auto& test : tests)
1711 CheckKeyTestCase(rewriter_, test);
[email protected]f925a1a2012-11-30 07:27:521712}
[email protected]3e035e82012-11-27 20:54:321713
[email protected]f925a1a2012-11-30 07:27:521714TEST_F(EventRewriterTest, TestRewriteFunctionKeys) {
penghuange5df2822017-03-16 22:54:361715 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
1716 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
[email protected]3e035e82012-11-27 20:54:321717
kpschoedel8226fd152015-05-06 15:48:591718 KeyTestCase tests[] = {
[email protected]106cf972014-05-28 17:28:171719 // F1 -> Back
kpschoedel02c854d2015-06-16 14:44:291720 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351721 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1},
1722 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_NONE,
1723 ui::DomKey::BROWSER_BACK}},
kpschoedel02c854d2015-06-16 14:44:291724 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351725 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_CONTROL_DOWN, ui::DomKey::F1},
1726 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_CONTROL_DOWN,
1727 ui::DomKey::BROWSER_BACK}},
kpschoedel02c854d2015-06-16 14:44:291728 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351729 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_ALT_DOWN, ui::DomKey::F1},
1730 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_ALT_DOWN,
1731 ui::DomKey::BROWSER_BACK}},
[email protected]106cf972014-05-28 17:28:171732 // F2 -> Forward
kpschoedel02c854d2015-06-16 14:44:291733 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351734 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2},
1735 {ui::VKEY_BROWSER_FORWARD, ui::DomCode::BROWSER_FORWARD, ui::EF_NONE,
1736 ui::DomKey::BROWSER_FORWARD}},
kpschoedel02c854d2015-06-16 14:44:291737 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351738 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_CONTROL_DOWN, ui::DomKey::F2},
1739 {ui::VKEY_BROWSER_FORWARD, ui::DomCode::BROWSER_FORWARD,
1740 ui::EF_CONTROL_DOWN, ui::DomKey::BROWSER_FORWARD}},
kpschoedel02c854d2015-06-16 14:44:291741 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351742 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_ALT_DOWN, ui::DomKey::F2},
1743 {ui::VKEY_BROWSER_FORWARD, ui::DomCode::BROWSER_FORWARD, ui::EF_ALT_DOWN,
1744 ui::DomKey::BROWSER_FORWARD}},
[email protected]106cf972014-05-28 17:28:171745 // F3 -> Refresh
kpschoedel02c854d2015-06-16 14:44:291746 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351747 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3},
1748 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_NONE,
1749 ui::DomKey::BROWSER_REFRESH}},
kpschoedel02c854d2015-06-16 14:44:291750 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351751 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_CONTROL_DOWN, ui::DomKey::F3},
1752 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH,
1753 ui::EF_CONTROL_DOWN, ui::DomKey::BROWSER_REFRESH}},
kpschoedel02c854d2015-06-16 14:44:291754 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351755 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_ALT_DOWN, ui::DomKey::F3},
1756 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_ALT_DOWN,
1757 ui::DomKey::BROWSER_REFRESH}},
[email protected]106cf972014-05-28 17:28:171758 // F4 -> Launch App 2
kpschoedel02c854d2015-06-16 14:44:291759 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351760 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4},
1761 {ui::VKEY_MEDIA_LAUNCH_APP2, ui::DomCode::ZOOM_TOGGLE, ui::EF_NONE,
1762 ui::DomKey::ZOOM_TOGGLE}},
kpschoedel02c854d2015-06-16 14:44:291763 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351764 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_CONTROL_DOWN, ui::DomKey::F4},
1765 {ui::VKEY_MEDIA_LAUNCH_APP2, ui::DomCode::ZOOM_TOGGLE,
1766 ui::EF_CONTROL_DOWN, ui::DomKey::ZOOM_TOGGLE}},
kpschoedel02c854d2015-06-16 14:44:291767 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351768 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_ALT_DOWN, ui::DomKey::F4},
1769 {ui::VKEY_MEDIA_LAUNCH_APP2, ui::DomCode::ZOOM_TOGGLE, ui::EF_ALT_DOWN,
1770 ui::DomKey::ZOOM_TOGGLE}},
[email protected]106cf972014-05-28 17:28:171771 // F5 -> Launch App 1
kpschoedel02c854d2015-06-16 14:44:291772 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351773 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5},
1774 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::SELECT_TASK, ui::EF_NONE,
1775 ui::DomKey::LAUNCH_MY_COMPUTER}},
kpschoedel02c854d2015-06-16 14:44:291776 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351777 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_CONTROL_DOWN, ui::DomKey::F5},
1778 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::SELECT_TASK,
1779 ui::EF_CONTROL_DOWN, ui::DomKey::LAUNCH_MY_COMPUTER}},
kpschoedel02c854d2015-06-16 14:44:291780 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351781 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_ALT_DOWN, ui::DomKey::F5},
1782 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::SELECT_TASK, ui::EF_ALT_DOWN,
1783 ui::DomKey::LAUNCH_MY_COMPUTER}},
[email protected]106cf972014-05-28 17:28:171784 // F6 -> Brightness down
kpschoedel02c854d2015-06-16 14:44:291785 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351786 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6},
1787 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN, ui::EF_NONE,
1788 ui::DomKey::BRIGHTNESS_DOWN}},
kpschoedel02c854d2015-06-16 14:44:291789 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351790 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_CONTROL_DOWN, ui::DomKey::F6},
1791 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN,
1792 ui::EF_CONTROL_DOWN, ui::DomKey::BRIGHTNESS_DOWN}},
kpschoedel02c854d2015-06-16 14:44:291793 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351794 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_ALT_DOWN, ui::DomKey::F6},
1795 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN, ui::EF_ALT_DOWN,
1796 ui::DomKey::BRIGHTNESS_DOWN}},
[email protected]106cf972014-05-28 17:28:171797 // F7 -> Brightness up
kpschoedel02c854d2015-06-16 14:44:291798 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351799 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7},
1800 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_NONE,
1801 ui::DomKey::BRIGHTNESS_UP}},
kpschoedel02c854d2015-06-16 14:44:291802 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351803 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_CONTROL_DOWN, ui::DomKey::F7},
1804 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_CONTROL_DOWN,
1805 ui::DomKey::BRIGHTNESS_UP}},
kpschoedel02c854d2015-06-16 14:44:291806 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351807 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_ALT_DOWN, ui::DomKey::F7},
1808 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_ALT_DOWN,
1809 ui::DomKey::BRIGHTNESS_UP}},
[email protected]106cf972014-05-28 17:28:171810 // F8 -> Volume Mute
kpschoedel02c854d2015-06-16 14:44:291811 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351812 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8},
1813 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_NONE,
kpschoedel0a8b03052016-02-17 15:35:131814 ui::DomKey::AUDIO_VOLUME_MUTE}},
kpschoedel02c854d2015-06-16 14:44:291815 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351816 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_CONTROL_DOWN, ui::DomKey::F8},
1817 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_CONTROL_DOWN,
kpschoedel0a8b03052016-02-17 15:35:131818 ui::DomKey::AUDIO_VOLUME_MUTE}},
kpschoedel02c854d2015-06-16 14:44:291819 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351820 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_ALT_DOWN, ui::DomKey::F8},
1821 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_ALT_DOWN,
kpschoedel0a8b03052016-02-17 15:35:131822 ui::DomKey::AUDIO_VOLUME_MUTE}},
[email protected]106cf972014-05-28 17:28:171823 // F9 -> Volume Down
kpschoedel02c854d2015-06-16 14:44:291824 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351825 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9},
1826 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_NONE,
kpschoedel0a8b03052016-02-17 15:35:131827 ui::DomKey::AUDIO_VOLUME_DOWN}},
kpschoedel02c854d2015-06-16 14:44:291828 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351829 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_CONTROL_DOWN, ui::DomKey::F9},
1830 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_CONTROL_DOWN,
kpschoedel0a8b03052016-02-17 15:35:131831 ui::DomKey::AUDIO_VOLUME_DOWN}},
kpschoedel02c854d2015-06-16 14:44:291832 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351833 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_ALT_DOWN, ui::DomKey::F9},
1834 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_ALT_DOWN,
kpschoedel0a8b03052016-02-17 15:35:131835 ui::DomKey::AUDIO_VOLUME_DOWN}},
[email protected]106cf972014-05-28 17:28:171836 // F10 -> Volume Up
kpschoedel02c854d2015-06-16 14:44:291837 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351838 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10},
1839 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_NONE,
kpschoedel0a8b03052016-02-17 15:35:131840 ui::DomKey::AUDIO_VOLUME_UP}},
kpschoedel02c854d2015-06-16 14:44:291841 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351842 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_CONTROL_DOWN, ui::DomKey::F10},
1843 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_CONTROL_DOWN,
kpschoedel0a8b03052016-02-17 15:35:131844 ui::DomKey::AUDIO_VOLUME_UP}},
kpschoedel02c854d2015-06-16 14:44:291845 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351846 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_ALT_DOWN, ui::DomKey::F10},
1847 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_ALT_DOWN,
kpschoedel0a8b03052016-02-17 15:35:131848 ui::DomKey::AUDIO_VOLUME_UP}},
[email protected]106cf972014-05-28 17:28:171849 // F11 -> F11
kpschoedel02c854d2015-06-16 14:44:291850 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351851 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11},
1852 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}},
kpschoedel02c854d2015-06-16 14:44:291853 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351854 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_CONTROL_DOWN, ui::DomKey::F11},
1855 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_CONTROL_DOWN, ui::DomKey::F11}},
kpschoedel02c854d2015-06-16 14:44:291856 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351857 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_ALT_DOWN, ui::DomKey::F11},
1858 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_ALT_DOWN, ui::DomKey::F11}},
[email protected]106cf972014-05-28 17:28:171859 // F12 -> F12
kpschoedel02c854d2015-06-16 14:44:291860 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351861 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12},
1862 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
kpschoedel02c854d2015-06-16 14:44:291863 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351864 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12},
1865 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12}},
kpschoedel02c854d2015-06-16 14:44:291866 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351867 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_ALT_DOWN, ui::DomKey::F12},
1868 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_ALT_DOWN, ui::DomKey::F12}},
[email protected]750508d2012-12-18 00:52:581869
[email protected]106cf972014-05-28 17:28:171870 // The number row should not be rewritten without Search key.
kpschoedel02c854d2015-06-16 14:44:291871 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351872 {ui::VKEY_1, ui::DomCode::DIGIT1, ui::EF_NONE,
1873 ui::DomKey::Constant<'1'>::Character},
1874 {ui::VKEY_1, ui::DomCode::DIGIT1, ui::EF_NONE,
1875 ui::DomKey::Constant<'1'>::Character}},
kpschoedel02c854d2015-06-16 14:44:291876 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351877 {ui::VKEY_2, ui::DomCode::DIGIT2, ui::EF_NONE,
1878 ui::DomKey::Constant<'2'>::Character},
1879 {ui::VKEY_2, ui::DomCode::DIGIT2, ui::EF_NONE,
1880 ui::DomKey::Constant<'2'>::Character}},
kpschoedel02c854d2015-06-16 14:44:291881 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351882 {ui::VKEY_3, ui::DomCode::DIGIT3, ui::EF_NONE,
1883 ui::DomKey::Constant<'3'>::Character},
1884 {ui::VKEY_3, ui::DomCode::DIGIT3, ui::EF_NONE,
1885 ui::DomKey::Constant<'3'>::Character}},
kpschoedel02c854d2015-06-16 14:44:291886 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351887 {ui::VKEY_4, ui::DomCode::DIGIT4, ui::EF_NONE,
1888 ui::DomKey::Constant<'4'>::Character},
1889 {ui::VKEY_4, ui::DomCode::DIGIT4, ui::EF_NONE,
1890 ui::DomKey::Constant<'4'>::Character}},
kpschoedel02c854d2015-06-16 14:44:291891 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351892 {ui::VKEY_5, ui::DomCode::DIGIT5, ui::EF_NONE,
1893 ui::DomKey::Constant<'5'>::Character},
1894 {ui::VKEY_5, ui::DomCode::DIGIT5, ui::EF_NONE,
1895 ui::DomKey::Constant<'5'>::Character}},
kpschoedel02c854d2015-06-16 14:44:291896 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351897 {ui::VKEY_6, ui::DomCode::DIGIT6, ui::EF_NONE,
1898 ui::DomKey::Constant<'6'>::Character},
1899 {ui::VKEY_6, ui::DomCode::DIGIT6, ui::EF_NONE,
1900 ui::DomKey::Constant<'6'>::Character}},
kpschoedel02c854d2015-06-16 14:44:291901 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351902 {ui::VKEY_7, ui::DomCode::DIGIT7, ui::EF_NONE,
1903 ui::DomKey::Constant<'7'>::Character},
1904 {ui::VKEY_7, ui::DomCode::DIGIT7, ui::EF_NONE,
1905 ui::DomKey::Constant<'7'>::Character}},
kpschoedel02c854d2015-06-16 14:44:291906 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351907 {ui::VKEY_8, ui::DomCode::DIGIT8, ui::EF_NONE,
1908 ui::DomKey::Constant<'8'>::Character},
1909 {ui::VKEY_8, ui::DomCode::DIGIT8, ui::EF_NONE,
1910 ui::DomKey::Constant<'8'>::Character}},
kpschoedel02c854d2015-06-16 14:44:291911 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351912 {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_NONE,
1913 ui::DomKey::Constant<'9'>::Character},
1914 {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_NONE,
1915 ui::DomKey::Constant<'9'>::Character}},
kpschoedel02c854d2015-06-16 14:44:291916 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351917 {ui::VKEY_0, ui::DomCode::DIGIT0, ui::EF_NONE,
1918 ui::DomKey::Constant<'0'>::Character},
1919 {ui::VKEY_0, ui::DomCode::DIGIT0, ui::EF_NONE,
1920 ui::DomKey::Constant<'0'>::Character}},
kpschoedel02c854d2015-06-16 14:44:291921 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351922 {ui::VKEY_OEM_MINUS, ui::DomCode::MINUS, ui::EF_NONE,
1923 ui::DomKey::Constant<'-'>::Character},
1924 {ui::VKEY_OEM_MINUS, ui::DomCode::MINUS, ui::EF_NONE,
1925 ui::DomKey::Constant<'-'>::Character}},
kpschoedel02c854d2015-06-16 14:44:291926 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351927 {ui::VKEY_OEM_PLUS, ui::DomCode::EQUAL, ui::EF_NONE,
1928 ui::DomKey::Constant<'='>::Character},
1929 {ui::VKEY_OEM_PLUS, ui::DomCode::EQUAL, ui::EF_NONE,
1930 ui::DomKey::Constant<'='>::Character}},
[email protected]750508d2012-12-18 00:52:581931
[email protected]106cf972014-05-28 17:28:171932 // The number row should be rewritten as the F<number> row with Search
1933 // key.
kpschoedel02c854d2015-06-16 14:44:291934 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351935 {ui::VKEY_1, ui::DomCode::DIGIT1, ui::EF_COMMAND_DOWN,
1936 ui::DomKey::Constant<'1'>::Character},
1937 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1}},
kpschoedel02c854d2015-06-16 14:44:291938 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351939 {ui::VKEY_2, ui::DomCode::DIGIT2, ui::EF_COMMAND_DOWN,
1940 ui::DomKey::Constant<'2'>::Character},
1941 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2}},
kpschoedel02c854d2015-06-16 14:44:291942 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351943 {ui::VKEY_3, ui::DomCode::DIGIT3, ui::EF_COMMAND_DOWN,
1944 ui::DomKey::Constant<'3'>::Character},
1945 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3}},
kpschoedel02c854d2015-06-16 14:44:291946 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351947 {ui::VKEY_4, ui::DomCode::DIGIT4, ui::EF_COMMAND_DOWN,
1948 ui::DomKey::Constant<'4'>::Character},
1949 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4}},
kpschoedel02c854d2015-06-16 14:44:291950 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351951 {ui::VKEY_5, ui::DomCode::DIGIT5, ui::EF_COMMAND_DOWN,
1952 ui::DomKey::Constant<'5'>::Character},
1953 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5}},
kpschoedel02c854d2015-06-16 14:44:291954 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351955 {ui::VKEY_6, ui::DomCode::DIGIT6, ui::EF_COMMAND_DOWN,
1956 ui::DomKey::Constant<'6'>::Character},
1957 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6}},
kpschoedel02c854d2015-06-16 14:44:291958 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351959 {ui::VKEY_7, ui::DomCode::DIGIT7, ui::EF_COMMAND_DOWN,
1960 ui::DomKey::Constant<'7'>::Character},
1961 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7}},
kpschoedel02c854d2015-06-16 14:44:291962 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351963 {ui::VKEY_8, ui::DomCode::DIGIT8, ui::EF_COMMAND_DOWN,
1964 ui::DomKey::Constant<'8'>::Character},
1965 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8}},
kpschoedel02c854d2015-06-16 14:44:291966 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351967 {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_COMMAND_DOWN,
1968 ui::DomKey::Constant<'9'>::Character},
1969 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9}},
kpschoedel02c854d2015-06-16 14:44:291970 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351971 {ui::VKEY_0, ui::DomCode::DIGIT0, ui::EF_COMMAND_DOWN,
1972 ui::DomKey::Constant<'0'>::Character},
1973 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10}},
kpschoedel02c854d2015-06-16 14:44:291974 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351975 {ui::VKEY_OEM_MINUS, ui::DomCode::MINUS, ui::EF_COMMAND_DOWN,
1976 ui::DomKey::Constant<'-'>::Character},
1977 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}},
kpschoedel02c854d2015-06-16 14:44:291978 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351979 {ui::VKEY_OEM_PLUS, ui::DomCode::EQUAL, ui::EF_COMMAND_DOWN,
1980 ui::DomKey::Constant<'='>::Character},
1981 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
[email protected]750508d2012-12-18 00:52:581982
[email protected]106cf972014-05-28 17:28:171983 // The function keys should not be rewritten with Search key pressed.
kpschoedel02c854d2015-06-16 14:44:291984 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351985 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_COMMAND_DOWN, ui::DomKey::F1},
1986 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1}},
kpschoedel02c854d2015-06-16 14:44:291987 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351988 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_COMMAND_DOWN, ui::DomKey::F2},
1989 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2}},
kpschoedel02c854d2015-06-16 14:44:291990 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351991 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_COMMAND_DOWN, ui::DomKey::F3},
1992 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3}},
kpschoedel02c854d2015-06-16 14:44:291993 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351994 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_COMMAND_DOWN, ui::DomKey::F4},
1995 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4}},
kpschoedel02c854d2015-06-16 14:44:291996 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351997 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_COMMAND_DOWN, ui::DomKey::F5},
1998 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5}},
kpschoedel02c854d2015-06-16 14:44:291999 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352000 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_COMMAND_DOWN, ui::DomKey::F6},
2001 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6}},
kpschoedel02c854d2015-06-16 14:44:292002 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352003 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_COMMAND_DOWN, ui::DomKey::F7},
2004 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7}},
kpschoedel02c854d2015-06-16 14:44:292005 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352006 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_COMMAND_DOWN, ui::DomKey::F8},
2007 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8}},
kpschoedel02c854d2015-06-16 14:44:292008 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352009 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_COMMAND_DOWN, ui::DomKey::F9},
2010 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9}},
kpschoedel02c854d2015-06-16 14:44:292011 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352012 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_COMMAND_DOWN, ui::DomKey::F10},
2013 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10}},
kpschoedel02c854d2015-06-16 14:44:292014 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352015 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_COMMAND_DOWN, ui::DomKey::F11},
2016 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}},
kpschoedel02c854d2015-06-16 14:44:292017 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352018 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_COMMAND_DOWN, ui::DomKey::F12},
2019 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}}};
[email protected]f925a1a2012-11-30 07:27:522020
penghuange5df2822017-03-16 22:54:362021 for (const auto& test : tests)
2022 CheckKeyTestCase(rewriter_, test);
[email protected]4a822092012-06-15 03:42:512023}
2024
Dmitry Torokhov0bcc3cf2017-07-15 17:50:302025TEST_F(EventRewriterTest, TestRewriteFunctionKeysLayout2) {
2026 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
2027 rewriter_->KeyboardDeviceAddedForTesting(
2028 kKeyboardDeviceId, "PC Keyboard",
2029 ui::EventRewriterChromeOS::kKbdTopRowLayout2);
2030
2031 KeyTestCase tests[] = {
2032 // F1 -> Back
2033 {ui::ET_KEY_PRESSED,
2034 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1},
2035 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_NONE,
2036 ui::DomKey::BROWSER_BACK}},
2037 {ui::ET_KEY_PRESSED,
2038 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_CONTROL_DOWN, ui::DomKey::F1},
2039 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_CONTROL_DOWN,
2040 ui::DomKey::BROWSER_BACK}},
2041 {ui::ET_KEY_PRESSED,
2042 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_ALT_DOWN, ui::DomKey::F1},
2043 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_ALT_DOWN,
2044 ui::DomKey::BROWSER_BACK}},
2045 // F2 -> Refresh
2046 {ui::ET_KEY_PRESSED,
2047 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2},
2048 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_NONE,
2049 ui::DomKey::BROWSER_REFRESH}},
2050 {ui::ET_KEY_PRESSED,
2051 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_CONTROL_DOWN, ui::DomKey::F2},
2052 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH,
2053 ui::EF_CONTROL_DOWN, ui::DomKey::BROWSER_REFRESH}},
2054 {ui::ET_KEY_PRESSED,
2055 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_ALT_DOWN, ui::DomKey::F2},
2056 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_ALT_DOWN,
2057 ui::DomKey::BROWSER_REFRESH}},
2058 // F3 -> Launch App 2
2059 {ui::ET_KEY_PRESSED,
2060 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3},
2061 {ui::VKEY_MEDIA_LAUNCH_APP2, ui::DomCode::ZOOM_TOGGLE, ui::EF_NONE,
2062 ui::DomKey::ZOOM_TOGGLE}},
2063 {ui::ET_KEY_PRESSED,
2064 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_CONTROL_DOWN, ui::DomKey::F3},
2065 {ui::VKEY_MEDIA_LAUNCH_APP2, ui::DomCode::ZOOM_TOGGLE,
2066 ui::EF_CONTROL_DOWN, ui::DomKey::ZOOM_TOGGLE}},
2067 {ui::ET_KEY_PRESSED,
2068 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_ALT_DOWN, ui::DomKey::F3},
2069 {ui::VKEY_MEDIA_LAUNCH_APP2, ui::DomCode::ZOOM_TOGGLE, ui::EF_ALT_DOWN,
2070 ui::DomKey::ZOOM_TOGGLE}},
2071 // F4 -> Launch App 1
2072 {ui::ET_KEY_PRESSED,
2073 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4},
2074 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::SELECT_TASK, ui::EF_NONE,
2075 ui::DomKey::LAUNCH_MY_COMPUTER}},
2076 {ui::ET_KEY_PRESSED,
2077 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_CONTROL_DOWN, ui::DomKey::F4},
2078 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::SELECT_TASK,
2079 ui::EF_CONTROL_DOWN, ui::DomKey::LAUNCH_MY_COMPUTER}},
2080 {ui::ET_KEY_PRESSED,
2081 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_ALT_DOWN, ui::DomKey::F4},
2082 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::SELECT_TASK, ui::EF_ALT_DOWN,
2083 ui::DomKey::LAUNCH_MY_COMPUTER}},
2084 // F5 -> Brightness down
2085 {ui::ET_KEY_PRESSED,
2086 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5},
2087 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN, ui::EF_NONE,
2088 ui::DomKey::BRIGHTNESS_DOWN}},
2089 {ui::ET_KEY_PRESSED,
2090 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_CONTROL_DOWN, ui::DomKey::F5},
2091 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN,
2092 ui::EF_CONTROL_DOWN, ui::DomKey::BRIGHTNESS_DOWN}},
2093 {ui::ET_KEY_PRESSED,
2094 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_ALT_DOWN, ui::DomKey::F5},
2095 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN, ui::EF_ALT_DOWN,
2096 ui::DomKey::BRIGHTNESS_DOWN}},
2097 // F6 -> Brightness up
2098 {ui::ET_KEY_PRESSED,
2099 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6},
2100 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_NONE,
2101 ui::DomKey::BRIGHTNESS_UP}},
2102 {ui::ET_KEY_PRESSED,
2103 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_CONTROL_DOWN, ui::DomKey::F6},
2104 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_CONTROL_DOWN,
2105 ui::DomKey::BRIGHTNESS_UP}},
2106 {ui::ET_KEY_PRESSED,
2107 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_ALT_DOWN, ui::DomKey::F6},
2108 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_ALT_DOWN,
2109 ui::DomKey::BRIGHTNESS_UP}},
2110 // F7 -> Media Play/Pause
2111 {ui::ET_KEY_PRESSED,
2112 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7},
2113 {ui::VKEY_MEDIA_PLAY_PAUSE, ui::DomCode::MEDIA_PLAY_PAUSE, ui::EF_NONE,
2114 ui::DomKey::MEDIA_PLAY_PAUSE}},
2115 {ui::ET_KEY_PRESSED,
2116 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_CONTROL_DOWN, ui::DomKey::F7},
2117 {ui::VKEY_MEDIA_PLAY_PAUSE, ui::DomCode::MEDIA_PLAY_PAUSE,
2118 ui::EF_CONTROL_DOWN, ui::DomKey::MEDIA_PLAY_PAUSE}},
2119 {ui::ET_KEY_PRESSED,
2120 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_ALT_DOWN, ui::DomKey::F7},
2121 {ui::VKEY_MEDIA_PLAY_PAUSE, ui::DomCode::MEDIA_PLAY_PAUSE,
2122 ui::EF_ALT_DOWN, ui::DomKey::MEDIA_PLAY_PAUSE}},
2123 // F8 -> Volume Mute
2124 {ui::ET_KEY_PRESSED,
2125 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8},
2126 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_NONE,
2127 ui::DomKey::AUDIO_VOLUME_MUTE}},
2128 {ui::ET_KEY_PRESSED,
2129 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_CONTROL_DOWN, ui::DomKey::F8},
2130 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_CONTROL_DOWN,
2131 ui::DomKey::AUDIO_VOLUME_MUTE}},
2132 {ui::ET_KEY_PRESSED,
2133 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_ALT_DOWN, ui::DomKey::F8},
2134 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_ALT_DOWN,
2135 ui::DomKey::AUDIO_VOLUME_MUTE}},
2136 // F9 -> Volume Down
2137 {ui::ET_KEY_PRESSED,
2138 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9},
2139 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_NONE,
2140 ui::DomKey::AUDIO_VOLUME_DOWN}},
2141 {ui::ET_KEY_PRESSED,
2142 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_CONTROL_DOWN, ui::DomKey::F9},
2143 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_CONTROL_DOWN,
2144 ui::DomKey::AUDIO_VOLUME_DOWN}},
2145 {ui::ET_KEY_PRESSED,
2146 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_ALT_DOWN, ui::DomKey::F9},
2147 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_ALT_DOWN,
2148 ui::DomKey::AUDIO_VOLUME_DOWN}},
2149 // F10 -> Volume Up
2150 {ui::ET_KEY_PRESSED,
2151 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10},
2152 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_NONE,
2153 ui::DomKey::AUDIO_VOLUME_UP}},
2154 {ui::ET_KEY_PRESSED,
2155 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_CONTROL_DOWN, ui::DomKey::F10},
2156 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_CONTROL_DOWN,
2157 ui::DomKey::AUDIO_VOLUME_UP}},
2158 {ui::ET_KEY_PRESSED,
2159 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_ALT_DOWN, ui::DomKey::F10},
2160 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_ALT_DOWN,
2161 ui::DomKey::AUDIO_VOLUME_UP}},
2162 // F11 -> F11
2163 {ui::ET_KEY_PRESSED,
2164 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11},
2165 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}},
2166 {ui::ET_KEY_PRESSED,
2167 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_CONTROL_DOWN, ui::DomKey::F11},
2168 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_CONTROL_DOWN, ui::DomKey::F11}},
2169 {ui::ET_KEY_PRESSED,
2170 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_ALT_DOWN, ui::DomKey::F11},
2171 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_ALT_DOWN, ui::DomKey::F11}},
2172 // F12 -> F12
2173 {ui::ET_KEY_PRESSED,
2174 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12},
2175 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
2176 {ui::ET_KEY_PRESSED,
2177 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12},
2178 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12}},
2179 {ui::ET_KEY_PRESSED,
2180 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_ALT_DOWN, ui::DomKey::F12},
2181 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_ALT_DOWN, ui::DomKey::F12}}};
2182
2183 for (const auto& test : tests)
2184 CheckKeyTestCase(rewriter_, test);
2185}
2186
Ahmed Fakhryaa02b4e2017-11-13 21:43:322187TEST_F(EventRewriterTest, TestRewriteFunctionKeysInvalidLayout) {
2188 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
2189
2190 // Not adding a keyboard simulates a failure in getting top row layout, which
2191 // will fallback to Layout1 in which case keys are rewritten to their default
2192 // values.
2193 KeyTestCase invalid_layout_tests[] = {
2194 // F2 -> Forward
2195 {ui::ET_KEY_PRESSED,
2196 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2},
2197 {ui::VKEY_BROWSER_FORWARD, ui::DomCode::BROWSER_FORWARD, ui::EF_NONE,
2198 ui::DomKey::BROWSER_FORWARD}},
2199 // F3 -> Refresh
2200 {ui::ET_KEY_PRESSED,
2201 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3},
2202 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_NONE,
2203 ui::DomKey::BROWSER_REFRESH}},
2204 // F4 -> Launch App 2
2205 {ui::ET_KEY_PRESSED,
2206 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4},
2207 {ui::VKEY_MEDIA_LAUNCH_APP2, ui::DomCode::ZOOM_TOGGLE, ui::EF_NONE,
2208 ui::DomKey::ZOOM_TOGGLE}},
2209 // F7 -> Brightness up
2210 {ui::ET_KEY_PRESSED,
2211 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7},
2212 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_NONE,
2213 ui::DomKey::BRIGHTNESS_UP}}};
2214
2215 for (const auto& test : invalid_layout_tests)
2216 CheckKeyTestCase(rewriter_, test);
2217
2218 // Adding a keyboard with a valid layout will take effect.
2219 rewriter_->KeyboardDeviceAddedForTesting(
2220 kKeyboardDeviceId, "PC Keyboard",
2221 ui::EventRewriterChromeOS::kKbdTopRowLayout2);
2222 KeyTestCase layout2_tests[] = {
2223 // F2 -> Refresh
2224 {ui::ET_KEY_PRESSED,
2225 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2},
2226 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_NONE,
2227 ui::DomKey::BROWSER_REFRESH}},
2228 // F3 -> Launch App 2
2229 {ui::ET_KEY_PRESSED,
2230 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3},
2231 {ui::VKEY_MEDIA_LAUNCH_APP2, ui::DomCode::ZOOM_TOGGLE, ui::EF_NONE,
2232 ui::DomKey::ZOOM_TOGGLE}},
2233 // F4 -> Launch App 1
2234 {ui::ET_KEY_PRESSED,
2235 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4},
2236 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::SELECT_TASK, ui::EF_NONE,
2237 ui::DomKey::LAUNCH_MY_COMPUTER}},
2238 // F7 -> Media Play/Pause
2239 {ui::ET_KEY_PRESSED,
2240 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7},
2241 {ui::VKEY_MEDIA_PLAY_PAUSE, ui::DomCode::MEDIA_PLAY_PAUSE, ui::EF_NONE,
2242 ui::DomKey::MEDIA_PLAY_PAUSE}}};
2243
2244 for (const auto& test : layout2_tests)
2245 CheckKeyTestCase(rewriter_, test);
2246}
2247
[email protected]ab6e1a12012-12-04 00:13:372248TEST_F(EventRewriterTest, TestRewriteExtendedKeysWithSearchRemapped) {
[email protected]4a822092012-06-15 03:42:512249 // Remap Search to Control.
penghuange5df2822017-03-16 22:54:362250 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]4a822092012-06-15 03:42:512251 IntegerPrefMember search;
Blake O'Harea09fa45a2017-10-13 04:19:582252 InitModifierKeyPref(&search, prefs::kLanguageRemapSearchKeyTo,
2253 ui::chromeos::ModifierKey::kControlKey);
[email protected]4a822092012-06-15 03:42:512254
penghuange5df2822017-03-16 22:54:362255 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
[email protected]4a822092012-06-15 03:42:512256
[email protected]106cf972014-05-28 17:28:172257 KeyTestCase tests[] = {
2258 // Alt+Search+Down -> End
kpschoedel02c854d2015-06-16 14:44:292259 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352260 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN,
2261 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, ui::DomKey::ARROW_DOWN},
2262 {ui::VKEY_END, ui::DomCode::END, ui::EF_NONE, ui::DomKey::END}},
[email protected]4a822092012-06-15 03:42:512263
[email protected]106cf972014-05-28 17:28:172264 // Shift+Alt+Search+Down -> Shift+End
kpschoedel02c854d2015-06-16 14:44:292265 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352266 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN,
kpschoedel8226fd152015-05-06 15:48:592267 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:352268 ui::DomKey::ARROW_DOWN},
2269 {ui::VKEY_END, ui::DomCode::END, ui::EF_SHIFT_DOWN, ui::DomKey::END}},
[email protected]106cf972014-05-28 17:28:172270 };
2271
penghuange5df2822017-03-16 22:54:362272 for (const auto& test : tests)
2273 CheckKeyTestCase(rewriter_, test);
[email protected]4a822092012-06-15 03:42:512274}
[email protected]b2a042f02012-07-19 02:41:382275
2276TEST_F(EventRewriterTest, TestRewriteKeyEventSentByXSendEvent) {
2277 // Remap Control to Alt.
penghuange5df2822017-03-16 22:54:362278 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]b2a042f02012-07-19 02:41:382279 IntegerPrefMember control;
Blake O'Harea09fa45a2017-10-13 04:19:582280 InitModifierKeyPref(&control, prefs::kLanguageRemapControlKeyTo,
2281 ui::chromeos::ModifierKey::kAltKey);
[email protected]b2a042f02012-07-19 02:41:382282
penghuange5df2822017-03-16 22:54:362283 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
[email protected]b2a042f02012-07-19 02:41:382284
2285 // Send left control press.
[email protected]1c649772014-07-18 14:06:122286 {
kpschoedel8226fd152015-05-06 15:48:592287 ui::KeyEvent keyevent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL,
2288 ui::DomCode::CONTROL_LEFT, ui::EF_FINAL,
kpschoedel51d2e322015-08-28 15:29:352289 ui::DomKey::CONTROL, ui::EventTimeForNow());
dcheng24002d02016-04-08 02:42:402290 std::unique_ptr<ui::Event> new_event;
[email protected]1c649772014-07-18 14:06:122291 // Control should NOT be remapped to Alt if EF_FINAL is set.
2292 EXPECT_EQ(ui::EVENT_REWRITE_CONTINUE,
penghuange5df2822017-03-16 22:54:362293 rewriter_->RewriteEvent(keyevent, &new_event));
[email protected]1c649772014-07-18 14:06:122294 EXPECT_FALSE(new_event);
2295 }
[email protected]d13e288992014-05-01 18:00:212296}
[email protected]b2a042f02012-07-19 02:41:382297
[email protected]d13e288992014-05-01 18:00:212298TEST_F(EventRewriterTest, TestRewriteNonNativeEvent) {
2299 // Remap Control to Alt.
penghuange5df2822017-03-16 22:54:362300 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]d13e288992014-05-01 18:00:212301 IntegerPrefMember control;
Blake O'Harea09fa45a2017-10-13 04:19:582302 InitModifierKeyPref(&control, prefs::kLanguageRemapControlKeyTo,
2303 ui::chromeos::ModifierKey::kAltKey);
[email protected]d13e288992014-05-01 18:00:212304
penghuange5df2822017-03-16 22:54:362305 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId, "PC Keyboard");
[email protected]d13e288992014-05-01 18:00:212306
2307 const int kTouchId = 2;
2308 gfx::Point location(0, 0);
lanwei64725672017-03-16 20:56:052309 ui::TouchEvent press(
2310 ui::ET_TOUCH_PRESSED, location, base::TimeTicks(),
2311 ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, kTouchId));
[email protected]d13e288992014-05-01 18:00:212312 press.set_flags(ui::EF_CONTROL_DOWN);
2313
dcheng24002d02016-04-08 02:42:402314 std::unique_ptr<ui::Event> new_event;
penghuange5df2822017-03-16 22:54:362315 rewriter_->RewriteEvent(press, &new_event);
[email protected]d13e288992014-05-01 18:00:212316 EXPECT_TRUE(new_event);
2317 // Control should be remapped to Alt.
2318 EXPECT_EQ(ui::EF_ALT_DOWN,
2319 new_event->flags() & (ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN));
[email protected]b2a042f02012-07-19 02:41:382320}
[email protected]f7ab9b6042013-10-07 23:27:202321
[email protected]354520b2014-06-21 04:31:012322// Keeps a buffer of handled events.
2323class EventBuffer : public ui::test::TestEventProcessor {
2324 public:
2325 EventBuffer() {}
dchengc97a0282015-01-15 23:04:242326 ~EventBuffer() override {}
[email protected]354520b2014-06-21 04:31:012327
avi3dbcc202017-03-13 02:48:362328 void PopEvents(std::vector<std::unique_ptr<ui::Event>>* events) {
[email protected]354520b2014-06-21 04:31:012329 events->clear();
2330 events->swap(events_);
2331 }
2332
2333 private:
penghuang17134c6c2017-03-23 00:01:072334 // ui::EventSink overrides:
dchengc97a0282015-01-15 23:04:242335 ui::EventDispatchDetails OnEventFromSource(ui::Event* event) override {
moshayedi4e6623012016-03-02 04:53:582336 events_.push_back(ui::Event::Clone(*event));
[email protected]354520b2014-06-21 04:31:012337 return ui::EventDispatchDetails();
2338 }
2339
avi3dbcc202017-03-13 02:48:362340 std::vector<std::unique_ptr<ui::Event>> events_;
[email protected]354520b2014-06-21 04:31:012341
2342 DISALLOW_COPY_AND_ASSIGN(EventBuffer);
2343};
2344
2345// Trivial EventSource that does nothing but send events.
2346class TestEventSource : public ui::EventSource {
2347 public:
2348 explicit TestEventSource(ui::EventProcessor* processor)
2349 : processor_(processor) {}
penghuang17134c6c2017-03-23 00:01:072350 ui::EventSink* GetEventSink() override { return processor_; }
[email protected]354520b2014-06-21 04:31:012351 ui::EventDispatchDetails Send(ui::Event* event) {
penghuang17134c6c2017-03-23 00:01:072352 return SendEventToSink(event);
[email protected]354520b2014-06-21 04:31:012353 }
2354
2355 private:
2356 ui::EventProcessor* processor_;
2357};
2358
[email protected]f7ab9b6042013-10-07 23:27:202359// Tests of event rewriting that depend on the Ash window manager.
Scott Violet6ac56412018-12-19 17:25:502360class EventRewriterAshTest : public ChromeAshTestBase {
[email protected]f7ab9b6042013-10-07 23:27:202361 public:
[email protected]d13e288992014-05-01 18:00:212362 EventRewriterAshTest()
[email protected]354520b2014-06-21 04:31:012363 : source_(&buffer_),
yoshiki18898fb2016-11-18 15:59:482364 fake_user_manager_(new chromeos::FakeChromeUserManager),
Xiyuan Xiadfe3a9f2017-11-13 21:46:262365 user_manager_enabler_(base::WrapUnique(fake_user_manager_)) {}
dchengc97a0282015-01-15 23:04:242366 ~EventRewriterAshTest() override {}
[email protected]f7ab9b6042013-10-07 23:27:202367
[email protected]d13e288992014-05-01 18:00:212368 bool RewriteFunctionKeys(const ui::Event& event,
dcheng24002d02016-04-08 02:42:402369 std::unique_ptr<ui::Event>* rewritten_event) {
[email protected]d13e288992014-05-01 18:00:212370 return rewriter_->RewriteEvent(event, rewritten_event);
[email protected]f7ab9b6042013-10-07 23:27:202371 }
2372
[email protected]354520b2014-06-21 04:31:012373 ui::EventDispatchDetails Send(ui::Event* event) {
2374 return source_.Send(event);
2375 }
2376
kpschoedel8226fd152015-05-06 15:48:592377 void SendKeyEvent(ui::EventType type,
2378 ui::KeyboardCode key_code,
2379 ui::DomCode code,
kpschoedel51d2e322015-08-28 15:29:352380 ui::DomKey key) {
2381 ui::KeyEvent press(type, key_code, code, ui::EF_NONE, key,
kpschoedel8226fd152015-05-06 15:48:592382 ui::EventTimeForNow());
[email protected]354520b2014-06-21 04:31:012383 ui::EventDispatchDetails details = Send(&press);
2384 CHECK(!details.dispatcher_destroyed);
2385 }
2386
kpschoedel8226fd152015-05-06 15:48:592387 void SendActivateStickyKeyPattern(ui::KeyboardCode key_code,
2388 ui::DomCode code,
kpschoedel51d2e322015-08-28 15:29:352389 ui::DomKey key) {
2390 SendKeyEvent(ui::ET_KEY_PRESSED, key_code, code, key);
2391 SendKeyEvent(ui::ET_KEY_RELEASED, key_code, code, key);
[email protected]354520b2014-06-21 04:31:012392 }
2393
[email protected]e2204a702013-10-29 21:58:542394 protected:
maxbogueea16ff412016-10-28 16:35:292395 sync_preferences::TestingPrefServiceSyncable* prefs() { return &prefs_; }
[email protected]354520b2014-06-21 04:31:012396
Blake O'Harea09fa45a2017-10-13 04:19:582397 void InitModifierKeyPref(IntegerPrefMember* int_pref,
2398 const std::string& pref_name,
2399 ui::chromeos::ModifierKey modifierKey) {
2400 int_pref->Init(pref_name, prefs());
2401 int_pref->SetValue(static_cast<int>(modifierKey));
2402 }
2403
avi3dbcc202017-03-13 02:48:362404 void PopEvents(std::vector<std::unique_ptr<ui::Event>>* events) {
2405 buffer_.PopEvents(events);
2406 }
[email protected]354520b2014-06-21 04:31:012407
dchengc97a0282015-01-15 23:04:242408 void SetUp() override {
Scott Violet6ac56412018-12-19 17:25:502409 ChromeAshTestBase::SetUp();
skycb4be5b2017-04-06 17:52:452410 sticky_keys_controller_ = ash::Shell::Get()->sticky_keys_controller();
Yuki Awanoce4c62d32018-06-28 00:36:362411 delegate_ = std::make_unique<EventRewriterDelegateImpl>(nullptr);
penghuange5df2822017-03-16 22:54:362412 delegate_->set_pref_service_for_testing(prefs());
Jinho Bang341ce5b02018-01-17 22:46:032413 rewriter_ = std::make_unique<ui::EventRewriterChromeOS>(
penghuange5df2822017-03-16 22:54:362414 delegate_.get(), sticky_keys_controller_);
[email protected]e0047752014-04-09 02:18:362415 chromeos::Preferences::RegisterProfilePrefs(prefs_.registry());
[email protected]354520b2014-06-21 04:31:012416 source_.AddEventRewriter(rewriter_.get());
2417 sticky_keys_controller_->Enable(true);
[email protected]e0047752014-04-09 02:18:362418 }
2419
dchengc97a0282015-01-15 23:04:242420 void TearDown() override {
[email protected]e0047752014-04-09 02:18:362421 rewriter_.reset();
Scott Violet6ac56412018-12-19 17:25:502422 ChromeAshTestBase::TearDown();
[email protected]e0047752014-04-09 02:18:362423 }
2424
[email protected]354520b2014-06-21 04:31:012425 protected:
2426 ash::StickyKeysController* sticky_keys_controller_;
[email protected]e2204a702013-10-29 21:58:542427
[email protected]f7ab9b6042013-10-07 23:27:202428 private:
penghuange5df2822017-03-16 22:54:362429 std::unique_ptr<EventRewriterDelegateImpl> delegate_;
2430 std::unique_ptr<ui::EventRewriterChromeOS> rewriter_;
[email protected]f7ab9b6042013-10-07 23:27:202431
[email protected]354520b2014-06-21 04:31:012432 EventBuffer buffer_;
2433 TestEventSource source_;
2434
yoshiki18898fb2016-11-18 15:59:482435 chromeos::FakeChromeUserManager* fake_user_manager_; // Not owned.
Xiyuan Xiadfe3a9f2017-11-13 21:46:262436 user_manager::ScopedUserManager user_manager_enabler_;
maxbogueea16ff412016-10-28 16:35:292437 sync_preferences::TestingPrefServiceSyncable prefs_;
[email protected]d13e288992014-05-01 18:00:212438
[email protected]f7ab9b6042013-10-07 23:27:202439 DISALLOW_COPY_AND_ASSIGN(EventRewriterAshTest);
2440};
2441
2442TEST_F(EventRewriterAshTest, TopRowKeysAreFunctionKeys) {
dcheng24002d02016-04-08 02:42:402443 std::unique_ptr<aura::Window> window(CreateTestWindowInShellWithId(1));
James Cook55648272017-09-13 23:14:012444 wm::ActivateWindow(window.get());
avi3dbcc202017-03-13 02:48:362445 std::vector<std::unique_ptr<ui::Event>> events;
[email protected]f7ab9b6042013-10-07 23:27:202446
2447 // Create a simulated keypress of F1 targetted at the window.
kpschoedel8226fd152015-05-06 15:48:592448 ui::KeyEvent press_f1(ui::ET_KEY_PRESSED, ui::VKEY_F1, ui::DomCode::F1,
kpschoedel51d2e322015-08-28 15:29:352449 ui::EF_NONE, ui::DomKey::F1, ui::EventTimeForNow());
[email protected]f7ab9b6042013-10-07 23:27:202450
[email protected]e2204a702013-10-29 21:58:542451 // The event should also not be rewritten if the send-function-keys pref is
2452 // additionally set, for both apps v2 and regular windows.
2453 BooleanPrefMember send_function_keys_pref;
[email protected]354520b2014-06-21 04:31:012454 send_function_keys_pref.Init(prefs::kLanguageSendFunctionKeys, prefs());
[email protected]e2204a702013-10-29 21:58:542455 send_function_keys_pref.SetValue(true);
sadrulca0e9992016-07-20 22:55:542456 ui::EventDispatchDetails details = Send(&press_f1);
[email protected]354520b2014-06-21 04:31:012457 ASSERT_FALSE(details.dispatcher_destroyed);
2458 PopEvents(&events);
2459 EXPECT_EQ(1u, events.size());
kpschoedel51d2e322015-08-28 15:29:352460 EXPECT_EQ(
2461 GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_F1,
2462 ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1),
avi3dbcc202017-03-13 02:48:362463 GetKeyEventAsString(*static_cast<ui::KeyEvent*>(events[0].get())));
[email protected]e2204a702013-10-29 21:58:542464
2465 // If the pref isn't set when an event is sent to a regular window, F1 is
2466 // rewritten to the back key.
2467 send_function_keys_pref.SetValue(false);
[email protected]354520b2014-06-21 04:31:012468 details = Send(&press_f1);
2469 ASSERT_FALSE(details.dispatcher_destroyed);
2470 PopEvents(&events);
2471 EXPECT_EQ(1u, events.size());
kpschoedel8226fd152015-05-06 15:48:592472 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_BROWSER_BACK,
2473 ui::DomCode::BROWSER_BACK, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:352474 ui::DomKey::BROWSER_BACK),
avi3dbcc202017-03-13 02:48:362475 GetKeyEventAsString(*static_cast<ui::KeyEvent*>(events[0].get())));
[email protected]f7ab9b6042013-10-07 23:27:202476}
2477
[email protected]7f926752014-01-30 09:16:352478TEST_F(EventRewriterTest, DontRewriteIfNotRewritten) {
Ahmed Fakhry719548c2018-10-15 23:47:192479 ui::DeviceDataManager* device_data_manager =
2480 ui::DeviceDataManager::GetInstance();
2481 std::vector<ui::InputDevice> touchpad_devices(2);
2482 constexpr int kTouchpadId1 = 10;
2483 constexpr int kTouchpadId2 = 11;
2484 touchpad_devices[0].id = kTouchpadId1;
2485 touchpad_devices[1].id = kTouchpadId2;
2486 static_cast<ui::DeviceHotplugEventObserver*>(device_data_manager)
2487 ->OnTouchpadDevicesUpdated(touchpad_devices);
2488 std::vector<ui::InputDevice> mouse_devices(1);
2489 constexpr int kMouseId = 12;
2490 touchpad_devices[0].id = kMouseId;
2491 static_cast<ui::DeviceHotplugEventObserver*>(device_data_manager)
2492 ->OnMouseDevicesUpdated(mouse_devices);
2493
xdaie54b1fc22015-06-05 00:59:372494 const int kLeftAndAltFlag = ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN;
[email protected]595079ce2014-07-11 22:25:132495
xdaie54b1fc22015-06-05 00:59:372496 // Test Alt + Left click.
[email protected]595079ce2014-07-11 22:25:132497 {
robert.bradfordb3d800b2015-02-18 18:56:102498 ui::MouseEvent press(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
xdaie54b1fc22015-06-05 00:59:372499 ui::EventTimeForNow(), kLeftAndAltFlag,
[email protected]595079ce2014-07-11 22:25:132500 ui::EF_LEFT_MOUSE_BUTTON);
2501 ui::EventTestApi test_press(&press);
Ahmed Fakhry719548c2018-10-15 23:47:192502 test_press.set_source_device_id(kTouchpadId1);
[email protected]595079ce2014-07-11 22:25:132503 // Sanity check.
2504 EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type());
xdaie54b1fc22015-06-05 00:59:372505 EXPECT_EQ(kLeftAndAltFlag, press.flags());
dcheng24002d02016-04-08 02:42:402506 std::unique_ptr<ui::Event> new_event;
penghuange5df2822017-03-16 22:54:362507 const ui::MouseEvent* result = RewriteMouseButtonEvent(press, &new_event);
[email protected]595079ce2014-07-11 22:25:132508 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & result->flags());
xdaie54b1fc22015-06-05 00:59:372509 EXPECT_FALSE(kLeftAndAltFlag & result->flags());
[email protected]595079ce2014-07-11 22:25:132510 EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, result->changed_button_flags());
2511 }
2512 {
robert.bradfordb3d800b2015-02-18 18:56:102513 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(),
xdaie54b1fc22015-06-05 00:59:372514 ui::EventTimeForNow(), kLeftAndAltFlag,
[email protected]595079ce2014-07-11 22:25:132515 ui::EF_LEFT_MOUSE_BUTTON);
2516 ui::EventTestApi test_release(&release);
Ahmed Fakhry719548c2018-10-15 23:47:192517 test_release.set_source_device_id(kTouchpadId1);
dcheng24002d02016-04-08 02:42:402518 std::unique_ptr<ui::Event> new_event;
penghuange5df2822017-03-16 22:54:362519 const ui::MouseEvent* result = RewriteMouseButtonEvent(release, &new_event);
[email protected]595079ce2014-07-11 22:25:132520 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & result->flags());
xdaie54b1fc22015-06-05 00:59:372521 EXPECT_FALSE(kLeftAndAltFlag & result->flags());
[email protected]595079ce2014-07-11 22:25:132522 EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, result->changed_button_flags());
2523 }
[email protected]7f926752014-01-30 09:16:352524
xdaie54b1fc22015-06-05 00:59:372525 // No ALT in frst click.
[email protected]7f926752014-01-30 09:16:352526 {
robert.bradfordb3d800b2015-02-18 18:56:102527 ui::MouseEvent press(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
2528 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
[email protected]595079ce2014-07-11 22:25:132529 ui::EF_LEFT_MOUSE_BUTTON);
2530 ui::EventTestApi test_press(&press);
Ahmed Fakhry719548c2018-10-15 23:47:192531 test_press.set_source_device_id(kTouchpadId1);
dcheng24002d02016-04-08 02:42:402532 std::unique_ptr<ui::Event> new_event;
penghuange5df2822017-03-16 22:54:362533 const ui::MouseEvent* result = RewriteMouseButtonEvent(press, &new_event);
[email protected]595079ce2014-07-11 22:25:132534 EXPECT_TRUE(ui::EF_LEFT_MOUSE_BUTTON & result->flags());
2535 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, result->changed_button_flags());
2536 }
2537 {
robert.bradfordb3d800b2015-02-18 18:56:102538 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(),
xdaie54b1fc22015-06-05 00:59:372539 ui::EventTimeForNow(), kLeftAndAltFlag,
[email protected]595079ce2014-07-11 22:25:132540 ui::EF_LEFT_MOUSE_BUTTON);
2541 ui::EventTestApi test_release(&release);
Ahmed Fakhry719548c2018-10-15 23:47:192542 test_release.set_source_device_id(kTouchpadId1);
dcheng24002d02016-04-08 02:42:402543 std::unique_ptr<ui::Event> new_event;
penghuange5df2822017-03-16 22:54:362544 const ui::MouseEvent* result = RewriteMouseButtonEvent(release, &new_event);
xdaie54b1fc22015-06-05 00:59:372545 EXPECT_TRUE((ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN) & result->flags());
[email protected]595079ce2014-07-11 22:25:132546 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, result->changed_button_flags());
2547 }
[email protected]7f926752014-01-30 09:16:352548
xdaie54b1fc22015-06-05 00:59:372549 // ALT on different device.
[email protected]7f926752014-01-30 09:16:352550 {
robert.bradfordb3d800b2015-02-18 18:56:102551 ui::MouseEvent press(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
xdaie54b1fc22015-06-05 00:59:372552 ui::EventTimeForNow(), kLeftAndAltFlag,
[email protected]595079ce2014-07-11 22:25:132553 ui::EF_LEFT_MOUSE_BUTTON);
2554 ui::EventTestApi test_press(&press);
Ahmed Fakhry719548c2018-10-15 23:47:192555 test_press.set_source_device_id(kTouchpadId2);
dcheng24002d02016-04-08 02:42:402556 std::unique_ptr<ui::Event> new_event;
penghuange5df2822017-03-16 22:54:362557 const ui::MouseEvent* result = RewriteMouseButtonEvent(press, &new_event);
[email protected]595079ce2014-07-11 22:25:132558 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & result->flags());
xdaie54b1fc22015-06-05 00:59:372559 EXPECT_FALSE(kLeftAndAltFlag & result->flags());
[email protected]595079ce2014-07-11 22:25:132560 EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, result->changed_button_flags());
2561 }
2562 {
robert.bradfordb3d800b2015-02-18 18:56:102563 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(),
xdaie54b1fc22015-06-05 00:59:372564 ui::EventTimeForNow(), kLeftAndAltFlag,
[email protected]595079ce2014-07-11 22:25:132565 ui::EF_LEFT_MOUSE_BUTTON);
2566 ui::EventTestApi test_release(&release);
Ahmed Fakhry719548c2018-10-15 23:47:192567 test_release.set_source_device_id(kTouchpadId1);
dcheng24002d02016-04-08 02:42:402568 std::unique_ptr<ui::Event> new_event;
penghuange5df2822017-03-16 22:54:362569 const ui::MouseEvent* result = RewriteMouseButtonEvent(release, &new_event);
xdaie54b1fc22015-06-05 00:59:372570 EXPECT_TRUE((ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN) & result->flags());
[email protected]595079ce2014-07-11 22:25:132571 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, result->changed_button_flags());
2572 }
2573 {
robert.bradfordb3d800b2015-02-18 18:56:102574 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(),
xdaie54b1fc22015-06-05 00:59:372575 ui::EventTimeForNow(), kLeftAndAltFlag,
[email protected]595079ce2014-07-11 22:25:132576 ui::EF_LEFT_MOUSE_BUTTON);
2577 ui::EventTestApi test_release(&release);
Ahmed Fakhry719548c2018-10-15 23:47:192578 test_release.set_source_device_id(kTouchpadId2);
dcheng24002d02016-04-08 02:42:402579 std::unique_ptr<ui::Event> new_event;
penghuange5df2822017-03-16 22:54:362580 const ui::MouseEvent* result = RewriteMouseButtonEvent(release, &new_event);
[email protected]595079ce2014-07-11 22:25:132581 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & result->flags());
xdaie54b1fc22015-06-05 00:59:372582 EXPECT_FALSE(kLeftAndAltFlag & result->flags());
[email protected]595079ce2014-07-11 22:25:132583 EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, result->changed_button_flags());
2584 }
Ahmed Fakhry719548c2018-10-15 23:47:192585
2586 // No rewrite for non-touchpad devices.
2587 {
2588 ui::MouseEvent press(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
2589 ui::EventTimeForNow(), kLeftAndAltFlag,
2590 ui::EF_LEFT_MOUSE_BUTTON);
2591 ui::EventTestApi test_press(&press);
2592 test_press.set_source_device_id(kMouseId);
2593 EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type());
2594 EXPECT_EQ(kLeftAndAltFlag, press.flags());
2595 std::unique_ptr<ui::Event> new_event;
2596 const ui::MouseEvent* result = RewriteMouseButtonEvent(press, &new_event);
2597 EXPECT_TRUE(kLeftAndAltFlag & result->flags());
2598 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, result->changed_button_flags());
2599 }
2600 {
2601 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(),
2602 ui::EventTimeForNow(), kLeftAndAltFlag,
2603 ui::EF_LEFT_MOUSE_BUTTON);
2604 ui::EventTestApi test_release(&release);
2605 test_release.set_source_device_id(kMouseId);
2606 std::unique_ptr<ui::Event> new_event;
2607 const ui::MouseEvent* result = RewriteMouseButtonEvent(release, &new_event);
2608 EXPECT_TRUE(kLeftAndAltFlag & result->flags());
2609 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, result->changed_button_flags());
2610 }
[email protected]354520b2014-06-21 04:31:012611}
2612
2613TEST_F(EventRewriterAshTest, StickyKeyEventDispatchImpl) {
2614 // Test the actual key event dispatch implementation.
avi3dbcc202017-03-13 02:48:362615 std::vector<std::unique_ptr<ui::Event>> events;
[email protected]354520b2014-06-21 04:31:012616
kpschoedel8226fd152015-05-06 15:48:592617 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:352618 ui::DomKey::CONTROL);
[email protected]354520b2014-06-21 04:31:012619 PopEvents(&events);
2620 EXPECT_EQ(1u, events.size());
2621 EXPECT_EQ(ui::ET_KEY_PRESSED, events[0]->type());
2622 EXPECT_EQ(ui::VKEY_CONTROL,
avi3dbcc202017-03-13 02:48:362623 static_cast<ui::KeyEvent*>(events[0].get())->key_code());
[email protected]354520b2014-06-21 04:31:012624
2625 // Test key press event is correctly modified and modifier release
2626 // event is sent.
kpschoedela281bf12016-01-07 15:08:192627 ui::KeyEvent press(ui::ET_KEY_PRESSED, ui::VKEY_C, ui::DomCode::US_C,
kpschoedel51d2e322015-08-28 15:29:352628 ui::EF_NONE, ui::DomKey::Constant<'c'>::Character,
kpschoedel8226fd152015-05-06 15:48:592629 ui::EventTimeForNow());
[email protected]354520b2014-06-21 04:31:012630 ui::EventDispatchDetails details = Send(&press);
2631 PopEvents(&events);
2632 EXPECT_EQ(2u, events.size());
2633 EXPECT_EQ(ui::ET_KEY_PRESSED, events[0]->type());
avi3dbcc202017-03-13 02:48:362634 EXPECT_EQ(ui::VKEY_C,
2635 static_cast<ui::KeyEvent*>(events[0].get())->key_code());
[email protected]354520b2014-06-21 04:31:012636 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
2637 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type());
2638 EXPECT_EQ(ui::VKEY_CONTROL,
avi3dbcc202017-03-13 02:48:362639 static_cast<ui::KeyEvent*>(events[1].get())->key_code());
[email protected]354520b2014-06-21 04:31:012640
2641 // Test key release event is not modified.
kpschoedela281bf12016-01-07 15:08:192642 ui::KeyEvent release(ui::ET_KEY_RELEASED, ui::VKEY_C, ui::DomCode::US_C,
kpschoedel51d2e322015-08-28 15:29:352643 ui::EF_NONE, ui::DomKey::Constant<'c'>::Character,
kpschoedel8226fd152015-05-06 15:48:592644 ui::EventTimeForNow());
[email protected]354520b2014-06-21 04:31:012645 details = Send(&release);
2646 ASSERT_FALSE(details.dispatcher_destroyed);
2647 PopEvents(&events);
2648 EXPECT_EQ(1u, events.size());
2649 EXPECT_EQ(ui::ET_KEY_RELEASED, events[0]->type());
avi3dbcc202017-03-13 02:48:362650 EXPECT_EQ(ui::VKEY_C,
2651 static_cast<ui::KeyEvent*>(events[0].get())->key_code());
[email protected]354520b2014-06-21 04:31:012652 EXPECT_FALSE(events[0]->flags() & ui::EF_CONTROL_DOWN);
2653}
2654
2655TEST_F(EventRewriterAshTest, MouseEventDispatchImpl) {
avi3dbcc202017-03-13 02:48:362656 std::vector<std::unique_ptr<ui::Event>> events;
[email protected]354520b2014-06-21 04:31:012657
kpschoedel8226fd152015-05-06 15:48:592658 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:352659 ui::DomKey::CONTROL);
[email protected]354520b2014-06-21 04:31:012660 PopEvents(&events);
2661
2662 // Test mouse press event is correctly modified.
2663 gfx::Point location(0, 0);
robert.bradfordb3d800b2015-02-18 18:56:102664 ui::MouseEvent press(ui::ET_MOUSE_PRESSED, location, location,
2665 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
[email protected]354520b2014-06-21 04:31:012666 ui::EF_LEFT_MOUSE_BUTTON);
2667 ui::EventDispatchDetails details = Send(&press);
2668 ASSERT_FALSE(details.dispatcher_destroyed);
2669 PopEvents(&events);
2670 EXPECT_EQ(1u, events.size());
2671 EXPECT_EQ(ui::ET_MOUSE_PRESSED, events[0]->type());
2672 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
2673
2674 // Test mouse release event is correctly modified and modifier release
2675 // event is sent. The mouse event should have the correct DIP location.
robert.bradfordb3d800b2015-02-18 18:56:102676 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, location, location,
2677 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
[email protected]354520b2014-06-21 04:31:012678 ui::EF_LEFT_MOUSE_BUTTON);
2679 details = Send(&release);
2680 ASSERT_FALSE(details.dispatcher_destroyed);
2681 PopEvents(&events);
2682 EXPECT_EQ(2u, events.size());
2683 EXPECT_EQ(ui::ET_MOUSE_RELEASED, events[0]->type());
2684 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
2685 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type());
2686 EXPECT_EQ(ui::VKEY_CONTROL,
avi3dbcc202017-03-13 02:48:362687 static_cast<ui::KeyEvent*>(events[1].get())->key_code());
[email protected]354520b2014-06-21 04:31:012688}
2689
2690TEST_F(EventRewriterAshTest, MouseWheelEventDispatchImpl) {
avi3dbcc202017-03-13 02:48:362691 std::vector<std::unique_ptr<ui::Event>> events;
[email protected]354520b2014-06-21 04:31:012692
2693 // Test positive mouse wheel event is correctly modified and modifier release
2694 // event is sent.
kpschoedel8226fd152015-05-06 15:48:592695 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:352696 ui::DomKey::CONTROL);
[email protected]354520b2014-06-21 04:31:012697 PopEvents(&events);
2698 gfx::Point location(0, 0);
riajiang1c49eca2016-08-30 19:36:532699 ui::MouseWheelEvent positive(
2700 gfx::Vector2d(0, ui::MouseWheelEvent::kWheelDelta), location, location,
2701 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
2702 ui::EF_LEFT_MOUSE_BUTTON);
[email protected]354520b2014-06-21 04:31:012703 ui::EventDispatchDetails details = Send(&positive);
2704 ASSERT_FALSE(details.dispatcher_destroyed);
2705 PopEvents(&events);
2706 EXPECT_EQ(2u, events.size());
2707 EXPECT_TRUE(events[0]->IsMouseWheelEvent());
2708 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
2709 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type());
2710 EXPECT_EQ(ui::VKEY_CONTROL,
avi3dbcc202017-03-13 02:48:362711 static_cast<ui::KeyEvent*>(events[1].get())->key_code());
[email protected]354520b2014-06-21 04:31:012712
2713 // Test negative mouse wheel event is correctly modified and modifier release
2714 // event is sent.
kpschoedel8226fd152015-05-06 15:48:592715 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:352716 ui::DomKey::CONTROL);
[email protected]354520b2014-06-21 04:31:012717 PopEvents(&events);
riajiang1c49eca2016-08-30 19:36:532718 ui::MouseWheelEvent negative(
2719 gfx::Vector2d(0, -ui::MouseWheelEvent::kWheelDelta), location, location,
2720 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
2721 ui::EF_LEFT_MOUSE_BUTTON);
[email protected]354520b2014-06-21 04:31:012722 details = Send(&negative);
2723 ASSERT_FALSE(details.dispatcher_destroyed);
2724 PopEvents(&events);
2725 EXPECT_EQ(2u, events.size());
2726 EXPECT_TRUE(events[0]->IsMouseWheelEvent());
2727 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
2728 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type());
2729 EXPECT_EQ(ui::VKEY_CONTROL,
avi3dbcc202017-03-13 02:48:362730 static_cast<ui::KeyEvent*>(events[1].get())->key_code());
[email protected]354520b2014-06-21 04:31:012731}
2732
afakhry1688ee312016-04-15 16:36:332733// Tests that if modifier keys are remapped, the flags of a mouse wheel event
2734// will be rewritten properly.
2735TEST_F(EventRewriterAshTest, MouseWheelEventModifiersRewritten) {
2736 // Remap Control to Alt.
2737 IntegerPrefMember control;
Blake O'Harea09fa45a2017-10-13 04:19:582738 InitModifierKeyPref(&control, prefs::kLanguageRemapControlKeyTo,
2739 ui::chromeos::ModifierKey::kAltKey);
afakhry1688ee312016-04-15 16:36:332740
2741 // Generate a mouse wheel event that has a CONTROL_DOWN modifier flag and
2742 // expect that it will be rewritten to ALT_DOWN.
avi3dbcc202017-03-13 02:48:362743 std::vector<std::unique_ptr<ui::Event>> events;
afakhry1688ee312016-04-15 16:36:332744 gfx::Point location(0, 0);
riajiang1c49eca2016-08-30 19:36:532745 ui::MouseWheelEvent positive(
2746 gfx::Vector2d(0, ui::MouseWheelEvent::kWheelDelta), location, location,
2747 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON | ui::EF_CONTROL_DOWN,
2748 ui::EF_LEFT_MOUSE_BUTTON);
afakhry1688ee312016-04-15 16:36:332749 ui::EventDispatchDetails details = Send(&positive);
2750 ASSERT_FALSE(details.dispatcher_destroyed);
2751 PopEvents(&events);
2752 EXPECT_EQ(1u, events.size());
2753 EXPECT_TRUE(events[0]->IsMouseWheelEvent());
2754 EXPECT_FALSE(events[0]->flags() & ui::EF_CONTROL_DOWN);
2755 EXPECT_TRUE(events[0]->flags() & ui::EF_ALT_DOWN);
2756}
2757
[email protected]354520b2014-06-21 04:31:012758class StickyKeysOverlayTest : public EventRewriterAshTest {
2759 public:
2760 StickyKeysOverlayTest() : overlay_(NULL) {}
2761
dchengc97a0282015-01-15 23:04:242762 ~StickyKeysOverlayTest() override {}
[email protected]354520b2014-06-21 04:31:012763
dchengc97a0282015-01-15 23:04:242764 void SetUp() override {
[email protected]354520b2014-06-21 04:31:012765 EventRewriterAshTest::SetUp();
2766 overlay_ = sticky_keys_controller_->GetOverlayForTest();
2767 ASSERT_TRUE(overlay_);
2768 }
2769
2770 ash::StickyKeysOverlay* overlay_;
2771};
2772
2773TEST_F(StickyKeysOverlayTest, OneModifierEnabled) {
2774 EXPECT_FALSE(overlay_->is_visible());
2775 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2776 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2777
2778 // Pressing modifier key should show overlay.
kpschoedel8226fd152015-05-06 15:48:592779 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:352780 ui::DomKey::CONTROL);
[email protected]354520b2014-06-21 04:31:012781 EXPECT_TRUE(overlay_->is_visible());
2782 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED,
2783 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2784
2785 // Pressing a normal key should hide overlay.
kpschoedela281bf12016-01-07 15:08:192786 SendActivateStickyKeyPattern(ui::VKEY_T, ui::DomCode::US_T,
kpschoedel51d2e322015-08-28 15:29:352787 ui::DomKey::Constant<'t'>::Character);
[email protected]354520b2014-06-21 04:31:012788 EXPECT_FALSE(overlay_->is_visible());
2789 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2790 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2791}
2792
2793TEST_F(StickyKeysOverlayTest, TwoModifiersEnabled) {
2794 EXPECT_FALSE(overlay_->is_visible());
2795 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2796 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2797 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2798 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
2799
2800 // Pressing two modifiers should show overlay.
kpschoedel8226fd152015-05-06 15:48:592801 SendActivateStickyKeyPattern(ui::VKEY_SHIFT, ui::DomCode::SHIFT_LEFT,
kpschoedel51d2e322015-08-28 15:29:352802 ui::DomKey::SHIFT);
kpschoedel8226fd152015-05-06 15:48:592803 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:352804 ui::DomKey::CONTROL);
[email protected]354520b2014-06-21 04:31:012805 EXPECT_TRUE(overlay_->is_visible());
2806 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED,
2807 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
2808 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED,
2809 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2810
2811 // Pressing a normal key should hide overlay.
kpschoedela281bf12016-01-07 15:08:192812 SendActivateStickyKeyPattern(ui::VKEY_N, ui::DomCode::US_N,
kpschoedel51d2e322015-08-28 15:29:352813 ui::DomKey::Constant<'n'>::Character);
[email protected]354520b2014-06-21 04:31:012814 EXPECT_FALSE(overlay_->is_visible());
2815 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2816 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2817 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2818 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
2819}
2820
2821TEST_F(StickyKeysOverlayTest, LockedModifier) {
2822 EXPECT_FALSE(overlay_->is_visible());
2823 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2824 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
2825
2826 // Pressing a modifier key twice should lock modifier and show overlay.
kpschoedel8226fd152015-05-06 15:48:592827 SendActivateStickyKeyPattern(ui::VKEY_LMENU, ui::DomCode::ALT_LEFT,
kpschoedel51d2e322015-08-28 15:29:352828 ui::DomKey::ALT);
kpschoedel8226fd152015-05-06 15:48:592829 SendActivateStickyKeyPattern(ui::VKEY_LMENU, ui::DomCode::ALT_LEFT,
kpschoedel51d2e322015-08-28 15:29:352830 ui::DomKey::ALT);
[email protected]354520b2014-06-21 04:31:012831 EXPECT_TRUE(overlay_->is_visible());
2832 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED,
2833 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
2834
2835 // Pressing a normal key should not hide overlay.
kpschoedela281bf12016-01-07 15:08:192836 SendActivateStickyKeyPattern(ui::VKEY_D, ui::DomCode::US_D,
kpschoedel51d2e322015-08-28 15:29:352837 ui::DomKey::Constant<'d'>::Character);
[email protected]354520b2014-06-21 04:31:012838 EXPECT_TRUE(overlay_->is_visible());
2839 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED,
2840 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
2841}
2842
2843TEST_F(StickyKeysOverlayTest, LockedAndNormalModifier) {
2844 EXPECT_FALSE(overlay_->is_visible());
2845 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2846 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2847 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2848 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
2849
2850 // Pressing a modifier key twice should lock modifier and show overlay.
kpschoedel8226fd152015-05-06 15:48:592851 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:352852 ui::DomKey::CONTROL);
kpschoedel8226fd152015-05-06 15:48:592853 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:352854 ui::DomKey::CONTROL);
[email protected]354520b2014-06-21 04:31:012855 EXPECT_TRUE(overlay_->is_visible());
2856 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED,
2857 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2858
2859 // Pressing another modifier key should still show overlay.
kpschoedel8226fd152015-05-06 15:48:592860 SendActivateStickyKeyPattern(ui::VKEY_SHIFT, ui::DomCode::SHIFT_LEFT,
kpschoedel51d2e322015-08-28 15:29:352861 ui::DomKey::SHIFT);
[email protected]354520b2014-06-21 04:31:012862 EXPECT_TRUE(overlay_->is_visible());
2863 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED,
2864 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2865 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED,
2866 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
2867
2868 // Pressing a normal key should not hide overlay but disable normal modifier.
kpschoedela281bf12016-01-07 15:08:192869 SendActivateStickyKeyPattern(ui::VKEY_D, ui::DomCode::US_D,
kpschoedel51d2e322015-08-28 15:29:352870 ui::DomKey::Constant<'d'>::Character);
[email protected]354520b2014-06-21 04:31:012871 EXPECT_TRUE(overlay_->is_visible());
2872 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED,
2873 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2874 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2875 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
2876}
2877
2878TEST_F(StickyKeysOverlayTest, ModifiersDisabled) {
2879 EXPECT_FALSE(overlay_->is_visible());
2880 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2881 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2882 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2883 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
2884 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2885 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
tengs6a04ecf92014-10-09 19:56:112886 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2887 overlay_->GetModifierKeyState(ui::EF_COMMAND_DOWN));
[email protected]354520b2014-06-21 04:31:012888
2889 // Enable modifiers.
kpschoedel8226fd152015-05-06 15:48:592890 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:352891 ui::DomKey::CONTROL);
kpschoedel8226fd152015-05-06 15:48:592892 SendActivateStickyKeyPattern(ui::VKEY_SHIFT, ui::DomCode::SHIFT_LEFT,
kpschoedel51d2e322015-08-28 15:29:352893 ui::DomKey::SHIFT);
kpschoedel8226fd152015-05-06 15:48:592894 SendActivateStickyKeyPattern(ui::VKEY_SHIFT, ui::DomCode::SHIFT_LEFT,
kpschoedel51d2e322015-08-28 15:29:352895 ui::DomKey::SHIFT);
kpschoedel8226fd152015-05-06 15:48:592896 SendActivateStickyKeyPattern(ui::VKEY_LMENU, ui::DomCode::ALT_LEFT,
kpschoedel51d2e322015-08-28 15:29:352897 ui::DomKey::ALT);
dtapuskaaf863af2016-04-21 14:33:592898 SendActivateStickyKeyPattern(ui::VKEY_COMMAND, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:132899 ui::DomKey::META);
dtapuskaaf863af2016-04-21 14:33:592900 SendActivateStickyKeyPattern(ui::VKEY_COMMAND, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:132901 ui::DomKey::META);
[email protected]354520b2014-06-21 04:31:012902
2903 EXPECT_TRUE(overlay_->is_visible());
2904 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED,
2905 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2906 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED,
2907 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
2908 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED,
2909 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
tengs6a04ecf92014-10-09 19:56:112910 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED,
2911 overlay_->GetModifierKeyState(ui::EF_COMMAND_DOWN));
[email protected]354520b2014-06-21 04:31:012912
2913 // Disable modifiers and overlay should be hidden.
kpschoedel8226fd152015-05-06 15:48:592914 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:352915 ui::DomKey::CONTROL);
kpschoedel8226fd152015-05-06 15:48:592916 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:352917 ui::DomKey::CONTROL);
kpschoedel8226fd152015-05-06 15:48:592918 SendActivateStickyKeyPattern(ui::VKEY_SHIFT, ui::DomCode::SHIFT_LEFT,
kpschoedel51d2e322015-08-28 15:29:352919 ui::DomKey::SHIFT);
kpschoedel8226fd152015-05-06 15:48:592920 SendActivateStickyKeyPattern(ui::VKEY_LMENU, ui::DomCode::ALT_LEFT,
kpschoedel51d2e322015-08-28 15:29:352921 ui::DomKey::ALT);
kpschoedel8226fd152015-05-06 15:48:592922 SendActivateStickyKeyPattern(ui::VKEY_LMENU, ui::DomCode::ALT_LEFT,
kpschoedel51d2e322015-08-28 15:29:352923 ui::DomKey::ALT);
dtapuskaaf863af2016-04-21 14:33:592924 SendActivateStickyKeyPattern(ui::VKEY_COMMAND, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:132925 ui::DomKey::META);
[email protected]354520b2014-06-21 04:31:012926
2927 EXPECT_FALSE(overlay_->is_visible());
2928 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2929 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
2930 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2931 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
2932 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2933 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
tengs6a04ecf92014-10-09 19:56:112934 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
2935 overlay_->GetModifierKeyState(ui::EF_COMMAND_DOWN));
[email protected]354520b2014-06-21 04:31:012936}
2937
2938TEST_F(StickyKeysOverlayTest, ModifierVisibility) {
2939 // All but AltGr and Mod3 should initially be visible.
2940 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_CONTROL_DOWN));
2941 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_SHIFT_DOWN));
2942 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_ALT_DOWN));
tengs6a04ecf92014-10-09 19:56:112943 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_COMMAND_DOWN));
[email protected]354520b2014-06-21 04:31:012944 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
2945 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));
2946
2947 // Turn all modifiers on.
2948 sticky_keys_controller_->SetModifiersEnabled(true, true);
2949 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_CONTROL_DOWN));
2950 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_SHIFT_DOWN));
2951 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_ALT_DOWN));
tengs6a04ecf92014-10-09 19:56:112952 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_COMMAND_DOWN));
[email protected]354520b2014-06-21 04:31:012953 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
2954 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));
2955
2956 // Turn off Mod3.
2957 sticky_keys_controller_->SetModifiersEnabled(false, true);
2958 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
2959 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));
2960
2961 // Turn off AltGr.
2962 sticky_keys_controller_->SetModifiersEnabled(true, false);
2963 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
2964 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));
2965
2966 // Turn off AltGr and Mod3.
2967 sticky_keys_controller_->SetModifiersEnabled(false, false);
2968 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
2969 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));
[email protected]7f926752014-01-30 09:16:352970}
2971
[email protected]9d6182f2014-02-16 04:21:562972} // namespace chromeos