blob: cdcf3bce5b52131f7e3ed65a89218e9ca3b5da58 [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 Choi283631d82021-08-10 01:55:3318#include "chrome/browser/ash/events/event_rewriter_delegate_impl.h"
Yeunjoo Choi2ef58f42021-07-28 09:28:0419#include "chrome/browser/ash/input_method/input_method_configuration.h"
Yeunjoo Choic039c6f12021-07-29 10:49:3620#include "chrome/browser/ash/input_method/mock_input_method_manager_impl.h"
Henrique Ferreiro1ab7f12f2021-03-04 19:54:4021#include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
Zentaro Kavanagh531da3d2021-02-24 18:21:2622#include "chrome/browser/ash/notifications/deprecation_notification_controller.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"
Henrique Ferreiro1220b392021-09-16 19:58:0734#include "ui/base/ime/ash/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
Yeunjoo Choid5ec14b72021-08-11 00:57:22172namespace ash {
[email protected]9d6182f2014-02-16 04:21:56173
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;
Yeunjoo Choiea95732e2021-08-06 01:38:58183 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 =
Yeunjoo Choid5ec14b72021-08-11 00:57:22186 std::make_unique<DeprecationNotificationController>(&message_center_);
Zentaro Kavanagh531da3d2021-02-24 18:21:26187 deprecation_controller_ = deprecation_controller.get();
188 delegate_ = std::make_unique<EventRewriterDelegateImpl>(
189 nullptr, std::move(deprecation_controller));
penghuange5df2822017-03-16 22:54:36190 delegate_->set_pref_service_for_testing(prefs());
Zentaro Kavanagh358a88252020-05-13 19:48:07191 device_data_manager_test_api_.SetKeyboardDevices({});
Jimmy Gong82c82b42021-04-17 03:12:33192 rewriter_ = std::make_unique<ui::EventRewriterChromeOS>(
193 delegate_.get(), nullptr, false, &fake_ime_keyboard_);
Scott Violet6ac56412018-12-19 17:25:50194 ChromeAshTestBase::SetUp();
[email protected]59409342012-09-21 01:03:43195 }
196
dchengc97a0282015-01-15 23:04:24197 void TearDown() override {
Scott Violet6ac56412018-12-19 17:25:50198 ChromeAshTestBase::TearDown();
[email protected]59409342012-09-21 01:03:43199 // Shutdown() deletes the IME mock object.
Yeunjoo Choiea95732e2021-08-06 01:38:58200 input_method::Shutdown();
[email protected]18fdab02012-06-25 17:04:53201 }
[email protected]350c9232012-05-25 04:16:06202
Yuichiro Hanada87c6e552020-02-07 01:07:37203 ui::EventRewriter* rewriter() { return rewriter_.get(); }
204
[email protected]350c9232012-05-25 04:16:06205 protected:
[email protected]25ab8f12013-02-01 14:30:15206 void TestRewriteNumPadKeys();
207 void TestRewriteNumPadKeysOnAppleKeyboard();
208
Zentaro Kavanaghe7133ce2019-05-30 00:22:14209 // Parameterized version of test depending on feature flag values. The feature
210 // kUseSearchClickForRightClick determines if this should test for alt-click
211 // or search-click.
212 void DontRewriteIfNotRewritten(int right_click_flags);
213
Yuichiro Hanada875de4f32020-02-15 00:48:37214 ui::MouseEvent RewriteMouseButtonEvent(const ui::MouseEvent& event) {
215 TestEventRewriterContinuation continuation;
216 rewriter_->RewriteMouseButtonEventForTesting(
217 event, continuation.weak_ptr_factory_.GetWeakPtr());
218 if (!continuation.rewritten_events.empty())
219 return ui::MouseEvent(*continuation.rewritten_events[0]->AsMouseEvent());
220 return ui::MouseEvent(event);
[email protected]7f926752014-01-30 09:16:35221 }
222
penghuange5df2822017-03-16 22:54:36223 sync_preferences::TestingPrefServiceSyncable* prefs() { return &prefs_; }
224
Blake O'Harea09fa45a2017-10-13 04:19:58225 void InitModifierKeyPref(IntegerPrefMember* int_pref,
226 const std::string& pref_name,
227 ui::chromeos::ModifierKey modifierKey) {
228 if (int_pref->GetPrefName() != pref_name) // skip if already initialized.
229 int_pref->Init(pref_name, prefs());
230 int_pref->SetValue(static_cast<int>(modifierKey));
231 }
232
Zentaro Kavanagh1e7d867c2020-05-13 01:18:44233 void SetupKeyboard(const std::string& name,
234 const std::string& layout = "",
Zentaro Kavanaghc65969ef2020-05-14 00:58:43235 ui::InputDeviceType type = ui::INPUT_DEVICE_INTERNAL,
236 bool has_custom_top_row = false) {
Zentaro Kavanagh358a88252020-05-13 19:48:07237 // Add a fake device to udev.
238 const ui::InputDevice keyboard(kKeyboardDeviceId, type, name, /*phys=*/"",
239 base::FilePath(kKbdSysPath), /*vendor=*/-1,
240 /*product=*/-1, /*version=*/-1);
Zentaro Kavanaghc65969ef2020-05-14 00:58:43241
242 // Old CrOS keyboards supply an integer/enum as a sysfs property to identify
243 // their layout type. New keyboards provide the mapping of scan codes to
244 // F-Key position via an attribute.
Zentaro Kavanagh358a88252020-05-13 19:48:07245 std::map<std::string, std::string> sysfs_properties;
Zentaro Kavanaghc65969ef2020-05-14 00:58:43246 std::map<std::string, std::string> sysfs_attributes;
247 if (has_custom_top_row) {
248 if (!layout.empty())
249 sysfs_attributes[kKbdTopRowLayoutAttributeName] = layout;
250 } else {
251 if (!layout.empty())
252 sysfs_properties[kKbdTopRowPropertyName] = layout;
253 }
Zentaro Kavanagh358a88252020-05-13 19:48:07254
255 fake_udev_.Reset();
Zentaro Kavanaghc65969ef2020-05-14 00:58:43256 fake_udev_.AddFakeDevice(keyboard.name, keyboard.sys_path.value(),
Anton Bikineev46bbb972021-05-15 17:53:53257 /*subsystem=*/"input", /*devnode=*/absl::nullopt,
258 /*devtype=*/absl::nullopt,
Matt Reynolds0f9a4032021-02-27 01:29:26259 std::move(sysfs_attributes),
Zentaro Kavanagh358a88252020-05-13 19:48:07260 std::move(sysfs_properties));
261
262 // Reset the state of the device manager.
263 device_data_manager_test_api_.SetKeyboardDevices({});
264 device_data_manager_test_api_.SetKeyboardDevices({keyboard});
265
266 // Reset the state of the EventRewriter.
Dmitry Torokhov3e2b7d82020-02-13 18:04:43267 rewriter_->ResetStateForTesting();
Zentaro Kavanagh358a88252020-05-13 19:48:07268 rewriter_->KeyboardDeviceAddedForTesting(kKeyboardDeviceId);
Dmitry Torokhov3e2b7d82020-02-13 18:04:43269 rewriter_->set_last_keyboard_device_id_for_testing(kKeyboardDeviceId);
Zentaro Kavanagh1e7d867c2020-05-13 01:18:44270 }
Dmitry Torokhov3e2b7d82020-02-13 18:04:43271
Zentaro Kavanagh1e7d867c2020-05-13 01:18:44272 void TestKeyboard(const std::string& name,
273 const std::string& layout,
274 ui::InputDeviceType type,
Zentaro Kavanaghc65969ef2020-05-14 00:58:43275 bool has_custom_top_row,
Zentaro Kavanagh1e7d867c2020-05-13 01:18:44276 const std::vector<KeyTestCase>& tests) {
Zentaro Kavanaghc65969ef2020-05-14 00:58:43277 SetupKeyboard(name, layout, type, has_custom_top_row);
Zentaro Kavanagh531da3d2021-02-24 18:21:26278 for (const auto& test : tests) {
Dmitry Torokhov3e2b7d82020-02-13 18:04:43279 CheckKeyTestCase(rewriter(), test);
Zentaro Kavanagh531da3d2021-02-24 18:21:26280 const size_t expected_notification_count =
281 test.triggers_notification ? 1 : 0;
282 EXPECT_EQ(message_center_.NotificationCount(),
283 expected_notification_count);
284 ClearNotifications();
285 }
Dmitry Torokhov3e2b7d82020-02-13 18:04:43286 }
287
288 void TestInternalChromeKeyboard(const std::vector<KeyTestCase>& tests) {
289 TestKeyboard("Internal Keyboard", kKbdTopRowLayoutUnspecified,
Zentaro Kavanaghc65969ef2020-05-14 00:58:43290 ui::INPUT_DEVICE_INTERNAL, /*has_custom_top_row=*/false,
291 tests);
292 }
293
294 void TestInternalChromeCustomLayoutKeyboard(
295 const std::vector<KeyTestCase>& tests) {
296 TestKeyboard("Internal Custom Layout Keyboard",
297 kKbdDefaultCustomTopRowLayout, ui::INPUT_DEVICE_INTERNAL,
298 /*has_custom_top_row=*/true, tests);
Dmitry Torokhov3e2b7d82020-02-13 18:04:43299 }
300
301 void TestExternalChromeKeyboard(const std::vector<KeyTestCase>& tests) {
302 TestKeyboard("External Chrome Keyboard", kKbdTopRowLayout1Tag,
Zentaro Kavanaghc65969ef2020-05-14 00:58:43303 ui::INPUT_DEVICE_UNKNOWN, /*has_custom_top_row=*/false, tests);
304 }
305
306 void TestExternalChromeCustomLayoutKeyboard(
307 const std::vector<KeyTestCase>& tests) {
308 TestKeyboard("External Chrome Custom Layout Keyboard",
309 kKbdDefaultCustomTopRowLayout, ui::INPUT_DEVICE_UNKNOWN,
310 /*has_custom_top_row=*/true, tests);
Dmitry Torokhov3e2b7d82020-02-13 18:04:43311 }
312
313 void TestExternalGenericKeyboard(const std::vector<KeyTestCase>& tests) {
314 TestKeyboard("PC Keyboard", kKbdTopRowLayoutUnspecified,
Zentaro Kavanaghc65969ef2020-05-14 00:58:43315 ui::INPUT_DEVICE_UNKNOWN, /*has_custom_top_row=*/false, tests);
Dmitry Torokhov3e2b7d82020-02-13 18:04:43316 }
317
318 void TestExternalAppleKeyboard(const std::vector<KeyTestCase>& tests) {
319 TestKeyboard("Apple Keyboard", kKbdTopRowLayoutUnspecified,
Zentaro Kavanaghc65969ef2020-05-14 00:58:43320 ui::INPUT_DEVICE_UNKNOWN, /*has_custom_top_row=*/false, tests);
Dmitry Torokhov3e2b7d82020-02-13 18:04:43321 }
322
323 void TestChromeKeyboardVariants(const std::vector<KeyTestCase>& tests) {
324 TestInternalChromeKeyboard(tests);
325 TestExternalChromeKeyboard(tests);
326 }
327
Zentaro Kavanaghc65969ef2020-05-14 00:58:43328 void TestChromeCustomLayoutKeyboardVariants(
329 const std::vector<KeyTestCase>& tests) {
330 TestInternalChromeCustomLayoutKeyboard(tests);
331 TestExternalChromeCustomLayoutKeyboard(tests);
332 }
333
Dmitry Torokhov3e2b7d82020-02-13 18:04:43334 void TestNonAppleKeyboardVariants(const std::vector<KeyTestCase>& tests) {
335 TestChromeKeyboardVariants(tests);
Zentaro Kavanaghc65969ef2020-05-14 00:58:43336 TestChromeCustomLayoutKeyboardVariants(tests);
337 TestExternalGenericKeyboard(tests);
338 }
339
340 void TestNonAppleNonCustomLayoutKeyboardVariants(
341 const std::vector<KeyTestCase>& tests) {
342 TestChromeKeyboardVariants(tests);
Dmitry Torokhov3e2b7d82020-02-13 18:04:43343 TestExternalGenericKeyboard(tests);
344 }
345
346 void TestAllKeyboardVariants(const std::vector<KeyTestCase>& tests) {
347 TestNonAppleKeyboardVariants(tests);
348 TestExternalAppleKeyboard(tests);
349 }
350
Zentaro Kavanaghd6112d82021-02-19 21:21:32351 void ClearNotifications() {
352 message_center_.RemoveAllNotifications(
353 false, message_center::FakeMessageCenter::RemoveType::ALL);
Zentaro Kavanagh531da3d2021-02-24 18:21:26354 deprecation_controller_->ResetStateForTesting();
Zentaro Kavanaghd6112d82021-02-19 21:21:32355 }
356
Zentaro Kavanaghe7133ce2019-05-30 00:22:14357 base::test::ScopedFeatureList scoped_feature_list_;
azurewei045de382017-01-06 02:06:00358 FakeChromeUserManager* fake_user_manager_; // Not owned.
Xiyuan Xiadfe3a9f2017-11-13 21:46:26359 user_manager::ScopedUserManager user_manager_enabler_;
azurewei045de382017-01-06 02:06:00360 input_method::MockInputMethodManagerImpl* input_method_manager_mock_;
Zentaro Kavanagh358a88252020-05-13 19:48:07361 testing::FakeUdevLoader fake_udev_;
362 ui::DeviceDataManagerTestApi device_data_manager_test_api_;
penghuange5df2822017-03-16 22:54:36363
364 sync_preferences::TestingPrefServiceSyncable prefs_;
365 std::unique_ptr<EventRewriterDelegateImpl> delegate_;
Jimmy Gong82c82b42021-04-17 03:12:33366 chromeos::input_method::FakeImeKeyboard fake_ime_keyboard_;
penghuange5df2822017-03-16 22:54:36367 std::unique_ptr<ui::EventRewriterChromeOS> rewriter_;
Yeunjoo Choid5ec14b72021-08-11 00:57:22368 DeprecationNotificationController* deprecation_controller_; // Not owned.
Zentaro Kavanaghd6112d82021-02-19 21:21:32369 message_center::FakeMessageCenter message_center_;
[email protected]350c9232012-05-25 04:16:06370};
371
[email protected]b9d224c2012-07-13 01:09:03372TEST_F(EventRewriterTest, TestRewriteCommandToControl) {
Dmitry Torokhov3e2b7d82020-02-13 18:04:43373 // First, test non Apple keyboards, they should all behave the same.
374 TestNonAppleKeyboardVariants({
[email protected]106cf972014-05-28 17:28:17375 // VKEY_A, Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29376 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19377 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN,
kpschoedel51d2e322015-08-28 15:29:35378 ui::DomKey::UNIDENTIFIED},
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}},
[email protected]d13e288992014-05-01 18:00:21381
[email protected]106cf972014-05-28 17:28:17382 // VKEY_A, Win modifier.
kpschoedel02c854d2015-06-16 14:44:29383 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19384 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:35385 ui::DomKey::UNIDENTIFIED},
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}},
[email protected]d13e288992014-05-01 18:00:21388
[email protected]106cf972014-05-28 17:28:17389 // VKEY_A, Alt+Win modifier.
kpschoedel02c854d2015-06-16 14:44:29390 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19391 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:35392 ui::DomKey::UNIDENTIFIED},
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}},
[email protected]350c9232012-05-25 04:16:06395
[email protected]106cf972014-05-28 17:28:17396 // VKEY_LWIN (left Windows key), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29397 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59398 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:13399 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, ui::DomKey::META},
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}},
[email protected]350c9232012-05-25 04:16:06402
[email protected]106cf972014-05-28 17:28:17403 // VKEY_RWIN (right Windows key), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29404 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59405 {ui::VKEY_RWIN, ui::DomCode::META_RIGHT,
kpschoedel0a8b03052016-02-17 15:35:13406 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, ui::DomKey::META},
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}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:43409 });
[email protected]350c9232012-05-25 04:16:06410
Ahmed Fakhry629985b2018-07-30 20:57:32411 // Simulate the default initialization of the Apple Command key remap pref to
412 // Ctrl.
413 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
414
Dmitry Torokhov3e2b7d82020-02-13 18:04:43415 TestExternalAppleKeyboard({
[email protected]106cf972014-05-28 17:28:17416 // VKEY_A, Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29417 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19418 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN,
kpschoedel51d2e322015-08-28 15:29:35419 ui::DomKey::UNIDENTIFIED},
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}},
[email protected]350c9232012-05-25 04:16:06422
[email protected]106cf972014-05-28 17:28:17423 // VKEY_A, Win modifier.
kpschoedel02c854d2015-06-16 14:44:29424 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19425 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:35426 ui::DomKey::UNIDENTIFIED},
kpschoedela281bf12016-01-07 15:08:19427 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:53428 ui::DomKey::Constant<'a'>::Character}},
[email protected]350c9232012-05-25 04:16:06429
[email protected]106cf972014-05-28 17:28:17430 // VKEY_A, Alt+Win modifier.
kpschoedel02c854d2015-06-16 14:44:29431 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19432 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:35433 ui::DomKey::UNIDENTIFIED},
kpschoedela281bf12016-01-07 15:08:19434 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:53435 ui::DomKey::Constant<'a'>::Character}},
[email protected]350c9232012-05-25 04:16:06436
[email protected]106cf972014-05-28 17:28:17437 // VKEY_LWIN (left Windows key), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29438 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59439 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:13440 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:35441 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
442 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::CONTROL}},
[email protected]350c9232012-05-25 04:16:06443
[email protected]106cf972014-05-28 17:28:17444 // VKEY_RWIN (right Windows key), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29445 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59446 {ui::VKEY_RWIN, ui::DomCode::META_RIGHT,
kpschoedel0a8b03052016-02-17 15:35:13447 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:35448 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_RIGHT,
449 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::CONTROL}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:43450 });
Ahmed Fakhry629985b2018-07-30 20:57:32451
452 // Now simulate the user remapped the Command key back to Search.
453 IntegerPrefMember command;
454 InitModifierKeyPref(&command, prefs::kLanguageRemapExternalCommandKeyTo,
455 ui::chromeos::ModifierKey::kSearchKey);
456
Dmitry Torokhov3e2b7d82020-02-13 18:04:43457 TestExternalAppleKeyboard({
Ahmed Fakhry629985b2018-07-30 20:57:32458 // VKEY_A, Win modifier.
459 {ui::ET_KEY_PRESSED,
460 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_COMMAND_DOWN,
461 ui::DomKey::UNIDENTIFIED},
462 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_COMMAND_DOWN,
463 ui::DomKey::UNIDENTIFIED}},
464
465 // VKEY_A, Alt+Win modifier.
466 {ui::ET_KEY_PRESSED,
467 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
468 ui::DomKey::UNIDENTIFIED},
469 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
470 ui::DomKey::UNIDENTIFIED}},
471
472 // VKEY_LWIN (left Windows key), Alt modifier.
473 {ui::ET_KEY_PRESSED,
474 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
475 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
476 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
477 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META}},
478
479 // VKEY_RWIN (right Windows key), Alt modifier.
480 {ui::ET_KEY_PRESSED,
481 {ui::VKEY_RWIN, ui::DomCode::META_RIGHT,
482 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
483 {ui::VKEY_LWIN, ui::DomCode::META_RIGHT,
484 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:43485 });
Ahmed Fakhry629985b2018-07-30 20:57:32486}
487
488TEST_F(EventRewriterTest, TestRewriteExternalMetaKey) {
489 // Simulate the default initialization of the Meta key on external keyboards
490 // remap pref to Search.
491 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
492
Dmitry Torokhov3e2b7d82020-02-13 18:04:43493 // By default, the Meta key on all keyboards, internal, external Chrome OS
494 // branded keyboards, and Generic keyboards should produce Search.
495 TestNonAppleKeyboardVariants({
Ahmed Fakhry629985b2018-07-30 20:57:32496 // VKEY_A, Win modifier.
497 {ui::ET_KEY_PRESSED,
498 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_COMMAND_DOWN,
499 ui::DomKey::UNIDENTIFIED},
500 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_COMMAND_DOWN,
Dmitry Torokhov3e2b7d82020-02-13 18:04:43501 ui::DomKey::UNIDENTIFIED}},
Ahmed Fakhry629985b2018-07-30 20:57:32502
503 // VKEY_A, Alt+Win modifier.
504 {ui::ET_KEY_PRESSED,
505 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
506 ui::DomKey::UNIDENTIFIED},
507 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
Dmitry Torokhov3e2b7d82020-02-13 18:04:43508 ui::DomKey::UNIDENTIFIED}},
Ahmed Fakhry629985b2018-07-30 20:57:32509
510 // VKEY_LWIN (left Windows key), Alt modifier.
511 {ui::ET_KEY_PRESSED,
512 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
513 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
514 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
Dmitry Torokhov3e2b7d82020-02-13 18:04:43515 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META}},
Ahmed Fakhry629985b2018-07-30 20:57:32516
517 // VKEY_RWIN (right Windows key), Alt modifier.
518 {ui::ET_KEY_PRESSED,
519 {ui::VKEY_RWIN, ui::DomCode::META_RIGHT,
520 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
521 {ui::VKEY_LWIN, ui::DomCode::META_RIGHT,
Dmitry Torokhov3e2b7d82020-02-13 18:04:43522 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META}},
523 });
Ahmed Fakhry629985b2018-07-30 20:57:32524
Dmitry Torokhov3e2b7d82020-02-13 18:04:43525 // Both preferences for Search on Chrome keyboards, and external Meta on
526 // generic external keyboards are independent, even if one or both are
527 // modified.
Ahmed Fakhry629985b2018-07-30 20:57:32528
Dmitry Torokhov3e2b7d82020-02-13 18:04:43529 // Remap Chrome OS Search to Ctrl.
Ahmed Fakhry629985b2018-07-30 20:57:32530 IntegerPrefMember internal_search;
531 InitModifierKeyPref(&internal_search, prefs::kLanguageRemapSearchKeyTo,
532 ui::chromeos::ModifierKey::kControlKey);
533
Dmitry Torokhov3e2b7d82020-02-13 18:04:43534 // Remap external Meta to Alt.
Ahmed Fakhry629985b2018-07-30 20:57:32535 IntegerPrefMember meta;
536 InitModifierKeyPref(&meta, prefs::kLanguageRemapExternalMetaKeyTo,
537 ui::chromeos::ModifierKey::kAltKey);
538
Dmitry Torokhov3e2b7d82020-02-13 18:04:43539 TestChromeKeyboardVariants({
Ahmed Fakhry629985b2018-07-30 20:57:32540 // VKEY_A, Win modifier.
541 {ui::ET_KEY_PRESSED,
542 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_COMMAND_DOWN,
543 ui::DomKey::UNIDENTIFIED},
544 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_CONTROL_DOWN,
Dmitry Torokhov3e2b7d82020-02-13 18:04:43545 ui::DomKey::Constant<'a'>::Character}},
Ahmed Fakhry629985b2018-07-30 20:57:32546
547 // VKEY_A, Alt+Win modifier.
548 {ui::ET_KEY_PRESSED,
549 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
550 ui::DomKey::UNIDENTIFIED},
551 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
Dmitry Torokhov3e2b7d82020-02-13 18:04:43552 ui::DomKey::Constant<'a'>::Character}},
Ahmed Fakhry629985b2018-07-30 20:57:32553
554 // VKEY_LWIN (left Windows key), Alt modifier.
555 {ui::ET_KEY_PRESSED,
556 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
557 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
558 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
Dmitry Torokhov3e2b7d82020-02-13 18:04:43559 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::CONTROL}},
Ahmed Fakhry629985b2018-07-30 20:57:32560
561 // VKEY_RWIN (right Windows key), Alt modifier.
562 {ui::ET_KEY_PRESSED,
563 {ui::VKEY_RWIN, ui::DomCode::META_RIGHT,
564 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
565 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_RIGHT,
Dmitry Torokhov3e2b7d82020-02-13 18:04:43566 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::CONTROL}},
567 });
Ahmed Fakhry629985b2018-07-30 20:57:32568
Dmitry Torokhov3e2b7d82020-02-13 18:04:43569 TestExternalGenericKeyboard({
Ahmed Fakhry629985b2018-07-30 20:57:32570 // VKEY_A, Win modifier.
571 {ui::ET_KEY_PRESSED,
572 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_COMMAND_DOWN,
573 ui::DomKey::UNIDENTIFIED},
574 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN,
Dmitry Torokhov3e2b7d82020-02-13 18:04:43575 ui::DomKey::Constant<'a'>::Character}},
Ahmed Fakhry629985b2018-07-30 20:57:32576
577 // VKEY_A, Alt+Win modifier.
578 {ui::ET_KEY_PRESSED,
579 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
580 ui::DomKey::UNIDENTIFIED},
581 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN,
Dmitry Torokhov3e2b7d82020-02-13 18:04:43582 ui::DomKey::Constant<'a'>::Character}},
Ahmed Fakhry629985b2018-07-30 20:57:32583
584 // VKEY_LWIN (left Windows key), Alt modifier.
585 {ui::ET_KEY_PRESSED,
586 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
587 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
Dmitry Torokhov3e2b7d82020-02-13 18:04:43588 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN,
589 ui::DomKey::ALT}},
Ahmed Fakhry629985b2018-07-30 20:57:32590
591 // VKEY_RWIN (right Windows key), Alt modifier.
592 {ui::ET_KEY_PRESSED,
593 {ui::VKEY_RWIN, ui::DomCode::META_RIGHT,
594 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
595 {ui::VKEY_MENU, ui::DomCode::ALT_RIGHT, ui::EF_ALT_DOWN,
Dmitry Torokhov3e2b7d82020-02-13 18:04:43596 ui::DomKey::ALT}},
597 });
[email protected]9822df92012-03-31 03:52:56598}
[email protected]2d1934f2012-04-19 18:51:22599
[email protected]216d9162012-06-22 01:48:16600// For crbug.com/133896.
[email protected]b9d224c2012-07-13 01:09:03601TEST_F(EventRewriterTest, TestRewriteCommandToControlWithControlRemapped) {
[email protected]216d9162012-06-22 01:48:16602 // Remap Control to Alt.
penghuange5df2822017-03-16 22:54:36603 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]216d9162012-06-22 01:48:16604 IntegerPrefMember control;
Blake O'Harea09fa45a2017-10-13 04:19:58605 InitModifierKeyPref(&control, prefs::kLanguageRemapControlKeyTo,
606 ui::chromeos::ModifierKey::kAltKey);
[email protected]216d9162012-06-22 01:48:16607
Dmitry Torokhov3e2b7d82020-02-13 18:04:43608 TestNonAppleKeyboardVariants({
kpschoedel8226fd152015-05-06 15:48:59609 // Control should be remapped to Alt.
kpschoedel02c854d2015-06-16 14:44:29610 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35611 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
612 ui::DomKey::CONTROL},
613 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN,
614 ui::DomKey::ALT}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:43615 });
[email protected]106cf972014-05-28 17:28:17616
Dmitry Torokhov3e2b7d82020-02-13 18:04:43617 // Now verify that remapping does not affect Apple keyboard.
618 TestExternalAppleKeyboard({
[email protected]106cf972014-05-28 17:28:17619 // VKEY_LWIN (left Command key) with Alt modifier. The remapped Command
620 // key should never be re-remapped to Alt.
kpschoedel02c854d2015-06-16 14:44:29621 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59622 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:13623 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:35624 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
625 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::CONTROL}},
[email protected]216d9162012-06-22 01:48:16626
[email protected]106cf972014-05-28 17:28:17627 // VKEY_RWIN (right Command key) with Alt modifier. The remapped Command
628 // key should never be re-remapped to Alt.
kpschoedel02c854d2015-06-16 14:44:29629 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59630 {ui::VKEY_RWIN, ui::DomCode::META_RIGHT,
kpschoedel0a8b03052016-02-17 15:35:13631 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:35632 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_RIGHT,
633 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::CONTROL}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:43634 });
[email protected]216d9162012-06-22 01:48:16635}
636
[email protected]25ab8f12013-02-01 14:30:15637void EventRewriterTest::TestRewriteNumPadKeys() {
Dmitry Torokhov3e2b7d82020-02-13 18:04:43638 // Even if most Chrome OS keyboards do not have numpad, they should still
639 // handle it the same way as generic PC keyboards.
640 TestNonAppleKeyboardVariants({
[email protected]106cf972014-05-28 17:28:17641 // XK_KP_Insert (= NumPad 0 without Num Lock), no modifier.
kpschoedel02c854d2015-06-16 14:44:29642 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35643 {ui::VKEY_INSERT, ui::DomCode::NUMPAD0, ui::EF_NONE, ui::DomKey::INSERT},
644 {ui::VKEY_NUMPAD0, ui::DomCode::NUMPAD0, ui::EF_NONE,
645 ui::DomKey::Constant<'0'>::Character}},
[email protected]350c9232012-05-25 04:16:06646
[email protected]106cf972014-05-28 17:28:17647 // XK_KP_Insert (= NumPad 0 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29648 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35649 {ui::VKEY_INSERT, ui::DomCode::NUMPAD0, ui::EF_ALT_DOWN,
650 ui::DomKey::INSERT},
651 {ui::VKEY_NUMPAD0, ui::DomCode::NUMPAD0, ui::EF_ALT_DOWN,
652 ui::DomKey::Constant<'0'>::Character}},
[email protected]350c9232012-05-25 04:16:06653
[email protected]106cf972014-05-28 17:28:17654 // XK_KP_Delete (= NumPad . without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29655 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35656 {ui::VKEY_DELETE, ui::DomCode::NUMPAD_DECIMAL, ui::EF_ALT_DOWN,
657 ui::DomKey::DEL},
658 {ui::VKEY_DECIMAL, ui::DomCode::NUMPAD_DECIMAL, ui::EF_ALT_DOWN,
659 ui::DomKey::Constant<'.'>::Character}},
[email protected]350c9232012-05-25 04:16:06660
[email protected]106cf972014-05-28 17:28:17661 // XK_KP_End (= NumPad 1 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29662 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35663 {ui::VKEY_END, ui::DomCode::NUMPAD1, ui::EF_ALT_DOWN, ui::DomKey::END},
664 {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_ALT_DOWN,
665 ui::DomKey::Constant<'1'>::Character}},
[email protected]350c9232012-05-25 04:16:06666
[email protected]106cf972014-05-28 17:28:17667 // XK_KP_Down (= NumPad 2 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29668 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35669 {ui::VKEY_DOWN, ui::DomCode::NUMPAD2, ui::EF_ALT_DOWN,
670 ui::DomKey::ARROW_DOWN},
671 {ui::VKEY_NUMPAD2, ui::DomCode::NUMPAD2, ui::EF_ALT_DOWN,
672 ui::DomKey::Constant<'2'>::Character}},
[email protected]350c9232012-05-25 04:16:06673
[email protected]106cf972014-05-28 17:28:17674 // XK_KP_Next (= NumPad 3 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29675 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35676 {ui::VKEY_NEXT, ui::DomCode::NUMPAD3, ui::EF_ALT_DOWN,
677 ui::DomKey::PAGE_DOWN},
678 {ui::VKEY_NUMPAD3, ui::DomCode::NUMPAD3, ui::EF_ALT_DOWN,
679 ui::DomKey::Constant<'3'>::Character}},
[email protected]350c9232012-05-25 04:16:06680
[email protected]106cf972014-05-28 17:28:17681 // XK_KP_Left (= NumPad 4 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29682 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35683 {ui::VKEY_LEFT, ui::DomCode::NUMPAD4, ui::EF_ALT_DOWN,
684 ui::DomKey::ARROW_LEFT},
685 {ui::VKEY_NUMPAD4, ui::DomCode::NUMPAD4, ui::EF_ALT_DOWN,
686 ui::DomKey::Constant<'4'>::Character}},
[email protected]350c9232012-05-25 04:16:06687
[email protected]106cf972014-05-28 17:28:17688 // XK_KP_Begin (= NumPad 5 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29689 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35690 {ui::VKEY_CLEAR, ui::DomCode::NUMPAD5, ui::EF_ALT_DOWN,
691 ui::DomKey::CLEAR},
692 {ui::VKEY_NUMPAD5, ui::DomCode::NUMPAD5, ui::EF_ALT_DOWN,
693 ui::DomKey::Constant<'5'>::Character}},
[email protected]350c9232012-05-25 04:16:06694
[email protected]106cf972014-05-28 17:28:17695 // XK_KP_Right (= NumPad 6 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29696 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35697 {ui::VKEY_RIGHT, ui::DomCode::NUMPAD6, ui::EF_ALT_DOWN,
698 ui::DomKey::ARROW_RIGHT},
699 {ui::VKEY_NUMPAD6, ui::DomCode::NUMPAD6, ui::EF_ALT_DOWN,
700 ui::DomKey::Constant<'6'>::Character}},
[email protected]350c9232012-05-25 04:16:06701
[email protected]106cf972014-05-28 17:28:17702 // XK_KP_Home (= NumPad 7 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29703 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35704 {ui::VKEY_HOME, ui::DomCode::NUMPAD7, ui::EF_ALT_DOWN, ui::DomKey::HOME},
705 {ui::VKEY_NUMPAD7, ui::DomCode::NUMPAD7, ui::EF_ALT_DOWN,
706 ui::DomKey::Constant<'7'>::Character}},
[email protected]350c9232012-05-25 04:16:06707
[email protected]106cf972014-05-28 17:28:17708 // XK_KP_Up (= NumPad 8 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29709 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35710 {ui::VKEY_UP, ui::DomCode::NUMPAD8, ui::EF_ALT_DOWN,
711 ui::DomKey::ARROW_UP},
712 {ui::VKEY_NUMPAD8, ui::DomCode::NUMPAD8, ui::EF_ALT_DOWN,
713 ui::DomKey::Constant<'8'>::Character}},
[email protected]350c9232012-05-25 04:16:06714
[email protected]106cf972014-05-28 17:28:17715 // XK_KP_Prior (= NumPad 9 without Num Lock), Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29716 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35717 {ui::VKEY_PRIOR, ui::DomCode::NUMPAD9, ui::EF_ALT_DOWN,
718 ui::DomKey::PAGE_UP},
719 {ui::VKEY_NUMPAD9, ui::DomCode::NUMPAD9, ui::EF_ALT_DOWN,
720 ui::DomKey::Constant<'9'>::Character}},
[email protected]350c9232012-05-25 04:16:06721
[email protected]106cf972014-05-28 17:28:17722 // XK_KP_0 (= NumPad 0 with Num Lock), Num Lock modifier.
kpschoedel02c854d2015-06-16 14:44:29723 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35724 {ui::VKEY_NUMPAD0, ui::DomCode::NUMPAD0, ui::EF_NONE,
725 ui::DomKey::Constant<'0'>::Character},
726 {ui::VKEY_NUMPAD0, ui::DomCode::NUMPAD0, ui::EF_NONE,
727 ui::DomKey::Constant<'0'>::Character}},
[email protected]350c9232012-05-25 04:16:06728
[email protected]106cf972014-05-28 17:28:17729 // XK_KP_DECIMAL (= NumPad . with Num Lock), Num Lock modifier.
kpschoedel02c854d2015-06-16 14:44:29730 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35731 {ui::VKEY_DECIMAL, ui::DomCode::NUMPAD_DECIMAL, ui::EF_NONE,
732 ui::DomKey::Constant<'.'>::Character},
733 {ui::VKEY_DECIMAL, ui::DomCode::NUMPAD_DECIMAL, ui::EF_NONE,
734 ui::DomKey::Constant<'.'>::Character}},
[email protected]350c9232012-05-25 04:16:06735
[email protected]106cf972014-05-28 17:28:17736 // XK_KP_1 (= NumPad 1 with Num Lock), Num Lock modifier.
kpschoedel02c854d2015-06-16 14:44:29737 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35738 {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_NONE,
739 ui::DomKey::Constant<'1'>::Character},
740 {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_NONE,
741 ui::DomKey::Constant<'1'>::Character}},
[email protected]350c9232012-05-25 04:16:06742
[email protected]106cf972014-05-28 17:28:17743 // XK_KP_2 (= NumPad 2 with Num Lock), Num Lock modifier.
kpschoedel02c854d2015-06-16 14:44:29744 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35745 {ui::VKEY_NUMPAD2, ui::DomCode::NUMPAD2, ui::EF_NONE,
746 ui::DomKey::Constant<'2'>::Character},
747 {ui::VKEY_NUMPAD2, ui::DomCode::NUMPAD2, ui::EF_NONE,
748 ui::DomKey::Constant<'2'>::Character}},
[email protected]350c9232012-05-25 04:16:06749
[email protected]106cf972014-05-28 17:28:17750 // XK_KP_3 (= NumPad 3 with Num Lock), Num Lock modifier.
kpschoedel02c854d2015-06-16 14:44:29751 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35752 {ui::VKEY_NUMPAD3, ui::DomCode::NUMPAD3, ui::EF_NONE,
753 ui::DomKey::Constant<'3'>::Character},
754 {ui::VKEY_NUMPAD3, ui::DomCode::NUMPAD3, ui::EF_NONE,
755 ui::DomKey::Constant<'3'>::Character}},
[email protected]350c9232012-05-25 04:16:06756
[email protected]106cf972014-05-28 17:28:17757 // XK_KP_4 (= NumPad 4 with Num Lock), Num Lock modifier.
kpschoedel02c854d2015-06-16 14:44:29758 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35759 {ui::VKEY_NUMPAD4, ui::DomCode::NUMPAD4, ui::EF_NONE,
760 ui::DomKey::Constant<'4'>::Character},
761 {ui::VKEY_NUMPAD4, ui::DomCode::NUMPAD4, ui::EF_NONE,
762 ui::DomKey::Constant<'4'>::Character}},
[email protected]350c9232012-05-25 04:16:06763
kpschoedel8226fd152015-05-06 15:48:59764 // XK_KP_5 (= NumPad 5 with Num Lock), Num Lock
765 // modifier.
kpschoedel02c854d2015-06-16 14:44:29766 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35767 {ui::VKEY_NUMPAD5, ui::DomCode::NUMPAD5, ui::EF_NONE,
768 ui::DomKey::Constant<'5'>::Character},
769 {ui::VKEY_NUMPAD5, ui::DomCode::NUMPAD5, ui::EF_NONE,
770 ui::DomKey::Constant<'5'>::Character}},
[email protected]350c9232012-05-25 04:16:06771
kpschoedel8226fd152015-05-06 15:48:59772 // XK_KP_6 (= NumPad 6 with Num Lock), Num Lock
773 // modifier.
kpschoedel02c854d2015-06-16 14:44:29774 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35775 {ui::VKEY_NUMPAD6, ui::DomCode::NUMPAD6, ui::EF_NONE,
776 ui::DomKey::Constant<'6'>::Character},
777 {ui::VKEY_NUMPAD6, ui::DomCode::NUMPAD6, ui::EF_NONE,
778 ui::DomKey::Constant<'6'>::Character}},
[email protected]350c9232012-05-25 04:16:06779
kpschoedel8226fd152015-05-06 15:48:59780 // XK_KP_7 (= NumPad 7 with Num Lock), Num Lock
781 // modifier.
kpschoedel02c854d2015-06-16 14:44:29782 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35783 {ui::VKEY_NUMPAD7, ui::DomCode::NUMPAD7, ui::EF_NONE,
784 ui::DomKey::Constant<'7'>::Character},
785 {ui::VKEY_NUMPAD7, ui::DomCode::NUMPAD7, ui::EF_NONE,
786 ui::DomKey::Constant<'7'>::Character}},
[email protected]350c9232012-05-25 04:16:06787
kpschoedel8226fd152015-05-06 15:48:59788 // XK_KP_8 (= NumPad 8 with Num Lock), Num Lock
789 // modifier.
kpschoedel02c854d2015-06-16 14:44:29790 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35791 {ui::VKEY_NUMPAD8, ui::DomCode::NUMPAD8, ui::EF_NONE,
792 ui::DomKey::Constant<'8'>::Character},
793 {ui::VKEY_NUMPAD8, ui::DomCode::NUMPAD8, ui::EF_NONE,
794 ui::DomKey::Constant<'8'>::Character}},
[email protected]350c9232012-05-25 04:16:06795
kpschoedel8226fd152015-05-06 15:48:59796 // XK_KP_9 (= NumPad 9 with Num Lock), Num Lock
797 // modifier.
kpschoedel02c854d2015-06-16 14:44:29798 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35799 {ui::VKEY_NUMPAD9, ui::DomCode::NUMPAD9, ui::EF_NONE,
800 ui::DomKey::Constant<'9'>::Character},
801 {ui::VKEY_NUMPAD9, ui::DomCode::NUMPAD9, ui::EF_NONE,
802 ui::DomKey::Constant<'9'>::Character}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:43803 });
[email protected]2d1934f2012-04-19 18:51:22804}
[email protected]44de6072012-05-17 03:09:27805
[email protected]25ab8f12013-02-01 14:30:15806TEST_F(EventRewriterTest, TestRewriteNumPadKeys) {
807 TestRewriteNumPadKeys();
808}
809
[email protected]44de6072012-05-17 03:09:27810// Tests if the rewriter can handle a Command + Num Pad event.
[email protected]25ab8f12013-02-01 14:30:15811void EventRewriterTest::TestRewriteNumPadKeysOnAppleKeyboard() {
Ahmed Fakhry629985b2018-07-30 20:57:32812 // Simulate the default initialization of the Apple Command key remap pref to
813 // Ctrl.
814 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
815
Dmitry Torokhov3e2b7d82020-02-13 18:04:43816 TestExternalAppleKeyboard({
[email protected]106cf972014-05-28 17:28:17817 // XK_KP_End (= NumPad 1 without Num Lock), Win modifier.
818 // The result should be "Num Pad 1 with Control + Num Lock modifiers".
kpschoedel02c854d2015-06-16 14:44:29819 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35820 {ui::VKEY_END, ui::DomCode::NUMPAD1, ui::EF_COMMAND_DOWN,
821 ui::DomKey::END},
822 {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:53823 ui::DomKey::Constant<'1'>::Character}},
[email protected]350c9232012-05-25 04:16:06824
[email protected]106cf972014-05-28 17:28:17825 // XK_KP_1 (= NumPad 1 with Num Lock), Win modifier.
826 // The result should also be "Num Pad 1 with Control + Num Lock
827 // modifiers".
kpschoedel02c854d2015-06-16 14:44:29828 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35829 {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_COMMAND_DOWN,
830 ui::DomKey::Constant<'1'>::Character},
831 {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_CONTROL_DOWN,
Dmitry Torokhov3e2b7d82020-02-13 18:04:43832 ui::DomKey::Constant<'1'>::Character}},
833 });
[email protected]44de6072012-05-17 03:09:27834}
835
[email protected]25ab8f12013-02-01 14:30:15836TEST_F(EventRewriterTest, TestRewriteNumPadKeysOnAppleKeyboard) {
837 TestRewriteNumPadKeysOnAppleKeyboard();
838}
839
[email protected]b9d224c2012-07-13 01:09:03840TEST_F(EventRewriterTest, TestRewriteModifiersNoRemap) {
Dmitry Torokhov3e2b7d82020-02-13 18:04:43841 TestAllKeyboardVariants({
[email protected]106cf972014-05-28 17:28:17842 // Press Search. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29843 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59844 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_NONE, ui::DomKey::META},
845 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_COMMAND_DOWN,
kpschoedel0a8b03052016-02-17 15:35:13846 ui::DomKey::META}},
[email protected]350c9232012-05-25 04:16:06847
[email protected]106cf972014-05-28 17:28:17848 // Press left Control. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29849 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35850 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
851 ui::DomKey::CONTROL},
852 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
853 ui::DomKey::CONTROL}},
[email protected]350c9232012-05-25 04:16:06854
[email protected]106cf972014-05-28 17:28:17855 // Press right Control. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29856 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35857 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
858 ui::DomKey::CONTROL},
859 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
860 ui::DomKey::CONTROL}},
[email protected]350c9232012-05-25 04:16:06861
[email protected]106cf972014-05-28 17:28:17862 // Press left Alt. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29863 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35864 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, ui::DomKey::ALT},
865 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN,
866 ui::DomKey::ALT}},
[email protected]350c9232012-05-25 04:16:06867
[email protected]106cf972014-05-28 17:28:17868 // Press right Alt. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29869 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35870 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, ui::DomKey::ALT},
871 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN,
872 ui::DomKey::ALT}},
[email protected]350c9232012-05-25 04:16:06873
[email protected]106cf972014-05-28 17:28:17874 // Test KeyRelease event, just in case.
875 // Release Search. Confirm the release event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29876 {ui::ET_KEY_RELEASED,
dtapuskaaf863af2016-04-21 14:33:59877 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_NONE, ui::DomKey::META},
878 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_NONE, ui::DomKey::META}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:43879 });
[email protected]350c9232012-05-25 04:16:06880}
881
[email protected]b9d224c2012-07-13 01:09:03882TEST_F(EventRewriterTest, TestRewriteModifiersNoRemapMultipleKeys) {
Dmitry Torokhov3e2b7d82020-02-13 18:04:43883 TestAllKeyboardVariants({
[email protected]106cf972014-05-28 17:28:17884 // Press Alt with Shift. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29885 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35886 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT,
887 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ALT},
888 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT,
889 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ALT}},
[email protected]350c9232012-05-25 04:16:06890
michaelpg168ecd72016-08-25 04:00:42891 // Press Escape with Alt and Shift. Confirm the event is not rewritten.
892 {ui::ET_KEY_PRESSED,
893 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE,
894 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ESCAPE},
895 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE,
896 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ESCAPE}},
897
[email protected]106cf972014-05-28 17:28:17898 // Press Search with Caps Lock mask. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29899 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59900 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:13901 ui::EF_CAPS_LOCK_ON | ui::EF_COMMAND_DOWN, ui::DomKey::META},
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}},
[email protected]350c9232012-05-25 04:16:06904
[email protected]106cf972014-05-28 17:28:17905 // Release Search with Caps Lock mask. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29906 {ui::ET_KEY_RELEASED,
dtapuskaaf863af2016-04-21 14:33:59907 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_CAPS_LOCK_ON,
kpschoedel0a8b03052016-02-17 15:35:13908 ui::DomKey::META},
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}},
[email protected]350c9232012-05-25 04:16:06911
michaelpg168ecd72016-08-25 04:00:42912 // Press Shift+Ctrl+Alt+Search+Escape. Confirm the event is not rewritten.
913 {ui::ET_KEY_PRESSED,
914 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE,
915 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
916 ui::EF_COMMAND_DOWN,
917 ui::DomKey::ESCAPE},
918 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE,
919 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
920 ui::EF_COMMAND_DOWN,
921 ui::DomKey::ESCAPE}},
922
923 // Press Shift+Ctrl+Alt+Search+B. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29924 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19925 {ui::VKEY_B, ui::DomCode::US_B,
kpschoedel8226fd152015-05-06 15:48:59926 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
927 ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:35928 ui::DomKey::Constant<'B'>::Character},
kpschoedela281bf12016-01-07 15:08:19929 {ui::VKEY_B, ui::DomCode::US_B,
kpschoedel8226fd152015-05-06 15:48:59930 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
931 ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:35932 ui::DomKey::Constant<'B'>::Character}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:43933 });
[email protected]350c9232012-05-25 04:16:06934}
935
[email protected]b9d224c2012-07-13 01:09:03936TEST_F(EventRewriterTest, TestRewriteModifiersDisableSome) {
michaelpg168ecd72016-08-25 04:00:42937 // Disable Search, Control and Escape keys.
penghuange5df2822017-03-16 22:54:36938 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]350c9232012-05-25 04:16:06939 IntegerPrefMember search;
Blake O'Harea09fa45a2017-10-13 04:19:58940 InitModifierKeyPref(&search, prefs::kLanguageRemapSearchKeyTo,
941 ui::chromeos::ModifierKey::kVoidKey);
[email protected]350c9232012-05-25 04:16:06942 IntegerPrefMember control;
Blake O'Harea09fa45a2017-10-13 04:19:58943 InitModifierKeyPref(&control, prefs::kLanguageRemapControlKeyTo,
944 ui::chromeos::ModifierKey::kVoidKey);
michaelpg168ecd72016-08-25 04:00:42945 IntegerPrefMember escape;
Blake O'Harea09fa45a2017-10-13 04:19:58946 InitModifierKeyPref(&escape, prefs::kLanguageRemapEscapeKeyTo,
947 ui::chromeos::ModifierKey::kVoidKey);
[email protected]350c9232012-05-25 04:16:06948
Dmitry Torokhov3e2b7d82020-02-13 18:04:43949 TestChromeKeyboardVariants({
[email protected]106cf972014-05-28 17:28:17950 // Press Alt with Shift. This key press shouldn't be affected by the
951 // pref. Confirm the event is not rewritten.
kpschoedel02c854d2015-06-16 14:44:29952 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35953 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT,
954 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ALT},
955 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT,
956 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ALT}},
[email protected]350c9232012-05-25 04:16:06957
[email protected]106cf972014-05-28 17:28:17958 // Press Search. Confirm the event is now VKEY_UNKNOWN.
kpschoedel02c854d2015-06-16 14:44:29959 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59960 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_NONE, ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:35961 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_NONE,
962 ui::DomKey::UNIDENTIFIED}},
[email protected]350c9232012-05-25 04:16:06963
[email protected]106cf972014-05-28 17:28:17964 // Press Control. Confirm the event is now VKEY_UNKNOWN.
kpschoedel02c854d2015-06-16 14:44:29965 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:35966 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
967 ui::DomKey::CONTROL},
968 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_NONE,
969 ui::DomKey::UNIDENTIFIED}},
[email protected]350c9232012-05-25 04:16:06970
michaelpg168ecd72016-08-25 04:00:42971 // Press Escape. Confirm the event is now VKEY_UNKNOWN.
972 {ui::ET_KEY_PRESSED,
973 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE, ui::EF_NONE, ui::DomKey::ESCAPE},
974 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_NONE,
975 ui::DomKey::UNIDENTIFIED}},
976
[email protected]106cf972014-05-28 17:28:17977 // Press Control+Search. Confirm the event is now VKEY_UNKNOWN
978 // without any modifiers.
kpschoedel02c854d2015-06-16 14:44:29979 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:59980 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_CONTROL_DOWN,
kpschoedel0a8b03052016-02-17 15:35:13981 ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:35982 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_NONE,
983 ui::DomKey::UNIDENTIFIED}},
[email protected]350c9232012-05-25 04:16:06984
[email protected]106cf972014-05-28 17:28:17985 // Press Control+Search+a. Confirm the event is now VKEY_A without any
986 // modifiers.
kpschoedel02c854d2015-06-16 14:44:29987 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19988 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_CONTROL_DOWN,
kpschoedel51d2e322015-08-28 15:29:35989 ui::DomKey::Constant<'a'>::Character},
kpschoedela281bf12016-01-07 15:08:19990 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_NONE,
kpschoedel51d2e322015-08-28 15:29:35991 ui::DomKey::Constant<'a'>::Character}},
[email protected]350c9232012-05-25 04:16:06992
[email protected]106cf972014-05-28 17:28:17993 // Press Control+Search+Alt+a. Confirm the event is now VKEY_A only with
994 // the Alt modifier.
kpschoedel02c854d2015-06-16 14:44:29995 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:19996 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
kpschoedel51d2e322015-08-28 15:29:35997 ui::DomKey::Constant<'a'>::Character},
kpschoedela281bf12016-01-07 15:08:19998 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN,
kpschoedel51d2e322015-08-28 15:29:35999 ui::DomKey::Constant<'a'>::Character}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:431000 });
[email protected]350c9232012-05-25 04:16:061001
1002 // Remap Alt to Control.
1003 IntegerPrefMember alt;
Blake O'Harea09fa45a2017-10-13 04:19:581004 InitModifierKeyPref(&alt, prefs::kLanguageRemapAltKeyTo,
1005 ui::chromeos::ModifierKey::kControlKey);
[email protected]350c9232012-05-25 04:16:061006
Dmitry Torokhov3e2b7d82020-02-13 18:04:431007 TestChromeKeyboardVariants({
[email protected]106cf972014-05-28 17:28:171008 // Press left Alt. Confirm the event is now VKEY_CONTROL
1009 // even though the Control key itself is disabled.
kpschoedel02c854d2015-06-16 14:44:291010 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351011 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, ui::DomKey::ALT},
1012 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
1013 ui::DomKey::CONTROL}},
[email protected]350c9232012-05-25 04:16:061014
[email protected]106cf972014-05-28 17:28:171015 // Press Alt+a. Confirm the event is now Control+a even though the Control
1016 // key itself is disabled.
kpschoedel02c854d2015-06-16 14:44:291017 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:191018 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN,
kpschoedel51d2e322015-08-28 15:29:351019 ui::DomKey::Constant<'a'>::Character},
kpschoedela281bf12016-01-07 15:08:191020 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:531021 ui::DomKey::Constant<'a'>::Character}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:431022 });
[email protected]350c9232012-05-25 04:16:061023}
1024
[email protected]b9d224c2012-07-13 01:09:031025TEST_F(EventRewriterTest, TestRewriteModifiersRemapToControl) {
[email protected]350c9232012-05-25 04:16:061026 // Remap Search to Control.
penghuange5df2822017-03-16 22:54:361027 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]350c9232012-05-25 04:16:061028 IntegerPrefMember search;
Blake O'Harea09fa45a2017-10-13 04:19:581029 InitModifierKeyPref(&search, prefs::kLanguageRemapSearchKeyTo,
1030 ui::chromeos::ModifierKey::kControlKey);
[email protected]350c9232012-05-25 04:16:061031
Dmitry Torokhov3e2b7d82020-02-13 18:04:431032 TestChromeKeyboardVariants({
[email protected]106cf972014-05-28 17:28:171033 // Press Search. Confirm the event is now VKEY_CONTROL.
kpschoedel02c854d2015-06-16 14:44:291034 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:591035 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_COMMAND_DOWN,
kpschoedel0a8b03052016-02-17 15:35:131036 ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:351037 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
1038 ui::DomKey::CONTROL}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:431039 });
[email protected]350c9232012-05-25 04:16:061040
1041 // Remap Alt to Control too.
1042 IntegerPrefMember alt;
Blake O'Harea09fa45a2017-10-13 04:19:581043 InitModifierKeyPref(&alt, prefs::kLanguageRemapAltKeyTo,
1044 ui::chromeos::ModifierKey::kControlKey);
[email protected]350c9232012-05-25 04:16:061045
Dmitry Torokhov3e2b7d82020-02-13 18:04:431046 TestChromeKeyboardVariants({
[email protected]106cf972014-05-28 17:28:171047 // Press Alt. Confirm the event is now VKEY_CONTROL.
kpschoedel02c854d2015-06-16 14:44:291048 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351049 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, ui::DomKey::ALT},
1050 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
1051 ui::DomKey::CONTROL}},
[email protected]350c9232012-05-25 04:16:061052
[email protected]106cf972014-05-28 17:28:171053 // Press Alt+Search. Confirm the event is now VKEY_CONTROL.
kpschoedel02c854d2015-06-16 14:44:291054 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:591055 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:131056 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN, ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:351057 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
1058 ui::DomKey::CONTROL}},
[email protected]350c9232012-05-25 04:16:061059
[email protected]106cf972014-05-28 17:28:171060 // Press Control+Alt+Search. Confirm the event is now VKEY_CONTROL.
kpschoedel02c854d2015-06-16 14:44:291061 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:591062 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel8226fd152015-05-06 15:48:591063 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
kpschoedel0a8b03052016-02-17 15:35:131064 ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:351065 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
1066 ui::DomKey::CONTROL}},
[email protected]350c9232012-05-25 04:16:061067
[email protected]106cf972014-05-28 17:28:171068 // Press Shift+Control+Alt+Search. Confirm the event is now Control with
1069 // Shift and Control modifiers.
kpschoedel02c854d2015-06-16 14:44:291070 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:591071 {ui::VKEY_LWIN, ui::DomCode::META_LEFT,
kpschoedel8226fd152015-05-06 15:48:591072 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
1073 ui::EF_COMMAND_DOWN,
kpschoedel0a8b03052016-02-17 15:35:131074 ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:351075 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
1076 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::CONTROL}},
[email protected]350c9232012-05-25 04:16:061077
[email protected]106cf972014-05-28 17:28:171078 // Press Shift+Control+Alt+Search+B. Confirm the event is now B with Shift
1079 // and Control modifiers.
kpschoedel02c854d2015-06-16 14:44:291080 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:191081 {ui::VKEY_B, ui::DomCode::US_B,
kpschoedel8226fd152015-05-06 15:48:591082 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
1083 ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:351084 ui::DomKey::Constant<'B'>::Character},
kpschoedela281bf12016-01-07 15:08:191085 {ui::VKEY_B, ui::DomCode::US_B, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:531086 ui::DomKey::Constant<'B'>::Character}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:431087 });
[email protected]350c9232012-05-25 04:16:061088}
1089
[email protected]343b8edd2013-09-17 09:28:111090TEST_F(EventRewriterTest, TestRewriteModifiersRemapToEscape) {
michaelpg168ecd72016-08-25 04:00:421091 // Remap Search to Escape.
penghuange5df2822017-03-16 22:54:361092 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]343b8edd2013-09-17 09:28:111093 IntegerPrefMember search;
Blake O'Harea09fa45a2017-10-13 04:19:581094 InitModifierKeyPref(&search, prefs::kLanguageRemapSearchKeyTo,
1095 ui::chromeos::ModifierKey::kEscapeKey);
[email protected]343b8edd2013-09-17 09:28:111096
Dmitry Torokhov3e2b7d82020-02-13 18:04:431097 TestChromeKeyboardVariants({
kpschoedel8226fd152015-05-06 15:48:591098 // Press Search. Confirm the event is now VKEY_ESCAPE.
kpschoedel02c854d2015-06-16 14:44:291099 {ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:591100 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_COMMAND_DOWN,
kpschoedel0a8b03052016-02-17 15:35:131101 ui::DomKey::META},
kpschoedel51d2e322015-08-28 15:29:351102 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE, ui::EF_NONE, ui::DomKey::ESCAPE}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:431103 });
[email protected]343b8edd2013-09-17 09:28:111104}
1105
Andrew Xu531197df2019-03-07 21:46:491106TEST_F(EventRewriterTest, TestRewriteModifiersRemapEscapeToAlt) {
michaelpg168ecd72016-08-25 04:00:421107 // Remap Escape to Alt.
penghuange5df2822017-03-16 22:54:361108 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
michaelpg168ecd72016-08-25 04:00:421109 IntegerPrefMember escape;
Blake O'Harea09fa45a2017-10-13 04:19:581110 InitModifierKeyPref(&escape, prefs::kLanguageRemapEscapeKeyTo,
1111 ui::chromeos::ModifierKey::kAltKey);
[email protected]350c9232012-05-25 04:16:061112
Dmitry Torokhov3e2b7d82020-02-13 18:04:431113 TestAllKeyboardVariants({
michaelpg168ecd72016-08-25 04:00:421114 // Press Escape. Confirm the event is now VKEY_MENU.
kpschoedel02c854d2015-06-16 14:44:291115 {ui::ET_KEY_PRESSED,
michaelpg168ecd72016-08-25 04:00:421116 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE, ui::EF_NONE, ui::DomKey::ESCAPE},
kpschoedel51d2e322015-08-28 15:29:351117 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN,
1118 ui::DomKey::ALT}},
michaelpg168ecd72016-08-25 04:00:421119 // Release Escape to clear flags.
1120 {ui::ET_KEY_RELEASED,
1121 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE, ui::EF_NONE, ui::DomKey::ESCAPE},
1122 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_NONE, ui::DomKey::ALT}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:431123 });
Andrew Xu531197df2019-03-07 21:46:491124}
[email protected]350c9232012-05-25 04:16:061125
Andrew Xu531197df2019-03-07 21:46:491126TEST_F(EventRewriterTest, TestRewriteModifiersRemapAltToControl) {
[email protected]350c9232012-05-25 04:16:061127 // Remap Alt to Control.
Andrew Xu531197df2019-03-07 21:46:491128 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]350c9232012-05-25 04:16:061129 IntegerPrefMember alt;
Blake O'Harea09fa45a2017-10-13 04:19:581130 InitModifierKeyPref(&alt, prefs::kLanguageRemapAltKeyTo,
1131 ui::chromeos::ModifierKey::kControlKey);
[email protected]350c9232012-05-25 04:16:061132
Dmitry Torokhov3e2b7d82020-02-13 18:04:431133 TestAllKeyboardVariants({
[email protected]106cf972014-05-28 17:28:171134 // Press left Alt. Confirm the event is now VKEY_CONTROL.
kpschoedel02c854d2015-06-16 14:44:291135 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351136 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN, ui::DomKey::ALT},
1137 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
1138 ui::DomKey::CONTROL}},
[email protected]bc3cca84f2014-07-16 04:19:231139 // Press Shift+comma. Verify that only the flags are changed.
kpschoedel02c854d2015-06-16 14:44:291140 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351141 {ui::VKEY_OEM_COMMA, ui::DomCode::COMMA,
1142 ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN, ui::DomKey::UNIDENTIFIED},
1143 {ui::VKEY_OEM_COMMA, ui::DomCode::COMMA,
kpschoedel728aa8092015-10-20 19:29:531144 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN,
1145 ui::DomKey::Constant<'<'>::Character}},
[email protected]bc3cca84f2014-07-16 04:19:231146 // Press Shift+9. Verify that only the flags are changed.
kpschoedel02c854d2015-06-16 14:44:291147 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351148 {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
1149 ui::DomKey::UNIDENTIFIED},
1150 {ui::VKEY_9, ui::DomCode::DIGIT9,
kpschoedel728aa8092015-10-20 19:29:531151 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN,
1152 ui::DomKey::Constant<'('>::Character}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:431153 });
Andrew Xu531197df2019-03-07 21:46:491154}
1155
1156TEST_F(EventRewriterTest, TestRewriteModifiersRemapUnderEscapeControlAlt) {
1157 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
1158
1159 // Remap Escape to Alt.
1160 IntegerPrefMember escape;
1161 InitModifierKeyPref(&escape, prefs::kLanguageRemapEscapeKeyTo,
1162 ui::chromeos::ModifierKey::kAltKey);
1163
1164 // Remap Alt to Control.
1165 IntegerPrefMember alt;
1166 InitModifierKeyPref(&alt, prefs::kLanguageRemapAltKeyTo,
1167 ui::chromeos::ModifierKey::kControlKey);
[email protected]350c9232012-05-25 04:16:061168
1169 // Remap Control to Search.
1170 IntegerPrefMember control;
Blake O'Harea09fa45a2017-10-13 04:19:581171 InitModifierKeyPref(&control, prefs::kLanguageRemapControlKeyTo,
1172 ui::chromeos::ModifierKey::kSearchKey);
[email protected]350c9232012-05-25 04:16:061173
Dmitry Torokhov3e2b7d82020-02-13 18:04:431174 TestAllKeyboardVariants({
[email protected]106cf972014-05-28 17:28:171175 // Press left Control. Confirm the event is now VKEY_LWIN.
kpschoedel02c854d2015-06-16 14:44:291176 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351177 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_CONTROL_DOWN,
1178 ui::DomKey::CONTROL},
dtapuskaaf863af2016-04-21 14:33:591179 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_COMMAND_DOWN,
kpschoedel0a8b03052016-02-17 15:35:131180 ui::DomKey::META}},
[email protected]350c9232012-05-25 04:16:061181
michaelpg168ecd72016-08-25 04:00:421182 // Then, press all of the three, Control+Alt+Escape.
kpschoedel02c854d2015-06-16 14:44:291183 {ui::ET_KEY_PRESSED,
michaelpg168ecd72016-08-25 04:00:421184 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE,
1185 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::CONTROL},
kpschoedel51d2e322015-08-28 15:29:351186 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT,
kpschoedel8226fd152015-05-06 15:48:591187 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:351188 ui::DomKey::ALT}},
[email protected]350c9232012-05-25 04:16:061189
michaelpg168ecd72016-08-25 04:00:421190 // Press Shift+Control+Alt+Escape.
kpschoedel02c854d2015-06-16 14:44:291191 {ui::ET_KEY_PRESSED,
michaelpg168ecd72016-08-25 04:00:421192 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE,
1193 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
1194 ui::DomKey::ESCAPE},
kpschoedel51d2e322015-08-28 15:29:351195 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT,
kpschoedel8226fd152015-05-06 15:48:591196 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
1197 ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:351198 ui::DomKey::ALT}},
[email protected]350c9232012-05-25 04:16:061199
michaelpg168ecd72016-08-25 04:00:421200 // Press Shift+Control+Alt+B
kpschoedel02c854d2015-06-16 14:44:291201 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:191202 {ui::VKEY_B, ui::DomCode::US_B,
michaelpg168ecd72016-08-25 04:00:421203 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
kpschoedel51d2e322015-08-28 15:29:351204 ui::DomKey::Constant<'B'>::Character},
kpschoedela281bf12016-01-07 15:08:191205 {ui::VKEY_B, ui::DomCode::US_B,
kpschoedel8226fd152015-05-06 15:48:591206 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN |
1207 ui::EF_COMMAND_DOWN,
kpschoedel51d2e322015-08-28 15:29:351208 ui::DomKey::Constant<'B'>::Character}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:431209 });
Andrew Xu531197df2019-03-07 21:46:491210}
1211
1212TEST_F(EventRewriterTest,
1213 TestRewriteModifiersRemapUnderEscapeControlAltSearch) {
1214 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
1215
1216 // Remap Escape to Alt.
1217 IntegerPrefMember escape;
1218 InitModifierKeyPref(&escape, prefs::kLanguageRemapEscapeKeyTo,
1219 ui::chromeos::ModifierKey::kAltKey);
1220
1221 // Remap Alt to Control.
1222 IntegerPrefMember alt;
1223 InitModifierKeyPref(&alt, prefs::kLanguageRemapAltKeyTo,
1224 ui::chromeos::ModifierKey::kControlKey);
1225
1226 // Remap Control to Search.
1227 IntegerPrefMember control;
1228 InitModifierKeyPref(&control, prefs::kLanguageRemapControlKeyTo,
1229 ui::chromeos::ModifierKey::kSearchKey);
michaelpg168ecd72016-08-25 04:00:421230
1231 // Remap Search to Backspace.
1232 IntegerPrefMember search;
Blake O'Harea09fa45a2017-10-13 04:19:581233 InitModifierKeyPref(&search, prefs::kLanguageRemapSearchKeyTo,
1234 ui::chromeos::ModifierKey::kBackspaceKey);
michaelpg168ecd72016-08-25 04:00:421235
Dmitry Torokhov3e2b7d82020-02-13 18:04:431236 TestChromeKeyboardVariants({
michaelpg168ecd72016-08-25 04:00:421237 // Release Control and Escape, as Search and Alt would transform Backspace
1238 // to Delete.
Andrew Xu531197df2019-03-07 21:46:491239 {ui::ET_KEY_PRESSED,
1240 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_NONE,
1241 ui::DomKey::CONTROL},
1242 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_COMMAND_DOWN,
1243 ui::DomKey::META}},
1244 {ui::ET_KEY_PRESSED,
1245 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE, ui::EF_NONE, ui::DomKey::ESCAPE},
1246 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_ALT_DOWN,
1247 ui::DomKey::ALT}},
michaelpg168ecd72016-08-25 04:00:421248 {ui::ET_KEY_RELEASED,
1249 {ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT, ui::EF_NONE,
1250 ui::DomKey::CONTROL},
1251 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_ALT_DOWN,
1252 ui::DomKey::META}},
1253 {ui::ET_KEY_RELEASED,
1254 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE, ui::EF_NONE, ui::DomKey::ESCAPE},
1255 {ui::VKEY_MENU, ui::DomCode::ALT_LEFT, ui::EF_NONE, ui::DomKey::ALT}},
1256 // Press Search. Confirm the event is now VKEY_BACK.
1257 {ui::ET_KEY_PRESSED,
1258 {ui::VKEY_LWIN, ui::DomCode::META_LEFT, ui::EF_COMMAND_DOWN,
1259 ui::DomKey::META},
1260 {ui::VKEY_BACK, ui::DomCode::BACKSPACE, ui::EF_NONE,
1261 ui::DomKey::BACKSPACE}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:431262 });
Andrew Xu531197df2019-03-07 21:46:491263}
michaelpg168ecd72016-08-25 04:00:421264
Andrew Xu531197df2019-03-07 21:46:491265TEST_F(EventRewriterTest, TestRewriteModifiersRemapBackspaceToEscape) {
michaelpg168ecd72016-08-25 04:00:421266 // Remap Backspace to Escape.
Andrew Xu531197df2019-03-07 21:46:491267 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
michaelpg168ecd72016-08-25 04:00:421268 IntegerPrefMember backspace;
Blake O'Harea09fa45a2017-10-13 04:19:581269 InitModifierKeyPref(&backspace, prefs::kLanguageRemapBackspaceKeyTo,
1270 ui::chromeos::ModifierKey::kEscapeKey);
michaelpg168ecd72016-08-25 04:00:421271
Dmitry Torokhov3e2b7d82020-02-13 18:04:431272 TestAllKeyboardVariants({
michaelpg168ecd72016-08-25 04:00:421273 // Press Backspace. Confirm the event is now VKEY_ESCAPE.
1274 {ui::ET_KEY_PRESSED,
1275 {ui::VKEY_BACK, ui::DomCode::BACKSPACE, ui::EF_NONE,
1276 ui::DomKey::BACKSPACE},
1277 {ui::VKEY_ESCAPE, ui::DomCode::ESCAPE, ui::EF_NONE, ui::DomKey::ESCAPE}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:431278 });
[email protected]350c9232012-05-25 04:16:061279}
1280
[email protected]b9d224c2012-07-13 01:09:031281TEST_F(EventRewriterTest, TestRewriteModifiersRemapToCapsLock) {
[email protected]350c9232012-05-25 04:16:061282 // Remap Search to Caps Lock.
penghuange5df2822017-03-16 22:54:361283 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]350c9232012-05-25 04:16:061284 IntegerPrefMember search;
Blake O'Harea09fa45a2017-10-13 04:19:581285 InitModifierKeyPref(&search, prefs::kLanguageRemapSearchKeyTo,
1286 ui::chromeos::ModifierKey::kCapsLockKey);
[email protected]350c9232012-05-25 04:16:061287
Zentaro Kavanagh1e7d867c2020-05-13 01:18:441288 SetupKeyboard("Internal Keyboard");
Jimmy Gong82c82b42021-04-17 03:12:331289 EXPECT_FALSE(fake_ime_keyboard_.caps_lock_is_enabled_);
[email protected]350c9232012-05-25 04:16:061290
1291 // Press Search.
Zentaro Kavanaghc555ab452020-05-13 23:07:371292 EXPECT_EQ(
1293 GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL,
1294 ui::DomCode::CAPS_LOCK,
1295 ui::EF_MOD3_DOWN | ui::EF_CAPS_LOCK_ON,
1296 ui::DomKey::CAPS_LOCK, kNoScanCode),
1297 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_PRESSED, ui::VKEY_LWIN,
1298 ui::DomCode::META_LEFT, ui::EF_COMMAND_DOWN,
1299 ui::DomKey::META, kNoScanCode));
Jimmy Gong82c82b42021-04-17 03:12:331300 EXPECT_FALSE(fake_ime_keyboard_.caps_lock_is_enabled_);
[email protected]350c9232012-05-25 04:16:061301
1302 // Release Search.
Zentaro Kavanaghc555ab452020-05-13 23:07:371303 EXPECT_EQ(
1304 GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL,
1305 ui::DomCode::CAPS_LOCK, ui::EF_NONE,
1306 ui::DomKey::CAPS_LOCK, kNoScanCode),
1307 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_RELEASED, ui::VKEY_LWIN,
1308 ui::DomCode::META_LEFT, ui::EF_NONE,
1309 ui::DomKey::META, kNoScanCode));
Jimmy Gong82c82b42021-04-17 03:12:331310 EXPECT_TRUE(fake_ime_keyboard_.caps_lock_is_enabled_);
[email protected]350c9232012-05-25 04:16:061311
1312 // Press Search.
Zentaro Kavanaghc555ab452020-05-13 23:07:371313 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL,
1314 ui::DomCode::CAPS_LOCK,
1315 ui::EF_CAPS_LOCK_ON | ui::EF_MOD3_DOWN,
1316 ui::DomKey::CAPS_LOCK, kNoScanCode),
Yuichiro Hanada87c6e552020-02-07 01:07:371317 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_PRESSED,
dtapuskaaf863af2016-04-21 14:33:591318 ui::VKEY_LWIN, ui::DomCode::META_LEFT,
pkastingcc7f6ac2016-01-08 23:38:471319 ui::EF_COMMAND_DOWN | ui::EF_CAPS_LOCK_ON,
Zentaro Kavanaghc555ab452020-05-13 23:07:371320 ui::DomKey::META, kNoScanCode));
Jimmy Gong82c82b42021-04-17 03:12:331321 EXPECT_TRUE(fake_ime_keyboard_.caps_lock_is_enabled_);
[email protected]350c9232012-05-25 04:16:061322
1323 // Release Search.
Zentaro Kavanaghc555ab452020-05-13 23:07:371324 EXPECT_EQ(
1325 GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL,
1326 ui::DomCode::CAPS_LOCK, ui::EF_NONE,
1327 ui::DomKey::CAPS_LOCK, kNoScanCode),
1328 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_RELEASED, ui::VKEY_LWIN,
1329 ui::DomCode::META_LEFT, ui::EF_NONE,
1330 ui::DomKey::META, kNoScanCode));
Jimmy Gong82c82b42021-04-17 03:12:331331 EXPECT_FALSE(fake_ime_keyboard_.caps_lock_is_enabled_);
[email protected]350c9232012-05-25 04:16:061332
Dmitry Torokhov3e2b7d82020-02-13 18:04:431333 // Do the same on external Chrome OS keyboard.
Zentaro Kavanagh1e7d867c2020-05-13 01:18:441334 SetupKeyboard("External Chrome Keyboard", kKbdTopRowLayout1Tag,
1335 ui::INPUT_DEVICE_UNKNOWN);
Dmitry Torokhov3e2b7d82020-02-13 18:04:431336
1337 // Press Search.
Zentaro Kavanaghc555ab452020-05-13 23:07:371338 EXPECT_EQ(
1339 GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL,
1340 ui::DomCode::CAPS_LOCK,
1341 ui::EF_MOD3_DOWN | ui::EF_CAPS_LOCK_ON,
1342 ui::DomKey::CAPS_LOCK, kNoScanCode),
1343 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_PRESSED, ui::VKEY_LWIN,
1344 ui::DomCode::META_LEFT, ui::EF_COMMAND_DOWN,
1345 ui::DomKey::META, kNoScanCode));
Jimmy Gong82c82b42021-04-17 03:12:331346 EXPECT_FALSE(fake_ime_keyboard_.caps_lock_is_enabled_);
Dmitry Torokhov3e2b7d82020-02-13 18:04:431347
1348 // Release Search.
Zentaro Kavanaghc555ab452020-05-13 23:07:371349 EXPECT_EQ(
1350 GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL,
1351 ui::DomCode::CAPS_LOCK, ui::EF_NONE,
1352 ui::DomKey::CAPS_LOCK, kNoScanCode),
1353 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_RELEASED, ui::VKEY_LWIN,
1354 ui::DomCode::META_LEFT, ui::EF_NONE,
1355 ui::DomKey::META, kNoScanCode));
Jimmy Gong82c82b42021-04-17 03:12:331356 EXPECT_TRUE(fake_ime_keyboard_.caps_lock_is_enabled_);
Dmitry Torokhov3e2b7d82020-02-13 18:04:431357
1358 // Press Search.
Zentaro Kavanaghc555ab452020-05-13 23:07:371359 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL,
1360 ui::DomCode::CAPS_LOCK,
1361 ui::EF_CAPS_LOCK_ON | ui::EF_MOD3_DOWN,
1362 ui::DomKey::CAPS_LOCK, kNoScanCode),
Dmitry Torokhov3e2b7d82020-02-13 18:04:431363 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_PRESSED,
1364 ui::VKEY_LWIN, ui::DomCode::META_LEFT,
1365 ui::EF_COMMAND_DOWN | ui::EF_CAPS_LOCK_ON,
Zentaro Kavanaghc555ab452020-05-13 23:07:371366 ui::DomKey::META, kNoScanCode));
Jimmy Gong82c82b42021-04-17 03:12:331367 EXPECT_TRUE(fake_ime_keyboard_.caps_lock_is_enabled_);
Dmitry Torokhov3e2b7d82020-02-13 18:04:431368
1369 // Release Search.
Zentaro Kavanaghc555ab452020-05-13 23:07:371370 EXPECT_EQ(
1371 GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL,
1372 ui::DomCode::CAPS_LOCK, ui::EF_NONE,
1373 ui::DomKey::CAPS_LOCK, kNoScanCode),
1374 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_RELEASED, ui::VKEY_LWIN,
1375 ui::DomCode::META_LEFT, ui::EF_NONE,
1376 ui::DomKey::META, kNoScanCode));
Jimmy Gong82c82b42021-04-17 03:12:331377 EXPECT_FALSE(fake_ime_keyboard_.caps_lock_is_enabled_);
Dmitry Torokhov3e2b7d82020-02-13 18:04:431378
1379 // Try external keyboard with Caps Lock.
Zentaro Kavanagh1e7d867c2020-05-13 01:18:441380 SetupKeyboard("External Generic Keyboard", kKbdTopRowLayoutUnspecified,
1381 ui::INPUT_DEVICE_UNKNOWN);
Dmitry Torokhov3e2b7d82020-02-13 18:04:431382
1383 // Press Caps Lock.
Zentaro Kavanaghc555ab452020-05-13 23:07:371384 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL,
1385 ui::DomCode::CAPS_LOCK,
1386 ui::EF_CAPS_LOCK_ON | ui::EF_MOD3_DOWN,
1387 ui::DomKey::CAPS_LOCK, kNoScanCode),
Yuichiro Hanada87c6e552020-02-07 01:07:371388 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_PRESSED,
kpschoedel8226fd152015-05-06 15:48:591389 ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
pkastingcc7f6ac2016-01-08 23:38:471390 ui::EF_CAPS_LOCK_ON | ui::EF_MOD3_DOWN,
Zentaro Kavanaghc555ab452020-05-13 23:07:371391 ui::DomKey::CAPS_LOCK, kNoScanCode));
Jimmy Gong82c82b42021-04-17 03:12:331392 EXPECT_FALSE(fake_ime_keyboard_.caps_lock_is_enabled_);
[email protected]350c9232012-05-25 04:16:061393
Dmitry Torokhov3e2b7d82020-02-13 18:04:431394 // Release Caps Lock.
kpschoedel8226fd152015-05-06 15:48:591395 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL,
1396 ui::DomCode::CAPS_LOCK, ui::EF_NONE,
Zentaro Kavanaghc555ab452020-05-13 23:07:371397 ui::DomKey::CAPS_LOCK, kNoScanCode),
Yuichiro Hanada87c6e552020-02-07 01:07:371398 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_RELEASED,
kpschoedel8226fd152015-05-06 15:48:591399 ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
Zentaro Kavanaghc555ab452020-05-13 23:07:371400 ui::EF_NONE, ui::DomKey::CAPS_LOCK,
1401 kNoScanCode));
Jimmy Gong82c82b42021-04-17 03:12:331402 EXPECT_TRUE(fake_ime_keyboard_.caps_lock_is_enabled_);
[email protected]350c9232012-05-25 04:16:061403}
[email protected]4a822092012-06-15 03:42:511404
[email protected]d13e288992014-05-01 18:00:211405TEST_F(EventRewriterTest, TestRewriteCapsLock) {
penghuange5df2822017-03-16 22:54:361406 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]872ead342012-10-31 17:50:011407
Zentaro Kavanagh1e7d867c2020-05-13 01:18:441408 SetupKeyboard("External Generic Keyboard", kKbdTopRowLayoutUnspecified,
1409 ui::INPUT_DEVICE_UNKNOWN);
Jimmy Gong82c82b42021-04-17 03:12:331410 EXPECT_FALSE(fake_ime_keyboard_.caps_lock_is_enabled_);
[email protected]872ead342012-10-31 17:50:011411
Tetsui Ohkubo256dcbf4a2019-02-14 03:30:531412 // On Chrome OS, CapsLock is mapped to CapsLock with Mod3Mask.
Zentaro Kavanaghc555ab452020-05-13 23:07:371413 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL,
1414 ui::DomCode::CAPS_LOCK,
1415 ui::EF_CAPS_LOCK_ON | ui::EF_MOD3_DOWN,
1416 ui::DomKey::CAPS_LOCK, kNoScanCode),
Yuichiro Hanada87c6e552020-02-07 01:07:371417 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_PRESSED,
Tetsui Ohkubo256dcbf4a2019-02-14 03:30:531418 ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
Zentaro Kavanaghc555ab452020-05-13 23:07:371419 ui::EF_MOD3_DOWN, ui::DomKey::CAPS_LOCK,
1420 kNoScanCode));
Jimmy Gong82c82b42021-04-17 03:12:331421 EXPECT_FALSE(fake_ime_keyboard_.caps_lock_is_enabled_);
Weidong Guo9b390042017-10-29 19:07:431422
1423 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL,
1424 ui::DomCode::CAPS_LOCK, ui::EF_NONE,
Zentaro Kavanaghc555ab452020-05-13 23:07:371425 ui::DomKey::CAPS_LOCK, kNoScanCode),
Yuichiro Hanada87c6e552020-02-07 01:07:371426 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_RELEASED,
Tetsui Ohkubo256dcbf4a2019-02-14 03:30:531427 ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
Zentaro Kavanaghc555ab452020-05-13 23:07:371428 ui::EF_MOD3_DOWN, ui::DomKey::CAPS_LOCK,
1429 kNoScanCode));
Jimmy Gong82c82b42021-04-17 03:12:331430 EXPECT_TRUE(fake_ime_keyboard_.caps_lock_is_enabled_);
Weidong Guo4534b862017-11-10 03:17:051431
1432 // Remap Caps Lock to Control.
1433 IntegerPrefMember caps_lock;
1434 InitModifierKeyPref(&caps_lock, prefs::kLanguageRemapCapsLockKeyTo,
1435 ui::chromeos::ModifierKey::kControlKey);
1436
Jimmy Gong82c82b42021-04-17 03:12:331437 // Press Caps Lock. CapsLock is enabled but we have remapped the key to
1438 // now be Control. We want to ensure that the CapsLock modifier is still
1439 // active even after pressing the remapped Capslock key.
1440 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL,
1441 ui::DomCode::CONTROL_LEFT,
1442 ui::EF_CONTROL_DOWN | ui::EF_CAPS_LOCK_ON,
1443 ui::DomKey::CONTROL, kNoScanCode),
Yuichiro Hanada87c6e552020-02-07 01:07:371444 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_PRESSED,
Weidong Guo4534b862017-11-10 03:17:051445 ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
1446 ui::EF_CAPS_LOCK_ON | ui::EF_MOD3_DOWN,
Zentaro Kavanaghc555ab452020-05-13 23:07:371447 ui::DomKey::CAPS_LOCK, kNoScanCode));
Jimmy Gong82c82b42021-04-17 03:12:331448 EXPECT_TRUE(fake_ime_keyboard_.caps_lock_is_enabled_);
Weidong Guo4534b862017-11-10 03:17:051449
1450 // Release Caps Lock.
Jimmy Gong82c82b42021-04-17 03:12:331451 EXPECT_EQ(
1452 GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CONTROL,
1453 ui::DomCode::CONTROL_LEFT, ui::EF_CAPS_LOCK_ON,
1454 ui::DomKey::CONTROL, kNoScanCode),
1455 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_RELEASED,
1456 ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
1457 ui::EF_CAPS_LOCK_ON, ui::DomKey::CAPS_LOCK,
1458 kNoScanCode));
1459 EXPECT_TRUE(fake_ime_keyboard_.caps_lock_is_enabled_);
1460}
1461
1462TEST_F(EventRewriterTest, TestRewriteExternalCapsLockWithDifferentScenarios) {
1463 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
1464
1465 SetupKeyboard("External Generic Keyboard", kKbdTopRowLayoutUnspecified,
1466 ui::INPUT_DEVICE_UNKNOWN);
1467 EXPECT_FALSE(fake_ime_keyboard_.caps_lock_is_enabled_);
1468
1469 // Turn on CapsLock.
1470 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL,
1471 ui::DomCode::CAPS_LOCK,
1472 ui::EF_CAPS_LOCK_ON | ui::EF_MOD3_DOWN,
1473 ui::DomKey::CAPS_LOCK, kNoScanCode),
1474 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_PRESSED,
1475 ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
1476 ui::EF_MOD3_DOWN, ui::DomKey::CAPS_LOCK,
1477 kNoScanCode));
1478 EXPECT_FALSE(fake_ime_keyboard_.caps_lock_is_enabled_);
1479
1480 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL,
1481 ui::DomCode::CAPS_LOCK, ui::EF_NONE,
1482 ui::DomKey::CAPS_LOCK, kNoScanCode),
1483 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_RELEASED,
1484 ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
1485 ui::EF_MOD3_DOWN, ui::DomKey::CAPS_LOCK,
1486 kNoScanCode));
1487 EXPECT_TRUE(fake_ime_keyboard_.caps_lock_is_enabled_);
1488
1489 // Remap CapsLock to Search.
1490 IntegerPrefMember search;
1491 InitModifierKeyPref(&search, prefs::kLanguageRemapCapsLockKeyTo,
1492 ui::chromeos::ModifierKey::kSearchKey);
1493
1494 // Now that CapsLock is enabled, press the remapped CapsLock button again
1495 // and expect to not disable CapsLock.
1496 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_LWIN,
1497 ui::DomCode::META_LEFT,
1498 ui::EF_COMMAND_DOWN | ui::EF_CAPS_LOCK_ON,
1499 ui::DomKey::META, kNoScanCode),
1500 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_PRESSED,
1501 ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
1502 ui::EF_CAPS_LOCK_ON,
1503 ui::DomKey::CAPS_LOCK, kNoScanCode));
1504 EXPECT_TRUE(fake_ime_keyboard_.caps_lock_is_enabled_);
1505
1506 EXPECT_EQ(GetExpectedResultAsString(
1507 ui::ET_KEY_RELEASED, ui::VKEY_LWIN, ui::DomCode::META_LEFT,
1508 ui::EF_CAPS_LOCK_ON, ui::DomKey::META, kNoScanCode),
1509 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_RELEASED,
1510 ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
1511 ui::EF_CAPS_LOCK_ON,
1512 ui::DomKey::CAPS_LOCK, kNoScanCode));
1513 EXPECT_TRUE(fake_ime_keyboard_.caps_lock_is_enabled_);
1514
1515 // Remap CapsLock key back to CapsLock.
1516 IntegerPrefMember capslock;
1517 InitModifierKeyPref(&capslock, prefs::kLanguageRemapCapsLockKeyTo,
1518 ui::chromeos::ModifierKey::kCapsLockKey);
1519
1520 // Now press CapsLock again and now expect that the CapsLock modifier is
1521 // removed.
1522 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_CAPITAL,
1523 ui::DomCode::CAPS_LOCK,
1524 ui::EF_CAPS_LOCK_ON | ui::EF_MOD3_DOWN,
1525 ui::DomKey::CAPS_LOCK, kNoScanCode),
1526 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_PRESSED,
1527 ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
1528 ui::EF_MOD3_DOWN, ui::DomKey::CAPS_LOCK,
1529 kNoScanCode));
1530 EXPECT_TRUE(fake_ime_keyboard_.caps_lock_is_enabled_);
1531
1532 // Disabling CapsLocks only happens on release of the CapsLock key.
1533 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_RELEASED, ui::VKEY_CAPITAL,
1534 ui::DomCode::CAPS_LOCK, ui::EF_NONE,
1535 ui::DomKey::CAPS_LOCK, kNoScanCode),
Yuichiro Hanada87c6e552020-02-07 01:07:371536 GetRewrittenEventAsString(rewriter(), ui::ET_KEY_RELEASED,
Weidong Guo4534b862017-11-10 03:17:051537 ui::VKEY_CAPITAL, ui::DomCode::CAPS_LOCK,
Zentaro Kavanaghc555ab452020-05-13 23:07:371538 ui::EF_NONE, ui::DomKey::CAPS_LOCK,
1539 kNoScanCode));
Jimmy Gong82c82b42021-04-17 03:12:331540 EXPECT_FALSE(fake_ime_keyboard_.caps_lock_is_enabled_);
[email protected]872ead342012-10-31 17:50:011541}
1542
[email protected]872ead342012-10-31 17:50:011543TEST_F(EventRewriterTest, TestRewriteCapsLockToControl) {
[email protected]d13e288992014-05-01 18:00:211544 // Remap CapsLock to Control.
penghuange5df2822017-03-16 22:54:361545 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]872ead342012-10-31 17:50:011546 IntegerPrefMember control;
Blake O'Harea09fa45a2017-10-13 04:19:581547 InitModifierKeyPref(&control, prefs::kLanguageRemapCapsLockKeyTo,
1548 ui::chromeos::ModifierKey::kControlKey);
[email protected]872ead342012-10-31 17:50:011549
Dmitry Torokhov3e2b7d82020-02-13 18:04:431550 TestExternalGenericKeyboard({
[email protected]106cf972014-05-28 17:28:171551 // Press CapsLock+a. Confirm that Mod3Mask is rewritten to ControlMask.
1552 // On Chrome OS, CapsLock works as a Mod3 modifier.
kpschoedel02c854d2015-06-16 14:44:291553 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:191554 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_MOD3_DOWN,
kpschoedel51d2e322015-08-28 15:29:351555 ui::DomKey::Constant<'a'>::Character},
kpschoedela281bf12016-01-07 15:08:191556 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:531557 ui::DomKey::Constant<'a'>::Character}},
[email protected]59409342012-09-21 01:03:431558
[email protected]106cf972014-05-28 17:28:171559 // Press Control+CapsLock+a. Confirm that Mod3Mask is rewritten to
1560 // ControlMask
kpschoedel02c854d2015-06-16 14:44:291561 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:191562 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_CONTROL_DOWN | ui::EF_MOD3_DOWN,
kpschoedel51d2e322015-08-28 15:29:351563 ui::DomKey::Constant<'a'>::Character},
kpschoedela281bf12016-01-07 15:08:191564 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:531565 ui::DomKey::Constant<'a'>::Character}},
[email protected]59409342012-09-21 01:03:431566
[email protected]106cf972014-05-28 17:28:171567 // Press Alt+CapsLock+a. Confirm that Mod3Mask is rewritten to
1568 // ControlMask.
kpschoedel02c854d2015-06-16 14:44:291569 {ui::ET_KEY_PRESSED,
kpschoedela281bf12016-01-07 15:08:191570 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_MOD3_DOWN,
kpschoedel51d2e322015-08-28 15:29:351571 ui::DomKey::Constant<'a'>::Character},
kpschoedela281bf12016-01-07 15:08:191572 {ui::VKEY_A, ui::DomCode::US_A, ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
kpschoedel728aa8092015-10-20 19:29:531573 ui::DomKey::Constant<'a'>::Character}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:431574 });
[email protected]59409342012-09-21 01:03:431575}
1576
[email protected]872ead342012-10-31 17:50:011577TEST_F(EventRewriterTest, TestRewriteCapsLockMod3InUse) {
1578 // Remap CapsLock to Control.
penghuange5df2822017-03-16 22:54:361579 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]872ead342012-10-31 17:50:011580 IntegerPrefMember control;
Blake O'Harea09fa45a2017-10-13 04:19:581581 InitModifierKeyPref(&control, prefs::kLanguageRemapCapsLockKeyTo,
1582 ui::chromeos::ModifierKey::kControlKey);
[email protected]872ead342012-10-31 17:50:011583
Zentaro Kavanagh1e7d867c2020-05-13 01:18:441584 SetupKeyboard("External Generic Keyboard", kKbdTopRowLayoutUnspecified,
1585 ui::INPUT_DEVICE_UNKNOWN);
[email protected]1488a035f2014-03-28 21:12:071586 input_method_manager_mock_->set_mod3_used(true);
[email protected]59409342012-09-21 01:03:431587
[email protected]872ead342012-10-31 17:50:011588 // Press CapsLock+a. Confirm that Mod3Mask is NOT rewritten to ControlMask
1589 // when Mod3Mask is already in use by the current XKB layout.
Zentaro Kavanaghc555ab452020-05-13 23:07:371590 EXPECT_EQ(
1591 GetExpectedResultAsString(
1592 ui::ET_KEY_PRESSED, ui::VKEY_A, ui::DomCode::US_A, ui::EF_NONE,
1593 ui::DomKey::Constant<'a'>::Character, kNoScanCode),
1594 GetRewrittenEventAsString(
1595 rewriter(), ui::ET_KEY_PRESSED, ui::VKEY_A, ui::DomCode::US_A,
1596 ui::EF_NONE, ui::DomKey::Constant<'a'>::Character, kNoScanCode));
[email protected]59409342012-09-21 01:03:431597
[email protected]1488a035f2014-03-28 21:12:071598 input_method_manager_mock_->set_mod3_used(false);
[email protected]59409342012-09-21 01:03:431599}
1600
Zentaro Kavanagh76b9bcb2021-05-19 06:29:451601// TODO(crbug.com/1179893): Remove once the feature is enabled permanently.
1602TEST_F(EventRewriterTest, TestRewriteExtendedKeysAltVariantsOld) {
penghuange5df2822017-03-16 22:54:361603 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
Zentaro Kavanagh76b9bcb2021-05-19 06:29:451604 scoped_feature_list_.InitAndDisableFeature(
1605 ::features::kImprovedKeyboardShortcuts);
Dmitry Torokhov3e2b7d82020-02-13 18:04:431606 TestNonAppleKeyboardVariants({
[email protected]106cf972014-05-28 17:28:171607 // Alt+Backspace -> Delete
kpschoedel02c854d2015-06-16 14:44:291608 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351609 {ui::VKEY_BACK, ui::DomCode::BACKSPACE, ui::EF_ALT_DOWN,
1610 ui::DomKey::BACKSPACE},
1611 {ui::VKEY_DELETE, ui::DomCode::DEL, ui::EF_NONE, ui::DomKey::DEL}},
kpschoedel8226fd152015-05-06 15:48:591612 // Control+Alt+Backspace -> Control+Delete
kpschoedel02c854d2015-06-16 14:44:291613 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351614 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
1615 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::BACKSPACE},
1616 {ui::VKEY_DELETE, ui::DomCode::DEL, ui::EF_CONTROL_DOWN,
1617 ui::DomKey::DEL}},
kpschoedel8226fd152015-05-06 15:48:591618 // Search+Alt+Backspace -> Alt+Backspace
kpschoedel02c854d2015-06-16 14:44:291619 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351620 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
1621 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::BACKSPACE},
1622 {ui::VKEY_BACK, ui::DomCode::BACKSPACE, ui::EF_ALT_DOWN,
1623 ui::DomKey::BACKSPACE}},
kpschoedel8226fd152015-05-06 15:48:591624 // Search+Control+Alt+Backspace -> Control+Alt+Backspace
kpschoedel02c854d2015-06-16 14:44:291625 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351626 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
kpschoedel8226fd152015-05-06 15:48:591627 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
kpschoedel51d2e322015-08-28 15:29:351628 ui::DomKey::BACKSPACE},
1629 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
1630 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::BACKSPACE}},
[email protected]106cf972014-05-28 17:28:171631 // Alt+Up -> Prior
kpschoedel02c854d2015-06-16 14:44:291632 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351633 {ui::VKEY_UP, ui::DomCode::ARROW_UP, ui::EF_ALT_DOWN,
1634 ui::DomKey::ARROW_UP},
1635 {ui::VKEY_PRIOR, ui::DomCode::PAGE_UP, ui::EF_NONE,
1636 ui::DomKey::PAGE_UP}},
[email protected]106cf972014-05-28 17:28:171637 // Alt+Down -> Next
kpschoedel02c854d2015-06-16 14:44:291638 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351639 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN, ui::EF_ALT_DOWN,
1640 ui::DomKey::ARROW_DOWN},
1641 {ui::VKEY_NEXT, ui::DomCode::PAGE_DOWN, ui::EF_NONE,
1642 ui::DomKey::PAGE_DOWN}},
[email protected]106cf972014-05-28 17:28:171643 // Ctrl+Alt+Up -> Home
kpschoedel02c854d2015-06-16 14:44:291644 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351645 {ui::VKEY_UP, ui::DomCode::ARROW_UP,
1646 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_UP},
1647 {ui::VKEY_HOME, ui::DomCode::HOME, ui::EF_NONE, ui::DomKey::HOME}},
[email protected]106cf972014-05-28 17:28:171648 // Ctrl+Alt+Down -> End
kpschoedel02c854d2015-06-16 14:44:291649 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351650 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN,
1651 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_DOWN},
1652 {ui::VKEY_END, ui::DomCode::END, ui::EF_NONE, ui::DomKey::END}},
[email protected]750508d2012-12-18 00:52:581653
Zentaro Kavanagh854291b2021-02-12 16:58:301654 // NOTE: The following are workarounds to avoid rewriting the
1655 // Alt variants by additionally pressing Search.
Qiang Xu47c04672017-11-09 03:01:371656 // Search+Ctrl+Alt+Up -> Ctrl+Alt+Up
kpschoedel02c854d2015-06-16 14:44:291657 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351658 {ui::VKEY_UP, ui::DomCode::ARROW_UP,
kpschoedel8226fd152015-05-06 15:48:591659 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
kpschoedel51d2e322015-08-28 15:29:351660 ui::DomKey::ARROW_UP},
1661 {ui::VKEY_UP, ui::DomCode::ARROW_UP,
1662 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_UP}},
kpschoedel8226fd152015-05-06 15:48:591663 // Search+Ctrl+Alt+Down -> Ctrl+Alt+Down
kpschoedel02c854d2015-06-16 14:44:291664 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351665 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN,
kpschoedel8226fd152015-05-06 15:48:591666 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
kpschoedel51d2e322015-08-28 15:29:351667 ui::DomKey::ARROW_DOWN},
1668 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN,
1669 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_DOWN}},
Zentaro Kavanagh854291b2021-02-12 16:58:301670 });
1671}
[email protected]750508d2012-12-18 00:52:581672
Zentaro Kavanaghc1898fe2021-06-25 00:31:451673// TODO(crbug.com/1179893): Remove once the feature is enabled permanently.
1674// For M92 kImprovedKeyboardShortcuts is enabled but kDeprecateAltBasedSixPack
1675// is disabled.
1676TEST_F(EventRewriterTest, TestRewriteExtendedKeysAltVariantsM92) {
1677 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
1678 TestNonAppleKeyboardVariants({
1679 // Alt+Backspace -> Delete
1680 {ui::ET_KEY_PRESSED,
1681 {ui::VKEY_BACK, ui::DomCode::BACKSPACE, ui::EF_ALT_DOWN,
1682 ui::DomKey::BACKSPACE},
1683 {ui::VKEY_DELETE, ui::DomCode::DEL, ui::EF_NONE, ui::DomKey::DEL}},
1684 // Control+Alt+Backspace -> Control+Delete
1685 {ui::ET_KEY_PRESSED,
1686 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
1687 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::BACKSPACE},
1688 {ui::VKEY_DELETE, ui::DomCode::DEL, ui::EF_CONTROL_DOWN,
1689 ui::DomKey::DEL}},
1690 // Search+Alt+Backspace -> Alt+Backspace
1691 {ui::ET_KEY_PRESSED,
1692 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
1693 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::BACKSPACE},
1694 {ui::VKEY_BACK, ui::DomCode::BACKSPACE, ui::EF_ALT_DOWN,
1695 ui::DomKey::BACKSPACE}},
1696 // Search+Control+Alt+Backspace -> Control+Alt+Backspace
1697 {ui::ET_KEY_PRESSED,
1698 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
1699 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
1700 ui::DomKey::BACKSPACE},
1701 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
1702 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::BACKSPACE}},
1703 // Alt+Up -> Prior
1704 {ui::ET_KEY_PRESSED,
1705 {ui::VKEY_UP, ui::DomCode::ARROW_UP, ui::EF_ALT_DOWN,
1706 ui::DomKey::ARROW_UP},
1707 {ui::VKEY_PRIOR, ui::DomCode::PAGE_UP, ui::EF_NONE,
1708 ui::DomKey::PAGE_UP}},
1709 // Alt+Down -> Next
1710 {ui::ET_KEY_PRESSED,
1711 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN, ui::EF_ALT_DOWN,
1712 ui::DomKey::ARROW_DOWN},
1713 {ui::VKEY_NEXT, ui::DomCode::PAGE_DOWN, ui::EF_NONE,
1714 ui::DomKey::PAGE_DOWN}},
1715 // Ctrl+Alt+Up -> Home
1716 {ui::ET_KEY_PRESSED,
1717 {ui::VKEY_UP, ui::DomCode::ARROW_UP,
1718 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_UP},
1719 {ui::VKEY_HOME, ui::DomCode::HOME, ui::EF_NONE, ui::DomKey::HOME}},
1720 // Ctrl+Alt+Down -> End
1721 {ui::ET_KEY_PRESSED,
1722 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN,
1723 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_DOWN},
1724 {ui::VKEY_END, ui::DomCode::END, ui::EF_NONE, ui::DomKey::END}},
1725
1726 // NOTE: The following are workarounds to avoid rewriting the
1727 // Alt variants by additionally pressing Search.
1728 // Search+Ctrl+Alt+Up -> Ctrl+Alt+Up
1729 {ui::ET_KEY_PRESSED,
1730 {ui::VKEY_UP, ui::DomCode::ARROW_UP,
1731 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
1732 ui::DomKey::ARROW_UP},
1733 {ui::VKEY_UP, ui::DomCode::ARROW_UP,
1734 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_UP}},
1735 // Search+Ctrl+Alt+Down -> Ctrl+Alt+Down
1736 {ui::ET_KEY_PRESSED,
1737 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN,
1738 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN,
1739 ui::DomKey::ARROW_DOWN},
1740 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN,
1741 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_DOWN}},
1742 });
1743}
1744
1745// TODO(crbug.com/1179893): Remove once the feature is enabled permanently.
1746// This is the intended final state with both kImprovedKeyboardShortcuts and
1747// kDeprecateAltBasedSixPack enabled.
Zentaro Kavanagh76b9bcb2021-05-19 06:29:451748TEST_F(EventRewriterTest, TestRewriteExtendedKeysAltVariants) {
Zentaro Kavanagh30f15aa2021-02-13 00:03:581749 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
Zentaro Kavanaghc1898fe2021-06-25 00:31:451750 scoped_feature_list_.InitAndEnableFeature(
1751 ::features::kDeprecateAltBasedSixPack);
Zentaro Kavanagh30f15aa2021-02-13 00:03:581752 // All the previously supported Alt based rewrites no longer have any
1753 // effect. The Search workarounds no longer take effect and the Search+Key
1754 // portion is rewritten as expected.
1755 TestNonAppleKeyboardVariants({
1756 // Alt+Backspace -> No Rewrite
1757 {ui::ET_KEY_PRESSED,
1758 {ui::VKEY_BACK, ui::DomCode::BACKSPACE, ui::EF_ALT_DOWN,
1759 ui::DomKey::BACKSPACE},
1760 {ui::VKEY_BACK, ui::DomCode::BACKSPACE, ui::EF_ALT_DOWN,
Zentaro Kavanagh531da3d2021-02-24 18:21:261761 ui::DomKey::BACKSPACE},
1762 kKeyboardDeviceId,
1763 /*triggers_notification=*/true},
Zentaro Kavanagh30f15aa2021-02-13 00:03:581764 // Control+Alt+Backspace -> No Rewrite
1765 {ui::ET_KEY_PRESSED,
1766 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
1767 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::BACKSPACE},
1768 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
Zentaro Kavanagh531da3d2021-02-24 18:21:261769 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::BACKSPACE},
1770 kKeyboardDeviceId,
1771 /*triggers_notification=*/true},
1772 // Search+Alt+Backspace -> Alt+Delete
Zentaro Kavanagh30f15aa2021-02-13 00:03:581773 {ui::ET_KEY_PRESSED,
1774 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
1775 ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN, ui::DomKey::BACKSPACE},
1776 {ui::VKEY_DELETE, ui::DomCode::DEL, ui::EF_ALT_DOWN, ui::DomKey::DEL}},
1777 // Search+Control+Alt+Backspace -> Control+Alt+Delete
1778 {ui::ET_KEY_PRESSED,
1779 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
1780 ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
1781 ui::DomKey::BACKSPACE},
1782 {ui::VKEY_DELETE, ui::DomCode::DEL,
1783 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::DEL}},
1784 // Alt+Up -> No Rewrite
1785 {ui::ET_KEY_PRESSED,
1786 {ui::VKEY_UP, ui::DomCode::ARROW_UP, ui::EF_ALT_DOWN,
1787 ui::DomKey::ARROW_UP},
1788 {ui::VKEY_UP, ui::DomCode::ARROW_UP, ui::EF_ALT_DOWN,
Zentaro Kavanagh531da3d2021-02-24 18:21:261789 ui::DomKey::ARROW_UP},
1790 kKeyboardDeviceId,
1791 /*triggers_notification=*/true},
Zentaro Kavanagh30f15aa2021-02-13 00:03:581792 // Alt+Down -> No Rewrite
1793 {ui::ET_KEY_PRESSED,
1794 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN, ui::EF_ALT_DOWN,
1795 ui::DomKey::ARROW_DOWN},
1796 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN, ui::EF_ALT_DOWN,
Zentaro Kavanagh531da3d2021-02-24 18:21:261797 ui::DomKey::ARROW_DOWN},
1798 kKeyboardDeviceId,
1799 /*triggers_notification=*/true},
Zentaro Kavanagh30f15aa2021-02-13 00:03:581800 // Ctrl+Alt+Up -> No Rewrite
1801 {ui::ET_KEY_PRESSED,
1802 {ui::VKEY_UP, ui::DomCode::ARROW_UP,
1803 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ARROW_UP},
1804 {ui::VKEY_UP, ui::DomCode::ARROW_UP,
Zentaro Kavanagh531da3d2021-02-24 18:21:261805 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ARROW_UP},
1806 kKeyboardDeviceId,
1807 /*triggers_notification=*/true},
Zentaro Kavanagh30f15aa2021-02-13 00:03:581808 // Ctrl+Alt+Down -> No Rewrite
1809 {ui::ET_KEY_PRESSED,
1810 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN,
1811 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ARROW_DOWN},
1812 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN,
Zentaro Kavanagh531da3d2021-02-24 18:21:261813 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::ARROW_DOWN},
1814 kKeyboardDeviceId,
1815 /*triggers_notification=*/true},
Zentaro Kavanagh30f15aa2021-02-13 00:03:581816
1817 // NOTE: The following were workarounds to avoid rewriting the
1818 // Alt variants by additionally pressing Search.
1819
1820 // Search+Ctrl+Alt+Up -> Ctrl+Alt+PageUp(aka Prior)
1821 {ui::ET_KEY_PRESSED,
1822 {ui::VKEY_UP, ui::DomCode::ARROW_UP,
1823 ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
1824 ui::DomKey::ARROW_UP},
1825 {ui::VKEY_PRIOR, ui::DomCode::PAGE_UP,
1826 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::PAGE_UP}},
1827 // Search+Ctrl+Alt+Down -> Ctrl+Alt+PageDown(aka Next)
1828 {ui::ET_KEY_PRESSED,
1829 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN,
1830 ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
1831 ui::DomKey::ARROW_DOWN},
1832 {ui::VKEY_NEXT, ui::DomCode::PAGE_DOWN,
1833 ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ui::DomKey::PAGE_DOWN}},
1834 });
1835}
1836
Zentaro Kavanagh76b9bcb2021-05-19 06:29:451837// TODO(crbug.com/1179893): Remove once the feature is enabled permanently.
1838TEST_F(EventRewriterTest, TestRewriteExtendedKeyInsertOld) {
Zentaro Kavanagh854291b2021-02-12 16:58:301839 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
Zentaro Kavanagh7e8735052021-05-07 21:27:241840 scoped_feature_list_.InitAndDisableFeature(
1841 ::features::kImprovedKeyboardShortcuts);
Zentaro Kavanagh854291b2021-02-12 16:58:301842 TestNonAppleKeyboardVariants({
[email protected]106cf972014-05-28 17:28:171843 // Period -> Period
kpschoedel02c854d2015-06-16 14:44:291844 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351845 {ui::VKEY_OEM_PERIOD, ui::DomCode::PERIOD, ui::EF_NONE,
1846 ui::DomKey::Constant<'.'>::Character},
1847 {ui::VKEY_OEM_PERIOD, ui::DomCode::PERIOD, ui::EF_NONE,
1848 ui::DomKey::Constant<'.'>::Character}},
Zentaro Kavanagh854291b2021-02-12 16:58:301849 // Search+Period -> Insert
1850 {ui::ET_KEY_PRESSED,
1851 {ui::VKEY_OEM_PERIOD, ui::DomCode::PERIOD, ui::EF_COMMAND_DOWN,
1852 ui::DomKey::Constant<'.'>::Character},
1853 {ui::VKEY_INSERT, ui::DomCode::INSERT, ui::EF_NONE, ui::DomKey::INSERT}},
1854 // Control+Search+Period -> Control+Insert
1855 {ui::ET_KEY_PRESSED,
1856 {ui::VKEY_OEM_PERIOD, ui::DomCode::PERIOD,
1857 ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN,
1858 ui::DomKey::Constant<'.'>::Character},
1859 {ui::VKEY_INSERT, ui::DomCode::INSERT, ui::EF_CONTROL_DOWN,
1860 ui::DomKey::INSERT}},
1861 });
1862}
[email protected]3e035e82012-11-27 20:54:321863
Zentaro Kavanagh76b9bcb2021-05-19 06:29:451864TEST_F(EventRewriterTest, TestRewriteExtendedKeyInsertDeprecatedNotification) {
Zentaro Kavanagh7e8735052021-05-07 21:27:241865 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
1866 scoped_feature_list_.InitAndEnableFeature(
1867 ::features::kImprovedKeyboardShortcuts);
1868 TestNonAppleKeyboardVariants({
1869 // Period -> Period
1870 {ui::ET_KEY_PRESSED,
1871 {ui::VKEY_OEM_PERIOD, ui::DomCode::PERIOD, ui::EF_NONE,
1872 ui::DomKey::Constant<'.'>::Character},
1873 {ui::VKEY_OEM_PERIOD, ui::DomCode::PERIOD, ui::EF_NONE,
1874 ui::DomKey::Constant<'.'>::Character}},
1875 // Search+Period -> No rewrite (and shows notification)
1876 {ui::ET_KEY_PRESSED,
1877 {ui::VKEY_OEM_PERIOD, ui::DomCode::PERIOD, ui::EF_COMMAND_DOWN,
1878 ui::DomKey::Constant<'.'>::Character},
1879 {ui::VKEY_OEM_PERIOD, ui::DomCode::PERIOD, ui::EF_COMMAND_DOWN,
1880 ui::DomKey::Constant<'.'>::Character},
1881 kKeyboardDeviceId,
1882 /*triggers_notification=*/true},
1883 // Control+Search+Period -> No rewrite (and shows notification)
1884 {ui::ET_KEY_PRESSED,
1885 {ui::VKEY_OEM_PERIOD, ui::DomCode::PERIOD,
1886 ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN,
1887 ui::DomKey::Constant<'.'>::Character},
1888 {ui::VKEY_OEM_PERIOD, ui::DomCode::PERIOD,
1889 ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN,
1890 ui::DomKey::Constant<'.'>::Character},
1891 kKeyboardDeviceId,
1892 /*triggers_notification=*/true},
1893 });
1894}
1895
Zentaro Kavanagh76b9bcb2021-05-19 06:29:451896// TODO(crbug.com/1179893): Rename once the feature is enabled permanently.
1897TEST_F(EventRewriterTest, TestRewriteExtendedKeyInsertNew) {
Zentaro Kavanagh7e8735052021-05-07 21:27:241898 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
1899 scoped_feature_list_.InitAndEnableFeature(
1900 ::features::kImprovedKeyboardShortcuts);
1901 TestNonAppleKeyboardVariants({
1902 // Search+Shift+Backspace -> Insert
1903 {ui::ET_KEY_PRESSED,
1904 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
1905 ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN, ui::DomKey::BACKSPACE},
1906 {ui::VKEY_INSERT, ui::DomCode::INSERT, ui::EF_NONE, ui::DomKey::INSERT}},
1907 // Control+Search+Shift+Backspace -> Control+Insert
1908 {ui::ET_KEY_PRESSED,
1909 {ui::VKEY_BACK, ui::DomCode::BACKSPACE,
1910 ui::EF_CONTROL_DOWN | ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN,
1911 ui::DomKey::BACKSPACE},
1912 {ui::VKEY_INSERT, ui::DomCode::INSERT, ui::EF_CONTROL_DOWN,
1913 ui::DomKey::INSERT}},
1914 });
1915}
1916
Zentaro Kavanagh76b9bcb2021-05-19 06:29:451917TEST_F(EventRewriterTest, TestRewriteExtendedKeysSearchVariants) {
Zentaro Kavanagh854291b2021-02-12 16:58:301918 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
1919 TestNonAppleKeyboardVariants({
[email protected]106cf972014-05-28 17:28:171920 // Search+Backspace -> Delete
kpschoedel02c854d2015-06-16 14:44:291921 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351922 {ui::VKEY_BACK, ui::DomCode::BACKSPACE, ui::EF_COMMAND_DOWN,
1923 ui::DomKey::BACKSPACE},
1924 {ui::VKEY_DELETE, ui::DomCode::DEL, ui::EF_NONE, ui::DomKey::DEL}},
[email protected]106cf972014-05-28 17:28:171925 // Search+Up -> Prior
kpschoedel02c854d2015-06-16 14:44:291926 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351927 {ui::VKEY_UP, ui::DomCode::ARROW_UP, ui::EF_COMMAND_DOWN,
1928 ui::DomKey::ARROW_UP},
1929 {ui::VKEY_PRIOR, ui::DomCode::PAGE_UP, ui::EF_NONE,
1930 ui::DomKey::PAGE_UP}},
[email protected]106cf972014-05-28 17:28:171931 // Search+Down -> Next
kpschoedel02c854d2015-06-16 14:44:291932 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351933 {ui::VKEY_DOWN, ui::DomCode::ARROW_DOWN, ui::EF_COMMAND_DOWN,
1934 ui::DomKey::ARROW_DOWN},
1935 {ui::VKEY_NEXT, ui::DomCode::PAGE_DOWN, ui::EF_NONE,
1936 ui::DomKey::PAGE_DOWN}},
[email protected]106cf972014-05-28 17:28:171937 // Search+Left -> Home
kpschoedel02c854d2015-06-16 14:44:291938 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351939 {ui::VKEY_LEFT, ui::DomCode::ARROW_LEFT, ui::EF_COMMAND_DOWN,
1940 ui::DomKey::ARROW_LEFT},
1941 {ui::VKEY_HOME, ui::DomCode::HOME, ui::EF_NONE, ui::DomKey::HOME}},
Zentaro Kavanagh854291b2021-02-12 16:58:301942 // Control+Search+Left -> Control+Home
kpschoedel02c854d2015-06-16 14:44:291943 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351944 {ui::VKEY_LEFT, ui::DomCode::ARROW_LEFT,
1945 ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_LEFT},
1946 {ui::VKEY_HOME, ui::DomCode::HOME, ui::EF_CONTROL_DOWN,
1947 ui::DomKey::HOME}},
[email protected]106cf972014-05-28 17:28:171948 // Search+Right -> End
kpschoedel02c854d2015-06-16 14:44:291949 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351950 {ui::VKEY_RIGHT, ui::DomCode::ARROW_RIGHT, ui::EF_COMMAND_DOWN,
1951 ui::DomKey::ARROW_RIGHT},
1952 {ui::VKEY_END, ui::DomCode::END, ui::EF_NONE, ui::DomKey::END}},
Zentaro Kavanagh854291b2021-02-12 16:58:301953 // Control+Search+Right -> Control+End
kpschoedel02c854d2015-06-16 14:44:291954 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351955 {ui::VKEY_RIGHT, ui::DomCode::ARROW_RIGHT,
1956 ui::EF_COMMAND_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_RIGHT},
1957 {ui::VKEY_END, ui::DomCode::END, ui::EF_CONTROL_DOWN, ui::DomKey::END}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:431958 });
[email protected]f925a1a2012-11-30 07:27:521959}
[email protected]3e035e82012-11-27 20:54:321960
Zentaro Kavanagh854291b2021-02-12 16:58:301961TEST_F(EventRewriterTest, TestNumberRowIsNotRewritten) {
penghuange5df2822017-03-16 22:54:361962 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]750508d2012-12-18 00:52:581963
Zentaro Kavanaghc65969ef2020-05-14 00:58:431964 TestNonAppleNonCustomLayoutKeyboardVariants({
[email protected]106cf972014-05-28 17:28:171965 // The number row should not be rewritten without Search key.
kpschoedel02c854d2015-06-16 14:44:291966 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351967 {ui::VKEY_1, ui::DomCode::DIGIT1, ui::EF_NONE,
1968 ui::DomKey::Constant<'1'>::Character},
1969 {ui::VKEY_1, ui::DomCode::DIGIT1, ui::EF_NONE,
1970 ui::DomKey::Constant<'1'>::Character}},
kpschoedel02c854d2015-06-16 14:44:291971 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351972 {ui::VKEY_2, ui::DomCode::DIGIT2, ui::EF_NONE,
1973 ui::DomKey::Constant<'2'>::Character},
1974 {ui::VKEY_2, ui::DomCode::DIGIT2, ui::EF_NONE,
1975 ui::DomKey::Constant<'2'>::Character}},
kpschoedel02c854d2015-06-16 14:44:291976 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351977 {ui::VKEY_3, ui::DomCode::DIGIT3, ui::EF_NONE,
1978 ui::DomKey::Constant<'3'>::Character},
1979 {ui::VKEY_3, ui::DomCode::DIGIT3, ui::EF_NONE,
1980 ui::DomKey::Constant<'3'>::Character}},
kpschoedel02c854d2015-06-16 14:44:291981 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351982 {ui::VKEY_4, ui::DomCode::DIGIT4, ui::EF_NONE,
1983 ui::DomKey::Constant<'4'>::Character},
1984 {ui::VKEY_4, ui::DomCode::DIGIT4, ui::EF_NONE,
1985 ui::DomKey::Constant<'4'>::Character}},
kpschoedel02c854d2015-06-16 14:44:291986 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351987 {ui::VKEY_5, ui::DomCode::DIGIT5, ui::EF_NONE,
1988 ui::DomKey::Constant<'5'>::Character},
1989 {ui::VKEY_5, ui::DomCode::DIGIT5, ui::EF_NONE,
1990 ui::DomKey::Constant<'5'>::Character}},
kpschoedel02c854d2015-06-16 14:44:291991 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351992 {ui::VKEY_6, ui::DomCode::DIGIT6, ui::EF_NONE,
1993 ui::DomKey::Constant<'6'>::Character},
1994 {ui::VKEY_6, ui::DomCode::DIGIT6, ui::EF_NONE,
1995 ui::DomKey::Constant<'6'>::Character}},
kpschoedel02c854d2015-06-16 14:44:291996 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:351997 {ui::VKEY_7, ui::DomCode::DIGIT7, ui::EF_NONE,
1998 ui::DomKey::Constant<'7'>::Character},
1999 {ui::VKEY_7, ui::DomCode::DIGIT7, ui::EF_NONE,
2000 ui::DomKey::Constant<'7'>::Character}},
kpschoedel02c854d2015-06-16 14:44:292001 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352002 {ui::VKEY_8, ui::DomCode::DIGIT8, ui::EF_NONE,
2003 ui::DomKey::Constant<'8'>::Character},
2004 {ui::VKEY_8, ui::DomCode::DIGIT8, ui::EF_NONE,
2005 ui::DomKey::Constant<'8'>::Character}},
kpschoedel02c854d2015-06-16 14:44:292006 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352007 {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_NONE,
2008 ui::DomKey::Constant<'9'>::Character},
2009 {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_NONE,
2010 ui::DomKey::Constant<'9'>::Character}},
kpschoedel02c854d2015-06-16 14:44:292011 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352012 {ui::VKEY_0, ui::DomCode::DIGIT0, ui::EF_NONE,
2013 ui::DomKey::Constant<'0'>::Character},
2014 {ui::VKEY_0, ui::DomCode::DIGIT0, ui::EF_NONE,
2015 ui::DomKey::Constant<'0'>::Character}},
kpschoedel02c854d2015-06-16 14:44:292016 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352017 {ui::VKEY_OEM_MINUS, ui::DomCode::MINUS, ui::EF_NONE,
2018 ui::DomKey::Constant<'-'>::Character},
2019 {ui::VKEY_OEM_MINUS, ui::DomCode::MINUS, ui::EF_NONE,
2020 ui::DomKey::Constant<'-'>::Character}},
kpschoedel02c854d2015-06-16 14:44:292021 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352022 {ui::VKEY_OEM_PLUS, ui::DomCode::EQUAL, ui::EF_NONE,
2023 ui::DomKey::Constant<'='>::Character},
2024 {ui::VKEY_OEM_PLUS, ui::DomCode::EQUAL, ui::EF_NONE,
2025 ui::DomKey::Constant<'='>::Character}},
Zentaro Kavanagh854291b2021-02-12 16:58:302026 });
2027}
[email protected]750508d2012-12-18 00:52:582028
Zentaro Kavanagh76b9bcb2021-05-19 06:29:452029// TODO(crbug.com/1179893): Remove once the feature is enabled permanently.
2030TEST_F(EventRewriterTest, TestRewriteSearchNumberToFunctionKeyOld) {
Zentaro Kavanagh854291b2021-02-12 16:58:302031 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
Zentaro Kavanagh76b9bcb2021-05-19 06:29:452032 scoped_feature_list_.InitAndDisableFeature(
2033 ::features::kImprovedKeyboardShortcuts);
Zentaro Kavanagh854291b2021-02-12 16:58:302034 TestNonAppleNonCustomLayoutKeyboardVariants({
[email protected]106cf972014-05-28 17:28:172035 // The number row should be rewritten as the F<number> row with Search
2036 // key.
kpschoedel02c854d2015-06-16 14:44:292037 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352038 {ui::VKEY_1, ui::DomCode::DIGIT1, ui::EF_COMMAND_DOWN,
2039 ui::DomKey::Constant<'1'>::Character},
2040 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1}},
kpschoedel02c854d2015-06-16 14:44:292041 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352042 {ui::VKEY_2, ui::DomCode::DIGIT2, ui::EF_COMMAND_DOWN,
2043 ui::DomKey::Constant<'2'>::Character},
2044 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2}},
kpschoedel02c854d2015-06-16 14:44:292045 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352046 {ui::VKEY_3, ui::DomCode::DIGIT3, ui::EF_COMMAND_DOWN,
2047 ui::DomKey::Constant<'3'>::Character},
2048 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3}},
kpschoedel02c854d2015-06-16 14:44:292049 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352050 {ui::VKEY_4, ui::DomCode::DIGIT4, ui::EF_COMMAND_DOWN,
2051 ui::DomKey::Constant<'4'>::Character},
2052 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4}},
kpschoedel02c854d2015-06-16 14:44:292053 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352054 {ui::VKEY_5, ui::DomCode::DIGIT5, ui::EF_COMMAND_DOWN,
2055 ui::DomKey::Constant<'5'>::Character},
2056 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5}},
kpschoedel02c854d2015-06-16 14:44:292057 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352058 {ui::VKEY_6, ui::DomCode::DIGIT6, ui::EF_COMMAND_DOWN,
2059 ui::DomKey::Constant<'6'>::Character},
2060 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6}},
kpschoedel02c854d2015-06-16 14:44:292061 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352062 {ui::VKEY_7, ui::DomCode::DIGIT7, ui::EF_COMMAND_DOWN,
2063 ui::DomKey::Constant<'7'>::Character},
2064 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7}},
kpschoedel02c854d2015-06-16 14:44:292065 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352066 {ui::VKEY_8, ui::DomCode::DIGIT8, ui::EF_COMMAND_DOWN,
2067 ui::DomKey::Constant<'8'>::Character},
2068 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8}},
kpschoedel02c854d2015-06-16 14:44:292069 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352070 {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_COMMAND_DOWN,
2071 ui::DomKey::Constant<'9'>::Character},
2072 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9}},
kpschoedel02c854d2015-06-16 14:44:292073 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352074 {ui::VKEY_0, ui::DomCode::DIGIT0, ui::EF_COMMAND_DOWN,
2075 ui::DomKey::Constant<'0'>::Character},
2076 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10}},
kpschoedel02c854d2015-06-16 14:44:292077 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352078 {ui::VKEY_OEM_MINUS, ui::DomCode::MINUS, ui::EF_COMMAND_DOWN,
2079 ui::DomKey::Constant<'-'>::Character},
2080 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}},
kpschoedel02c854d2015-06-16 14:44:292081 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352082 {ui::VKEY_OEM_PLUS, ui::DomCode::EQUAL, ui::EF_COMMAND_DOWN,
2083 ui::DomKey::Constant<'='>::Character},
2084 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
Zentaro Kavanagh854291b2021-02-12 16:58:302085 });
2086}
[email protected]750508d2012-12-18 00:52:582087
Zentaro Kavanagh76b9bcb2021-05-19 06:29:452088TEST_F(EventRewriterTest, TestRewriteSearchNumberToFunctionKeyNoAction) {
Zentaro Kavanagh30f15aa2021-02-13 00:03:582089 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
Zentaro Kavanagh30f15aa2021-02-13 00:03:582090 TestNonAppleNonCustomLayoutKeyboardVariants({
Zentaro Kavanagh658ca4f2021-03-25 22:47:262091 // Search+Number should now have no effect but a notification will
2092 // be shown the first time F1 to F10 is pressed.
Zentaro Kavanagh30f15aa2021-02-13 00:03:582093 {ui::ET_KEY_PRESSED,
2094 {ui::VKEY_1, ui::DomCode::DIGIT1, ui::EF_COMMAND_DOWN,
2095 ui::DomKey::Constant<'1'>::Character},
2096 {ui::VKEY_1, ui::DomCode::DIGIT1, ui::EF_COMMAND_DOWN,
Zentaro Kavanagh658ca4f2021-03-25 22:47:262097 ui::DomKey::Constant<'1'>::Character},
2098 kKeyboardDeviceId,
2099 /*triggers_notification=*/true},
Zentaro Kavanagh30f15aa2021-02-13 00:03:582100 {ui::ET_KEY_PRESSED,
2101 {ui::VKEY_2, ui::DomCode::DIGIT2, ui::EF_COMMAND_DOWN,
2102 ui::DomKey::Constant<'2'>::Character},
2103 {ui::VKEY_2, ui::DomCode::DIGIT2, ui::EF_COMMAND_DOWN,
Zentaro Kavanagh658ca4f2021-03-25 22:47:262104 ui::DomKey::Constant<'2'>::Character},
2105 kKeyboardDeviceId,
2106 /*triggers_notification=*/true},
Zentaro Kavanagh30f15aa2021-02-13 00:03:582107 {ui::ET_KEY_PRESSED,
2108 {ui::VKEY_3, ui::DomCode::DIGIT3, ui::EF_COMMAND_DOWN,
2109 ui::DomKey::Constant<'3'>::Character},
2110 {ui::VKEY_3, ui::DomCode::DIGIT3, ui::EF_COMMAND_DOWN,
Zentaro Kavanagh658ca4f2021-03-25 22:47:262111 ui::DomKey::Constant<'3'>::Character},
2112 kKeyboardDeviceId,
2113 /*triggers_notification=*/true},
Zentaro Kavanagh30f15aa2021-02-13 00:03:582114 {ui::ET_KEY_PRESSED,
2115 {ui::VKEY_4, ui::DomCode::DIGIT4, ui::EF_COMMAND_DOWN,
2116 ui::DomKey::Constant<'4'>::Character},
2117 {ui::VKEY_4, ui::DomCode::DIGIT4, ui::EF_COMMAND_DOWN,
Zentaro Kavanagh658ca4f2021-03-25 22:47:262118 ui::DomKey::Constant<'4'>::Character},
2119 kKeyboardDeviceId,
2120 /*triggers_notification=*/true},
Zentaro Kavanagh30f15aa2021-02-13 00:03:582121 {ui::ET_KEY_PRESSED,
2122 {ui::VKEY_5, ui::DomCode::DIGIT5, ui::EF_COMMAND_DOWN,
2123 ui::DomKey::Constant<'5'>::Character},
2124 {ui::VKEY_5, ui::DomCode::DIGIT5, ui::EF_COMMAND_DOWN,
Zentaro Kavanagh658ca4f2021-03-25 22:47:262125 ui::DomKey::Constant<'5'>::Character},
2126 kKeyboardDeviceId,
2127 /*triggers_notification=*/true},
Zentaro Kavanagh30f15aa2021-02-13 00:03:582128 {ui::ET_KEY_PRESSED,
2129 {ui::VKEY_6, ui::DomCode::DIGIT6, ui::EF_COMMAND_DOWN,
2130 ui::DomKey::Constant<'6'>::Character},
2131 {ui::VKEY_6, ui::DomCode::DIGIT6, ui::EF_COMMAND_DOWN,
Zentaro Kavanagh658ca4f2021-03-25 22:47:262132 ui::DomKey::Constant<'6'>::Character},
2133 kKeyboardDeviceId,
2134 /*triggers_notification=*/true},
Zentaro Kavanagh30f15aa2021-02-13 00:03:582135 {ui::ET_KEY_PRESSED,
2136 {ui::VKEY_7, ui::DomCode::DIGIT7, ui::EF_COMMAND_DOWN,
2137 ui::DomKey::Constant<'7'>::Character},
2138 {ui::VKEY_7, ui::DomCode::DIGIT7, ui::EF_COMMAND_DOWN,
Zentaro Kavanagh658ca4f2021-03-25 22:47:262139 ui::DomKey::Constant<'7'>::Character},
2140 kKeyboardDeviceId,
2141 /*triggers_notification=*/true},
Zentaro Kavanagh30f15aa2021-02-13 00:03:582142 {ui::ET_KEY_PRESSED,
2143 {ui::VKEY_8, ui::DomCode::DIGIT8, ui::EF_COMMAND_DOWN,
2144 ui::DomKey::Constant<'8'>::Character},
2145 {ui::VKEY_8, ui::DomCode::DIGIT8, ui::EF_COMMAND_DOWN,
Zentaro Kavanagh658ca4f2021-03-25 22:47:262146 ui::DomKey::Constant<'8'>::Character},
2147 kKeyboardDeviceId,
2148 /*triggers_notification=*/true},
Zentaro Kavanagh30f15aa2021-02-13 00:03:582149 {ui::ET_KEY_PRESSED,
2150 {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_COMMAND_DOWN,
2151 ui::DomKey::Constant<'9'>::Character},
2152 {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_COMMAND_DOWN,
Zentaro Kavanagh658ca4f2021-03-25 22:47:262153 ui::DomKey::Constant<'9'>::Character},
2154 kKeyboardDeviceId,
2155 /*triggers_notification=*/true},
Zentaro Kavanagh30f15aa2021-02-13 00:03:582156 {ui::ET_KEY_PRESSED,
2157 {ui::VKEY_0, ui::DomCode::DIGIT0, ui::EF_COMMAND_DOWN,
2158 ui::DomKey::Constant<'0'>::Character},
2159 {ui::VKEY_0, ui::DomCode::DIGIT0, ui::EF_COMMAND_DOWN,
Zentaro Kavanagh658ca4f2021-03-25 22:47:262160 ui::DomKey::Constant<'0'>::Character},
2161 kKeyboardDeviceId,
2162 /*triggers_notification=*/true},
Zentaro Kavanagh30f15aa2021-02-13 00:03:582163 {ui::ET_KEY_PRESSED,
2164 {ui::VKEY_OEM_MINUS, ui::DomCode::MINUS, ui::EF_COMMAND_DOWN,
2165 ui::DomKey::Constant<'-'>::Character},
2166 {ui::VKEY_OEM_MINUS, ui::DomCode::MINUS, ui::EF_COMMAND_DOWN,
2167 ui::DomKey::Constant<'-'>::Character}},
2168 {ui::ET_KEY_PRESSED,
2169 {ui::VKEY_OEM_PLUS, ui::DomCode::EQUAL, ui::EF_COMMAND_DOWN,
2170 ui::DomKey::Constant<'='>::Character},
2171 {ui::VKEY_OEM_PLUS, ui::DomCode::EQUAL, ui::EF_COMMAND_DOWN,
2172 ui::DomKey::Constant<'='>::Character}},
2173 });
2174}
2175
Zentaro Kavanagh854291b2021-02-12 16:58:302176TEST_F(EventRewriterTest, TestFunctionKeysNotRewrittenBySearch) {
2177 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
2178
2179 TestNonAppleNonCustomLayoutKeyboardVariants({
[email protected]106cf972014-05-28 17:28:172180 // The function keys should not be rewritten with Search key pressed.
kpschoedel02c854d2015-06-16 14:44:292181 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352182 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_COMMAND_DOWN, ui::DomKey::F1},
2183 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1}},
kpschoedel02c854d2015-06-16 14:44:292184 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352185 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_COMMAND_DOWN, ui::DomKey::F2},
2186 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2}},
kpschoedel02c854d2015-06-16 14:44:292187 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352188 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_COMMAND_DOWN, ui::DomKey::F3},
2189 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3}},
kpschoedel02c854d2015-06-16 14:44:292190 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352191 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_COMMAND_DOWN, ui::DomKey::F4},
2192 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4}},
kpschoedel02c854d2015-06-16 14:44:292193 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352194 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_COMMAND_DOWN, ui::DomKey::F5},
2195 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5}},
kpschoedel02c854d2015-06-16 14:44:292196 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352197 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_COMMAND_DOWN, ui::DomKey::F6},
2198 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6}},
kpschoedel02c854d2015-06-16 14:44:292199 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352200 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_COMMAND_DOWN, ui::DomKey::F7},
2201 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7}},
kpschoedel02c854d2015-06-16 14:44:292202 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352203 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_COMMAND_DOWN, ui::DomKey::F8},
2204 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8}},
kpschoedel02c854d2015-06-16 14:44:292205 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352206 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_COMMAND_DOWN, ui::DomKey::F9},
2207 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9}},
kpschoedel02c854d2015-06-16 14:44:292208 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352209 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_COMMAND_DOWN, ui::DomKey::F10},
2210 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10}},
kpschoedel02c854d2015-06-16 14:44:292211 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352212 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_COMMAND_DOWN, ui::DomKey::F11},
2213 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}},
kpschoedel02c854d2015-06-16 14:44:292214 {ui::ET_KEY_PRESSED,
kpschoedel51d2e322015-08-28 15:29:352215 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_COMMAND_DOWN, ui::DomKey::F12},
Dmitry Torokhov3e2b7d82020-02-13 18:04:432216 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
2217 });
[email protected]4a822092012-06-15 03:42:512218}
2219
Zentaro Kavanaghc65969ef2020-05-14 00:58:432220TEST_F(EventRewriterTest, TestRewriteFunctionKeysNonCustomLayouts) {
2221 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
2222
2223 // Old CrOS keyboards that do not have custom layouts send F-Keys by default
2224 // and are translated by default to Actions based on hardcoded mappings.
2225 // New CrOS keyboards are not tested here because they do not remap F-Keys.
2226 TestNonAppleNonCustomLayoutKeyboardVariants({
2227 // F1 -> Back
2228 {ui::ET_KEY_PRESSED,
2229 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1},
2230 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_NONE,
2231 ui::DomKey::BROWSER_BACK}},
2232 {ui::ET_KEY_PRESSED,
2233 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_CONTROL_DOWN, ui::DomKey::F1},
2234 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_CONTROL_DOWN,
2235 ui::DomKey::BROWSER_BACK}},
2236 {ui::ET_KEY_PRESSED,
2237 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_ALT_DOWN, ui::DomKey::F1},
2238 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_ALT_DOWN,
2239 ui::DomKey::BROWSER_BACK}},
2240 // F2 -> Forward
2241 {ui::ET_KEY_PRESSED,
2242 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2},
2243 {ui::VKEY_BROWSER_FORWARD, ui::DomCode::BROWSER_FORWARD, ui::EF_NONE,
2244 ui::DomKey::BROWSER_FORWARD}},
2245 {ui::ET_KEY_PRESSED,
2246 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_CONTROL_DOWN, ui::DomKey::F2},
2247 {ui::VKEY_BROWSER_FORWARD, ui::DomCode::BROWSER_FORWARD,
2248 ui::EF_CONTROL_DOWN, ui::DomKey::BROWSER_FORWARD}},
2249 {ui::ET_KEY_PRESSED,
2250 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_ALT_DOWN, ui::DomKey::F2},
2251 {ui::VKEY_BROWSER_FORWARD, ui::DomCode::BROWSER_FORWARD, ui::EF_ALT_DOWN,
2252 ui::DomKey::BROWSER_FORWARD}},
2253 // F3 -> Refresh
2254 {ui::ET_KEY_PRESSED,
2255 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3},
2256 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_NONE,
2257 ui::DomKey::BROWSER_REFRESH}},
2258 {ui::ET_KEY_PRESSED,
2259 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_CONTROL_DOWN, ui::DomKey::F3},
2260 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH,
2261 ui::EF_CONTROL_DOWN, ui::DomKey::BROWSER_REFRESH}},
2262 {ui::ET_KEY_PRESSED,
2263 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_ALT_DOWN, ui::DomKey::F3},
2264 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_ALT_DOWN,
2265 ui::DomKey::BROWSER_REFRESH}},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:442266 // F4 -> Zoom (aka Fullscreen)
Zentaro Kavanaghc65969ef2020-05-14 00:58:432267 {ui::ET_KEY_PRESSED,
2268 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:442269 {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_NONE,
Zentaro Kavanaghc65969ef2020-05-14 00:58:432270 ui::DomKey::ZOOM_TOGGLE}},
2271 {ui::ET_KEY_PRESSED,
2272 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_CONTROL_DOWN, ui::DomKey::F4},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:442273 {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_CONTROL_DOWN,
2274 ui::DomKey::ZOOM_TOGGLE}},
Zentaro Kavanaghc65969ef2020-05-14 00:58:432275 {ui::ET_KEY_PRESSED,
2276 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_ALT_DOWN, ui::DomKey::F4},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:442277 {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_ALT_DOWN,
Zentaro Kavanaghc65969ef2020-05-14 00:58:432278 ui::DomKey::ZOOM_TOGGLE}},
2279 // F5 -> Launch App 1
2280 {ui::ET_KEY_PRESSED,
2281 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5},
2282 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::SELECT_TASK, ui::EF_NONE,
2283 ui::DomKey::LAUNCH_MY_COMPUTER}},
2284 {ui::ET_KEY_PRESSED,
2285 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_CONTROL_DOWN, ui::DomKey::F5},
2286 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::SELECT_TASK,
2287 ui::EF_CONTROL_DOWN, ui::DomKey::LAUNCH_MY_COMPUTER}},
2288 {ui::ET_KEY_PRESSED,
2289 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_ALT_DOWN, ui::DomKey::F5},
2290 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::SELECT_TASK, ui::EF_ALT_DOWN,
2291 ui::DomKey::LAUNCH_MY_COMPUTER}},
2292 // F6 -> Brightness down
2293 {ui::ET_KEY_PRESSED,
2294 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6},
2295 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN, ui::EF_NONE,
2296 ui::DomKey::BRIGHTNESS_DOWN}},
2297 {ui::ET_KEY_PRESSED,
2298 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_CONTROL_DOWN, ui::DomKey::F6},
2299 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN,
2300 ui::EF_CONTROL_DOWN, ui::DomKey::BRIGHTNESS_DOWN}},
2301 {ui::ET_KEY_PRESSED,
2302 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_ALT_DOWN, ui::DomKey::F6},
2303 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN, ui::EF_ALT_DOWN,
2304 ui::DomKey::BRIGHTNESS_DOWN}},
2305 // F7 -> Brightness up
2306 {ui::ET_KEY_PRESSED,
2307 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7},
2308 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_NONE,
2309 ui::DomKey::BRIGHTNESS_UP}},
2310 {ui::ET_KEY_PRESSED,
2311 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_CONTROL_DOWN, ui::DomKey::F7},
2312 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_CONTROL_DOWN,
2313 ui::DomKey::BRIGHTNESS_UP}},
2314 {ui::ET_KEY_PRESSED,
2315 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_ALT_DOWN, ui::DomKey::F7},
2316 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_ALT_DOWN,
2317 ui::DomKey::BRIGHTNESS_UP}},
2318 // F8 -> Volume Mute
2319 {ui::ET_KEY_PRESSED,
2320 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8},
2321 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_NONE,
2322 ui::DomKey::AUDIO_VOLUME_MUTE}},
2323 {ui::ET_KEY_PRESSED,
2324 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_CONTROL_DOWN, ui::DomKey::F8},
2325 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_CONTROL_DOWN,
2326 ui::DomKey::AUDIO_VOLUME_MUTE}},
2327 {ui::ET_KEY_PRESSED,
2328 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_ALT_DOWN, ui::DomKey::F8},
2329 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_ALT_DOWN,
2330 ui::DomKey::AUDIO_VOLUME_MUTE}},
2331 // F9 -> Volume Down
2332 {ui::ET_KEY_PRESSED,
2333 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9},
2334 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_NONE,
2335 ui::DomKey::AUDIO_VOLUME_DOWN}},
2336 {ui::ET_KEY_PRESSED,
2337 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_CONTROL_DOWN, ui::DomKey::F9},
2338 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_CONTROL_DOWN,
2339 ui::DomKey::AUDIO_VOLUME_DOWN}},
2340 {ui::ET_KEY_PRESSED,
2341 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_ALT_DOWN, ui::DomKey::F9},
2342 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_ALT_DOWN,
2343 ui::DomKey::AUDIO_VOLUME_DOWN}},
2344 // F10 -> Volume Up
2345 {ui::ET_KEY_PRESSED,
2346 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10},
2347 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_NONE,
2348 ui::DomKey::AUDIO_VOLUME_UP}},
2349 {ui::ET_KEY_PRESSED,
2350 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_CONTROL_DOWN, ui::DomKey::F10},
2351 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_CONTROL_DOWN,
2352 ui::DomKey::AUDIO_VOLUME_UP}},
2353 {ui::ET_KEY_PRESSED,
2354 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_ALT_DOWN, ui::DomKey::F10},
2355 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_ALT_DOWN,
2356 ui::DomKey::AUDIO_VOLUME_UP}},
2357 // F11 -> F11
2358 {ui::ET_KEY_PRESSED,
2359 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11},
2360 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}},
2361 {ui::ET_KEY_PRESSED,
2362 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_CONTROL_DOWN, ui::DomKey::F11},
2363 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_CONTROL_DOWN, ui::DomKey::F11}},
2364 {ui::ET_KEY_PRESSED,
2365 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_ALT_DOWN, ui::DomKey::F11},
2366 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_ALT_DOWN, ui::DomKey::F11}},
2367 // F12 -> F12
2368 {ui::ET_KEY_PRESSED,
2369 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12},
2370 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
2371 {ui::ET_KEY_PRESSED,
2372 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12},
2373 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12}},
2374 {ui::ET_KEY_PRESSED,
2375 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_ALT_DOWN, ui::DomKey::F12},
2376 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_ALT_DOWN, ui::DomKey::F12}},
2377 });
2378}
2379
2380TEST_F(EventRewriterTest, TestRewriteFunctionKeysCustomLayoutsFKeyUnchanged) {
2381 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
2382
2383 // On devices with custom layouts, the F-Keys are never remapped.
2384 TestChromeCustomLayoutKeyboardVariants({
2385 // F1-> F1
2386 {ui::ET_KEY_PRESSED,
2387 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1},
2388 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1}},
2389 {ui::ET_KEY_PRESSED,
2390 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_CONTROL_DOWN, ui::DomKey::F1},
2391 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_CONTROL_DOWN, ui::DomKey::F1}},
2392 {ui::ET_KEY_PRESSED,
2393 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_ALT_DOWN, ui::DomKey::F1},
2394 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_ALT_DOWN, ui::DomKey::F1}},
2395 {ui::ET_KEY_PRESSED,
2396 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_COMMAND_DOWN, ui::DomKey::F1},
2397 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_COMMAND_DOWN, ui::DomKey::F1}},
2398 // F2 -> F2
2399 {ui::ET_KEY_PRESSED,
2400 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2},
2401 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2}},
2402 {ui::ET_KEY_PRESSED,
2403 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_CONTROL_DOWN, ui::DomKey::F2},
2404 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_CONTROL_DOWN, ui::DomKey::F2}},
2405 {ui::ET_KEY_PRESSED,
2406 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_ALT_DOWN, ui::DomKey::F2},
2407 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_ALT_DOWN, ui::DomKey::F2}},
2408 {ui::ET_KEY_PRESSED,
2409 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_COMMAND_DOWN, ui::DomKey::F2},
2410 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_COMMAND_DOWN, ui::DomKey::F2}},
2411 // F3 -> F3
2412 {ui::ET_KEY_PRESSED,
2413 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3},
2414 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3}},
2415 {ui::ET_KEY_PRESSED,
2416 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_CONTROL_DOWN, ui::DomKey::F3},
2417 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_CONTROL_DOWN, ui::DomKey::F3}},
2418 {ui::ET_KEY_PRESSED,
2419 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_ALT_DOWN, ui::DomKey::F3},
2420 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_ALT_DOWN, ui::DomKey::F3}},
2421 {ui::ET_KEY_PRESSED,
2422 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_COMMAND_DOWN, ui::DomKey::F3},
2423 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_COMMAND_DOWN, ui::DomKey::F3}},
2424 // F4 -> F4
2425 {ui::ET_KEY_PRESSED,
2426 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4},
2427 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4}},
2428 {ui::ET_KEY_PRESSED,
2429 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_CONTROL_DOWN, ui::DomKey::F4},
2430 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_CONTROL_DOWN, ui::DomKey::F4}},
2431 {ui::ET_KEY_PRESSED,
2432 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_ALT_DOWN, ui::DomKey::F4},
2433 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_ALT_DOWN, ui::DomKey::F4}},
2434 {ui::ET_KEY_PRESSED,
2435 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_COMMAND_DOWN, ui::DomKey::F4},
2436 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_COMMAND_DOWN, ui::DomKey::F4}},
2437 // F5 -> F5
2438 {ui::ET_KEY_PRESSED,
2439 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5},
2440 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5}},
2441 {ui::ET_KEY_PRESSED,
2442 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_CONTROL_DOWN, ui::DomKey::F5},
2443 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_CONTROL_DOWN, ui::DomKey::F5}},
2444 {ui::ET_KEY_PRESSED,
2445 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_ALT_DOWN, ui::DomKey::F5},
2446 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_ALT_DOWN, ui::DomKey::F5}},
2447 {ui::ET_KEY_PRESSED,
2448 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_COMMAND_DOWN, ui::DomKey::F5},
2449 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_COMMAND_DOWN, ui::DomKey::F5}},
2450 // F6 -> F6
2451 {ui::ET_KEY_PRESSED,
2452 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6},
2453 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6}},
2454 {ui::ET_KEY_PRESSED,
2455 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_CONTROL_DOWN, ui::DomKey::F6},
2456 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_CONTROL_DOWN, ui::DomKey::F6}},
2457 {ui::ET_KEY_PRESSED,
2458 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_ALT_DOWN, ui::DomKey::F6},
2459 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_ALT_DOWN, ui::DomKey::F6}},
2460 {ui::ET_KEY_PRESSED,
2461 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_COMMAND_DOWN, ui::DomKey::F6},
2462 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_COMMAND_DOWN, ui::DomKey::F6}},
2463 // F7 -> F7
2464 {ui::ET_KEY_PRESSED,
2465 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7},
2466 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7}},
2467 {ui::ET_KEY_PRESSED,
2468 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_CONTROL_DOWN, ui::DomKey::F7},
2469 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_CONTROL_DOWN, ui::DomKey::F7}},
2470 {ui::ET_KEY_PRESSED,
2471 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_ALT_DOWN, ui::DomKey::F7},
2472 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_ALT_DOWN, ui::DomKey::F7}},
2473 {ui::ET_KEY_PRESSED,
2474 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_COMMAND_DOWN, ui::DomKey::F7},
2475 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_COMMAND_DOWN, ui::DomKey::F7}},
2476 // F8 -> F8
2477 {ui::ET_KEY_PRESSED,
2478 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8},
2479 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8}},
2480 {ui::ET_KEY_PRESSED,
2481 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_CONTROL_DOWN, ui::DomKey::F8},
2482 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_CONTROL_DOWN, ui::DomKey::F8}},
2483 {ui::ET_KEY_PRESSED,
2484 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_ALT_DOWN, ui::DomKey::F8},
2485 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_ALT_DOWN, ui::DomKey::F8}},
2486 {ui::ET_KEY_PRESSED,
2487 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_COMMAND_DOWN, ui::DomKey::F8},
2488 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_COMMAND_DOWN, ui::DomKey::F8}},
2489 // F9 -> F9
2490 {ui::ET_KEY_PRESSED,
2491 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9},
2492 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9}},
2493 {ui::ET_KEY_PRESSED,
2494 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_CONTROL_DOWN, ui::DomKey::F9},
2495 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_CONTROL_DOWN, ui::DomKey::F9}},
2496 {ui::ET_KEY_PRESSED,
2497 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_ALT_DOWN, ui::DomKey::F9},
2498 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_ALT_DOWN, ui::DomKey::F9}},
2499 {ui::ET_KEY_PRESSED,
2500 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_COMMAND_DOWN, ui::DomKey::F9},
2501 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_COMMAND_DOWN, ui::DomKey::F9}},
2502 // F10 -> F10
2503 {ui::ET_KEY_PRESSED,
2504 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10},
2505 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10}},
2506 {ui::ET_KEY_PRESSED,
2507 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_CONTROL_DOWN, ui::DomKey::F10},
2508 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_CONTROL_DOWN, ui::DomKey::F10}},
2509 {ui::ET_KEY_PRESSED,
2510 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_ALT_DOWN, ui::DomKey::F10},
2511 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_ALT_DOWN, ui::DomKey::F10}},
2512 {ui::ET_KEY_PRESSED,
2513 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_COMMAND_DOWN, ui::DomKey::F10},
2514 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_COMMAND_DOWN, ui::DomKey::F10}},
2515 // F11 -> F11
2516 {ui::ET_KEY_PRESSED,
2517 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11},
2518 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}},
2519 {ui::ET_KEY_PRESSED,
2520 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_CONTROL_DOWN, ui::DomKey::F11},
2521 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_CONTROL_DOWN, ui::DomKey::F11}},
2522 {ui::ET_KEY_PRESSED,
2523 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_ALT_DOWN, ui::DomKey::F11},
2524 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_ALT_DOWN, ui::DomKey::F11}},
2525 {ui::ET_KEY_PRESSED,
2526 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_COMMAND_DOWN, ui::DomKey::F11},
2527 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_COMMAND_DOWN, ui::DomKey::F11}},
2528 // F12 -> F12
2529 {ui::ET_KEY_PRESSED,
2530 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12},
2531 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
2532 {ui::ET_KEY_PRESSED,
2533 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12},
2534 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12}},
2535 {ui::ET_KEY_PRESSED,
2536 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_ALT_DOWN, ui::DomKey::F12},
2537 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_ALT_DOWN, ui::DomKey::F12}},
2538 {ui::ET_KEY_PRESSED,
2539 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_COMMAND_DOWN, ui::DomKey::F12},
2540 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_COMMAND_DOWN, ui::DomKey::F12}},
2541 // F13 -> F13
2542 {ui::ET_KEY_PRESSED,
2543 {ui::VKEY_F13, ui::DomCode::F13, ui::EF_NONE, ui::DomKey::F13},
2544 {ui::VKEY_F13, ui::DomCode::F13, ui::EF_NONE, ui::DomKey::F13}},
2545 {ui::ET_KEY_PRESSED,
2546 {ui::VKEY_F13, ui::DomCode::F13, ui::EF_CONTROL_DOWN, ui::DomKey::F13},
2547 {ui::VKEY_F13, ui::DomCode::F13, ui::EF_CONTROL_DOWN, ui::DomKey::F13}},
2548 {ui::ET_KEY_PRESSED,
2549 {ui::VKEY_F13, ui::DomCode::F13, ui::EF_ALT_DOWN, ui::DomKey::F13},
2550 {ui::VKEY_F13, ui::DomCode::F13, ui::EF_ALT_DOWN, ui::DomKey::F13}},
2551 {ui::ET_KEY_PRESSED,
2552 {ui::VKEY_F13, ui::DomCode::F13, ui::EF_COMMAND_DOWN, ui::DomKey::F13},
2553 {ui::VKEY_F13, ui::DomCode::F13, ui::EF_COMMAND_DOWN, ui::DomKey::F13}},
2554 // F14 -> F14
2555 {ui::ET_KEY_PRESSED,
2556 {ui::VKEY_F14, ui::DomCode::F14, ui::EF_NONE, ui::DomKey::F14},
2557 {ui::VKEY_F14, ui::DomCode::F14, ui::EF_NONE, ui::DomKey::F14}},
2558 {ui::ET_KEY_PRESSED,
2559 {ui::VKEY_F14, ui::DomCode::F14, ui::EF_CONTROL_DOWN, ui::DomKey::F14},
2560 {ui::VKEY_F14, ui::DomCode::F14, ui::EF_CONTROL_DOWN, ui::DomKey::F14}},
2561 {ui::ET_KEY_PRESSED,
2562 {ui::VKEY_F14, ui::DomCode::F14, ui::EF_ALT_DOWN, ui::DomKey::F14},
2563 {ui::VKEY_F14, ui::DomCode::F14, ui::EF_ALT_DOWN, ui::DomKey::F14}},
2564 {ui::ET_KEY_PRESSED,
2565 {ui::VKEY_F14, ui::DomCode::F14, ui::EF_COMMAND_DOWN, ui::DomKey::F14},
2566 {ui::VKEY_F14, ui::DomCode::F14, ui::EF_COMMAND_DOWN, ui::DomKey::F14}},
2567 // F15 -> F15
2568 {ui::ET_KEY_PRESSED,
2569 {ui::VKEY_F15, ui::DomCode::F15, ui::EF_NONE, ui::DomKey::F15},
2570 {ui::VKEY_F15, ui::DomCode::F15, ui::EF_NONE, ui::DomKey::F15}},
2571 {ui::ET_KEY_PRESSED,
2572 {ui::VKEY_F15, ui::DomCode::F15, ui::EF_CONTROL_DOWN, ui::DomKey::F15},
2573 {ui::VKEY_F15, ui::DomCode::F15, ui::EF_CONTROL_DOWN, ui::DomKey::F15}},
2574 {ui::ET_KEY_PRESSED,
2575 {ui::VKEY_F15, ui::DomCode::F15, ui::EF_ALT_DOWN, ui::DomKey::F15},
2576 {ui::VKEY_F15, ui::DomCode::F15, ui::EF_ALT_DOWN, ui::DomKey::F15}},
2577 {ui::ET_KEY_PRESSED,
2578 {ui::VKEY_F15, ui::DomCode::F15, ui::EF_COMMAND_DOWN, ui::DomKey::F15},
2579 {ui::VKEY_F15, ui::DomCode::F15, ui::EF_COMMAND_DOWN, ui::DomKey::F15}},
2580 });
2581}
2582
2583TEST_F(EventRewriterTest, TestRewriteFunctionKeysCustomLayoutsActionUnchanged) {
2584 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
2585
2586 // An action key on these devices is one where the scan code matches an entry
2587 // in the layout map. It doesn't matter what the action is, as long the
2588 // search key isn't pressed it will pass through unchanged.
2589 const std::string layout = "a1 a2 a3";
2590 TestKeyboard("Internal Custom Layout Keyboard", layout,
2591 ui::INPUT_DEVICE_INTERNAL, /*has_custom_top_row=*/true,
2592 {
2593 {ui::ET_KEY_PRESSED,
2594 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH,
2595 ui::EF_NONE, ui::DomKey::BROWSER_REFRESH, 0xa1},
2596 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH,
2597 ui::EF_NONE, ui::DomKey::BROWSER_REFRESH, 0xa1}},
2598 {ui::ET_KEY_PRESSED,
2599 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_NONE,
2600 ui::DomKey::AUDIO_VOLUME_UP, 0xa2},
2601 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_NONE,
2602 ui::DomKey::AUDIO_VOLUME_UP, 0xa2}},
2603 {ui::ET_KEY_PRESSED,
2604 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN,
2605 ui::EF_NONE, ui::DomKey::AUDIO_VOLUME_DOWN, 0xa3},
2606 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN,
2607 ui::EF_NONE, ui::DomKey::AUDIO_VOLUME_DOWN, 0xa3}},
2608 });
2609}
2610
2611TEST_F(EventRewriterTest, TestRewriteFunctionKeysCustomLayouts) {
2612 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
2613
2614 // On devices with custom layouts, scan codes that match the layout
2615 // map get mapped to F-Keys based only on the scan code. The search
2616 // key also gets treated as unpressed in the remapped event.
2617 const std::string layout = "a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af";
2618 TestKeyboard(
2619 "Internal Custom Layout Keyboard", layout, ui::INPUT_DEVICE_INTERNAL,
2620 /*has_custom_top_row=*/true,
2621 {
2622 // Action -> F1
2623 {ui::ET_KEY_PRESSED,
2624 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_COMMAND_DOWN,
2625 ui::DomKey::NONE, 0xa1},
2626 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1, 0xa1}},
2627 // Action -> F2
2628 {ui::ET_KEY_PRESSED,
2629 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_COMMAND_DOWN,
2630 ui::DomKey::NONE, 0xa2},
2631 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2, 0xa2}},
2632 // Action -> F3
2633 {ui::ET_KEY_PRESSED,
2634 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_COMMAND_DOWN,
2635 ui::DomKey::NONE, 0xa3},
2636 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3, 0xa3}},
2637 // Action -> F4
2638 {ui::ET_KEY_PRESSED,
2639 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_COMMAND_DOWN,
2640 ui::DomKey::NONE, 0xa4},
2641 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4, 0xa4}},
2642 // Action -> F5
2643 {ui::ET_KEY_PRESSED,
2644 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_COMMAND_DOWN,
2645 ui::DomKey::NONE, 0xa5},
2646 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5, 0xa5}},
2647 // Action -> F6
2648 {ui::ET_KEY_PRESSED,
2649 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_COMMAND_DOWN,
2650 ui::DomKey::NONE, 0xa6},
2651 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6, 0xa6}},
2652 // Action -> F7
2653 {ui::ET_KEY_PRESSED,
2654 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_COMMAND_DOWN,
2655 ui::DomKey::NONE, 0xa7},
2656 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7, 0xa7}},
2657 // Action -> F8
2658 {ui::ET_KEY_PRESSED,
2659 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_COMMAND_DOWN,
2660 ui::DomKey::NONE, 0xa8},
2661 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8, 0xa8}},
2662 // Action -> F9
2663 {ui::ET_KEY_PRESSED,
2664 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_COMMAND_DOWN,
2665 ui::DomKey::NONE, 0xa9},
2666 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9, 0xa9}},
2667 // Action -> F10
2668 {ui::ET_KEY_PRESSED,
2669 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_COMMAND_DOWN,
2670 ui::DomKey::NONE, 0xaa},
2671 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10,
2672 0xaa}},
2673 // Action -> F11
2674 {ui::ET_KEY_PRESSED,
2675 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_COMMAND_DOWN,
2676 ui::DomKey::NONE, 0xab},
2677 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11,
2678 0xab}},
2679 // Action -> F12
2680 {ui::ET_KEY_PRESSED,
2681 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_COMMAND_DOWN,
2682 ui::DomKey::NONE, 0xac},
2683 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12,
2684 0xac}},
2685 // Action -> F13
2686 {ui::ET_KEY_PRESSED,
2687 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_COMMAND_DOWN,
2688 ui::DomKey::NONE, 0xad},
2689 {ui::VKEY_F13, ui::DomCode::F13, ui::EF_NONE, ui::DomKey::F13,
2690 0xad}},
2691 // Action -> F14
2692 {ui::ET_KEY_PRESSED,
2693 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_COMMAND_DOWN,
2694 ui::DomKey::NONE, 0xae},
2695 {ui::VKEY_F14, ui::DomCode::F14, ui::EF_NONE, ui::DomKey::F14,
2696 0xae}},
2697 // Action -> F15
2698 {ui::ET_KEY_PRESSED,
2699 {ui::VKEY_UNKNOWN, ui::DomCode::NONE, ui::EF_COMMAND_DOWN,
2700 ui::DomKey::NONE, 0xaf},
2701 {ui::VKEY_F15, ui::DomCode::F15, ui::EF_NONE, ui::DomKey::F15,
2702 0xaf}},
2703 });
2704}
2705
Dmitry Torokhov0bcc3cf2017-07-15 17:50:302706TEST_F(EventRewriterTest, TestRewriteFunctionKeysLayout2) {
2707 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
Dmitry Torokhov3e2b7d82020-02-13 18:04:432708 TestKeyboard(
2709 "Internal Keyboard", kKbdTopRowLayout2Tag, ui::INPUT_DEVICE_INTERNAL,
Zentaro Kavanaghc65969ef2020-05-14 00:58:432710 /*has_custom_top_row=*/false,
Dmitry Torokhov3e2b7d82020-02-13 18:04:432711 {
2712 // F1 -> Back
2713 {ui::ET_KEY_PRESSED,
2714 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1},
2715 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_NONE,
2716 ui::DomKey::BROWSER_BACK}},
2717 {ui::ET_KEY_PRESSED,
2718 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_CONTROL_DOWN, ui::DomKey::F1},
2719 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK,
2720 ui::EF_CONTROL_DOWN, ui::DomKey::BROWSER_BACK}},
2721 {ui::ET_KEY_PRESSED,
2722 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_ALT_DOWN, ui::DomKey::F1},
2723 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_ALT_DOWN,
2724 ui::DomKey::BROWSER_BACK}},
2725 // F2 -> Refresh
2726 {ui::ET_KEY_PRESSED,
2727 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2},
2728 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_NONE,
2729 ui::DomKey::BROWSER_REFRESH}},
2730 {ui::ET_KEY_PRESSED,
2731 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_CONTROL_DOWN, ui::DomKey::F2},
2732 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH,
2733 ui::EF_CONTROL_DOWN, ui::DomKey::BROWSER_REFRESH}},
2734 {ui::ET_KEY_PRESSED,
2735 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_ALT_DOWN, ui::DomKey::F2},
2736 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH,
2737 ui::EF_ALT_DOWN, ui::DomKey::BROWSER_REFRESH}},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:442738 // F3 -> Zoom (aka Fullscreen)
Dmitry Torokhov3e2b7d82020-02-13 18:04:432739 {ui::ET_KEY_PRESSED,
2740 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:442741 {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_NONE,
Dmitry Torokhov3e2b7d82020-02-13 18:04:432742 ui::DomKey::ZOOM_TOGGLE}},
2743 {ui::ET_KEY_PRESSED,
2744 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_CONTROL_DOWN, ui::DomKey::F3},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:442745 {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_CONTROL_DOWN,
2746 ui::DomKey::ZOOM_TOGGLE}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:432747 {ui::ET_KEY_PRESSED,
2748 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_ALT_DOWN, ui::DomKey::F3},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:442749 {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_ALT_DOWN,
2750 ui::DomKey::ZOOM_TOGGLE}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:432751 // F4 -> Launch App 1
2752 {ui::ET_KEY_PRESSED,
2753 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4},
2754 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::SELECT_TASK, ui::EF_NONE,
2755 ui::DomKey::LAUNCH_MY_COMPUTER}},
2756 {ui::ET_KEY_PRESSED,
2757 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_CONTROL_DOWN, ui::DomKey::F4},
2758 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::SELECT_TASK,
2759 ui::EF_CONTROL_DOWN, ui::DomKey::LAUNCH_MY_COMPUTER}},
2760 {ui::ET_KEY_PRESSED,
2761 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_ALT_DOWN, ui::DomKey::F4},
2762 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::SELECT_TASK,
2763 ui::EF_ALT_DOWN, ui::DomKey::LAUNCH_MY_COMPUTER}},
2764 // F5 -> Brightness down
2765 {ui::ET_KEY_PRESSED,
2766 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5},
2767 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN, ui::EF_NONE,
2768 ui::DomKey::BRIGHTNESS_DOWN}},
2769 {ui::ET_KEY_PRESSED,
2770 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_CONTROL_DOWN, ui::DomKey::F5},
2771 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN,
2772 ui::EF_CONTROL_DOWN, ui::DomKey::BRIGHTNESS_DOWN}},
2773 {ui::ET_KEY_PRESSED,
2774 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_ALT_DOWN, ui::DomKey::F5},
2775 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN,
2776 ui::EF_ALT_DOWN, ui::DomKey::BRIGHTNESS_DOWN}},
2777 // F6 -> Brightness up
2778 {ui::ET_KEY_PRESSED,
2779 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6},
2780 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_NONE,
2781 ui::DomKey::BRIGHTNESS_UP}},
2782 {ui::ET_KEY_PRESSED,
2783 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_CONTROL_DOWN, ui::DomKey::F6},
2784 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP,
2785 ui::EF_CONTROL_DOWN, ui::DomKey::BRIGHTNESS_UP}},
2786 {ui::ET_KEY_PRESSED,
2787 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_ALT_DOWN, ui::DomKey::F6},
2788 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_ALT_DOWN,
2789 ui::DomKey::BRIGHTNESS_UP}},
2790 // F7 -> Media Play/Pause
2791 {ui::ET_KEY_PRESSED,
2792 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7},
2793 {ui::VKEY_MEDIA_PLAY_PAUSE, ui::DomCode::MEDIA_PLAY_PAUSE,
2794 ui::EF_NONE, ui::DomKey::MEDIA_PLAY_PAUSE}},
2795 {ui::ET_KEY_PRESSED,
2796 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_CONTROL_DOWN, ui::DomKey::F7},
2797 {ui::VKEY_MEDIA_PLAY_PAUSE, ui::DomCode::MEDIA_PLAY_PAUSE,
2798 ui::EF_CONTROL_DOWN, ui::DomKey::MEDIA_PLAY_PAUSE}},
2799 {ui::ET_KEY_PRESSED,
2800 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_ALT_DOWN, ui::DomKey::F7},
2801 {ui::VKEY_MEDIA_PLAY_PAUSE, ui::DomCode::MEDIA_PLAY_PAUSE,
2802 ui::EF_ALT_DOWN, ui::DomKey::MEDIA_PLAY_PAUSE}},
2803 // F8 -> Volume Mute
2804 {ui::ET_KEY_PRESSED,
2805 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8},
2806 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_NONE,
2807 ui::DomKey::AUDIO_VOLUME_MUTE}},
2808 {ui::ET_KEY_PRESSED,
2809 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_CONTROL_DOWN, ui::DomKey::F8},
2810 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_CONTROL_DOWN,
2811 ui::DomKey::AUDIO_VOLUME_MUTE}},
2812 {ui::ET_KEY_PRESSED,
2813 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_ALT_DOWN, ui::DomKey::F8},
2814 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_ALT_DOWN,
2815 ui::DomKey::AUDIO_VOLUME_MUTE}},
2816 // F9 -> Volume Down
2817 {ui::ET_KEY_PRESSED,
2818 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9},
2819 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_NONE,
2820 ui::DomKey::AUDIO_VOLUME_DOWN}},
2821 {ui::ET_KEY_PRESSED,
2822 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_CONTROL_DOWN, ui::DomKey::F9},
2823 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_CONTROL_DOWN,
2824 ui::DomKey::AUDIO_VOLUME_DOWN}},
2825 {ui::ET_KEY_PRESSED,
2826 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_ALT_DOWN, ui::DomKey::F9},
2827 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_ALT_DOWN,
2828 ui::DomKey::AUDIO_VOLUME_DOWN}},
2829 // F10 -> Volume Up
2830 {ui::ET_KEY_PRESSED,
2831 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10},
2832 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_NONE,
2833 ui::DomKey::AUDIO_VOLUME_UP}},
2834 {ui::ET_KEY_PRESSED,
2835 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_CONTROL_DOWN,
2836 ui::DomKey::F10},
2837 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_CONTROL_DOWN,
2838 ui::DomKey::AUDIO_VOLUME_UP}},
2839 {ui::ET_KEY_PRESSED,
2840 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_ALT_DOWN, ui::DomKey::F10},
2841 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_ALT_DOWN,
2842 ui::DomKey::AUDIO_VOLUME_UP}},
2843 // F11 -> F11
2844 {ui::ET_KEY_PRESSED,
2845 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11},
2846 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}},
2847 {ui::ET_KEY_PRESSED,
2848 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_CONTROL_DOWN,
2849 ui::DomKey::F11},
2850 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_CONTROL_DOWN,
2851 ui::DomKey::F11}},
2852 {ui::ET_KEY_PRESSED,
2853 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_ALT_DOWN, ui::DomKey::F11},
2854 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_ALT_DOWN, ui::DomKey::F11}},
2855 // F12 -> F12
2856 {ui::ET_KEY_PRESSED,
2857 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12},
2858 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
2859 {ui::ET_KEY_PRESSED,
2860 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_CONTROL_DOWN,
2861 ui::DomKey::F12},
2862 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_CONTROL_DOWN,
2863 ui::DomKey::F12}},
2864 {ui::ET_KEY_PRESSED,
2865 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_ALT_DOWN, ui::DomKey::F12},
2866 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_ALT_DOWN, ui::DomKey::F12}},
2867 });
Dmitry Torokhov0bcc3cf2017-07-15 17:50:302868}
2869
Zentaro Kavanagh76b9bcb2021-05-19 06:29:452870// TODO(crbug.com/1179893): Remove once the feature is enabled permanently.
2871TEST_F(EventRewriterTest, TestRewriteFunctionKeysWilcoLayoutsDeprecated) {
2872 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
2873 scoped_feature_list_.InitAndDisableFeature(
2874 ::features::kImprovedKeyboardShortcuts);
2875 std::vector<KeyTestCase> wilco_standard_tests({
2876 // The number row should be rewritten as the F<number> row with Search
2877 // key.
2878 {ui::ET_KEY_PRESSED,
2879 {ui::VKEY_1, ui::DomCode::DIGIT1, ui::EF_COMMAND_DOWN,
2880 ui::DomKey::Constant<'1'>::Character},
2881 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1}},
2882 {ui::ET_KEY_PRESSED,
2883 {ui::VKEY_2, ui::DomCode::DIGIT2, ui::EF_COMMAND_DOWN,
2884 ui::DomKey::Constant<'2'>::Character},
2885 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2}},
2886 {ui::ET_KEY_PRESSED,
2887 {ui::VKEY_3, ui::DomCode::DIGIT3, ui::EF_COMMAND_DOWN,
2888 ui::DomKey::Constant<'3'>::Character},
2889 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3}},
2890 {ui::ET_KEY_PRESSED,
2891 {ui::VKEY_4, ui::DomCode::DIGIT4, ui::EF_COMMAND_DOWN,
2892 ui::DomKey::Constant<'4'>::Character},
2893 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4}},
2894 {ui::ET_KEY_PRESSED,
2895 {ui::VKEY_5, ui::DomCode::DIGIT5, ui::EF_COMMAND_DOWN,
2896 ui::DomKey::Constant<'5'>::Character},
2897 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5}},
2898 {ui::ET_KEY_PRESSED,
2899 {ui::VKEY_6, ui::DomCode::DIGIT6, ui::EF_COMMAND_DOWN,
2900 ui::DomKey::Constant<'6'>::Character},
2901 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6}},
2902 {ui::ET_KEY_PRESSED,
2903 {ui::VKEY_7, ui::DomCode::DIGIT7, ui::EF_COMMAND_DOWN,
2904 ui::DomKey::Constant<'7'>::Character},
2905 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7}},
2906 {ui::ET_KEY_PRESSED,
2907 {ui::VKEY_8, ui::DomCode::DIGIT8, ui::EF_COMMAND_DOWN,
2908 ui::DomKey::Constant<'8'>::Character},
2909 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8}},
2910 {ui::ET_KEY_PRESSED,
2911 {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_COMMAND_DOWN,
2912 ui::DomKey::Constant<'9'>::Character},
2913 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9}},
2914 {ui::ET_KEY_PRESSED,
2915 {ui::VKEY_0, ui::DomCode::DIGIT0, ui::EF_COMMAND_DOWN,
2916 ui::DomKey::Constant<'0'>::Character},
2917 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10}},
2918 {ui::ET_KEY_PRESSED,
2919 {ui::VKEY_OEM_MINUS, ui::DomCode::MINUS, ui::EF_COMMAND_DOWN,
2920 ui::DomKey::Constant<'-'>::Character},
2921 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}},
2922 {ui::ET_KEY_PRESSED,
2923 {ui::VKEY_OEM_PLUS, ui::DomCode::EQUAL, ui::EF_COMMAND_DOWN,
2924 ui::DomKey::Constant<'='>::Character},
2925 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
2926 });
2927}
2928
Mike Wiitala6ed99532020-01-22 22:51:032929TEST_F(EventRewriterTest, TestRewriteFunctionKeysWilcoLayouts) {
Georges Winkenbachfe909bb2019-04-17 23:58:042930 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
Georges Winkenbachfe909bb2019-04-17 23:58:042931
Mike Wiitalaa69048c2020-02-21 18:39:352932 std::vector<KeyTestCase> wilco_standard_tests({
Georges Winkenbachfe909bb2019-04-17 23:58:042933 // F1 -> F1, Search + F1 -> Back
2934 {ui::ET_KEY_PRESSED,
2935 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1},
2936 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1}},
2937 {ui::ET_KEY_PRESSED,
2938 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_COMMAND_DOWN, ui::DomKey::F1},
2939 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_NONE,
2940 ui::DomKey::BROWSER_BACK}},
2941 {ui::ET_KEY_PRESSED,
2942 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_CONTROL_DOWN, ui::DomKey::F1},
2943 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_CONTROL_DOWN, ui::DomKey::F1}},
2944 {ui::ET_KEY_PRESSED,
2945 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_ALT_DOWN, ui::DomKey::F1},
2946 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_ALT_DOWN, ui::DomKey::F1}},
2947 // F2 -> F2, Search + F2 -> Refresh
2948 {ui::ET_KEY_PRESSED,
2949 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2},
2950 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2}},
2951 {ui::ET_KEY_PRESSED,
2952 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_COMMAND_DOWN, ui::DomKey::F2},
2953 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_NONE,
2954 ui::DomKey::BROWSER_REFRESH}},
2955 {ui::ET_KEY_PRESSED,
2956 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_CONTROL_DOWN, ui::DomKey::F2},
2957 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_CONTROL_DOWN, ui::DomKey::F2}},
2958 {ui::ET_KEY_PRESSED,
2959 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_ALT_DOWN, ui::DomKey::F2},
2960 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_ALT_DOWN, ui::DomKey::F2}},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:442961 // F3 -> F3, Search + F3 -> Zoom (aka Fullscreen)
Georges Winkenbachfe909bb2019-04-17 23:58:042962 {ui::ET_KEY_PRESSED,
2963 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3},
2964 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3}},
2965 {ui::ET_KEY_PRESSED,
2966 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_COMMAND_DOWN, ui::DomKey::F3},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:442967 {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_NONE,
Georges Winkenbachfe909bb2019-04-17 23:58:042968 ui::DomKey::ZOOM_TOGGLE}},
2969 {ui::ET_KEY_PRESSED,
2970 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_CONTROL_DOWN, ui::DomKey::F3},
2971 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_CONTROL_DOWN, ui::DomKey::F3}},
2972 {ui::ET_KEY_PRESSED,
2973 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_ALT_DOWN, ui::DomKey::F3},
2974 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_ALT_DOWN, ui::DomKey::F3}},
2975 // F4 -> F4, Search + F4 -> Launch App 1
2976 {ui::ET_KEY_PRESSED,
2977 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4},
2978 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4}},
2979 {ui::ET_KEY_PRESSED,
2980 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_COMMAND_DOWN, ui::DomKey::F4},
2981 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::F4, ui::EF_NONE,
2982 ui::DomKey::F4}},
2983 {ui::ET_KEY_PRESSED,
2984 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_CONTROL_DOWN, ui::DomKey::F4},
2985 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_CONTROL_DOWN, ui::DomKey::F4}},
2986 {ui::ET_KEY_PRESSED,
2987 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_ALT_DOWN, ui::DomKey::F4},
2988 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_ALT_DOWN, ui::DomKey::F4}},
2989 // F5 -> F5, Search + F5 -> Brightness down
2990 {ui::ET_KEY_PRESSED,
2991 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5},
2992 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5}},
2993 {ui::ET_KEY_PRESSED,
2994 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_COMMAND_DOWN, ui::DomKey::F5},
2995 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN, ui::EF_NONE,
2996 ui::DomKey::BRIGHTNESS_DOWN}},
2997 {ui::ET_KEY_PRESSED,
2998 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_CONTROL_DOWN, ui::DomKey::F5},
2999 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_CONTROL_DOWN, ui::DomKey::F5}},
3000 {ui::ET_KEY_PRESSED,
3001 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_ALT_DOWN, ui::DomKey::F5},
3002 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_ALT_DOWN, ui::DomKey::F5}},
3003 // F6 -> F6, Search + F6 -> Brightness up
3004 {ui::ET_KEY_PRESSED,
3005 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6},
3006 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6}},
3007 {ui::ET_KEY_PRESSED,
3008 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_COMMAND_DOWN, ui::DomKey::F6},
3009 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_NONE,
3010 ui::DomKey::BRIGHTNESS_UP}},
3011 {ui::ET_KEY_PRESSED,
3012 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_CONTROL_DOWN, ui::DomKey::F6},
3013 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_CONTROL_DOWN, ui::DomKey::F6}},
3014 {ui::ET_KEY_PRESSED,
3015 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_ALT_DOWN, ui::DomKey::F6},
3016 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_ALT_DOWN, ui::DomKey::F6}},
3017 // F7 -> F7, Search + F7 -> Volume mute
3018 {ui::ET_KEY_PRESSED,
3019 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7},
3020 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7}},
3021 {ui::ET_KEY_PRESSED,
3022 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_COMMAND_DOWN, ui::DomKey::F7},
3023 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_NONE,
3024 ui::DomKey::AUDIO_VOLUME_MUTE}},
3025 {ui::ET_KEY_PRESSED,
3026 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_CONTROL_DOWN, ui::DomKey::F7},
3027 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_CONTROL_DOWN, ui::DomKey::F7}},
3028 {ui::ET_KEY_PRESSED,
3029 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_ALT_DOWN, ui::DomKey::F7},
3030 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_ALT_DOWN, ui::DomKey::F7}},
3031 // F8 -> F8, Search + F8 -> Volume Down
3032 {ui::ET_KEY_PRESSED,
3033 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8},
3034 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8}},
3035 {ui::ET_KEY_PRESSED,
3036 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_COMMAND_DOWN, ui::DomKey::F8},
3037 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_NONE,
3038 ui::DomKey::AUDIO_VOLUME_DOWN}},
3039 {ui::ET_KEY_PRESSED,
3040 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_CONTROL_DOWN, ui::DomKey::F8},
3041 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_CONTROL_DOWN, ui::DomKey::F8}},
3042 {ui::ET_KEY_PRESSED,
3043 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_ALT_DOWN, ui::DomKey::F8},
3044 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_ALT_DOWN, ui::DomKey::F8}},
3045 // F9 -> F9, Search + F9 -> Volume Up
3046 {ui::ET_KEY_PRESSED,
3047 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9},
3048 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9}},
3049 {ui::ET_KEY_PRESSED,
3050 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_COMMAND_DOWN, ui::DomKey::F9},
3051 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_NONE,
3052 ui::DomKey::AUDIO_VOLUME_UP}},
3053 {ui::ET_KEY_PRESSED,
3054 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_CONTROL_DOWN, ui::DomKey::F9},
3055 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_CONTROL_DOWN, ui::DomKey::F9}},
3056 {ui::ET_KEY_PRESSED,
3057 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_ALT_DOWN, ui::DomKey::F9},
3058 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_ALT_DOWN, ui::DomKey::F9}},
3059 // F10 -> F10, Search + F10 -> F10
3060 {ui::ET_KEY_PRESSED,
3061 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10},
3062 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10}},
3063 {ui::ET_KEY_PRESSED,
3064 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_COMMAND_DOWN, ui::DomKey::F10},
3065 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10}},
3066 {ui::ET_KEY_PRESSED,
3067 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_CONTROL_DOWN, ui::DomKey::F10},
3068 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_CONTROL_DOWN, ui::DomKey::F10}},
3069 {ui::ET_KEY_PRESSED,
3070 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_ALT_DOWN, ui::DomKey::F10},
3071 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_ALT_DOWN, ui::DomKey::F10}},
3072 // F11 -> F11, Search + F11 -> F11
3073 {ui::ET_KEY_PRESSED,
3074 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11},
3075 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}},
3076 {ui::ET_KEY_PRESSED,
3077 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_COMMAND_DOWN, ui::DomKey::F11},
3078 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}},
3079 {ui::ET_KEY_PRESSED,
3080 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_CONTROL_DOWN, ui::DomKey::F11},
3081 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_CONTROL_DOWN, ui::DomKey::F11}},
3082 {ui::ET_KEY_PRESSED,
3083 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_ALT_DOWN, ui::DomKey::F11},
3084 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_ALT_DOWN, ui::DomKey::F11}},
Mike Wiitalaa69048c2020-02-21 18:39:353085 // F12 -> F12
3086 // Search + F12 differs between Wilco devices so it is tested separately.
3087 {ui::ET_KEY_PRESSED,
3088 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12},
3089 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
3090 {ui::ET_KEY_PRESSED,
3091 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12},
3092 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12}},
3093 {ui::ET_KEY_PRESSED,
3094 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_ALT_DOWN, ui::DomKey::F12},
3095 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_ALT_DOWN, ui::DomKey::F12}},
Georges Winkenbachfe909bb2019-04-17 23:58:043096 // The number row should not be rewritten without Search key.
3097 {ui::ET_KEY_PRESSED,
3098 {ui::VKEY_1, ui::DomCode::DIGIT1, ui::EF_NONE,
3099 ui::DomKey::Constant<'1'>::Character},
3100 {ui::VKEY_1, ui::DomCode::DIGIT1, ui::EF_NONE,
3101 ui::DomKey::Constant<'1'>::Character}},
3102 {ui::ET_KEY_PRESSED,
3103 {ui::VKEY_2, ui::DomCode::DIGIT2, ui::EF_NONE,
3104 ui::DomKey::Constant<'2'>::Character},
3105 {ui::VKEY_2, ui::DomCode::DIGIT2, ui::EF_NONE,
3106 ui::DomKey::Constant<'2'>::Character}},
3107 {ui::ET_KEY_PRESSED,
3108 {ui::VKEY_3, ui::DomCode::DIGIT3, ui::EF_NONE,
3109 ui::DomKey::Constant<'3'>::Character},
3110 {ui::VKEY_3, ui::DomCode::DIGIT3, ui::EF_NONE,
3111 ui::DomKey::Constant<'3'>::Character}},
3112 {ui::ET_KEY_PRESSED,
3113 {ui::VKEY_4, ui::DomCode::DIGIT4, ui::EF_NONE,
3114 ui::DomKey::Constant<'4'>::Character},
3115 {ui::VKEY_4, ui::DomCode::DIGIT4, ui::EF_NONE,
3116 ui::DomKey::Constant<'4'>::Character}},
3117 {ui::ET_KEY_PRESSED,
3118 {ui::VKEY_5, ui::DomCode::DIGIT5, ui::EF_NONE,
3119 ui::DomKey::Constant<'5'>::Character},
3120 {ui::VKEY_5, ui::DomCode::DIGIT5, ui::EF_NONE,
3121 ui::DomKey::Constant<'5'>::Character}},
3122 {ui::ET_KEY_PRESSED,
3123 {ui::VKEY_6, ui::DomCode::DIGIT6, ui::EF_NONE,
3124 ui::DomKey::Constant<'6'>::Character},
3125 {ui::VKEY_6, ui::DomCode::DIGIT6, ui::EF_NONE,
3126 ui::DomKey::Constant<'6'>::Character}},
3127 {ui::ET_KEY_PRESSED,
3128 {ui::VKEY_7, ui::DomCode::DIGIT7, ui::EF_NONE,
3129 ui::DomKey::Constant<'7'>::Character},
3130 {ui::VKEY_7, ui::DomCode::DIGIT7, ui::EF_NONE,
3131 ui::DomKey::Constant<'7'>::Character}},
3132 {ui::ET_KEY_PRESSED,
3133 {ui::VKEY_8, ui::DomCode::DIGIT8, ui::EF_NONE,
3134 ui::DomKey::Constant<'8'>::Character},
3135 {ui::VKEY_8, ui::DomCode::DIGIT8, ui::EF_NONE,
3136 ui::DomKey::Constant<'8'>::Character}},
3137 {ui::ET_KEY_PRESSED,
3138 {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_NONE,
3139 ui::DomKey::Constant<'9'>::Character},
3140 {ui::VKEY_9, ui::DomCode::DIGIT9, ui::EF_NONE,
3141 ui::DomKey::Constant<'9'>::Character}},
3142 {ui::ET_KEY_PRESSED,
3143 {ui::VKEY_0, ui::DomCode::DIGIT0, ui::EF_NONE,
3144 ui::DomKey::Constant<'0'>::Character},
3145 {ui::VKEY_0, ui::DomCode::DIGIT0, ui::EF_NONE,
3146 ui::DomKey::Constant<'0'>::Character}},
3147 {ui::ET_KEY_PRESSED,
3148 {ui::VKEY_OEM_MINUS, ui::DomCode::MINUS, ui::EF_NONE,
3149 ui::DomKey::Constant<'-'>::Character},
3150 {ui::VKEY_OEM_MINUS, ui::DomCode::MINUS, ui::EF_NONE,
3151 ui::DomKey::Constant<'-'>::Character}},
3152 {ui::ET_KEY_PRESSED,
3153 {ui::VKEY_OEM_PLUS, ui::DomCode::EQUAL, ui::EF_NONE,
3154 ui::DomKey::Constant<'='>::Character},
3155 {ui::VKEY_OEM_PLUS, ui::DomCode::EQUAL, ui::EF_NONE,
3156 ui::DomKey::Constant<'='>::Character}},
Mike Wiitalaa69048c2020-02-21 18:39:353157 });
3158
3159 KeyTestCase wilco_1_test =
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443160 // Search + F12 -> Ctrl + Zoom (aka Fullscreen) (Display toggle)
Mike Wiitala6ed99532020-01-22 22:51:033161 {ui::ET_KEY_PRESSED,
3162 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_COMMAND_DOWN, ui::DomKey::F12},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443163 {ui::VKEY_ZOOM, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12}};
Georges Winkenbachfe909bb2019-04-17 23:58:043164
Mike Wiitalaa69048c2020-02-21 18:39:353165 KeyTestCase drallion_test_no_privacy_screen =
3166 // Search + F12 -> F12 (Privacy screen not supported)
Mike Wiitala6ed99532020-01-22 22:51:033167 {ui::ET_KEY_PRESSED,
Mike Wiitalaa69048c2020-02-21 18:39:353168 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_COMMAND_DOWN, ui::DomKey::F12},
3169 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}};
3170
3171 KeyTestCase drallion_test_privacy_screen =
3172 // F12 -> F12, Search + F12 -> Privacy Screen Toggle
Mike Wiitala6ed99532020-01-22 22:51:033173 {ui::ET_KEY_PRESSED,
3174 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_COMMAND_DOWN, ui::DomKey::F12},
3175 {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
Mike Wiitalaa69048c2020-02-21 18:39:353176 ui::EF_NONE, ui::DomKey::F12}};
Mike Wiitala6ed99532020-01-22 22:51:033177
Mike Wiitalaa69048c2020-02-21 18:39:353178 // Set keyboard layout to Wilco 1.0
Zentaro Kavanagh1e7d867c2020-05-13 01:18:443179 SetupKeyboard("Wilco Keyboard", kKbdTopRowLayoutWilcoTag);
Mike Wiitala6ed99532020-01-22 22:51:033180 // Standard key tests using Wilco 1.0 keyboard
Mike Wiitalaa69048c2020-02-21 18:39:353181 for (const auto& test : wilco_standard_tests)
Yuichiro Hanada87c6e552020-02-07 01:07:373182 CheckKeyTestCase(rewriter(), test);
Mike Wiitalaa69048c2020-02-21 18:39:353183 CheckKeyTestCase(rewriter(), wilco_1_test);
Georges Winkenbachfe909bb2019-04-17 23:58:043184
Mike Wiitalaa69048c2020-02-21 18:39:353185 // Set keyboard layout to Drallion (Wilco 1.5)
Zentaro Kavanagh1e7d867c2020-05-13 01:18:443186 SetupKeyboard("Drallion Keyboard", kKbdTopRowLayoutDrallionTag);
Mike Wiitalaa69048c2020-02-21 18:39:353187
3188 // Run key tests using Drallion keyboard layout (no privacy screen)
3189 rewriter_->set_privacy_screen_for_testing(false);
3190 for (const auto& test : wilco_standard_tests)
Yuichiro Hanada87c6e552020-02-07 01:07:373191 CheckKeyTestCase(rewriter(), test);
Mike Wiitalaa69048c2020-02-21 18:39:353192 CheckKeyTestCase(rewriter(), drallion_test_no_privacy_screen);
3193
3194 // Run key tests using Drallion keyboard layout (privacy screen supported)
3195 rewriter_->set_privacy_screen_for_testing(true);
3196 for (const auto& test : wilco_standard_tests)
Yuichiro Hanada87c6e552020-02-07 01:07:373197 CheckKeyTestCase(rewriter(), test);
Mike Wiitalaa69048c2020-02-21 18:39:353198 CheckKeyTestCase(rewriter(), drallion_test_privacy_screen);
Mike Wiitala6ed99532020-01-22 22:51:033199}
3200
3201TEST_F(EventRewriterTest, TestRewriteActionKeysWilcoLayouts) {
3202 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
3203
Mike Wiitalaa69048c2020-02-21 18:39:353204 KeyTestCase wilco_standard_tests[] = {
Georges Winkenbachfe909bb2019-04-17 23:58:043205 // Back -> Back, Search + Back -> F1
3206 {ui::ET_KEY_PRESSED,
3207 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_NONE,
3208 ui::DomKey::BROWSER_BACK},
3209 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_NONE,
3210 ui::DomKey::BROWSER_BACK}},
3211 {ui::ET_KEY_PRESSED,
3212 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_COMMAND_DOWN,
3213 ui::DomKey::BROWSER_BACK},
3214 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1}},
3215 // Refresh -> Refresh, Search + Refresh -> F2
3216 {ui::ET_KEY_PRESSED,
3217 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_NONE,
3218 ui::DomKey::BROWSER_REFRESH},
3219 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_NONE,
3220 ui::DomKey::BROWSER_REFRESH}},
3221 {ui::ET_KEY_PRESSED,
3222 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH,
3223 ui::EF_COMMAND_DOWN, ui::DomKey::BROWSER_REFRESH},
3224 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2}},
3225 // Full Screen -> Full Screen, Search + Full Screen -> F3
3226 {ui::ET_KEY_PRESSED,
Georges Winkenbach0f454cf2019-05-28 17:16:373227 {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_NONE,
Georges Winkenbachfe909bb2019-04-17 23:58:043228 ui::DomKey::ZOOM_TOGGLE},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443229 {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_NONE,
Georges Winkenbachfe909bb2019-04-17 23:58:043230 ui::DomKey::ZOOM_TOGGLE}},
3231 {ui::ET_KEY_PRESSED,
Georges Winkenbach0f454cf2019-05-28 17:16:373232 {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_COMMAND_DOWN,
3233 ui::DomKey::ZOOM_TOGGLE},
Georges Winkenbachfe909bb2019-04-17 23:58:043234 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3}},
3235 // Launch App 1 -> Launch App 1, Search + Launch App 1 -> F4
3236 {ui::ET_KEY_PRESSED,
3237 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::F4, ui::EF_NONE,
3238 ui::DomKey::F4},
3239 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::F4, ui::EF_NONE,
3240 ui::DomKey::F4}},
3241 {ui::ET_KEY_PRESSED,
3242 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::F4, ui::EF_COMMAND_DOWN,
3243 ui::DomKey::F4},
3244 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4}},
3245 // Brightness down -> Brightness Down, Search Brightness Down -> F5
3246 {ui::ET_KEY_PRESSED,
3247 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN, ui::EF_NONE,
3248 ui::DomKey::BRIGHTNESS_DOWN},
3249 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN, ui::EF_NONE,
3250 ui::DomKey::BRIGHTNESS_DOWN}},
3251 {ui::ET_KEY_PRESSED,
3252 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN,
3253 ui::EF_COMMAND_DOWN, ui::DomKey::BRIGHTNESS_DOWN},
3254 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5}},
3255 // Brightness up -> Brightness Up, Search + Brightness Up -> F6
3256 {ui::ET_KEY_PRESSED,
3257 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_NONE,
3258 ui::DomKey::BRIGHTNESS_UP},
3259 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_NONE,
3260 ui::DomKey::BRIGHTNESS_UP}},
3261 {ui::ET_KEY_PRESSED,
3262 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_COMMAND_DOWN,
3263 ui::DomKey::BRIGHTNESS_UP},
3264 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6}},
3265 // Volume mute -> Volume Mute, Search + Volume Mute -> F7
3266 {ui::ET_KEY_PRESSED,
3267 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_NONE,
3268 ui::DomKey::AUDIO_VOLUME_MUTE},
3269 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_NONE,
3270 ui::DomKey::AUDIO_VOLUME_MUTE}},
3271 {ui::ET_KEY_PRESSED,
3272 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_COMMAND_DOWN,
3273 ui::DomKey::AUDIO_VOLUME_MUTE},
3274 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7}},
3275 // Volume Down -> Volume Down, Search + Volume Down -> F8
3276 {ui::ET_KEY_PRESSED,
3277 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_NONE,
3278 ui::DomKey::AUDIO_VOLUME_DOWN},
3279 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_NONE,
3280 ui::DomKey::AUDIO_VOLUME_DOWN}},
3281 {ui::ET_KEY_PRESSED,
3282 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_COMMAND_DOWN,
3283 ui::DomKey::AUDIO_VOLUME_DOWN},
3284 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8}},
3285 // Volume Up -> Volume Up, Search + Volume Up -> F9
3286 {ui::ET_KEY_PRESSED,
3287 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_NONE,
3288 ui::DomKey::AUDIO_VOLUME_UP},
3289 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_NONE,
3290 ui::DomKey::AUDIO_VOLUME_UP}},
3291 {ui::ET_KEY_PRESSED,
3292 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_COMMAND_DOWN,
3293 ui::DomKey::AUDIO_VOLUME_UP},
3294 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9}},
3295 // F10 -> F10
3296 {ui::ET_KEY_PRESSED,
3297 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10},
3298 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10}},
3299 {ui::ET_KEY_PRESSED,
3300 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_COMMAND_DOWN, ui::DomKey::F10},
3301 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10}},
3302 // F11 -> F11
3303 {ui::ET_KEY_PRESSED,
3304 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_COMMAND_DOWN, ui::DomKey::F11},
3305 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}},
3306 {ui::ET_KEY_PRESSED,
3307 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11},
Mike Wiitala6ed99532020-01-22 22:51:033308 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}}};
3309
Mike Wiitalaa69048c2020-02-21 18:39:353310 KeyTestCase wilco_1_tests[] = {
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443311 // Ctrl + Zoom (Display toggle) -> Unchanged
3312 // Search + Ctrl + Zoom (Display toggle) -> F12
Georges Winkenbachfe909bb2019-04-17 23:58:043313 {ui::ET_KEY_PRESSED,
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443314 {ui::VKEY_ZOOM, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12},
3315 {ui::VKEY_ZOOM, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12}},
Georges Winkenbachfe909bb2019-04-17 23:58:043316 {ui::ET_KEY_PRESSED,
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443317 {ui::VKEY_ZOOM, ui::DomCode::F12,
Georges Winkenbachfe909bb2019-04-17 23:58:043318 ui::EF_COMMAND_DOWN + ui::EF_CONTROL_DOWN, ui::DomKey::F12},
3319 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}}};
3320
Mike Wiitalaa69048c2020-02-21 18:39:353321 KeyTestCase drallion_tests_no_privacy_screen[] = {
3322 // Privacy Screen Toggle -> F12 (Privacy Screen not supported),
3323 // Search + Privacy Screen Toggle -> F12
3324 {ui::ET_KEY_PRESSED,
3325 {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
3326 ui::EF_NONE, ui::DomKey::UNIDENTIFIED},
3327 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
3328 {ui::ET_KEY_PRESSED,
3329 {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
3330 ui::EF_COMMAND_DOWN, ui::DomKey::UNIDENTIFIED},
3331 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443332 // Ctrl + Zoom (Display toggle) -> Unchanged
3333 // Search + Ctrl + Zoom (Display toggle) -> Unchanged
Mike Wiitalaa69048c2020-02-21 18:39:353334 {ui::ET_KEY_PRESSED,
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443335 {ui::VKEY_ZOOM, ui::DomCode::NONE, ui::EF_CONTROL_DOWN,
Mike Wiitalaa69048c2020-02-21 18:39:353336 ui::DomKey::UNIDENTIFIED},
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}},
3339 {ui::ET_KEY_PRESSED,
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443340 {ui::VKEY_ZOOM, ui::DomCode::NONE,
Mike Wiitalaa69048c2020-02-21 18:39:353341 ui::EF_COMMAND_DOWN + ui::EF_CONTROL_DOWN, ui::DomKey::UNIDENTIFIED},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443342 {ui::VKEY_ZOOM, ui::DomCode::NONE, ui::EF_CONTROL_DOWN,
Mike Wiitalaa69048c2020-02-21 18:39:353343 ui::DomKey::UNIDENTIFIED}}};
3344
3345 KeyTestCase drallion_tests_privacy_screen[] = {
Mike Wiitala6ed99532020-01-22 22:51:033346 // Privacy Screen Toggle -> Privacy Screen Toggle,
3347 // Search + Privacy Screen Toggle -> F12
3348 {ui::ET_KEY_PRESSED,
3349 {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
3350 ui::EF_NONE, ui::DomKey::UNIDENTIFIED},
3351 {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
3352 ui::EF_NONE, ui::DomKey::UNIDENTIFIED}},
3353 {ui::ET_KEY_PRESSED,
3354 {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
3355 ui::EF_COMMAND_DOWN, ui::DomKey::UNIDENTIFIED},
3356 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443357 // Ctrl + Zoom (Display toggle) -> Unchanged
3358 // Search + Ctrl + Zoom (Display toggle) -> Unchanged
Mike Wiitala6ed99532020-01-22 22:51:033359 {ui::ET_KEY_PRESSED,
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443360 {ui::VKEY_ZOOM, ui::DomCode::NONE, ui::EF_CONTROL_DOWN,
Mike Wiitala6ed99532020-01-22 22:51:033361 ui::DomKey::UNIDENTIFIED},
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}},
3364 {ui::ET_KEY_PRESSED,
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443365 {ui::VKEY_ZOOM, ui::DomCode::NONE,
Mike Wiitala6ed99532020-01-22 22:51:033366 ui::EF_COMMAND_DOWN + ui::EF_CONTROL_DOWN, ui::DomKey::UNIDENTIFIED},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443367 {ui::VKEY_ZOOM, ui::DomCode::NONE, ui::EF_CONTROL_DOWN,
Mike Wiitala6ed99532020-01-22 22:51:033368 ui::DomKey::UNIDENTIFIED}}};
Georges Winkenbachfe909bb2019-04-17 23:58:043369
Mike Wiitalaa69048c2020-02-21 18:39:353370 // Set keyboard layout to Wilco 1.0
Zentaro Kavanagh1e7d867c2020-05-13 01:18:443371 SetupKeyboard("Wilco Keyboard", kKbdTopRowLayoutWilcoTag);
Mike Wiitala6ed99532020-01-22 22:51:033372 // Standard key tests using Wilco 1.0 keyboard
Mike Wiitalaa69048c2020-02-21 18:39:353373 for (const auto& test : wilco_standard_tests)
Yuichiro Hanada87c6e552020-02-07 01:07:373374 CheckKeyTestCase(rewriter(), test);
Mike Wiitala6ed99532020-01-22 22:51:033375 // Wilco 1.0 specific key tests
Mike Wiitalaa69048c2020-02-21 18:39:353376 for (const auto& test : wilco_1_tests)
Yuichiro Hanada87c6e552020-02-07 01:07:373377 CheckKeyTestCase(rewriter(), test);
Mike Wiitala6ed99532020-01-22 22:51:033378
Mike Wiitalaa69048c2020-02-21 18:39:353379 // Set keyboard layout to Drallion (Wilco 1.5)
Zentaro Kavanagh1e7d867c2020-05-13 01:18:443380 SetupKeyboard("Drallion Keyboard", kKbdTopRowLayoutDrallionTag);
Mike Wiitalaa69048c2020-02-21 18:39:353381
Mike Wiitala6ed99532020-01-22 22:51:033382 // Standard key tests using Drallion keyboard layout
Mike Wiitalaa69048c2020-02-21 18:39:353383 for (const auto& test : wilco_standard_tests)
Yuichiro Hanada87c6e552020-02-07 01:07:373384 CheckKeyTestCase(rewriter(), test);
Mike Wiitalaa69048c2020-02-21 18:39:353385
3386 // Drallion specific key tests (no privacy screen)
3387 rewriter_->set_privacy_screen_for_testing(false);
3388 for (const auto& test : drallion_tests_no_privacy_screen)
3389 CheckKeyTestCase(rewriter(), test);
3390
3391 // Drallion specific key tests (privacy screen supported)
3392 rewriter_->set_privacy_screen_for_testing(true);
3393 for (const auto& test : drallion_tests_privacy_screen)
Yuichiro Hanada87c6e552020-02-07 01:07:373394 CheckKeyTestCase(rewriter(), test);
Mike Wiitala6ed99532020-01-22 22:51:033395}
3396
3397TEST_F(EventRewriterTest, TestTopRowAsFnKeysForKeyboardWilcoLayouts) {
3398 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
Georges Winkenbach0f454cf2019-05-28 17:16:373399
3400 // Enable preference treat-top-row-as-function-keys.
3401 // That causes action keys to be mapped back to Fn keys, unless the search
3402 // key is pressed.
3403 BooleanPrefMember top_row_as_fn_key;
3404 top_row_as_fn_key.Init(prefs::kLanguageSendFunctionKeys, prefs());
3405 top_row_as_fn_key.SetValue(true);
3406
Mike Wiitalaa69048c2020-02-21 18:39:353407 KeyTestCase wilco_standard_tests[] = {
Georges Winkenbach0f454cf2019-05-28 17:16:373408 // Back -> F1, Search + Back -> Back
3409 {ui::ET_KEY_PRESSED,
3410 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_NONE,
3411 ui::DomKey::BROWSER_BACK},
3412 {ui::VKEY_F1, ui::DomCode::F1, ui::EF_NONE, ui::DomKey::F1}},
3413 {ui::ET_KEY_PRESSED,
3414 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_COMMAND_DOWN,
3415 ui::DomKey::BROWSER_BACK},
3416 {ui::VKEY_BROWSER_BACK, ui::DomCode::BROWSER_BACK, ui::EF_NONE,
3417 ui::DomKey::BROWSER_BACK}},
3418 // Refresh -> F2, Search + Refresh -> Refresh
3419 {ui::ET_KEY_PRESSED,
3420 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_NONE,
3421 ui::DomKey::BROWSER_REFRESH},
3422 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2}},
3423 {ui::ET_KEY_PRESSED,
3424 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH,
3425 ui::EF_COMMAND_DOWN, ui::DomKey::BROWSER_REFRESH},
3426 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_NONE,
3427 ui::DomKey::BROWSER_REFRESH}},
3428 // Full Screen -> F3, Search + Full Screen -> Full Screen
3429 {ui::ET_KEY_PRESSED,
3430 {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_NONE,
3431 ui::DomKey::ZOOM_TOGGLE},
3432 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3}},
3433 {ui::ET_KEY_PRESSED,
3434 {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_COMMAND_DOWN,
3435 ui::DomKey::ZOOM_TOGGLE},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443436 {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_NONE,
Georges Winkenbach0f454cf2019-05-28 17:16:373437 ui::DomKey::ZOOM_TOGGLE}},
3438 // Launch App 1 -> F4, Search + Launch App 1 -> Launch App 1
3439 {ui::ET_KEY_PRESSED,
3440 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::F4, ui::EF_NONE,
3441 ui::DomKey::F4},
3442 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4}},
3443 {ui::ET_KEY_PRESSED,
3444 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::F4, ui::EF_COMMAND_DOWN,
3445 ui::DomKey::F4},
3446 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::F4, ui::EF_NONE,
3447 ui::DomKey::F4}},
3448 // Brightness down -> F5, Search Brightness Down -> Brightness Down
3449 {ui::ET_KEY_PRESSED,
3450 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN, ui::EF_NONE,
3451 ui::DomKey::BRIGHTNESS_DOWN},
3452 {ui::VKEY_F5, ui::DomCode::F5, ui::EF_NONE, ui::DomKey::F5}},
3453 {ui::ET_KEY_PRESSED,
3454 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN,
3455 ui::EF_COMMAND_DOWN, ui::DomKey::BRIGHTNESS_DOWN},
3456 {ui::VKEY_BRIGHTNESS_DOWN, ui::DomCode::BRIGHTNESS_DOWN, ui::EF_NONE,
3457 ui::DomKey::BRIGHTNESS_DOWN}},
3458 // Brightness up -> F6, Search + Brightness Up -> Brightness Up
3459 {ui::ET_KEY_PRESSED,
3460 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_NONE,
3461 ui::DomKey::BRIGHTNESS_UP},
3462 {ui::VKEY_F6, ui::DomCode::F6, ui::EF_NONE, ui::DomKey::F6}},
3463 {ui::ET_KEY_PRESSED,
3464 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_COMMAND_DOWN,
3465 ui::DomKey::BRIGHTNESS_UP},
3466 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_NONE,
3467 ui::DomKey::BRIGHTNESS_UP}},
3468 // Volume mute -> F7, Search + Volume Mute -> Volume Mute
3469 {ui::ET_KEY_PRESSED,
3470 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_NONE,
3471 ui::DomKey::AUDIO_VOLUME_MUTE},
3472 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7}},
3473 {ui::ET_KEY_PRESSED,
3474 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_COMMAND_DOWN,
3475 ui::DomKey::AUDIO_VOLUME_MUTE},
3476 {ui::VKEY_VOLUME_MUTE, ui::DomCode::VOLUME_MUTE, ui::EF_NONE,
3477 ui::DomKey::AUDIO_VOLUME_MUTE}},
3478 // Volume Down -> F8, Search + Volume Down -> Volume Down
3479 {ui::ET_KEY_PRESSED,
3480 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_NONE,
3481 ui::DomKey::AUDIO_VOLUME_DOWN},
3482 {ui::VKEY_F8, ui::DomCode::F8, ui::EF_NONE, ui::DomKey::F8}},
3483 {ui::ET_KEY_PRESSED,
3484 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_COMMAND_DOWN,
3485 ui::DomKey::AUDIO_VOLUME_DOWN},
3486 {ui::VKEY_VOLUME_DOWN, ui::DomCode::VOLUME_DOWN, ui::EF_NONE,
3487 ui::DomKey::AUDIO_VOLUME_DOWN}},
3488 // Volume Up -> F9, Search + Volume Up -> Volume Up
3489 {ui::ET_KEY_PRESSED,
3490 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_NONE,
3491 ui::DomKey::AUDIO_VOLUME_UP},
3492 {ui::VKEY_F9, ui::DomCode::F9, ui::EF_NONE, ui::DomKey::F9}},
3493 {ui::ET_KEY_PRESSED,
3494 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_COMMAND_DOWN,
3495 ui::DomKey::AUDIO_VOLUME_UP},
3496 {ui::VKEY_VOLUME_UP, ui::DomCode::VOLUME_UP, ui::EF_NONE,
3497 ui::DomKey::AUDIO_VOLUME_UP}},
3498 // F10 -> F10
3499 {ui::ET_KEY_PRESSED,
3500 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10},
3501 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10}},
3502 {ui::ET_KEY_PRESSED,
3503 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_COMMAND_DOWN, ui::DomKey::F10},
3504 {ui::VKEY_F10, ui::DomCode::F10, ui::EF_NONE, ui::DomKey::F10}},
3505 // F11 -> F11
3506 {ui::ET_KEY_PRESSED,
3507 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_COMMAND_DOWN, ui::DomKey::F11},
3508 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}},
3509 {ui::ET_KEY_PRESSED,
3510 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11},
Mike Wiitala6ed99532020-01-22 22:51:033511 {ui::VKEY_F11, ui::DomCode::F11, ui::EF_NONE, ui::DomKey::F11}}};
3512
Mike Wiitalaa69048c2020-02-21 18:39:353513 KeyTestCase wilco_1_tests[] = {
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443514 // Ctrl + Zoom (Display toggle) -> F12
3515 // Search + Ctrl + Zoom (Display toggle) -> Unchanged
Georges Winkenbach0f454cf2019-05-28 17:16:373516 {ui::ET_KEY_PRESSED,
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443517 {ui::VKEY_ZOOM, ui::DomCode::F12, ui::EF_CONTROL_DOWN, ui::DomKey::F12},
Georges Winkenbach0f454cf2019-05-28 17:16:373518 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
3519 {ui::ET_KEY_PRESSED,
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443520 {ui::VKEY_ZOOM, ui::DomCode::F12,
Georges Winkenbach0f454cf2019-05-28 17:16:373521 ui::EF_COMMAND_DOWN + ui::EF_CONTROL_DOWN, ui::DomKey::F12},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443522 {ui::VKEY_ZOOM, ui::DomCode::F12, ui::EF_CONTROL_DOWN,
Georges Winkenbach0f454cf2019-05-28 17:16:373523 ui::DomKey::F12}}};
3524
Mike Wiitalaa69048c2020-02-21 18:39:353525 KeyTestCase drallion_tests_no_privacy_screen[] = {
Mike Wiitala6ed99532020-01-22 22:51:033526 // Privacy Screen Toggle -> F12,
Mike Wiitalaa69048c2020-02-21 18:39:353527 // Search + Privacy Screen Toggle -> F12 (Privacy screen not supported)
Mike Wiitala6ed99532020-01-22 22:51:033528 {ui::ET_KEY_PRESSED,
3529 {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
3530 ui::EF_NONE, ui::DomKey::UNIDENTIFIED},
3531 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
3532 {ui::ET_KEY_PRESSED,
3533 {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
3534 ui::EF_COMMAND_DOWN, ui::DomKey::UNIDENTIFIED},
Mike Wiitalaa69048c2020-02-21 18:39:353535 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443536 // Ctrl + Zoom (Display toggle) -> Unchanged
3537 // Search + Ctrl + Zoom (Display toggle) -> Unchanged
Mike Wiitala6ed99532020-01-22 22:51:033538 {ui::ET_KEY_PRESSED,
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443539 {ui::VKEY_ZOOM, ui::DomCode::NONE, ui::EF_CONTROL_DOWN,
Mike Wiitala6ed99532020-01-22 22:51:033540 ui::DomKey::UNIDENTIFIED},
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}},
3543 {ui::ET_KEY_PRESSED,
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443544 {ui::VKEY_ZOOM, ui::DomCode::NONE,
Mike Wiitala6ed99532020-01-22 22:51:033545 ui::EF_COMMAND_DOWN + ui::EF_CONTROL_DOWN, ui::DomKey::UNIDENTIFIED},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443546 {ui::VKEY_ZOOM, ui::DomCode::NONE, ui::EF_CONTROL_DOWN,
Mike Wiitala6ed99532020-01-22 22:51:033547 ui::DomKey::UNIDENTIFIED}}};
3548
Mike Wiitalaa69048c2020-02-21 18:39:353549 KeyTestCase drallion_tests_privacy_screen[] = {
3550 // Privacy Screen Toggle -> F12,
3551 // Search + Privacy Screen Toggle -> Unchanged
3552 {ui::ET_KEY_PRESSED,
3553 {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
3554 ui::EF_NONE, ui::DomKey::UNIDENTIFIED},
3555 {ui::VKEY_F12, ui::DomCode::F12, ui::EF_NONE, ui::DomKey::F12}},
3556 {ui::ET_KEY_PRESSED,
3557 {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
3558 ui::EF_COMMAND_DOWN, ui::DomKey::UNIDENTIFIED},
3559 {ui::VKEY_PRIVACY_SCREEN_TOGGLE, ui::DomCode::PRIVACY_SCREEN_TOGGLE,
3560 ui::EF_NONE, ui::DomKey::UNIDENTIFIED}}};
3561
Mike Wiitala6ed99532020-01-22 22:51:033562 // Run key test cases for Wilco 1.0 keyboard layout
Zentaro Kavanagh1e7d867c2020-05-13 01:18:443563 SetupKeyboard("Wilco Keyboard", kKbdTopRowLayoutWilcoTag);
Mike Wiitala6ed99532020-01-22 22:51:033564 // Standard key tests using Wilco 1.0 keyboard
Mike Wiitalaa69048c2020-02-21 18:39:353565 for (const auto& test : wilco_standard_tests)
Yuichiro Hanada87c6e552020-02-07 01:07:373566 CheckKeyTestCase(rewriter(), test);
Mike Wiitala6ed99532020-01-22 22:51:033567 // Wilco 1.0 specific key tests
Mike Wiitalaa69048c2020-02-21 18:39:353568 for (const auto& test : wilco_1_tests)
Yuichiro Hanada87c6e552020-02-07 01:07:373569 CheckKeyTestCase(rewriter(), test);
Mike Wiitala6ed99532020-01-22 22:51:033570
3571 // Run key test cases for Drallion (Wilco 1.5) keyboard layout
Zentaro Kavanagh1e7d867c2020-05-13 01:18:443572 SetupKeyboard("Drallion Keyboard", kKbdTopRowLayoutDrallionTag);
Mike Wiitala6ed99532020-01-22 22:51:033573 // Standard key tests using Drallion keyboard layout
Mike Wiitalaa69048c2020-02-21 18:39:353574 for (const auto& test : wilco_standard_tests)
Yuichiro Hanada87c6e552020-02-07 01:07:373575 CheckKeyTestCase(rewriter(), test);
Mike Wiitalaa69048c2020-02-21 18:39:353576
3577 // Drallion specific key tests (no privacy screen)
3578 rewriter_->set_privacy_screen_for_testing(false);
3579 for (const auto& test : drallion_tests_no_privacy_screen)
3580 CheckKeyTestCase(rewriter(), test);
3581
3582 // Drallion specific key tests (privacy screen supported)
3583 rewriter_->set_privacy_screen_for_testing(true);
3584 for (const auto& test : drallion_tests_privacy_screen)
Yuichiro Hanada87c6e552020-02-07 01:07:373585 CheckKeyTestCase(rewriter(), test);
Georges Winkenbach0f454cf2019-05-28 17:16:373586}
3587
Ahmed Fakhryaa02b4e2017-11-13 21:43:323588TEST_F(EventRewriterTest, TestRewriteFunctionKeysInvalidLayout) {
3589 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
3590
3591 // Not adding a keyboard simulates a failure in getting top row layout, which
3592 // will fallback to Layout1 in which case keys are rewritten to their default
3593 // values.
3594 KeyTestCase invalid_layout_tests[] = {
3595 // F2 -> Forward
3596 {ui::ET_KEY_PRESSED,
3597 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2},
3598 {ui::VKEY_BROWSER_FORWARD, ui::DomCode::BROWSER_FORWARD, ui::EF_NONE,
3599 ui::DomKey::BROWSER_FORWARD}},
3600 // F3 -> Refresh
3601 {ui::ET_KEY_PRESSED,
3602 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3},
3603 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_NONE,
3604 ui::DomKey::BROWSER_REFRESH}},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443605 // F4 -> Zoom (aka Fullscreen)
Ahmed Fakhryaa02b4e2017-11-13 21:43:323606 {ui::ET_KEY_PRESSED,
3607 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443608 {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_NONE,
Ahmed Fakhryaa02b4e2017-11-13 21:43:323609 ui::DomKey::ZOOM_TOGGLE}},
3610 // F7 -> Brightness up
3611 {ui::ET_KEY_PRESSED,
3612 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7},
3613 {ui::VKEY_BRIGHTNESS_UP, ui::DomCode::BRIGHTNESS_UP, ui::EF_NONE,
Dmitry Torokhov3e2b7d82020-02-13 18:04:433614 ui::DomKey::BRIGHTNESS_UP}},
3615 };
Ahmed Fakhryaa02b4e2017-11-13 21:43:323616
3617 for (const auto& test : invalid_layout_tests)
Yuichiro Hanada87c6e552020-02-07 01:07:373618 CheckKeyTestCase(rewriter(), test);
Ahmed Fakhryaa02b4e2017-11-13 21:43:323619
3620 // Adding a keyboard with a valid layout will take effect.
Dmitry Torokhov3e2b7d82020-02-13 18:04:433621 const std::vector<KeyTestCase> layout2_tests({
Ahmed Fakhryaa02b4e2017-11-13 21:43:323622 // F2 -> Refresh
3623 {ui::ET_KEY_PRESSED,
3624 {ui::VKEY_F2, ui::DomCode::F2, ui::EF_NONE, ui::DomKey::F2},
3625 {ui::VKEY_BROWSER_REFRESH, ui::DomCode::BROWSER_REFRESH, ui::EF_NONE,
3626 ui::DomKey::BROWSER_REFRESH}},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443627 // F3 -> Zoom (aka Fullscreen)
Ahmed Fakhryaa02b4e2017-11-13 21:43:323628 {ui::ET_KEY_PRESSED,
3629 {ui::VKEY_F3, ui::DomCode::F3, ui::EF_NONE, ui::DomKey::F3},
Zentaro Kavanagh19bdd0e2021-05-04 21:04:443630 {ui::VKEY_ZOOM, ui::DomCode::ZOOM_TOGGLE, ui::EF_NONE,
Ahmed Fakhryaa02b4e2017-11-13 21:43:323631 ui::DomKey::ZOOM_TOGGLE}},
3632 // F4 -> Launch App 1
3633 {ui::ET_KEY_PRESSED,
3634 {ui::VKEY_F4, ui::DomCode::F4, ui::EF_NONE, ui::DomKey::F4},
3635 {ui::VKEY_MEDIA_LAUNCH_APP1, ui::DomCode::SELECT_TASK, ui::EF_NONE,
3636 ui::DomKey::LAUNCH_MY_COMPUTER}},
3637 // F7 -> Media Play/Pause
3638 {ui::ET_KEY_PRESSED,
3639 {ui::VKEY_F7, ui::DomCode::F7, ui::EF_NONE, ui::DomKey::F7},
3640 {ui::VKEY_MEDIA_PLAY_PAUSE, ui::DomCode::MEDIA_PLAY_PAUSE, ui::EF_NONE,
Dmitry Torokhov3e2b7d82020-02-13 18:04:433641 ui::DomKey::MEDIA_PLAY_PAUSE}},
3642 });
Ahmed Fakhryaa02b4e2017-11-13 21:43:323643
Dmitry Torokhov3e2b7d82020-02-13 18:04:433644 TestKeyboard("Internal Keyboard", kKbdTopRowLayout2Tag,
Zentaro Kavanaghc65969ef2020-05-14 00:58:433645 ui::INPUT_DEVICE_INTERNAL, /*has_custom_top_row=*/false,
3646 layout2_tests);
Ahmed Fakhryaa02b4e2017-11-13 21:43:323647}
3648
Zentaro Kavanagh76b9bcb2021-05-19 06:29:453649// Tests that event rewrites still work even if modifiers are remapped.
3650TEST_F(EventRewriterTest, TestRewriteExtendedKeysWithControlRemapped) {
3651 // Remap Control to Search.
penghuange5df2822017-03-16 22:54:363652 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]4a822092012-06-15 03:42:513653 IntegerPrefMember search;
Zentaro Kavanagh76b9bcb2021-05-19 06:29:453654 InitModifierKeyPref(&search, prefs::kLanguageRemapControlKeyTo,
3655 ui::chromeos::ModifierKey::kSearchKey);
[email protected]4a822092012-06-15 03:42:513656
Dmitry Torokhov3e2b7d82020-02-13 18:04:433657 TestChromeKeyboardVariants({
Zentaro Kavanagh76b9bcb2021-05-19 06:29:453658 // Ctrl+Right -> End
kpschoedel02c854d2015-06-16 14:44:293659 {ui::ET_KEY_PRESSED,
Zentaro Kavanagh76b9bcb2021-05-19 06:29:453660 {ui::VKEY_RIGHT, ui::DomCode::ARROW_RIGHT, ui::EF_CONTROL_DOWN,
3661 ui::DomKey::ARROW_RIGHT},
kpschoedel51d2e322015-08-28 15:29:353662 {ui::VKEY_END, ui::DomCode::END, ui::EF_NONE, ui::DomKey::END}},
[email protected]4a822092012-06-15 03:42:513663
Zentaro Kavanagh76b9bcb2021-05-19 06:29:453664 // Shift+Ctrl+Right -> Shift+End
kpschoedel02c854d2015-06-16 14:44:293665 {ui::ET_KEY_PRESSED,
Zentaro Kavanagh76b9bcb2021-05-19 06:29:453666 {ui::VKEY_RIGHT, ui::DomCode::ARROW_RIGHT,
3667 ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, ui::DomKey::ARROW_RIGHT},
kpschoedel51d2e322015-08-28 15:29:353668 {ui::VKEY_END, ui::DomCode::END, ui::EF_SHIFT_DOWN, ui::DomKey::END}},
Dmitry Torokhov3e2b7d82020-02-13 18:04:433669 });
[email protected]4a822092012-06-15 03:42:513670}
[email protected]b2a042f02012-07-19 02:41:383671
3672TEST_F(EventRewriterTest, TestRewriteKeyEventSentByXSendEvent) {
3673 // Remap Control to Alt.
penghuange5df2822017-03-16 22:54:363674 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]b2a042f02012-07-19 02:41:383675 IntegerPrefMember control;
Blake O'Harea09fa45a2017-10-13 04:19:583676 InitModifierKeyPref(&control, prefs::kLanguageRemapControlKeyTo,
3677 ui::chromeos::ModifierKey::kAltKey);
[email protected]b2a042f02012-07-19 02:41:383678
Zentaro Kavanagh1e7d867c2020-05-13 01:18:443679 SetupKeyboard("Internal Keyboard");
[email protected]b2a042f02012-07-19 02:41:383680
3681 // Send left control press.
[email protected]1c649772014-07-18 14:06:123682 {
kpschoedel8226fd152015-05-06 15:48:593683 ui::KeyEvent keyevent(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL,
3684 ui::DomCode::CONTROL_LEFT, ui::EF_FINAL,
kpschoedel51d2e322015-08-28 15:29:353685 ui::DomKey::CONTROL, ui::EventTimeForNow());
Yuichiro Hanada87c6e552020-02-07 01:07:373686 TestEventRewriterContinuation continuation;
[email protected]1c649772014-07-18 14:06:123687 // Control should NOT be remapped to Alt if EF_FINAL is set.
Yuichiro Hanada87c6e552020-02-07 01:07:373688 rewriter()->RewriteEvent(keyevent,
3689 continuation.weak_ptr_factory_.GetWeakPtr());
3690 EXPECT_TRUE(continuation.rewritten_events.empty());
3691 EXPECT_EQ(1u, continuation.passthrough_events.size());
3692 EXPECT_TRUE(continuation.passthrough_events[0]->IsKeyEvent());
3693 const auto* result = continuation.passthrough_events[0]->AsKeyEvent();
3694 EXPECT_EQ(ui::VKEY_CONTROL, result->key_code());
[email protected]1c649772014-07-18 14:06:123695 }
[email protected]d13e288992014-05-01 18:00:213696}
[email protected]b2a042f02012-07-19 02:41:383697
[email protected]d13e288992014-05-01 18:00:213698TEST_F(EventRewriterTest, TestRewriteNonNativeEvent) {
3699 // Remap Control to Alt.
penghuange5df2822017-03-16 22:54:363700 chromeos::Preferences::RegisterProfilePrefs(prefs()->registry());
[email protected]d13e288992014-05-01 18:00:213701 IntegerPrefMember control;
Blake O'Harea09fa45a2017-10-13 04:19:583702 InitModifierKeyPref(&control, prefs::kLanguageRemapControlKeyTo,
3703 ui::chromeos::ModifierKey::kAltKey);
[email protected]d13e288992014-05-01 18:00:213704
Zentaro Kavanagh1e7d867c2020-05-13 01:18:443705 SetupKeyboard("Internal Keyboard");
[email protected]d13e288992014-05-01 18:00:213706
3707 const int kTouchId = 2;
3708 gfx::Point location(0, 0);
lanwei64725672017-03-16 20:56:053709 ui::TouchEvent press(
3710 ui::ET_TOUCH_PRESSED, location, base::TimeTicks(),
Dave Tapuska1621efb2020-04-29 15:39:543711 ui::PointerDetails(ui::EventPointerType::kTouch, kTouchId));
[email protected]d13e288992014-05-01 18:00:213712 press.set_flags(ui::EF_CONTROL_DOWN);
3713
Yuichiro Hanada87c6e552020-02-07 01:07:373714 TestEventRewriterContinuation continuation;
3715 rewriter()->RewriteEvent(press, continuation.weak_ptr_factory_.GetWeakPtr());
3716 EXPECT_TRUE(continuation.passthrough_events.empty());
3717 EXPECT_EQ(1u, continuation.rewritten_events.size());
[email protected]d13e288992014-05-01 18:00:213718 // Control should be remapped to Alt.
Yuichiro Hanada87c6e552020-02-07 01:07:373719 EXPECT_EQ(ui::EF_ALT_DOWN, continuation.rewritten_events[0]->flags() &
3720 (ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN));
[email protected]b2a042f02012-07-19 02:41:383721}
[email protected]f7ab9b6042013-10-07 23:27:203722
[email protected]354520b2014-06-21 04:31:013723// Keeps a buffer of handled events.
3724class EventBuffer : public ui::test::TestEventProcessor {
3725 public:
3726 EventBuffer() {}
dchengc97a0282015-01-15 23:04:243727 ~EventBuffer() override {}
[email protected]354520b2014-06-21 04:31:013728
avi3dbcc202017-03-13 02:48:363729 void PopEvents(std::vector<std::unique_ptr<ui::Event>>* events) {
[email protected]354520b2014-06-21 04:31:013730 events->clear();
3731 events->swap(events_);
3732 }
3733
3734 private:
penghuang17134c6c2017-03-23 00:01:073735 // ui::EventSink overrides:
dchengc97a0282015-01-15 23:04:243736 ui::EventDispatchDetails OnEventFromSource(ui::Event* event) override {
moshayedi4e6623012016-03-02 04:53:583737 events_.push_back(ui::Event::Clone(*event));
[email protected]354520b2014-06-21 04:31:013738 return ui::EventDispatchDetails();
3739 }
3740
avi3dbcc202017-03-13 02:48:363741 std::vector<std::unique_ptr<ui::Event>> events_;
[email protected]354520b2014-06-21 04:31:013742
3743 DISALLOW_COPY_AND_ASSIGN(EventBuffer);
3744};
3745
3746// Trivial EventSource that does nothing but send events.
3747class TestEventSource : public ui::EventSource {
3748 public:
3749 explicit TestEventSource(ui::EventProcessor* processor)
3750 : processor_(processor) {}
penghuang17134c6c2017-03-23 00:01:073751 ui::EventSink* GetEventSink() override { return processor_; }
[email protected]354520b2014-06-21 04:31:013752 ui::EventDispatchDetails Send(ui::Event* event) {
penghuang17134c6c2017-03-23 00:01:073753 return SendEventToSink(event);
[email protected]354520b2014-06-21 04:31:013754 }
3755
3756 private:
3757 ui::EventProcessor* processor_;
3758};
3759
[email protected]f7ab9b6042013-10-07 23:27:203760// Tests of event rewriting that depend on the Ash window manager.
Scott Violet6ac56412018-12-19 17:25:503761class EventRewriterAshTest : public ChromeAshTestBase {
[email protected]f7ab9b6042013-10-07 23:27:203762 public:
[email protected]d13e288992014-05-01 18:00:213763 EventRewriterAshTest()
[email protected]354520b2014-06-21 04:31:013764 : source_(&buffer_),
Henrique Ferreirocddc8012021-03-26 00:47:153765 fake_user_manager_(new FakeChromeUserManager),
Xiyuan Xiadfe3a9f2017-11-13 21:46:263766 user_manager_enabler_(base::WrapUnique(fake_user_manager_)) {}
dchengc97a0282015-01-15 23:04:243767 ~EventRewriterAshTest() override {}
[email protected]f7ab9b6042013-10-07 23:27:203768
[email protected]354520b2014-06-21 04:31:013769 ui::EventDispatchDetails Send(ui::Event* event) {
3770 return source_.Send(event);
3771 }
3772
kpschoedel8226fd152015-05-06 15:48:593773 void SendKeyEvent(ui::EventType type,
3774 ui::KeyboardCode key_code,
3775 ui::DomCode code,
kpschoedel51d2e322015-08-28 15:29:353776 ui::DomKey key) {
Andrew Xu531197df2019-03-07 21:46:493777 SendKeyEvent(type, key_code, code, key, ui::EF_NONE);
3778 }
3779
3780 void SendKeyEvent(ui::EventType type,
3781 ui::KeyboardCode key_code,
3782 ui::DomCode code,
3783 ui::DomKey key,
3784 int flags) {
3785 ui::KeyEvent press(type, key_code, code, flags, key, ui::EventTimeForNow());
[email protected]354520b2014-06-21 04:31:013786 ui::EventDispatchDetails details = Send(&press);
3787 CHECK(!details.dispatcher_destroyed);
3788 }
3789
kpschoedel8226fd152015-05-06 15:48:593790 void SendActivateStickyKeyPattern(ui::KeyboardCode key_code,
3791 ui::DomCode code,
kpschoedel51d2e322015-08-28 15:29:353792 ui::DomKey key) {
3793 SendKeyEvent(ui::ET_KEY_PRESSED, key_code, code, key);
3794 SendKeyEvent(ui::ET_KEY_RELEASED, key_code, code, key);
[email protected]354520b2014-06-21 04:31:013795 }
3796
[email protected]e2204a702013-10-29 21:58:543797 protected:
maxbogueea16ff412016-10-28 16:35:293798 sync_preferences::TestingPrefServiceSyncable* prefs() { return &prefs_; }
[email protected]354520b2014-06-21 04:31:013799
Blake O'Harea09fa45a2017-10-13 04:19:583800 void InitModifierKeyPref(IntegerPrefMember* int_pref,
3801 const std::string& pref_name,
3802 ui::chromeos::ModifierKey modifierKey) {
3803 int_pref->Init(pref_name, prefs());
3804 int_pref->SetValue(static_cast<int>(modifierKey));
3805 }
3806
avi3dbcc202017-03-13 02:48:363807 void PopEvents(std::vector<std::unique_ptr<ui::Event>>* events) {
3808 buffer_.PopEvents(events);
3809 }
[email protected]354520b2014-06-21 04:31:013810
dchengc97a0282015-01-15 23:04:243811 void SetUp() override {
Scott Violet6ac56412018-12-19 17:25:503812 ChromeAshTestBase::SetUp();
Yeunjoo Choid5ec14b72021-08-11 00:57:223813 sticky_keys_controller_ = Shell::Get()->sticky_keys_controller();
Yuki Awanoce4c62d32018-06-28 00:36:363814 delegate_ = std::make_unique<EventRewriterDelegateImpl>(nullptr);
penghuange5df2822017-03-16 22:54:363815 delegate_->set_pref_service_for_testing(prefs());
Jinho Bang341ce5b02018-01-17 22:46:033816 rewriter_ = std::make_unique<ui::EventRewriterChromeOS>(
Jimmy Gong82c82b42021-04-17 03:12:333817 delegate_.get(), sticky_keys_controller_, false, &fake_ime_keyboard_);
[email protected]e0047752014-04-09 02:18:363818 chromeos::Preferences::RegisterProfilePrefs(prefs_.registry());
[email protected]354520b2014-06-21 04:31:013819 source_.AddEventRewriter(rewriter_.get());
3820 sticky_keys_controller_->Enable(true);
[email protected]e0047752014-04-09 02:18:363821 }
3822
dchengc97a0282015-01-15 23:04:243823 void TearDown() override {
[email protected]e0047752014-04-09 02:18:363824 rewriter_.reset();
Scott Violet6ac56412018-12-19 17:25:503825 ChromeAshTestBase::TearDown();
[email protected]e0047752014-04-09 02:18:363826 }
3827
[email protected]354520b2014-06-21 04:31:013828 protected:
Yeunjoo Choid5ec14b72021-08-11 00:57:223829 StickyKeysController* sticky_keys_controller_;
[email protected]e2204a702013-10-29 21:58:543830
[email protected]f7ab9b6042013-10-07 23:27:203831 private:
penghuange5df2822017-03-16 22:54:363832 std::unique_ptr<EventRewriterDelegateImpl> delegate_;
Jimmy Gong82c82b42021-04-17 03:12:333833 chromeos::input_method::FakeImeKeyboard fake_ime_keyboard_;
penghuange5df2822017-03-16 22:54:363834 std::unique_ptr<ui::EventRewriterChromeOS> rewriter_;
[email protected]f7ab9b6042013-10-07 23:27:203835
[email protected]354520b2014-06-21 04:31:013836 EventBuffer buffer_;
3837 TestEventSource source_;
3838
Henrique Ferreirocddc8012021-03-26 00:47:153839 FakeChromeUserManager* fake_user_manager_; // Not owned.
Xiyuan Xiadfe3a9f2017-11-13 21:46:263840 user_manager::ScopedUserManager user_manager_enabler_;
maxbogueea16ff412016-10-28 16:35:293841 sync_preferences::TestingPrefServiceSyncable prefs_;
[email protected]d13e288992014-05-01 18:00:213842
[email protected]f7ab9b6042013-10-07 23:27:203843 DISALLOW_COPY_AND_ASSIGN(EventRewriterAshTest);
3844};
3845
3846TEST_F(EventRewriterAshTest, TopRowKeysAreFunctionKeys) {
dcheng24002d02016-04-08 02:42:403847 std::unique_ptr<aura::Window> window(CreateTestWindowInShellWithId(1));
James Cook55648272017-09-13 23:14:013848 wm::ActivateWindow(window.get());
avi3dbcc202017-03-13 02:48:363849 std::vector<std::unique_ptr<ui::Event>> events;
[email protected]f7ab9b6042013-10-07 23:27:203850
3851 // Create a simulated keypress of F1 targetted at the window.
kpschoedel8226fd152015-05-06 15:48:593852 ui::KeyEvent press_f1(ui::ET_KEY_PRESSED, ui::VKEY_F1, ui::DomCode::F1,
kpschoedel51d2e322015-08-28 15:29:353853 ui::EF_NONE, ui::DomKey::F1, ui::EventTimeForNow());
[email protected]f7ab9b6042013-10-07 23:27:203854
[email protected]e2204a702013-10-29 21:58:543855 // The event should also not be rewritten if the send-function-keys pref is
3856 // additionally set, for both apps v2 and regular windows.
3857 BooleanPrefMember send_function_keys_pref;
[email protected]354520b2014-06-21 04:31:013858 send_function_keys_pref.Init(prefs::kLanguageSendFunctionKeys, prefs());
[email protected]e2204a702013-10-29 21:58:543859 send_function_keys_pref.SetValue(true);
sadrulca0e9992016-07-20 22:55:543860 ui::EventDispatchDetails details = Send(&press_f1);
[email protected]354520b2014-06-21 04:31:013861 ASSERT_FALSE(details.dispatcher_destroyed);
3862 PopEvents(&events);
3863 EXPECT_EQ(1u, events.size());
Zentaro Kavanaghc555ab452020-05-13 23:07:373864 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_F1,
3865 ui::DomCode::F1, ui::EF_NONE,
3866 ui::DomKey::F1, kNoScanCode),
3867 GetKeyEventAsString(*static_cast<ui::KeyEvent*>(events[0].get())));
[email protected]e2204a702013-10-29 21:58:543868
3869 // If the pref isn't set when an event is sent to a regular window, F1 is
3870 // rewritten to the back key.
3871 send_function_keys_pref.SetValue(false);
[email protected]354520b2014-06-21 04:31:013872 details = Send(&press_f1);
3873 ASSERT_FALSE(details.dispatcher_destroyed);
3874 PopEvents(&events);
3875 EXPECT_EQ(1u, events.size());
kpschoedel8226fd152015-05-06 15:48:593876 EXPECT_EQ(GetExpectedResultAsString(ui::ET_KEY_PRESSED, ui::VKEY_BROWSER_BACK,
3877 ui::DomCode::BROWSER_BACK, ui::EF_NONE,
Zentaro Kavanaghc555ab452020-05-13 23:07:373878 ui::DomKey::BROWSER_BACK, kNoScanCode),
avi3dbcc202017-03-13 02:48:363879 GetKeyEventAsString(*static_cast<ui::KeyEvent*>(events[0].get())));
[email protected]f7ab9b6042013-10-07 23:27:203880}
3881
Zentaro Kavanaghe7133ce2019-05-30 00:22:143882// Parameterized version of test with the same name that accepts the
3883// event flags that correspond to a right-click. This will be either
3884// Alt+Click or Search+Click. After a transition period this will
3885// default to Search+Click and the Alt+Click logic will be removed.
3886void EventRewriterTest::DontRewriteIfNotRewritten(int right_click_flags) {
Ahmed Fakhry719548c2018-10-15 23:47:193887 ui::DeviceDataManager* device_data_manager =
3888 ui::DeviceDataManager::GetInstance();
3889 std::vector<ui::InputDevice> touchpad_devices(2);
3890 constexpr int kTouchpadId1 = 10;
3891 constexpr int kTouchpadId2 = 11;
3892 touchpad_devices[0].id = kTouchpadId1;
3893 touchpad_devices[1].id = kTouchpadId2;
3894 static_cast<ui::DeviceHotplugEventObserver*>(device_data_manager)
3895 ->OnTouchpadDevicesUpdated(touchpad_devices);
3896 std::vector<ui::InputDevice> mouse_devices(1);
3897 constexpr int kMouseId = 12;
3898 touchpad_devices[0].id = kMouseId;
3899 static_cast<ui::DeviceHotplugEventObserver*>(device_data_manager)
3900 ->OnMouseDevicesUpdated(mouse_devices);
3901
Zentaro Kavanaghe7133ce2019-05-30 00:22:143902 // Test (Alt|Search) + Left click.
[email protected]595079ce2014-07-11 22:25:133903 {
robert.bradfordb3d800b2015-02-18 18:56:103904 ui::MouseEvent press(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
Zentaro Kavanaghe7133ce2019-05-30 00:22:143905 ui::EventTimeForNow(), right_click_flags,
[email protected]595079ce2014-07-11 22:25:133906 ui::EF_LEFT_MOUSE_BUTTON);
3907 ui::EventTestApi test_press(&press);
Ahmed Fakhry719548c2018-10-15 23:47:193908 test_press.set_source_device_id(kTouchpadId1);
[email protected]595079ce2014-07-11 22:25:133909 // Sanity check.
3910 EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type());
Zentaro Kavanaghe7133ce2019-05-30 00:22:143911 EXPECT_EQ(right_click_flags, press.flags());
Yuichiro Hanada875de4f32020-02-15 00:48:373912 const ui::MouseEvent result = RewriteMouseButtonEvent(press);
3913 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & result.flags());
3914 EXPECT_NE(right_click_flags, right_click_flags & result.flags());
3915 EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, result.changed_button_flags());
[email protected]595079ce2014-07-11 22:25:133916 }
3917 {
robert.bradfordb3d800b2015-02-18 18:56:103918 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(),
Zentaro Kavanaghe7133ce2019-05-30 00:22:143919 ui::EventTimeForNow(), right_click_flags,
[email protected]595079ce2014-07-11 22:25:133920 ui::EF_LEFT_MOUSE_BUTTON);
3921 ui::EventTestApi test_release(&release);
Ahmed Fakhry719548c2018-10-15 23:47:193922 test_release.set_source_device_id(kTouchpadId1);
Yuichiro Hanada875de4f32020-02-15 00:48:373923 const ui::MouseEvent result = RewriteMouseButtonEvent(release);
3924 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & result.flags());
3925 EXPECT_NE(right_click_flags, right_click_flags & result.flags());
3926 EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, result.changed_button_flags());
[email protected]595079ce2014-07-11 22:25:133927 }
[email protected]7f926752014-01-30 09:16:353928
Zentaro Kavanaghe7133ce2019-05-30 00:22:143929 // No (ALT|SEARCH) in first click.
[email protected]7f926752014-01-30 09:16:353930 {
robert.bradfordb3d800b2015-02-18 18:56:103931 ui::MouseEvent press(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
3932 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
[email protected]595079ce2014-07-11 22:25:133933 ui::EF_LEFT_MOUSE_BUTTON);
3934 ui::EventTestApi test_press(&press);
Ahmed Fakhry719548c2018-10-15 23:47:193935 test_press.set_source_device_id(kTouchpadId1);
Yuichiro Hanada875de4f32020-02-15 00:48:373936 const ui::MouseEvent result = RewriteMouseButtonEvent(press);
3937 EXPECT_TRUE(ui::EF_LEFT_MOUSE_BUTTON & result.flags());
3938 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, result.changed_button_flags());
[email protected]595079ce2014-07-11 22:25:133939 }
3940 {
robert.bradfordb3d800b2015-02-18 18:56:103941 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(),
Zentaro Kavanaghe7133ce2019-05-30 00:22:143942 ui::EventTimeForNow(), right_click_flags,
[email protected]595079ce2014-07-11 22:25:133943 ui::EF_LEFT_MOUSE_BUTTON);
3944 ui::EventTestApi test_release(&release);
Ahmed Fakhry719548c2018-10-15 23:47:193945 test_release.set_source_device_id(kTouchpadId1);
Yuichiro Hanada875de4f32020-02-15 00:48:373946 const ui::MouseEvent result = RewriteMouseButtonEvent(release);
3947 EXPECT_EQ(right_click_flags, right_click_flags & result.flags());
3948 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, result.changed_button_flags());
[email protected]595079ce2014-07-11 22:25:133949 }
[email protected]7f926752014-01-30 09:16:353950
xdaie54b1fc22015-06-05 00:59:373951 // ALT on different device.
[email protected]7f926752014-01-30 09:16:353952 {
robert.bradfordb3d800b2015-02-18 18:56:103953 ui::MouseEvent press(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
Zentaro Kavanaghe7133ce2019-05-30 00:22:143954 ui::EventTimeForNow(), right_click_flags,
[email protected]595079ce2014-07-11 22:25:133955 ui::EF_LEFT_MOUSE_BUTTON);
3956 ui::EventTestApi test_press(&press);
Ahmed Fakhry719548c2018-10-15 23:47:193957 test_press.set_source_device_id(kTouchpadId2);
Yuichiro Hanada875de4f32020-02-15 00:48:373958 const ui::MouseEvent result = RewriteMouseButtonEvent(press);
3959 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & result.flags());
3960 EXPECT_NE(right_click_flags, right_click_flags & result.flags());
3961 EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, result.changed_button_flags());
[email protected]595079ce2014-07-11 22:25:133962 }
3963 {
robert.bradfordb3d800b2015-02-18 18:56:103964 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(),
Zentaro Kavanaghe7133ce2019-05-30 00:22:143965 ui::EventTimeForNow(), right_click_flags,
[email protected]595079ce2014-07-11 22:25:133966 ui::EF_LEFT_MOUSE_BUTTON);
3967 ui::EventTestApi test_release(&release);
Ahmed Fakhry719548c2018-10-15 23:47:193968 test_release.set_source_device_id(kTouchpadId1);
Yuichiro Hanada875de4f32020-02-15 00:48:373969 const ui::MouseEvent result = RewriteMouseButtonEvent(release);
3970 EXPECT_EQ(right_click_flags, right_click_flags & result.flags());
3971 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, result.changed_button_flags());
[email protected]595079ce2014-07-11 22:25:133972 }
3973 {
robert.bradfordb3d800b2015-02-18 18:56:103974 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(),
Zentaro Kavanaghe7133ce2019-05-30 00:22:143975 ui::EventTimeForNow(), right_click_flags,
[email protected]595079ce2014-07-11 22:25:133976 ui::EF_LEFT_MOUSE_BUTTON);
3977 ui::EventTestApi test_release(&release);
Ahmed Fakhry719548c2018-10-15 23:47:193978 test_release.set_source_device_id(kTouchpadId2);
Yuichiro Hanada875de4f32020-02-15 00:48:373979 const ui::MouseEvent result = RewriteMouseButtonEvent(release);
3980 EXPECT_TRUE(ui::EF_RIGHT_MOUSE_BUTTON & result.flags());
3981 EXPECT_NE(right_click_flags, right_click_flags & result.flags());
3982 EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, result.changed_button_flags());
[email protected]595079ce2014-07-11 22:25:133983 }
Ahmed Fakhry719548c2018-10-15 23:47:193984
3985 // No rewrite for non-touchpad devices.
3986 {
3987 ui::MouseEvent press(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
Zentaro Kavanaghe7133ce2019-05-30 00:22:143988 ui::EventTimeForNow(), right_click_flags,
Ahmed Fakhry719548c2018-10-15 23:47:193989 ui::EF_LEFT_MOUSE_BUTTON);
3990 ui::EventTestApi test_press(&press);
3991 test_press.set_source_device_id(kMouseId);
3992 EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type());
Zentaro Kavanaghe7133ce2019-05-30 00:22:143993 EXPECT_EQ(right_click_flags, press.flags());
Yuichiro Hanada875de4f32020-02-15 00:48:373994 const ui::MouseEvent result = RewriteMouseButtonEvent(press);
3995 EXPECT_EQ(right_click_flags, right_click_flags & result.flags());
3996 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, result.changed_button_flags());
Ahmed Fakhry719548c2018-10-15 23:47:193997 }
3998 {
3999 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(),
Zentaro Kavanaghe7133ce2019-05-30 00:22:144000 ui::EventTimeForNow(), right_click_flags,
Ahmed Fakhry719548c2018-10-15 23:47:194001 ui::EF_LEFT_MOUSE_BUTTON);
4002 ui::EventTestApi test_release(&release);
4003 test_release.set_source_device_id(kMouseId);
Yuichiro Hanada875de4f32020-02-15 00:48:374004 const ui::MouseEvent result = RewriteMouseButtonEvent(release);
4005 EXPECT_EQ(right_click_flags, right_click_flags & result.flags());
4006 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, result.changed_button_flags());
Ahmed Fakhry719548c2018-10-15 23:47:194007 }
[email protected]354520b2014-06-21 04:31:014008}
4009
Zentaro Kavanaghe7133ce2019-05-30 00:22:144010TEST_F(EventRewriterTest, DontRewriteIfNotRewritten_AltClickIsRightClick) {
4011 DontRewriteIfNotRewritten(ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN);
Zentaro Kavanaghd6112d82021-02-19 21:21:324012 EXPECT_EQ(message_center_.NotificationCount(), 0);
Zentaro Kavanaghe7133ce2019-05-30 00:22:144013}
4014
Zentaro Kavanagh53c48cb22021-03-25 00:19:064015TEST_F(EventRewriterTest, DontRewriteIfNotRewritten_AltClickIsRightClick_New) {
4016 // Enabling the kImprovedKeyboardShortcuts feature does not change alt+click
4017 // behavior or create a notification.
4018 scoped_feature_list_.InitAndEnableFeature(
4019 ::features::kImprovedKeyboardShortcuts);
4020 DontRewriteIfNotRewritten(ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN);
4021 EXPECT_EQ(message_center_.NotificationCount(), 0);
4022}
4023
Zentaro Kavanaghe7133ce2019-05-30 00:22:144024TEST_F(EventRewriterTest, DontRewriteIfNotRewritten_SearchClickIsRightClick) {
4025 scoped_feature_list_.InitAndEnableFeature(
Yeunjoo Choid5ec14b72021-08-11 00:57:224026 features::kUseSearchClickForRightClick);
Zentaro Kavanaghe7133ce2019-05-30 00:22:144027 DontRewriteIfNotRewritten(ui::EF_LEFT_MOUSE_BUTTON | ui::EF_COMMAND_DOWN);
Zentaro Kavanaghd6112d82021-02-19 21:21:324028 EXPECT_EQ(message_center_.NotificationCount(), 0);
Zentaro Kavanaghe7133ce2019-05-30 00:22:144029}
4030
Zentaro Kavanagh53c48cb22021-03-25 00:19:064031TEST_F(EventRewriterTest, DontRewriteIfNotRewritten_AltClickDeprecated) {
4032 // Pressing search+click with alt+click deprecated works, but does not
4033 // generate a notification.
4034 scoped_feature_list_.InitAndEnableFeature(::features::kDeprecateAltClick);
Zentaro Kavanagh30f15aa2021-02-13 00:03:584035 DontRewriteIfNotRewritten(ui::EF_LEFT_MOUSE_BUTTON | ui::EF_COMMAND_DOWN);
Zentaro Kavanaghd6112d82021-02-19 21:21:324036 EXPECT_EQ(message_center_.NotificationCount(), 0);
4037}
4038
4039TEST_F(EventRewriterTest, DeprecatedAltClickGeneratesNotification) {
Zentaro Kavanagh53c48cb22021-03-25 00:19:064040 scoped_feature_list_.InitAndEnableFeature(::features::kDeprecateAltClick);
Zentaro Kavanaghd6112d82021-02-19 21:21:324041 ui::DeviceDataManager* device_data_manager =
4042 ui::DeviceDataManager::GetInstance();
4043 std::vector<ui::InputDevice> touchpad_devices(1);
4044 constexpr int kTouchpadId1 = 10;
4045 touchpad_devices[0].id = kTouchpadId1;
4046 static_cast<ui::DeviceHotplugEventObserver*>(device_data_manager)
4047 ->OnTouchpadDevicesUpdated(touchpad_devices);
4048 std::vector<ui::InputDevice> mouse_devices(1);
4049 constexpr int kMouseId = 12;
4050 touchpad_devices[0].id = kMouseId;
4051 static_cast<ui::DeviceHotplugEventObserver*>(device_data_manager)
4052 ->OnMouseDevicesUpdated(mouse_devices);
4053
4054 const int deprecated_flags = ui::EF_LEFT_MOUSE_BUTTON | ui::EF_ALT_DOWN;
4055
4056 // Alt + Left click => No rewrite.
4057 {
4058 ui::MouseEvent press(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
4059 ui::EventTimeForNow(), deprecated_flags,
4060 ui::EF_LEFT_MOUSE_BUTTON);
4061 ui::EventTestApi test_press(&press);
4062 test_press.set_source_device_id(kTouchpadId1);
4063 // Sanity check.
4064 EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type());
4065 EXPECT_EQ(deprecated_flags, press.flags());
4066 const ui::MouseEvent result = RewriteMouseButtonEvent(press);
4067
4068 // No rewrite occurred.
4069 EXPECT_EQ(deprecated_flags, deprecated_flags & result.flags());
4070 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, result.changed_button_flags());
4071
4072 // Expect a deprecation notification.
4073 EXPECT_EQ(message_center_.NotificationCount(), 1);
4074 ClearNotifications();
4075 }
4076 {
4077 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(),
4078 ui::EventTimeForNow(), deprecated_flags,
4079 ui::EF_LEFT_MOUSE_BUTTON);
4080 ui::EventTestApi test_release(&release);
4081 test_release.set_source_device_id(kTouchpadId1);
4082 const ui::MouseEvent result = RewriteMouseButtonEvent(release);
4083
4084 // No rewrite occurred.
4085 EXPECT_EQ(deprecated_flags, deprecated_flags & result.flags());
4086 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, result.changed_button_flags());
4087
4088 // Don't expect a new notification on release.
4089 EXPECT_EQ(message_center_.NotificationCount(), 0);
4090 }
4091
4092 // No rewrite or notification for non-touchpad devices.
4093 {
4094 ui::MouseEvent press(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
4095 ui::EventTimeForNow(), deprecated_flags,
4096 ui::EF_LEFT_MOUSE_BUTTON);
4097 ui::EventTestApi test_press(&press);
4098 test_press.set_source_device_id(kMouseId);
4099 EXPECT_EQ(ui::ET_MOUSE_PRESSED, press.type());
4100 EXPECT_EQ(deprecated_flags, press.flags());
4101 const ui::MouseEvent result = RewriteMouseButtonEvent(press);
4102 EXPECT_EQ(deprecated_flags, deprecated_flags & result.flags());
4103 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, result.changed_button_flags());
4104
4105 // No notification expected for this case.
4106 EXPECT_EQ(message_center_.NotificationCount(), 0);
4107 }
4108 {
4109 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(),
4110 ui::EventTimeForNow(), deprecated_flags,
4111 ui::EF_LEFT_MOUSE_BUTTON);
4112 ui::EventTestApi test_release(&release);
4113 test_release.set_source_device_id(kMouseId);
4114 const ui::MouseEvent result = RewriteMouseButtonEvent(release);
4115 EXPECT_EQ(deprecated_flags, deprecated_flags & result.flags());
4116 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, result.changed_button_flags());
4117
4118 // No notification expected for this case.
4119 EXPECT_EQ(message_center_.NotificationCount(), 0);
4120 }
Zentaro Kavanagh30f15aa2021-02-13 00:03:584121}
4122
[email protected]354520b2014-06-21 04:31:014123TEST_F(EventRewriterAshTest, StickyKeyEventDispatchImpl) {
4124 // Test the actual key event dispatch implementation.
avi3dbcc202017-03-13 02:48:364125 std::vector<std::unique_ptr<ui::Event>> events;
[email protected]354520b2014-06-21 04:31:014126
kpschoedel8226fd152015-05-06 15:48:594127 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:354128 ui::DomKey::CONTROL);
[email protected]354520b2014-06-21 04:31:014129 PopEvents(&events);
4130 EXPECT_EQ(1u, events.size());
4131 EXPECT_EQ(ui::ET_KEY_PRESSED, events[0]->type());
4132 EXPECT_EQ(ui::VKEY_CONTROL,
avi3dbcc202017-03-13 02:48:364133 static_cast<ui::KeyEvent*>(events[0].get())->key_code());
[email protected]354520b2014-06-21 04:31:014134
4135 // Test key press event is correctly modified and modifier release
4136 // event is sent.
kpschoedela281bf12016-01-07 15:08:194137 ui::KeyEvent press(ui::ET_KEY_PRESSED, ui::VKEY_C, ui::DomCode::US_C,
kpschoedel51d2e322015-08-28 15:29:354138 ui::EF_NONE, ui::DomKey::Constant<'c'>::Character,
kpschoedel8226fd152015-05-06 15:48:594139 ui::EventTimeForNow());
[email protected]354520b2014-06-21 04:31:014140 ui::EventDispatchDetails details = Send(&press);
4141 PopEvents(&events);
4142 EXPECT_EQ(2u, events.size());
4143 EXPECT_EQ(ui::ET_KEY_PRESSED, events[0]->type());
avi3dbcc202017-03-13 02:48:364144 EXPECT_EQ(ui::VKEY_C,
4145 static_cast<ui::KeyEvent*>(events[0].get())->key_code());
[email protected]354520b2014-06-21 04:31:014146 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
4147 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type());
4148 EXPECT_EQ(ui::VKEY_CONTROL,
avi3dbcc202017-03-13 02:48:364149 static_cast<ui::KeyEvent*>(events[1].get())->key_code());
[email protected]354520b2014-06-21 04:31:014150
4151 // Test key release event is not modified.
kpschoedela281bf12016-01-07 15:08:194152 ui::KeyEvent release(ui::ET_KEY_RELEASED, ui::VKEY_C, ui::DomCode::US_C,
kpschoedel51d2e322015-08-28 15:29:354153 ui::EF_NONE, ui::DomKey::Constant<'c'>::Character,
kpschoedel8226fd152015-05-06 15:48:594154 ui::EventTimeForNow());
[email protected]354520b2014-06-21 04:31:014155 details = Send(&release);
4156 ASSERT_FALSE(details.dispatcher_destroyed);
4157 PopEvents(&events);
4158 EXPECT_EQ(1u, events.size());
4159 EXPECT_EQ(ui::ET_KEY_RELEASED, events[0]->type());
avi3dbcc202017-03-13 02:48:364160 EXPECT_EQ(ui::VKEY_C,
4161 static_cast<ui::KeyEvent*>(events[0].get())->key_code());
[email protected]354520b2014-06-21 04:31:014162 EXPECT_FALSE(events[0]->flags() & ui::EF_CONTROL_DOWN);
4163}
4164
4165TEST_F(EventRewriterAshTest, MouseEventDispatchImpl) {
avi3dbcc202017-03-13 02:48:364166 std::vector<std::unique_ptr<ui::Event>> events;
[email protected]354520b2014-06-21 04:31:014167
kpschoedel8226fd152015-05-06 15:48:594168 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:354169 ui::DomKey::CONTROL);
[email protected]354520b2014-06-21 04:31:014170 PopEvents(&events);
4171
4172 // Test mouse press event is correctly modified.
4173 gfx::Point location(0, 0);
robert.bradfordb3d800b2015-02-18 18:56:104174 ui::MouseEvent press(ui::ET_MOUSE_PRESSED, location, location,
4175 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
[email protected]354520b2014-06-21 04:31:014176 ui::EF_LEFT_MOUSE_BUTTON);
4177 ui::EventDispatchDetails details = Send(&press);
4178 ASSERT_FALSE(details.dispatcher_destroyed);
4179 PopEvents(&events);
4180 EXPECT_EQ(1u, events.size());
4181 EXPECT_EQ(ui::ET_MOUSE_PRESSED, events[0]->type());
4182 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
4183
4184 // Test mouse release event is correctly modified and modifier release
4185 // event is sent. The mouse event should have the correct DIP location.
robert.bradfordb3d800b2015-02-18 18:56:104186 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, location, location,
4187 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
[email protected]354520b2014-06-21 04:31:014188 ui::EF_LEFT_MOUSE_BUTTON);
4189 details = Send(&release);
4190 ASSERT_FALSE(details.dispatcher_destroyed);
4191 PopEvents(&events);
4192 EXPECT_EQ(2u, events.size());
4193 EXPECT_EQ(ui::ET_MOUSE_RELEASED, events[0]->type());
4194 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
4195 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type());
4196 EXPECT_EQ(ui::VKEY_CONTROL,
avi3dbcc202017-03-13 02:48:364197 static_cast<ui::KeyEvent*>(events[1].get())->key_code());
[email protected]354520b2014-06-21 04:31:014198}
4199
4200TEST_F(EventRewriterAshTest, MouseWheelEventDispatchImpl) {
avi3dbcc202017-03-13 02:48:364201 std::vector<std::unique_ptr<ui::Event>> events;
[email protected]354520b2014-06-21 04:31:014202
4203 // Test positive mouse wheel event is correctly modified and modifier release
4204 // event is sent.
kpschoedel8226fd152015-05-06 15:48:594205 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:354206 ui::DomKey::CONTROL);
[email protected]354520b2014-06-21 04:31:014207 PopEvents(&events);
4208 gfx::Point location(0, 0);
riajiang1c49eca2016-08-30 19:36:534209 ui::MouseWheelEvent positive(
4210 gfx::Vector2d(0, ui::MouseWheelEvent::kWheelDelta), location, location,
4211 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
4212 ui::EF_LEFT_MOUSE_BUTTON);
[email protected]354520b2014-06-21 04:31:014213 ui::EventDispatchDetails details = Send(&positive);
4214 ASSERT_FALSE(details.dispatcher_destroyed);
4215 PopEvents(&events);
4216 EXPECT_EQ(2u, events.size());
4217 EXPECT_TRUE(events[0]->IsMouseWheelEvent());
4218 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
4219 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type());
4220 EXPECT_EQ(ui::VKEY_CONTROL,
avi3dbcc202017-03-13 02:48:364221 static_cast<ui::KeyEvent*>(events[1].get())->key_code());
[email protected]354520b2014-06-21 04:31:014222
4223 // Test negative mouse wheel event is correctly modified and modifier release
4224 // event is sent.
kpschoedel8226fd152015-05-06 15:48:594225 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:354226 ui::DomKey::CONTROL);
[email protected]354520b2014-06-21 04:31:014227 PopEvents(&events);
riajiang1c49eca2016-08-30 19:36:534228 ui::MouseWheelEvent negative(
4229 gfx::Vector2d(0, -ui::MouseWheelEvent::kWheelDelta), location, location,
4230 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
4231 ui::EF_LEFT_MOUSE_BUTTON);
[email protected]354520b2014-06-21 04:31:014232 details = Send(&negative);
4233 ASSERT_FALSE(details.dispatcher_destroyed);
4234 PopEvents(&events);
4235 EXPECT_EQ(2u, events.size());
4236 EXPECT_TRUE(events[0]->IsMouseWheelEvent());
4237 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
4238 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type());
4239 EXPECT_EQ(ui::VKEY_CONTROL,
avi3dbcc202017-03-13 02:48:364240 static_cast<ui::KeyEvent*>(events[1].get())->key_code());
[email protected]354520b2014-06-21 04:31:014241}
4242
afakhry1688ee312016-04-15 16:36:334243// Tests that if modifier keys are remapped, the flags of a mouse wheel event
4244// will be rewritten properly.
4245TEST_F(EventRewriterAshTest, MouseWheelEventModifiersRewritten) {
afakhry1688ee312016-04-15 16:36:334246 // Generate a mouse wheel event that has a CONTROL_DOWN modifier flag and
Yuichiro Hanada9efb801e2020-02-15 01:18:004247 // expect that no rewriting happens as no modifier remapping is active.
avi3dbcc202017-03-13 02:48:364248 std::vector<std::unique_ptr<ui::Event>> events;
afakhry1688ee312016-04-15 16:36:334249 gfx::Point location(0, 0);
riajiang1c49eca2016-08-30 19:36:534250 ui::MouseWheelEvent positive(
4251 gfx::Vector2d(0, ui::MouseWheelEvent::kWheelDelta), location, location,
4252 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON | ui::EF_CONTROL_DOWN,
4253 ui::EF_LEFT_MOUSE_BUTTON);
afakhry1688ee312016-04-15 16:36:334254 ui::EventDispatchDetails details = Send(&positive);
4255 ASSERT_FALSE(details.dispatcher_destroyed);
4256 PopEvents(&events);
4257 EXPECT_EQ(1u, events.size());
4258 EXPECT_TRUE(events[0]->IsMouseWheelEvent());
Yuichiro Hanada9efb801e2020-02-15 01:18:004259 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
4260
4261 // Remap Control to Alt.
4262 IntegerPrefMember control;
4263 InitModifierKeyPref(&control, prefs::kLanguageRemapControlKeyTo,
4264 ui::chromeos::ModifierKey::kAltKey);
4265
4266 // Sends the same events once again and expect that it will be rewritten to
4267 // ALT_DOWN.
4268 details = Send(&positive);
4269 ASSERT_FALSE(details.dispatcher_destroyed);
4270 PopEvents(&events);
4271 EXPECT_EQ(1u, events.size());
4272 EXPECT_TRUE(events[0]->IsMouseWheelEvent());
afakhry1688ee312016-04-15 16:36:334273 EXPECT_FALSE(events[0]->flags() & ui::EF_CONTROL_DOWN);
4274 EXPECT_TRUE(events[0]->flags() & ui::EF_ALT_DOWN);
4275}
4276
Andrew Xu531197df2019-03-07 21:46:494277// Tests edge cases of key event rewriting (see https://crbug.com/913209).
4278TEST_F(EventRewriterAshTest, KeyEventRewritingEdgeCases) {
4279 std::vector<std::unique_ptr<ui::Event>> events;
4280
4281 // Edge case 1: Press the Launcher button first. Then press the Up Arrow
4282 // button.
4283 SendKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_COMMAND, ui::DomCode::META_LEFT,
4284 ui::DomKey::META);
4285 SendKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_UP, ui::DomCode::ARROW_UP,
4286 ui::DomKey::ARROW_UP, ui::EF_COMMAND_DOWN);
4287
4288 PopEvents(&events);
4289 EXPECT_EQ(2u, events.size());
4290 events.clear();
4291
4292 SendKeyEvent(ui::ET_KEY_RELEASED, ui::VKEY_COMMAND, ui::DomCode::META_LEFT,
4293 ui::DomKey::META);
4294 PopEvents(&events);
4295
4296 // When releasing the Launcher button, the rewritten event should be released
4297 // as well.
4298 EXPECT_EQ(2u, events.size());
4299 EXPECT_EQ(ui::VKEY_COMMAND,
4300 static_cast<ui::KeyEvent*>(events[0].get())->key_code());
4301 EXPECT_EQ(ui::VKEY_PRIOR,
4302 static_cast<ui::KeyEvent*>(events[1].get())->key_code());
4303
4304 events.clear();
4305
4306 // Edge case 2: Press the Up Arrow button first. Then press the Launch button.
4307 SendKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_UP, ui::DomCode::ARROW_UP,
4308 ui::DomKey::ARROW_UP);
4309 SendKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_COMMAND, ui::DomCode::META_LEFT,
4310 ui::DomKey::META);
4311
4312 PopEvents(&events);
4313 EXPECT_EQ(2u, events.size());
4314 events.clear();
4315
4316 SendKeyEvent(ui::ET_KEY_RELEASED, ui::VKEY_UP, ui::DomCode::ARROW_UP,
4317 ui::DomKey::ARROW_UP, ui::EF_COMMAND_DOWN);
4318 PopEvents(&events);
4319
4320 // When releasing the Up Arrow button, the rewritten event should be blocked.
4321 EXPECT_EQ(1u, events.size());
4322 EXPECT_EQ(ui::VKEY_UP,
4323 static_cast<ui::KeyEvent*>(events[0].get())->key_code());
4324}
4325
Yuichiro Hanada5841d652020-02-07 01:12:224326TEST_F(EventRewriterAshTest, ScrollEventDispatchImpl) {
4327 std::vector<std::unique_ptr<ui::Event>> events;
4328
4329 // Test scroll event is correctly modified.
4330 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
4331 ui::DomKey::CONTROL);
4332 PopEvents(&events);
4333 gfx::PointF location(0, 0);
4334 ui::ScrollEvent scroll(ui::ET_SCROLL, location, location,
4335 ui::EventTimeForNow(), 0 /* flag */, 0 /* x_offset */,
4336 1 /* y_offset */, 0 /* x_offset_ordinal */,
4337 1 /* y_offset_ordinal */, 2 /* finger */);
4338 ui::EventDispatchDetails details = Send(&scroll);
4339 ASSERT_FALSE(details.dispatcher_destroyed);
4340 PopEvents(&events);
4341 EXPECT_EQ(1u, events.size());
4342 EXPECT_TRUE(events[0]->IsScrollEvent());
4343 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
4344
4345 // Test FLING_START event deactivates the sticky key, but is modified.
4346 ui::ScrollEvent fling_start(
4347 ui::ET_SCROLL_FLING_START, location, location, ui::EventTimeForNow(),
4348 0 /* flag */, 0 /* x_offset */, 0 /* y_offset */,
4349 0 /* x_offset_ordinal */, 0 /* y_offset_ordinal */, 2 /* finger */);
4350 details = Send(&fling_start);
4351 PopEvents(&events);
4352 EXPECT_EQ(2u, events.size());
4353 EXPECT_TRUE(events[0]->IsScrollEvent());
4354 EXPECT_TRUE(events[0]->flags() & ui::EF_CONTROL_DOWN);
4355 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type());
4356 EXPECT_EQ(ui::VKEY_CONTROL,
4357 static_cast<ui::KeyEvent*>(events[1].get())->key_code());
4358
4359 // Test scroll direction change causes that modifier release event is sent.
4360 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
4361 ui::DomKey::CONTROL);
4362 details = Send(&scroll);
4363 ASSERT_FALSE(details.dispatcher_destroyed);
4364 PopEvents(&events);
4365
4366 ui::ScrollEvent scroll2(ui::ET_SCROLL, location, location,
4367 ui::EventTimeForNow(), 0 /* flag */, 0 /* x_offset */,
4368 -1 /* y_offset */, 0 /* x_offset_ordinal */,
4369 -1 /* y_offset_ordinal */, 2 /* finger */);
4370 details = Send(&scroll2);
4371 ASSERT_FALSE(details.dispatcher_destroyed);
4372 PopEvents(&events);
4373 EXPECT_EQ(2u, events.size());
4374 EXPECT_TRUE(events[0]->IsScrollEvent());
4375 EXPECT_FALSE(events[0]->flags() & ui::EF_CONTROL_DOWN);
4376 EXPECT_EQ(ui::ET_KEY_RELEASED, events[1]->type());
4377 EXPECT_EQ(ui::VKEY_CONTROL,
4378 static_cast<ui::KeyEvent*>(events[1].get())->key_code());
4379}
4380
[email protected]354520b2014-06-21 04:31:014381class StickyKeysOverlayTest : public EventRewriterAshTest {
4382 public:
4383 StickyKeysOverlayTest() : overlay_(NULL) {}
4384
dchengc97a0282015-01-15 23:04:244385 ~StickyKeysOverlayTest() override {}
[email protected]354520b2014-06-21 04:31:014386
dchengc97a0282015-01-15 23:04:244387 void SetUp() override {
[email protected]354520b2014-06-21 04:31:014388 EventRewriterAshTest::SetUp();
4389 overlay_ = sticky_keys_controller_->GetOverlayForTest();
4390 ASSERT_TRUE(overlay_);
4391 }
4392
Yeunjoo Choid5ec14b72021-08-11 00:57:224393 StickyKeysOverlay* overlay_;
[email protected]354520b2014-06-21 04:31:014394};
4395
4396TEST_F(StickyKeysOverlayTest, OneModifierEnabled) {
4397 EXPECT_FALSE(overlay_->is_visible());
Yeunjoo Choid5ec14b72021-08-11 00:57:224398 EXPECT_EQ(STICKY_KEY_STATE_DISABLED,
[email protected]354520b2014-06-21 04:31:014399 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
4400
4401 // Pressing modifier key should show overlay.
kpschoedel8226fd152015-05-06 15:48:594402 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:354403 ui::DomKey::CONTROL);
[email protected]354520b2014-06-21 04:31:014404 EXPECT_TRUE(overlay_->is_visible());
Yeunjoo Choid5ec14b72021-08-11 00:57:224405 EXPECT_EQ(STICKY_KEY_STATE_ENABLED,
[email protected]354520b2014-06-21 04:31:014406 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
4407
4408 // Pressing a normal key should hide overlay.
kpschoedela281bf12016-01-07 15:08:194409 SendActivateStickyKeyPattern(ui::VKEY_T, ui::DomCode::US_T,
kpschoedel51d2e322015-08-28 15:29:354410 ui::DomKey::Constant<'t'>::Character);
[email protected]354520b2014-06-21 04:31:014411 EXPECT_FALSE(overlay_->is_visible());
Yeunjoo Choid5ec14b72021-08-11 00:57:224412 EXPECT_EQ(STICKY_KEY_STATE_DISABLED,
[email protected]354520b2014-06-21 04:31:014413 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
4414}
4415
4416TEST_F(StickyKeysOverlayTest, TwoModifiersEnabled) {
4417 EXPECT_FALSE(overlay_->is_visible());
Yeunjoo Choid5ec14b72021-08-11 00:57:224418 EXPECT_EQ(STICKY_KEY_STATE_DISABLED,
[email protected]354520b2014-06-21 04:31:014419 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
Yeunjoo Choid5ec14b72021-08-11 00:57:224420 EXPECT_EQ(STICKY_KEY_STATE_DISABLED,
[email protected]354520b2014-06-21 04:31:014421 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
4422
4423 // Pressing two modifiers should show overlay.
kpschoedel8226fd152015-05-06 15:48:594424 SendActivateStickyKeyPattern(ui::VKEY_SHIFT, ui::DomCode::SHIFT_LEFT,
kpschoedel51d2e322015-08-28 15:29:354425 ui::DomKey::SHIFT);
kpschoedel8226fd152015-05-06 15:48:594426 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:354427 ui::DomKey::CONTROL);
[email protected]354520b2014-06-21 04:31:014428 EXPECT_TRUE(overlay_->is_visible());
Yeunjoo Choid5ec14b72021-08-11 00:57:224429 EXPECT_EQ(STICKY_KEY_STATE_ENABLED,
[email protected]354520b2014-06-21 04:31:014430 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
Yeunjoo Choid5ec14b72021-08-11 00:57:224431 EXPECT_EQ(STICKY_KEY_STATE_ENABLED,
[email protected]354520b2014-06-21 04:31:014432 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
4433
4434 // Pressing a normal key should hide overlay.
kpschoedela281bf12016-01-07 15:08:194435 SendActivateStickyKeyPattern(ui::VKEY_N, ui::DomCode::US_N,
kpschoedel51d2e322015-08-28 15:29:354436 ui::DomKey::Constant<'n'>::Character);
[email protected]354520b2014-06-21 04:31:014437 EXPECT_FALSE(overlay_->is_visible());
Yeunjoo Choid5ec14b72021-08-11 00:57:224438 EXPECT_EQ(STICKY_KEY_STATE_DISABLED,
[email protected]354520b2014-06-21 04:31:014439 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
Yeunjoo Choid5ec14b72021-08-11 00:57:224440 EXPECT_EQ(STICKY_KEY_STATE_DISABLED,
[email protected]354520b2014-06-21 04:31:014441 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
4442}
4443
4444TEST_F(StickyKeysOverlayTest, LockedModifier) {
4445 EXPECT_FALSE(overlay_->is_visible());
Yeunjoo Choid5ec14b72021-08-11 00:57:224446 EXPECT_EQ(STICKY_KEY_STATE_DISABLED,
[email protected]354520b2014-06-21 04:31:014447 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
4448
4449 // Pressing a modifier key twice should lock modifier and show overlay.
kpschoedel8226fd152015-05-06 15:48:594450 SendActivateStickyKeyPattern(ui::VKEY_LMENU, ui::DomCode::ALT_LEFT,
kpschoedel51d2e322015-08-28 15:29:354451 ui::DomKey::ALT);
kpschoedel8226fd152015-05-06 15:48:594452 SendActivateStickyKeyPattern(ui::VKEY_LMENU, ui::DomCode::ALT_LEFT,
kpschoedel51d2e322015-08-28 15:29:354453 ui::DomKey::ALT);
[email protected]354520b2014-06-21 04:31:014454 EXPECT_TRUE(overlay_->is_visible());
Yeunjoo Choid5ec14b72021-08-11 00:57:224455 EXPECT_EQ(STICKY_KEY_STATE_LOCKED,
[email protected]354520b2014-06-21 04:31:014456 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
4457
4458 // Pressing a normal key should not hide overlay.
kpschoedela281bf12016-01-07 15:08:194459 SendActivateStickyKeyPattern(ui::VKEY_D, ui::DomCode::US_D,
kpschoedel51d2e322015-08-28 15:29:354460 ui::DomKey::Constant<'d'>::Character);
[email protected]354520b2014-06-21 04:31:014461 EXPECT_TRUE(overlay_->is_visible());
Yeunjoo Choid5ec14b72021-08-11 00:57:224462 EXPECT_EQ(STICKY_KEY_STATE_LOCKED,
[email protected]354520b2014-06-21 04:31:014463 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
4464}
4465
4466TEST_F(StickyKeysOverlayTest, LockedAndNormalModifier) {
4467 EXPECT_FALSE(overlay_->is_visible());
Yeunjoo Choid5ec14b72021-08-11 00:57:224468 EXPECT_EQ(STICKY_KEY_STATE_DISABLED,
[email protected]354520b2014-06-21 04:31:014469 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
Yeunjoo Choid5ec14b72021-08-11 00:57:224470 EXPECT_EQ(STICKY_KEY_STATE_DISABLED,
[email protected]354520b2014-06-21 04:31:014471 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
4472
4473 // Pressing a modifier key twice should lock modifier and show overlay.
kpschoedel8226fd152015-05-06 15:48:594474 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:354475 ui::DomKey::CONTROL);
kpschoedel8226fd152015-05-06 15:48:594476 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:354477 ui::DomKey::CONTROL);
[email protected]354520b2014-06-21 04:31:014478 EXPECT_TRUE(overlay_->is_visible());
Yeunjoo Choid5ec14b72021-08-11 00:57:224479 EXPECT_EQ(STICKY_KEY_STATE_LOCKED,
[email protected]354520b2014-06-21 04:31:014480 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
4481
4482 // Pressing another modifier key should still show overlay.
kpschoedel8226fd152015-05-06 15:48:594483 SendActivateStickyKeyPattern(ui::VKEY_SHIFT, ui::DomCode::SHIFT_LEFT,
kpschoedel51d2e322015-08-28 15:29:354484 ui::DomKey::SHIFT);
[email protected]354520b2014-06-21 04:31:014485 EXPECT_TRUE(overlay_->is_visible());
Yeunjoo Choid5ec14b72021-08-11 00:57:224486 EXPECT_EQ(STICKY_KEY_STATE_LOCKED,
[email protected]354520b2014-06-21 04:31:014487 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
Yeunjoo Choid5ec14b72021-08-11 00:57:224488 EXPECT_EQ(STICKY_KEY_STATE_ENABLED,
[email protected]354520b2014-06-21 04:31:014489 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
4490
4491 // Pressing a normal key should not hide overlay but disable normal modifier.
kpschoedela281bf12016-01-07 15:08:194492 SendActivateStickyKeyPattern(ui::VKEY_D, ui::DomCode::US_D,
kpschoedel51d2e322015-08-28 15:29:354493 ui::DomKey::Constant<'d'>::Character);
[email protected]354520b2014-06-21 04:31:014494 EXPECT_TRUE(overlay_->is_visible());
Yeunjoo Choid5ec14b72021-08-11 00:57:224495 EXPECT_EQ(STICKY_KEY_STATE_LOCKED,
[email protected]354520b2014-06-21 04:31:014496 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
Yeunjoo Choid5ec14b72021-08-11 00:57:224497 EXPECT_EQ(STICKY_KEY_STATE_DISABLED,
[email protected]354520b2014-06-21 04:31:014498 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
4499}
4500
4501TEST_F(StickyKeysOverlayTest, ModifiersDisabled) {
4502 EXPECT_FALSE(overlay_->is_visible());
Yeunjoo Choid5ec14b72021-08-11 00:57:224503 EXPECT_EQ(STICKY_KEY_STATE_DISABLED,
[email protected]354520b2014-06-21 04:31:014504 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
Yeunjoo Choid5ec14b72021-08-11 00:57:224505 EXPECT_EQ(STICKY_KEY_STATE_DISABLED,
[email protected]354520b2014-06-21 04:31:014506 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
Yeunjoo Choid5ec14b72021-08-11 00:57:224507 EXPECT_EQ(STICKY_KEY_STATE_DISABLED,
[email protected]354520b2014-06-21 04:31:014508 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
Yeunjoo Choid5ec14b72021-08-11 00:57:224509 EXPECT_EQ(STICKY_KEY_STATE_DISABLED,
tengs6a04ecf92014-10-09 19:56:114510 overlay_->GetModifierKeyState(ui::EF_COMMAND_DOWN));
[email protected]354520b2014-06-21 04:31:014511
4512 // Enable modifiers.
kpschoedel8226fd152015-05-06 15:48:594513 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:354514 ui::DomKey::CONTROL);
kpschoedel8226fd152015-05-06 15:48:594515 SendActivateStickyKeyPattern(ui::VKEY_SHIFT, ui::DomCode::SHIFT_LEFT,
kpschoedel51d2e322015-08-28 15:29:354516 ui::DomKey::SHIFT);
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_LMENU, ui::DomCode::ALT_LEFT,
kpschoedel51d2e322015-08-28 15:29:354520 ui::DomKey::ALT);
dtapuskaaf863af2016-04-21 14:33:594521 SendActivateStickyKeyPattern(ui::VKEY_COMMAND, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:134522 ui::DomKey::META);
dtapuskaaf863af2016-04-21 14:33:594523 SendActivateStickyKeyPattern(ui::VKEY_COMMAND, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:134524 ui::DomKey::META);
[email protected]354520b2014-06-21 04:31:014525
4526 EXPECT_TRUE(overlay_->is_visible());
Yeunjoo Choid5ec14b72021-08-11 00:57:224527 EXPECT_EQ(STICKY_KEY_STATE_ENABLED,
[email protected]354520b2014-06-21 04:31:014528 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
Yeunjoo Choid5ec14b72021-08-11 00:57:224529 EXPECT_EQ(STICKY_KEY_STATE_LOCKED,
[email protected]354520b2014-06-21 04:31:014530 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
Yeunjoo Choid5ec14b72021-08-11 00:57:224531 EXPECT_EQ(STICKY_KEY_STATE_ENABLED,
[email protected]354520b2014-06-21 04:31:014532 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
Yeunjoo Choid5ec14b72021-08-11 00:57:224533 EXPECT_EQ(STICKY_KEY_STATE_LOCKED,
tengs6a04ecf92014-10-09 19:56:114534 overlay_->GetModifierKeyState(ui::EF_COMMAND_DOWN));
[email protected]354520b2014-06-21 04:31:014535
4536 // Disable modifiers and overlay should be hidden.
kpschoedel8226fd152015-05-06 15:48:594537 SendActivateStickyKeyPattern(ui::VKEY_CONTROL, ui::DomCode::CONTROL_LEFT,
kpschoedel51d2e322015-08-28 15:29:354538 ui::DomKey::CONTROL);
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_SHIFT, ui::DomCode::SHIFT_LEFT,
kpschoedel51d2e322015-08-28 15:29:354542 ui::DomKey::SHIFT);
kpschoedel8226fd152015-05-06 15:48:594543 SendActivateStickyKeyPattern(ui::VKEY_LMENU, ui::DomCode::ALT_LEFT,
kpschoedel51d2e322015-08-28 15:29:354544 ui::DomKey::ALT);
kpschoedel8226fd152015-05-06 15:48:594545 SendActivateStickyKeyPattern(ui::VKEY_LMENU, ui::DomCode::ALT_LEFT,
kpschoedel51d2e322015-08-28 15:29:354546 ui::DomKey::ALT);
dtapuskaaf863af2016-04-21 14:33:594547 SendActivateStickyKeyPattern(ui::VKEY_COMMAND, ui::DomCode::META_LEFT,
kpschoedel0a8b03052016-02-17 15:35:134548 ui::DomKey::META);
[email protected]354520b2014-06-21 04:31:014549
4550 EXPECT_FALSE(overlay_->is_visible());
Yeunjoo Choid5ec14b72021-08-11 00:57:224551 EXPECT_EQ(STICKY_KEY_STATE_DISABLED,
[email protected]354520b2014-06-21 04:31:014552 overlay_->GetModifierKeyState(ui::EF_CONTROL_DOWN));
Yeunjoo Choid5ec14b72021-08-11 00:57:224553 EXPECT_EQ(STICKY_KEY_STATE_DISABLED,
[email protected]354520b2014-06-21 04:31:014554 overlay_->GetModifierKeyState(ui::EF_SHIFT_DOWN));
Yeunjoo Choid5ec14b72021-08-11 00:57:224555 EXPECT_EQ(STICKY_KEY_STATE_DISABLED,
[email protected]354520b2014-06-21 04:31:014556 overlay_->GetModifierKeyState(ui::EF_ALT_DOWN));
Yeunjoo Choid5ec14b72021-08-11 00:57:224557 EXPECT_EQ(STICKY_KEY_STATE_DISABLED,
tengs6a04ecf92014-10-09 19:56:114558 overlay_->GetModifierKeyState(ui::EF_COMMAND_DOWN));
[email protected]354520b2014-06-21 04:31:014559}
4560
4561TEST_F(StickyKeysOverlayTest, ModifierVisibility) {
4562 // All but AltGr and Mod3 should initially be visible.
4563 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_CONTROL_DOWN));
4564 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_SHIFT_DOWN));
4565 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_ALT_DOWN));
tengs6a04ecf92014-10-09 19:56:114566 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_COMMAND_DOWN));
[email protected]354520b2014-06-21 04:31:014567 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
4568 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));
4569
4570 // Turn all modifiers on.
4571 sticky_keys_controller_->SetModifiersEnabled(true, true);
4572 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_CONTROL_DOWN));
4573 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_SHIFT_DOWN));
4574 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_ALT_DOWN));
tengs6a04ecf92014-10-09 19:56:114575 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_COMMAND_DOWN));
[email protected]354520b2014-06-21 04:31:014576 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
4577 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));
4578
4579 // Turn off Mod3.
4580 sticky_keys_controller_->SetModifiersEnabled(false, true);
4581 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
4582 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));
4583
4584 // Turn off AltGr.
4585 sticky_keys_controller_->SetModifiersEnabled(true, false);
4586 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
4587 EXPECT_TRUE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));
4588
4589 // Turn off AltGr and Mod3.
4590 sticky_keys_controller_->SetModifiersEnabled(false, false);
4591 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_ALTGR_DOWN));
4592 EXPECT_FALSE(overlay_->GetModifierVisible(ui::EF_MOD3_DOWN));
[email protected]7f926752014-01-30 09:16:354593}
4594
Jimmy Gong57745db2021-04-15 04:05:544595class ExtensionRewriterInputTest : public EventRewriterAshTest,
4596 public ui::EventRewriterChromeOS::Delegate {
4597 public:
4598 ExtensionRewriterInputTest() = default;
4599 ExtensionRewriterInputTest(const ExtensionRewriterInputTest&) = delete;
4600 ExtensionRewriterInputTest& operator=(const ExtensionRewriterInputTest&) =
4601 delete;
4602 ~ExtensionRewriterInputTest() override {}
4603
4604 void SetUp() override {
4605 EventRewriterAshTest::SetUp();
Jimmy Gong82c82b42021-04-17 03:12:334606 event_rewriter_chromeos_ = std::make_unique<ui::EventRewriterChromeOS>(
4607 this, nullptr, false, &fake_ime_keyboard_);
Jimmy Gong57745db2021-04-15 04:05:544608 }
4609
4610 void SetModifierRemapping(const std::string& pref_name,
4611 ui::chromeos::ModifierKey value) {
4612 modifier_remapping_[pref_name] = static_cast<int>(value);
4613 }
4614
4615 void RegisterExtensionShortcut(ui::KeyboardCode key_code, int flags) {
4616 constexpr int kModifierMasks = ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN |
4617 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN;
4618 // No other masks should be present aside from the ones speicifed in
4619 // kModifierMasks.
4620 DCHECK((flags & kModifierMasks) == flags);
4621 registered_extension_shortcuts_.emplace(key_code, flags);
4622 }
4623
4624 void RemoveAllExtensionShortcuts() {
4625 registered_extension_shortcuts_.clear();
4626 }
4627
4628 void ExpectEventRewrittenTo(const KeyTestCase& test) {
4629 CheckKeyTestCase(event_rewriter_chromeos_.get(), test);
4630 }
4631
4632 protected:
4633 sync_preferences::TestingPrefServiceSyncable prefs_;
Jimmy Gong82c82b42021-04-17 03:12:334634 chromeos::input_method::FakeImeKeyboard fake_ime_keyboard_;
Jimmy Gong57745db2021-04-15 04:05:544635 std::unique_ptr<ui::EventRewriterChromeOS> event_rewriter_chromeos_;
4636
4637 private:
4638 // ui::EventRewriterChromeOS::Delegate:
4639 bool RewriteModifierKeys() override { return true; }
4640
4641 bool GetKeyboardRemappedPrefValue(const std::string& pref_name,
4642 int* value) const override {
4643 auto it = modifier_remapping_.find(pref_name);
4644 if (it == modifier_remapping_.end()) {
4645 return false;
4646 }
4647
4648 *value = it->second;
4649 return true;
4650 }
4651
4652 bool TopRowKeysAreFunctionKeys() const override { return false; }
4653
4654 bool IsExtensionCommandRegistered(ui::KeyboardCode key_code,
4655 int flags) const override {
4656 return base::Contains(registered_extension_shortcuts_,
4657 ui::Accelerator(key_code, flags));
4658 }
4659
4660 bool IsSearchKeyAcceleratorReserved() const override { return false; }
4661 bool NotifyDeprecatedRightClickRewrite() override { return false; }
4662 bool NotifyDeprecatedFKeyRewrite() override { return false; }
Zentaro Kavanagh7e8735052021-05-07 21:27:244663 bool NotifyDeprecatedSixPackKeyRewrite(ui::KeyboardCode key_code) override {
Jimmy Gong57745db2021-04-15 04:05:544664 return false;
4665 }
4666
4667 std::map<std::string, int> modifier_remapping_;
4668 base::flat_set<ui::Accelerator> registered_extension_shortcuts_;
4669};
4670
4671TEST_F(ExtensionRewriterInputTest, RewrittenModifier) {
4672 // Register Control + B as an extension shortcut.
4673 RegisterExtensionShortcut(ui::VKEY_B, ui::EF_CONTROL_DOWN);
4674
4675 // Check that standard extension input has no rewritten modifiers.
4676 ExpectEventRewrittenTo({ui::ET_KEY_PRESSED,
4677 {ui::VKEY_B, ui::DomCode::US_B, ui::EF_CONTROL_DOWN,
4678 ui::DomKey::Constant<'b'>::Character},
4679 {ui::VKEY_B, ui::DomCode::US_B, ui::EF_CONTROL_DOWN,
4680 ui::DomKey::Constant<'b'>::Character}});
4681
4682 // Remap Control -> Alt.
4683 SetModifierRemapping(prefs::kLanguageRemapControlKeyTo,
4684 ui::chromeos::ModifierKey::kAltKey);
4685 // Pressing Control + B should now be remapped to Alt + B.
4686 ExpectEventRewrittenTo({ui::ET_KEY_PRESSED,
4687 {ui::VKEY_B, ui::DomCode::US_B, ui::EF_CONTROL_DOWN,
4688 ui::DomKey::Constant<'b'>::Character},
4689 {ui::VKEY_B, ui::DomCode::US_B, ui::EF_ALT_DOWN,
4690 ui::DomKey::Constant<'b'>::Character}});
4691
4692 // Remap Alt -> Control.
4693 SetModifierRemapping(prefs::kLanguageRemapAltKeyTo,
4694 ui::chromeos::ModifierKey::kControlKey);
4695 // Pressing Alt + B should now be remapped to Control + B.
4696 ExpectEventRewrittenTo({ui::ET_KEY_PRESSED,
4697 {ui::VKEY_B, ui::DomCode::US_B, ui::EF_ALT_DOWN,
4698 ui::DomKey::Constant<'b'>::Character},
4699 {ui::VKEY_B, ui::DomCode::US_B, ui::EF_CONTROL_DOWN,
4700 ui::DomKey::Constant<'b'>::Character}});
4701
4702 // Remove all extension shortcuts and still expect the remapping to work.
4703 RemoveAllExtensionShortcuts();
4704
4705 ExpectEventRewrittenTo({ui::ET_KEY_PRESSED,
4706 {ui::VKEY_B, ui::DomCode::US_B, ui::EF_CONTROL_DOWN,
4707 ui::DomKey::Constant<'b'>::Character},
4708 {ui::VKEY_B, ui::DomCode::US_B, ui::EF_ALT_DOWN,
4709 ui::DomKey::Constant<'b'>::Character}});
4710 ExpectEventRewrittenTo({ui::ET_KEY_PRESSED,
4711 {ui::VKEY_B, ui::DomCode::US_B, ui::EF_ALT_DOWN,
4712 ui::DomKey::Constant<'b'>::Character},
4713 {ui::VKEY_B, ui::DomCode::US_B, ui::EF_CONTROL_DOWN,
4714 ui::DomKey::Constant<'b'>::Character}});
4715}
4716
4717TEST_F(ExtensionRewriterInputTest, RewriteNumpadExtensionCommand) {
4718 // Register Control + NUMPAD1 as an extension shortcut.
4719 RegisterExtensionShortcut(ui::VKEY_NUMPAD1, ui::EF_CONTROL_DOWN);
4720 // Check that extension shortcuts that involve numpads keys are properly
4721 // rewritten. Note that VKEY_END is associated with NUMPAD1 if Num Lock is
4722 // disabled. The result should be "NumPad 1 with Control".
4723 ExpectEventRewrittenTo(
4724 {ui::ET_KEY_PRESSED,
4725 {ui::VKEY_END, ui::DomCode::NUMPAD1, ui::EF_CONTROL_DOWN,
4726 ui::DomKey::END},
4727 {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_CONTROL_DOWN,
4728 ui::DomKey::Constant<'1'>::Character}});
4729
4730 // Remove the extension shortcut and expect the numpad event to still be
4731 // rewritten.
4732 RemoveAllExtensionShortcuts();
4733 ExpectEventRewrittenTo(
4734 {ui::ET_KEY_PRESSED,
4735 {ui::VKEY_END, ui::DomCode::NUMPAD1, ui::EF_CONTROL_DOWN,
4736 ui::DomKey::END},
4737 {ui::VKEY_NUMPAD1, ui::DomCode::NUMPAD1, ui::EF_CONTROL_DOWN,
4738 ui::DomKey::Constant<'1'>::Character}});
4739}
4740
Yeunjoo Choid5ec14b72021-08-11 00:57:224741} // namespace ash