10 #include "flutter/shell/platform/embedder/embedder.h"
11 #include "flutter/shell/platform/embedder/test_utils/key_codes.g.h"
12 #include "flutter/shell/platform/embedder/test_utils/proc_table_replacement.h"
14 #include "flutter/shell/platform/windows/testing/engine_modifier.h"
15 #include "gtest/gtest.h"
22 constexpr SHORT kStateMaskToggled = 0x01;
23 constexpr SHORT kStateMaskPressed = 0x80;
25 class TestFlutterKeyEvent :
public FlutterKeyEvent {
27 TestFlutterKeyEvent(
const FlutterKeyEvent& src,
31 struct_size = src.struct_size;
32 timestamp = src.timestamp;
34 physical = src.physical;
35 logical = src.logical;
37 synthesized = src.synthesized;
40 TestFlutterKeyEvent(TestFlutterKeyEvent&& source)
41 : FlutterKeyEvent(source),
51 const std::string character_str;
57 state_[virtual_key] = (
pressed ? kStateMaskPressed : 0) |
61 SHORT Get(
int virtual_key) {
return state_[virtual_key]; }
64 return [
this](
int virtual_key) {
return Get(virtual_key); };
68 std::map<int, SHORT> state_;
71 UINT DefaultMapVkToScan(UINT virtual_key,
bool extended) {
72 return MapVirtualKey(virtual_key,
73 extended ? MAPVK_VK_TO_VSC_EX : MAPVK_VK_TO_VSC);
77 constexpr uint64_t kScanCodeAltLeft = 0x38;
78 constexpr uint64_t kScanCodeNumpad1 = 0x4f;
79 constexpr uint64_t kScanCodeNumLock = 0x45;
80 constexpr uint64_t kScanCodeControl = 0x1d;
88 using namespace ::flutter::testing::keycodes;
94 EXPECT_EQ(result.length(), 1);
95 EXPECT_EQ(result[0],
'\x24');
98 EXPECT_EQ(result.length(), 2);
99 EXPECT_EQ(result[0],
'\xC2');
100 EXPECT_EQ(result[1],
'\xA2');
103 EXPECT_EQ(result.length(), 3);
104 EXPECT_EQ(result[0],
'\xE0');
105 EXPECT_EQ(result[1],
'\xA4');
106 EXPECT_EQ(result[2],
'\xB9');
109 EXPECT_EQ(result.length(), 4);
110 EXPECT_EQ(result[0],
'\xF0');
111 EXPECT_EQ(result[1],
'\x90');
112 EXPECT_EQ(result[2],
'\x8D');
113 EXPECT_EQ(result[3],
'\x88');
119 TEST(KeyboardKeyEmbedderHandlerTest, BasicKeyPressingAndHolding) {
120 TestKeystate key_state;
121 std::vector<TestFlutterKeyEvent> results;
122 TestFlutterKeyEvent* event;
123 bool last_handled =
false;
125 std::unique_ptr<KeyboardKeyEmbedderHandler> handler =
126 std::make_unique<KeyboardKeyEmbedderHandler>(
127 [&results](
const FlutterKeyEvent& event,
131 key_state.Getter(), DefaultMapVkToScan);
134 handler->KeyboardHook(
136 [&last_handled](
bool handled) { last_handled = handled; });
137 EXPECT_EQ(last_handled,
false);
138 EXPECT_EQ(results.size(), 1);
140 EXPECT_EQ(event->type, kFlutterKeyEventTypeDown);
141 EXPECT_EQ(event->physical, kPhysicalKeyA);
142 EXPECT_EQ(event->logical, kLogicalKeyA);
143 EXPECT_STREQ(event->character,
"a");
144 EXPECT_EQ(event->synthesized,
false);
146 event->callback(
true, event->user_data);
147 EXPECT_EQ(last_handled,
true);
152 handler->KeyboardHook(
154 [&last_handled](
bool handled) { last_handled = handled; });
155 EXPECT_EQ(last_handled,
true);
156 EXPECT_EQ(results.size(), 1);
158 EXPECT_EQ(event->type, kFlutterKeyEventTypeRepeat);
159 EXPECT_EQ(event->physical, kPhysicalKeyA);
160 EXPECT_EQ(event->logical, kLogicalKeyA);
161 EXPECT_STREQ(event->character,
"a");
162 EXPECT_EQ(event->synthesized,
false);
164 event->callback(
false, event->user_data);
165 EXPECT_EQ(last_handled,
false);
169 handler->KeyboardHook(
171 [&last_handled](
bool handled) { last_handled = handled; });
172 EXPECT_EQ(results.size(), 1);
174 EXPECT_EQ(event->type, kFlutterKeyEventTypeUp);
175 EXPECT_EQ(event->physical, kPhysicalKeyA);
176 EXPECT_EQ(event->logical, kLogicalKeyA);
177 EXPECT_STREQ(event->character,
"");
178 EXPECT_EQ(event->synthesized,
false);
179 event->callback(
false, event->user_data);
187 TEST(KeyboardKeyEmbedderHandlerTest, ToggleNumLockDuringNumpadPress) {
188 TestKeystate key_state;
189 std::vector<TestFlutterKeyEvent> results;
190 TestFlutterKeyEvent* event;
191 bool last_handled =
false;
193 std::unique_ptr<KeyboardKeyEmbedderHandler> handler =
194 std::make_unique<KeyboardKeyEmbedderHandler>(
195 [&results](
const FlutterKeyEvent& event,
199 key_state.Getter(), DefaultMapVkToScan);
202 key_state.Set(VK_NUMPAD1,
true);
203 handler->KeyboardHook(
204 VK_NUMPAD1, kScanCodeNumpad1, WM_KEYDOWN, 0,
false,
false,
205 [&last_handled](
bool handled) { last_handled = handled; });
206 EXPECT_EQ(results.size(), 1);
208 EXPECT_EQ(event->type, kFlutterKeyEventTypeDown);
209 EXPECT_EQ(event->physical, kPhysicalNumpad1);
210 EXPECT_EQ(event->logical, kLogicalNumpad1);
212 EXPECT_EQ(event->synthesized,
false);
216 key_state.Set(VK_NUMLOCK,
true,
true);
217 handler->KeyboardHook(
218 VK_NUMLOCK, kScanCodeNumLock, WM_KEYDOWN, 0,
true,
false,
219 [&last_handled](
bool handled) { last_handled = handled; });
220 EXPECT_EQ(results.size(), 1);
222 EXPECT_EQ(event->type, kFlutterKeyEventTypeDown);
223 EXPECT_EQ(event->physical, kPhysicalNumLock);
224 EXPECT_EQ(event->logical, kLogicalNumLock);
225 EXPECT_STREQ(event->character,
"");
226 EXPECT_EQ(event->synthesized,
false);
230 key_state.Set(VK_NUMLOCK,
false,
true);
231 handler->KeyboardHook(
232 VK_NUMLOCK, kScanCodeNumLock, WM_KEYUP, 0,
true,
true,
233 [&last_handled](
bool handled) { last_handled = handled; });
234 EXPECT_EQ(results.size(), 1);
236 EXPECT_EQ(event->type, kFlutterKeyEventTypeUp);
237 EXPECT_EQ(event->physical, kPhysicalNumLock);
238 EXPECT_EQ(event->logical, kLogicalNumLock);
239 EXPECT_STREQ(event->character,
"");
240 EXPECT_EQ(event->synthesized,
false);
244 handler->KeyboardHook(
245 VK_END, kScanCodeNumpad1, WM_KEYUP, 0,
false,
true,
246 [&last_handled](
bool handled) { last_handled = handled; });
247 EXPECT_EQ(results.size(), 1);
249 EXPECT_EQ(event->type, kFlutterKeyEventTypeUp);
250 EXPECT_EQ(event->physical, kPhysicalNumpad1);
251 EXPECT_EQ(event->logical, kLogicalNumpad1);
252 EXPECT_STREQ(event->character,
"");
253 EXPECT_EQ(event->synthesized,
false);
259 TEST(KeyboardKeyEmbedderHandlerTest, ImeEventsAreIgnored) {
260 TestKeystate key_state;
261 std::vector<TestFlutterKeyEvent> results;
262 TestFlutterKeyEvent* event;
263 bool last_handled =
false;
265 std::unique_ptr<KeyboardKeyEmbedderHandler> handler =
266 std::make_unique<KeyboardKeyEmbedderHandler>(
267 [&results](
const FlutterKeyEvent& event,
271 key_state.Getter(), DefaultMapVkToScan);
274 last_handled =
false;
275 handler->KeyboardHook(
277 [&last_handled](
bool handled) { last_handled = handled; });
278 EXPECT_EQ(last_handled,
true);
281 EXPECT_EQ(results.size(), 1);
283 EXPECT_EQ(event->physical, 0);
284 EXPECT_EQ(event->logical, 0);
285 EXPECT_EQ(event->callback,
nullptr);
289 last_handled =
false;
290 handler->KeyboardHook(
293 [&last_handled](
bool handled) { last_handled = handled; });
294 EXPECT_EQ(last_handled,
true);
297 EXPECT_EQ(results.size(), 1);
299 EXPECT_EQ(event->physical, 0);
300 EXPECT_EQ(event->logical, 0);
301 EXPECT_EQ(event->callback,
nullptr);
306 last_handled =
false;
307 handler->KeyboardHook(
309 [&last_handled](
bool handled) { last_handled = handled; });
311 EXPECT_EQ(last_handled,
false);
312 EXPECT_EQ(results.size(), 1);
314 event->callback(
true, event->user_data);
315 EXPECT_EQ(last_handled,
true);
318 last_handled =
false;
320 handler->KeyboardHook(
322 [&last_handled](
bool handled) { last_handled = handled; });
323 EXPECT_EQ(last_handled,
false);
324 EXPECT_EQ(results.size(), 1);
326 event->callback(
true, event->user_data);
327 EXPECT_EQ(last_handled,
true);
333 TEST(KeyboardKeyEmbedderHandlerTest, ModifierKeysByExtendedBit) {
334 TestKeystate key_state;
335 std::vector<TestFlutterKeyEvent> results;
336 TestFlutterKeyEvent* event;
337 bool last_handled =
false;
339 std::unique_ptr<KeyboardKeyEmbedderHandler> handler =
340 std::make_unique<KeyboardKeyEmbedderHandler>(
341 [&results](
const FlutterKeyEvent& event,
345 key_state.Getter(), DefaultMapVkToScan);
348 last_handled =
false;
349 key_state.Set(VK_LCONTROL,
true);
350 handler->KeyboardHook(
351 VK_LCONTROL, kScanCodeControl, WM_KEYDOWN, 0,
false,
false,
352 [&last_handled](
bool handled) { last_handled = handled; });
353 EXPECT_EQ(last_handled,
false);
354 EXPECT_EQ(results.size(), 1);
356 EXPECT_EQ(event->type, kFlutterKeyEventTypeDown);
357 EXPECT_EQ(event->physical, kPhysicalControlLeft);
358 EXPECT_EQ(event->logical, kLogicalControlLeft);
359 EXPECT_STREQ(event->character,
"");
360 EXPECT_EQ(event->synthesized,
false);
362 event->callback(
true, event->user_data);
363 EXPECT_EQ(last_handled,
true);
367 last_handled =
false;
368 key_state.Set(VK_RCONTROL,
true);
369 handler->KeyboardHook(
370 VK_RCONTROL, kScanCodeControl, WM_KEYDOWN, 0,
true,
true,
371 [&last_handled](
bool handled) { last_handled = handled; });
372 EXPECT_EQ(last_handled,
false);
373 EXPECT_EQ(results.size(), 1);
375 EXPECT_EQ(event->type, kFlutterKeyEventTypeDown);
376 EXPECT_EQ(event->physical, kPhysicalControlRight);
377 EXPECT_EQ(event->logical, kLogicalControlRight);
378 EXPECT_STREQ(event->character,
"");
379 EXPECT_EQ(event->synthesized,
false);
381 event->callback(
true, event->user_data);
382 EXPECT_EQ(last_handled,
true);
386 last_handled =
false;
387 key_state.Set(VK_LCONTROL,
false);
388 handler->KeyboardHook(
389 VK_LCONTROL, kScanCodeControl, WM_KEYUP, 0,
false,
true,
390 [&last_handled](
bool handled) { last_handled = handled; });
391 EXPECT_EQ(last_handled,
false);
392 EXPECT_EQ(results.size(), 1);
394 EXPECT_EQ(event->type, kFlutterKeyEventTypeUp);
395 EXPECT_EQ(event->physical, kPhysicalControlLeft);
396 EXPECT_EQ(event->logical, kLogicalControlLeft);
397 EXPECT_STREQ(event->character,
"");
398 EXPECT_EQ(event->synthesized,
false);
400 event->callback(
true, event->user_data);
401 EXPECT_EQ(last_handled,
true);
405 last_handled =
false;
406 key_state.Set(VK_RCONTROL,
false);
407 handler->KeyboardHook(
408 VK_RCONTROL, kScanCodeControl, WM_KEYUP, 0,
true,
true,
409 [&last_handled](
bool handled) { last_handled = handled; });
410 EXPECT_EQ(last_handled,
false);
411 EXPECT_EQ(results.size(), 1);
413 EXPECT_EQ(event->type, kFlutterKeyEventTypeUp);
414 EXPECT_EQ(event->physical, kPhysicalControlRight);
415 EXPECT_EQ(event->logical, kLogicalControlRight);
416 EXPECT_STREQ(event->character,
"");
417 EXPECT_EQ(event->synthesized,
false);
419 event->callback(
true, event->user_data);
420 EXPECT_EQ(last_handled,
true);
426 TEST(KeyboardKeyEmbedderHandlerTest, ModifierKeysByVirtualKey) {
427 TestKeystate key_state;
428 std::vector<TestFlutterKeyEvent> results;
429 TestFlutterKeyEvent* event;
430 bool last_handled =
false;
432 std::unique_ptr<KeyboardKeyEmbedderHandler> handler =
433 std::make_unique<KeyboardKeyEmbedderHandler>(
434 [&results](
const FlutterKeyEvent& event,
438 key_state.Getter(), DefaultMapVkToScan);
441 last_handled =
false;
442 key_state.Set(VK_LSHIFT,
true);
443 handler->KeyboardHook(
445 [&last_handled](
bool handled) { last_handled = handled; });
446 EXPECT_EQ(last_handled,
false);
447 EXPECT_EQ(results.size(), 1);
449 EXPECT_EQ(event->type, kFlutterKeyEventTypeDown);
450 EXPECT_EQ(event->physical, kPhysicalShiftLeft);
451 EXPECT_EQ(event->logical, kLogicalShiftLeft);
452 EXPECT_STREQ(event->character,
"");
453 EXPECT_EQ(event->synthesized,
false);
455 event->callback(
true, event->user_data);
456 EXPECT_EQ(last_handled,
true);
460 last_handled =
false;
461 key_state.Set(VK_RSHIFT,
true);
462 handler->KeyboardHook(
464 [&last_handled](
bool handled) { last_handled = handled; });
465 EXPECT_EQ(last_handled,
false);
466 EXPECT_EQ(results.size(), 1);
468 EXPECT_EQ(event->type, kFlutterKeyEventTypeDown);
469 EXPECT_EQ(event->physical, kPhysicalShiftRight);
470 EXPECT_EQ(event->logical, kLogicalShiftRight);
471 EXPECT_STREQ(event->character,
"");
472 EXPECT_EQ(event->synthesized,
false);
474 event->callback(
true, event->user_data);
475 EXPECT_EQ(last_handled,
true);
479 last_handled =
false;
480 key_state.Set(VK_LSHIFT,
false);
481 handler->KeyboardHook(
483 [&last_handled](
bool handled) { last_handled = handled; });
484 EXPECT_EQ(last_handled,
false);
485 EXPECT_EQ(results.size(), 1);
487 EXPECT_EQ(event->type, kFlutterKeyEventTypeUp);
488 EXPECT_EQ(event->physical, kPhysicalShiftLeft);
489 EXPECT_EQ(event->logical, kLogicalShiftLeft);
490 EXPECT_STREQ(event->character,
"");
491 EXPECT_EQ(event->synthesized,
false);
493 event->callback(
true, event->user_data);
494 EXPECT_EQ(last_handled,
true);
498 last_handled =
false;
499 key_state.Set(VK_RSHIFT,
false);
500 handler->KeyboardHook(
502 [&last_handled](
bool handled) { last_handled = handled; });
503 EXPECT_EQ(last_handled,
false);
504 EXPECT_EQ(results.size(), 1);
506 EXPECT_EQ(event->type, kFlutterKeyEventTypeUp);
507 EXPECT_EQ(event->physical, kPhysicalShiftRight);
508 EXPECT_EQ(event->logical, kLogicalShiftRight);
509 EXPECT_STREQ(event->character,
"");
510 EXPECT_EQ(event->synthesized,
false);
512 event->callback(
true, event->user_data);
513 EXPECT_EQ(last_handled,
true);
519 TEST(KeyboardKeyEmbedderHandlerTest,
520 SynthesizeModifierLeftKeyDownWhenNotPressed) {
521 TestKeystate key_state;
522 std::vector<TestFlutterKeyEvent> results;
523 TestFlutterKeyEvent* event;
524 bool last_handled =
false;
526 std::unique_ptr<KeyboardKeyEmbedderHandler> handler =
527 std::make_unique<KeyboardKeyEmbedderHandler>(
528 [&results](
const FlutterKeyEvent& event,
532 key_state.Getter(), DefaultMapVkToScan);
535 handler->SyncModifiersIfNeeded(
kShift);
536 EXPECT_EQ(results.size(), 1);
538 EXPECT_EQ(event->type, kFlutterKeyEventTypeDown);
539 EXPECT_EQ(event->physical, kPhysicalShiftLeft);
540 EXPECT_EQ(event->logical, kLogicalShiftLeft);
541 EXPECT_STREQ(event->character,
"");
542 EXPECT_EQ(event->synthesized,
true);
546 handler->SyncModifiersIfNeeded(0);
550 handler->SyncModifiersIfNeeded(
kControl);
551 EXPECT_EQ(results.size(), 1);
553 EXPECT_EQ(event->type, kFlutterKeyEventTypeDown);
554 EXPECT_EQ(event->physical, kPhysicalControlLeft);
555 EXPECT_EQ(event->logical, kLogicalControlLeft);
556 EXPECT_STREQ(event->character,
"");
557 EXPECT_EQ(event->synthesized,
true);
562 TEST(KeyboardKeyEmbedderHandlerTest, DoNotSynthesizeModifierDownWhenPressed) {
563 TestKeystate key_state;
564 std::vector<TestFlutterKeyEvent> results;
565 TestFlutterKeyEvent* event;
566 bool last_handled =
false;
568 std::unique_ptr<KeyboardKeyEmbedderHandler> handler =
569 std::make_unique<KeyboardKeyEmbedderHandler>(
570 [&results](
const FlutterKeyEvent& event,
574 key_state.Getter(), DefaultMapVkToScan);
578 handler->KeyboardHook(
580 [&last_handled](
bool handled) { last_handled = handled; });
582 handler->SyncModifiersIfNeeded(
kShift);
583 EXPECT_EQ(results.size(), 0);
587 handler->KeyboardHook(
589 [&last_handled](
bool handled) { last_handled = handled; });
591 handler->SyncModifiersIfNeeded(
kShift);
592 EXPECT_EQ(results.size(), 0);
596 handler->KeyboardHook(
598 [&last_handled](
bool handled) { last_handled = handled; });
600 handler->SyncModifiersIfNeeded(
kControl);
601 EXPECT_EQ(results.size(), 0);
605 handler->KeyboardHook(
607 [&last_handled](
bool handled) { last_handled = handled; });
609 handler->SyncModifiersIfNeeded(
kControl);
610 EXPECT_EQ(results.size(), 0);
615 TEST(KeyboardKeyEmbedderHandlerTest, SynthesizeModifierUpWhenPressed) {
616 TestKeystate key_state;
617 std::vector<TestFlutterKeyEvent> results;
618 TestFlutterKeyEvent* event;
619 bool last_handled =
false;
621 std::unique_ptr<KeyboardKeyEmbedderHandler> handler =
622 std::make_unique<KeyboardKeyEmbedderHandler>(
623 [&results](
const FlutterKeyEvent& event,
627 key_state.Getter(), DefaultMapVkToScan);
631 handler->KeyboardHook(
633 [&last_handled](
bool handled) { last_handled = handled; });
635 handler->SyncModifiersIfNeeded(0);
636 EXPECT_EQ(results.size(), 1);
638 EXPECT_EQ(event->type, kFlutterKeyEventTypeUp);
639 EXPECT_EQ(event->physical, kPhysicalShiftLeft);
640 EXPECT_EQ(event->logical, kLogicalShiftLeft);
641 EXPECT_STREQ(event->character,
"");
642 EXPECT_EQ(event->synthesized,
true);
647 handler->KeyboardHook(
649 [&last_handled](
bool handled) { last_handled = handled; });
651 handler->SyncModifiersIfNeeded(0);
652 EXPECT_EQ(results.size(), 1);
654 EXPECT_EQ(event->type, kFlutterKeyEventTypeUp);
655 EXPECT_EQ(event->physical, kPhysicalShiftRight);
656 EXPECT_EQ(event->logical, kLogicalShiftRight);
657 EXPECT_STREQ(event->character,
"");
658 EXPECT_EQ(event->synthesized,
true);
663 handler->KeyboardHook(
665 [&last_handled](
bool handled) { last_handled = handled; });
667 handler->SyncModifiersIfNeeded(0);
668 EXPECT_EQ(results.size(), 1);
670 EXPECT_EQ(event->type, kFlutterKeyEventTypeUp);
671 EXPECT_EQ(event->physical, kPhysicalControlLeft);
672 EXPECT_EQ(event->logical, kLogicalControlLeft);
673 EXPECT_STREQ(event->character,
"");
674 EXPECT_EQ(event->synthesized,
true);
679 handler->KeyboardHook(
681 [&last_handled](
bool handled) { last_handled = handled; });
683 handler->SyncModifiersIfNeeded(0);
684 EXPECT_EQ(results.size(), 1);
686 EXPECT_EQ(event->type, kFlutterKeyEventTypeUp);
687 EXPECT_EQ(event->physical, kPhysicalControlRight);
688 EXPECT_EQ(event->logical, kLogicalControlRight);
689 EXPECT_STREQ(event->character,
"");
690 EXPECT_EQ(event->synthesized,
true);
696 TEST(KeyboardKeyEmbedderHandlerTest, DoNotSynthesizeModifierUpWhenNotPressed) {
697 TestKeystate key_state;
698 std::vector<TestFlutterKeyEvent> results;
699 TestFlutterKeyEvent* event;
700 bool last_handled =
false;
702 std::unique_ptr<KeyboardKeyEmbedderHandler> handler =
703 std::make_unique<KeyboardKeyEmbedderHandler>(
704 [&results](
const FlutterKeyEvent& event,
708 key_state.Getter(), DefaultMapVkToScan);
712 handler->SyncModifiersIfNeeded(0);
713 EXPECT_EQ(results.size(), 0);
716 TEST(KeyboardKeyEmbedderHandlerTest, RepeatedDownIsIgnored) {
717 TestKeystate key_state;
718 std::vector<TestFlutterKeyEvent> results;
719 TestFlutterKeyEvent* event;
720 bool last_handled =
false;
722 std::unique_ptr<KeyboardKeyEmbedderHandler> handler =
723 std::make_unique<KeyboardKeyEmbedderHandler>(
724 [&results](
const FlutterKeyEvent& event,
728 key_state.Getter(), DefaultMapVkToScan);
729 last_handled =
false;
732 handler->KeyboardHook(
734 [&last_handled](
bool handled) { last_handled = handled; });
735 EXPECT_EQ(last_handled,
false);
736 EXPECT_EQ(results.size(), 1);
738 EXPECT_EQ(event->type, kFlutterKeyEventTypeDown);
739 EXPECT_EQ(event->physical, kPhysicalKeyA);
740 EXPECT_EQ(event->logical, kLogicalKeyA);
741 EXPECT_STREQ(event->character,
"a");
742 EXPECT_EQ(event->synthesized,
false);
744 event->callback(
true, event->user_data);
745 EXPECT_EQ(last_handled,
true);
751 last_handled =
false;
752 handler->KeyboardHook(
754 [&last_handled](
bool handled) { last_handled = handled; });
755 EXPECT_EQ(last_handled,
false);
756 ASSERT_EQ(results.size(), 2u);
759 EXPECT_EQ(event->type, kFlutterKeyEventTypeUp);
760 EXPECT_EQ(event->physical, kPhysicalKeyA);
761 EXPECT_EQ(event->logical, kLogicalKeyA);
762 EXPECT_STREQ(event->character,
"");
763 EXPECT_EQ(event->synthesized,
true);
764 EXPECT_EQ(event->callback,
nullptr);
767 EXPECT_EQ(event->type, kFlutterKeyEventTypeDown);
768 EXPECT_EQ(event->physical, kPhysicalKeyA);
769 EXPECT_EQ(event->logical, kLogicalKeyA);
770 EXPECT_STREQ(event->character,
"a");
771 EXPECT_EQ(event->synthesized,
false);
772 event->callback(
true, event->user_data);
773 EXPECT_EQ(last_handled,
true);
777 TEST(KeyboardKeyEmbedderHandlerTest, AbruptRepeatIsConvertedToDown) {
778 TestKeystate key_state;
779 std::vector<TestFlutterKeyEvent> results;
780 TestFlutterKeyEvent* event;
781 bool last_handled =
false;
783 std::unique_ptr<KeyboardKeyEmbedderHandler> handler =
784 std::make_unique<KeyboardKeyEmbedderHandler>(
785 [&results](
const FlutterKeyEvent& event,
789 key_state.Getter(), DefaultMapVkToScan);
790 last_handled =
false;
795 handler->KeyboardHook(
797 [&last_handled](
bool handled) { last_handled = handled; });
798 EXPECT_EQ(last_handled,
false);
799 EXPECT_EQ(results.size(), 1);
801 EXPECT_EQ(event->type, kFlutterKeyEventTypeDown);
802 EXPECT_EQ(event->physical, kPhysicalKeyA);
803 EXPECT_EQ(event->logical, kLogicalKeyA);
804 EXPECT_STREQ(event->character,
"a");
805 EXPECT_EQ(event->synthesized,
false);
807 event->callback(
true, event->user_data);
808 EXPECT_EQ(last_handled,
true);
812 last_handled =
false;
814 handler->KeyboardHook(
816 [&last_handled](
bool handled) { last_handled = handled; });
817 EXPECT_EQ(last_handled,
false);
818 EXPECT_EQ(results.size(), 1);
820 EXPECT_EQ(event->type, kFlutterKeyEventTypeUp);
821 EXPECT_EQ(event->physical, kPhysicalKeyA);
822 EXPECT_EQ(event->logical, kLogicalKeyA);
823 EXPECT_STREQ(event->character,
"");
824 EXPECT_EQ(event->synthesized,
false);
826 event->callback(
true, event->user_data);
827 EXPECT_EQ(last_handled,
true);
831 TEST(KeyboardKeyEmbedderHandlerTest, AbruptUpIsIgnored) {
832 TestKeystate key_state;
833 std::vector<TestFlutterKeyEvent> results;
834 TestFlutterKeyEvent* event;
835 bool last_handled =
false;
837 std::unique_ptr<KeyboardKeyEmbedderHandler> handler =
838 std::make_unique<KeyboardKeyEmbedderHandler>(
839 [&results](
const FlutterKeyEvent& event,
843 key_state.Getter(), DefaultMapVkToScan);
844 last_handled =
false;
851 last_handled =
false;
852 handler->KeyboardHook(
854 [&last_handled](
bool handled) { last_handled = handled; });
855 EXPECT_EQ(last_handled,
true);
856 EXPECT_EQ(results.size(), 1);
858 EXPECT_EQ(event->physical, 0);
859 EXPECT_EQ(event->logical, 0);
860 EXPECT_EQ(event->callback,
nullptr);
864 TEST(KeyboardKeyEmbedderHandlerTest, SynthesizeForDesyncPressingState) {
865 TestKeystate key_state;
866 std::vector<TestFlutterKeyEvent> results;
867 TestFlutterKeyEvent* event;
868 bool last_handled =
false;
870 std::unique_ptr<KeyboardKeyEmbedderHandler> handler =
871 std::make_unique<KeyboardKeyEmbedderHandler>(
872 [&results](
const FlutterKeyEvent& event,
876 key_state.Getter(), DefaultMapVkToScan);
879 key_state.Set(VK_LCONTROL,
true);
883 handler->KeyboardHook(
885 [&last_handled](
bool handled) { last_handled = handled; });
886 EXPECT_EQ(last_handled,
false);
887 EXPECT_EQ(results.size(), 2);
889 EXPECT_EQ(event->type, kFlutterKeyEventTypeDown);
890 EXPECT_EQ(event->physical, kPhysicalControlLeft);
891 EXPECT_EQ(event->logical, kLogicalControlLeft);
892 EXPECT_STREQ(event->character,
"");
893 EXPECT_EQ(event->synthesized,
true);
894 EXPECT_EQ(event->callback,
nullptr);
897 EXPECT_EQ(event->type, kFlutterKeyEventTypeDown);
898 EXPECT_EQ(event->physical, kPhysicalKeyA);
899 EXPECT_EQ(event->logical, kLogicalKeyA);
900 EXPECT_STREQ(event->character,
"a");
901 EXPECT_EQ(event->synthesized,
false);
904 event->callback(
false, event->user_data);
905 EXPECT_EQ(last_handled,
false);
909 key_state.Set(VK_LCONTROL,
false);
912 handler->KeyboardHook(
914 [&last_handled](
bool handled) { last_handled = handled; });
915 EXPECT_EQ(last_handled,
false);
916 EXPECT_EQ(results.size(), 2);
918 EXPECT_EQ(event->type, kFlutterKeyEventTypeUp);
919 EXPECT_EQ(event->physical, kPhysicalControlLeft);
920 EXPECT_EQ(event->logical, kLogicalControlLeft);
921 EXPECT_STREQ(event->character,
"");
922 EXPECT_EQ(event->synthesized,
true);
923 EXPECT_EQ(event->callback,
nullptr);
926 EXPECT_EQ(event->type, kFlutterKeyEventTypeRepeat);
927 EXPECT_EQ(event->physical, kPhysicalKeyA);
928 EXPECT_EQ(event->logical, kLogicalKeyA);
929 EXPECT_STREQ(event->character,
"a");
930 EXPECT_EQ(event->synthesized,
false);
933 event->callback(
false, event->user_data);
934 EXPECT_EQ(last_handled,
false);
939 handler->KeyboardHook(
941 [&last_handled](
bool handled) { last_handled = handled; });
942 EXPECT_EQ(results.size(), 1);
944 EXPECT_EQ(event->type, kFlutterKeyEventTypeUp);
945 EXPECT_EQ(event->physical, kPhysicalKeyA);
946 EXPECT_EQ(event->logical, kLogicalKeyA);
947 EXPECT_STREQ(event->character,
"");
948 EXPECT_EQ(event->synthesized,
false);
949 event->callback(
false, event->user_data);
952 TEST(KeyboardKeyEmbedderHandlerTest, SynthesizeForDesyncToggledState) {
953 TestKeystate key_state;
954 std::vector<TestFlutterKeyEvent> results;
955 TestFlutterKeyEvent* event;
956 bool last_handled =
false;
958 std::unique_ptr<KeyboardKeyEmbedderHandler> handler =
959 std::make_unique<KeyboardKeyEmbedderHandler>(
960 [&results](
const FlutterKeyEvent& event,
964 key_state.Getter(), DefaultMapVkToScan);
967 key_state.Set(VK_NUMLOCK,
false,
true);
971 handler->KeyboardHook(
973 [&last_handled](
bool handled) { last_handled = handled; });
974 EXPECT_EQ(last_handled,
false);
975 EXPECT_EQ(results.size(), 3);
977 EXPECT_EQ(event->type, kFlutterKeyEventTypeDown);
978 EXPECT_EQ(event->physical, kPhysicalNumLock);
979 EXPECT_EQ(event->logical, kLogicalNumLock);
980 EXPECT_STREQ(event->character,
"");
981 EXPECT_EQ(event->synthesized,
true);
984 EXPECT_EQ(event->type, kFlutterKeyEventTypeUp);
985 EXPECT_EQ(event->physical, kPhysicalNumLock);
986 EXPECT_EQ(event->logical, kLogicalNumLock);
987 EXPECT_STREQ(event->character,
"");
988 EXPECT_EQ(event->synthesized,
true);
991 EXPECT_EQ(event->type, kFlutterKeyEventTypeDown);
992 EXPECT_EQ(event->physical, kPhysicalKeyA);
993 EXPECT_EQ(event->logical, kLogicalKeyA);
994 EXPECT_STREQ(event->character,
"a");
995 EXPECT_EQ(event->synthesized,
false);
997 event->callback(
true, event->user_data);
998 EXPECT_EQ(last_handled,
true);
1002 key_state.Set(VK_NUMLOCK,
true,
true);
1005 handler->KeyboardHook(
1007 [&last_handled](
bool handled) { last_handled = handled; });
1008 EXPECT_EQ(last_handled,
true);
1009 EXPECT_EQ(results.size(), 2);
1010 event = &results[0];
1011 EXPECT_EQ(event->type, kFlutterKeyEventTypeDown);
1012 EXPECT_EQ(event->physical, kPhysicalNumLock);
1013 EXPECT_EQ(event->logical, kLogicalNumLock);
1014 EXPECT_STREQ(event->character,
"");
1015 EXPECT_EQ(event->synthesized,
true);
1017 event = &results[1];
1018 EXPECT_EQ(event->type, kFlutterKeyEventTypeRepeat);
1019 EXPECT_EQ(event->physical, kPhysicalKeyA);
1020 EXPECT_EQ(event->logical, kLogicalKeyA);
1021 EXPECT_STREQ(event->character,
"a");
1022 EXPECT_EQ(event->synthesized,
false);
1024 event->callback(
false, event->user_data);
1025 EXPECT_EQ(last_handled,
false);
1031 key_state.Set(VK_NUMLOCK,
false,
false);
1035 handler->KeyboardHook(
1037 [&last_handled](
bool handled) { last_handled = handled; });
1038 EXPECT_EQ(results.size(), 4);
1039 event = &results[0];
1040 EXPECT_EQ(event->type, kFlutterKeyEventTypeUp);
1041 EXPECT_EQ(event->physical, kPhysicalNumLock);
1042 EXPECT_EQ(event->logical, kLogicalNumLock);
1043 EXPECT_STREQ(event->character,
"");
1044 EXPECT_EQ(event->synthesized,
true);
1045 EXPECT_EQ(event->callback,
nullptr);
1047 event = &results[1];
1048 EXPECT_EQ(event->type, kFlutterKeyEventTypeDown);
1049 EXPECT_EQ(event->physical, kPhysicalNumLock);
1050 EXPECT_EQ(event->logical, kLogicalNumLock);
1051 EXPECT_STREQ(event->character,
"");
1052 EXPECT_EQ(event->synthesized,
true);
1053 EXPECT_EQ(event->callback,
nullptr);
1055 event = &results[2];
1056 EXPECT_EQ(event->type, kFlutterKeyEventTypeUp);
1057 EXPECT_EQ(event->physical, kPhysicalNumLock);
1058 EXPECT_EQ(event->logical, kLogicalNumLock);
1059 EXPECT_STREQ(event->character,
"");
1060 EXPECT_EQ(event->synthesized,
true);
1061 EXPECT_EQ(event->callback,
nullptr);
1063 event = &results[3];
1064 EXPECT_EQ(event->type, kFlutterKeyEventTypeUp);
1065 EXPECT_EQ(event->physical, kPhysicalKeyA);
1066 EXPECT_EQ(event->logical, kLogicalKeyA);
1067 EXPECT_STREQ(event->character,
"");
1068 EXPECT_EQ(event->synthesized,
false);
1069 event->callback(
false, event->user_data);
1072 TEST(KeyboardKeyEmbedderHandlerTest,
1073 SynthesizeForDesyncToggledStateByItselfsUp) {
1074 TestKeystate key_state;
1075 std::vector<TestFlutterKeyEvent> results;
1076 TestFlutterKeyEvent* event;
1077 bool last_handled =
false;
1079 std::unique_ptr<KeyboardKeyEmbedderHandler> handler =
1080 std::make_unique<KeyboardKeyEmbedderHandler>(
1081 [&results](
const FlutterKeyEvent& event,
1085 key_state.Getter(), DefaultMapVkToScan);
1088 key_state.Set(VK_NUMLOCK,
true,
true);
1089 handler->KeyboardHook(
1090 VK_NUMLOCK, kScanCodeNumLock, WM_KEYDOWN, 0,
true,
false,
1091 [&last_handled](
bool handled) { last_handled = handled; });
1092 event = &results.back();
1093 event->callback(
false, event->user_data);
1097 key_state.Set(VK_NUMLOCK,
false,
false);
1099 handler->KeyboardHook(
1100 VK_NUMLOCK, kScanCodeNumLock, WM_KEYUP, 0,
true,
true,
1101 [&last_handled](
bool handled) { last_handled = handled; });
1102 EXPECT_EQ(last_handled,
false);
1103 EXPECT_EQ(results.size(), 3);
1104 event = &results[0];
1105 EXPECT_EQ(event->type, kFlutterKeyEventTypeUp);
1106 EXPECT_EQ(event->physical, kPhysicalNumLock);
1107 EXPECT_EQ(event->logical, kLogicalNumLock);
1108 EXPECT_STREQ(event->character,
"");
1109 EXPECT_EQ(event->synthesized,
true);
1110 EXPECT_EQ(event->callback,
nullptr);
1112 event = &results[1];
1113 EXPECT_EQ(event->type, kFlutterKeyEventTypeDown);
1114 EXPECT_EQ(event->physical, kPhysicalNumLock);
1115 EXPECT_EQ(event->logical, kLogicalNumLock);
1116 EXPECT_STREQ(event->character,
"");
1117 EXPECT_EQ(event->synthesized,
true);
1118 EXPECT_EQ(event->callback,
nullptr);
1120 event = &results[2];
1121 EXPECT_EQ(event->type, kFlutterKeyEventTypeUp);
1122 EXPECT_EQ(event->physical, kPhysicalNumLock);
1123 EXPECT_EQ(event->logical, kLogicalNumLock);
1124 EXPECT_STREQ(event->character,
"");
1125 EXPECT_EQ(event->synthesized,
false);
1127 last_handled =
false;
1128 event->callback(
true, event->user_data);
1129 EXPECT_EQ(last_handled,
true);
1132 TEST(KeyboardKeyEmbedderHandlerTest,
1133 SynthesizeForDesyncToggledStateByItselfsDown) {
1134 TestKeystate key_state;
1135 std::vector<TestFlutterKeyEvent> results;
1136 TestFlutterKeyEvent* event;
1137 bool last_handled =
false;
1140 key_state.Set(VK_NUMLOCK,
false,
false);
1141 std::unique_ptr<KeyboardKeyEmbedderHandler> handler =
1142 std::make_unique<KeyboardKeyEmbedderHandler>(
1143 [&results](
const FlutterKeyEvent& event,
1147 key_state.Getter(), DefaultMapVkToScan);
1153 key_state.Set(VK_NUMLOCK,
true,
false);
1154 handler->KeyboardHook(
1155 VK_NUMLOCK, kScanCodeNumLock, WM_KEYDOWN, 0,
true,
false,
1156 [&last_handled](
bool handled) { last_handled = handled; });
1157 EXPECT_EQ(last_handled,
false);
1161 EXPECT_EQ(results.size(), 4);
1162 event = &results[0];
1163 EXPECT_EQ(event->type, kFlutterKeyEventTypeDown);
1164 EXPECT_EQ(event->physical, kPhysicalNumLock);
1165 EXPECT_EQ(event->logical, kLogicalNumLock);
1166 EXPECT_STREQ(event->character,
"");
1167 EXPECT_EQ(event->synthesized,
true);
1168 EXPECT_EQ(event->callback,
nullptr);
1170 event = &results[1];
1171 EXPECT_EQ(event->type, kFlutterKeyEventTypeUp);
1172 EXPECT_EQ(event->physical, kPhysicalNumLock);
1173 EXPECT_EQ(event->logical, kLogicalNumLock);
1174 EXPECT_STREQ(event->character,
"");
1175 EXPECT_EQ(event->synthesized,
true);
1176 EXPECT_EQ(event->callback,
nullptr);
1178 event = &results[2];
1179 EXPECT_EQ(event->type, kFlutterKeyEventTypeDown);
1180 EXPECT_EQ(event->physical, kPhysicalNumLock);
1181 EXPECT_EQ(event->logical, kLogicalNumLock);
1182 EXPECT_STREQ(event->character,
"");
1183 EXPECT_EQ(event->synthesized,
false);
1185 last_handled =
false;
1186 event->callback(
true, event->user_data);
1187 EXPECT_EQ(last_handled,
true);
1190 TEST(KeyboardKeyEmbedderHandlerTest, SynthesizeWithInitialTogglingState) {
1191 TestKeystate key_state;
1192 std::vector<TestFlutterKeyEvent> results;
1193 TestFlutterKeyEvent* event;
1194 bool last_handled =
false;
1197 key_state.Set(VK_NUMLOCK,
false,
true);
1199 std::unique_ptr<KeyboardKeyEmbedderHandler> handler =
1200 std::make_unique<KeyboardKeyEmbedderHandler>(
1201 [&results](
const FlutterKeyEvent& event,
1205 key_state.Getter(), DefaultMapVkToScan);
1208 key_state.Set(VK_NUMLOCK,
true,
false);
1209 handler->KeyboardHook(
1210 VK_NUMLOCK, kScanCodeNumLock, WM_KEYDOWN, 0,
true,
false,
1211 [&last_handled](
bool handled) { last_handled = handled; });
1212 EXPECT_EQ(last_handled,
false);
1213 EXPECT_EQ(results.size(), 1);
1214 event = &results[0];
1215 EXPECT_EQ(event->type, kFlutterKeyEventTypeDown);
1216 EXPECT_EQ(event->physical, kPhysicalNumLock);
1217 EXPECT_EQ(event->logical, kLogicalNumLock);
1218 EXPECT_STREQ(event->character,
"");
1219 EXPECT_EQ(event->synthesized,
false);
1221 event->callback(
true, event->user_data);
1222 EXPECT_EQ(last_handled,
true);
1226 TEST(KeyboardKeyEmbedderHandlerTest, SysKeyPress) {
1227 TestKeystate key_state;
1228 std::vector<TestFlutterKeyEvent> results;
1229 TestFlutterKeyEvent* event;
1230 bool last_handled =
false;
1232 std::unique_ptr<KeyboardKeyEmbedderHandler> handler =
1233 std::make_unique<KeyboardKeyEmbedderHandler>(
1234 [&results](
const FlutterKeyEvent& event,
1238 key_state.Getter(), DefaultMapVkToScan);
1241 key_state.Set(VK_LMENU,
true);
1242 handler->KeyboardHook(
1243 VK_LMENU, kScanCodeAltLeft, WM_SYSKEYDOWN, 0,
false,
false,
1244 [&last_handled](
bool handled) { last_handled = handled; });
1245 EXPECT_EQ(last_handled,
false);
1246 EXPECT_EQ(results.size(), 1);
1247 event = results.data();
1248 EXPECT_EQ(event->type, kFlutterKeyEventTypeDown);
1249 EXPECT_EQ(event->physical, kPhysicalAltLeft);
1250 EXPECT_EQ(event->logical, kLogicalAltLeft);
1251 EXPECT_STREQ(event->character,
"");
1252 EXPECT_EQ(event->synthesized,
false);
1254 event->callback(
true, event->user_data);
1255 EXPECT_EQ(last_handled,
true);
1259 key_state.Set(VK_LMENU,
false);
1260 handler->KeyboardHook(
1261 VK_LMENU, kScanCodeAltLeft, WM_SYSKEYUP, 0,
false,
true,
1262 [&last_handled](
bool handled) { last_handled = handled; });
1263 EXPECT_EQ(results.size(), 1);
1264 event = results.data();
1265 EXPECT_EQ(event->type, kFlutterKeyEventTypeUp);
1266 EXPECT_EQ(event->physical, kPhysicalAltLeft);
1267 EXPECT_EQ(event->logical, kLogicalAltLeft);
1268 EXPECT_STREQ(event->character,
"");
1269 EXPECT_EQ(event->synthesized,
false);
1270 event->callback(
false, event->user_data);
std::function< SHORT(int)> GetKeyStateHandler
FlutterKeyEventCallback callback
enum flutter::testing::@98::KeyboardChange::Type type
constexpr uint64_t kScanCodeKeyA
TEST(AccessibilityBridgeWindows, GetParent)
constexpr uint64_t kVirtualKeyA
constexpr int kScanCodeShiftRight
constexpr int kScanCodeShiftLeft
constexpr int kScanCodeControlRight
std::string ConvertChar32ToUtf8(char32_t ch)
constexpr int kScanCodeControlLeft