blob: af3f9e39026f91e098c6be65442c5851a2588ea1 [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
David Tseng00443a32021-03-24 22:24:137#include "ash/accessibility/sticky_keys/sticky_keys_controller.h"
8#include "ash/accessibility/sticky_keys/sticky_keys_overlay.h"
Henrique Ferreiroe8c9449b2021-02-04 00:52:409#include "ash/constants/ash_features.h"
[email protected]354520b2014-06-21 04:31:0110#include "ash/shell.h"
[email protected]ac8df2f2012-11-01 21:26:3611#include "base/command_line.h"
Jimmy Gong57745db2021-04-15 04:05:5412#include "base/containers/contains.h"
13#include "base/containers/flat_set.h"
avi8a07d53892015-12-24 22:13:5314#include "base/macros.h"
avi3dbcc202017-03-13 02:48:3615#include "base/memory/ptr_util.h"
[email protected]b54c2532013-06-12 00:17:4816#include "base/strings/stringprintf.h"
Zentaro Kavanaghe7133ce2019-05-30 00:22:1417#include "base/test/scoped_feature_list.h"
Yeunjoo Choi2ef58f42021-07-28 09:28:0418#include "chrome/browser/ash/input_method/input_method_configuration.h"
Yeunjoo Choic039c6f12021-07-29 10:49:3619#include "chrome/browser/ash/input_method/mock_input_method_manager_impl.h"
Henrique Ferreiro1ab7f12f2021-03-04 19:54:4020#include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
Zentaro Kavanagh531da3d2021-02-24 18:21:2621#include "chrome/browser/ash/notifications/deprecation_notification_controller.h"
penghuange5df2822017-03-16 22:54:3622#include "chrome/browser/chromeos/events/event_rewriter_delegate_impl.h"
[email protected]350c9232012-05-25 04:16:0623#include "chrome/browser/chromeos/preferences.h"
[email protected]9d6182f2014-02-16 04:21:5624#include "chrome/common/pref_names.h"
Scott Violet6ac56412018-12-19 17:25:5025#include "chrome/test/base/chrome_ash_test_base.h"
brettwb1fc1b82016-02-02 00:19:0826#include "components/prefs/pref_member.h"
maxbogueea16ff412016-10-28 16:35:2927#include "components/sync_preferences/testing_pref_service_syncable.h"
Xiyuan Xiadfe3a9f2017-11-13 21:46:2628#include "components/user_manager/scoped_user_manager.h"
Zentaro Kavanagh358a88252020-05-13 19:48:0729#include "device/udev_linux/fake_udev_loader.h"
[email protected]9d6182f2014-02-16 04:21:5630#include "testing/gtest/include/gtest/gtest.h"
[email protected]f7ab9b6042013-10-07 23:27:2031#include "ui/aura/window.h"
[email protected]354520b2014-06-21 04:31:0132#include "ui/aura/window_tree_host.h"
Jimmy Gong57745db2021-04-15 04:05:5433#include "ui/base/accelerators/accelerator.h"
shuchen179b1f42014-11-27 17:24:4034#include "ui/base/ime/chromeos/fake_ime_keyboard.h"
Zentaro Kavanagh30f15aa2021-02-13 00:03:5835#include "ui/base/ui_base_features.h"
penghuange5df2822017-03-16 22:54:3636#include "ui/chromeos/events/event_rewriter_chromeos.h"
Blake O'Hared00831e2017-10-06 12:37:2537#include "ui/chromeos/events/modifier_key.h"
penghuange5df2822017-03-16 22:54:3638#include "ui/chromeos/events/pref_names.h"
Ahmed Fakhry719548c2018-10-15 23:47:1939#include "ui/events/devices/device_data_manager.h"
Zentaro Kavanagh358a88252020-05-13 19:48:0740#include "ui/events/devices/device_data_manager_test_api.h"
[email protected]9d6182f2014-02-16 04:21:5641#include "ui/events/event.h"
[email protected]d13e288992014-05-01 18:00:2142#include "ui/events/event_rewriter.h"
robert.bradfordb3d800b2015-02-18 18:56:1043#include "ui/events/event_utils.h"
kpschoedel3b0960a2015-05-11 17:52:1144#include "ui/events/keycodes/dom/dom_code.h"
45#include "ui/events/keycodes/dom/dom_key.h"
46#include "ui/events/keycodes/dom/keycode_converter.h"
[email protected]595079ce2014-07-11 22:25:1347#include "ui/events/test/events_test_utils.h"
[email protected]354520b2014-06-21 04:31:0148#include "ui/events/test/test_event_processor.h"
Yuichiro Hanada87c6e552020-02-07 01:07:3749#include "ui/events/test/test_event_rewriter_continuation.h"
Zentaro Kavanaghd6112d82021-02-19 21:21:3250#include "ui/message_center/fake_message_center.h"
James Cook55648272017-09-13 23:14:0151#include "ui/wm/core/window_util.h"
[email protected]354520b2014-06-21 04:31:0152
[email protected]9822df92012-03-31 03:52:5653namespace {
54
kylechar0166bdb2017-08-10 05:15:0555constexpr int kKeyboardDeviceId = 123;
Zentaro Kavanaghc555ab452020-05-13 23:07:3756constexpr uint32_t kNoScanCode = 0;
Zentaro Kavanagh358a88252020-05-13 19:48:0757constexpr char kKbdSysPath[] = "/devices/platform/i8042/serio2/input/input1";
58constexpr char kKbdTopRowPropertyName[] = "CROS_KEYBOARD_TOP_ROW_LAYOUT";
Zentaro Kavanaghc65969ef2020-05-14 00:58:4359constexpr char kKbdTopRowLayoutAttributeName[] = "function_row_physmap";
[email protected]354520b2014-06-21 04:31:0160
Dmitry Torokhov3e2b7d82020-02-13 18:04:4361constexpr char kKbdTopRowLayoutUnspecified[] = "";
62constexpr char kKbdTopRowLayout1Tag[] = "1";
63constexpr char kKbdTopRowLayout2Tag[] = "2";
64constexpr char kKbdTopRowLayoutWilcoTag[] = "3";
65constexpr char kKbdTopRowLayoutDrallionTag[] = "4";
66
Zentaro Kavanaghc65969ef2020-05-14 00:58:4367// A default example of the layout string read from the function_row_physmap
68// sysfs attribute. The values represent the scan codes for each position
69// in the top row, which maps to F-Keys.
70constexpr char kKbdDefaultCustomTopRowLayout[] =
71 "01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f";
72
Yuichiro Hanada87c6e552020-02-07 01:07:3773class TestEventRewriterContinuation
74 : public ui::test::TestEventRewriterContinuation {
75 public:
76 TestEventRewriterContinuation() = default;
77 ~TestEventRewriterContinuation() override = default;
78 TestEventRewriterContinuation(const TestEventRewriterContinuation&) = delete;
79 TestEventRewriterContinuation& operator=(
80 const TestEventRewriterContinuation&) = delete;
81
82 ui::EventDispatchDetails SendEvent(const ui::Event* event) override {
83 passthrough_events.push_back(ui::Event::Clone(*event));
84 return ui::EventDispatchDetails();
85 }
86
87 ui::EventDispatchDetails SendEventFinally(const ui::Event* event) override {
88 rewritten_events.push_back(ui::Event::Clone(*event));
89 return ui::EventDispatchDetails();
90 }
91
92 ui::EventDispatchDetails DiscardEvent() override {
93 return ui::EventDispatchDetails();
94 }
95
96 std::vector<std::unique_ptr<ui::Event>> rewritten_events;
97 std::vector<std::unique_ptr<ui::Event>> passthrough_events;
98
99 base::WeakPtrFactory<TestEventRewriterContinuation> weak_ptr_factory_{this};
100};
101
kpschoedel8226fd152015-05-06 15:48:59102std::string GetExpectedResultAsString(ui::EventType ui_type,
103 ui::KeyboardCode ui_keycode,
104 ui::DomCode code,
105 int ui_flags, // ui::EventFlags
Zentaro Kavanaghc555ab452020-05-13 23:07:37106 ui::DomKey key,
107 uint32_t scan_code) {
kpschoedel02c854d2015-06-16 14:44:29108 return base::StringPrintf(
Zentaro Kavanaghc555ab452020-05-13 23:07:37109 "type=%d code=0x%06X flags=0x%X vk=0x%02X key=0x%08X scan=0x%08X",
110 ui_type, static_cast<unsigned int>(code), ui_flags & ~ui::EF_IS_REPEAT,
111 ui_keycode, static_cast<unsigned int>(key), scan_code);
[email protected]106cf972014-05-28 17:28:17112}
113
114std::string GetKeyEventAsString(const ui::KeyEvent& keyevent) {
kpschoedel51d2e322015-08-28 15:29:35115 return GetExpectedResultAsString(keyevent.type(), keyevent.key_code(),
116 keyevent.code(), keyevent.flags(),
Zentaro Kavanaghc555ab452020-05-13 23:07:37117 keyevent.GetDomKey(), keyevent.scan_code());
[email protected]d13e288992014-05-01 18:00:21118}
119
Yuichiro Hanada87c6e552020-02-07 01:07:37120std::string GetRewrittenEventAsString(ui::EventRewriter* const rewriter,
121 ui::EventType ui_type,
122 ui::KeyboardCode ui_keycode,
123 ui::DomCode code,
124 int ui_flags, // ui::EventFlags
125 ui::DomKey key,
Zentaro Kavanaghc555ab452020-05-13 23:07:37126 uint32_t scan_code,
Yuichiro Hanada87c6e552020-02-07 01:07:37127 int device_id = kKeyboardDeviceId) {
Dmitry Torokhov0bcc3cf2017-07-15 17:50:30128 ui::KeyEvent event(ui_type, ui_keycode, code, ui_flags, key,
129 ui::EventTimeForNow());
Zentaro Kavanaghc555ab452020-05-13 23:07:37130 event.set_scan_code(scan_code);
Ahmed Fakhry629985b2018-07-30 20:57:32131 event.set_source_device_id(device_id);
Yuichiro Hanada87c6e552020-02-07 01:07:37132 TestEventRewriterContinuation continuation;
133 rewriter->RewriteEvent(event, continuation.weak_ptr_factory_.GetWeakPtr());
134 if (!continuation.rewritten_events.empty())
135 return GetKeyEventAsString(*continuation.rewritten_events[0]->AsKeyEvent());
[email protected]d13e288992014-05-01 18:00:21136 return GetKeyEventAsString(event);
[email protected]350c9232012-05-25 04:16:06137}
138
[email protected]106cf972014-05-28 17:28:17139// Table entry for simple single key event rewriting tests.
140struct KeyTestCase {
[email protected]106cf972014-05-28 17:28:17141 ui::EventType type;
kpschoedel8226fd152015-05-06 15:48:59142 struct Event {
[email protected]106cf972014-05-28 17:28:17143 ui::KeyboardCode key_code;
kpschoedel8226fd152015-05-06 15:48:59144 ui::DomCode code;
145 int flags; // ui::EventFlags
kpschoedel51d2e322015-08-28 15:29:35146 ui::DomKey::Base key;
Zentaro Kavanaghc555ab452020-05-13 23:07:37147 uint32_t scan_code = kNoScanCode;
[email protected]106cf972014-05-28 17:28:17148 } input, expected;
Ahmed Fakhry629985b2018-07-30 20:57:32149 int device_id = kKeyboardDeviceId;
Zentaro Kavanagh531da3d2021-02-24 18:21:26150 bool triggers_notification = false;
[email protected]106cf972014-05-28 17:28:17151};
[email protected]d13e288992014-05-01 18:00:21152
kpschoedel8226fd152015-05-06 15:48:59153std::string GetTestCaseAsString(ui::EventType ui_type,
154 const KeyTestCase::Event& test) {
155 return GetExpectedResultAsString(ui_type, test.key_code, test.code,
Zentaro Kavanaghc555ab452020-05-13 23:07:37156 test.flags, test.key, test.scan_code);
kpschoedel8226fd152015-05-06 15:48:59157}
158
[email protected]106cf972014-05-28 17:28:17159// Tests a single stateless key rewrite operation.
Yuichiro Hanada87c6e552020-02-07 01:07:37160void CheckKeyTestCase(ui::EventRewriter* const rewriter,
161 const KeyTestCase& test) {
kpschoedel02c854d2015-06-16 14:44:29162 SCOPED_TRACE("\nSource: " + GetTestCaseAsString(test.type, test.input));
Dmitry Torokhov3e2b7d82020-02-13 18:04:43163 EXPECT_EQ(GetTestCaseAsString(test.type, test.expected),
Ahmed Fakhry629985b2018-07-30 20:57:32164 GetRewrittenEventAsString(rewriter, test.type, test.input.key_code,
165 test.input.code, test.input.flags,
Zentaro Kavanaghc555ab452020-05-13 23:07:37166 test.input.key, test.input.scan_code,
167 test.device_id));
[email protected]36552d52014-06-06 18:52:03168}
169
[email protected]7f926752014-01-30 09:16:35170} // namespace
171
[email protected]9d6182f2014-02-16 04:21:56172namespace chromeos {
173
Scott Violet6ac56412018-12-19 17:25:50174class EventRewriterTest : public ChromeAshTestBase {
[email protected]350c9232012-05-25 04:16:06175 public:
[email protected]b9d224c2012-07-13 01:09:03176 EventRewriterTest()
Henrique Ferreirocddc8012021-03-26 00:47:15177 : fake_user_manager_(new FakeChromeUserManager),
Xiyuan Xiadfe3a9f2017-11-13 21:46:26178 user_manager_enabler_(base::WrapUnique(fake_user_manager_)) {}
dchengc97a0282015-01-15 23:04:24179 ~EventRewriterTest() override {}
[email protected]59409342012-09-21 01:03:43180
dchengc97a0282015-01-15 23:04:24181 void SetUp() override {
azurewei045de382017-01-06 02:06:00182 input_method_manager_mock_ = new input_method::MockInputMethodManagerImpl;
[email protected]c02a4242012-12-11 18:36:32183 chromeos::input_method::InitializeForTesting(
[email protected]59409342012-09-21 01:03:43184 input_method_manager_mock_); // pass ownership
Zentaro Kavanagh531da3d2021-02-24 18:21:26185 auto deprecation_controller =
186 std::make_unique<ash::DeprecationNotificationController>(
187 &message_center_);
188 deprecation_controller_ = deprecation_controller.get();
189 delegate_ = std::make_unique<EventRewriterDelegateImpl>(
190 nullptr, std::move(deprecation_controller));
penghuange5df2822017-03-16 22:54:36191 delegate_->set_pref_service_for_testing(prefs());
Zentaro Kavanagh358a88252020-05-13 19:48:07192 device_data_manager_test_api_.SetKeyboardDevices({});
Jimmy Gong82c82b42021-04-17 03:12:33193 rewriter_ = std::make_unique<ui::EventRewriterChromeOS>(
194 delegate_.get(), nullptr, false, &fake_ime_keyboard_);
Scott Violet6ac56412018-12-19 17:25:50195 ChromeAshTestBase::SetUp();
[email protected]59409342012-09-21 01:03:43196 }
197
dchengc97a0282015-01-15 23:04:24198 void TearDown() override {
Scott Violet6ac56412018-12-19 17:25:50199 ChromeAshTestBase::TearDown();
[email protected]59409342012-09-21 01:03:43200 // Shutdown() deletes the IME mock object.
[email protected]c02a4242012-12-11 18:36:32201 chromeos::input_method::Shutdown();
[email protected]18fdab02012-06-25 17:04:53202 }
[email protected]350c9232012-05-25 04:16:06203
Yuichiro Hanada87c6e552020-02-07 01:07:37204 ui::EventRewriter* rewriter() { return rewriter_.get(); }
205
[email protected]350c9232012-05-25 04:16:06206 protected:
[email protected]25ab8f12013-02-01 14:30:15207 void TestRewriteNumPadKeys();
208 void TestRewriteNumPadKeysOnAppleKeyboard();
209
Zentaro Kavanaghe7133ce2019-05-30 00:22:14210 // Parameterized version of test depending on feature flag values. The feature
211 // kUseSearchClickForRightClick determines if this should test for alt-click
212 // or search-click.
213 void DontRewriteIfNotRewritten(int right_click_flags);
214
Yuichiro Hanada875de4f32020-02-15 00:48:37215 ui::MouseEvent RewriteMouseButtonEvent(const ui::MouseEvent& event) {
216 TestEventRewriterContinuation continuation;
217 rewriter_->RewriteMouseButtonEventForTesting(
218 event, continuation.weak_ptr_factory_.GetWeakPtr());
219 if (!continuation.rewritten_events.empty())
220 return ui::MouseEvent(*continuation.rewritten_events[0]->AsMouseEvent());
221 return ui::MouseEvent(event);
[email protected]7f926752014-01-30 09:16:35222 }
223
penghuange5df2822017-03-16 22:54:36224 sync_preferences::TestingPrefServiceSyncable* prefs() { return &prefs_; }
225
Blake O'Harea09fa45a2017-10-13 04:19:58226 void InitModifierKeyPref(IntegerPrefMember* int_pref,
227 const std::string& pref_name,
228 ui::chromeos::ModifierKey modifierKey) {
229 if (int_pref->GetPrefName() != pref_name) // skip if already initialized.
230 int_pref->Init(pref_name, prefs());
231 int_pref->SetValue(static_cast<int>(modifierKey));
232 }
233
Zentaro Kavanagh1e7d867c2020-05-13 01:18:44234 void SetupKeyboard(const std::string& name,
235 const std::string& layout = "",
Zentaro Kavanaghc65969ef2020-05-14 00:58:43236 ui::InputDeviceType type = ui::INPUT_DEVICE_INTERNAL,
237 bool has_custom_top_row = false) {
Zentaro Kavanagh358a88252020-05-13 19:48:07238 // Add a fake device to udev.
239 const ui::InputDevice keyboard(kKeyboardDeviceId, type, name, /*phys=*/"",
240 base::FilePath(kKbdSysPath), /*vendor=*/-1,
241 /*product=*/-1, /*version=*/-1);
Zentaro Kavanaghc65969ef2020-05-14 00:58:43242
243 // Old CrOS keyboards supply an integer/enum as a sysfs property to identify
244 // their layout type. New keyboards provide the mapping of scan codes to
245 // F-Key position via an attribute.
Zentaro Kavanagh358a88252020-05-13 19:48:07246 std::map<std::string, std::string> sysfs_properties;
Zentaro Kavanaghc65969ef2020-05-14 00:58:43247 std::map<std::string, std::string> sysfs_attributes;
248 if (has_custom_top_row) {
249 if (!layout.empty())
250 sysfs_attributes[kKbdTopRowLayoutAttributeName] = layout;
251 } else {
252 if (!layout.empty())
253 sysfs_properties[kKbdTopRowPropertyName] = layout;
254 }
Zentaro Kavanagh358a88252020-05-13 19:48:07255
256 fake_udev_.Reset();
Zentaro Kavanaghc65969ef2020-05-14 00:58:43257 fake_udev_.AddFakeDevice(keyboard.name, keyboard.sys_path.value(),
Anton Bikineev46bbb972021-05-15 17:53:53258 /*subsystem=*/"input", /*devnode=*/absl::nullopt,
259 /*devtype=*/absl::nullopt,
Matt Reynolds0f9a4032021-02-27 01:29:26260 std::move(sysfs_attributes),
Zentaro Kavanagh358a88252020-05-13 19:48:07261 std::move(sysfs_properties));
262
263 // Reset the state of the device manager.
264 device_data_manager_test_api_.SetKeyboardDevices({});
265 device_data_manager_test_api_.SetKeyboardDevices({keyboard});
266
267 // Reset the state of the EventRewriter.
Dmitry Torokhov3e2b7d82020-02-13 18:04:43268 rewriter_->ResetStateForTesting();
Zentaro Kavanagh358a88252020-05-13 19:48:07269 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId);
Dmitry Torokhov3e2b7d82020-02-13 18:04:43270 rewriter_->set_last_keyboard_device_id_for_testing(kKeyboardDeviceId);
Zentaro Kavanagh1e7d867c2020-05-13 01:18:44271 }
Dmitry Torokhov3e2b7d82020-02-13 18:04:43272
Zentaro Kavanagh1e7d867c2020-05-13 01:18:44273 void TestKeyboard(const std::string& name,
274 const std::string& layout,
275 ui::InputDeviceType type,
Zentaro Kavanaghc65969ef2020-05-14 00:58:43276 bool has_custom_top_row,
Zentaro Kavanagh1e7d867c2020-05-13 01:18:44277 const std::vector<KeyTestCase>& tests) {
Zentaro Kavanaghc65969ef2020-05-14 00:58:43278 SetupKeyboard(name, layout, type, has_custom_top_row);
Zentaro Kavanagh531da3d2021-02-24 18:21:26279 for (const auto& test : tests) {
Dmitry Torokhov3e2b7d82020-02-13 18:04:43280 CheckKeyTestCase(rewriter(), test);
Zentaro Kavanagh531da3d2021-02-24 18:21:26281 const size_t expected_notification_count =
282 test.triggers_notification ? 1 : 0;
283 EXPECT_EQ(message_center_.NotificationCount(),
284 expected_notification_count);
285 ClearNotifications();
286 }
Dmitry Torokhov3e2b7d82020-02-13 18:04:43287 }
288
289 void TestInternalChromeKeyboard(const std::vector<KeyTestCase>& tests) {
290 TestKeyboard("Internal Keyboard", kKbdTopRowLayoutUnspecified,
Zentaro Kavanaghc65969ef2020-05-14 00:58:43291 ui::INPUT_DEVICE_INTERNAL, /*has_custom_top_row=*/false,
292 tests);
293 }
294
295 void TestInternalChromeCustomLayoutKeyboard(
296 const std::vector<KeyTestCase>& tests) {
297 TestKeyboard("Internal Custom Layout Keyboard",
298 kKbdDefaultCustomTopRowLayout, ui::INPUT_DEVICE_INTERNAL,
299 /*has_custom_top_row=*/true, tests);
Dmitry Torokhov3e2b7d82020-02-13 18:04:43300 }
301
302 void TestExternalChromeKeyboard(const std::vector<KeyTestCase>& tests) {
303 TestKeyboard("External Chrome Keyboard", kKbdTopRowLayout1Tag,
Zentaro Kavanaghc65969ef2020-05-14 00:58:43304 ui::INPUT_DEVICE_UNKNOWN, /*has_custom_top_row=*/false, tests);
305 }
306
307 void TestExternalChromeCustomLayoutKeyboard(
308 const std::vector<KeyTestCase>& tests) {
309 TestKeyboard("External Chrome Custom Layout Keyboard",
310 kKbdDefaultCustomTopRowLayout, ui::INPUT_DEVICE_UNKNOWN,
311 /*has_custom_top_row=*/true, tests);
Dmitry Torokhov3e2b7d82020-02-13 18:04:43312 }
313
314 void TestExternalGenericKeyboard(const std::vector<KeyTestCase>& tests) {
315 TestKeyboard("PC Keyboard", kKbdTopRowLayoutUnspecified,
Zentaro Kavanaghc65969ef2020-05-14 00:58:43316 ui::INPUT_DEVICE_UNKNOWN, /*has_custom_top_row=*/false, tests);
Dmitry Torokhov3e2b7d82020-02-13 18:04:43317 }
318
319 void TestExternalAppleKeyboard(const std::vector<KeyTestCase>& tests) {
320 TestKeyboard("Apple Keyboard", kKbdTopRowLayoutUnspecified,
Zentaro Kavanaghc65969ef2020-05-14 00:58:43321 ui::INPUT_DEVICE_UNKNOWN, /*has_custom_top_row=*/false, tests);
Dmitry Torokhov3e2b7d82020-02-13 18:04:43322 }
323
324 void TestChromeKeyboardVariants(const std::vector<KeyTestCase>& tests) {
325 TestInternalChromeKeyboard(tests);
326 TestExternalChromeKeyboard(tests);
327 }
328
Zentaro Kavanaghc65969ef2020-05-14 00:58:43329 void TestChromeCustomLayoutKeyboardVariants(
330 const std::vector<KeyTestCase>& tests) {
331 TestInternalChromeCustomLayoutKeyboard(tests);
332 TestExternalChromeCustomLayoutKeyboard(tests);
333 }
334
Dmitry Torokhov3e2b7d82020-02-13 18:04:43335 void TestNonAppleKeyboardVariants(const std::vector<KeyTestCase>& tests) {
336 TestChromeKeyboardVariants(tests);
Zentaro Kavanaghc65969ef2020-05-14 00:58:43337 TestChromeCustomLayoutKeyboardVariants(tests);
338 TestExternalGenericKeyboard(tests);
339 }
340
341 void TestNonAppleNonCustomLayoutKeyboardVariants(
342 const std::vector<KeyTestCase>& tests) {
343 TestChromeKeyboardVariants(tests);
Dmitry Torokhov3e2b7d82020-02-13 18:04:43344 TestExternalGenericKeyboard(tests);
345 }
346
347 void TestAllKeyboardVariants(const std::vector<KeyTestCase>& tests) {
348 TestNonAppleKeyboardVariants(tests);
349 TestExternalAppleKeyboard(tests);
350 }
351
Zentaro Kavanaghd6112d82021-02-19 21:21:32352 void ClearNotifications() {
353 message_center_.RemoveAllNotifications(
354 false, message_center::FakeMessageCenter::RemoveType::ALL);
Zentaro Kavanagh531da3d2021-02-24 18:21:26355 deprecation_controller_->ResetStateForTesting();
Zentaro Kavanaghd6112d82021-02-19 21:21:32356 }
357
Zentaro Kavanaghe7133ce2019-05-30 00:22:14358 base::test::ScopedFeatureList scoped_feature_list_;
azurewei045de382017-01-06 02:06:00359 FakeChromeUserManager* fake_user_manager_; // Not owned.
Xiyuan Xiadfe3a9f2017-11-13 21:46:26360 user_manager::ScopedUserManager user_manager_enabler_;
azurewei045de382017-01-06 02:06:00361 input_method::MockInputMethodManagerImpl* input_method_manager_mock_;
Zentaro Kavanagh358a88252020-05-13 19:48:07362 testing::FakeUdevLoader fake_udev_;
363 ui::DeviceDataManagerTestApi device_data_manager_test_api_;
penghuange5df2822017-03-16 22:54:36364
365 sync_preferences::TestingPrefServiceSyncable prefs_;
366 std::unique_ptr<EventRewriterDelegateImpl> delegate_;
Jimmy Gong82c82b42021-04-17 03:12:33367 chromeos::input_method::FakeImeKeyboard fake_ime_keyboard_;
penghuange5df2822017-03-16 22:54:36368 std::unique_ptr<ui::EventRewriterChromeOS> rewriter_;
Zentaro Kavanagh531da3d2021-02-24 18:21:26369 ash::DeprecationNotificationController*
370 deprecation_controller_; // Not owned.
Zentaro Kavanaghd6112d82021-02-19 21:21:32371 message_center::FakeMessageCenter message_center_;
[email protected]350c9232012-05-25 04:16:06372};
373
[email protected]b9d224c2012-07-13 01:09:03374TEST_F(EventRewriterTest, TestRewriteCommandToControl) {
Dmitry Torokhov3e2b7d82020-02-13 18:04:43375 // First, test non Apple keyboards, they should all behave the same.
376 TestNonAppleKeyboardVariants({
[email protected]106cf972014-05-28 17:28:17377 // VKEY_A, Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29378 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19379 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN,
kpschoedel51d2e322015-08-28 15:29:35380 ui::DomKey::UNIDENTIFIED},
kpschoedela281bf12016-01-07 15:08:19381 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN,
kpschoedel51d2e322015-08-28 15:29:35382 ui::DomKey::UNIDENTIFIED}},
[email protected]d13e288992014-05-01 18:00:21383
[email protected]106cf972014-05-28 17:28:17384 // VKEY_A, Win modifier.
kpschoedel02c854d2015-06-16 14:44:29385 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19386 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:35387 ui::DomKey::UNIDENTIFIED},
kpschoedela281bf12016-01-07 15:08:19388 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:35389 ui::DomKey::UNIDENTIFIED}},
[email protected]d13e288992014-05-01 18:00:21390
[email protected]106cf972014-05-28 17:28:17391 // VKEY_A, Alt+Win modifier.
kpschoedel02c854d2015-06-16 14:44:29392 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19393 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:35394 ui::DomKey::UNIDENTIFIED},
kpschoedela281bf12016-01-07 15:08:19395 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:35396 ui::DomKey::UNIDENTIFIED}},
[email protected]350c9232012-05-25 04:16:06397
[email protected]106cf972014-05-28 17:28:17398 // VKEY_LWIN (left Windows key), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29399 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59400 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:13401 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, ui::DomKey::META},
dtapuskaaf863af2016-04-21 14:33:59402 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:13403 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, ui::DomKey::META}},
[email protected]350c9232012-05-25 04:16:06404
[email protected]106cf972014-05-28 17:28:17405 // VKEY_RWIN (right Windows key), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29406 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59407 {ui::VKEY_RWIN, ui::DomCode::META_RIGHT,
kpschoedel0a8b03052016-02-17 15:35:13408 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, ui::DomKey::META},
dtapuskaaf863af2016-04-21 14:33:59409 {ui::VKEY_RWIN, ui::DomCode::META_RIGHT,
kpschoedel0a8b03052016-02-17 15:35:13410 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, ui::DomKey::META}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:43411 });
[email protected]350c9232012-05-25 04:16:06412
Ahmed Fakhry629985b2018-07-30 20:57:32413 // Simulate the default initialization of the Apple Command key remap pref to
414 // Ctrl.
415 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
416
Dmitry Torokhov3e2b7d82020-02-13 18:04:43417 TestExternalAppleKeyboard({
[email protected]106cf972014-05-28 17:28:17418 // VKEY_A, Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29419 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19420 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN,
kpschoedel51d2e322015-08-28 15:29:35421 ui::DomKey::UNIDENTIFIED},
kpschoedela281bf12016-01-07 15:08:19422 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN,
kpschoedel51d2e322015-08-28 15:29:35423 ui::DomKey::UNIDENTIFIED}},
[email protected]350c9232012-05-25 04:16:06424
[email protected]106cf972014-05-28 17:28:17425 // VKEY_A, Win modifier.
kpschoedel02c854d2015-06-16 14:44:29426 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19427 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:35428 ui::DomKey::UNIDENTIFIED},
kpschoedela281bf12016-01-07 15:08:19429 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:53430 ui::DomKey::Constant<'a'>::Character}},
[email protected]350c9232012-05-25 04:16:06431
[email protected]106cf972014-05-28 17:28:17432 // VKEY_A, Alt+Win modifier.
kpschoedel02c854d2015-06-16 14:44:29433 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19434 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:35435 ui::DomKey::UNIDENTIFIED},
kpschoedela281bf12016-01-07 15:08:19436 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:53437 ui::DomKey::Constant<'a'>::Character}},
[email protected]350c9232012-05-25 04:16:06438
[email protected]106cf972014-05-28 17:28:17439 // VKEY_LWIN (left Windows key), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29440 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59441 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:13442 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:35443 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
444 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::CONTROL}},
[email protected]350c9232012-05-25 04:16:06445
[email protected]106cf972014-05-28 17:28:17446 // VKEY_RWIN (right Windows key), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29447 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59448 {ui::VKEY_RWIN, ui::DomCode::META_RIGHT,
kpschoedel0a8b03052016-02-17 15:35:13449 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:35450 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_RIGHT,
451 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::CONTROL}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:43452 });
Ahmed Fakhry629985b2018-07-30 20:57:32453
454 // Now simulate the user remapped the Command key back to Search.
455 IntegerPrefMember command;
456 InitModifierKeyPref(&command, prefs::kLanguageRemapExternalCommandKeyTo,
457 ui::chromeos::ModifierKey::kSearchKey);
458
Dmitry Torokhov3e2b7d82020-02-13 18:04:43459 TestExternalAppleKeyboard({
Ahmed Fakhry629985b2018-07-30 20:57:32460 // VKEY_A, Win modifier.
461 {ui::ET_KEY_PRESSED,
462 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_COMMAND_DOWN,
463 ui::DomKey::UNIDENTIFIED},
464 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_COMMAND_DOWN,
465 ui::DomKey::UNIDENTIFIED}},
466
467 // VKEY_A, Alt+Win modifier.
468 {ui::ET_KEY_PRESSED,
469 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
470 ui::DomKey::UNIDENTIFIED},
471 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
472 ui::DomKey::UNIDENTIFIED}},
473
474 // VKEY_LWIN (left Windows key), Alt modifier.
475 {ui::ET_KEY_PRESSED,
476 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
477 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
478 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
479 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META}},
480
481 // VKEY_RWIN (right Windows key), Alt modifier.
482 {ui::ET_KEY_PRESSED,
483 {ui::VKEY_RWIN, ui::DomCode::META_RIGHT,
484 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
485 {ui::VKEY_LWIN, ui::DomCode::META_RIGHT,
486 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:43487 });
Ahmed Fakhry629985b2018-07-30 20:57:32488}
489
490TEST_F(EventRewriterTest, TestRewriteExternalMetaKey) {
491 // Simulate the default initialization of the Meta key on external keyboards
492 // remap pref to Search.
493 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
494
Dmitry Torokhov3e2b7d82020-02-13 18:04:43495 // By default, the Meta key on all keyboards, internal, external Chrome OS
496 // branded keyboards, and Generic keyboards should produce Search.
497 TestNonAppleKeyboardVariants({
Ahmed Fakhry629985b2018-07-30 20:57:32498 // VKEY_A, Win modifier.
499 {ui::ET_KEY_PRESSED,
500 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_COMMAND_DOWN,
501 ui::DomKey::UNIDENTIFIED},
502 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_COMMAND_DOWN,
Dmitry Torokhov3e2b7d82020-02-13 18:04:43503 ui::DomKey::UNIDENTIFIED}},
Ahmed Fakhry629985b2018-07-30 20:57:32504
505 // VKEY_A, Alt+Win modifier.
506 {ui::ET_KEY_PRESSED,
507 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
508 ui::DomKey::UNIDENTIFIED},
509 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
Dmitry Torokhov3e2b7d82020-02-13 18:04:43510 ui::DomKey::UNIDENTIFIED}},
Ahmed Fakhry629985b2018-07-30 20:57:32511
512 // VKEY_LWIN (left Windows key), Alt modifier.
513 {ui::ET_KEY_PRESSED,
514 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
515 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
516 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
Dmitry Torokhov3e2b7d82020-02-13 18:04:43517 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META}},
Ahmed Fakhry629985b2018-07-30 20:57:32518
519 // VKEY_RWIN (right Windows key), Alt modifier.
520 {ui::ET_KEY_PRESSED,
521 {ui::VKEY_RWIN, ui::DomCode::META_RIGHT,
522 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
523 {ui::VKEY_LWIN, ui::DomCode::META_RIGHT,
Dmitry Torokhov3e2b7d82020-02-13 18:04:43524 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META}},
525 });
Ahmed Fakhry629985b2018-07-30 20:57:32526
Dmitry Torokhov3e2b7d82020-02-13 18:04:43527 // Both preferences for Search on Chrome keyboards, and external Meta on
528 // generic external keyboards are independent, even if one or both are
529 // modified.
Ahmed Fakhry629985b2018-07-30 20:57:32530
Dmitry Torokhov3e2b7d82020-02-13 18:04:43531 // Remap Chrome OS Search to Ctrl.
Ahmed Fakhry629985b2018-07-30 20:57:32532 IntegerPrefMember internal_search;
533 InitModifierKeyPref(&internal_search, prefs::kLanguageRemapSearchKeyTo,
534 ui::chromeos::ModifierKey::kControlKey);
535
Dmitry Torokhov3e2b7d82020-02-13 18:04:43536 // Remap external Meta to Alt.
Ahmed Fakhry629985b2018-07-30 20:57:32537 IntegerPrefMember meta;
538 InitModifierKeyPref(&meta, prefs::kLanguageRemapExternalMetaKeyTo,
539 ui::chromeos::ModifierKey::kAltKey);
540
Dmitry Torokhov3e2b7d82020-02-13 18:04:43541 TestChromeKeyboardVariants({
Ahmed Fakhry629985b2018-07-30 20:57:32542 // VKEY_A, Win modifier.
543 {ui::ET_KEY_PRESSED,
544 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_COMMAND_DOWN,
545 ui::DomKey::UNIDENTIFIED},
546 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_CONTROL_DOWN,
Dmitry Torokhov3e2b7d82020-02-13 18:04:43547 ui::DomKey::Constant<'a'>::Character}},
Ahmed Fakhry629985b2018-07-30 20:57:32548
549 // VKEY_A, Alt+Win modifier.
550 {ui::ET_KEY_PRESSED,
551 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
552 ui::DomKey::UNIDENTIFIED},
553 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
Dmitry Torokhov3e2b7d82020-02-13 18:04:43554 ui::DomKey::Constant<'a'>::Character}},
Ahmed Fakhry629985b2018-07-30 20:57:32555
556 // VKEY_LWIN (left Windows key), Alt modifier.
557 {ui::ET_KEY_PRESSED,
558 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
559 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
560 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
Dmitry Torokhov3e2b7d82020-02-13 18:04:43561 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::CONTROL}},
Ahmed Fakhry629985b2018-07-30 20:57:32562
563 // VKEY_RWIN (right Windows key), Alt modifier.
564 {ui::ET_KEY_PRESSED,
565 {ui::VKEY_RWIN, ui::DomCode::META_RIGHT,
566 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
567 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_RIGHT,
Dmitry Torokhov3e2b7d82020-02-13 18:04:43568 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::CONTROL}},
569 });
Ahmed Fakhry629985b2018-07-30 20:57:32570
Dmitry Torokhov3e2b7d82020-02-13 18:04:43571 TestExternalGenericKeyboard({
Ahmed Fakhry629985b2018-07-30 20:57:32572 // VKEY_A, Win modifier.
573 {ui::ET_KEY_PRESSED,
574 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_COMMAND_DOWN,
575 ui::DomKey::UNIDENTIFIED},
576 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN,
Dmitry Torokhov3e2b7d82020-02-13 18:04:43577 ui::DomKey::Constant<'a'>::Character}},
Ahmed Fakhry629985b2018-07-30 20:57:32578
579 // VKEY_A, Alt+Win modifier.
580 {ui::ET_KEY_PRESSED,
581 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
582 ui::DomKey::UNIDENTIFIED},
583 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN,
Dmitry Torokhov3e2b7d82020-02-13 18:04:43584 ui::DomKey::Constant<'a'>::Character}},
Ahmed Fakhry629985b2018-07-30 20:57:32585
586 // VKEY_LWIN (left Windows key), Alt modifier.
587 {ui::ET_KEY_PRESSED,
588 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
589 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
Dmitry Torokhov3e2b7d82020-02-13 18:04:43590 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN,
591 ui::DomKey::ALT}},
Ahmed Fakhry629985b2018-07-30 20:57:32592
593 // VKEY_RWIN (right Windows key), Alt modifier.
594 {ui::ET_KEY_PRESSED,
595 {ui::VKEY_RWIN, ui::DomCode::META_RIGHT,
596 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
597 {ui::VKEY_MENU, ui::DomCode::ALT_RIGHT, ui::EF_ALT_DOWN,
Dmitry Torokhov3e2b7d82020-02-13 18:04:43598 ui::DomKey::ALT}},
599 });
[email protected]9822df92012-03-31 03:52:56600}
[email protected]2d1934f2012-04-19 18:51:22601
[email protected]216d9162012-06-22 01:48:16602// For crbug.com/133896.
[email protected]b9d224c2012-07-13 01:09:03603TEST_F(EventRewriterTest, TestRewriteCommandToControlWithControlRemapped) {
[email protected]216d9162012-06-22 01:48:16604 // Remap Control to Alt.
penghuange5df2822017-03-16 22:54:36605 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]216d9162012-06-22 01:48:16606 IntegerPrefMember control;
Blake O'Harea09fa45a2017-10-13 04:19:58607 InitModifierKeyPref(&control, prefs::kLanguageRemapControlKeyTo,
608 ui::chromeos::ModifierKey::kAltKey);
[email protected]216d9162012-06-22 01:48:16609
Dmitry Torokhov3e2b7d82020-02-13 18:04:43610 TestNonAppleKeyboardVariants({
kpschoedel8226fd152015-05-06 15:48:59611 // Control should be remapped to Alt.
kpschoedel02c854d2015-06-16 14:44:29612 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35613 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
614 ui::DomKey::CONTROL},
615 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN,
616 ui::DomKey::ALT}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:43617 });
[email protected]106cf972014-05-28 17:28:17618
Dmitry Torokhov3e2b7d82020-02-13 18:04:43619 // Now verify that remapping does not affect Apple keyboard.
620 TestExternalAppleKeyboard({
[email protected]106cf972014-05-28 17:28:17621 // VKEY_LWIN (left Command key) with Alt modifier. The remapped Command
622 // key should never be re-remapped to Alt.
kpschoedel02c854d2015-06-16 14:44:29623 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59624 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:13625 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:35626 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
627 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::CONTROL}},
[email protected]216d9162012-06-22 01:48:16628
[email protected]106cf972014-05-28 17:28:17629 // VKEY_RWIN (right Command key) with Alt modifier. The remapped Command
630 // key should never be re-remapped to Alt.
kpschoedel02c854d2015-06-16 14:44:29631 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59632 {ui::VKEY_RWIN, ui::DomCode::META_RIGHT,
kpschoedel0a8b03052016-02-17 15:35:13633 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:35634 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_RIGHT,
635 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::CONTROL}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:43636 });
[email protected]216d9162012-06-22 01:48:16637}
638
[email protected]25ab8f12013-02-01 14:30:15639void EventRewriterTest::TestRewriteNumPadKeys() {
Dmitry Torokhov3e2b7d82020-02-13 18:04:43640 // Even if most Chrome OS keyboards do not have numpad, they should still
641 // handle it the same way as generic PC keyboards.
642 TestNonAppleKeyboardVariants({
[email protected]106cf972014-05-28 17:28:17643 // XK_KP_Insert (= NumPad 0 without Num Lock), no modifier.
kpschoedel02c854d2015-06-16 14:44:29644 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35645 {ui::VKEY_INSERT, ui::DomCode::NUMPAD0, ui::EF_NONE, ui::DomKey::INSERT},
646 {ui::VKEY_NUMPAD0, ui::DomCode::NUMPAD0, ui::EF_NONE,
647 ui::DomKey::Constant<'0'>::Character}},
[email protected]350c9232012-05-25 04:16:06648
[email protected]106cf972014-05-28 17:28:17649 // XK_KP_Insert (= NumPad 0 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29650 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35651 {ui::VKEY_INSERT, ui::DomCode::NUMPAD0, ui::EF_ALT_DOWN,
652 ui::DomKey::INSERT},
653 {ui::VKEY_NUMPAD0, ui::DomCode::NUMPAD0, ui::EF_ALT_DOWN,
654 ui::DomKey::Constant<'0'>::Character}},
[email protected]350c9232012-05-25 04:16:06655
[email protected]106cf972014-05-28 17:28:17656 // XK_KP_Delete (= NumPad . without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29657 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35658 {ui::VKEY_DELETE, ui::DomCode::NUMPAD_DECIMAL, ui::EF_ALT_DOWN,
659 ui::DomKey::DEL},
660 {ui::VKEY_DECIMAL, ui::DomCode::NUMPAD_DECIMAL, ui::EF_ALT_DOWN,
661 ui::DomKey::Constant<'.'>::Character}},
[email protected]350c9232012-05-25 04:16:06662
[email protected]106cf972014-05-28 17:28:17663 // XK_KP_End (= NumPad 1 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29664 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35665 {ui::VKEY_END, ui::DomCode::NUMPAD1, ui::EF_ALT_DOWN, ui::DomKey::END},
666 {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_ALT_DOWN,
667 ui::DomKey::Constant<'1'>::Character}},
[email protected]350c9232012-05-25 04:16:06668
[email protected]106cf972014-05-28 17:28:17669 // XK_KP_Down (= NumPad 2 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29670 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35671 {ui::VKEY_DOWN, ui::DomCode::NUMPAD2, ui::EF_ALT_DOWN,
672 ui::DomKey::ARROW_DOWN},
673 {ui::VKEY_NUMPAD2, ui::DomCode::NUMPAD2, ui::EF_ALT_DOWN,
674 ui::DomKey::Constant<'2'>::Character}},
[email protected]350c9232012-05-25 04:16:06675
[email protected]106cf972014-05-28 17:28:17676 // XK_KP_Next (= NumPad 3 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29677 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35678 {ui::VKEY_NEXT, ui::DomCode::NUMPAD3, ui::EF_ALT_DOWN,
679 ui::DomKey::PAGE_DOWN},
680 {ui::VKEY_NUMPAD3, ui::DomCode::NUMPAD3, ui::EF_ALT_DOWN,
681 ui::DomKey::Constant<'3'>::Character}},
[email protected]350c9232012-05-25 04:16:06682
[email protected]106cf972014-05-28 17:28:17683 // XK_KP_Left (= NumPad 4 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29684 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35685 {ui::VKEY_LEFT, ui::DomCode::NUMPAD4, ui::EF_ALT_DOWN,
686 ui::DomKey::ARROW_LEFT},
687 {ui::VKEY_NUMPAD4, ui::DomCode::NUMPAD4, ui::EF_ALT_DOWN,
688 ui::DomKey::Constant<'4'>::Character}},
[email protected]350c9232012-05-25 04:16:06689
[email protected]106cf972014-05-28 17:28:17690 // XK_KP_Begin (= NumPad 5 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29691 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35692 {ui::VKEY_CLEAR, ui::DomCode::NUMPAD5, ui::EF_ALT_DOWN,
693 ui::DomKey::CLEAR},
694 {ui::VKEY_NUMPAD5, ui::DomCode::NUMPAD5, ui::EF_ALT_DOWN,
695 ui::DomKey::Constant<'5'>::Character}},
[email protected]350c9232012-05-25 04:16:06696
[email protected]106cf972014-05-28 17:28:17697 // XK_KP_Right (= NumPad 6 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29698 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35699 {ui::VKEY_RIGHT, ui::DomCode::NUMPAD6, ui::EF_ALT_DOWN,
700 ui::DomKey::ARROW_RIGHT},
701 {ui::VKEY_NUMPAD6, ui::DomCode::NUMPAD6, ui::EF_ALT_DOWN,
702 ui::DomKey::Constant<'6'>::Character}},
[email protected]350c9232012-05-25 04:16:06703
[email protected]106cf972014-05-28 17:28:17704 // XK_KP_Home (= NumPad 7 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29705 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35706 {ui::VKEY_HOME, ui::DomCode::NUMPAD7, ui::EF_ALT_DOWN, ui::DomKey::HOME},
707 {ui::VKEY_NUMPAD7, ui::DomCode::NUMPAD7, ui::EF_ALT_DOWN,
708 ui::DomKey::Constant<'7'>::Character}},
[email protected]350c9232012-05-25 04:16:06709
[email protected]106cf972014-05-28 17:28:17710 // XK_KP_Up (= NumPad 8 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29711 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35712 {ui::VKEY_UP, ui::DomCode::NUMPAD8, ui::EF_ALT_DOWN,
713 ui::DomKey::ARROW_UP},
714 {ui::VKEY_NUMPAD8, ui::DomCode::NUMPAD8, ui::EF_ALT_DOWN,
715 ui::DomKey::Constant<'8'>::Character}},
[email protected]350c9232012-05-25 04:16:06716
[email protected]106cf972014-05-28 17:28:17717 // XK_KP_Prior (= NumPad 9 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29718 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35719 {ui::VKEY_PRIOR, ui::DomCode::NUMPAD9, ui::EF_ALT_DOWN,
720 ui::DomKey::PAGE_UP},
721 {ui::VKEY_NUMPAD9, ui::DomCode::NUMPAD9, ui::EF_ALT_DOWN,
722 ui::DomKey::Constant<'9'>::Character}},
[email protected]350c9232012-05-25 04:16:06723
[email protected]106cf972014-05-28 17:28:17724 // XK_KP_0 (= NumPad 0 with Num Lock), Num Lock modifier.
kpschoedel02c854d2015-06-16 14:44:29725 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35726 {ui::VKEY_NUMPAD0, ui::DomCode::NUMPAD0, ui::EF_NONE,
727 ui::DomKey::Constant<'0'>::Character},
728 {ui::VKEY_NUMPAD0, ui::DomCode::NUMPAD0, ui::EF_NONE,
729 ui::DomKey::Constant<'0'>::Character}},
[email protected]350c9232012-05-25 04:16:06730
[email protected]106cf972014-05-28 17:28:17731 // XK_KP_DECIMAL (= NumPad . with Num Lock), Num Lock modifier.
kpschoedel02c854d2015-06-16 14:44:29732 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35733 {ui::VKEY_DECIMAL, ui::DomCode::NUMPAD_DECIMAL, ui::EF_NONE,
734 ui::DomKey::Constant<'.'>::Character},
735 {ui::VKEY_DECIMAL, ui::DomCode::NUMPAD_DECIMAL, ui::EF_NONE,
736 ui::DomKey::Constant<'.'>::Character}},
[email protected]350c9232012-05-25 04:16:06737
[email protected]106cf972014-05-28 17:28:17738 // XK_KP_1 (= NumPad 1 with Num Lock), Num Lock modifier.
kpschoedel02c854d2015-06-16 14:44:29739 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35740 {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_NONE,
741 ui::DomKey::Constant<'1'>::Character},
742 {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_NONE,
743 ui::DomKey::Constant<'1'>::Character}},
[email protected]350c9232012-05-25 04:16:06744
[email protected]106cf972014-05-28 17:28:17745 // XK_KP_2 (= NumPad 2 with Num Lock), Num Lock modifier.
kpschoedel02c854d2015-06-16 14:44:29746 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35747 {ui::VKEY_NUMPAD2, ui::DomCode::NUMPAD2, ui::EF_NONE,
748 ui::DomKey::Constant<'2'>::Character},
749 {ui::VKEY_NUMPAD2, ui::DomCode::NUMPAD2, ui::EF_NONE,
750 ui::DomKey::Constant<'2'>::Character}},
[email protected]350c9232012-05-25 04:16:06751
[email protected]106cf972014-05-28 17:28:17752 // XK_KP_3 (= NumPad 3 with Num Lock), Num Lock modifier.
kpschoedel02c854d2015-06-16 14:44:29753 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35754 {ui::VKEY_NUMPAD3, ui::DomCode::NUMPAD3, ui::EF_NONE,
755 ui::DomKey::Constant<'3'>::Character},
756 {ui::VKEY_NUMPAD3, ui::DomCode::NUMPAD3, ui::EF_NONE,
757 ui::DomKey::Constant<'3'>::Character}},
[email protected]350c9232012-05-25 04:16:06758
[email protected]106cf972014-05-28 17:28:17759 // XK_KP_4 (= NumPad 4 with Num Lock), Num Lock modifier.
kpschoedel02c854d2015-06-16 14:44:29760 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35761 {ui::VKEY_NUMPAD4, ui::DomCode::NUMPAD4, ui::EF_NONE,
762 ui::DomKey::Constant<'4'>::Character},
763 {ui::VKEY_NUMPAD4, ui::DomCode::NUMPAD4, ui::EF_NONE,
764 ui::DomKey::Constant<'4'>::Character}},
[email protected]350c9232012-05-25 04:16:06765
kpschoedel8226fd152015-05-06 15:48:59766 // XK_KP_5 (= NumPad 5 with Num Lock), Num Lock
767 // modifier.
kpschoedel02c854d2015-06-16 14:44:29768 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35769 {ui::VKEY_NUMPAD5, ui::DomCode::NUMPAD5, ui::EF_NONE,
770 ui::DomKey::Constant<'5'>::Character},
771 {ui::VKEY_NUMPAD5, ui::DomCode::NUMPAD5, ui::EF_NONE,
772 ui::DomKey::Constant<'5'>::Character}},
[email protected]350c9232012-05-25 04:16:06773
kpschoedel8226fd152015-05-06 15:48:59774 // XK_KP_6 (= NumPad 6 with Num Lock), Num Lock
775 // modifier.
kpschoedel02c854d2015-06-16 14:44:29776 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35777 {ui::VKEY_NUMPAD6, ui::DomCode::NUMPAD6, ui::EF_NONE,
778 ui::DomKey::Constant<'6'>::Character},
779 {ui::VKEY_NUMPAD6, ui::DomCode::NUMPAD6, ui::EF_NONE,
780 ui::DomKey::Constant<'6'>::Character}},
[email protected]350c9232012-05-25 04:16:06781
kpschoedel8226fd152015-05-06 15:48:59782 // XK_KP_7 (= NumPad 7 with Num Lock), Num Lock
783 // modifier.
kpschoedel02c854d2015-06-16 14:44:29784 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35785 {ui::VKEY_NUMPAD7, ui::DomCode::NUMPAD7, ui::EF_NONE,
786 ui::DomKey::Constant<'7'>::Character},
787 {ui::VKEY_NUMPAD7, ui::DomCode::NUMPAD7, ui::EF_NONE,
788 ui::DomKey::Constant<'7'>::Character}},
[email protected]350c9232012-05-25 04:16:06789
kpschoedel8226fd152015-05-06 15:48:59790 // XK_KP_8 (= NumPad 8 with Num Lock), Num Lock
791 // modifier.
kpschoedel02c854d2015-06-16 14:44:29792 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35793 {ui::VKEY_NUMPAD8, ui::DomCode::NUMPAD8, ui::EF_NONE,
794 ui::DomKey::Constant<'8'>::Character},
795 {ui::VKEY_NUMPAD8, ui::DomCode::NUMPAD8, ui::EF_NONE,
796 ui::DomKey::Constant<'8'>::Character}},
[email protected]350c9232012-05-25 04:16:06797
kpschoedel8226fd152015-05-06 15:48:59798 // XK_KP_9 (= NumPad 9 with Num Lock), Num Lock
799 // modifier.
kpschoedel02c854d2015-06-16 14:44:29800 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35801 {ui::VKEY_NUMPAD9, ui::DomCode::NUMPAD9, ui::EF_NONE,
802 ui::DomKey::Constant<'9'>::Character},
803 {ui::VKEY_NUMPAD9, ui::DomCode::NUMPAD9, ui::EF_NONE,
804 ui::DomKey::Constant<'9'>::Character}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:43805 });
[email protected]2d1934f2012-04-19 18:51:22806}
[email protected]44de6072012-05-17 03:09:27807
[email protected]25ab8f12013-02-01 14:30:15808TEST_F(EventRewriterTest, TestRewriteNumPadKeys) {
809 TestRewriteNumPadKeys();
810}
811
[email protected]44de6072012-05-17 03:09:27812// Tests if the rewriter can handle a Command + Num Pad event.
[email protected]25ab8f12013-02-01 14:30:15813void EventRewriterTest::TestRewriteNumPadKeysOnAppleKeyboard() {
Ahmed Fakhry629985b2018-07-30 20:57:32814 // Simulate the default initialization of the Apple Command key remap pref to
815 // Ctrl.
816 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
817
Dmitry Torokhov3e2b7d82020-02-13 18:04:43818 TestExternalAppleKeyboard({
[email protected]106cf972014-05-28 17:28:17819 // XK_KP_End (= NumPad 1 without Num Lock), Win modifier.
820 // The result should be "Num Pad 1 with Control + Num Lock modifiers".
kpschoedel02c854d2015-06-16 14:44:29821 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35822 {ui::VKEY_END, ui::DomCode::NUMPAD1, ui::EF_COMMAND_DOWN,
823 ui::DomKey::END},
824 {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:53825 ui::DomKey::Constant<'1'>::Character}},
[email protected]350c9232012-05-25 04:16:06826
[email protected]106cf972014-05-28 17:28:17827 // XK_KP_1 (= NumPad 1 with Num Lock), Win modifier.
828 // The result should also be "Num Pad 1 with Control + Num Lock
829 // modifiers".
kpschoedel02c854d2015-06-16 14:44:29830 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35831 {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_COMMAND_DOWN,
832 ui::DomKey::Constant<'1'>::Character},
833 {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_CONTROL_DOWN,
Dmitry Torokhov3e2b7d82020-02-13 18:04:43834 ui::DomKey::Constant<'1'>::Character}},
835 });
[email protected]44de6072012-05-17 03:09:27836}
837
[email protected]25ab8f12013-02-01 14:30:15838TEST_F(EventRewriterTest, TestRewriteNumPadKeysOnAppleKeyboard) {
839 TestRewriteNumPadKeysOnAppleKeyboard();
840}
841
[email protected]b9d224c2012-07-13 01:09:03842TEST_F(EventRewriterTest, TestRewriteModifiersNoRemap) {
Dmitry Torokhov3e2b7d82020-02-13 18:04:43843 TestAllKeyboardVariants({
[email protected]106cf972014-05-28 17:28:17844 // Press Search. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29845 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59846 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_NONE, ui::DomKey::META},
847 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_COMMAND_DOWN,
kpschoedel0a8b03052016-02-17 15:35:13848 ui::DomKey::META}},
[email protected]350c9232012-05-25 04:16:06849
[email protected]106cf972014-05-28 17:28:17850 // Press left Control. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29851 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35852 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
853 ui::DomKey::CONTROL},
854 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
855 ui::DomKey::CONTROL}},
[email protected]350c9232012-05-25 04:16:06856
[email protected]106cf972014-05-28 17:28:17857 // Press right Control. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29858 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35859 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
860 ui::DomKey::CONTROL},
861 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
862 ui::DomKey::CONTROL}},
[email protected]350c9232012-05-25 04:16:06863
[email protected]106cf972014-05-28 17:28:17864 // Press left Alt. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29865 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35866 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, ui::DomKey::ALT},
867 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN,
868 ui::DomKey::ALT}},
[email protected]350c9232012-05-25 04:16:06869
[email protected]106cf972014-05-28 17:28:17870 // Press right Alt. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29871 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35872 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, ui::DomKey::ALT},
873 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN,
874 ui::DomKey::ALT}},
[email protected]350c9232012-05-25 04:16:06875
[email protected]106cf972014-05-28 17:28:17876 // Test KeyRelease event, just in case.
877 // Release Search. Confirm the release event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29878 {ui::ET_KEY_RELEASED,
dtapuskaaf863af2016-04-21 14:33:59879 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_NONE, ui::DomKey::META},
880 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_NONE, ui::DomKey::META}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:43881 });
[email protected]350c9232012-05-25 04:16:06882}
883
[email protected]b9d224c2012-07-13 01:09:03884TEST_F(EventRewriterTest, TestRewriteModifiersNoRemapMultipleKeys) {
Dmitry Torokhov3e2b7d82020-02-13 18:04:43885 TestAllKeyboardVariants({
[email protected]106cf972014-05-28 17:28:17886 // Press Alt with Shift. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29887 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35888 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT,
889 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ALT},
890 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT,
891 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ALT}},
[email protected]350c9232012-05-25 04:16:06892
michaelpg168ecd72016-08-25 04:00:42893 // Press Escape with Alt and Shift. Confirm the event is not rewritten.
894 {ui::ET_KEY_PRESSED,
895 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE,
896 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ESCAPE},
897 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE,
898 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ESCAPE}},
899
[email protected]106cf972014-05-28 17:28:17900 // Press Search with Caps Lock mask. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29901 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59902 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:13903 ui::EF_CAPS_LOCK_ON | ui::EF_COMMAND_DOWN, ui::DomKey::META},
dtapuskaaf863af2016-04-21 14:33:59904 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:13905 ui::EF_CAPS_LOCK_ON | ui::EF_COMMAND_DOWN, ui::DomKey::META}},
[email protected]350c9232012-05-25 04:16:06906
[email protected]106cf972014-05-28 17:28:17907 // Release Search with Caps Lock mask. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29908 {ui::ET_KEY_RELEASED,
dtapuskaaf863af2016-04-21 14:33:59909 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_CAPS_LOCK_ON,
kpschoedel0a8b03052016-02-17 15:35:13910 ui::DomKey::META},
dtapuskaaf863af2016-04-21 14:33:59911 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_CAPS_LOCK_ON,
kpschoedel0a8b03052016-02-17 15:35:13912 ui::DomKey::META}},
[email protected]350c9232012-05-25 04:16:06913
michaelpg168ecd72016-08-25 04:00:42914 // Press Shift+Ctrl+Alt+Search+Escape. Confirm the event is not rewritten.
915 {ui::ET_KEY_PRESSED,
916 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE,
917 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
918 ui::EF_COMMAND_DOWN,
919 ui::DomKey::ESCAPE},
920 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE,
921 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
922 ui::EF_COMMAND_DOWN,
923 ui::DomKey::ESCAPE}},
924
925 // Press Shift+Ctrl+Alt+Search+B. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29926 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19927 {ui::VKEY_B, ui::DomCode::US_B,
kpschoedel8226fd152015-05-06 15:48:59928 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
929 ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:35930 ui::DomKey::Constant<'B'>::Character},
kpschoedela281bf12016-01-07 15:08:19931 {ui::VKEY_B, ui::DomCode::US_B,
kpschoedel8226fd152015-05-06 15:48:59932 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
933 ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:35934 ui::DomKey::Constant<'B'>::Character}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:43935 });
[email protected]350c9232012-05-25 04:16:06936}
937
[email protected]b9d224c2012-07-13 01:09:03938TEST_F(EventRewriterTest, TestRewriteModifiersDisableSome) {
michaelpg168ecd72016-08-25 04:00:42939 // Disable Search, Control and Escape keys.
penghuange5df2822017-03-16 22:54:36940 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]350c9232012-05-25 04:16:06941 IntegerPrefMember search;
Blake O'Harea09fa45a2017-10-13 04:19:58942 InitModifierKeyPref(&search, prefs::kLanguageRemapSearchKeyTo,
943 ui::chromeos::ModifierKey::kVoidKey);
[email protected]350c9232012-05-25 04:16:06944 IntegerPrefMember control;
Blake O'Harea09fa45a2017-10-13 04:19:58945 InitModifierKeyPref(&control, prefs::kLanguageRemapControlKeyTo,
946 ui::chromeos::ModifierKey::kVoidKey);
michaelpg168ecd72016-08-25 04:00:42947 IntegerPrefMember escape;
Blake O'Harea09fa45a2017-10-13 04:19:58948 InitModifierKeyPref(&escape, prefs::kLanguageRemapEscapeKeyTo,
949 ui::chromeos::ModifierKey::kVoidKey);
[email protected]350c9232012-05-25 04:16:06950
Dmitry Torokhov3e2b7d82020-02-13 18:04:43951 TestChromeKeyboardVariants({
[email protected]106cf972014-05-28 17:28:17952 // Press Alt with Shift. This key press shouldn't be affected by the
953 // pref. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29954 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35955 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT,
956 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ALT},
957 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT,
958 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ALT}},
[email protected]350c9232012-05-25 04:16:06959
[email protected]106cf972014-05-28 17:28:17960 // Press Search. Confirm the event is now VKEY_UNKNOWN.
kpschoedel02c854d2015-06-16 14:44:29961 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59962 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_NONE, ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:35963 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_NONE,
964 ui::DomKey::UNIDENTIFIED}},
[email protected]350c9232012-05-25 04:16:06965
[email protected]106cf972014-05-28 17:28:17966 // Press Control. Confirm the event is now VKEY_UNKNOWN.
kpschoedel02c854d2015-06-16 14:44:29967 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35968 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
969 ui::DomKey::CONTROL},
970 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_NONE,
971 ui::DomKey::UNIDENTIFIED}},
[email protected]350c9232012-05-25 04:16:06972
michaelpg168ecd72016-08-25 04:00:42973 // Press Escape. Confirm the event is now VKEY_UNKNOWN.
974 {ui::ET_KEY_PRESSED,
975 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE, ui::EF_NONE, ui::DomKey::ESCAPE},
976 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_NONE,
977 ui::DomKey::UNIDENTIFIED}},
978
[email protected]106cf972014-05-28 17:28:17979 // Press Control+Search. Confirm the event is now VKEY_UNKNOWN
980 // without any modifiers.
kpschoedel02c854d2015-06-16 14:44:29981 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59982 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_CONTROL_DOWN,
kpschoedel0a8b03052016-02-17 15:35:13983 ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:35984 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_NONE,
985 ui::DomKey::UNIDENTIFIED}},
[email protected]350c9232012-05-25 04:16:06986
[email protected]106cf972014-05-28 17:28:17987 // Press Control+Search+a. Confirm the event is now VKEY_A without any
988 // modifiers.
kpschoedel02c854d2015-06-16 14:44:29989 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19990 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_CONTROL_DOWN,
kpschoedel51d2e322015-08-28 15:29:35991 ui::DomKey::Constant<'a'>::Character},
kpschoedela281bf12016-01-07 15:08:19992 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:35993 ui::DomKey::Constant<'a'>::Character}},
[email protected]350c9232012-05-25 04:16:06994
[email protected]106cf972014-05-28 17:28:17995 // Press Control+Search+Alt+a. Confirm the event is now VKEY_A only with
996 // the Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29997 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19998 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
kpschoedel51d2e322015-08-28 15:29:35999 ui::DomKey::Constant<'a'>::Character},
kpschoedela281bf12016-01-07 15:08:191000 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN,
kpschoedel51d2e322015-08-28 15:29:351001 ui::DomKey::Constant<'a'>::Character}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:431002 });
[email protected]350c9232012-05-25 04:16:061003
1004 // Remap Alt to Control.
1005 IntegerPrefMember alt;
Blake O'Harea09fa45a2017-10-13 04:19:581006 InitModifierKeyPref(&alt, prefs::kLanguageRemapAltKeyTo,
1007 ui::chromeos::ModifierKey::kControlKey);
[email protected]350c9232012-05-25 04:16:061008
Dmitry Torokhov3e2b7d82020-02-13 18:04:431009 TestChromeKeyboardVariants({
[email protected]106cf972014-05-28 17:28:171010 // Press left Alt. Confirm the event is now VKEY_CONTROL
1011 // even though the Control key itself is disabled.
kpschoedel02c854d2015-06-16 14:44:291012 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351013 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, ui::DomKey::ALT},
1014 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
1015 ui::DomKey::CONTROL}},
[email protected]350c9232012-05-25 04:16:061016
[email protected]106cf972014-05-28 17:28:171017 // Press Alt+a. Confirm the event is now Control+a even though the Control
1018 // key itself is disabled.
kpschoedel02c854d2015-06-16 14:44:291019 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:191020 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN,
kpschoedel51d2e322015-08-28 15:29:351021 ui::DomKey::Constant<'a'>::Character},
kpschoedela281bf12016-01-07 15:08:191022 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:531023 ui::DomKey::Constant<'a'>::Character}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:431024 });
[email protected]350c9232012-05-25 04:16:061025}
1026
[email protected]b9d224c2012-07-13 01:09:031027TEST_F(EventRewriterTest, TestRewriteModifiersRemapToControl) {
[email protected]350c9232012-05-25 04:16:061028 // Remap Search to Control.
penghuange5df2822017-03-16 22:54:361029 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]350c9232012-05-25 04:16:061030 IntegerPrefMember search;
Blake O'Harea09fa45a2017-10-13 04:19:581031 InitModifierKeyPref(&search, prefs::kLanguageRemapSearchKeyTo,
1032 ui::chromeos::ModifierKey::kControlKey);
[email protected]350c9232012-05-25 04:16:061033
Dmitry Torokhov3e2b7d82020-02-13 18:04:431034 TestChromeKeyboardVariants({
[email protected]106cf972014-05-28 17:28:171035 // Press Search. Confirm the event is now VKEY_CONTROL.
kpschoedel02c854d2015-06-16 14:44:291036 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:591037 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_COMMAND_DOWN,
kpschoedel0a8b03052016-02-17 15:35:131038 ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:351039 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
1040 ui::DomKey::CONTROL}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:431041 });
[email protected]350c9232012-05-25 04:16:061042
1043 // Remap Alt to Control too.
1044 IntegerPrefMember alt;
Blake O'Harea09fa45a2017-10-13 04:19:581045 InitModifierKeyPref(&alt, prefs::kLanguageRemapAltKeyTo,
1046 ui::chromeos::ModifierKey::kControlKey);
[email protected]350c9232012-05-25 04:16:061047
Dmitry Torokhov3e2b7d82020-02-13 18:04:431048 TestChromeKeyboardVariants({
[email protected]106cf972014-05-28 17:28:171049 // Press Alt. Confirm the event is now VKEY_CONTROL.
kpschoedel02c854d2015-06-16 14:44:291050 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351051 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, ui::DomKey::ALT},
1052 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
1053 ui::DomKey::CONTROL}},
[email protected]350c9232012-05-25 04:16:061054
[email protected]106cf972014-05-28 17:28:171055 // Press Alt+Search. Confirm the event is now VKEY_CONTROL.
kpschoedel02c854d2015-06-16 14:44:291056 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:591057 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:131058 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:351059 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
1060 ui::DomKey::CONTROL}},
[email protected]350c9232012-05-25 04:16:061061
[email protected]106cf972014-05-28 17:28:171062 // Press Control+Alt+Search. Confirm the event is now VKEY_CONTROL.
kpschoedel02c854d2015-06-16 14:44:291063 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:591064 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel8226fd152015-05-06 15:48:591065 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
kpschoedel0a8b03052016-02-17 15:35:131066 ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:351067 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
1068 ui::DomKey::CONTROL}},
[email protected]350c9232012-05-25 04:16:061069
[email protected]106cf972014-05-28 17:28:171070 // Press Shift+Control+Alt+Search. Confirm the event is now Control with
1071 // Shift and Control modifiers.
kpschoedel02c854d2015-06-16 14:44:291072 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:591073 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel8226fd152015-05-06 15:48:591074 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
1075 ui::EF_COMMAND_DOWN,
kpschoedel0a8b03052016-02-17 15:35:131076 ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:351077 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
1078 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::CONTROL}},
[email protected]350c9232012-05-25 04:16:061079
[email protected]106cf972014-05-28 17:28:171080 // Press Shift+Control+Alt+Search+B. Confirm the event is now B with Shift
1081 // and Control modifiers.
kpschoedel02c854d2015-06-16 14:44:291082 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:191083 {ui::VKEY_B, ui::DomCode::US_B,
kpschoedel8226fd152015-05-06 15:48:591084 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
1085 ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:351086 ui::DomKey::Constant<'B'>::Character},
kpschoedela281bf12016-01-07 15:08:191087 {ui::VKEY_B, ui::DomCode::US_B, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:531088 ui::DomKey::Constant<'B'>::Character}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:431089 });
[email protected]350c9232012-05-25 04:16:061090}
1091
[email protected]343b8edd2013-09-17 09:28:111092TEST_F(EventRewriterTest, TestRewriteModifiersRemapToEscape) {
michaelpg168ecd72016-08-25 04:00:421093 // Remap Search to Escape.
penghuange5df2822017-03-16 22:54:361094 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]343b8edd2013-09-17 09:28:111095 IntegerPrefMember search;
Blake O'Harea09fa45a2017-10-13 04:19:581096 InitModifierKeyPref(&search, prefs::kLanguageRemapSearchKeyTo,
1097 ui::chromeos::ModifierKey::kEscapeKey);
[email protected]343b8edd2013-09-17 09:28:111098
Dmitry Torokhov3e2b7d82020-02-13 18:04:431099 TestChromeKeyboardVariants({
kpschoedel8226fd152015-05-06 15:48:591100 // Press Search. Confirm the event is now VKEY_ESCAPE.
kpschoedel02c854d2015-06-16 14:44:291101 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:591102 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_COMMAND_DOWN,
kpschoedel0a8b03052016-02-17 15:35:131103 ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:351104 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE, ui::EF_NONE, ui::DomKey::ESCAPE}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:431105 });
[email protected]343b8edd2013-09-17 09:28:111106}
1107
Andrew Xu531197df2019-03-07 21:46:491108TEST_F(EventRewriterTest, TestRewriteModifiersRemapEscapeToAlt) {
michaelpg168ecd72016-08-25 04:00:421109 // Remap Escape to Alt.
penghuange5df2822017-03-16 22:54:361110 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
michaelpg168ecd72016-08-25 04:00:421111 IntegerPrefMember escape;
Blake O'Harea09fa45a2017-10-13 04:19:581112 InitModifierKeyPref(&escape, prefs::kLanguageRemapEscapeKeyTo,
1113 ui::chromeos::ModifierKey::kAltKey);
[email protected]350c9232012-05-25 04:16:061114
Dmitry Torokhov3e2b7d82020-02-13 18:04:431115 TestAllKeyboardVariants({
michaelpg168ecd72016-08-25 04:00:421116 // Press Escape. Confirm the event is now VKEY_MENU.
kpschoedel02c854d2015-06-16 14:44:291117 {ui::ET_KEY_PRESSED,
michaelpg168ecd72016-08-25 04:00:421118 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE, ui::EF_NONE, ui::DomKey::ESCAPE},
kpschoedel51d2e322015-08-28 15:29:351119 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN,
1120 ui::DomKey::ALT}},
michaelpg168ecd72016-08-25 04:00:421121 // Release Escape to clear flags.
1122 {ui::ET_KEY_RELEASED,
1123 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE, ui::EF_NONE, ui::DomKey::ESCAPE},
1124 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_NONE, ui::DomKey::ALT}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:431125 });
Andrew Xu531197df2019-03-07 21:46:491126}
[email protected]350c9232012-05-25 04:16:061127
Andrew Xu531197df2019-03-07 21:46:491128TEST_F(EventRewriterTest, TestRewriteModifiersRemapAltToControl) {
[email protected]350c9232012-05-25 04:16:061129 // Remap Alt to Control.
Andrew Xu531197df2019-03-07 21:46:491130 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]350c9232012-05-25 04:16:061131 IntegerPrefMember alt;
Blake O'Harea09fa45a2017-10-13 04:19:581132 InitModifierKeyPref(&alt, prefs::kLanguageRemapAltKeyTo,
1133 ui::chromeos::ModifierKey::kControlKey);
[email protected]350c9232012-05-25 04:16:061134
Dmitry Torokhov3e2b7d82020-02-13 18:04:431135 TestAllKeyboardVariants({
[email protected]106cf972014-05-28 17:28:171136 // Press left Alt. Confirm the event is now VKEY_CONTROL.
kpschoedel02c854d2015-06-16 14:44:291137 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351138 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, ui::DomKey::ALT},
1139 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
1140 ui::DomKey::CONTROL}},
[email protected]bc3cca84f2014-07-16 04:19:231141 // Press Shift+comma. Verify that only the flags are changed.
kpschoedel02c854d2015-06-16 14:44:291142 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351143 {ui::VKEY_OEM_COMMA, ui::DomCode::COMMA,
1144 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::UNIDENTIFIED},
1145 {ui::VKEY_OEM_COMMA, ui::DomCode::COMMA,
kpschoedel728aa8092015-10-20 19:29:531146 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN,
1147 ui::DomKey::Constant<'<'>::Character}},
[email protected]bc3cca84f2014-07-16 04:19:231148 // Press Shift+9. Verify that only the flags are changed.
kpschoedel02c854d2015-06-16 14:44:291149 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351150 {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
1151 ui::DomKey::UNIDENTIFIED},
1152 {ui::VKEY_9, ui::DomCode::DIGIT9,
kpschoedel728aa8092015-10-20 19:29:531153 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN,
1154 ui::DomKey::Constant<'('>::Character}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:431155 });
Andrew Xu531197df2019-03-07 21:46:491156}
1157
1158TEST_F(EventRewriterTest, TestRewriteModifiersRemapUnderEscapeControlAlt) {
1159 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
1160
1161 // Remap Escape to Alt.
1162 IntegerPrefMember escape;
1163 InitModifierKeyPref(&escape, prefs::kLanguageRemapEscapeKeyTo,
1164 ui::chromeos::ModifierKey::kAltKey);
1165
1166 // Remap Alt to Control.
1167 IntegerPrefMember alt;
1168 InitModifierKeyPref(&alt, prefs::kLanguageRemapAltKeyTo,
1169 ui::chromeos::ModifierKey::kControlKey);
[email protected]350c9232012-05-25 04:16:061170
1171 // Remap Control to Search.
1172 IntegerPrefMember control;
Blake O'Harea09fa45a2017-10-13 04:19:581173 InitModifierKeyPref(&control, prefs::kLanguageRemapControlKeyTo,
1174 ui::chromeos::ModifierKey::kSearchKey);
[email protected]350c9232012-05-25 04:16:061175
Dmitry Torokhov3e2b7d82020-02-13 18:04:431176 TestAllKeyboardVariants({
[email protected]106cf972014-05-28 17:28:171177 // Press left Control. Confirm the event is now VKEY_LWIN.
kpschoedel02c854d2015-06-16 14:44:291178 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351179 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
1180 ui::DomKey::CONTROL},
dtapuskaaf863af2016-04-21 14:33:591181 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_COMMAND_DOWN,
kpschoedel0a8b03052016-02-17 15:35:131182 ui::DomKey::META}},
[email protected]350c9232012-05-25 04:16:061183
michaelpg168ecd72016-08-25 04:00:421184 // Then, press all of the three, Control+Alt+Escape.
kpschoedel02c854d2015-06-16 14:44:291185 {ui::ET_KEY_PRESSED,
michaelpg168ecd72016-08-25 04:00:421186 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE,
1187 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::CONTROL},
kpschoedel51d2e322015-08-28 15:29:351188 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT,
kpschoedel8226fd152015-05-06 15:48:591189 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:351190 ui::DomKey::ALT}},
[email protected]350c9232012-05-25 04:16:061191
michaelpg168ecd72016-08-25 04:00:421192 // Press Shift+Control+Alt+Escape.
kpschoedel02c854d2015-06-16 14:44:291193 {ui::ET_KEY_PRESSED,
michaelpg168ecd72016-08-25 04:00:421194 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE,
1195 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
1196 ui::DomKey::ESCAPE},
kpschoedel51d2e322015-08-28 15:29:351197 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT,
kpschoedel8226fd152015-05-06 15:48:591198 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
1199 ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:351200 ui::DomKey::ALT}},
[email protected]350c9232012-05-25 04:16:061201
michaelpg168ecd72016-08-25 04:00:421202 // Press Shift+Control+Alt+B
kpschoedel02c854d2015-06-16 14:44:291203 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:191204 {ui::VKEY_B, ui::DomCode::US_B,
michaelpg168ecd72016-08-25 04:00:421205 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
kpschoedel51d2e322015-08-28 15:29:351206 ui::DomKey::Constant<'B'>::Character},
kpschoedela281bf12016-01-07 15:08:191207 {ui::VKEY_B, ui::DomCode::US_B,
kpschoedel8226fd152015-05-06 15:48:591208 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
1209 ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:351210 ui::DomKey::Constant<'B'>::Character}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:431211 });
Andrew Xu531197df2019-03-07 21:46:491212}
1213
1214TEST_F(EventRewriterTest,
1215 TestRewriteModifiersRemapUnderEscapeControlAltSearch) {
1216 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
1217
1218 // Remap Escape to Alt.
1219 IntegerPrefMember escape;
1220 InitModifierKeyPref(&escape, prefs::kLanguageRemapEscapeKeyTo,
1221 ui::chromeos::ModifierKey::kAltKey);
1222
1223 // Remap Alt to Control.
1224 IntegerPrefMember alt;
1225 InitModifierKeyPref(&alt, prefs::kLanguageRemapAltKeyTo,
1226 ui::chromeos::ModifierKey::kControlKey);
1227
1228 // Remap Control to Search.
1229 IntegerPrefMember control;
1230 InitModifierKeyPref(&control, prefs::kLanguageRemapControlKeyTo,
1231 ui::chromeos::ModifierKey::kSearchKey);
michaelpg168ecd72016-08-25 04:00:421232
1233 // Remap Search to Backspace.
1234 IntegerPrefMember search;
Blake O'Harea09fa45a2017-10-13 04:19:581235 InitModifierKeyPref(&search, prefs::kLanguageRemapSearchKeyTo,
1236 ui::chromeos::ModifierKey::kBackspaceKey);
michaelpg168ecd72016-08-25 04:00:421237
Dmitry Torokhov3e2b7d82020-02-13 18:04:431238 TestChromeKeyboardVariants({
michaelpg168ecd72016-08-25 04:00:421239 // Release Control and Escape, as Search and Alt would transform Backspace
1240 // to Delete.
Andrew Xu531197df2019-03-07 21:46:491241 {ui::ET_KEY_PRESSED,
1242 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_NONE,
1243 ui::DomKey::CONTROL},
1244 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_COMMAND_DOWN,
1245 ui::DomKey::META}},
1246 {ui::ET_KEY_PRESSED,
1247 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE, ui::EF_NONE, ui::DomKey::ESCAPE},
1248 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN,
1249 ui::DomKey::ALT}},
michaelpg168ecd72016-08-25 04:00:421250 {ui::ET_KEY_RELEASED,
1251 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_NONE,
1252 ui::DomKey::CONTROL},
1253 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_ALT_DOWN,
1254 ui::DomKey::META}},
1255 {ui::ET_KEY_RELEASED,
1256 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE, ui::EF_NONE, ui::DomKey::ESCAPE},
1257 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_NONE, ui::DomKey::ALT}},
1258 // Press Search. Confirm the event is now VKEY_BACK.
1259 {ui::ET_KEY_PRESSED,
1260 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_COMMAND_DOWN,
1261 ui::DomKey::META},
1262 {ui::VKEY_BACK, ui::DomCode::BACKSPACE, ui::EF_NONE,
1263 ui::DomKey::BACKSPACE}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:431264 });
Andrew Xu531197df2019-03-07 21:46:491265}
michaelpg168ecd72016-08-25 04:00:421266
Andrew Xu531197df2019-03-07 21:46:491267TEST_F(EventRewriterTest, TestRewriteModifiersRemapBackspaceToEscape) {
michaelpg168ecd72016-08-25 04:00:421268 // Remap Backspace to Escape.
Andrew Xu531197df2019-03-07 21:46:491269 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
michaelpg168ecd72016-08-25 04:00:421270 IntegerPrefMember backspace;
Blake O'Harea09fa45a2017-10-13 04:19:581271 InitModifierKeyPref(&backspace, prefs::kLanguageRemapBackspaceKeyTo,
1272 ui::chromeos::ModifierKey::kEscapeKey);
michaelpg168ecd72016-08-25 04:00:421273
Dmitry Torokhov3e2b7d82020-02-13 18:04:431274 TestAllKeyboardVariants({
michaelpg168ecd72016-08-25 04:00:421275 // Press Backspace. Confirm the event is now VKEY_ESCAPE.
1276 {ui::ET_KEY_PRESSED,
1277 {ui::VKEY_BACK, ui::DomCode::BACKSPACE, ui::EF_NONE,
1278 ui::DomKey::BACKSPACE},
1279 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE, ui::EF_NONE, ui::DomKey::ESCAPE}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:431280 });
[email protected]350c9232012-05-25 04:16:061281}
1282
[email protected]b9d224c2012-07-13 01:09:031283TEST_F(EventRewriterTest, TestRewriteModifiersRemapToCapsLock) {
[email protected]350c9232012-05-25 04:16:061284 // Remap Search to Caps Lock.
penghuange5df2822017-03-16 22:54:361285 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]350c9232012-05-25 04:16:061286 IntegerPrefMember search;
Blake O'Harea09fa45a2017-10-13 04:19:581287 InitModifierKeyPref(&search, prefs::kLanguageRemapSearchKeyTo,
1288 ui::chromeos::ModifierKey::kCapsLockKey);
[email protected]350c9232012-05-25 04:16:061289
Zentaro Kavanagh1e7d867c2020-05-13 01:18:441290 SetupKeyboard("Internal Keyboard");
Jimmy Gong82c82b42021-04-17 03:12:331291 EXPECT_FALSE(fake_ime_keyboard_.caps_lock_is_enabled_);
[email protected]350c9232012-05-25 04:16:061292
1293 // Press Search.
Zentaro Kavanaghc555ab452020-05-13 23:07:371294 EXPECT_EQ(
1295 GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL,
1296 ui::DomCode::CAPS_LOCK,
1297 ui::EF_MOD3_DOWN | ui::EF_CAPS_LOCK_ON,
1298 ui::DomKey::CAPS_LOCK, kNoScanCode),
1299 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_PRESSED, ui::VKEY_LWIN,
1300 ui::DomCode::META_LEFT, ui::EF_COMMAND_DOWN,
1301 ui::DomKey::META, kNoScanCode));
Jimmy Gong82c82b42021-04-17 03:12:331302 EXPECT_FALSE(fake_ime_keyboard_.caps_lock_is_enabled_);
[email protected]350c9232012-05-25 04:16:061303
1304 // Release Search.
Zentaro Kavanaghc555ab452020-05-13 23:07:371305 EXPECT_EQ(
1306 GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL,
1307 ui::DomCode::CAPS_LOCK, ui::EF_NONE,
1308 ui::DomKey::CAPS_LOCK, kNoScanCode),
1309 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_RELEASED, ui::VKEY_LWIN,
1310 ui::DomCode::META_LEFT, ui::EF_NONE,
1311 ui::DomKey::META, kNoScanCode));
Jimmy Gong82c82b42021-04-17 03:12:331312 EXPECT_TRUE(fake_ime_keyboard_.caps_lock_is_enabled_);
[email protected]350c9232012-05-25 04:16:061313
1314 // Press Search.
Zentaro Kavanaghc555ab452020-05-13 23:07:371315 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL,
1316 ui::DomCode::CAPS_LOCK,
1317 ui::EF_CAPS_LOCK_ON | ui::EF_MOD3_DOWN,
1318 ui::DomKey::CAPS_LOCK, kNoScanCode),
Yuichiro Hanada87c6e552020-02-07 01:07:371319 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:591320 ui::VKEY_LWIN, ui::DomCode::META_LEFT,
pkastingcc7f6ac2016-01-08 23:38:471321 ui::EF_COMMAND_DOWN | ui::EF_CAPS_LOCK_ON,
Zentaro Kavanaghc555ab452020-05-13 23:07:371322 ui::DomKey::META, kNoScanCode));
Jimmy Gong82c82b42021-04-17 03:12:331323 EXPECT_TRUE(fake_ime_keyboard_.caps_lock_is_enabled_);
[email protected]350c9232012-05-25 04:16:061324
1325 // Release Search.
Zentaro Kavanaghc555ab452020-05-13 23:07:371326 EXPECT_EQ(
1327 GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL,
1328 ui::DomCode::CAPS_LOCK, ui::EF_NONE,
1329 ui::DomKey::CAPS_LOCK, kNoScanCode),
1330 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_RELEASED, ui::VKEY_LWIN,
1331 ui::DomCode::META_LEFT, ui::EF_NONE,
1332 ui::DomKey::META, kNoScanCode));
Jimmy Gong82c82b42021-04-17 03:12:331333 EXPECT_FALSE(fake_ime_keyboard_.caps_lock_is_enabled_);
[email protected]350c9232012-05-25 04:16:061334
Dmitry Torokhov3e2b7d82020-02-13 18:04:431335 // Do the same on external Chrome OS keyboard.
Zentaro Kavanagh1e7d867c2020-05-13 01:18:441336 SetupKeyboard("External Chrome Keyboard", kKbdTopRowLayout1Tag,
1337 ui::INPUT_DEVICE_UNKNOWN);
Dmitry Torokhov3e2b7d82020-02-13 18:04:431338
1339 // Press Search.
Zentaro Kavanaghc555ab452020-05-13 23:07:371340 EXPECT_EQ(
1341 GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL,
1342 ui::DomCode::CAPS_LOCK,
1343 ui::EF_MOD3_DOWN | ui::EF_CAPS_LOCK_ON,
1344 ui::DomKey::CAPS_LOCK, kNoScanCode),
1345 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_PRESSED, ui::VKEY_LWIN,
1346 ui::DomCode::META_LEFT, ui::EF_COMMAND_DOWN,
1347 ui::DomKey::META, kNoScanCode));
Jimmy Gong82c82b42021-04-17 03:12:331348 EXPECT_FALSE(fake_ime_keyboard_.caps_lock_is_enabled_);
Dmitry Torokhov3e2b7d82020-02-13 18:04:431349
1350 // Release Search.
Zentaro Kavanaghc555ab452020-05-13 23:07:371351 EXPECT_EQ(
1352 GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL,
1353 ui::DomCode::CAPS_LOCK, ui::EF_NONE,
1354 ui::DomKey::CAPS_LOCK, kNoScanCode),
1355 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_RELEASED, ui::VKEY_LWIN,
1356 ui::DomCode::META_LEFT, ui::EF_NONE,
1357 ui::DomKey::META, kNoScanCode));
Jimmy Gong82c82b42021-04-17 03:12:331358 EXPECT_TRUE(fake_ime_keyboard_.caps_lock_is_enabled_);
Dmitry Torokhov3e2b7d82020-02-13 18:04:431359
1360 // Press Search.
Zentaro Kavanaghc555ab452020-05-13 23:07:371361 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL,
1362 ui::DomCode::CAPS_LOCK,
1363 ui::EF_CAPS_LOCK_ON | ui::EF_MOD3_DOWN,
1364 ui::DomKey::CAPS_LOCK, kNoScanCode),
Dmitry Torokhov3e2b7d82020-02-13 18:04:431365 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_PRESSED,
1366 ui::VKEY_LWIN, ui::DomCode::META_LEFT,
1367 ui::EF_COMMAND_DOWN | ui::EF_CAPS_LOCK_ON,
Zentaro Kavanaghc555ab452020-05-13 23:07:371368 ui::DomKey::META, kNoScanCode));
Jimmy Gong82c82b42021-04-17 03:12:331369 EXPECT_TRUE(fake_ime_keyboard_.caps_lock_is_enabled_);
Dmitry Torokhov3e2b7d82020-02-13 18:04:431370
1371 // Release Search.
Zentaro Kavanaghc555ab452020-05-13 23:07:371372 EXPECT_EQ(
1373 GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL,
1374 ui::DomCode::CAPS_LOCK, ui::EF_NONE,
1375 ui::DomKey::CAPS_LOCK, kNoScanCode),
1376 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_RELEASED, ui::VKEY_LWIN,
1377 ui::DomCode::META_LEFT, ui::EF_NONE,
1378 ui::DomKey::META, kNoScanCode));
Jimmy Gong82c82b42021-04-17 03:12:331379 EXPECT_FALSE(fake_ime_keyboard_.caps_lock_is_enabled_);
Dmitry Torokhov3e2b7d82020-02-13 18:04:431380
1381 // Try external keyboard with Caps Lock.
Zentaro Kavanagh1e7d867c2020-05-13 01:18:441382 SetupKeyboard("External Generic Keyboard", kKbdTopRowLayoutUnspecified,
1383 ui::INPUT_DEVICE_UNKNOWN);
Dmitry Torokhov3e2b7d82020-02-13 18:04:431384
1385 // Press Caps Lock.
Zentaro Kavanaghc555ab452020-05-13 23:07:371386 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL,
1387 ui::DomCode::CAPS_LOCK,
1388 ui::EF_CAPS_LOCK_ON | ui::EF_MOD3_DOWN,
1389 ui::DomKey::CAPS_LOCK, kNoScanCode),
Yuichiro Hanada87c6e552020-02-07 01:07:371390 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_PRESSED,
kpschoedel8226fd152015-05-06 15:48:591391 ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
pkastingcc7f6ac2016-01-08 23:38:471392 ui::EF_CAPS_LOCK_ON | ui::EF_MOD3_DOWN,
Zentaro Kavanaghc555ab452020-05-13 23:07:371393 ui::DomKey::CAPS_LOCK, kNoScanCode));
Jimmy Gong82c82b42021-04-17 03:12:331394 EXPECT_FALSE(fake_ime_keyboard_.caps_lock_is_enabled_);
[email protected]350c9232012-05-25 04:16:061395
Dmitry Torokhov3e2b7d82020-02-13 18:04:431396 // Release Caps Lock.
kpschoedel8226fd152015-05-06 15:48:591397 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL,
1398 ui::DomCode::CAPS_LOCK, ui::EF_NONE,
Zentaro Kavanaghc555ab452020-05-13 23:07:371399 ui::DomKey::CAPS_LOCK, kNoScanCode),
Yuichiro Hanada87c6e552020-02-07 01:07:371400 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_RELEASED,
kpschoedel8226fd152015-05-06 15:48:591401 ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
Zentaro Kavanaghc555ab452020-05-13 23:07:371402 ui::EF_NONE, ui::DomKey::CAPS_LOCK,
1403 kNoScanCode));
Jimmy Gong82c82b42021-04-17 03:12:331404 EXPECT_TRUE(fake_ime_keyboard_.caps_lock_is_enabled_);
[email protected]350c9232012-05-25 04:16:061405}
[email protected]4a822092012-06-15 03:42:511406
[email protected]d13e288992014-05-01 18:00:211407TEST_F(EventRewriterTest, TestRewriteCapsLock) {
penghuange5df2822017-03-16 22:54:361408 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]872ead342012-10-31 17:50:011409
Zentaro Kavanagh1e7d867c2020-05-13 01:18:441410 SetupKeyboard("External Generic Keyboard", kKbdTopRowLayoutUnspecified,
1411 ui::INPUT_DEVICE_UNKNOWN);
Jimmy Gong82c82b42021-04-17 03:12:331412 EXPECT_FALSE(fake_ime_keyboard_.caps_lock_is_enabled_);
[email protected]872ead342012-10-31 17:50:011413
Tetsui Ohkubo256dcbf4a2019-02-14 03:30:531414 // On Chrome OS, CapsLock is mapped to CapsLock with Mod3Mask.
Zentaro Kavanaghc555ab452020-05-13 23:07:371415 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL,
1416 ui::DomCode::CAPS_LOCK,
1417 ui::EF_CAPS_LOCK_ON | ui::EF_MOD3_DOWN,
1418 ui::DomKey::CAPS_LOCK, kNoScanCode),
Yuichiro Hanada87c6e552020-02-07 01:07:371419 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_PRESSED,
Tetsui Ohkubo256dcbf4a2019-02-14 03:30:531420 ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
Zentaro Kavanaghc555ab452020-05-13 23:07:371421 ui::EF_MOD3_DOWN, ui::DomKey::CAPS_LOCK,
1422 kNoScanCode));
Jimmy Gong82c82b42021-04-17 03:12:331423 EXPECT_FALSE(fake_ime_keyboard_.caps_lock_is_enabled_);
Weidong Guo9b390042017-10-29 19:07:431424
1425 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL,
1426 ui::DomCode::CAPS_LOCK, ui::EF_NONE,
Zentaro Kavanaghc555ab452020-05-13 23:07:371427 ui::DomKey::CAPS_LOCK, kNoScanCode),
Yuichiro Hanada87c6e552020-02-07 01:07:371428 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_RELEASED,
Tetsui Ohkubo256dcbf4a2019-02-14 03:30:531429 ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
Zentaro Kavanaghc555ab452020-05-13 23:07:371430 ui::EF_MOD3_DOWN, ui::DomKey::CAPS_LOCK,
1431 kNoScanCode));
Jimmy Gong82c82b42021-04-17 03:12:331432 EXPECT_TRUE(fake_ime_keyboard_.caps_lock_is_enabled_);
Weidong Guo4534b862017-11-10 03:17:051433
1434 // Remap Caps Lock to Control.
1435 IntegerPrefMember caps_lock;
1436 InitModifierKeyPref(&caps_lock, prefs::kLanguageRemapCapsLockKeyTo,
1437 ui::chromeos::ModifierKey::kControlKey);
1438
Jimmy Gong82c82b42021-04-17 03:12:331439 // Press Caps Lock. CapsLock is enabled but we have remapped the key to
1440 // now be Control. We want to ensure that the CapsLock modifier is still
1441 // active even after pressing the remapped Capslock key.
1442 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL,
1443 ui::DomCode::CONTROL_LEFT,
1444 ui::EF_CONTROL_DOWN | ui::EF_CAPS_LOCK_ON,
1445 ui::DomKey::CONTROL, kNoScanCode),
Yuichiro Hanada87c6e552020-02-07 01:07:371446 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_PRESSED,
Weidong Guo4534b862017-11-10 03:17:051447 ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
1448 ui::EF_CAPS_LOCK_ON | ui::EF_MOD3_DOWN,
Zentaro Kavanaghc555ab452020-05-13 23:07:371449 ui::DomKey::CAPS_LOCK, kNoScanCode));
Jimmy Gong82c82b42021-04-17 03:12:331450 EXPECT_TRUE(fake_ime_keyboard_.caps_lock_is_enabled_);
Weidong Guo4534b862017-11-10 03:17:051451
1452 // Release Caps Lock.
Jimmy Gong82c82b42021-04-17 03:12:331453 EXPECT_EQ(
1454 GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CONTROL,
1455 ui::DomCode::CONTROL_LEFT, ui::EF_CAPS_LOCK_ON,
1456 ui::DomKey::CONTROL, kNoScanCode),
1457 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_RELEASED,
1458 ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
1459 ui::EF_CAPS_LOCK_ON, ui::DomKey::CAPS_LOCK,
1460 kNoScanCode));
1461 EXPECT_TRUE(fake_ime_keyboard_.caps_lock_is_enabled_);
1462}
1463
1464TEST_F(EventRewriterTest, TestRewriteExternalCapsLockWithDifferentScenarios) {
1465 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
1466
1467 SetupKeyboard("External Generic Keyboard", kKbdTopRowLayoutUnspecified,
1468 ui::INPUT_DEVICE_UNKNOWN);
1469 EXPECT_FALSE(fake_ime_keyboard_.caps_lock_is_enabled_);
1470
1471 // Turn on CapsLock.
1472 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL,
1473 ui::DomCode::CAPS_LOCK,
1474 ui::EF_CAPS_LOCK_ON | ui::EF_MOD3_DOWN,
1475 ui::DomKey::CAPS_LOCK, kNoScanCode),
1476 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_PRESSED,
1477 ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
1478 ui::EF_MOD3_DOWN, ui::DomKey::CAPS_LOCK,
1479 kNoScanCode));
1480 EXPECT_FALSE(fake_ime_keyboard_.caps_lock_is_enabled_);
1481
1482 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL,
1483 ui::DomCode::CAPS_LOCK, ui::EF_NONE,
1484 ui::DomKey::CAPS_LOCK, kNoScanCode),
1485 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_RELEASED,
1486 ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
1487 ui::EF_MOD3_DOWN, ui::DomKey::CAPS_LOCK,
1488 kNoScanCode));
1489 EXPECT_TRUE(fake_ime_keyboard_.caps_lock_is_enabled_);
1490
1491 // Remap CapsLock to Search.
1492 IntegerPrefMember search;
1493 InitModifierKeyPref(&search, prefs::kLanguageRemapCapsLockKeyTo,
1494 ui::chromeos::ModifierKey::kSearchKey);
1495
1496 // Now that CapsLock is enabled, press the remapped CapsLock button again
1497 // and expect to not disable CapsLock.
1498 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_LWIN,
1499 ui::DomCode::META_LEFT,
1500 ui::EF_COMMAND_DOWN | ui::EF_CAPS_LOCK_ON,
1501 ui::DomKey::META, kNoScanCode),
1502 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_PRESSED,
1503 ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
1504 ui::EF_CAPS_LOCK_ON,
1505 ui::DomKey::CAPS_LOCK, kNoScanCode));
1506 EXPECT_TRUE(fake_ime_keyboard_.caps_lock_is_enabled_);
1507
1508 EXPECT_EQ(GetExpectedResultAsString(
1509 ui::ET_KEY_RELEASED, ui::VKEY_LWIN, ui::DomCode::META_LEFT,
1510 ui::EF_CAPS_LOCK_ON, ui::DomKey::META, kNoScanCode),
1511 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_RELEASED,
1512 ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
1513 ui::EF_CAPS_LOCK_ON,
1514 ui::DomKey::CAPS_LOCK, kNoScanCode));
1515 EXPECT_TRUE(fake_ime_keyboard_.caps_lock_is_enabled_);
1516
1517 // Remap CapsLock key back to CapsLock.
1518 IntegerPrefMember capslock;
1519 InitModifierKeyPref(&capslock, prefs::kLanguageRemapCapsLockKeyTo,
1520 ui::chromeos::ModifierKey::kCapsLockKey);
1521
1522 // Now press CapsLock again and now expect that the CapsLock modifier is
1523 // removed.
1524 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL,
1525 ui::DomCode::CAPS_LOCK,
1526 ui::EF_CAPS_LOCK_ON | ui::EF_MOD3_DOWN,
1527 ui::DomKey::CAPS_LOCK, kNoScanCode),
1528 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_PRESSED,
1529 ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
1530 ui::EF_MOD3_DOWN, ui::DomKey::CAPS_LOCK,
1531 kNoScanCode));
1532 EXPECT_TRUE(fake_ime_keyboard_.caps_lock_is_enabled_);
1533
1534 // Disabling CapsLocks only happens on release of the CapsLock key.
1535 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL,
1536 ui::DomCode::CAPS_LOCK, ui::EF_NONE,
1537 ui::DomKey::CAPS_LOCK, kNoScanCode),
Yuichiro Hanada87c6e552020-02-07 01:07:371538 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_RELEASED,
Weidong Guo4534b862017-11-10 03:17:051539 ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
Zentaro Kavanaghc555ab452020-05-13 23:07:371540 ui::EF_NONE, ui::DomKey::CAPS_LOCK,
1541 kNoScanCode));
Jimmy Gong82c82b42021-04-17 03:12:331542 EXPECT_FALSE(fake_ime_keyboard_.caps_lock_is_enabled_);
[email protected]872ead342012-10-31 17:50:011543}
1544
[email protected]872ead342012-10-31 17:50:011545TEST_F(EventRewriterTest, TestRewriteCapsLockToControl) {
[email protected]d13e288992014-05-01 18:00:211546 // Remap CapsLock to Control.
penghuange5df2822017-03-16 22:54:361547 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]872ead342012-10-31 17:50:011548 IntegerPrefMember control;
Blake O'Harea09fa45a2017-10-13 04:19:581549 InitModifierKeyPref(&control, prefs::kLanguageRemapCapsLockKeyTo,
1550 ui::chromeos::ModifierKey::kControlKey);
[email protected]872ead342012-10-31 17:50:011551
Dmitry Torokhov3e2b7d82020-02-13 18:04:431552 TestExternalGenericKeyboard({
[email protected]106cf972014-05-28 17:28:171553 // Press CapsLock+a. Confirm that Mod3Mask is rewritten to ControlMask.
1554 // On Chrome OS, CapsLock works as a Mod3 modifier.
kpschoedel02c854d2015-06-16 14:44:291555 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:191556 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_MOD3_DOWN,
kpschoedel51d2e322015-08-28 15:29:351557 ui::DomKey::Constant<'a'>::Character},
kpschoedela281bf12016-01-07 15:08:191558 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:531559 ui::DomKey::Constant<'a'>::Character}},
[email protected]59409342012-09-21 01:03:431560
[email protected]106cf972014-05-28 17:28:171561 // Press Control+CapsLock+a. Confirm that Mod3Mask is rewritten to
1562 // ControlMask
kpschoedel02c854d2015-06-16 14:44:291563 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:191564 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_CONTROL_DOWN | ui::EF_MOD3_DOWN,
kpschoedel51d2e322015-08-28 15:29:351565 ui::DomKey::Constant<'a'>::Character},
kpschoedela281bf12016-01-07 15:08:191566 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:531567 ui::DomKey::Constant<'a'>::Character}},
[email protected]59409342012-09-21 01:03:431568
[email protected]106cf972014-05-28 17:28:171569 // Press Alt+CapsLock+a. Confirm that Mod3Mask is rewritten to
1570 // ControlMask.
kpschoedel02c854d2015-06-16 14:44:291571 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:191572 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_MOD3_DOWN,
kpschoedel51d2e322015-08-28 15:29:351573 ui::DomKey::Constant<'a'>::Character},
kpschoedela281bf12016-01-07 15:08:191574 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:531575 ui::DomKey::Constant<'a'>::Character}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:431576 });
[email protected]59409342012-09-21 01:03:431577}
1578
[email protected]872ead342012-10-31 17:50:011579TEST_F(EventRewriterTest, TestRewriteCapsLockMod3InUse) {
1580 // Remap CapsLock to Control.
penghuange5df2822017-03-16 22:54:361581 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]872ead342012-10-31 17:50:011582 IntegerPrefMember control;
Blake O'Harea09fa45a2017-10-13 04:19:581583 InitModifierKeyPref(&control, prefs::kLanguageRemapCapsLockKeyTo,
1584 ui::chromeos::ModifierKey::kControlKey);
[email protected]872ead342012-10-31 17:50:011585
Zentaro Kavanagh1e7d867c2020-05-13 01:18:441586 SetupKeyboard("External Generic Keyboard", kKbdTopRowLayoutUnspecified,
1587 ui::INPUT_DEVICE_UNKNOWN);
[email protected]1488a035f2014-03-28 21:12:071588 input_method_manager_mock_->set_mod3_used(true);
[email protected]59409342012-09-21 01:03:431589
[email protected]872ead342012-10-31 17:50:011590 // Press CapsLock+a. Confirm that Mod3Mask is NOT rewritten to ControlMask
1591 // when Mod3Mask is already in use by the current XKB layout.
Zentaro Kavanaghc555ab452020-05-13 23:07:371592 EXPECT_EQ(
1593 GetExpectedResultAsString(
1594 ui::ET_KEY_PRESSED, ui::VKEY_A, ui::DomCode::US_A, ui::EF_NONE,
1595 ui::DomKey::Constant<'a'>::Character, kNoScanCode),
1596 GetRewrittenEventAsString(
1597 rewriter(), ui::ET_KEY_PRESSED, ui::VKEY_A, ui::DomCode::US_A,
1598 ui::EF_NONE, ui::DomKey::Constant<'a'>::Character, kNoScanCode));
[email protected]59409342012-09-21 01:03:431599
[email protected]1488a035f2014-03-28 21:12:071600 input_method_manager_mock_->set_mod3_used(false);
[email protected]59409342012-09-21 01:03:431601}
1602
Zentaro Kavanagh76b9bcb2021-05-19 06:29:451603// TODO(crbug.com/1179893): Remove once the feature is enabled permanently.
1604TEST_F(EventRewriterTest, TestRewriteExtendedKeysAltVariantsOld) {
penghuange5df2822017-03-16 22:54:361605 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
Zentaro Kavanagh76b9bcb2021-05-19 06:29:451606 scoped_feature_list_.InitAndDisableFeature(
1607 ::features::kImprovedKeyboardShortcuts);
Dmitry Torokhov3e2b7d82020-02-13 18:04:431608 TestNonAppleKeyboardVariants({
[email protected]106cf972014-05-28 17:28:171609 // Alt+Backspace -> Delete
kpschoedel02c854d2015-06-16 14:44:291610 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351611 {ui::VKEY_BACK, ui::DomCode::BACKSPACE, ui::EF_ALT_DOWN,
1612 ui::DomKey::BACKSPACE},
1613 {ui::VKEY_DELETE, ui::DomCode::DEL, ui::EF_NONE, ui::DomKey::DEL}},
kpschoedel8226fd152015-05-06 15:48:591614 // Control+Alt+Backspace -> Control+Delete
kpschoedel02c854d2015-06-16 14:44:291615 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351616 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
1617 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::BACKSPACE},
1618 {ui::VKEY_DELETE, ui::DomCode::DEL, ui::EF_CONTROL_DOWN,
1619 ui::DomKey::DEL}},
kpschoedel8226fd152015-05-06 15:48:591620 // Search+Alt+Backspace -> Alt+Backspace
kpschoedel02c854d2015-06-16 14:44:291621 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351622 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
1623 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::BACKSPACE},
1624 {ui::VKEY_BACK, ui::DomCode::BACKSPACE, ui::EF_ALT_DOWN,
1625 ui::DomKey::BACKSPACE}},
kpschoedel8226fd152015-05-06 15:48:591626 // Search+Control+Alt+Backspace -> Control+Alt+Backspace
kpschoedel02c854d2015-06-16 14:44:291627 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351628 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
kpschoedel8226fd152015-05-06 15:48:591629 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
kpschoedel51d2e322015-08-28 15:29:351630 ui::DomKey::BACKSPACE},
1631 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
1632 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::BACKSPACE}},
[email protected]106cf972014-05-28 17:28:171633 // Alt+Up -> Prior
kpschoedel02c854d2015-06-16 14:44:291634 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351635 {ui::VKEY_UP, ui::DomCode::ARROW_UP, ui::EF_ALT_DOWN,
1636 ui::DomKey::ARROW_UP},
1637 {ui::VKEY_PRIOR, ui::DomCode::PAGE_UP, ui::EF_NONE,
1638 ui::DomKey::PAGE_UP}},
[email protected]106cf972014-05-28 17:28:171639 // Alt+Down -> Next
kpschoedel02c854d2015-06-16 14:44:291640 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351641 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN, ui::EF_ALT_DOWN,
1642 ui::DomKey::ARROW_DOWN},
1643 {ui::VKEY_NEXT, ui::DomCode::PAGE_DOWN, ui::EF_NONE,
1644 ui::DomKey::PAGE_DOWN}},
[email protected]106cf972014-05-28 17:28:171645 // Ctrl+Alt+Up -> Home
kpschoedel02c854d2015-06-16 14:44:291646 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351647 {ui::VKEY_UP, ui::DomCode::ARROW_UP,
1648 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_UP},
1649 {ui::VKEY_HOME, ui::DomCode::HOME, ui::EF_NONE, ui::DomKey::HOME}},
[email protected]106cf972014-05-28 17:28:171650 // Ctrl+Alt+Down -> End
kpschoedel02c854d2015-06-16 14:44:291651 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351652 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN,
1653 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_DOWN},
1654 {ui::VKEY_END, ui::DomCode::END, ui::EF_NONE, ui::DomKey::END}},
[email protected]750508d2012-12-18 00:52:581655
Zentaro Kavanagh854291b2021-02-12 16:58:301656 // NOTE: The following are workarounds to avoid rewriting the
1657 // Alt variants by additionally pressing Search.
Qiang Xu47c04672017-11-09 03:01:371658 // Search+Ctrl+Alt+Up -> Ctrl+Alt+Up
kpschoedel02c854d2015-06-16 14:44:291659 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351660 {ui::VKEY_UP, ui::DomCode::ARROW_UP,
kpschoedel8226fd152015-05-06 15:48:591661 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
kpschoedel51d2e322015-08-28 15:29:351662 ui::DomKey::ARROW_UP},
1663 {ui::VKEY_UP, ui::DomCode::ARROW_UP,
1664 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_UP}},
kpschoedel8226fd152015-05-06 15:48:591665 // Search+Ctrl+Alt+Down -> Ctrl+Alt+Down
kpschoedel02c854d2015-06-16 14:44:291666 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351667 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN,
kpschoedel8226fd152015-05-06 15:48:591668 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
kpschoedel51d2e322015-08-28 15:29:351669 ui::DomKey::ARROW_DOWN},
1670 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN,
1671 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_DOWN}},
Zentaro Kavanagh854291b2021-02-12 16:58:301672 });
1673}
[email protected]750508d2012-12-18 00:52:581674
Zentaro Kavanaghc1898fe2021-06-25 00:31:451675// TODO(crbug.com/1179893): Remove once the feature is enabled permanently.
1676// For M92 kImprovedKeyboardShortcuts is enabled but kDeprecateAltBasedSixPack
1677// is disabled.
1678TEST_F(EventRewriterTest, TestRewriteExtendedKeysAltVariantsM92) {
1679 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
1680 TestNonAppleKeyboardVariants({
1681 // Alt+Backspace -> Delete
1682 {ui::ET_KEY_PRESSED,
1683 {ui::VKEY_BACK, ui::DomCode::BACKSPACE, ui::EF_ALT_DOWN,
1684 ui::DomKey::BACKSPACE},
1685 {ui::VKEY_DELETE, ui::DomCode::DEL, ui::EF_NONE, ui::DomKey::DEL}},
1686 // Control+Alt+Backspace -> Control+Delete
1687 {ui::ET_KEY_PRESSED,
1688 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
1689 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::BACKSPACE},
1690 {ui::VKEY_DELETE, ui::DomCode::DEL, ui::EF_CONTROL_DOWN,
1691 ui::DomKey::DEL}},
1692 // Search+Alt+Backspace -> Alt+Backspace
1693 {ui::ET_KEY_PRESSED,
1694 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
1695 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::BACKSPACE},
1696 {ui::VKEY_BACK, ui::DomCode::BACKSPACE, ui::EF_ALT_DOWN,
1697 ui::DomKey::BACKSPACE}},
1698 // Search+Control+Alt+Backspace -> Control+Alt+Backspace
1699 {ui::ET_KEY_PRESSED,
1700 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
1701 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
1702 ui::DomKey::BACKSPACE},
1703 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
1704 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::BACKSPACE}},
1705 // Alt+Up -> Prior
1706 {ui::ET_KEY_PRESSED,
1707 {ui::VKEY_UP, ui::DomCode::ARROW_UP, ui::EF_ALT_DOWN,
1708 ui::DomKey::ARROW_UP},
1709 {ui::VKEY_PRIOR, ui::DomCode::PAGE_UP, ui::EF_NONE,
1710 ui::DomKey::PAGE_UP}},
1711 // Alt+Down -> Next
1712 {ui::ET_KEY_PRESSED,
1713 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN, ui::EF_ALT_DOWN,
1714 ui::DomKey::ARROW_DOWN},
1715 {ui::VKEY_NEXT, ui::DomCode::PAGE_DOWN, ui::EF_NONE,
1716 ui::DomKey::PAGE_DOWN}},
1717 // Ctrl+Alt+Up -> Home
1718 {ui::ET_KEY_PRESSED,
1719 {ui::VKEY_UP, ui::DomCode::ARROW_UP,
1720 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_UP},
1721 {ui::VKEY_HOME, ui::DomCode::HOME, ui::EF_NONE, ui::DomKey::HOME}},
1722 // Ctrl+Alt+Down -> End
1723 {ui::ET_KEY_PRESSED,
1724 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN,
1725 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_DOWN},
1726 {ui::VKEY_END, ui::DomCode::END, ui::EF_NONE, ui::DomKey::END}},
1727
1728 // NOTE: The following are workarounds to avoid rewriting the
1729 // Alt variants by additionally pressing Search.
1730 // Search+Ctrl+Alt+Up -> Ctrl+Alt+Up
1731 {ui::ET_KEY_PRESSED,
1732 {ui::VKEY_UP, ui::DomCode::ARROW_UP,
1733 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
1734 ui::DomKey::ARROW_UP},
1735 {ui::VKEY_UP, ui::DomCode::ARROW_UP,
1736 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_UP}},
1737 // Search+Ctrl+Alt+Down -> Ctrl+Alt+Down
1738 {ui::ET_KEY_PRESSED,
1739 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN,
1740 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
1741 ui::DomKey::ARROW_DOWN},
1742 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN,
1743 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_DOWN}},
1744 });
1745}
1746
1747// TODO(crbug.com/1179893): Remove once the feature is enabled permanently.
1748// This is the intended final state with both kImprovedKeyboardShortcuts and
1749// kDeprecateAltBasedSixPack enabled.
Zentaro Kavanagh76b9bcb2021-05-19 06:29:451750TEST_F(EventRewriterTest, TestRewriteExtendedKeysAltVariants) {
Zentaro Kavanagh30f15aa2021-02-13 00:03:581751 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
Zentaro Kavanaghc1898fe2021-06-25 00:31:451752 scoped_feature_list_.InitAndEnableFeature(
1753 ::features::kDeprecateAltBasedSixPack);
Zentaro Kavanagh30f15aa2021-02-13 00:03:581754 // All the previously supported Alt based rewrites no longer have any
1755 // effect. The Search workarounds no longer take effect and the Search+Key
1756 // portion is rewritten as expected.
1757 TestNonAppleKeyboardVariants({
1758 // Alt+Backspace -> No Rewrite
1759 {ui::ET_KEY_PRESSED,
1760 {ui::VKEY_BACK, ui::DomCode::BACKSPACE, ui::EF_ALT_DOWN,
1761 ui::DomKey::BACKSPACE},
1762 {ui::VKEY_BACK, ui::DomCode::BACKSPACE, ui::EF_ALT_DOWN,
Zentaro Kavanagh531da3d2021-02-24 18:21:261763 ui::DomKey::BACKSPACE},
1764 kKeyboardDeviceId,
1765 /*triggers_notification=*/true},
Zentaro Kavanagh30f15aa2021-02-13 00:03:581766 // Control+Alt+Backspace -> No Rewrite
1767 {ui::ET_KEY_PRESSED,
1768 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
1769 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::BACKSPACE},
1770 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
Zentaro Kavanagh531da3d2021-02-24 18:21:261771 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::BACKSPACE},
1772 kKeyboardDeviceId,
1773 /*triggers_notification=*/true},
1774 // Search+Alt+Backspace -> Alt+Delete
Zentaro Kavanagh30f15aa2021-02-13 00:03:581775 {ui::ET_KEY_PRESSED,
1776 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
1777 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::BACKSPACE},
1778 {ui::VKEY_DELETE, ui::DomCode::DEL, ui::EF_ALT_DOWN, ui::DomKey::DEL}},
1779 // Search+Control+Alt+Backspace -> Control+Alt+Delete
1780 {ui::ET_KEY_PRESSED,
1781 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
1782 ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
1783 ui::DomKey::BACKSPACE},
1784 {ui::VKEY_DELETE, ui::DomCode::DEL,
1785 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::DEL}},
1786 // Alt+Up -> No Rewrite
1787 {ui::ET_KEY_PRESSED,
1788 {ui::VKEY_UP, ui::DomCode::ARROW_UP, ui::EF_ALT_DOWN,
1789 ui::DomKey::ARROW_UP},
1790 {ui::VKEY_UP, ui::DomCode::ARROW_UP, ui::EF_ALT_DOWN,
Zentaro Kavanagh531da3d2021-02-24 18:21:261791 ui::DomKey::ARROW_UP},
1792 kKeyboardDeviceId,
1793 /*triggers_notification=*/true},
Zentaro Kavanagh30f15aa2021-02-13 00:03:581794 // Alt+Down -> No Rewrite
1795 {ui::ET_KEY_PRESSED,
1796 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN, ui::EF_ALT_DOWN,
1797 ui::DomKey::ARROW_DOWN},
1798 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN, ui::EF_ALT_DOWN,
Zentaro Kavanagh531da3d2021-02-24 18:21:261799 ui::DomKey::ARROW_DOWN},
1800 kKeyboardDeviceId,
1801 /*triggers_notification=*/true},
Zentaro Kavanagh30f15aa2021-02-13 00:03:581802 // Ctrl+Alt+Up -> No Rewrite
1803 {ui::ET_KEY_PRESSED,
1804 {ui::VKEY_UP, ui::DomCode::ARROW_UP,
1805 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ARROW_UP},
1806 {ui::VKEY_UP, ui::DomCode::ARROW_UP,
Zentaro Kavanagh531da3d2021-02-24 18:21:261807 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ARROW_UP},
1808 kKeyboardDeviceId,
1809 /*triggers_notification=*/true},
Zentaro Kavanagh30f15aa2021-02-13 00:03:581810 // Ctrl+Alt+Down -> No Rewrite
1811 {ui::ET_KEY_PRESSED,
1812 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN,
1813 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ARROW_DOWN},
1814 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN,
Zentaro Kavanagh531da3d2021-02-24 18:21:261815 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ARROW_DOWN},
1816 kKeyboardDeviceId,
1817 /*triggers_notification=*/true},
Zentaro Kavanagh30f15aa2021-02-13 00:03:581818
1819 // NOTE: The following were workarounds to avoid rewriting the
1820 // Alt variants by additionally pressing Search.
1821
1822 // Search+Ctrl+Alt+Up -> Ctrl+Alt+PageUp(aka Prior)
1823 {ui::ET_KEY_PRESSED,
1824 {ui::VKEY_UP, ui::DomCode::ARROW_UP,
1825 ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
1826 ui::DomKey::ARROW_UP},
1827 {ui::VKEY_PRIOR, ui::DomCode::PAGE_UP,
1828 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::PAGE_UP}},
1829 // Search+Ctrl+Alt+Down -> Ctrl+Alt+PageDown(aka Next)
1830 {ui::ET_KEY_PRESSED,
1831 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN,
1832 ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
1833 ui::DomKey::ARROW_DOWN},
1834 {ui::VKEY_NEXT, ui::DomCode::PAGE_DOWN,
1835 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::PAGE_DOWN}},
1836 });
1837}
1838
Zentaro Kavanagh76b9bcb2021-05-19 06:29:451839// TODO(crbug.com/1179893): Remove once the feature is enabled permanently.
1840TEST_F(EventRewriterTest, TestRewriteExtendedKeyInsertOld) {
Zentaro Kavanagh854291b2021-02-12 16:58:301841 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
Zentaro Kavanagh7e8735052021-05-07 21:27:241842 scoped_feature_list_.InitAndDisableFeature(
1843 ::features::kImprovedKeyboardShortcuts);
Zentaro Kavanagh854291b2021-02-12 16:58:301844 TestNonAppleKeyboardVariants({
[email protected]106cf972014-05-28 17:28:171845 // Period -> Period
kpschoedel02c854d2015-06-16 14:44:291846 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351847 {ui::VKEY_OEM_PERIOD, ui::DomCode::PERIOD, ui::EF_NONE,
1848 ui::DomKey::Constant<'.'>::Character},
1849 {ui::VKEY_OEM_PERIOD, ui::DomCode::PERIOD, ui::EF_NONE,
1850 ui::DomKey::Constant<'.'>::Character}},
Zentaro Kavanagh854291b2021-02-12 16:58:301851 // Search+Period -> Insert
1852 {ui::ET_KEY_PRESSED,
1853 {ui::VKEY_OEM_PERIOD, ui::DomCode::PERIOD, ui::EF_COMMAND_DOWN,
1854 ui::DomKey::Constant<'.'>::Character},
1855 {ui::VKEY_INSERT, ui::DomCode::INSERT, ui::EF_NONE, ui::DomKey::INSERT}},
1856 // Control+Search+Period -> Control+Insert
1857 {ui::ET_KEY_PRESSED,
1858 {ui::VKEY_OEM_PERIOD, ui::DomCode::PERIOD,
1859 ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN,
1860 ui::DomKey::Constant<'.'>::Character},
1861 {ui::VKEY_INSERT, ui::DomCode::INSERT, ui::EF_CONTROL_DOWN,
1862 ui::DomKey::INSERT}},
1863 });
1864}
[email protected]3e035e82012-11-27 20:54:321865
Zentaro Kavanagh76b9bcb2021-05-19 06:29:451866TEST_F(EventRewriterTest, TestRewriteExtendedKeyInsertDeprecatedNotification) {
Zentaro Kavanagh7e8735052021-05-07 21:27:241867 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
1868 scoped_feature_list_.InitAndEnableFeature(
1869 ::features::kImprovedKeyboardShortcuts);
1870 TestNonAppleKeyboardVariants({
1871 // Period -> Period
1872 {ui::ET_KEY_PRESSED,
1873 {ui::VKEY_OEM_PERIOD, ui::DomCode::PERIOD, ui::EF_NONE,
1874 ui::DomKey::Constant<'.'>::Character},
1875 {ui::VKEY_OEM_PERIOD, ui::DomCode::PERIOD, ui::EF_NONE,
1876 ui::DomKey::Constant<'.'>::Character}},
1877 // Search+Period -> No rewrite (and shows notification)
1878 {ui::ET_KEY_PRESSED,
1879 {ui::VKEY_OEM_PERIOD, ui::DomCode::PERIOD, ui::EF_COMMAND_DOWN,
1880 ui::DomKey::Constant<'.'>::Character},
1881 {ui::VKEY_OEM_PERIOD, ui::DomCode::PERIOD, ui::EF_COMMAND_DOWN,
1882 ui::DomKey::Constant<'.'>::Character},
1883 kKeyboardDeviceId,
1884 /*triggers_notification=*/true},
1885 // Control+Search+Period -> No rewrite (and shows notification)
1886 {ui::ET_KEY_PRESSED,
1887 {ui::VKEY_OEM_PERIOD, ui::DomCode::PERIOD,
1888 ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN,
1889 ui::DomKey::Constant<'.'>::Character},
1890 {ui::VKEY_OEM_PERIOD, ui::DomCode::PERIOD,
1891 ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN,
1892 ui::DomKey::Constant<'.'>::Character},
1893 kKeyboardDeviceId,
1894 /*triggers_notification=*/true},
1895 });
1896}
1897
Zentaro Kavanagh76b9bcb2021-05-19 06:29:451898// TODO(crbug.com/1179893): Rename once the feature is enabled permanently.
1899TEST_F(EventRewriterTest, TestRewriteExtendedKeyInsertNew) {
Zentaro Kavanagh7e8735052021-05-07 21:27:241900 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
1901 scoped_feature_list_.InitAndEnableFeature(
1902 ::features::kImprovedKeyboardShortcuts);
1903 TestNonAppleKeyboardVariants({
1904 // Search+Shift+Backspace -> Insert
1905 {ui::ET_KEY_PRESSED,
1906 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
1907 ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN, ui::DomKey::BACKSPACE},
1908 {ui::VKEY_INSERT, ui::DomCode::INSERT, ui::EF_NONE, ui::DomKey::INSERT}},
1909 // Control+Search+Shift+Backspace -> Control+Insert
1910 {ui::ET_KEY_PRESSED,
1911 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
1912 ui::EF_CONTROL_DOWN | ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN,
1913 ui::DomKey::BACKSPACE},
1914 {ui::VKEY_INSERT, ui::DomCode::INSERT, ui::EF_CONTROL_DOWN,
1915 ui::DomKey::INSERT}},
1916 });
1917}
1918
Zentaro Kavanagh76b9bcb2021-05-19 06:29:451919TEST_F(EventRewriterTest, TestRewriteExtendedKeysSearchVariants) {
Zentaro Kavanagh854291b2021-02-12 16:58:301920 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
1921 TestNonAppleKeyboardVariants({
[email protected]106cf972014-05-28 17:28:171922 // Search+Backspace -> Delete
kpschoedel02c854d2015-06-16 14:44:291923 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351924 {ui::VKEY_BACK, ui::DomCode::BACKSPACE, ui::EF_COMMAND_DOWN,
1925 ui::DomKey::BACKSPACE},
1926 {ui::VKEY_DELETE, ui::DomCode::DEL, ui::EF_NONE, ui::DomKey::DEL}},
[email protected]106cf972014-05-28 17:28:171927 // Search+Up -> Prior
kpschoedel02c854d2015-06-16 14:44:291928 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351929 {ui::VKEY_UP, ui::DomCode::ARROW_UP, ui::EF_COMMAND_DOWN,
1930 ui::DomKey::ARROW_UP},
1931 {ui::VKEY_PRIOR, ui::DomCode::PAGE_UP, ui::EF_NONE,
1932 ui::DomKey::PAGE_UP}},
[email protected]106cf972014-05-28 17:28:171933 // Search+Down -> Next
kpschoedel02c854d2015-06-16 14:44:291934 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351935 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN, ui::EF_COMMAND_DOWN,
1936 ui::DomKey::ARROW_DOWN},
1937 {ui::VKEY_NEXT, ui::DomCode::PAGE_DOWN, ui::EF_NONE,
1938 ui::DomKey::PAGE_DOWN}},
[email protected]106cf972014-05-28 17:28:171939 // Search+Left -> Home
kpschoedel02c854d2015-06-16 14:44:291940 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351941 {ui::VKEY_LEFT, ui::DomCode::ARROW_LEFT, ui::EF_COMMAND_DOWN,
1942 ui::DomKey::ARROW_LEFT},
1943 {ui::VKEY_HOME, ui::DomCode::HOME, ui::EF_NONE, ui::DomKey::HOME}},
Zentaro Kavanagh854291b2021-02-12 16:58:301944 // Control+Search+Left -> Control+Home
kpschoedel02c854d2015-06-16 14:44:291945 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351946 {ui::VKEY_LEFT, ui::DomCode::ARROW_LEFT,
1947 ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_LEFT},
1948 {ui::VKEY_HOME, ui::DomCode::HOME, ui::EF_CONTROL_DOWN,
1949 ui::DomKey::HOME}},
[email protected]106cf972014-05-28 17:28:171950 // Search+Right -> End
kpschoedel02c854d2015-06-16 14:44:291951 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351952 {ui::VKEY_RIGHT, ui::DomCode::ARROW_RIGHT, ui::EF_COMMAND_DOWN,
1953 ui::DomKey::ARROW_RIGHT},
1954 {ui::VKEY_END, ui::DomCode::END, ui::EF_NONE, ui::DomKey::END}},
Zentaro Kavanagh854291b2021-02-12 16:58:301955 // Control+Search+Right -> Control+End
kpschoedel02c854d2015-06-16 14:44:291956 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351957 {ui::VKEY_RIGHT, ui::DomCode::ARROW_RIGHT,
1958 ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_RIGHT},
1959 {ui::VKEY_END, ui::DomCode::END, ui::EF_CONTROL_DOWN, ui::DomKey::END}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:431960 });
[email protected]f925a1a2012-11-30 07:27:521961}
[email protected]3e035e82012-11-27 20:54:321962
Zentaro Kavanagh854291b2021-02-12 16:58:301963TEST_F(EventRewriterTest, TestNumberRowIsNotRewritten) {
penghuange5df2822017-03-16 22:54:361964 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]750508d2012-12-18 00:52:581965
Zentaro Kavanaghc65969ef2020-05-14 00:58:431966 TestNonAppleNonCustomLayoutKeyboardVariants({
[email protected]106cf972014-05-28 17:28:171967 // The number row should not be rewritten without Search key.
kpschoedel02c854d2015-06-16 14:44:291968 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351969 {ui::VKEY_1, ui::DomCode::DIGIT1, ui::EF_NONE,
1970 ui::DomKey::Constant<'1'>::Character},
1971 {ui::VKEY_1, ui::DomCode::DIGIT1, ui::EF_NONE,
1972 ui::DomKey::Constant<'1'>::Character}},
kpschoedel02c854d2015-06-16 14:44:291973 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351974 {ui::VKEY_2, ui::DomCode::DIGIT2, ui::EF_NONE,
1975 ui::DomKey::Constant<'2'>::Character},
1976 {ui::VKEY_2, ui::DomCode::DIGIT2, ui::EF_NONE,
1977 ui::DomKey::Constant<'2'>::Character}},
kpschoedel02c854d2015-06-16 14:44:291978 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351979 {ui::VKEY_3, ui::DomCode::DIGIT3, ui::EF_NONE,
1980 ui::DomKey::Constant<'3'>::Character},
1981 {ui::VKEY_3, ui::DomCode::DIGIT3, ui::EF_NONE,
1982 ui::DomKey::Constant<'3'>::Character}},
kpschoedel02c854d2015-06-16 14:44:291983 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351984 {ui::VKEY_4, ui::DomCode::DIGIT4, ui::EF_NONE,
1985 ui::DomKey::Constant<'4'>::Character},
1986 {ui::VKEY_4, ui::DomCode::DIGIT4, ui::EF_NONE,
1987 ui::DomKey::Constant<'4'>::Character}},
kpschoedel02c854d2015-06-16 14:44:291988 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351989 {ui::VKEY_5, ui::DomCode::DIGIT5, ui::EF_NONE,
1990 ui::DomKey::Constant<'5'>::Character},
1991 {ui::VKEY_5, ui::DomCode::DIGIT5, ui::EF_NONE,
1992 ui::DomKey::Constant<'5'>::Character}},
kpschoedel02c854d2015-06-16 14:44:291993 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351994 {ui::VKEY_6, ui::DomCode::DIGIT6, ui::EF_NONE,
1995 ui::DomKey::Constant<'6'>::Character},
1996 {ui::VKEY_6, ui::DomCode::DIGIT6, ui::EF_NONE,
1997 ui::DomKey::Constant<'6'>::Character}},
kpschoedel02c854d2015-06-16 14:44:291998 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351999 {ui::VKEY_7, ui::DomCode::DIGIT7, ui::EF_NONE,
2000 ui::DomKey::Constant<'7'>::Character},
2001 {ui::VKEY_7, ui::DomCode::DIGIT7, ui::EF_NONE,
2002 ui::DomKey::Constant<'7'>::Character}},
kpschoedel02c854d2015-06-16 14:44:292003 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352004 {ui::VKEY_8, ui::DomCode::DIGIT8, ui::EF_NONE,
2005 ui::DomKey::Constant<'8'>::Character},
2006 {ui::VKEY_8, ui::DomCode::DIGIT8, ui::EF_NONE,
2007 ui::DomKey::Constant<'8'>::Character}},
kpschoedel02c854d2015-06-16 14:44:292008 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352009 {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_NONE,
2010 ui::DomKey::Constant<'9'>::Character},
2011 {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_NONE,
2012 ui::DomKey::Constant<'9'>::Character}},
kpschoedel02c854d2015-06-16 14:44:292013 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352014 {ui::VKEY_0, ui::DomCode::DIGIT0, ui::EF_NONE,
2015 ui::DomKey::Constant<'0'>::Character},
2016 {ui::VKEY_0, ui::DomCode::DIGIT0, ui::EF_NONE,
2017 ui::DomKey::Constant<'0'>::Character}},
kpschoedel02c854d2015-06-16 14:44:292018 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352019 {ui::VKEY_OEM_MINUS, ui::DomCode::MINUS, ui::EF_NONE,
2020 ui::DomKey::Constant<'-'>::Character},
2021 {ui::VKEY_OEM_MINUS, ui::DomCode::MINUS, ui::EF_NONE,
2022 ui::DomKey::Constant<'-'>::Character}},
kpschoedel02c854d2015-06-16 14:44:292023 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352024 {ui::VKEY_OEM_PLUS, ui::DomCode::EQUAL, ui::EF_NONE,
2025 ui::DomKey::Constant<'='>::Character},
2026 {ui::VKEY_OEM_PLUS, ui::DomCode::EQUAL, ui::EF_NONE,
2027 ui::DomKey::Constant<'='>::Character}},
Zentaro Kavanagh854291b2021-02-12 16:58:302028 });
2029}
[email protected]750508d2012-12-18 00:52:582030
Zentaro Kavanagh76b9bcb2021-05-19 06:29:452031// TODO(crbug.com/1179893): Remove once the feature is enabled permanently.
2032TEST_F(EventRewriterTest, TestRewriteSearchNumberToFunctionKeyOld) {
Zentaro Kavanagh854291b2021-02-12 16:58:302033 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
Zentaro Kavanagh76b9bcb2021-05-19 06:29:452034 scoped_feature_list_.InitAndDisableFeature(
2035 ::features::kImprovedKeyboardShortcuts);
Zentaro Kavanagh854291b2021-02-12 16:58:302036 TestNonAppleNonCustomLayoutKeyboardVariants({
[email protected]106cf972014-05-28 17:28:172037 // The number row should be rewritten as the F<number> row with Search
2038 // key.
kpschoedel02c854d2015-06-16 14:44:292039 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352040 {ui::VKEY_1, ui::DomCode::DIGIT1, ui::EF_COMMAND_DOWN,
2041 ui::DomKey::Constant<'1'>::Character},
2042 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1}},
kpschoedel02c854d2015-06-16 14:44:292043 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352044 {ui::VKEY_2, ui::DomCode::DIGIT2, ui::EF_COMMAND_DOWN,
2045 ui::DomKey::Constant<'2'>::Character},
2046 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2}},
kpschoedel02c854d2015-06-16 14:44:292047 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352048 {ui::VKEY_3, ui::DomCode::DIGIT3, ui::EF_COMMAND_DOWN,
2049 ui::DomKey::Constant<'3'>::Character},
2050 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3}},
kpschoedel02c854d2015-06-16 14:44:292051 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352052 {ui::VKEY_4, ui::DomCode::DIGIT4, ui::EF_COMMAND_DOWN,
2053 ui::DomKey::Constant<'4'>::Character},
2054 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4}},
kpschoedel02c854d2015-06-16 14:44:292055 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352056 {ui::VKEY_5, ui::DomCode::DIGIT5, ui::EF_COMMAND_DOWN,
2057 ui::DomKey::Constant<'5'>::Character},
2058 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5}},
kpschoedel02c854d2015-06-16 14:44:292059 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352060 {ui::VKEY_6, ui::DomCode::DIGIT6, ui::EF_COMMAND_DOWN,
2061 ui::DomKey::Constant<'6'>::Character},
2062 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6}},
kpschoedel02c854d2015-06-16 14:44:292063 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352064 {ui::VKEY_7, ui::DomCode::DIGIT7, ui::EF_COMMAND_DOWN,
2065 ui::DomKey::Constant<'7'>::Character},
2066 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7}},
kpschoedel02c854d2015-06-16 14:44:292067 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352068 {ui::VKEY_8, ui::DomCode::DIGIT8, ui::EF_COMMAND_DOWN,
2069 ui::DomKey::Constant<'8'>::Character},
2070 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8}},
kpschoedel02c854d2015-06-16 14:44:292071 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352072 {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_COMMAND_DOWN,
2073 ui::DomKey::Constant<'9'>::Character},
2074 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9}},
kpschoedel02c854d2015-06-16 14:44:292075 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352076 {ui::VKEY_0, ui::DomCode::DIGIT0, ui::EF_COMMAND_DOWN,
2077 ui::DomKey::Constant<'0'>::Character},
2078 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10}},
kpschoedel02c854d2015-06-16 14:44:292079 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352080 {ui::VKEY_OEM_MINUS, ui::DomCode::MINUS, ui::EF_COMMAND_DOWN,
2081 ui::DomKey::Constant<'-'>::Character},
2082 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}},
kpschoedel02c854d2015-06-16 14:44:292083 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352084 {ui::VKEY_OEM_PLUS, ui::DomCode::EQUAL, ui::EF_COMMAND_DOWN,
2085 ui::DomKey::Constant<'='>::Character},
2086 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
Zentaro Kavanagh854291b2021-02-12 16:58:302087 });
2088}
[email protected]750508d2012-12-18 00:52:582089
Zentaro Kavanagh76b9bcb2021-05-19 06:29:452090TEST_F(EventRewriterTest, TestRewriteSearchNumberToFunctionKeyNoAction) {
Zentaro Kavanagh30f15aa2021-02-13 00:03:582091 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
Zentaro Kavanagh30f15aa2021-02-13 00:03:582092 TestNonAppleNonCustomLayoutKeyboardVariants({
Zentaro Kavanagh658ca4f2021-03-25 22:47:262093 // Search+Number should now have no effect but a notification will
2094 // be shown the first time F1 to F10 is pressed.
Zentaro Kavanagh30f15aa2021-02-13 00:03:582095 {ui::ET_KEY_PRESSED,
2096 {ui::VKEY_1, ui::DomCode::DIGIT1, ui::EF_COMMAND_DOWN,
2097 ui::DomKey::Constant<'1'>::Character},
2098 {ui::VKEY_1, ui::DomCode::DIGIT1, ui::EF_COMMAND_DOWN,
Zentaro Kavanagh658ca4f2021-03-25 22:47:262099 ui::DomKey::Constant<'1'>::Character},
2100 kKeyboardDeviceId,
2101 /*triggers_notification=*/true},
Zentaro Kavanagh30f15aa2021-02-13 00:03:582102 {ui::ET_KEY_PRESSED,
2103 {ui::VKEY_2, ui::DomCode::DIGIT2, ui::EF_COMMAND_DOWN,
2104 ui::DomKey::Constant<'2'>::Character},
2105 {ui::VKEY_2, ui::DomCode::DIGIT2, ui::EF_COMMAND_DOWN,
Zentaro Kavanagh658ca4f2021-03-25 22:47:262106 ui::DomKey::Constant<'2'>::Character},
2107 kKeyboardDeviceId,
2108 /*triggers_notification=*/true},
Zentaro Kavanagh30f15aa2021-02-13 00:03:582109 {ui::ET_KEY_PRESSED,
2110 {ui::VKEY_3, ui::DomCode::DIGIT3, ui::EF_COMMAND_DOWN,
2111 ui::DomKey::Constant<'3'>::Character},
2112 {ui::VKEY_3, ui::DomCode::DIGIT3, ui::EF_COMMAND_DOWN,
Zentaro Kavanagh658ca4f2021-03-25 22:47:262113 ui::DomKey::Constant<'3'>::Character},
2114 kKeyboardDeviceId,
2115 /*triggers_notification=*/true},
Zentaro Kavanagh30f15aa2021-02-13 00:03:582116 {ui::ET_KEY_PRESSED,
2117 {ui::VKEY_4, ui::DomCode::DIGIT4, ui::EF_COMMAND_DOWN,
2118 ui::DomKey::Constant<'4'>::Character},
2119 {ui::VKEY_4, ui::DomCode::DIGIT4, ui::EF_COMMAND_DOWN,
Zentaro Kavanagh658ca4f2021-03-25 22:47:262120 ui::DomKey::Constant<'4'>::Character},
2121 kKeyboardDeviceId,
2122 /*triggers_notification=*/true},
Zentaro Kavanagh30f15aa2021-02-13 00:03:582123 {ui::ET_KEY_PRESSED,
2124 {ui::VKEY_5, ui::DomCode::DIGIT5, ui::EF_COMMAND_DOWN,
2125 ui::DomKey::Constant<'5'>::Character},
2126 {ui::VKEY_5, ui::DomCode::DIGIT5, ui::EF_COMMAND_DOWN,
Zentaro Kavanagh658ca4f2021-03-25 22:47:262127 ui::DomKey::Constant<'5'>::Character},
2128 kKeyboardDeviceId,
2129 /*triggers_notification=*/true},
Zentaro Kavanagh30f15aa2021-02-13 00:03:582130 {ui::ET_KEY_PRESSED,
2131 {ui::VKEY_6, ui::DomCode::DIGIT6, ui::EF_COMMAND_DOWN,
2132 ui::DomKey::Constant<'6'>::Character},
2133 {ui::VKEY_6, ui::DomCode::DIGIT6, ui::EF_COMMAND_DOWN,
Zentaro Kavanagh658ca4f2021-03-25 22:47:262134 ui::DomKey::Constant<'6'>::Character},
2135 kKeyboardDeviceId,
2136 /*triggers_notification=*/true},
Zentaro Kavanagh30f15aa2021-02-13 00:03:582137 {ui::ET_KEY_PRESSED,
2138 {ui::VKEY_7, ui::DomCode::DIGIT7, ui::EF_COMMAND_DOWN,
2139 ui::DomKey::Constant<'7'>::Character},
2140 {ui::VKEY_7, ui::DomCode::DIGIT7, ui::EF_COMMAND_DOWN,
Zentaro Kavanagh658ca4f2021-03-25 22:47:262141 ui::DomKey::Constant<'7'>::Character},
2142 kKeyboardDeviceId,
2143 /*triggers_notification=*/true},
Zentaro Kavanagh30f15aa2021-02-13 00:03:582144 {ui::ET_KEY_PRESSED,
2145 {ui::VKEY_8, ui::DomCode::DIGIT8, ui::EF_COMMAND_DOWN,
2146 ui::DomKey::Constant<'8'>::Character},
2147 {ui::VKEY_8, ui::DomCode::DIGIT8, ui::EF_COMMAND_DOWN,
Zentaro Kavanagh658ca4f2021-03-25 22:47:262148 ui::DomKey::Constant<'8'>::Character},
2149 kKeyboardDeviceId,
2150 /*triggers_notification=*/true},
Zentaro Kavanagh30f15aa2021-02-13 00:03:582151 {ui::ET_KEY_PRESSED,
2152 {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_COMMAND_DOWN,
2153 ui::DomKey::Constant<'9'>::Character},
2154 {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_COMMAND_DOWN,
Zentaro Kavanagh658ca4f2021-03-25 22:47:262155 ui::DomKey::Constant<'9'>::Character},
2156 kKeyboardDeviceId,
2157 /*triggers_notification=*/true},
Zentaro Kavanagh30f15aa2021-02-13 00:03:582158 {ui::ET_KEY_PRESSED,
2159 {ui::VKEY_0, ui::DomCode::DIGIT0, ui::EF_COMMAND_DOWN,
2160 ui::DomKey::Constant<'0'>::Character},
2161 {ui::VKEY_0, ui::DomCode::DIGIT0, ui::EF_COMMAND_DOWN,
Zentaro Kavanagh658ca4f2021-03-25 22:47:262162 ui::DomKey::Constant<'0'>::Character},
2163 kKeyboardDeviceId,
2164 /*triggers_notification=*/true},
Zentaro Kavanagh30f15aa2021-02-13 00:03:582165 {ui::ET_KEY_PRESSED,
2166 {ui::VKEY_OEM_MINUS, ui::DomCode::MINUS, ui::EF_COMMAND_DOWN,
2167 ui::DomKey::Constant<'-'>::Character},
2168 {ui::VKEY_OEM_MINUS, ui::DomCode::MINUS, ui::EF_COMMAND_DOWN,
2169 ui::DomKey::Constant<'-'>::Character}},
2170 {ui::ET_KEY_PRESSED,
2171 {ui::VKEY_OEM_PLUS, ui::DomCode::EQUAL, ui::EF_COMMAND_DOWN,
2172 ui::DomKey::Constant<'='>::Character},
2173 {ui::VKEY_OEM_PLUS, ui::DomCode::EQUAL, ui::EF_COMMAND_DOWN,
2174 ui::DomKey::Constant<'='>::Character}},
2175 });
2176}
2177
Zentaro Kavanagh854291b2021-02-12 16:58:302178TEST_F(EventRewriterTest, TestFunctionKeysNotRewrittenBySearch) {
2179 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
2180
2181 TestNonAppleNonCustomLayoutKeyboardVariants({
[email protected]106cf972014-05-28 17:28:172182 // The function keys should not be rewritten with Search key pressed.
kpschoedel02c854d2015-06-16 14:44:292183 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352184 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_COMMAND_DOWN, ui::DomKey::F1},
2185 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1}},
kpschoedel02c854d2015-06-16 14:44:292186 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352187 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_COMMAND_DOWN, ui::DomKey::F2},
2188 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2}},
kpschoedel02c854d2015-06-16 14:44:292189 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352190 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_COMMAND_DOWN, ui::DomKey::F3},
2191 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3}},
kpschoedel02c854d2015-06-16 14:44:292192 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352193 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_COMMAND_DOWN, ui::DomKey::F4},
2194 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4}},
kpschoedel02c854d2015-06-16 14:44:292195 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352196 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_COMMAND_DOWN, ui::DomKey::F5},
2197 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5}},
kpschoedel02c854d2015-06-16 14:44:292198 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352199 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_COMMAND_DOWN, ui::DomKey::F6},
2200 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6}},
kpschoedel02c854d2015-06-16 14:44:292201 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352202 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_COMMAND_DOWN, ui::DomKey::F7},
2203 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7}},
kpschoedel02c854d2015-06-16 14:44:292204 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352205 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_COMMAND_DOWN, ui::DomKey::F8},
2206 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8}},
kpschoedel02c854d2015-06-16 14:44:292207 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352208 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_COMMAND_DOWN, ui::DomKey::F9},
2209 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9}},
kpschoedel02c854d2015-06-16 14:44:292210 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352211 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_COMMAND_DOWN, ui::DomKey::F10},
2212 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10}},
kpschoedel02c854d2015-06-16 14:44:292213 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352214 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_COMMAND_DOWN, ui::DomKey::F11},
2215 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}},
kpschoedel02c854d2015-06-16 14:44:292216 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352217 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_COMMAND_DOWN, ui::DomKey::F12},
Dmitry Torokhov3e2b7d82020-02-13 18:04:432218 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
2219 });
[email protected]4a822092012-06-15 03:42:512220}
2221
Zentaro Kavanaghc65969ef2020-05-14 00:58:432222TEST_F(EventRewriterTest, TestRewriteFunctionKeysNonCustomLayouts) {
2223 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
2224
2225 // Old CrOS keyboards that do not have custom layouts send F-Keys by default
2226 // and are translated by default to Actions based on hardcoded mappings.
2227 // New CrOS keyboards are not tested here because they do not remap F-Keys.
2228 TestNonAppleNonCustomLayoutKeyboardVariants({
2229 // F1 -> Back
2230 {ui::ET_KEY_PRESSED,
2231 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1},
2232 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_NONE,
2233 ui::DomKey::BROWSER_BACK}},
2234 {ui::ET_KEY_PRESSED,
2235 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_CONTROL_DOWN, ui::DomKey::F1},
2236 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_CONTROL_DOWN,
2237 ui::DomKey::BROWSER_BACK}},
2238 {ui::ET_KEY_PRESSED,
2239 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_ALT_DOWN, ui::DomKey::F1},
2240 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_ALT_DOWN,
2241 ui::DomKey::BROWSER_BACK}},
2242 // F2 -> Forward
2243 {ui::ET_KEY_PRESSED,
2244 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2},
2245 {ui::VKEY_BROWSER_FORWARD, ui::DomCode::BROWSER_FORWARD, ui::EF_NONE,
2246 ui::DomKey::BROWSER_FORWARD}},
2247 {ui::ET_KEY_PRESSED,
2248 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_CONTROL_DOWN, ui::DomKey::F2},
2249 {ui::VKEY_BROWSER_FORWARD, ui::DomCode::BROWSER_FORWARD,
2250 ui::EF_CONTROL_DOWN, ui::DomKey::BROWSER_FORWARD}},
2251 {ui::ET_KEY_PRESSED,
2252 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_ALT_DOWN, ui::DomKey::F2},
2253 {ui::VKEY_BROWSER_FORWARD, ui::DomCode::BROWSER_FORWARD, ui::EF_ALT_DOWN,
2254 ui::DomKey::BROWSER_FORWARD}},
2255 // F3 -> Refresh
2256 {ui::ET_KEY_PRESSED,
2257 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3},
2258 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_NONE,
2259 ui::DomKey::BROWSER_REFRESH}},
2260 {ui::ET_KEY_PRESSED,
2261 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_CONTROL_DOWN, ui::DomKey::F3},
2262 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH,
2263 ui::EF_CONTROL_DOWN, ui::DomKey::BROWSER_REFRESH}},
2264 {ui::ET_KEY_PRESSED,
2265 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_ALT_DOWN, ui::DomKey::F3},
2266 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_ALT_DOWN,
2267 ui::DomKey::BROWSER_REFRESH}},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:442268 // F4 -> Zoom (aka Fullscreen)
Zentaro Kavanaghc65969ef2020-05-14 00:58:432269 {ui::ET_KEY_PRESSED,
2270 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:442271 {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_NONE,
Zentaro Kavanaghc65969ef2020-05-14 00:58:432272 ui::DomKey::ZOOM_TOGGLE}},
2273 {ui::ET_KEY_PRESSED,
2274 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_CONTROL_DOWN, ui::DomKey::F4},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:442275 {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_CONTROL_DOWN,
2276 ui::DomKey::ZOOM_TOGGLE}},
Zentaro Kavanaghc65969ef2020-05-14 00:58:432277 {ui::ET_KEY_PRESSED,
2278 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_ALT_DOWN, ui::DomKey::F4},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:442279 {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_ALT_DOWN,
Zentaro Kavanaghc65969ef2020-05-14 00:58:432280 ui::DomKey::ZOOM_TOGGLE}},
2281 // F5 -> Launch App 1
2282 {ui::ET_KEY_PRESSED,
2283 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5},
2284 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::SELECT_TASK, ui::EF_NONE,
2285 ui::DomKey::LAUNCH_MY_COMPUTER}},
2286 {ui::ET_KEY_PRESSED,
2287 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_CONTROL_DOWN, ui::DomKey::F5},
2288 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::SELECT_TASK,
2289 ui::EF_CONTROL_DOWN, ui::DomKey::LAUNCH_MY_COMPUTER}},
2290 {ui::ET_KEY_PRESSED,
2291 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_ALT_DOWN, ui::DomKey::F5},
2292 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::SELECT_TASK, ui::EF_ALT_DOWN,
2293 ui::DomKey::LAUNCH_MY_COMPUTER}},
2294 // F6 -> Brightness down
2295 {ui::ET_KEY_PRESSED,
2296 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6},
2297 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN, ui::EF_NONE,
2298 ui::DomKey::BRIGHTNESS_DOWN}},
2299 {ui::ET_KEY_PRESSED,
2300 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_CONTROL_DOWN, ui::DomKey::F6},
2301 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN,
2302 ui::EF_CONTROL_DOWN, ui::DomKey::BRIGHTNESS_DOWN}},
2303 {ui::ET_KEY_PRESSED,
2304 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_ALT_DOWN, ui::DomKey::F6},
2305 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN, ui::EF_ALT_DOWN,
2306 ui::DomKey::BRIGHTNESS_DOWN}},
2307 // F7 -> Brightness up
2308 {ui::ET_KEY_PRESSED,
2309 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7},
2310 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_NONE,
2311 ui::DomKey::BRIGHTNESS_UP}},
2312 {ui::ET_KEY_PRESSED,
2313 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_CONTROL_DOWN, ui::DomKey::F7},
2314 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_CONTROL_DOWN,
2315 ui::DomKey::BRIGHTNESS_UP}},
2316 {ui::ET_KEY_PRESSED,
2317 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_ALT_DOWN, ui::DomKey::F7},
2318 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_ALT_DOWN,
2319 ui::DomKey::BRIGHTNESS_UP}},
2320 // F8 -> Volume Mute
2321 {ui::ET_KEY_PRESSED,
2322 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8},
2323 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_NONE,
2324 ui::DomKey::AUDIO_VOLUME_MUTE}},
2325 {ui::ET_KEY_PRESSED,
2326 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_CONTROL_DOWN, ui::DomKey::F8},
2327 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_CONTROL_DOWN,
2328 ui::DomKey::AUDIO_VOLUME_MUTE}},
2329 {ui::ET_KEY_PRESSED,
2330 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_ALT_DOWN, ui::DomKey::F8},
2331 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_ALT_DOWN,
2332 ui::DomKey::AUDIO_VOLUME_MUTE}},
2333 // F9 -> Volume Down
2334 {ui::ET_KEY_PRESSED,
2335 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9},
2336 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_NONE,
2337 ui::DomKey::AUDIO_VOLUME_DOWN}},
2338 {ui::ET_KEY_PRESSED,
2339 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_CONTROL_DOWN, ui::DomKey::F9},
2340 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_CONTROL_DOWN,
2341 ui::DomKey::AUDIO_VOLUME_DOWN}},
2342 {ui::ET_KEY_PRESSED,
2343 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_ALT_DOWN, ui::DomKey::F9},
2344 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_ALT_DOWN,
2345 ui::DomKey::AUDIO_VOLUME_DOWN}},
2346 // F10 -> Volume Up
2347 {ui::ET_KEY_PRESSED,
2348 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10},
2349 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_NONE,
2350 ui::DomKey::AUDIO_VOLUME_UP}},
2351 {ui::ET_KEY_PRESSED,
2352 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_CONTROL_DOWN, ui::DomKey::F10},
2353 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_CONTROL_DOWN,
2354 ui::DomKey::AUDIO_VOLUME_UP}},
2355 {ui::ET_KEY_PRESSED,
2356 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_ALT_DOWN, ui::DomKey::F10},
2357 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_ALT_DOWN,
2358 ui::DomKey::AUDIO_VOLUME_UP}},
2359 // F11 -> F11
2360 {ui::ET_KEY_PRESSED,
2361 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11},
2362 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}},
2363 {ui::ET_KEY_PRESSED,
2364 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_CONTROL_DOWN, ui::DomKey::F11},
2365 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_CONTROL_DOWN, ui::DomKey::F11}},
2366 {ui::ET_KEY_PRESSED,
2367 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_ALT_DOWN, ui::DomKey::F11},
2368 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_ALT_DOWN, ui::DomKey::F11}},
2369 // F12 -> F12
2370 {ui::ET_KEY_PRESSED,
2371 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12},
2372 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
2373 {ui::ET_KEY_PRESSED,
2374 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12},
2375 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12}},
2376 {ui::ET_KEY_PRESSED,
2377 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_ALT_DOWN, ui::DomKey::F12},
2378 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_ALT_DOWN, ui::DomKey::F12}},
2379 });
2380}
2381
2382TEST_F(EventRewriterTest, TestRewriteFunctionKeysCustomLayoutsFKeyUnchanged) {
2383 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
2384
2385 // On devices with custom layouts, the F-Keys are never remapped.
2386 TestChromeCustomLayoutKeyboardVariants({
2387 // F1-> F1
2388 {ui::ET_KEY_PRESSED,
2389 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1},
2390 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1}},
2391 {ui::ET_KEY_PRESSED,
2392 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_CONTROL_DOWN, ui::DomKey::F1},
2393 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_CONTROL_DOWN, ui::DomKey::F1}},
2394 {ui::ET_KEY_PRESSED,
2395 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_ALT_DOWN, ui::DomKey::F1},
2396 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_ALT_DOWN, ui::DomKey::F1}},
2397 {ui::ET_KEY_PRESSED,
2398 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_COMMAND_DOWN, ui::DomKey::F1},
2399 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_COMMAND_DOWN, ui::DomKey::F1}},
2400 // F2 -> F2
2401 {ui::ET_KEY_PRESSED,
2402 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2},
2403 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2}},
2404 {ui::ET_KEY_PRESSED,
2405 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_CONTROL_DOWN, ui::DomKey::F2},
2406 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_CONTROL_DOWN, ui::DomKey::F2}},
2407 {ui::ET_KEY_PRESSED,
2408 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_ALT_DOWN, ui::DomKey::F2},
2409 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_ALT_DOWN, ui::DomKey::F2}},
2410 {ui::ET_KEY_PRESSED,
2411 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_COMMAND_DOWN, ui::DomKey::F2},
2412 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_COMMAND_DOWN, ui::DomKey::F2}},
2413 // F3 -> F3
2414 {ui::ET_KEY_PRESSED,
2415 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3},
2416 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3}},
2417 {ui::ET_KEY_PRESSED,
2418 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_CONTROL_DOWN, ui::DomKey::F3},
2419 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_CONTROL_DOWN, ui::DomKey::F3}},
2420 {ui::ET_KEY_PRESSED,
2421 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_ALT_DOWN, ui::DomKey::F3},
2422 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_ALT_DOWN, ui::DomKey::F3}},
2423 {ui::ET_KEY_PRESSED,
2424 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_COMMAND_DOWN, ui::DomKey::F3},
2425 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_COMMAND_DOWN, ui::DomKey::F3}},
2426 // F4 -> F4
2427 {ui::ET_KEY_PRESSED,
2428 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4},
2429 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4}},
2430 {ui::ET_KEY_PRESSED,
2431 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_CONTROL_DOWN, ui::DomKey::F4},
2432 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_CONTROL_DOWN, ui::DomKey::F4}},
2433 {ui::ET_KEY_PRESSED,
2434 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_ALT_DOWN, ui::DomKey::F4},
2435 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_ALT_DOWN, ui::DomKey::F4}},
2436 {ui::ET_KEY_PRESSED,
2437 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_COMMAND_DOWN, ui::DomKey::F4},
2438 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_COMMAND_DOWN, ui::DomKey::F4}},
2439 // F5 -> F5
2440 {ui::ET_KEY_PRESSED,
2441 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5},
2442 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5}},
2443 {ui::ET_KEY_PRESSED,
2444 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_CONTROL_DOWN, ui::DomKey::F5},
2445 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_CONTROL_DOWN, ui::DomKey::F5}},
2446 {ui::ET_KEY_PRESSED,
2447 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_ALT_DOWN, ui::DomKey::F5},
2448 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_ALT_DOWN, ui::DomKey::F5}},
2449 {ui::ET_KEY_PRESSED,
2450 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_COMMAND_DOWN, ui::DomKey::F5},
2451 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_COMMAND_DOWN, ui::DomKey::F5}},
2452 // F6 -> F6
2453 {ui::ET_KEY_PRESSED,
2454 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6},
2455 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6}},
2456 {ui::ET_KEY_PRESSED,
2457 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_CONTROL_DOWN, ui::DomKey::F6},
2458 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_CONTROL_DOWN, ui::DomKey::F6}},
2459 {ui::ET_KEY_PRESSED,
2460 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_ALT_DOWN, ui::DomKey::F6},
2461 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_ALT_DOWN, ui::DomKey::F6}},
2462 {ui::ET_KEY_PRESSED,
2463 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_COMMAND_DOWN, ui::DomKey::F6},
2464 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_COMMAND_DOWN, ui::DomKey::F6}},
2465 // F7 -> F7
2466 {ui::ET_KEY_PRESSED,
2467 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7},
2468 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7}},
2469 {ui::ET_KEY_PRESSED,
2470 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_CONTROL_DOWN, ui::DomKey::F7},
2471 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_CONTROL_DOWN, ui::DomKey::F7}},
2472 {ui::ET_KEY_PRESSED,
2473 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_ALT_DOWN, ui::DomKey::F7},
2474 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_ALT_DOWN, ui::DomKey::F7}},
2475 {ui::ET_KEY_PRESSED,
2476 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_COMMAND_DOWN, ui::DomKey::F7},
2477 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_COMMAND_DOWN, ui::DomKey::F7}},
2478 // F8 -> F8
2479 {ui::ET_KEY_PRESSED,
2480 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8},
2481 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8}},
2482 {ui::ET_KEY_PRESSED,
2483 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_CONTROL_DOWN, ui::DomKey::F8},
2484 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_CONTROL_DOWN, ui::DomKey::F8}},
2485 {ui::ET_KEY_PRESSED,
2486 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_ALT_DOWN, ui::DomKey::F8},
2487 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_ALT_DOWN, ui::DomKey::F8}},
2488 {ui::ET_KEY_PRESSED,
2489 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_COMMAND_DOWN, ui::DomKey::F8},
2490 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_COMMAND_DOWN, ui::DomKey::F8}},
2491 // F9 -> F9
2492 {ui::ET_KEY_PRESSED,
2493 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9},
2494 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9}},
2495 {ui::ET_KEY_PRESSED,
2496 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_CONTROL_DOWN, ui::DomKey::F9},
2497 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_CONTROL_DOWN, ui::DomKey::F9}},
2498 {ui::ET_KEY_PRESSED,
2499 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_ALT_DOWN, ui::DomKey::F9},
2500 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_ALT_DOWN, ui::DomKey::F9}},
2501 {ui::ET_KEY_PRESSED,
2502 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_COMMAND_DOWN, ui::DomKey::F9},
2503 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_COMMAND_DOWN, ui::DomKey::F9}},
2504 // F10 -> F10
2505 {ui::ET_KEY_PRESSED,
2506 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10},
2507 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10}},
2508 {ui::ET_KEY_PRESSED,
2509 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_CONTROL_DOWN, ui::DomKey::F10},
2510 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_CONTROL_DOWN, ui::DomKey::F10}},
2511 {ui::ET_KEY_PRESSED,
2512 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_ALT_DOWN, ui::DomKey::F10},
2513 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_ALT_DOWN, ui::DomKey::F10}},
2514 {ui::ET_KEY_PRESSED,
2515 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_COMMAND_DOWN, ui::DomKey::F10},
2516 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_COMMAND_DOWN, ui::DomKey::F10}},
2517 // F11 -> F11
2518 {ui::ET_KEY_PRESSED,
2519 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11},
2520 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}},
2521 {ui::ET_KEY_PRESSED,
2522 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_CONTROL_DOWN, ui::DomKey::F11},
2523 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_CONTROL_DOWN, ui::DomKey::F11}},
2524 {ui::ET_KEY_PRESSED,
2525 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_ALT_DOWN, ui::DomKey::F11},
2526 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_ALT_DOWN, ui::DomKey::F11}},
2527 {ui::ET_KEY_PRESSED,
2528 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_COMMAND_DOWN, ui::DomKey::F11},
2529 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_COMMAND_DOWN, ui::DomKey::F11}},
2530 // F12 -> F12
2531 {ui::ET_KEY_PRESSED,
2532 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12},
2533 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
2534 {ui::ET_KEY_PRESSED,
2535 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12},
2536 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12}},
2537 {ui::ET_KEY_PRESSED,
2538 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_ALT_DOWN, ui::DomKey::F12},
2539 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_ALT_DOWN, ui::DomKey::F12}},
2540 {ui::ET_KEY_PRESSED,
2541 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_COMMAND_DOWN, ui::DomKey::F12},
2542 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_COMMAND_DOWN, ui::DomKey::F12}},
2543 // F13 -> F13
2544 {ui::ET_KEY_PRESSED,
2545 {ui::VKEY_F13, ui::DomCode::F13, ui::EF_NONE, ui::DomKey::F13},
2546 {ui::VKEY_F13, ui::DomCode::F13, ui::EF_NONE, ui::DomKey::F13}},
2547 {ui::ET_KEY_PRESSED,
2548 {ui::VKEY_F13, ui::DomCode::F13, ui::EF_CONTROL_DOWN, ui::DomKey::F13},
2549 {ui::VKEY_F13, ui::DomCode::F13, ui::EF_CONTROL_DOWN, ui::DomKey::F13}},
2550 {ui::ET_KEY_PRESSED,
2551 {ui::VKEY_F13, ui::DomCode::F13, ui::EF_ALT_DOWN, ui::DomKey::F13},
2552 {ui::VKEY_F13, ui::DomCode::F13, ui::EF_ALT_DOWN, ui::DomKey::F13}},
2553 {ui::ET_KEY_PRESSED,
2554 {ui::VKEY_F13, ui::DomCode::F13, ui::EF_COMMAND_DOWN, ui::DomKey::F13},
2555 {ui::VKEY_F13, ui::DomCode::F13, ui::EF_COMMAND_DOWN, ui::DomKey::F13}},
2556 // F14 -> F14
2557 {ui::ET_KEY_PRESSED,
2558 {ui::VKEY_F14, ui::DomCode::F14, ui::EF_NONE, ui::DomKey::F14},
2559 {ui::VKEY_F14, ui::DomCode::F14, ui::EF_NONE, ui::DomKey::F14}},
2560 {ui::ET_KEY_PRESSED,
2561 {ui::VKEY_F14, ui::DomCode::F14, ui::EF_CONTROL_DOWN, ui::DomKey::F14},
2562 {ui::VKEY_F14, ui::DomCode::F14, ui::EF_CONTROL_DOWN, ui::DomKey::F14}},
2563 {ui::ET_KEY_PRESSED,
2564 {ui::VKEY_F14, ui::DomCode::F14, ui::EF_ALT_DOWN, ui::DomKey::F14},
2565 {ui::VKEY_F14, ui::DomCode::F14, ui::EF_ALT_DOWN, ui::DomKey::F14}},
2566 {ui::ET_KEY_PRESSED,
2567 {ui::VKEY_F14, ui::DomCode::F14, ui::EF_COMMAND_DOWN, ui::DomKey::F14},
2568 {ui::VKEY_F14, ui::DomCode::F14, ui::EF_COMMAND_DOWN, ui::DomKey::F14}},
2569 // F15 -> F15
2570 {ui::ET_KEY_PRESSED,
2571 {ui::VKEY_F15, ui::DomCode::F15, ui::EF_NONE, ui::DomKey::F15},
2572 {ui::VKEY_F15, ui::DomCode::F15, ui::EF_NONE, ui::DomKey::F15}},
2573 {ui::ET_KEY_PRESSED,
2574 {ui::VKEY_F15, ui::DomCode::F15, ui::EF_CONTROL_DOWN, ui::DomKey::F15},
2575 {ui::VKEY_F15, ui::DomCode::F15, ui::EF_CONTROL_DOWN, ui::DomKey::F15}},
2576 {ui::ET_KEY_PRESSED,
2577 {ui::VKEY_F15, ui::DomCode::F15, ui::EF_ALT_DOWN, ui::DomKey::F15},
2578 {ui::VKEY_F15, ui::DomCode::F15, ui::EF_ALT_DOWN, ui::DomKey::F15}},
2579 {ui::ET_KEY_PRESSED,
2580 {ui::VKEY_F15, ui::DomCode::F15, ui::EF_COMMAND_DOWN, ui::DomKey::F15},
2581 {ui::VKEY_F15, ui::DomCode::F15, ui::EF_COMMAND_DOWN, ui::DomKey::F15}},
2582 });
2583}
2584
2585TEST_F(EventRewriterTest, TestRewriteFunctionKeysCustomLayoutsActionUnchanged) {
2586 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
2587
2588 // An action key on these devices is one where the scan code matches an entry
2589 // in the layout map. It doesn't matter what the action is, as long the
2590 // search key isn't pressed it will pass through unchanged.
2591 const std::string layout = "a1 a2 a3";
2592 TestKeyboard("Internal Custom Layout Keyboard", layout,
2593 ui::INPUT_DEVICE_INTERNAL, /*has_custom_top_row=*/true,
2594 {
2595 {ui::ET_KEY_PRESSED,
2596 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH,
2597 ui::EF_NONE, ui::DomKey::BROWSER_REFRESH, 0xa1},
2598 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH,
2599 ui::EF_NONE, ui::DomKey::BROWSER_REFRESH, 0xa1}},
2600 {ui::ET_KEY_PRESSED,
2601 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_NONE,
2602 ui::DomKey::AUDIO_VOLUME_UP, 0xa2},
2603 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_NONE,
2604 ui::DomKey::AUDIO_VOLUME_UP, 0xa2}},
2605 {ui::ET_KEY_PRESSED,
2606 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN,
2607 ui::EF_NONE, ui::DomKey::AUDIO_VOLUME_DOWN, 0xa3},
2608 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN,
2609 ui::EF_NONE, ui::DomKey::AUDIO_VOLUME_DOWN, 0xa3}},
2610 });
2611}
2612
2613TEST_F(EventRewriterTest, TestRewriteFunctionKeysCustomLayouts) {
2614 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
2615
2616 // On devices with custom layouts, scan codes that match the layout
2617 // map get mapped to F-Keys based only on the scan code. The search
2618 // key also gets treated as unpressed in the remapped event.
2619 const std::string layout = "a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af";
2620 TestKeyboard(
2621 "Internal Custom Layout Keyboard", layout, ui::INPUT_DEVICE_INTERNAL,
2622 /*has_custom_top_row=*/true,
2623 {
2624 // Action -> F1
2625 {ui::ET_KEY_PRESSED,
2626 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_COMMAND_DOWN,
2627 ui::DomKey::NONE, 0xa1},
2628 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1, 0xa1}},
2629 // Action -> F2
2630 {ui::ET_KEY_PRESSED,
2631 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_COMMAND_DOWN,
2632 ui::DomKey::NONE, 0xa2},
2633 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2, 0xa2}},
2634 // Action -> F3
2635 {ui::ET_KEY_PRESSED,
2636 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_COMMAND_DOWN,
2637 ui::DomKey::NONE, 0xa3},
2638 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3, 0xa3}},
2639 // Action -> F4
2640 {ui::ET_KEY_PRESSED,
2641 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_COMMAND_DOWN,
2642 ui::DomKey::NONE, 0xa4},
2643 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4, 0xa4}},
2644 // Action -> F5
2645 {ui::ET_KEY_PRESSED,
2646 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_COMMAND_DOWN,
2647 ui::DomKey::NONE, 0xa5},
2648 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5, 0xa5}},
2649 // Action -> F6
2650 {ui::ET_KEY_PRESSED,
2651 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_COMMAND_DOWN,
2652 ui::DomKey::NONE, 0xa6},
2653 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6, 0xa6}},
2654 // Action -> F7
2655 {ui::ET_KEY_PRESSED,
2656 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_COMMAND_DOWN,
2657 ui::DomKey::NONE, 0xa7},
2658 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7, 0xa7}},
2659 // Action -> F8
2660 {ui::ET_KEY_PRESSED,
2661 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_COMMAND_DOWN,
2662 ui::DomKey::NONE, 0xa8},
2663 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8, 0xa8}},
2664 // Action -> F9
2665 {ui::ET_KEY_PRESSED,
2666 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_COMMAND_DOWN,
2667 ui::DomKey::NONE, 0xa9},
2668 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9, 0xa9}},
2669 // Action -> F10
2670 {ui::ET_KEY_PRESSED,
2671 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_COMMAND_DOWN,
2672 ui::DomKey::NONE, 0xaa},
2673 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10,
2674 0xaa}},
2675 // Action -> F11
2676 {ui::ET_KEY_PRESSED,
2677 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_COMMAND_DOWN,
2678 ui::DomKey::NONE, 0xab},
2679 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11,
2680 0xab}},
2681 // Action -> F12
2682 {ui::ET_KEY_PRESSED,
2683 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_COMMAND_DOWN,
2684 ui::DomKey::NONE, 0xac},
2685 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12,
2686 0xac}},
2687 // Action -> F13
2688 {ui::ET_KEY_PRESSED,
2689 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_COMMAND_DOWN,
2690 ui::DomKey::NONE, 0xad},
2691 {ui::VKEY_F13, ui::DomCode::F13, ui::EF_NONE, ui::DomKey::F13,
2692 0xad}},
2693 // Action -> F14
2694 {ui::ET_KEY_PRESSED,
2695 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_COMMAND_DOWN,
2696 ui::DomKey::NONE, 0xae},
2697 {ui::VKEY_F14, ui::DomCode::F14, ui::EF_NONE, ui::DomKey::F14,
2698 0xae}},
2699 // Action -> F15
2700 {ui::ET_KEY_PRESSED,
2701 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_COMMAND_DOWN,
2702 ui::DomKey::NONE, 0xaf},
2703 {ui::VKEY_F15, ui::DomCode::F15, ui::EF_NONE, ui::DomKey::F15,
2704 0xaf}},
2705 });
2706}
2707
Dmitry Torokhov0bcc3cf2017-07-15 17:50:302708TEST_F(EventRewriterTest, TestRewriteFunctionKeysLayout2) {
2709 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
Dmitry Torokhov3e2b7d82020-02-13 18:04:432710 TestKeyboard(
2711 "Internal Keyboard", kKbdTopRowLayout2Tag, ui::INPUT_DEVICE_INTERNAL,
Zentaro Kavanaghc65969ef2020-05-14 00:58:432712 /*has_custom_top_row=*/false,
Dmitry Torokhov3e2b7d82020-02-13 18:04:432713 {
2714 // F1 -> Back
2715 {ui::ET_KEY_PRESSED,
2716 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1},
2717 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_NONE,
2718 ui::DomKey::BROWSER_BACK}},
2719 {ui::ET_KEY_PRESSED,
2720 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_CONTROL_DOWN, ui::DomKey::F1},
2721 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK,
2722 ui::EF_CONTROL_DOWN, ui::DomKey::BROWSER_BACK}},
2723 {ui::ET_KEY_PRESSED,
2724 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_ALT_DOWN, ui::DomKey::F1},
2725 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_ALT_DOWN,
2726 ui::DomKey::BROWSER_BACK}},
2727 // F2 -> Refresh
2728 {ui::ET_KEY_PRESSED,
2729 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2},
2730 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_NONE,
2731 ui::DomKey::BROWSER_REFRESH}},
2732 {ui::ET_KEY_PRESSED,
2733 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_CONTROL_DOWN, ui::DomKey::F2},
2734 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH,
2735 ui::EF_CONTROL_DOWN, ui::DomKey::BROWSER_REFRESH}},
2736 {ui::ET_KEY_PRESSED,
2737 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_ALT_DOWN, ui::DomKey::F2},
2738 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH,
2739 ui::EF_ALT_DOWN, ui::DomKey::BROWSER_REFRESH}},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:442740 // F3 -> Zoom (aka Fullscreen)
Dmitry Torokhov3e2b7d82020-02-13 18:04:432741 {ui::ET_KEY_PRESSED,
2742 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:442743 {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_NONE,
Dmitry Torokhov3e2b7d82020-02-13 18:04:432744 ui::DomKey::ZOOM_TOGGLE}},
2745 {ui::ET_KEY_PRESSED,
2746 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_CONTROL_DOWN, ui::DomKey::F3},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:442747 {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_CONTROL_DOWN,
2748 ui::DomKey::ZOOM_TOGGLE}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:432749 {ui::ET_KEY_PRESSED,
2750 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_ALT_DOWN, ui::DomKey::F3},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:442751 {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_ALT_DOWN,
2752 ui::DomKey::ZOOM_TOGGLE}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:432753 // F4 -> Launch App 1
2754 {ui::ET_KEY_PRESSED,
2755 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4},
2756 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::SELECT_TASK, ui::EF_NONE,
2757 ui::DomKey::LAUNCH_MY_COMPUTER}},
2758 {ui::ET_KEY_PRESSED,
2759 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_CONTROL_DOWN, ui::DomKey::F4},
2760 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::SELECT_TASK,
2761 ui::EF_CONTROL_DOWN, ui::DomKey::LAUNCH_MY_COMPUTER}},
2762 {ui::ET_KEY_PRESSED,
2763 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_ALT_DOWN, ui::DomKey::F4},
2764 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::SELECT_TASK,
2765 ui::EF_ALT_DOWN, ui::DomKey::LAUNCH_MY_COMPUTER}},
2766 // F5 -> Brightness down
2767 {ui::ET_KEY_PRESSED,
2768 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5},
2769 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN, ui::EF_NONE,
2770 ui::DomKey::BRIGHTNESS_DOWN}},
2771 {ui::ET_KEY_PRESSED,
2772 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_CONTROL_DOWN, ui::DomKey::F5},
2773 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN,
2774 ui::EF_CONTROL_DOWN, ui::DomKey::BRIGHTNESS_DOWN}},
2775 {ui::ET_KEY_PRESSED,
2776 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_ALT_DOWN, ui::DomKey::F5},
2777 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN,
2778 ui::EF_ALT_DOWN, ui::DomKey::BRIGHTNESS_DOWN}},
2779 // F6 -> Brightness up
2780 {ui::ET_KEY_PRESSED,
2781 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6},
2782 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_NONE,
2783 ui::DomKey::BRIGHTNESS_UP}},
2784 {ui::ET_KEY_PRESSED,
2785 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_CONTROL_DOWN, ui::DomKey::F6},
2786 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP,
2787 ui::EF_CONTROL_DOWN, ui::DomKey::BRIGHTNESS_UP}},
2788 {ui::ET_KEY_PRESSED,
2789 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_ALT_DOWN, ui::DomKey::F6},
2790 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_ALT_DOWN,
2791 ui::DomKey::BRIGHTNESS_UP}},
2792 // F7 -> Media Play/Pause
2793 {ui::ET_KEY_PRESSED,
2794 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7},
2795 {ui::VKEY_MEDIA_PLAY_PAUSE, ui::DomCode::MEDIA_PLAY_PAUSE,
2796 ui::EF_NONE, ui::DomKey::MEDIA_PLAY_PAUSE}},
2797 {ui::ET_KEY_PRESSED,
2798 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_CONTROL_DOWN, ui::DomKey::F7},
2799 {ui::VKEY_MEDIA_PLAY_PAUSE, ui::DomCode::MEDIA_PLAY_PAUSE,
2800 ui::EF_CONTROL_DOWN, ui::DomKey::MEDIA_PLAY_PAUSE}},
2801 {ui::ET_KEY_PRESSED,
2802 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_ALT_DOWN, ui::DomKey::F7},
2803 {ui::VKEY_MEDIA_PLAY_PAUSE, ui::DomCode::MEDIA_PLAY_PAUSE,
2804 ui::EF_ALT_DOWN, ui::DomKey::MEDIA_PLAY_PAUSE}},
2805 // F8 -> Volume Mute
2806 {ui::ET_KEY_PRESSED,
2807 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8},
2808 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_NONE,
2809 ui::DomKey::AUDIO_VOLUME_MUTE}},
2810 {ui::ET_KEY_PRESSED,
2811 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_CONTROL_DOWN, ui::DomKey::F8},
2812 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_CONTROL_DOWN,
2813 ui::DomKey::AUDIO_VOLUME_MUTE}},
2814 {ui::ET_KEY_PRESSED,
2815 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_ALT_DOWN, ui::DomKey::F8},
2816 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_ALT_DOWN,
2817 ui::DomKey::AUDIO_VOLUME_MUTE}},
2818 // F9 -> Volume Down
2819 {ui::ET_KEY_PRESSED,
2820 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9},
2821 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_NONE,
2822 ui::DomKey::AUDIO_VOLUME_DOWN}},
2823 {ui::ET_KEY_PRESSED,
2824 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_CONTROL_DOWN, ui::DomKey::F9},
2825 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_CONTROL_DOWN,
2826 ui::DomKey::AUDIO_VOLUME_DOWN}},
2827 {ui::ET_KEY_PRESSED,
2828 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_ALT_DOWN, ui::DomKey::F9},
2829 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_ALT_DOWN,
2830 ui::DomKey::AUDIO_VOLUME_DOWN}},
2831 // F10 -> Volume Up
2832 {ui::ET_KEY_PRESSED,
2833 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10},
2834 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_NONE,
2835 ui::DomKey::AUDIO_VOLUME_UP}},
2836 {ui::ET_KEY_PRESSED,
2837 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_CONTROL_DOWN,
2838 ui::DomKey::F10},
2839 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_CONTROL_DOWN,
2840 ui::DomKey::AUDIO_VOLUME_UP}},
2841 {ui::ET_KEY_PRESSED,
2842 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_ALT_DOWN, ui::DomKey::F10},
2843 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_ALT_DOWN,
2844 ui::DomKey::AUDIO_VOLUME_UP}},
2845 // F11 -> F11
2846 {ui::ET_KEY_PRESSED,
2847 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11},
2848 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}},
2849 {ui::ET_KEY_PRESSED,
2850 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_CONTROL_DOWN,
2851 ui::DomKey::F11},
2852 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_CONTROL_DOWN,
2853 ui::DomKey::F11}},
2854 {ui::ET_KEY_PRESSED,
2855 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_ALT_DOWN, ui::DomKey::F11},
2856 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_ALT_DOWN, ui::DomKey::F11}},
2857 // F12 -> F12
2858 {ui::ET_KEY_PRESSED,
2859 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12},
2860 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
2861 {ui::ET_KEY_PRESSED,
2862 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_CONTROL_DOWN,
2863 ui::DomKey::F12},
2864 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_CONTROL_DOWN,
2865 ui::DomKey::F12}},
2866 {ui::ET_KEY_PRESSED,
2867 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_ALT_DOWN, ui::DomKey::F12},
2868 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_ALT_DOWN, ui::DomKey::F12}},
2869 });
Dmitry Torokhov0bcc3cf2017-07-15 17:50:302870}
2871
Zentaro Kavanagh76b9bcb2021-05-19 06:29:452872// TODO(crbug.com/1179893): Remove once the feature is enabled permanently.
2873TEST_F(EventRewriterTest, TestRewriteFunctionKeysWilcoLayoutsDeprecated) {
2874 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
2875 scoped_feature_list_.InitAndDisableFeature(
2876 ::features::kImprovedKeyboardShortcuts);
2877 std::vector<KeyTestCase> wilco_standard_tests({
2878 // The number row should be rewritten as the F<number> row with Search
2879 // key.
2880 {ui::ET_KEY_PRESSED,
2881 {ui::VKEY_1, ui::DomCode::DIGIT1, ui::EF_COMMAND_DOWN,
2882 ui::DomKey::Constant<'1'>::Character},
2883 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1}},
2884 {ui::ET_KEY_PRESSED,
2885 {ui::VKEY_2, ui::DomCode::DIGIT2, ui::EF_COMMAND_DOWN,
2886 ui::DomKey::Constant<'2'>::Character},
2887 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2}},
2888 {ui::ET_KEY_PRESSED,
2889 {ui::VKEY_3, ui::DomCode::DIGIT3, ui::EF_COMMAND_DOWN,
2890 ui::DomKey::Constant<'3'>::Character},
2891 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3}},
2892 {ui::ET_KEY_PRESSED,
2893 {ui::VKEY_4, ui::DomCode::DIGIT4, ui::EF_COMMAND_DOWN,
2894 ui::DomKey::Constant<'4'>::Character},
2895 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4}},
2896 {ui::ET_KEY_PRESSED,
2897 {ui::VKEY_5, ui::DomCode::DIGIT5, ui::EF_COMMAND_DOWN,
2898 ui::DomKey::Constant<'5'>::Character},
2899 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5}},
2900 {ui::ET_KEY_PRESSED,
2901 {ui::VKEY_6, ui::DomCode::DIGIT6, ui::EF_COMMAND_DOWN,
2902 ui::DomKey::Constant<'6'>::Character},
2903 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6}},
2904 {ui::ET_KEY_PRESSED,
2905 {ui::VKEY_7, ui::DomCode::DIGIT7, ui::EF_COMMAND_DOWN,
2906 ui::DomKey::Constant<'7'>::Character},
2907 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7}},
2908 {ui::ET_KEY_PRESSED,
2909 {ui::VKEY_8, ui::DomCode::DIGIT8, ui::EF_COMMAND_DOWN,
2910 ui::DomKey::Constant<'8'>::Character},
2911 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8}},
2912 {ui::ET_KEY_PRESSED,
2913 {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_COMMAND_DOWN,
2914 ui::DomKey::Constant<'9'>::Character},
2915 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9}},
2916 {ui::ET_KEY_PRESSED,
2917 {ui::VKEY_0, ui::DomCode::DIGIT0, ui::EF_COMMAND_DOWN,
2918 ui::DomKey::Constant<'0'>::Character},
2919 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10}},
2920 {ui::ET_KEY_PRESSED,
2921 {ui::VKEY_OEM_MINUS, ui::DomCode::MINUS, ui::EF_COMMAND_DOWN,
2922 ui::DomKey::Constant<'-'>::Character},
2923 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}},
2924 {ui::ET_KEY_PRESSED,
2925 {ui::VKEY_OEM_PLUS, ui::DomCode::EQUAL, ui::EF_COMMAND_DOWN,
2926 ui::DomKey::Constant<'='>::Character},
2927 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
2928 });
2929}
2930
Mike Wiitala6ed99532020-01-22 22:51:032931TEST_F(EventRewriterTest, TestRewriteFunctionKeysWilcoLayouts) {
Georges Winkenbachfe909bb2019-04-17 23:58:042932 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
Georges Winkenbachfe909bb2019-04-17 23:58:042933
Mike Wiitalaa69048c2020-02-21 18:39:352934 std::vector<KeyTestCase> wilco_standard_tests({
Georges Winkenbachfe909bb2019-04-17 23:58:042935 // F1 -> F1, Search + F1 -> Back
2936 {ui::ET_KEY_PRESSED,
2937 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1},
2938 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1}},
2939 {ui::ET_KEY_PRESSED,
2940 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_COMMAND_DOWN, ui::DomKey::F1},
2941 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_NONE,
2942 ui::DomKey::BROWSER_BACK}},
2943 {ui::ET_KEY_PRESSED,
2944 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_CONTROL_DOWN, ui::DomKey::F1},
2945 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_CONTROL_DOWN, ui::DomKey::F1}},
2946 {ui::ET_KEY_PRESSED,
2947 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_ALT_DOWN, ui::DomKey::F1},
2948 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_ALT_DOWN, ui::DomKey::F1}},
2949 // F2 -> F2, Search + F2 -> Refresh
2950 {ui::ET_KEY_PRESSED,
2951 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2},
2952 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2}},
2953 {ui::ET_KEY_PRESSED,
2954 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_COMMAND_DOWN, ui::DomKey::F2},
2955 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_NONE,
2956 ui::DomKey::BROWSER_REFRESH}},
2957 {ui::ET_KEY_PRESSED,
2958 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_CONTROL_DOWN, ui::DomKey::F2},
2959 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_CONTROL_DOWN, ui::DomKey::F2}},
2960 {ui::ET_KEY_PRESSED,
2961 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_ALT_DOWN, ui::DomKey::F2},
2962 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_ALT_DOWN, ui::DomKey::F2}},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:442963 // F3 -> F3, Search + F3 -> Zoom (aka Fullscreen)
Georges Winkenbachfe909bb2019-04-17 23:58:042964 {ui::ET_KEY_PRESSED,
2965 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3},
2966 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3}},
2967 {ui::ET_KEY_PRESSED,
2968 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_COMMAND_DOWN, ui::DomKey::F3},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:442969 {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_NONE,
Georges Winkenbachfe909bb2019-04-17 23:58:042970 ui::DomKey::ZOOM_TOGGLE}},
2971 {ui::ET_KEY_PRESSED,
2972 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_CONTROL_DOWN, ui::DomKey::F3},
2973 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_CONTROL_DOWN, ui::DomKey::F3}},
2974 {ui::ET_KEY_PRESSED,
2975 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_ALT_DOWN, ui::DomKey::F3},
2976 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_ALT_DOWN, ui::DomKey::F3}},
2977 // F4 -> F4, Search + F4 -> Launch App 1
2978 {ui::ET_KEY_PRESSED,
2979 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4},
2980 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4}},
2981 {ui::ET_KEY_PRESSED,
2982 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_COMMAND_DOWN, ui::DomKey::F4},
2983 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::F4, ui::EF_NONE,
2984 ui::DomKey::F4}},
2985 {ui::ET_KEY_PRESSED,
2986 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_CONTROL_DOWN, ui::DomKey::F4},
2987 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_CONTROL_DOWN, ui::DomKey::F4}},
2988 {ui::ET_KEY_PRESSED,
2989 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_ALT_DOWN, ui::DomKey::F4},
2990 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_ALT_DOWN, ui::DomKey::F4}},
2991 // F5 -> F5, Search + F5 -> Brightness down
2992 {ui::ET_KEY_PRESSED,
2993 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5},
2994 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5}},
2995 {ui::ET_KEY_PRESSED,
2996 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_COMMAND_DOWN, ui::DomKey::F5},
2997 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN, ui::EF_NONE,
2998 ui::DomKey::BRIGHTNESS_DOWN}},
2999 {ui::ET_KEY_PRESSED,
3000 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_CONTROL_DOWN, ui::DomKey::F5},
3001 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_CONTROL_DOWN, ui::DomKey::F5}},
3002 {ui::ET_KEY_PRESSED,
3003 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_ALT_DOWN, ui::DomKey::F5},
3004 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_ALT_DOWN, ui::DomKey::F5}},
3005 // F6 -> F6, Search + F6 -> Brightness up
3006 {ui::ET_KEY_PRESSED,
3007 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6},
3008 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6}},
3009 {ui::ET_KEY_PRESSED,
3010 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_COMMAND_DOWN, ui::DomKey::F6},
3011 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_NONE,
3012 ui::DomKey::BRIGHTNESS_UP}},
3013 {ui::ET_KEY_PRESSED,
3014 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_CONTROL_DOWN, ui::DomKey::F6},
3015 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_CONTROL_DOWN, ui::DomKey::F6}},
3016 {ui::ET_KEY_PRESSED,
3017 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_ALT_DOWN, ui::DomKey::F6},
3018 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_ALT_DOWN, ui::DomKey::F6}},
3019 // F7 -> F7, Search + F7 -> Volume mute
3020 {ui::ET_KEY_PRESSED,
3021 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7},
3022 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7}},
3023 {ui::ET_KEY_PRESSED,
3024 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_COMMAND_DOWN, ui::DomKey::F7},
3025 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_NONE,
3026 ui::DomKey::AUDIO_VOLUME_MUTE}},
3027 {ui::ET_KEY_PRESSED,
3028 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_CONTROL_DOWN, ui::DomKey::F7},
3029 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_CONTROL_DOWN, ui::DomKey::F7}},
3030 {ui::ET_KEY_PRESSED,
3031 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_ALT_DOWN, ui::DomKey::F7},
3032 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_ALT_DOWN, ui::DomKey::F7}},
3033 // F8 -> F8, Search + F8 -> Volume Down
3034 {ui::ET_KEY_PRESSED,
3035 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8},
3036 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8}},
3037 {ui::ET_KEY_PRESSED,
3038 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_COMMAND_DOWN, ui::DomKey::F8},
3039 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_NONE,
3040 ui::DomKey::AUDIO_VOLUME_DOWN}},
3041 {ui::ET_KEY_PRESSED,
3042 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_CONTROL_DOWN, ui::DomKey::F8},
3043 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_CONTROL_DOWN, ui::DomKey::F8}},
3044 {ui::ET_KEY_PRESSED,
3045 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_ALT_DOWN, ui::DomKey::F8},
3046 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_ALT_DOWN, ui::DomKey::F8}},
3047 // F9 -> F9, Search + F9 -> Volume Up
3048 {ui::ET_KEY_PRESSED,
3049 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9},
3050 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9}},
3051 {ui::ET_KEY_PRESSED,
3052 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_COMMAND_DOWN, ui::DomKey::F9},
3053 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_NONE,
3054 ui::DomKey::AUDIO_VOLUME_UP}},
3055 {ui::ET_KEY_PRESSED,
3056 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_CONTROL_DOWN, ui::DomKey::F9},
3057 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_CONTROL_DOWN, ui::DomKey::F9}},
3058 {ui::ET_KEY_PRESSED,
3059 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_ALT_DOWN, ui::DomKey::F9},
3060 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_ALT_DOWN, ui::DomKey::F9}},
3061 // F10 -> F10, Search + F10 -> F10
3062 {ui::ET_KEY_PRESSED,
3063 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10},
3064 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10}},
3065 {ui::ET_KEY_PRESSED,
3066 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_COMMAND_DOWN, ui::DomKey::F10},
3067 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10}},
3068 {ui::ET_KEY_PRESSED,
3069 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_CONTROL_DOWN, ui::DomKey::F10},
3070 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_CONTROL_DOWN, ui::DomKey::F10}},
3071 {ui::ET_KEY_PRESSED,
3072 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_ALT_DOWN, ui::DomKey::F10},
3073 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_ALT_DOWN, ui::DomKey::F10}},
3074 // F11 -> F11, Search + F11 -> F11
3075 {ui::ET_KEY_PRESSED,
3076 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11},
3077 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}},
3078 {ui::ET_KEY_PRESSED,
3079 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_COMMAND_DOWN, ui::DomKey::F11},
3080 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}},
3081 {ui::ET_KEY_PRESSED,
3082 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_CONTROL_DOWN, ui::DomKey::F11},
3083 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_CONTROL_DOWN, ui::DomKey::F11}},
3084 {ui::ET_KEY_PRESSED,
3085 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_ALT_DOWN, ui::DomKey::F11},
3086 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_ALT_DOWN, ui::DomKey::F11}},
Mike Wiitalaa69048c2020-02-21 18:39:353087 // F12 -> F12
3088 // Search + F12 differs between Wilco devices so it is tested separately.
3089 {ui::ET_KEY_PRESSED,
3090 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12},
3091 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
3092 {ui::ET_KEY_PRESSED,
3093 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12},
3094 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12}},
3095 {ui::ET_KEY_PRESSED,
3096 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_ALT_DOWN, ui::DomKey::F12},
3097 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_ALT_DOWN, ui::DomKey::F12}},
Georges Winkenbachfe909bb2019-04-17 23:58:043098 // The number row should not be rewritten without Search key.
3099 {ui::ET_KEY_PRESSED,
3100 {ui::VKEY_1, ui::DomCode::DIGIT1, ui::EF_NONE,
3101 ui::DomKey::Constant<'1'>::Character},
3102 {ui::VKEY_1, ui::DomCode::DIGIT1, ui::EF_NONE,
3103 ui::DomKey::Constant<'1'>::Character}},
3104 {ui::ET_KEY_PRESSED,
3105 {ui::VKEY_2, ui::DomCode::DIGIT2, ui::EF_NONE,
3106 ui::DomKey::Constant<'2'>::Character},
3107 {ui::VKEY_2, ui::DomCode::DIGIT2, ui::EF_NONE,
3108 ui::DomKey::Constant<'2'>::Character}},
3109 {ui::ET_KEY_PRESSED,
3110 {ui::VKEY_3, ui::DomCode::DIGIT3, ui::EF_NONE,
3111 ui::DomKey::Constant<'3'>::Character},
3112 {ui::VKEY_3, ui::DomCode::DIGIT3, ui::EF_NONE,
3113 ui::DomKey::Constant<'3'>::Character}},
3114 {ui::ET_KEY_PRESSED,
3115 {ui::VKEY_4, ui::DomCode::DIGIT4, ui::EF_NONE,
3116 ui::DomKey::Constant<'4'>::Character},
3117 {ui::VKEY_4, ui::DomCode::DIGIT4, ui::EF_NONE,
3118 ui::DomKey::Constant<'4'>::Character}},
3119 {ui::ET_KEY_PRESSED,
3120 {ui::VKEY_5, ui::DomCode::DIGIT5, ui::EF_NONE,
3121 ui::DomKey::Constant<'5'>::Character},
3122 {ui::VKEY_5, ui::DomCode::DIGIT5, ui::EF_NONE,
3123 ui::DomKey::Constant<'5'>::Character}},
3124 {ui::ET_KEY_PRESSED,
3125 {ui::VKEY_6, ui::DomCode::DIGIT6, ui::EF_NONE,
3126 ui::DomKey::Constant<'6'>::Character},
3127 {ui::VKEY_6, ui::DomCode::DIGIT6, ui::EF_NONE,
3128 ui::DomKey::Constant<'6'>::Character}},
3129 {ui::ET_KEY_PRESSED,
3130 {ui::VKEY_7, ui::DomCode::DIGIT7, ui::EF_NONE,
3131 ui::DomKey::Constant<'7'>::Character},
3132 {ui::VKEY_7, ui::DomCode::DIGIT7, ui::EF_NONE,
3133 ui::DomKey::Constant<'7'>::Character}},
3134 {ui::ET_KEY_PRESSED,
3135 {ui::VKEY_8, ui::DomCode::DIGIT8, ui::EF_NONE,
3136 ui::DomKey::Constant<'8'>::Character},
3137 {ui::VKEY_8, ui::DomCode::DIGIT8, ui::EF_NONE,
3138 ui::DomKey::Constant<'8'>::Character}},
3139 {ui::ET_KEY_PRESSED,
3140 {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_NONE,
3141 ui::DomKey::Constant<'9'>::Character},
3142 {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_NONE,
3143 ui::DomKey::Constant<'9'>::Character}},
3144 {ui::ET_KEY_PRESSED,
3145 {ui::VKEY_0, ui::DomCode::DIGIT0, ui::EF_NONE,
3146 ui::DomKey::Constant<'0'>::Character},
3147 {ui::VKEY_0, ui::DomCode::DIGIT0, ui::EF_NONE,
3148 ui::DomKey::Constant<'0'>::Character}},
3149 {ui::ET_KEY_PRESSED,
3150 {ui::VKEY_OEM_MINUS, ui::DomCode::MINUS, ui::EF_NONE,
3151 ui::DomKey::Constant<'-'>::Character},
3152 {ui::VKEY_OEM_MINUS, ui::DomCode::MINUS, ui::EF_NONE,
3153 ui::DomKey::Constant<'-'>::Character}},
3154 {ui::ET_KEY_PRESSED,
3155 {ui::VKEY_OEM_PLUS, ui::DomCode::EQUAL, ui::EF_NONE,
3156 ui::DomKey::Constant<'='>::Character},
3157 {ui::VKEY_OEM_PLUS, ui::DomCode::EQUAL, ui::EF_NONE,
3158 ui::DomKey::Constant<'='>::Character}},
Mike Wiitalaa69048c2020-02-21 18:39:353159 });
3160
3161 KeyTestCase wilco_1_test =
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443162 // Search + F12 -> Ctrl + Zoom (aka Fullscreen) (Display toggle)
Mike Wiitala6ed99532020-01-22 22:51:033163 {ui::ET_KEY_PRESSED,
3164 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_COMMAND_DOWN, ui::DomKey::F12},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443165 {ui::VKEY_ZOOM, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12}};
Georges Winkenbachfe909bb2019-04-17 23:58:043166
Mike Wiitalaa69048c2020-02-21 18:39:353167 KeyTestCase drallion_test_no_privacy_screen =
3168 // Search + F12 -> F12 (Privacy screen not supported)
Mike Wiitala6ed99532020-01-22 22:51:033169 {ui::ET_KEY_PRESSED,
Mike Wiitalaa69048c2020-02-21 18:39:353170 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_COMMAND_DOWN, ui::DomKey::F12},
3171 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}};
3172
3173 KeyTestCase drallion_test_privacy_screen =
3174 // F12 -> F12, Search + F12 -> Privacy Screen Toggle
Mike Wiitala6ed99532020-01-22 22:51:033175 {ui::ET_KEY_PRESSED,
3176 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_COMMAND_DOWN, ui::DomKey::F12},
3177 {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
Mike Wiitalaa69048c2020-02-21 18:39:353178 ui::EF_NONE, ui::DomKey::F12}};
Mike Wiitala6ed99532020-01-22 22:51:033179
Mike Wiitalaa69048c2020-02-21 18:39:353180 // Set keyboard layout to Wilco 1.0
Zentaro Kavanagh1e7d867c2020-05-13 01:18:443181 SetupKeyboard("Wilco Keyboard", kKbdTopRowLayoutWilcoTag);
Mike Wiitala6ed99532020-01-22 22:51:033182 // Standard key tests using Wilco 1.0 keyboard
Mike Wiitalaa69048c2020-02-21 18:39:353183 for (const auto& test : wilco_standard_tests)
Yuichiro Hanada87c6e552020-02-07 01:07:373184 CheckKeyTestCase(rewriter(), test);
Mike Wiitalaa69048c2020-02-21 18:39:353185 CheckKeyTestCase(rewriter(), wilco_1_test);
Georges Winkenbachfe909bb2019-04-17 23:58:043186
Mike Wiitalaa69048c2020-02-21 18:39:353187 // Set keyboard layout to Drallion (Wilco 1.5)
Zentaro Kavanagh1e7d867c2020-05-13 01:18:443188 SetupKeyboard("Drallion Keyboard", kKbdTopRowLayoutDrallionTag);
Mike Wiitalaa69048c2020-02-21 18:39:353189
3190 // Run key tests using Drallion keyboard layout (no privacy screen)
3191 rewriter_->set_privacy_screen_for_testing(false);
3192 for (const auto& test : wilco_standard_tests)
Yuichiro Hanada87c6e552020-02-07 01:07:373193 CheckKeyTestCase(rewriter(), test);
Mike Wiitalaa69048c2020-02-21 18:39:353194 CheckKeyTestCase(rewriter(), drallion_test_no_privacy_screen);
3195
3196 // Run key tests using Drallion keyboard layout (privacy screen supported)
3197 rewriter_->set_privacy_screen_for_testing(true);
3198 for (const auto& test : wilco_standard_tests)
Yuichiro Hanada87c6e552020-02-07 01:07:373199 CheckKeyTestCase(rewriter(), test);
Mike Wiitalaa69048c2020-02-21 18:39:353200 CheckKeyTestCase(rewriter(), drallion_test_privacy_screen);
Mike Wiitala6ed99532020-01-22 22:51:033201}
3202
3203TEST_F(EventRewriterTest, TestRewriteActionKeysWilcoLayouts) {
3204 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
3205
Mike Wiitalaa69048c2020-02-21 18:39:353206 KeyTestCase wilco_standard_tests[] = {
Georges Winkenbachfe909bb2019-04-17 23:58:043207 // Back -> Back, Search + Back -> F1
3208 {ui::ET_KEY_PRESSED,
3209 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_NONE,
3210 ui::DomKey::BROWSER_BACK},
3211 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_NONE,
3212 ui::DomKey::BROWSER_BACK}},
3213 {ui::ET_KEY_PRESSED,
3214 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_COMMAND_DOWN,
3215 ui::DomKey::BROWSER_BACK},
3216 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1}},
3217 // Refresh -> Refresh, Search + Refresh -> F2
3218 {ui::ET_KEY_PRESSED,
3219 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_NONE,
3220 ui::DomKey::BROWSER_REFRESH},
3221 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_NONE,
3222 ui::DomKey::BROWSER_REFRESH}},
3223 {ui::ET_KEY_PRESSED,
3224 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH,
3225 ui::EF_COMMAND_DOWN, ui::DomKey::BROWSER_REFRESH},
3226 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2}},
3227 // Full Screen -> Full Screen, Search + Full Screen -> F3
3228 {ui::ET_KEY_PRESSED,
Georges Winkenbach0f454cf2019-05-28 17:16:373229 {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_NONE,
Georges Winkenbachfe909bb2019-04-17 23:58:043230 ui::DomKey::ZOOM_TOGGLE},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443231 {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_NONE,
Georges Winkenbachfe909bb2019-04-17 23:58:043232 ui::DomKey::ZOOM_TOGGLE}},
3233 {ui::ET_KEY_PRESSED,
Georges Winkenbach0f454cf2019-05-28 17:16:373234 {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_COMMAND_DOWN,
3235 ui::DomKey::ZOOM_TOGGLE},
Georges Winkenbachfe909bb2019-04-17 23:58:043236 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3}},
3237 // Launch App 1 -> Launch App 1, Search + Launch App 1 -> F4
3238 {ui::ET_KEY_PRESSED,
3239 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::F4, ui::EF_NONE,
3240 ui::DomKey::F4},
3241 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::F4, ui::EF_NONE,
3242 ui::DomKey::F4}},
3243 {ui::ET_KEY_PRESSED,
3244 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::F4, ui::EF_COMMAND_DOWN,
3245 ui::DomKey::F4},
3246 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4}},
3247 // Brightness down -> Brightness Down, Search Brightness Down -> F5
3248 {ui::ET_KEY_PRESSED,
3249 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN, ui::EF_NONE,
3250 ui::DomKey::BRIGHTNESS_DOWN},
3251 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN, ui::EF_NONE,
3252 ui::DomKey::BRIGHTNESS_DOWN}},
3253 {ui::ET_KEY_PRESSED,
3254 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN,
3255 ui::EF_COMMAND_DOWN, ui::DomKey::BRIGHTNESS_DOWN},
3256 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5}},
3257 // Brightness up -> Brightness Up, Search + Brightness Up -> F6
3258 {ui::ET_KEY_PRESSED,
3259 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_NONE,
3260 ui::DomKey::BRIGHTNESS_UP},
3261 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_NONE,
3262 ui::DomKey::BRIGHTNESS_UP}},
3263 {ui::ET_KEY_PRESSED,
3264 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_COMMAND_DOWN,
3265 ui::DomKey::BRIGHTNESS_UP},
3266 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6}},
3267 // Volume mute -> Volume Mute, Search + Volume Mute -> F7
3268 {ui::ET_KEY_PRESSED,
3269 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_NONE,
3270 ui::DomKey::AUDIO_VOLUME_MUTE},
3271 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_NONE,
3272 ui::DomKey::AUDIO_VOLUME_MUTE}},
3273 {ui::ET_KEY_PRESSED,
3274 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_COMMAND_DOWN,
3275 ui::DomKey::AUDIO_VOLUME_MUTE},
3276 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7}},
3277 // Volume Down -> Volume Down, Search + Volume Down -> F8
3278 {ui::ET_KEY_PRESSED,
3279 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_NONE,
3280 ui::DomKey::AUDIO_VOLUME_DOWN},
3281 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_NONE,
3282 ui::DomKey::AUDIO_VOLUME_DOWN}},
3283 {ui::ET_KEY_PRESSED,
3284 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_COMMAND_DOWN,
3285 ui::DomKey::AUDIO_VOLUME_DOWN},
3286 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8}},
3287 // Volume Up -> Volume Up, Search + Volume Up -> F9
3288 {ui::ET_KEY_PRESSED,
3289 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_NONE,
3290 ui::DomKey::AUDIO_VOLUME_UP},
3291 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_NONE,
3292 ui::DomKey::AUDIO_VOLUME_UP}},
3293 {ui::ET_KEY_PRESSED,
3294 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_COMMAND_DOWN,
3295 ui::DomKey::AUDIO_VOLUME_UP},
3296 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9}},
3297 // F10 -> F10
3298 {ui::ET_KEY_PRESSED,
3299 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10},
3300 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10}},
3301 {ui::ET_KEY_PRESSED,
3302 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_COMMAND_DOWN, ui::DomKey::F10},
3303 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10}},
3304 // F11 -> F11
3305 {ui::ET_KEY_PRESSED,
3306 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_COMMAND_DOWN, ui::DomKey::F11},
3307 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}},
3308 {ui::ET_KEY_PRESSED,
3309 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11},
Mike Wiitala6ed99532020-01-22 22:51:033310 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}}};
3311
Mike Wiitalaa69048c2020-02-21 18:39:353312 KeyTestCase wilco_1_tests[] = {
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443313 // Ctrl + Zoom (Display toggle) -> Unchanged
3314 // Search + Ctrl + Zoom (Display toggle) -> F12
Georges Winkenbachfe909bb2019-04-17 23:58:043315 {ui::ET_KEY_PRESSED,
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443316 {ui::VKEY_ZOOM, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12},
3317 {ui::VKEY_ZOOM, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12}},
Georges Winkenbachfe909bb2019-04-17 23:58:043318 {ui::ET_KEY_PRESSED,
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443319 {ui::VKEY_ZOOM, ui::DomCode::F12,
Georges Winkenbachfe909bb2019-04-17 23:58:043320 ui::EF_COMMAND_DOWN + ui::EF_CONTROL_DOWN, ui::DomKey::F12},
3321 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}}};
3322
Mike Wiitalaa69048c2020-02-21 18:39:353323 KeyTestCase drallion_tests_no_privacy_screen[] = {
3324 // Privacy Screen Toggle -> F12 (Privacy Screen not supported),
3325 // Search + Privacy Screen Toggle -> F12
3326 {ui::ET_KEY_PRESSED,
3327 {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
3328 ui::EF_NONE, ui::DomKey::UNIDENTIFIED},
3329 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
3330 {ui::ET_KEY_PRESSED,
3331 {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
3332 ui::EF_COMMAND_DOWN, ui::DomKey::UNIDENTIFIED},
3333 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443334 // Ctrl + Zoom (Display toggle) -> Unchanged
3335 // Search + Ctrl + Zoom (Display toggle) -> Unchanged
Mike Wiitalaa69048c2020-02-21 18:39:353336 {ui::ET_KEY_PRESSED,
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443337 {ui::VKEY_ZOOM, ui::DomCode::NONE, ui::EF_CONTROL_DOWN,
Mike Wiitalaa69048c2020-02-21 18:39:353338 ui::DomKey::UNIDENTIFIED},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443339 {ui::VKEY_ZOOM, ui::DomCode::NONE, ui::EF_CONTROL_DOWN,
Mike Wiitalaa69048c2020-02-21 18:39:353340 ui::DomKey::UNIDENTIFIED}},
3341 {ui::ET_KEY_PRESSED,
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443342 {ui::VKEY_ZOOM, ui::DomCode::NONE,
Mike Wiitalaa69048c2020-02-21 18:39:353343 ui::EF_COMMAND_DOWN + ui::EF_CONTROL_DOWN, ui::DomKey::UNIDENTIFIED},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443344 {ui::VKEY_ZOOM, ui::DomCode::NONE, ui::EF_CONTROL_DOWN,
Mike Wiitalaa69048c2020-02-21 18:39:353345 ui::DomKey::UNIDENTIFIED}}};
3346
3347 KeyTestCase drallion_tests_privacy_screen[] = {
Mike Wiitala6ed99532020-01-22 22:51:033348 // Privacy Screen Toggle -> Privacy Screen Toggle,
3349 // Search + Privacy Screen Toggle -> F12
3350 {ui::ET_KEY_PRESSED,
3351 {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
3352 ui::EF_NONE, ui::DomKey::UNIDENTIFIED},
3353 {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
3354 ui::EF_NONE, ui::DomKey::UNIDENTIFIED}},
3355 {ui::ET_KEY_PRESSED,
3356 {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
3357 ui::EF_COMMAND_DOWN, ui::DomKey::UNIDENTIFIED},
3358 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443359 // Ctrl + Zoom (Display toggle) -> Unchanged
3360 // Search + Ctrl + Zoom (Display toggle) -> Unchanged
Mike Wiitala6ed99532020-01-22 22:51:033361 {ui::ET_KEY_PRESSED,
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443362 {ui::VKEY_ZOOM, ui::DomCode::NONE, ui::EF_CONTROL_DOWN,
Mike Wiitala6ed99532020-01-22 22:51:033363 ui::DomKey::UNIDENTIFIED},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443364 {ui::VKEY_ZOOM, ui::DomCode::NONE, ui::EF_CONTROL_DOWN,
Mike Wiitala6ed99532020-01-22 22:51:033365 ui::DomKey::UNIDENTIFIED}},
3366 {ui::ET_KEY_PRESSED,
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443367 {ui::VKEY_ZOOM, ui::DomCode::NONE,
Mike Wiitala6ed99532020-01-22 22:51:033368 ui::EF_COMMAND_DOWN + ui::EF_CONTROL_DOWN, ui::DomKey::UNIDENTIFIED},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443369 {ui::VKEY_ZOOM, ui::DomCode::NONE, ui::EF_CONTROL_DOWN,
Mike Wiitala6ed99532020-01-22 22:51:033370 ui::DomKey::UNIDENTIFIED}}};
Georges Winkenbachfe909bb2019-04-17 23:58:043371
Mike Wiitalaa69048c2020-02-21 18:39:353372 // Set keyboard layout to Wilco 1.0
Zentaro Kavanagh1e7d867c2020-05-13 01:18:443373 SetupKeyboard("Wilco Keyboard", kKbdTopRowLayoutWilcoTag);
Mike Wiitala6ed99532020-01-22 22:51:033374 // Standard key tests using Wilco 1.0 keyboard
Mike Wiitalaa69048c2020-02-21 18:39:353375 for (const auto& test : wilco_standard_tests)
Yuichiro Hanada87c6e552020-02-07 01:07:373376 CheckKeyTestCase(rewriter(), test);
Mike Wiitala6ed99532020-01-22 22:51:033377 // Wilco 1.0 specific key tests
Mike Wiitalaa69048c2020-02-21 18:39:353378 for (const auto& test : wilco_1_tests)
Yuichiro Hanada87c6e552020-02-07 01:07:373379 CheckKeyTestCase(rewriter(), test);
Mike Wiitala6ed99532020-01-22 22:51:033380
Mike Wiitalaa69048c2020-02-21 18:39:353381 // Set keyboard layout to Drallion (Wilco 1.5)
Zentaro Kavanagh1e7d867c2020-05-13 01:18:443382 SetupKeyboard("Drallion Keyboard", kKbdTopRowLayoutDrallionTag);
Mike Wiitalaa69048c2020-02-21 18:39:353383
Mike Wiitala6ed99532020-01-22 22:51:033384 // Standard key tests using Drallion keyboard layout
Mike Wiitalaa69048c2020-02-21 18:39:353385 for (const auto& test : wilco_standard_tests)
Yuichiro Hanada87c6e552020-02-07 01:07:373386 CheckKeyTestCase(rewriter(), test);
Mike Wiitalaa69048c2020-02-21 18:39:353387
3388 // Drallion specific key tests (no privacy screen)
3389 rewriter_->set_privacy_screen_for_testing(false);
3390 for (const auto& test : drallion_tests_no_privacy_screen)
3391 CheckKeyTestCase(rewriter(), test);
3392
3393 // Drallion specific key tests (privacy screen supported)
3394 rewriter_->set_privacy_screen_for_testing(true);
3395 for (const auto& test : drallion_tests_privacy_screen)
Yuichiro Hanada87c6e552020-02-07 01:07:373396 CheckKeyTestCase(rewriter(), test);
Mike Wiitala6ed99532020-01-22 22:51:033397}
3398
3399TEST_F(EventRewriterTest, TestTopRowAsFnKeysForKeyboardWilcoLayouts) {
3400 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
Georges Winkenbach0f454cf2019-05-28 17:16:373401
3402 // Enable preference treat-top-row-as-function-keys.
3403 // That causes action keys to be mapped back to Fn keys, unless the search
3404 // key is pressed.
3405 BooleanPrefMember top_row_as_fn_key;
3406 top_row_as_fn_key.Init(prefs::kLanguageSendFunctionKeys, prefs());
3407 top_row_as_fn_key.SetValue(true);
3408
Mike Wiitalaa69048c2020-02-21 18:39:353409 KeyTestCase wilco_standard_tests[] = {
Georges Winkenbach0f454cf2019-05-28 17:16:373410 // Back -> F1, Search + Back -> Back
3411 {ui::ET_KEY_PRESSED,
3412 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_NONE,
3413 ui::DomKey::BROWSER_BACK},
3414 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1}},
3415 {ui::ET_KEY_PRESSED,
3416 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_COMMAND_DOWN,
3417 ui::DomKey::BROWSER_BACK},
3418 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_NONE,
3419 ui::DomKey::BROWSER_BACK}},
3420 // Refresh -> F2, Search + Refresh -> Refresh
3421 {ui::ET_KEY_PRESSED,
3422 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_NONE,
3423 ui::DomKey::BROWSER_REFRESH},
3424 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2}},
3425 {ui::ET_KEY_PRESSED,
3426 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH,
3427 ui::EF_COMMAND_DOWN, ui::DomKey::BROWSER_REFRESH},
3428 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_NONE,
3429 ui::DomKey::BROWSER_REFRESH}},
3430 // Full Screen -> F3, Search + Full Screen -> Full Screen
3431 {ui::ET_KEY_PRESSED,
3432 {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_NONE,
3433 ui::DomKey::ZOOM_TOGGLE},
3434 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3}},
3435 {ui::ET_KEY_PRESSED,
3436 {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_COMMAND_DOWN,
3437 ui::DomKey::ZOOM_TOGGLE},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443438 {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_NONE,
Georges Winkenbach0f454cf2019-05-28 17:16:373439 ui::DomKey::ZOOM_TOGGLE}},
3440 // Launch App 1 -> F4, Search + Launch App 1 -> Launch App 1
3441 {ui::ET_KEY_PRESSED,
3442 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::F4, ui::EF_NONE,
3443 ui::DomKey::F4},
3444 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4}},
3445 {ui::ET_KEY_PRESSED,
3446 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::F4, ui::EF_COMMAND_DOWN,
3447 ui::DomKey::F4},
3448 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::F4, ui::EF_NONE,
3449 ui::DomKey::F4}},
3450 // Brightness down -> F5, Search Brightness Down -> Brightness Down
3451 {ui::ET_KEY_PRESSED,
3452 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN, ui::EF_NONE,
3453 ui::DomKey::BRIGHTNESS_DOWN},
3454 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5}},
3455 {ui::ET_KEY_PRESSED,
3456 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN,
3457 ui::EF_COMMAND_DOWN, ui::DomKey::BRIGHTNESS_DOWN},
3458 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN, ui::EF_NONE,
3459 ui::DomKey::BRIGHTNESS_DOWN}},
3460 // Brightness up -> F6, Search + Brightness Up -> Brightness Up
3461 {ui::ET_KEY_PRESSED,
3462 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_NONE,
3463 ui::DomKey::BRIGHTNESS_UP},
3464 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6}},
3465 {ui::ET_KEY_PRESSED,
3466 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_COMMAND_DOWN,
3467 ui::DomKey::BRIGHTNESS_UP},
3468 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_NONE,
3469 ui::DomKey::BRIGHTNESS_UP}},
3470 // Volume mute -> F7, Search + Volume Mute -> Volume Mute
3471 {ui::ET_KEY_PRESSED,
3472 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_NONE,
3473 ui::DomKey::AUDIO_VOLUME_MUTE},
3474 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7}},
3475 {ui::ET_KEY_PRESSED,
3476 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_COMMAND_DOWN,
3477 ui::DomKey::AUDIO_VOLUME_MUTE},
3478 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_NONE,
3479 ui::DomKey::AUDIO_VOLUME_MUTE}},
3480 // Volume Down -> F8, Search + Volume Down -> Volume Down
3481 {ui::ET_KEY_PRESSED,
3482 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_NONE,
3483 ui::DomKey::AUDIO_VOLUME_DOWN},
3484 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8}},
3485 {ui::ET_KEY_PRESSED,
3486 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_COMMAND_DOWN,
3487 ui::DomKey::AUDIO_VOLUME_DOWN},
3488 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_NONE,
3489 ui::DomKey::AUDIO_VOLUME_DOWN}},
3490 // Volume Up -> F9, Search + Volume Up -> Volume Up
3491 {ui::ET_KEY_PRESSED,
3492 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_NONE,
3493 ui::DomKey::AUDIO_VOLUME_UP},
3494 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9}},
3495 {ui::ET_KEY_PRESSED,
3496 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_COMMAND_DOWN,
3497 ui::DomKey::AUDIO_VOLUME_UP},
3498 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_NONE,
3499 ui::DomKey::AUDIO_VOLUME_UP}},
3500 // F10 -> F10
3501 {ui::ET_KEY_PRESSED,
3502 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10},
3503 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10}},
3504 {ui::ET_KEY_PRESSED,
3505 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_COMMAND_DOWN, ui::DomKey::F10},
3506 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10}},
3507 // F11 -> F11
3508 {ui::ET_KEY_PRESSED,
3509 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_COMMAND_DOWN, ui::DomKey::F11},
3510 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}},
3511 {ui::ET_KEY_PRESSED,
3512 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11},
Mike Wiitala6ed99532020-01-22 22:51:033513 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}}};
3514
Mike Wiitalaa69048c2020-02-21 18:39:353515 KeyTestCase wilco_1_tests[] = {
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443516 // Ctrl + Zoom (Display toggle) -> F12
3517 // Search + Ctrl + Zoom (Display toggle) -> Unchanged
Georges Winkenbach0f454cf2019-05-28 17:16:373518 {ui::ET_KEY_PRESSED,
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443519 {ui::VKEY_ZOOM, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12},
Georges Winkenbach0f454cf2019-05-28 17:16:373520 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
3521 {ui::ET_KEY_PRESSED,
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443522 {ui::VKEY_ZOOM, ui::DomCode::F12,
Georges Winkenbach0f454cf2019-05-28 17:16:373523 ui::EF_COMMAND_DOWN + ui::EF_CONTROL_DOWN, ui::DomKey::F12},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443524 {ui::VKEY_ZOOM, ui::DomCode::F12, ui::EF_CONTROL_DOWN,
Georges Winkenbach0f454cf2019-05-28 17:16:373525 ui::DomKey::F12}}};
3526
Mike Wiitalaa69048c2020-02-21 18:39:353527 KeyTestCase drallion_tests_no_privacy_screen[] = {
Mike Wiitala6ed99532020-01-22 22:51:033528 // Privacy Screen Toggle -> F12,
Mike Wiitalaa69048c2020-02-21 18:39:353529 // Search + Privacy Screen Toggle -> F12 (Privacy screen not supported)
Mike Wiitala6ed99532020-01-22 22:51:033530 {ui::ET_KEY_PRESSED,
3531 {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
3532 ui::EF_NONE, ui::DomKey::UNIDENTIFIED},
3533 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
3534 {ui::ET_KEY_PRESSED,
3535 {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
3536 ui::EF_COMMAND_DOWN, ui::DomKey::UNIDENTIFIED},
Mike Wiitalaa69048c2020-02-21 18:39:353537 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443538 // Ctrl + Zoom (Display toggle) -> Unchanged
3539 // Search + Ctrl + Zoom (Display toggle) -> Unchanged
Mike Wiitala6ed99532020-01-22 22:51:033540 {ui::ET_KEY_PRESSED,
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443541 {ui::VKEY_ZOOM, ui::DomCode::NONE, ui::EF_CONTROL_DOWN,
Mike Wiitala6ed99532020-01-22 22:51:033542 ui::DomKey::UNIDENTIFIED},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443543 {ui::VKEY_ZOOM, ui::DomCode::NONE, ui::EF_CONTROL_DOWN,
Mike Wiitala6ed99532020-01-22 22:51:033544 ui::DomKey::UNIDENTIFIED}},
3545 {ui::ET_KEY_PRESSED,
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443546 {ui::VKEY_ZOOM, ui::DomCode::NONE,
Mike Wiitala6ed99532020-01-22 22:51:033547 ui::EF_COMMAND_DOWN + ui::EF_CONTROL_DOWN, ui::DomKey::UNIDENTIFIED},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443548 {ui::VKEY_ZOOM, ui::DomCode::NONE, ui::EF_CONTROL_DOWN,
Mike Wiitala6ed99532020-01-22 22:51:033549 ui::DomKey::UNIDENTIFIED}}};
3550
Mike Wiitalaa69048c2020-02-21 18:39:353551 KeyTestCase drallion_tests_privacy_screen[] = {
3552 // Privacy Screen Toggle -> F12,
3553 // Search + Privacy Screen Toggle -> Unchanged
3554 {ui::ET_KEY_PRESSED,
3555 {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
3556 ui::EF_NONE, ui::DomKey::UNIDENTIFIED},
3557 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
3558 {ui::ET_KEY_PRESSED,
3559 {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
3560 ui::EF_COMMAND_DOWN, ui::DomKey::UNIDENTIFIED},
3561 {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
3562 ui::EF_NONE, ui::DomKey::UNIDENTIFIED}}};
3563
Mike Wiitala6ed99532020-01-22 22:51:033564 // Run key test cases for Wilco 1.0 keyboard layout
Zentaro Kavanagh1e7d867c2020-05-13 01:18:443565 SetupKeyboard("Wilco Keyboard", kKbdTopRowLayoutWilcoTag);
Mike Wiitala6ed99532020-01-22 22:51:033566 // Standard key tests using Wilco 1.0 keyboard
Mike Wiitalaa69048c2020-02-21 18:39:353567 for (const auto& test : wilco_standard_tests)
Yuichiro Hanada87c6e552020-02-07 01:07:373568 CheckKeyTestCase(rewriter(), test);
Mike Wiitala6ed99532020-01-22 22:51:033569 // Wilco 1.0 specific key tests
Mike Wiitalaa69048c2020-02-21 18:39:353570 for (const auto& test : wilco_1_tests)
Yuichiro Hanada87c6e552020-02-07 01:07:373571 CheckKeyTestCase(rewriter(), test);
Mike Wiitala6ed99532020-01-22 22:51:033572
3573 // Run key test cases for Drallion (Wilco 1.5) keyboard layout
Zentaro Kavanagh1e7d867c2020-05-13 01:18:443574 SetupKeyboard("Drallion Keyboard", kKbdTopRowLayoutDrallionTag);
Mike Wiitala6ed99532020-01-22 22:51:033575 // Standard key tests using Drallion keyboard layout
Mike Wiitalaa69048c2020-02-21 18:39:353576 for (const auto& test : wilco_standard_tests)
Yuichiro Hanada87c6e552020-02-07 01:07:373577 CheckKeyTestCase(rewriter(), test);
Mike Wiitalaa69048c2020-02-21 18:39:353578
3579 // Drallion specific key tests (no privacy screen)
3580 rewriter_->set_privacy_screen_for_testing(false);
3581 for (const auto& test : drallion_tests_no_privacy_screen)
3582 CheckKeyTestCase(rewriter(), test);
3583
3584 // Drallion specific key tests (privacy screen supported)
3585 rewriter_->set_privacy_screen_for_testing(true);
3586 for (const auto& test : drallion_tests_privacy_screen)
Yuichiro Hanada87c6e552020-02-07 01:07:373587 CheckKeyTestCase(rewriter(), test);
Georges Winkenbach0f454cf2019-05-28 17:16:373588}
3589
Ahmed Fakhryaa02b4e2017-11-13 21:43:323590TEST_F(EventRewriterTest, TestRewriteFunctionKeysInvalidLayout) {
3591 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
3592
3593 // Not adding a keyboard simulates a failure in getting top row layout, which
3594 // will fallback to Layout1 in which case keys are rewritten to their default
3595 // values.
3596 KeyTestCase invalid_layout_tests[] = {
3597 // F2 -> Forward
3598 {ui::ET_KEY_PRESSED,
3599 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2},
3600 {ui::VKEY_BROWSER_FORWARD, ui::DomCode::BROWSER_FORWARD, ui::EF_NONE,
3601 ui::DomKey::BROWSER_FORWARD}},
3602 // F3 -> Refresh
3603 {ui::ET_KEY_PRESSED,
3604 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3},
3605 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_NONE,
3606 ui::DomKey::BROWSER_REFRESH}},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443607 // F4 -> Zoom (aka Fullscreen)
Ahmed Fakhryaa02b4e2017-11-13 21:43:323608 {ui::ET_KEY_PRESSED,
3609 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443610 {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_NONE,
Ahmed Fakhryaa02b4e2017-11-13 21:43:323611 ui::DomKey::ZOOM_TOGGLE}},
3612 // F7 -> Brightness up
3613 {ui::ET_KEY_PRESSED,
3614 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7},
3615 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_NONE,
Dmitry Torokhov3e2b7d82020-02-13 18:04:433616 ui::DomKey::BRIGHTNESS_UP}},
3617 };
Ahmed Fakhryaa02b4e2017-11-13 21:43:323618
3619 for (const auto& test : invalid_layout_tests)
Yuichiro Hanada87c6e552020-02-07 01:07:373620 CheckKeyTestCase(rewriter(), test);
Ahmed Fakhryaa02b4e2017-11-13 21:43:323621
3622 // Adding a keyboard with a valid layout will take effect.
Dmitry Torokhov3e2b7d82020-02-13 18:04:433623 const std::vector<KeyTestCase> layout2_tests({
Ahmed Fakhryaa02b4e2017-11-13 21:43:323624 // F2 -> Refresh
3625 {ui::ET_KEY_PRESSED,
3626 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2},
3627 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_NONE,
3628 ui::DomKey::BROWSER_REFRESH}},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443629 // F3 -> Zoom (aka Fullscreen)
Ahmed Fakhryaa02b4e2017-11-13 21:43:323630 {ui::ET_KEY_PRESSED,
3631 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443632 {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_NONE,
Ahmed Fakhryaa02b4e2017-11-13 21:43:323633 ui::DomKey::ZOOM_TOGGLE}},
3634 // F4 -> Launch App 1
3635 {ui::ET_KEY_PRESSED,
3636 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4},
3637 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::SELECT_TASK, ui::EF_NONE,
3638 ui::DomKey::LAUNCH_MY_COMPUTER}},
3639 // F7 -> Media Play/Pause
3640 {ui::ET_KEY_PRESSED,
3641 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7},
3642 {ui::VKEY_MEDIA_PLAY_PAUSE, ui::DomCode::MEDIA_PLAY_PAUSE, ui::EF_NONE,
Dmitry Torokhov3e2b7d82020-02-13 18:04:433643 ui::DomKey::MEDIA_PLAY_PAUSE}},
3644 });
Ahmed Fakhryaa02b4e2017-11-13 21:43:323645
Dmitry Torokhov3e2b7d82020-02-13 18:04:433646 TestKeyboard("Internal Keyboard", kKbdTopRowLayout2Tag,
Zentaro Kavanaghc65969ef2020-05-14 00:58:433647 ui::INPUT_DEVICE_INTERNAL, /*has_custom_top_row=*/false,
3648 layout2_tests);
Ahmed Fakhryaa02b4e2017-11-13 21:43:323649}
3650
Zentaro Kavanagh76b9bcb2021-05-19 06:29:453651// Tests that event rewrites still work even if modifiers are remapped.
3652TEST_F(EventRewriterTest, TestRewriteExtendedKeysWithControlRemapped) {
3653 // Remap Control to Search.
penghuange5df2822017-03-16 22:54:363654 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]4a822092012-06-15 03:42:513655 IntegerPrefMember search;
Zentaro Kavanagh76b9bcb2021-05-19 06:29:453656 InitModifierKeyPref(&search, prefs::kLanguageRemapControlKeyTo,
3657 ui::chromeos::ModifierKey::kSearchKey);
[email protected]4a822092012-06-15 03:42:513658
Dmitry Torokhov3e2b7d82020-02-13 18:04:433659 TestChromeKeyboardVariants({
Zentaro Kavanagh76b9bcb2021-05-19 06:29:453660 // Ctrl+Right -> End
kpschoedel02c854d2015-06-16 14:44:293661 {ui::ET_KEY_PRESSED,
Zentaro Kavanagh76b9bcb2021-05-19 06:29:453662 {ui::VKEY_RIGHT, ui::DomCode::ARROW_RIGHT, ui::EF_CONTROL_DOWN,
3663 ui::DomKey::ARROW_RIGHT},
kpschoedel51d2e322015-08-28 15:29:353664 {ui::VKEY_END, ui::DomCode::END, ui::EF_NONE, ui::DomKey::END}},
[email protected]4a822092012-06-15 03:42:513665
Zentaro Kavanagh76b9bcb2021-05-19 06:29:453666 // Shift+Ctrl+Right -> Shift+End
kpschoedel02c854d2015-06-16 14:44:293667 {ui::ET_KEY_PRESSED,
Zentaro Kavanagh76b9bcb2021-05-19 06:29:453668 {ui::VKEY_RIGHT, ui::DomCode::ARROW_RIGHT,
3669 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_RIGHT},
kpschoedel51d2e322015-08-28 15:29:353670 {ui::VKEY_END, ui::DomCode::END, ui::EF_SHIFT_DOWN, ui::DomKey::END}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:433671 });
[email protected]4a822092012-06-15 03:42:513672}
[email protected]b2a042f02012-07-19 02:41:383673
3674TEST_F(EventRewriterTest, TestRewriteKeyEventSentByXSendEvent) {
3675 // Remap Control to Alt.
penghuange5df2822017-03-16 22:54:363676 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]b2a042f02012-07-19 02:41:383677 IntegerPrefMember control;
Blake O'Harea09fa45a2017-10-13 04:19:583678 InitModifierKeyPref(&control, prefs::kLanguageRemapControlKeyTo,
3679 ui::chromeos::ModifierKey::kAltKey);
[email protected]b2a042f02012-07-19 02:41:383680
Zentaro Kavanagh1e7d867c2020-05-13 01:18:443681 SetupKeyboard("Internal Keyboard");
[email protected]b2a042f02012-07-19 02:41:383682
3683 // Send left control press.
[email protected]1c649772014-07-18 14:06:123684 {
kpschoedel8226fd152015-05-06 15:48:593685 ui::KeyEvent keyevent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL,
3686 ui::DomCode::CONTROL_LEFT, ui::EF_FINAL,
kpschoedel51d2e322015-08-28 15:29:353687 ui::DomKey::CONTROL, ui::EventTimeForNow());
Yuichiro Hanada87c6e552020-02-07 01:07:373688 TestEventRewriterContinuation continuation;
[email protected]1c649772014-07-18 14:06:123689 // Control should NOT be remapped to Alt if EF_FINAL is set.
Yuichiro Hanada87c6e552020-02-07 01:07:373690 rewriter()->RewriteEvent(keyevent,
3691 continuation.weak_ptr_factory_.GetWeakPtr());
3692 EXPECT_TRUE(continuation.rewritten_events.empty());
3693 EXPECT_EQ(1u, continuation.passthrough_events.size());
3694 EXPECT_TRUE(continuation.passthrough_events[0]->IsKeyEvent());
3695 const auto* result = continuation.passthrough_events[0]->AsKeyEvent();
3696 EXPECT_EQ(ui::VKEY_CONTROL, result->key_code());
[email protected]1c649772014-07-18 14:06:123697 }
[email protected]d13e288992014-05-01 18:00:213698}
[email protected]b2a042f02012-07-19 02:41:383699
[email protected]d13e288992014-05-01 18:00:213700TEST_F(EventRewriterTest, TestRewriteNonNativeEvent) {
3701 // Remap Control to Alt.
penghuange5df2822017-03-16 22:54:363702 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]d13e288992014-05-01 18:00:213703 IntegerPrefMember control;
Blake O'Harea09fa45a2017-10-13 04:19:583704 InitModifierKeyPref(&control, prefs::kLanguageRemapControlKeyTo,
3705 ui::chromeos::ModifierKey::kAltKey);
[email protected]d13e288992014-05-01 18:00:213706
Zentaro Kavanagh1e7d867c2020-05-13 01:18:443707 SetupKeyboard("Internal Keyboard");
[email protected]d13e288992014-05-01 18:00:213708
3709 const int kTouchId = 2;
3710 gfx::Point location(0, 0);
lanwei64725672017-03-16 20:56:053711 ui::TouchEvent press(
3712 ui::ET_TOUCH_PRESSED, location, base::TimeTicks(),
Dave Tapuska1621efb2020-04-29 15:39:543713 ui::PointerDetails(ui::EventPointerType::kTouch, kTouchId));
[email protected]d13e288992014-05-01 18:00:213714 press.set_flags(ui::EF_CONTROL_DOWN);
3715
Yuichiro Hanada87c6e552020-02-07 01:07:373716 TestEventRewriterContinuation continuation;
3717 rewriter()->RewriteEvent(press, continuation.weak_ptr_factory_.GetWeakPtr());
3718 EXPECT_TRUE(continuation.passthrough_events.empty());
3719 EXPECT_EQ(1u, continuation.rewritten_events.size());
[email protected]d13e288992014-05-01 18:00:213720 // Control should be remapped to Alt.
Yuichiro Hanada87c6e552020-02-07 01:07:373721 EXPECT_EQ(ui::EF_ALT_DOWN, continuation.rewritten_events[0]->flags() &
3722 (ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN));
[email protected]b2a042f02012-07-19 02:41:383723}
[email protected]f7ab9b6042013-10-07 23:27:203724
[email protected]354520b2014-06-21 04:31:013725// Keeps a buffer of handled events.
3726class EventBuffer : public ui::test::TestEventProcessor {
3727 public:
3728 EventBuffer() {}
dchengc97a0282015-01-15 23:04:243729 ~EventBuffer() override {}
[email protected]354520b2014-06-21 04:31:013730
avi3dbcc202017-03-13 02:48:363731 void PopEvents(std::vector<std::unique_ptr<ui::Event>>* events) {
[email protected]354520b2014-06-21 04:31:013732 events->clear();
3733 events->swap(events_);
3734 }
3735
3736 private:
penghuang17134c6c2017-03-23 00:01:073737 // ui::EventSink overrides:
dchengc97a0282015-01-15 23:04:243738 ui::EventDispatchDetails OnEventFromSource(ui::Event* event) override {
moshayedi4e6623012016-03-02 04:53:583739 events_.push_back(ui::Event::Clone(*event));
[email protected]354520b2014-06-21 04:31:013740 return ui::EventDispatchDetails();
3741 }
3742
avi3dbcc202017-03-13 02:48:363743 std::vector<std::unique_ptr<ui::Event>> events_;
[email protected]354520b2014-06-21 04:31:013744
3745 DISALLOW_COPY_AND_ASSIGN(EventBuffer);
3746};
3747
3748// Trivial EventSource that does nothing but send events.
3749class TestEventSource : public ui::EventSource {
3750 public:
3751 explicit TestEventSource(ui::EventProcessor* processor)
3752 : processor_(processor) {}
penghuang17134c6c2017-03-23 00:01:073753 ui::EventSink* GetEventSink() override { return processor_; }
[email protected]354520b2014-06-21 04:31:013754 ui::EventDispatchDetails Send(ui::Event* event) {
penghuang17134c6c2017-03-23 00:01:073755 return SendEventToSink(event);
[email protected]354520b2014-06-21 04:31:013756 }
3757
3758 private:
3759 ui::EventProcessor* processor_;
3760};
3761
[email protected]f7ab9b6042013-10-07 23:27:203762// Tests of event rewriting that depend on the Ash window manager.
Scott Violet6ac56412018-12-19 17:25:503763class EventRewriterAshTest : public ChromeAshTestBase {
[email protected]f7ab9b6042013-10-07 23:27:203764 public:
[email protected]d13e288992014-05-01 18:00:213765 EventRewriterAshTest()
[email protected]354520b2014-06-21 04:31:013766 : source_(&buffer_),
Henrique Ferreirocddc8012021-03-26 00:47:153767 fake_user_manager_(new FakeChromeUserManager),
Xiyuan Xiadfe3a9f2017-11-13 21:46:263768 user_manager_enabler_(base::WrapUnique(fake_user_manager_)) {}
dchengc97a0282015-01-15 23:04:243769 ~EventRewriterAshTest() override {}
[email protected]f7ab9b6042013-10-07 23:27:203770
[email protected]354520b2014-06-21 04:31:013771 ui::EventDispatchDetails Send(ui::Event* event) {
3772 return source_.Send(event);
3773 }
3774
kpschoedel8226fd152015-05-06 15:48:593775 void SendKeyEvent(ui::EventType type,
3776 ui::KeyboardCode key_code,
3777 ui::DomCode code,
kpschoedel51d2e322015-08-28 15:29:353778 ui::DomKey key) {
Andrew Xu531197df2019-03-07 21:46:493779 SendKeyEvent(type, key_code, code, key, ui::EF_NONE);
3780 }
3781
3782 void SendKeyEvent(ui::EventType type,
3783 ui::KeyboardCode key_code,
3784 ui::DomCode code,
3785 ui::DomKey key,
3786 int flags) {
3787 ui::KeyEvent press(type, key_code, code, flags, key, ui::EventTimeForNow());
[email protected]354520b2014-06-21 04:31:013788 ui::EventDispatchDetails details = Send(&press);
3789 CHECK(!details.dispatcher_destroyed);
3790 }
3791
kpschoedel8226fd152015-05-06 15:48:593792 void SendActivateStickyKeyPattern(ui::KeyboardCode key_code,
3793 ui::DomCode code,
kpschoedel51d2e322015-08-28 15:29:353794 ui::DomKey key) {
3795 SendKeyEvent(ui::ET_KEY_PRESSED, key_code, code, key);
3796 SendKeyEvent(ui::ET_KEY_RELEASED, key_code, code, key);
[email protected]354520b2014-06-21 04:31:013797 }
3798
[email protected]e2204a702013-10-29 21:58:543799 protected:
maxbogueea16ff412016-10-28 16:35:293800 sync_preferences::TestingPrefServiceSyncable* prefs() { return &prefs_; }
[email protected]354520b2014-06-21 04:31:013801
Blake O'Harea09fa45a2017-10-13 04:19:583802 void InitModifierKeyPref(IntegerPrefMember* int_pref,
3803 const std::string& pref_name,
3804 ui::chromeos::ModifierKey modifierKey) {
3805 int_pref->Init(pref_name, prefs());
3806 int_pref->SetValue(static_cast<int>(modifierKey));
3807 }
3808
avi3dbcc202017-03-13 02:48:363809 void PopEvents(std::vector<std::unique_ptr<ui::Event>>* events) {
3810 buffer_.PopEvents(events);
3811 }
[email protected]354520b2014-06-21 04:31:013812
dchengc97a0282015-01-15 23:04:243813 void SetUp() override {
Scott Violet6ac56412018-12-19 17:25:503814 ChromeAshTestBase::SetUp();
skycb4be5b2017-04-06 17:52:453815 sticky_keys_controller_ = ash::Shell::Get()->sticky_keys_controller();
Yuki Awanoce4c62d32018-06-28 00:36:363816 delegate_ = std::make_unique<EventRewriterDelegateImpl>(nullptr);
penghuange5df2822017-03-16 22:54:363817 delegate_->set_pref_service_for_testing(prefs());
Jinho Bang341ce5b02018-01-17 22:46:033818 rewriter_ = std::make_unique<ui::EventRewriterChromeOS>(
Jimmy Gong82c82b42021-04-17 03:12:333819 delegate_.get(), sticky_keys_controller_, false, &fake_ime_keyboard_);
[email protected]e0047752014-04-09 02:18:363820 chromeos::Preferences::RegisterProfilePrefs(prefs_.registry());
[email protected]354520b2014-06-21 04:31:013821 source_.AddEventRewriter(rewriter_.get());
3822 sticky_keys_controller_->Enable(true);
[email protected]e0047752014-04-09 02:18:363823 }
3824
dchengc97a0282015-01-15 23:04:243825 void TearDown() override {
[email protected]e0047752014-04-09 02:18:363826 rewriter_.reset();
Scott Violet6ac56412018-12-19 17:25:503827 ChromeAshTestBase::TearDown();
[email protected]e0047752014-04-09 02:18:363828 }
3829
[email protected]354520b2014-06-21 04:31:013830 protected:
3831 ash::StickyKeysController* sticky_keys_controller_;
[email protected]e2204a702013-10-29 21:58:543832
[email protected]f7ab9b6042013-10-07 23:27:203833 private:
penghuange5df2822017-03-16 22:54:363834 std::unique_ptr<EventRewriterDelegateImpl> delegate_;
Jimmy Gong82c82b42021-04-17 03:12:333835 chromeos::input_method::FakeImeKeyboard fake_ime_keyboard_;
penghuange5df2822017-03-16 22:54:363836 std::unique_ptr<ui::EventRewriterChromeOS> rewriter_;
[email protected]f7ab9b6042013-10-07 23:27:203837
[email protected]354520b2014-06-21 04:31:013838 EventBuffer buffer_;
3839 TestEventSource source_;
3840
Henrique Ferreirocddc8012021-03-26 00:47:153841 FakeChromeUserManager* fake_user_manager_; // Not owned.
Xiyuan Xiadfe3a9f2017-11-13 21:46:263842 user_manager::ScopedUserManager user_manager_enabler_;
maxbogueea16ff412016-10-28 16:35:293843 sync_preferences::TestingPrefServiceSyncable prefs_;
[email protected]d13e288992014-05-01 18:00:213844
[email protected]f7ab9b6042013-10-07 23:27:203845 DISALLOW_COPY_AND_ASSIGN(EventRewriterAshTest);
3846};
3847
3848TEST_F(EventRewriterAshTest, TopRowKeysAreFunctionKeys) {
dcheng24002d02016-04-08 02:42:403849 std::unique_ptr<aura::Window> window(CreateTestWindowInShellWithId(1));
James Cook55648272017-09-13 23:14:013850 wm::ActivateWindow(window.get());
avi3dbcc202017-03-13 02:48:363851 std::vector<std::unique_ptr<ui::Event>> events;
[email protected]f7ab9b6042013-10-07 23:27:203852
3853 // Create a simulated keypress of F1 targetted at the window.
kpschoedel8226fd152015-05-06 15:48:593854 ui::KeyEvent press_f1(ui::ET_KEY_PRESSED, ui::VKEY_F1, ui::DomCode::F1,
kpschoedel51d2e322015-08-28 15:29:353855 ui::EF_NONE, ui::DomKey::F1, ui::EventTimeForNow());
[email protected]f7ab9b6042013-10-07 23:27:203856
[email protected]e2204a702013-10-29 21:58:543857 // The event should also not be rewritten if the send-function-keys pref is
3858 // additionally set, for both apps v2 and regular windows.
3859 BooleanPrefMember send_function_keys_pref;
[email protected]354520b2014-06-21 04:31:013860 send_function_keys_pref.Init(prefs::kLanguageSendFunctionKeys, prefs());
[email protected]e2204a702013-10-29 21:58:543861 send_function_keys_pref.SetValue(true);
sadrulca0e9992016-07-20 22:55:543862 ui::EventDispatchDetails details = Send(&press_f1);
[email protected]354520b2014-06-21 04:31:013863 ASSERT_FALSE(details.dispatcher_destroyed);
3864 PopEvents(&events);
3865 EXPECT_EQ(1u, events.size());
Zentaro Kavanaghc555ab452020-05-13 23:07:373866 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_F1,
3867 ui::DomCode::F1, ui::EF_NONE,
3868 ui::DomKey::F1, kNoScanCode),
3869 GetKeyEventAsString(*static_cast<ui::KeyEvent*>(events[0].get())));
[email protected]e2204a702013-10-29 21:58:543870
3871 // If the pref isn't set when an event is sent to a regular window, F1 is
3872 // rewritten to the back key.
3873 send_function_keys_pref.SetValue(false);
[email protected]354520b2014-06-21 04:31:013874 details = Send(&press_f1);
3875 ASSERT_FALSE(details.dispatcher_destroyed);
3876 PopEvents(&events);
3877 EXPECT_EQ(1u, events.size());
kpschoedel8226fd152015-05-06 15:48:593878 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_BROWSER_BACK,
3879 ui::DomCode::BROWSER_BACK, ui::EF_NONE,
Zentaro Kavanaghc555ab452020-05-13 23:07:373880 ui::DomKey::BROWSER_BACK, kNoScanCode),
avi3dbcc202017-03-13 02:48:363881 GetKeyEventAsString(*static_cast<ui::KeyEvent*>(events[0].get())));
[email protected]f7ab9b6042013-10-07 23:27:203882}
3883
Zentaro Kavanaghe7133ce2019-05-30 00:22:143884// Parameterized version of test with the same name that accepts the
3885// event flags that correspond to a right-click. This will be either
3886// Alt+Click or Search+Click. After a transition period this will
3887// default to Search+Click and the Alt+Click logic will be removed.
3888void EventRewriterTest::DontRewriteIfNotRewritten(int right_click_flags) {
Ahmed Fakhry719548c2018-10-15 23:47:193889 ui::DeviceDataManager* device_data_manager =
3890 ui::DeviceDataManager::GetInstance();
3891 std::vector<ui::InputDevice> touchpad_devices(2);
3892 constexpr int kTouchpadId1 = 10;
3893 constexpr int kTouchpadId2 = 11;
3894 touchpad_devices[0].id = kTouchpadId1;
3895 touchpad_devices[1].id = kTouchpadId2;
3896 static_cast<ui::DeviceHotplugEventObserver*>(device_data_manager)
3897 ->OnTouchpadDevicesUpdated(touchpad_devices);
3898 std::vector<ui::InputDevice> mouse_devices(1);
3899 constexpr int kMouseId = 12;
3900 touchpad_devices[0].id = kMouseId;
3901 static_cast<ui::DeviceHotplugEventObserver*>(device_data_manager)
3902 ->OnMouseDevicesUpdated(mouse_devices);
3903
Zentaro Kavanaghe7133ce2019-05-30 00:22:143904 // Test (Alt|Search) + Left click.
[email protected]595079ce2014-07-11 22:25:133905 {
robert.bradfordb3d800b2015-02-18 18:56:103906 ui::MouseEvent press(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
Zentaro Kavanaghe7133ce2019-05-30 00:22:143907 ui::EventTimeForNow(), right_click_flags,
[email protected]595079ce2014-07-11 22:25:133908 ui::EF_LEFT_MOUSE_BUTTON);
3909 ui::EventTestApi test_press(&press);
Ahmed Fakhry719548c2018-10-15 23:47:193910 test_press.set_source_device_id(kTouchpadId1);
[email protected]595079ce2014-07-11 22:25:133911 // Sanity check.
3912 EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type());
Zentaro Kavanaghe7133ce2019-05-30 00:22:143913 EXPECT_EQ(right_click_flags, press.flags());
Yuichiro Hanada875de4f32020-02-15 00:48:373914 const ui::MouseEvent result = RewriteMouseButtonEvent(press);
3915 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & result.flags());
3916 EXPECT_NE(right_click_flags, right_click_flags & result.flags());
3917 EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, result.changed_button_flags());
[email protected]595079ce2014-07-11 22:25:133918 }
3919 {
robert.bradfordb3d800b2015-02-18 18:56:103920 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(),
Zentaro Kavanaghe7133ce2019-05-30 00:22:143921 ui::EventTimeForNow(), right_click_flags,
[email protected]595079ce2014-07-11 22:25:133922 ui::EF_LEFT_MOUSE_BUTTON);
3923 ui::EventTestApi test_release(&release);
Ahmed Fakhry719548c2018-10-15 23:47:193924 test_release.set_source_device_id(kTouchpadId1);
Yuichiro Hanada875de4f32020-02-15 00:48:373925 const ui::MouseEvent result = RewriteMouseButtonEvent(release);
3926 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & result.flags());
3927 EXPECT_NE(right_click_flags, right_click_flags & result.flags());
3928 EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, result.changed_button_flags());
[email protected]595079ce2014-07-11 22:25:133929 }
[email protected]7f926752014-01-30 09:16:353930
Zentaro Kavanaghe7133ce2019-05-30 00:22:143931 // No (ALT|SEARCH) in first click.
[email protected]7f926752014-01-30 09:16:353932 {
robert.bradfordb3d800b2015-02-18 18:56:103933 ui::MouseEvent press(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
3934 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
[email protected]595079ce2014-07-11 22:25:133935 ui::EF_LEFT_MOUSE_BUTTON);
3936 ui::EventTestApi test_press(&press);
Ahmed Fakhry719548c2018-10-15 23:47:193937 test_press.set_source_device_id(kTouchpadId1);
Yuichiro Hanada875de4f32020-02-15 00:48:373938 const ui::MouseEvent result = RewriteMouseButtonEvent(press);
3939 EXPECT_TRUE(ui::EF_LEFT_MOUSE_BUTTON & result.flags());
3940 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, result.changed_button_flags());
[email protected]595079ce2014-07-11 22:25:133941 }
3942 {
robert.bradfordb3d800b2015-02-18 18:56:103943 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(),
Zentaro Kavanaghe7133ce2019-05-30 00:22:143944 ui::EventTimeForNow(), right_click_flags,
[email protected]595079ce2014-07-11 22:25:133945 ui::EF_LEFT_MOUSE_BUTTON);
3946 ui::EventTestApi test_release(&release);
Ahmed Fakhry719548c2018-10-15 23:47:193947 test_release.set_source_device_id(kTouchpadId1);
Yuichiro Hanada875de4f32020-02-15 00:48:373948 const ui::MouseEvent result = RewriteMouseButtonEvent(release);
3949 EXPECT_EQ(right_click_flags, right_click_flags & result.flags());
3950 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, result.changed_button_flags());
[email protected]595079ce2014-07-11 22:25:133951 }
[email protected]7f926752014-01-30 09:16:353952
xdaie54b1fc22015-06-05 00:59:373953 // ALT on different device.
[email protected]7f926752014-01-30 09:16:353954 {
robert.bradfordb3d800b2015-02-18 18:56:103955 ui::MouseEvent press(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
Zentaro Kavanaghe7133ce2019-05-30 00:22:143956 ui::EventTimeForNow(), right_click_flags,
[email protected]595079ce2014-07-11 22:25:133957 ui::EF_LEFT_MOUSE_BUTTON);
3958 ui::EventTestApi test_press(&press);
Ahmed Fakhry719548c2018-10-15 23:47:193959 test_press.set_source_device_id(kTouchpadId2);
Yuichiro Hanada875de4f32020-02-15 00:48:373960 const ui::MouseEvent result = RewriteMouseButtonEvent(press);
3961 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & result.flags());
3962 EXPECT_NE(right_click_flags, right_click_flags & result.flags());
3963 EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, result.changed_button_flags());
[email protected]595079ce2014-07-11 22:25:133964 }
3965 {
robert.bradfordb3d800b2015-02-18 18:56:103966 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(),
Zentaro Kavanaghe7133ce2019-05-30 00:22:143967 ui::EventTimeForNow(), right_click_flags,
[email protected]595079ce2014-07-11 22:25:133968 ui::EF_LEFT_MOUSE_BUTTON);
3969 ui::EventTestApi test_release(&release);
Ahmed Fakhry719548c2018-10-15 23:47:193970 test_release.set_source_device_id(kTouchpadId1);
Yuichiro Hanada875de4f32020-02-15 00:48:373971 const ui::MouseEvent result = RewriteMouseButtonEvent(release);
3972 EXPECT_EQ(right_click_flags, right_click_flags & result.flags());
3973 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, result.changed_button_flags());
[email protected]595079ce2014-07-11 22:25:133974 }
3975 {
robert.bradfordb3d800b2015-02-18 18:56:103976 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(),
Zentaro Kavanaghe7133ce2019-05-30 00:22:143977 ui::EventTimeForNow(), right_click_flags,
[email protected]595079ce2014-07-11 22:25:133978 ui::EF_LEFT_MOUSE_BUTTON);
3979 ui::EventTestApi test_release(&release);
Ahmed Fakhry719548c2018-10-15 23:47:193980 test_release.set_source_device_id(kTouchpadId2);
Yuichiro Hanada875de4f32020-02-15 00:48:373981 const ui::MouseEvent result = RewriteMouseButtonEvent(release);
3982 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & result.flags());
3983 EXPECT_NE(right_click_flags, right_click_flags & result.flags());
3984 EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, result.changed_button_flags());
[email protected]595079ce2014-07-11 22:25:133985 }
Ahmed Fakhry719548c2018-10-15 23:47:193986
3987 // No rewrite for non-touchpad devices.
3988 {
3989 ui::MouseEvent press(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
Zentaro Kavanaghe7133ce2019-05-30 00:22:143990 ui::EventTimeForNow(), right_click_flags,
Ahmed Fakhry719548c2018-10-15 23:47:193991 ui::EF_LEFT_MOUSE_BUTTON);
3992 ui::EventTestApi test_press(&press);
3993 test_press.set_source_device_id(kMouseId);
3994 EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type());
Zentaro Kavanaghe7133ce2019-05-30 00:22:143995 EXPECT_EQ(right_click_flags, press.flags());
Yuichiro Hanada875de4f32020-02-15 00:48:373996 const ui::MouseEvent result = RewriteMouseButtonEvent(press);
3997 EXPECT_EQ(right_click_flags, right_click_flags & result.flags());
3998 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, result.changed_button_flags());
Ahmed Fakhry719548c2018-10-15 23:47:193999 }
4000 {
4001 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(),
Zentaro Kavanaghe7133ce2019-05-30 00:22:144002 ui::EventTimeForNow(), right_click_flags,
Ahmed Fakhry719548c2018-10-15 23:47:194003 ui::EF_LEFT_MOUSE_BUTTON);
4004 ui::EventTestApi test_release(&release);
4005 test_release.set_source_device_id(kMouseId);
Yuichiro Hanada875de4f32020-02-15 00:48:374006 const ui::MouseEvent result = RewriteMouseButtonEvent(release);
4007 EXPECT_EQ(right_click_flags, right_click_flags & result.flags());
4008 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, result.changed_button_flags());
Ahmed Fakhry719548c2018-10-15 23:47:194009 }
[email protected]354520b2014-06-21 04:31:014010}
4011
Zentaro Kavanaghe7133ce2019-05-30 00:22:144012TEST_F(EventRewriterTest, DontRewriteIfNotRewritten_AltClickIsRightClick) {
4013 DontRewriteIfNotRewritten(ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN);
Zentaro Kavanaghd6112d82021-02-19 21:21:324014 EXPECT_EQ(message_center_.NotificationCount(), 0);
Zentaro Kavanaghe7133ce2019-05-30 00:22:144015}
4016
Zentaro Kavanagh53c48cb22021-03-25 00:19:064017TEST_F(EventRewriterTest, DontRewriteIfNotRewritten_AltClickIsRightClick_New) {
4018 // Enabling the kImprovedKeyboardShortcuts feature does not change alt+click
4019 // behavior or create a notification.
4020 scoped_feature_list_.InitAndEnableFeature(
4021 ::features::kImprovedKeyboardShortcuts);
4022 DontRewriteIfNotRewritten(ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN);
4023 EXPECT_EQ(message_center_.NotificationCount(), 0);
4024}
4025
Zentaro Kavanaghe7133ce2019-05-30 00:22:144026TEST_F(EventRewriterTest, DontRewriteIfNotRewritten_SearchClickIsRightClick) {
4027 scoped_feature_list_.InitAndEnableFeature(
4028 chromeos::features::kUseSearchClickForRightClick);
4029 DontRewriteIfNotRewritten(ui::EF_LEFT_MOUSE_BUTTON | ui::EF_COMMAND_DOWN);
Zentaro Kavanaghd6112d82021-02-19 21:21:324030 EXPECT_EQ(message_center_.NotificationCount(), 0);
Zentaro Kavanaghe7133ce2019-05-30 00:22:144031}
4032
Zentaro Kavanagh53c48cb22021-03-25 00:19:064033TEST_F(EventRewriterTest, DontRewriteIfNotRewritten_AltClickDeprecated) {
4034 // Pressing search+click with alt+click deprecated works, but does not
4035 // generate a notification.
4036 scoped_feature_list_.InitAndEnableFeature(::features::kDeprecateAltClick);
Zentaro Kavanagh30f15aa2021-02-13 00:03:584037 DontRewriteIfNotRewritten(ui::EF_LEFT_MOUSE_BUTTON | ui::EF_COMMAND_DOWN);
Zentaro Kavanaghd6112d82021-02-19 21:21:324038 EXPECT_EQ(message_center_.NotificationCount(), 0);
4039}
4040
4041TEST_F(EventRewriterTest, DeprecatedAltClickGeneratesNotification) {
Zentaro Kavanagh53c48cb22021-03-25 00:19:064042 scoped_feature_list_.InitAndEnableFeature(::features::kDeprecateAltClick);
Zentaro Kavanaghd6112d82021-02-19 21:21:324043 ui::DeviceDataManager* device_data_manager =
4044 ui::DeviceDataManager::GetInstance();
4045 std::vector<ui::InputDevice> touchpad_devices(1);
4046 constexpr int kTouchpadId1 = 10;
4047 touchpad_devices[0].id = kTouchpadId1;
4048 static_cast<ui::DeviceHotplugEventObserver*>(device_data_manager)
4049 ->OnTouchpadDevicesUpdated(touchpad_devices);
4050 std::vector<ui::InputDevice> mouse_devices(1);
4051 constexpr int kMouseId = 12;
4052 touchpad_devices[0].id = kMouseId;
4053 static_cast<ui::DeviceHotplugEventObserver*>(device_data_manager)
4054 ->OnMouseDevicesUpdated(mouse_devices);
4055
4056 const int deprecated_flags = ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN;
4057
4058 // Alt + Left click => No rewrite.
4059 {
4060 ui::MouseEvent press(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
4061 ui::EventTimeForNow(), deprecated_flags,
4062 ui::EF_LEFT_MOUSE_BUTTON);
4063 ui::EventTestApi test_press(&press);
4064 test_press.set_source_device_id(kTouchpadId1);
4065 // Sanity check.
4066 EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type());
4067 EXPECT_EQ(deprecated_flags, press.flags());
4068 const ui::MouseEvent result = RewriteMouseButtonEvent(press);
4069
4070 // No rewrite occurred.
4071 EXPECT_EQ(deprecated_flags, deprecated_flags & result.flags());
4072 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, result.changed_button_flags());
4073
4074 // Expect a deprecation notification.
4075 EXPECT_EQ(message_center_.NotificationCount(), 1);
4076 ClearNotifications();
4077 }
4078 {
4079 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(),
4080 ui::EventTimeForNow(), deprecated_flags,
4081 ui::EF_LEFT_MOUSE_BUTTON);
4082 ui::EventTestApi test_release(&release);
4083 test_release.set_source_device_id(kTouchpadId1);
4084 const ui::MouseEvent result = RewriteMouseButtonEvent(release);
4085
4086 // No rewrite occurred.
4087 EXPECT_EQ(deprecated_flags, deprecated_flags & result.flags());
4088 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, result.changed_button_flags());
4089
4090 // Don't expect a new notification on release.
4091 EXPECT_EQ(message_center_.NotificationCount(), 0);
4092 }
4093
4094 // No rewrite or notification for non-touchpad devices.
4095 {
4096 ui::MouseEvent press(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
4097 ui::EventTimeForNow(), deprecated_flags,
4098 ui::EF_LEFT_MOUSE_BUTTON);
4099 ui::EventTestApi test_press(&press);
4100 test_press.set_source_device_id(kMouseId);
4101 EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type());
4102 EXPECT_EQ(deprecated_flags, press.flags());
4103 const ui::MouseEvent result = RewriteMouseButtonEvent(press);
4104 EXPECT_EQ(deprecated_flags, deprecated_flags & result.flags());
4105 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, result.changed_button_flags());
4106
4107 // No notification expected for this case.
4108 EXPECT_EQ(message_center_.NotificationCount(), 0);
4109 }
4110 {
4111 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(),
4112 ui::EventTimeForNow(), deprecated_flags,
4113 ui::EF_LEFT_MOUSE_BUTTON);
4114 ui::EventTestApi test_release(&release);
4115 test_release.set_source_device_id(kMouseId);
4116 const ui::MouseEvent result = RewriteMouseButtonEvent(release);
4117 EXPECT_EQ(deprecated_flags, deprecated_flags & result.flags());
4118 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, result.changed_button_flags());
4119
4120 // No notification expected for this case.
4121 EXPECT_EQ(message_center_.NotificationCount(), 0);
4122 }
Zentaro Kavanagh30f15aa2021-02-13 00:03:584123}
4124
[email protected]354520b2014-06-21 04:31:014125TEST_F(EventRewriterAshTest, StickyKeyEventDispatchImpl) {
4126 // Test the actual key event dispatch implementation.
avi3dbcc202017-03-13 02:48:364127 std::vector<std::unique_ptr<ui::Event>> events;
[email protected]354520b2014-06-21 04:31:014128
kpschoedel8226fd152015-05-06 15:48:594129 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:354130 ui::DomKey::CONTROL);
[email protected]354520b2014-06-21 04:31:014131 PopEvents(&events);
4132 EXPECT_EQ(1u, events.size());
4133 EXPECT_EQ(ui::ET_KEY_PRESSED, events[0]->type());
4134 EXPECT_EQ(ui::VKEY_CONTROL,
avi3dbcc202017-03-13 02:48:364135 static_cast<ui::KeyEvent*>(events[0].get())->key_code());
[email protected]354520b2014-06-21 04:31:014136
4137 // Test key press event is correctly modified and modifier release
4138 // event is sent.
kpschoedela281bf12016-01-07 15:08:194139 ui::KeyEvent press(ui::ET_KEY_PRESSED, ui::VKEY_C, ui::DomCode::US_C,
kpschoedel51d2e322015-08-28 15:29:354140 ui::EF_NONE, ui::DomKey::Constant<'c'>::Character,
kpschoedel8226fd152015-05-06 15:48:594141 ui::EventTimeForNow());
[email protected]354520b2014-06-21 04:31:014142 ui::EventDispatchDetails details = Send(&press);
4143 PopEvents(&events);
4144 EXPECT_EQ(2u, events.size());
4145 EXPECT_EQ(ui::ET_KEY_PRESSED, events[0]->type());
avi3dbcc202017-03-13 02:48:364146 EXPECT_EQ(ui::VKEY_C,
4147 static_cast<ui::KeyEvent*>(events[0].get())->key_code());
[email protected]354520b2014-06-21 04:31:014148 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
4149 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type());
4150 EXPECT_EQ(ui::VKEY_CONTROL,
avi3dbcc202017-03-13 02:48:364151 static_cast<ui::KeyEvent*>(events[1].get())->key_code());
[email protected]354520b2014-06-21 04:31:014152
4153 // Test key release event is not modified.
kpschoedela281bf12016-01-07 15:08:194154 ui::KeyEvent release(ui::ET_KEY_RELEASED, ui::VKEY_C, ui::DomCode::US_C,
kpschoedel51d2e322015-08-28 15:29:354155 ui::EF_NONE, ui::DomKey::Constant<'c'>::Character,
kpschoedel8226fd152015-05-06 15:48:594156 ui::EventTimeForNow());
[email protected]354520b2014-06-21 04:31:014157 details = Send(&release);
4158 ASSERT_FALSE(details.dispatcher_destroyed);
4159 PopEvents(&events);
4160 EXPECT_EQ(1u, events.size());
4161 EXPECT_EQ(ui::ET_KEY_RELEASED, events[0]->type());
avi3dbcc202017-03-13 02:48:364162 EXPECT_EQ(ui::VKEY_C,
4163 static_cast<ui::KeyEvent*>(events[0].get())->key_code());
[email protected]354520b2014-06-21 04:31:014164 EXPECT_FALSE(events[0]->flags() & ui::EF_CONTROL_DOWN);
4165}
4166
4167TEST_F(EventRewriterAshTest, MouseEventDispatchImpl) {
avi3dbcc202017-03-13 02:48:364168 std::vector<std::unique_ptr<ui::Event>> events;
[email protected]354520b2014-06-21 04:31:014169
kpschoedel8226fd152015-05-06 15:48:594170 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:354171 ui::DomKey::CONTROL);
[email protected]354520b2014-06-21 04:31:014172 PopEvents(&events);
4173
4174 // Test mouse press event is correctly modified.
4175 gfx::Point location(0, 0);
robert.bradfordb3d800b2015-02-18 18:56:104176 ui::MouseEvent press(ui::ET_MOUSE_PRESSED, location, location,
4177 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
[email protected]354520b2014-06-21 04:31:014178 ui::EF_LEFT_MOUSE_BUTTON);
4179 ui::EventDispatchDetails details = Send(&press);
4180 ASSERT_FALSE(details.dispatcher_destroyed);
4181 PopEvents(&events);
4182 EXPECT_EQ(1u, events.size());
4183 EXPECT_EQ(ui::ET_MOUSE_PRESSED, events[0]->type());
4184 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
4185
4186 // Test mouse release event is correctly modified and modifier release
4187 // event is sent. The mouse event should have the correct DIP location.
robert.bradfordb3d800b2015-02-18 18:56:104188 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, location, location,
4189 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
[email protected]354520b2014-06-21 04:31:014190 ui::EF_LEFT_MOUSE_BUTTON);
4191 details = Send(&release);
4192 ASSERT_FALSE(details.dispatcher_destroyed);
4193 PopEvents(&events);
4194 EXPECT_EQ(2u, events.size());
4195 EXPECT_EQ(ui::ET_MOUSE_RELEASED, events[0]->type());
4196 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
4197 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type());
4198 EXPECT_EQ(ui::VKEY_CONTROL,
avi3dbcc202017-03-13 02:48:364199 static_cast<ui::KeyEvent*>(events[1].get())->key_code());
[email protected]354520b2014-06-21 04:31:014200}
4201
4202TEST_F(EventRewriterAshTest, MouseWheelEventDispatchImpl) {
avi3dbcc202017-03-13 02:48:364203 std::vector<std::unique_ptr<ui::Event>> events;
[email protected]354520b2014-06-21 04:31:014204
4205 // Test positive mouse wheel event is correctly modified and modifier release
4206 // event is sent.
kpschoedel8226fd152015-05-06 15:48:594207 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:354208 ui::DomKey::CONTROL);
[email protected]354520b2014-06-21 04:31:014209 PopEvents(&events);
4210 gfx::Point location(0, 0);
riajiang1c49eca2016-08-30 19:36:534211 ui::MouseWheelEvent positive(
4212 gfx::Vector2d(0, ui::MouseWheelEvent::kWheelDelta), location, location,
4213 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
4214 ui::EF_LEFT_MOUSE_BUTTON);
[email protected]354520b2014-06-21 04:31:014215 ui::EventDispatchDetails details = Send(&positive);
4216 ASSERT_FALSE(details.dispatcher_destroyed);
4217 PopEvents(&events);
4218 EXPECT_EQ(2u, events.size());
4219 EXPECT_TRUE(events[0]->IsMouseWheelEvent());
4220 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
4221 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type());
4222 EXPECT_EQ(ui::VKEY_CONTROL,
avi3dbcc202017-03-13 02:48:364223 static_cast<ui::KeyEvent*>(events[1].get())->key_code());
[email protected]354520b2014-06-21 04:31:014224
4225 // Test negative mouse wheel event is correctly modified and modifier release
4226 // event is sent.
kpschoedel8226fd152015-05-06 15:48:594227 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:354228 ui::DomKey::CONTROL);
[email protected]354520b2014-06-21 04:31:014229 PopEvents(&events);
riajiang1c49eca2016-08-30 19:36:534230 ui::MouseWheelEvent negative(
4231 gfx::Vector2d(0, -ui::MouseWheelEvent::kWheelDelta), location, location,
4232 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
4233 ui::EF_LEFT_MOUSE_BUTTON);
[email protected]354520b2014-06-21 04:31:014234 details = Send(&negative);
4235 ASSERT_FALSE(details.dispatcher_destroyed);
4236 PopEvents(&events);
4237 EXPECT_EQ(2u, events.size());
4238 EXPECT_TRUE(events[0]->IsMouseWheelEvent());
4239 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
4240 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type());
4241 EXPECT_EQ(ui::VKEY_CONTROL,
avi3dbcc202017-03-13 02:48:364242 static_cast<ui::KeyEvent*>(events[1].get())->key_code());
[email protected]354520b2014-06-21 04:31:014243}
4244
afakhry1688ee312016-04-15 16:36:334245// Tests that if modifier keys are remapped, the flags of a mouse wheel event
4246// will be rewritten properly.
4247TEST_F(EventRewriterAshTest, MouseWheelEventModifiersRewritten) {
afakhry1688ee312016-04-15 16:36:334248 // Generate a mouse wheel event that has a CONTROL_DOWN modifier flag and
Yuichiro Hanada9efb801e2020-02-15 01:18:004249 // expect that no rewriting happens as no modifier remapping is active.
avi3dbcc202017-03-13 02:48:364250 std::vector<std::unique_ptr<ui::Event>> events;
afakhry1688ee312016-04-15 16:36:334251 gfx::Point location(0, 0);
riajiang1c49eca2016-08-30 19:36:534252 ui::MouseWheelEvent positive(
4253 gfx::Vector2d(0, ui::MouseWheelEvent::kWheelDelta), location, location,
4254 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON | ui::EF_CONTROL_DOWN,
4255 ui::EF_LEFT_MOUSE_BUTTON);
afakhry1688ee312016-04-15 16:36:334256 ui::EventDispatchDetails details = Send(&positive);
4257 ASSERT_FALSE(details.dispatcher_destroyed);
4258 PopEvents(&events);
4259 EXPECT_EQ(1u, events.size());
4260 EXPECT_TRUE(events[0]->IsMouseWheelEvent());
Yuichiro Hanada9efb801e2020-02-15 01:18:004261 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
4262
4263 // Remap Control to Alt.
4264 IntegerPrefMember control;
4265 InitModifierKeyPref(&control, prefs::kLanguageRemapControlKeyTo,
4266 ui::chromeos::ModifierKey::kAltKey);
4267
4268 // Sends the same events once again and expect that it will be rewritten to
4269 // ALT_DOWN.
4270 details = Send(&positive);
4271 ASSERT_FALSE(details.dispatcher_destroyed);
4272 PopEvents(&events);
4273 EXPECT_EQ(1u, events.size());
4274 EXPECT_TRUE(events[0]->IsMouseWheelEvent());
afakhry1688ee312016-04-15 16:36:334275 EXPECT_FALSE(events[0]->flags() & ui::EF_CONTROL_DOWN);
4276 EXPECT_TRUE(events[0]->flags() & ui::EF_ALT_DOWN);
4277}
4278
Andrew Xu531197df2019-03-07 21:46:494279// Tests edge cases of key event rewriting (see https://crbug.com/913209).
4280TEST_F(EventRewriterAshTest, KeyEventRewritingEdgeCases) {
4281 std::vector<std::unique_ptr<ui::Event>> events;
4282
4283 // Edge case 1: Press the Launcher button first. Then press the Up Arrow
4284 // button.
4285 SendKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_COMMAND, ui::DomCode::META_LEFT,
4286 ui::DomKey::META);
4287 SendKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_UP, ui::DomCode::ARROW_UP,
4288 ui::DomKey::ARROW_UP, ui::EF_COMMAND_DOWN);
4289
4290 PopEvents(&events);
4291 EXPECT_EQ(2u, events.size());
4292 events.clear();
4293
4294 SendKeyEvent(ui::ET_KEY_RELEASED, ui::VKEY_COMMAND, ui::DomCode::META_LEFT,
4295 ui::DomKey::META);
4296 PopEvents(&events);
4297
4298 // When releasing the Launcher button, the rewritten event should be released
4299 // as well.
4300 EXPECT_EQ(2u, events.size());
4301 EXPECT_EQ(ui::VKEY_COMMAND,
4302 static_cast<ui::KeyEvent*>(events[0].get())->key_code());
4303 EXPECT_EQ(ui::VKEY_PRIOR,
4304 static_cast<ui::KeyEvent*>(events[1].get())->key_code());
4305
4306 events.clear();
4307
4308 // Edge case 2: Press the Up Arrow button first. Then press the Launch button.
4309 SendKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_UP, ui::DomCode::ARROW_UP,
4310 ui::DomKey::ARROW_UP);
4311 SendKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_COMMAND, ui::DomCode::META_LEFT,
4312 ui::DomKey::META);
4313
4314 PopEvents(&events);
4315 EXPECT_EQ(2u, events.size());
4316 events.clear();
4317
4318 SendKeyEvent(ui::ET_KEY_RELEASED, ui::VKEY_UP, ui::DomCode::ARROW_UP,
4319 ui::DomKey::ARROW_UP, ui::EF_COMMAND_DOWN);
4320 PopEvents(&events);
4321
4322 // When releasing the Up Arrow button, the rewritten event should be blocked.
4323 EXPECT_EQ(1u, events.size());
4324 EXPECT_EQ(ui::VKEY_UP,
4325 static_cast<ui::KeyEvent*>(events[0].get())->key_code());
4326}
4327
Yuichiro Hanada5841d652020-02-07 01:12:224328TEST_F(EventRewriterAshTest, ScrollEventDispatchImpl) {
4329 std::vector<std::unique_ptr<ui::Event>> events;
4330
4331 // Test scroll event is correctly modified.
4332 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
4333 ui::DomKey::CONTROL);
4334 PopEvents(&events);
4335 gfx::PointF location(0, 0);
4336 ui::ScrollEvent scroll(ui::ET_SCROLL, location, location,
4337 ui::EventTimeForNow(), 0 /* flag */, 0 /* x_offset */,
4338 1 /* y_offset */, 0 /* x_offset_ordinal */,
4339 1 /* y_offset_ordinal */, 2 /* finger */);
4340 ui::EventDispatchDetails details = Send(&scroll);
4341 ASSERT_FALSE(details.dispatcher_destroyed);
4342 PopEvents(&events);
4343 EXPECT_EQ(1u, events.size());
4344 EXPECT_TRUE(events[0]->IsScrollEvent());
4345 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
4346
4347 // Test FLING_START event deactivates the sticky key, but is modified.
4348 ui::ScrollEvent fling_start(
4349 ui::ET_SCROLL_FLING_START, location, location, ui::EventTimeForNow(),
4350 0 /* flag */, 0 /* x_offset */, 0 /* y_offset */,
4351 0 /* x_offset_ordinal */, 0 /* y_offset_ordinal */, 2 /* finger */);
4352 details = Send(&fling_start);
4353 PopEvents(&events);
4354 EXPECT_EQ(2u, events.size());
4355 EXPECT_TRUE(events[0]->IsScrollEvent());
4356 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
4357 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type());
4358 EXPECT_EQ(ui::VKEY_CONTROL,
4359 static_cast<ui::KeyEvent*>(events[1].get())->key_code());
4360
4361 // Test scroll direction change causes that modifier release event is sent.
4362 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
4363 ui::DomKey::CONTROL);
4364 details = Send(&scroll);
4365 ASSERT_FALSE(details.dispatcher_destroyed);
4366 PopEvents(&events);
4367
4368 ui::ScrollEvent scroll2(ui::ET_SCROLL, location, location,
4369 ui::EventTimeForNow(), 0 /* flag */, 0 /* x_offset */,
4370 -1 /* y_offset */, 0 /* x_offset_ordinal */,
4371 -1 /* y_offset_ordinal */, 2 /* finger */);
4372 details = Send(&scroll2);
4373 ASSERT_FALSE(details.dispatcher_destroyed);
4374 PopEvents(&events);
4375 EXPECT_EQ(2u, events.size());
4376 EXPECT_TRUE(events[0]->IsScrollEvent());
4377 EXPECT_FALSE(events[0]->flags() & ui::EF_CONTROL_DOWN);
4378 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type());
4379 EXPECT_EQ(ui::VKEY_CONTROL,
4380 static_cast<ui::KeyEvent*>(events[1].get())->key_code());
4381}
4382
[email protected]354520b2014-06-21 04:31:014383class StickyKeysOverlayTest : public EventRewriterAshTest {
4384 public:
4385 StickyKeysOverlayTest() : overlay_(NULL) {}
4386
dchengc97a0282015-01-15 23:04:244387 ~StickyKeysOverlayTest() override {}
[email protected]354520b2014-06-21 04:31:014388
dchengc97a0282015-01-15 23:04:244389 void SetUp() override {
[email protected]354520b2014-06-21 04:31:014390 EventRewriterAshTest::SetUp();
4391 overlay_ = sticky_keys_controller_->GetOverlayForTest();
4392 ASSERT_TRUE(overlay_);
4393 }
4394
4395 ash::StickyKeysOverlay* overlay_;
4396};
4397
4398TEST_F(StickyKeysOverlayTest, OneModifierEnabled) {
4399 EXPECT_FALSE(overlay_->is_visible());
4400 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
4401 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
4402
4403 // Pressing modifier key should show overlay.
kpschoedel8226fd152015-05-06 15:48:594404 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:354405 ui::DomKey::CONTROL);
[email protected]354520b2014-06-21 04:31:014406 EXPECT_TRUE(overlay_->is_visible());
4407 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED,
4408 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
4409
4410 // Pressing a normal key should hide overlay.
kpschoedela281bf12016-01-07 15:08:194411 SendActivateStickyKeyPattern(ui::VKEY_T, ui::DomCode::US_T,
kpschoedel51d2e322015-08-28 15:29:354412 ui::DomKey::Constant<'t'>::Character);
[email protected]354520b2014-06-21 04:31:014413 EXPECT_FALSE(overlay_->is_visible());
4414 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
4415 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
4416}
4417
4418TEST_F(StickyKeysOverlayTest, TwoModifiersEnabled) {
4419 EXPECT_FALSE(overlay_->is_visible());
4420 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
4421 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
4422 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
4423 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
4424
4425 // Pressing two modifiers should show overlay.
kpschoedel8226fd152015-05-06 15:48:594426 SendActivateStickyKeyPattern(ui::VKEY_SHIFT, ui::DomCode::SHIFT_LEFT,
kpschoedel51d2e322015-08-28 15:29:354427 ui::DomKey::SHIFT);
kpschoedel8226fd152015-05-06 15:48:594428 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:354429 ui::DomKey::CONTROL);
[email protected]354520b2014-06-21 04:31:014430 EXPECT_TRUE(overlay_->is_visible());
4431 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED,
4432 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
4433 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED,
4434 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
4435
4436 // Pressing a normal key should hide overlay.
kpschoedela281bf12016-01-07 15:08:194437 SendActivateStickyKeyPattern(ui::VKEY_N, ui::DomCode::US_N,
kpschoedel51d2e322015-08-28 15:29:354438 ui::DomKey::Constant<'n'>::Character);
[email protected]354520b2014-06-21 04:31:014439 EXPECT_FALSE(overlay_->is_visible());
4440 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
4441 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
4442 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
4443 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
4444}
4445
4446TEST_F(StickyKeysOverlayTest, LockedModifier) {
4447 EXPECT_FALSE(overlay_->is_visible());
4448 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
4449 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
4450
4451 // Pressing a modifier key twice should lock modifier and show overlay.
kpschoedel8226fd152015-05-06 15:48:594452 SendActivateStickyKeyPattern(ui::VKEY_LMENU, ui::DomCode::ALT_LEFT,
kpschoedel51d2e322015-08-28 15:29:354453 ui::DomKey::ALT);
kpschoedel8226fd152015-05-06 15:48:594454 SendActivateStickyKeyPattern(ui::VKEY_LMENU, ui::DomCode::ALT_LEFT,
kpschoedel51d2e322015-08-28 15:29:354455 ui::DomKey::ALT);
[email protected]354520b2014-06-21 04:31:014456 EXPECT_TRUE(overlay_->is_visible());
4457 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED,
4458 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
4459
4460 // Pressing a normal key should not hide overlay.
kpschoedela281bf12016-01-07 15:08:194461 SendActivateStickyKeyPattern(ui::VKEY_D, ui::DomCode::US_D,
kpschoedel51d2e322015-08-28 15:29:354462 ui::DomKey::Constant<'d'>::Character);
[email protected]354520b2014-06-21 04:31:014463 EXPECT_TRUE(overlay_->is_visible());
4464 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED,
4465 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
4466}
4467
4468TEST_F(StickyKeysOverlayTest, LockedAndNormalModifier) {
4469 EXPECT_FALSE(overlay_->is_visible());
4470 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
4471 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
4472 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
4473 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
4474
4475 // Pressing a modifier key twice should lock modifier and show overlay.
kpschoedel8226fd152015-05-06 15:48:594476 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:354477 ui::DomKey::CONTROL);
kpschoedel8226fd152015-05-06 15:48:594478 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:354479 ui::DomKey::CONTROL);
[email protected]354520b2014-06-21 04:31:014480 EXPECT_TRUE(overlay_->is_visible());
4481 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED,
4482 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
4483
4484 // Pressing another modifier key should still show overlay.
kpschoedel8226fd152015-05-06 15:48:594485 SendActivateStickyKeyPattern(ui::VKEY_SHIFT, ui::DomCode::SHIFT_LEFT,
kpschoedel51d2e322015-08-28 15:29:354486 ui::DomKey::SHIFT);
[email protected]354520b2014-06-21 04:31:014487 EXPECT_TRUE(overlay_->is_visible());
4488 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED,
4489 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
4490 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED,
4491 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
4492
4493 // Pressing a normal key should not hide overlay but disable normal modifier.
kpschoedela281bf12016-01-07 15:08:194494 SendActivateStickyKeyPattern(ui::VKEY_D, ui::DomCode::US_D,
kpschoedel51d2e322015-08-28 15:29:354495 ui::DomKey::Constant<'d'>::Character);
[email protected]354520b2014-06-21 04:31:014496 EXPECT_TRUE(overlay_->is_visible());
4497 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED,
4498 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
4499 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
4500 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
4501}
4502
4503TEST_F(StickyKeysOverlayTest, ModifiersDisabled) {
4504 EXPECT_FALSE(overlay_->is_visible());
4505 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
4506 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
4507 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
4508 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
4509 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
4510 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
tengs6a04ecf92014-10-09 19:56:114511 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
4512 overlay_->GetModifierKeyState(ui::EF_COMMAND_DOWN));
[email protected]354520b2014-06-21 04:31:014513
4514 // Enable modifiers.
kpschoedel8226fd152015-05-06 15:48:594515 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:354516 ui::DomKey::CONTROL);
kpschoedel8226fd152015-05-06 15:48:594517 SendActivateStickyKeyPattern(ui::VKEY_SHIFT, ui::DomCode::SHIFT_LEFT,
kpschoedel51d2e322015-08-28 15:29:354518 ui::DomKey::SHIFT);
kpschoedel8226fd152015-05-06 15:48:594519 SendActivateStickyKeyPattern(ui::VKEY_SHIFT, ui::DomCode::SHIFT_LEFT,
kpschoedel51d2e322015-08-28 15:29:354520 ui::DomKey::SHIFT);
kpschoedel8226fd152015-05-06 15:48:594521 SendActivateStickyKeyPattern(ui::VKEY_LMENU, ui::DomCode::ALT_LEFT,
kpschoedel51d2e322015-08-28 15:29:354522 ui::DomKey::ALT);
dtapuskaaf863af2016-04-21 14:33:594523 SendActivateStickyKeyPattern(ui::VKEY_COMMAND, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:134524 ui::DomKey::META);
dtapuskaaf863af2016-04-21 14:33:594525 SendActivateStickyKeyPattern(ui::VKEY_COMMAND, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:134526 ui::DomKey::META);
[email protected]354520b2014-06-21 04:31:014527
4528 EXPECT_TRUE(overlay_->is_visible());
4529 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED,
4530 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
4531 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED,
4532 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
4533 EXPECT_EQ(ash::STICKY_KEY_STATE_ENABLED,
4534 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
tengs6a04ecf92014-10-09 19:56:114535 EXPECT_EQ(ash::STICKY_KEY_STATE_LOCKED,
4536 overlay_->GetModifierKeyState(ui::EF_COMMAND_DOWN));
[email protected]354520b2014-06-21 04:31:014537
4538 // Disable modifiers and overlay should be hidden.
kpschoedel8226fd152015-05-06 15:48:594539 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:354540 ui::DomKey::CONTROL);
kpschoedel8226fd152015-05-06 15:48:594541 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:354542 ui::DomKey::CONTROL);
kpschoedel8226fd152015-05-06 15:48:594543 SendActivateStickyKeyPattern(ui::VKEY_SHIFT, ui::DomCode::SHIFT_LEFT,
kpschoedel51d2e322015-08-28 15:29:354544 ui::DomKey::SHIFT);
kpschoedel8226fd152015-05-06 15:48:594545 SendActivateStickyKeyPattern(ui::VKEY_LMENU, ui::DomCode::ALT_LEFT,
kpschoedel51d2e322015-08-28 15:29:354546 ui::DomKey::ALT);
kpschoedel8226fd152015-05-06 15:48:594547 SendActivateStickyKeyPattern(ui::VKEY_LMENU, ui::DomCode::ALT_LEFT,
kpschoedel51d2e322015-08-28 15:29:354548 ui::DomKey::ALT);
dtapuskaaf863af2016-04-21 14:33:594549 SendActivateStickyKeyPattern(ui::VKEY_COMMAND, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:134550 ui::DomKey::META);
[email protected]354520b2014-06-21 04:31:014551
4552 EXPECT_FALSE(overlay_->is_visible());
4553 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
4554 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
4555 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
4556 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
4557 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
4558 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
tengs6a04ecf92014-10-09 19:56:114559 EXPECT_EQ(ash::STICKY_KEY_STATE_DISABLED,
4560 overlay_->GetModifierKeyState(ui::EF_COMMAND_DOWN));
[email protected]354520b2014-06-21 04:31:014561}
4562
4563TEST_F(StickyKeysOverlayTest, ModifierVisibility) {
4564 // All but AltGr and Mod3 should initially be visible.
4565 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_CONTROL_DOWN));
4566 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_SHIFT_DOWN));
4567 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_ALT_DOWN));
tengs6a04ecf92014-10-09 19:56:114568 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_COMMAND_DOWN));
[email protected]354520b2014-06-21 04:31:014569 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
4570 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));
4571
4572 // Turn all modifiers on.
4573 sticky_keys_controller_->SetModifiersEnabled(true, true);
4574 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_CONTROL_DOWN));
4575 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_SHIFT_DOWN));
4576 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_ALT_DOWN));
tengs6a04ecf92014-10-09 19:56:114577 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_COMMAND_DOWN));
[email protected]354520b2014-06-21 04:31:014578 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
4579 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));
4580
4581 // Turn off Mod3.
4582 sticky_keys_controller_->SetModifiersEnabled(false, true);
4583 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
4584 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));
4585
4586 // Turn off AltGr.
4587 sticky_keys_controller_->SetModifiersEnabled(true, false);
4588 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
4589 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));
4590
4591 // Turn off AltGr and Mod3.
4592 sticky_keys_controller_->SetModifiersEnabled(false, false);
4593 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
4594 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));
[email protected]7f926752014-01-30 09:16:354595}
4596
Jimmy Gong57745db2021-04-15 04:05:544597class ExtensionRewriterInputTest : public EventRewriterAshTest,
4598 public ui::EventRewriterChromeOS::Delegate {
4599 public:
4600 ExtensionRewriterInputTest() = default;
4601 ExtensionRewriterInputTest(const ExtensionRewriterInputTest&) = delete;
4602 ExtensionRewriterInputTest& operator=(const ExtensionRewriterInputTest&) =
4603 delete;
4604 ~ExtensionRewriterInputTest() override {}
4605
4606 void SetUp() override {
4607 EventRewriterAshTest::SetUp();
Jimmy Gong82c82b42021-04-17 03:12:334608 event_rewriter_chromeos_ = std::make_unique<ui::EventRewriterChromeOS>(
4609 this, nullptr, false, &fake_ime_keyboard_);
Jimmy Gong57745db2021-04-15 04:05:544610 }
4611
4612 void SetModifierRemapping(const std::string& pref_name,
4613 ui::chromeos::ModifierKey value) {
4614 modifier_remapping_[pref_name] = static_cast<int>(value);
4615 }
4616
4617 void RegisterExtensionShortcut(ui::KeyboardCode key_code, int flags) {
4618 constexpr int kModifierMasks = ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN |
4619 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN;
4620 // No other masks should be present aside from the ones speicifed in
4621 // kModifierMasks.
4622 DCHECK((flags & kModifierMasks) == flags);
4623 registered_extension_shortcuts_.emplace(key_code, flags);
4624 }
4625
4626 void RemoveAllExtensionShortcuts() {
4627 registered_extension_shortcuts_.clear();
4628 }
4629
4630 void ExpectEventRewrittenTo(const KeyTestCase& test) {
4631 CheckKeyTestCase(event_rewriter_chromeos_.get(), test);
4632 }
4633
4634 protected:
4635 sync_preferences::TestingPrefServiceSyncable prefs_;
Jimmy Gong82c82b42021-04-17 03:12:334636 chromeos::input_method::FakeImeKeyboard fake_ime_keyboard_;
Jimmy Gong57745db2021-04-15 04:05:544637 std::unique_ptr<ui::EventRewriterChromeOS> event_rewriter_chromeos_;
4638
4639 private:
4640 // ui::EventRewriterChromeOS::Delegate:
4641 bool RewriteModifierKeys() override { return true; }
4642
4643 bool GetKeyboardRemappedPrefValue(const std::string& pref_name,
4644 int* value) const override {
4645 auto it = modifier_remapping_.find(pref_name);
4646 if (it == modifier_remapping_.end()) {
4647 return false;
4648 }
4649
4650 *value = it->second;
4651 return true;
4652 }
4653
4654 bool TopRowKeysAreFunctionKeys() const override { return false; }
4655
4656 bool IsExtensionCommandRegistered(ui::KeyboardCode key_code,
4657 int flags) const override {
4658 return base::Contains(registered_extension_shortcuts_,
4659 ui::Accelerator(key_code, flags));
4660 }
4661
4662 bool IsSearchKeyAcceleratorReserved() const override { return false; }
4663 bool NotifyDeprecatedRightClickRewrite() override { return false; }
4664 bool NotifyDeprecatedFKeyRewrite() override { return false; }
Zentaro Kavanagh7e8735052021-05-07 21:27:244665 bool NotifyDeprecatedSixPackKeyRewrite(ui::KeyboardCode key_code) override {
Jimmy Gong57745db2021-04-15 04:05:544666 return false;
4667 }
4668
4669 std::map<std::string, int> modifier_remapping_;
4670 base::flat_set<ui::Accelerator> registered_extension_shortcuts_;
4671};
4672
4673TEST_F(ExtensionRewriterInputTest, RewrittenModifier) {
4674 // Register Control + B as an extension shortcut.
4675 RegisterExtensionShortcut(ui::VKEY_B, ui::EF_CONTROL_DOWN);
4676
4677 // Check that standard extension input has no rewritten modifiers.
4678 ExpectEventRewrittenTo({ui::ET_KEY_PRESSED,
4679 {ui::VKEY_B, ui::DomCode::US_B, ui::EF_CONTROL_DOWN,
4680 ui::DomKey::Constant<'b'>::Character},
4681 {ui::VKEY_B, ui::DomCode::US_B, ui::EF_CONTROL_DOWN,
4682 ui::DomKey::Constant<'b'>::Character}});
4683
4684 // Remap Control -> Alt.
4685 SetModifierRemapping(prefs::kLanguageRemapControlKeyTo,
4686 ui::chromeos::ModifierKey::kAltKey);
4687 // Pressing Control + B should now be remapped to Alt + B.
4688 ExpectEventRewrittenTo({ui::ET_KEY_PRESSED,
4689 {ui::VKEY_B, ui::DomCode::US_B, ui::EF_CONTROL_DOWN,
4690 ui::DomKey::Constant<'b'>::Character},
4691 {ui::VKEY_B, ui::DomCode::US_B, ui::EF_ALT_DOWN,
4692 ui::DomKey::Constant<'b'>::Character}});
4693
4694 // Remap Alt -> Control.
4695 SetModifierRemapping(prefs::kLanguageRemapAltKeyTo,
4696 ui::chromeos::ModifierKey::kControlKey);
4697 // Pressing Alt + B should now be remapped to Control + B.
4698 ExpectEventRewrittenTo({ui::ET_KEY_PRESSED,
4699 {ui::VKEY_B, ui::DomCode::US_B, ui::EF_ALT_DOWN,
4700 ui::DomKey::Constant<'b'>::Character},
4701 {ui::VKEY_B, ui::DomCode::US_B, ui::EF_CONTROL_DOWN,
4702 ui::DomKey::Constant<'b'>::Character}});
4703
4704 // Remove all extension shortcuts and still expect the remapping to work.
4705 RemoveAllExtensionShortcuts();
4706
4707 ExpectEventRewrittenTo({ui::ET_KEY_PRESSED,
4708 {ui::VKEY_B, ui::DomCode::US_B, ui::EF_CONTROL_DOWN,
4709 ui::DomKey::Constant<'b'>::Character},
4710 {ui::VKEY_B, ui::DomCode::US_B, ui::EF_ALT_DOWN,
4711 ui::DomKey::Constant<'b'>::Character}});
4712 ExpectEventRewrittenTo({ui::ET_KEY_PRESSED,
4713 {ui::VKEY_B, ui::DomCode::US_B, ui::EF_ALT_DOWN,
4714 ui::DomKey::Constant<'b'>::Character},
4715 {ui::VKEY_B, ui::DomCode::US_B, ui::EF_CONTROL_DOWN,
4716 ui::DomKey::Constant<'b'>::Character}});
4717}
4718
4719TEST_F(ExtensionRewriterInputTest, RewriteNumpadExtensionCommand) {
4720 // Register Control + NUMPAD1 as an extension shortcut.
4721 RegisterExtensionShortcut(ui::VKEY_NUMPAD1, ui::EF_CONTROL_DOWN);
4722 // Check that extension shortcuts that involve numpads keys are properly
4723 // rewritten. Note that VKEY_END is associated with NUMPAD1 if Num Lock is
4724 // disabled. The result should be "NumPad 1 with Control".
4725 ExpectEventRewrittenTo(
4726 {ui::ET_KEY_PRESSED,
4727 {ui::VKEY_END, ui::DomCode::NUMPAD1, ui::EF_CONTROL_DOWN,
4728 ui::DomKey::END},
4729 {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_CONTROL_DOWN,
4730 ui::DomKey::Constant<'1'>::Character}});
4731
4732 // Remove the extension shortcut and expect the numpad event to still be
4733 // rewritten.
4734 RemoveAllExtensionShortcuts();
4735 ExpectEventRewrittenTo(
4736 {ui::ET_KEY_PRESSED,
4737 {ui::VKEY_END, ui::DomCode::NUMPAD1, ui::EF_CONTROL_DOWN,
4738 ui::DomKey::END},
4739 {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_CONTROL_DOWN,
4740 ui::DomKey::Constant<'1'>::Character}});
4741}
4742
[email protected]9d6182f2014-02-16 04:21:564743} // namespace chromeos