7 #include "gtest/gtest.h"
9 #include "flutter/shell/platform/embedder/test_utils/key_codes.g.h"
10 #include "flutter/shell/platform/embedder/test_utils/proc_table_replacement.h"
13 #include "flutter/shell/platform/linux/testing/fl_test.h"
16 constexpr gboolean kRelease = FALSE;
17 constexpr gboolean kPress =
TRUE;
19 constexpr guint16 kKeyCodeDigit1 = 0x0au;
20 constexpr guint16 kKeyCodeKeyA = 0x26u;
21 constexpr guint16 kKeyCodeShiftLeft = 0x32u;
22 constexpr guint16 kKeyCodeShiftRight = 0x3Eu;
23 constexpr guint16 kKeyCodeAltLeft = 0x40u;
24 constexpr guint16 kKeyCodeAltRight = 0x6Cu;
25 constexpr guint16 kKeyCodeNumpad1 = 0x57u;
26 constexpr guint16 kKeyCodeNumLock = 0x4Du;
27 constexpr guint16 kKeyCodeCapsLock = 0x42u;
28 constexpr guint16 kKeyCodeControlLeft = 0x25u;
29 constexpr guint16 kKeyCodeControlRight = 0x69u;
31 using namespace ::flutter::testing::keycodes;
35 g_ptr_array_remove_range(array, 0, array->len);
39 fl_key_embedder_call_record,
41 KEY_EMBEDDER_CALL_RECORD,
53 fl_key_embedder_call_record,
56 static void fl_key_embedder_call_record_init(FlKeyEmbedderCallRecord*
self) {}
60 g_return_if_fail(FL_IS_KEY_EMBEDDER_CALL_RECORD(
object));
62 FlKeyEmbedderCallRecord*
self = FL_KEY_EMBEDDER_CALL_RECORD(
object);
63 if (self->event !=
nullptr) {
64 g_free(
const_cast<char*
>(self->event->character));
67 G_OBJECT_CLASS(fl_key_embedder_call_record_parent_class)->dispose(
object);
72 FlKeyEmbedderCallRecordClass* klass) {
77 const FlutterKeyEvent* event,
78 FlutterKeyEventCallback callback,
80 g_return_val_if_fail(event !=
nullptr,
nullptr);
82 FlKeyEmbedderCallRecord*
self = FL_KEY_EMBEDDER_CALL_RECORD(
83 g_object_new(fl_key_embedder_call_record_get_type(),
nullptr));
85 FlutterKeyEvent* clone_event = g_new(FlutterKeyEvent, 1);
86 *clone_event = *event;
87 if (event->character !=
nullptr) {
88 size_t character_length = strlen(event->character);
89 char* clone_character = g_new(
char, character_length + 1);
90 strncpy(clone_character, event->character, character_length + 1);
91 clone_event->character = clone_character;
93 self->event = clone_event;
94 self->callback = callback;
108 bool expected_handled,
109 void* expected_user_data) {
110 g_return_if_fail(record->callback !=
nullptr);
113 record->callback(expected_handled, record->user_data);
117 FlutterKeyEventCallback callback,
118 void* callback_user_data,
119 void* send_key_event_user_data) {
120 GPtrArray* records_array =
121 reinterpret_cast<GPtrArray*
>(send_key_event_user_data);
122 if (records_array !=
nullptr) {
124 event, callback, callback_user_data));
129 TEST(FlKeyEmbedderResponderTest, SendKeyEvent) {
130 g_autoptr(GPtrArray) call_records =
131 g_ptr_array_new_with_free_func(g_object_unref);
132 g_autoptr(FlKeyEmbedderResponder) responder =
138 g_autoptr(FlKeyEvent) event1 =
140 static_cast<GdkModifierType
>(0), 0);
144 EXPECT_EQ(call_records->len, 1u);
145 FlKeyEmbedderCallRecord* record =
146 FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
147 EXPECT_EQ(record->event->struct_size,
sizeof(FlutterKeyEvent));
148 EXPECT_EQ(record->event->timestamp, 12345000);
149 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
150 EXPECT_EQ(record->event->physical, kPhysicalKeyA);
151 EXPECT_EQ(record->event->logical, kLogicalKeyA);
152 EXPECT_STREQ(record->event->character,
"a");
153 EXPECT_EQ(record->event->synthesized,
false);
159 g_autoptr(FlKeyEvent) event2 =
161 static_cast<GdkModifierType
>(0), 0);
165 EXPECT_EQ(call_records->len, 1u);
166 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
167 EXPECT_EQ(record->event->struct_size,
sizeof(FlutterKeyEvent));
168 EXPECT_EQ(record->event->timestamp, 12346000);
169 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeUp);
170 EXPECT_EQ(record->event->physical, kPhysicalKeyA);
171 EXPECT_EQ(record->event->logical, kLogicalKeyA);
172 EXPECT_STREQ(record->event->character,
nullptr);
173 EXPECT_EQ(record->event->synthesized,
false);
180 g_autoptr(FlKeyEvent) event3 =
182 static_cast<GdkModifierType
>(0), 0);
186 EXPECT_EQ(call_records->len, 1u);
187 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
188 EXPECT_EQ(record->event->struct_size,
sizeof(FlutterKeyEvent));
189 EXPECT_EQ(record->event->timestamp, 12347000);
190 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
191 EXPECT_EQ(record->event->physical, kPhysicalKeyA);
192 EXPECT_EQ(record->event->logical, kLogicalKeyQ);
193 EXPECT_STREQ(record->event->character,
"q");
194 EXPECT_EQ(record->event->synthesized,
false);
200 g_autoptr(FlKeyEvent) event4 =
202 static_cast<GdkModifierType
>(0), 0);
206 EXPECT_EQ(call_records->len, 1u);
207 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
208 EXPECT_EQ(record->event->struct_size,
sizeof(FlutterKeyEvent));
209 EXPECT_EQ(record->event->timestamp, 12348000);
210 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeUp);
211 EXPECT_EQ(record->event->physical, kPhysicalKeyA);
212 EXPECT_EQ(record->event->logical, kLogicalKeyQ);
213 EXPECT_STREQ(record->event->character,
nullptr);
214 EXPECT_EQ(record->event->synthesized,
false);
220 TEST(FlKeyEmbedderResponderTest, UsesSpecifiedLogicalKey) {
221 g_autoptr(GPtrArray) call_records =
222 g_ptr_array_new_with_free_func(g_object_unref);
223 g_autoptr(FlKeyEmbedderResponder) responder =
229 g_autoptr(FlKeyEvent)
event =
231 static_cast<GdkModifierType
>(0), 0);
235 EXPECT_EQ(call_records->len, 1u);
236 FlKeyEmbedderCallRecord* record =
237 FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
238 EXPECT_EQ(record->event->struct_size,
sizeof(FlutterKeyEvent));
239 EXPECT_EQ(record->event->timestamp, 12345000);
240 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
241 EXPECT_EQ(record->event->physical, kPhysicalDigit1);
242 EXPECT_EQ(record->event->logical, kLogicalDigit1);
243 EXPECT_STREQ(record->event->character,
"&");
244 EXPECT_EQ(record->event->synthesized,
false);
250 TEST(FlKeyEmbedderResponderTest, PressShiftDuringLetterKeyTap) {
251 g_autoptr(GPtrArray) call_records =
252 g_ptr_array_new_with_free_func(g_object_unref);
253 g_autoptr(FlKeyEmbedderResponder) responder =
258 g_autoptr(FlKeyEvent) event1 =
260 static_cast<GdkModifierType
>(0), 0);
264 EXPECT_EQ(call_records->len, 1u);
265 FlKeyEmbedderCallRecord* record =
266 FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
267 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
268 EXPECT_EQ(record->event->physical, kPhysicalShiftRight);
269 EXPECT_EQ(record->event->logical, kLogicalShiftRight);
270 EXPECT_STREQ(record->event->character,
nullptr);
271 EXPECT_EQ(record->event->synthesized,
false);
277 g_autoptr(FlKeyEvent) event2 =
282 EXPECT_EQ(call_records->len, 1u);
283 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
284 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
285 EXPECT_EQ(record->event->physical, kPhysicalKeyA);
286 EXPECT_EQ(record->event->logical, kLogicalKeyA);
287 EXPECT_STREQ(record->event->character,
"A");
288 EXPECT_EQ(record->event->synthesized,
false);
295 103, kRelease, kKeyCodeShiftRight, GDK_KEY_Shift_R, GDK_SHIFT_MASK, 0);
299 EXPECT_EQ(call_records->len, 1u);
300 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
301 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeUp);
302 EXPECT_EQ(record->event->physical, kPhysicalShiftRight);
303 EXPECT_EQ(record->event->logical, kLogicalShiftRight);
304 EXPECT_STREQ(record->event->character,
nullptr);
305 EXPECT_EQ(record->event->synthesized,
false);
311 g_autoptr(FlKeyEvent) event4 =
313 static_cast<GdkModifierType
>(0), 0);
317 EXPECT_EQ(call_records->len, 1u);
318 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
319 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeUp);
320 EXPECT_EQ(record->event->physical, kPhysicalKeyA);
321 EXPECT_EQ(record->event->logical, kLogicalKeyA);
322 EXPECT_STREQ(record->event->character,
nullptr);
323 EXPECT_EQ(record->event->synthesized,
false);
336 TEST(FlKeyEmbedderResponderTest, TapNumPadKeysBetweenNumLockEvents) {
337 g_autoptr(GPtrArray) call_records =
338 g_ptr_array_new_with_free_func(g_object_unref);
339 g_autoptr(FlKeyEmbedderResponder) responder =
344 g_autoptr(FlKeyEvent) event1 =
346 static_cast<GdkModifierType
>(0), 0);
350 EXPECT_EQ(call_records->len, 1u);
351 FlKeyEmbedderCallRecord* record =
352 FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
353 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
354 EXPECT_EQ(record->event->physical, kPhysicalNumpad1);
355 EXPECT_EQ(record->event->logical, kLogicalNumpad1);
356 EXPECT_STREQ(record->event->character,
nullptr);
357 EXPECT_EQ(record->event->synthesized,
false);
363 g_autoptr(FlKeyEvent) event2 =
365 static_cast<GdkModifierType
>(0), 0);
369 EXPECT_EQ(call_records->len, 1u);
370 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
371 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
372 EXPECT_EQ(record->event->physical, kPhysicalNumLock);
373 EXPECT_EQ(record->event->logical, kLogicalNumLock);
374 EXPECT_STREQ(record->event->character,
nullptr);
375 EXPECT_EQ(record->event->synthesized,
false);
382 104, kRelease, kKeyCodeNumpad1, GDK_KEY_KP_1, GDK_MOD2_MASK, 0);
386 EXPECT_EQ(call_records->len, 1u);
387 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
388 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeUp);
389 EXPECT_EQ(record->event->physical, kPhysicalNumpad1);
390 EXPECT_EQ(record->event->logical, kLogicalNumpad1);
391 EXPECT_STREQ(record->event->character,
nullptr);
392 EXPECT_EQ(record->event->synthesized,
false);
399 103, kRelease, kKeyCodeNumLock, GDK_KEY_Num_Lock, GDK_MOD2_MASK, 0);
403 EXPECT_EQ(call_records->len, 1u);
404 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
405 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeUp);
406 EXPECT_EQ(record->event->physical, kPhysicalNumLock);
407 EXPECT_EQ(record->event->logical, kLogicalNumLock);
408 EXPECT_STREQ(record->event->character,
nullptr);
409 EXPECT_EQ(record->event->synthesized,
false);
416 101, kPress, kKeyCodeNumpad1, GDK_KEY_KP_End, GDK_MOD2_MASK, 0);
420 EXPECT_EQ(call_records->len, 1u);
421 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
422 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
423 EXPECT_EQ(record->event->physical, kPhysicalNumpad1);
424 EXPECT_EQ(record->event->logical, kLogicalNumpad1);
425 EXPECT_STREQ(record->event->character,
nullptr);
426 EXPECT_EQ(record->event->synthesized,
false);
433 102, kPress, kKeyCodeNumLock, GDK_KEY_Num_Lock, GDK_MOD2_MASK, 0);
437 EXPECT_EQ(call_records->len, 1u);
438 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
439 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
440 EXPECT_EQ(record->event->physical, kPhysicalNumLock);
441 EXPECT_EQ(record->event->logical, kLogicalNumLock);
442 EXPECT_STREQ(record->event->character,
nullptr);
443 EXPECT_EQ(record->event->synthesized,
false);
450 104, kRelease, kKeyCodeNumpad1, GDK_KEY_KP_1, GDK_MOD2_MASK, 0);
454 EXPECT_EQ(call_records->len, 1u);
455 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
456 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeUp);
457 EXPECT_EQ(record->event->physical, kPhysicalNumpad1);
458 EXPECT_EQ(record->event->logical, kLogicalNumpad1);
459 EXPECT_STREQ(record->event->character,
nullptr);
460 EXPECT_EQ(record->event->synthesized,
false);
467 103, kRelease, kKeyCodeNumLock, GDK_KEY_Num_Lock, GDK_MOD2_MASK, 0);
471 EXPECT_EQ(call_records->len, 1u);
472 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
473 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeUp);
474 EXPECT_EQ(record->event->physical, kPhysicalNumLock);
475 EXPECT_EQ(record->event->logical, kLogicalNumLock);
476 EXPECT_STREQ(record->event->character,
nullptr);
477 EXPECT_EQ(record->event->synthesized,
false);
486 TEST(FlKeyEmbedderResponderTest, ReleaseShiftKeyBetweenDigitKeyEvents) {
487 g_autoptr(GPtrArray) call_records =
488 g_ptr_array_new_with_free_func(g_object_unref);
489 g_autoptr(FlKeyEmbedderResponder) responder =
493 GdkModifierType
state =
static_cast<GdkModifierType
>(0);
497 101, kPress, kKeyCodeShiftLeft, GDK_KEY_Shift_L,
state, 0);
501 EXPECT_EQ(call_records->len, 1u);
502 FlKeyEmbedderCallRecord* record =
503 FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
504 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
505 EXPECT_EQ(record->event->physical, kPhysicalShiftLeft);
506 EXPECT_EQ(record->event->logical, kLogicalShiftLeft);
507 EXPECT_STREQ(record->event->character,
nullptr);
508 EXPECT_EQ(record->event->synthesized,
false);
513 state = GDK_SHIFT_MASK;
516 g_autoptr(FlKeyEvent) event2 =
521 EXPECT_EQ(call_records->len, 1u);
522 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
523 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
524 EXPECT_EQ(record->event->physical, kPhysicalDigit1);
525 EXPECT_EQ(record->event->logical, kLogicalExclamation);
526 EXPECT_STREQ(record->event->character,
"!");
527 EXPECT_EQ(record->event->synthesized,
false);
534 103, kRelease, kKeyCodeShiftLeft, GDK_KEY_Shift_L,
state, 0);
538 EXPECT_EQ(call_records->len, 1u);
539 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
540 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeUp);
541 EXPECT_EQ(record->event->physical, kPhysicalShiftLeft);
542 EXPECT_EQ(record->event->logical, kLogicalShiftLeft);
543 EXPECT_STREQ(record->event->character,
nullptr);
544 EXPECT_EQ(record->event->synthesized,
false);
549 state =
static_cast<GdkModifierType
>(0);
552 g_autoptr(FlKeyEvent) event4 =
557 EXPECT_EQ(call_records->len, 1u);
558 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
559 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeUp);
560 EXPECT_EQ(record->event->physical, kPhysicalDigit1);
561 EXPECT_EQ(record->event->logical, kLogicalExclamation);
562 EXPECT_STREQ(record->event->character,
nullptr);
563 EXPECT_EQ(record->event->synthesized,
false);
572 TEST(FlKeyEmbedderResponderTest, TapLetterKeysBetweenCapsLockEvents) {
573 g_autoptr(GPtrArray) call_records =
574 g_ptr_array_new_with_free_func(g_object_unref);
575 g_autoptr(FlKeyEmbedderResponder) responder =
580 g_autoptr(FlKeyEvent) event1 =
582 static_cast<GdkModifierType
>(0), 0);
586 EXPECT_EQ(call_records->len, 1u);
587 FlKeyEmbedderCallRecord* record =
588 FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
589 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
590 EXPECT_EQ(record->event->physical, kPhysicalCapsLock);
591 EXPECT_EQ(record->event->logical, kLogicalCapsLock);
592 EXPECT_STREQ(record->event->character,
nullptr);
593 EXPECT_EQ(record->event->synthesized,
false);
599 g_autoptr(FlKeyEvent) event2 =
604 EXPECT_EQ(call_records->len, 1u);
605 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
606 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
607 EXPECT_EQ(record->event->physical, kPhysicalKeyA);
608 EXPECT_EQ(record->event->logical, kLogicalKeyA);
609 EXPECT_STREQ(record->event->character,
"A");
610 EXPECT_EQ(record->event->synthesized,
false);
617 103, kRelease, kKeyCodeCapsLock, GDK_KEY_Caps_Lock, GDK_LOCK_MASK, 0);
621 EXPECT_EQ(call_records->len, 1u);
622 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
623 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeUp);
624 EXPECT_EQ(record->event->physical, kPhysicalCapsLock);
625 EXPECT_EQ(record->event->logical, kLogicalCapsLock);
626 EXPECT_STREQ(record->event->character,
nullptr);
627 EXPECT_EQ(record->event->synthesized,
false);
633 g_autoptr(FlKeyEvent) event4 =
fl_key_event_new(104, kRelease, kKeyCodeKeyA,
634 GDK_KEY_A, GDK_LOCK_MASK, 0);
638 EXPECT_EQ(call_records->len, 1u);
639 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
640 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeUp);
641 EXPECT_EQ(record->event->physical, kPhysicalKeyA);
642 EXPECT_EQ(record->event->logical, kLogicalKeyA);
643 EXPECT_STREQ(record->event->character,
nullptr);
644 EXPECT_EQ(record->event->synthesized,
false);
651 105, kPress, kKeyCodeCapsLock, GDK_KEY_Caps_Lock, GDK_LOCK_MASK, 0);
655 EXPECT_EQ(call_records->len, 1u);
656 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
657 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
658 EXPECT_EQ(record->event->physical, kPhysicalCapsLock);
659 EXPECT_EQ(record->event->logical, kLogicalCapsLock);
660 EXPECT_STREQ(record->event->character,
nullptr);
661 EXPECT_EQ(record->event->synthesized,
false);
667 g_autoptr(FlKeyEvent) event6 =
672 EXPECT_EQ(call_records->len, 1u);
673 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
674 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
675 EXPECT_EQ(record->event->physical, kPhysicalKeyA);
676 EXPECT_EQ(record->event->logical, kLogicalKeyA);
677 EXPECT_STREQ(record->event->character,
"A");
678 EXPECT_EQ(record->event->synthesized,
false);
685 107, kRelease, kKeyCodeCapsLock, GDK_KEY_Caps_Lock, GDK_LOCK_MASK, 0);
689 EXPECT_EQ(call_records->len, 1u);
690 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
691 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeUp);
692 EXPECT_EQ(record->event->physical, kPhysicalCapsLock);
693 EXPECT_EQ(record->event->logical, kLogicalCapsLock);
694 EXPECT_STREQ(record->event->character,
nullptr);
695 EXPECT_EQ(record->event->synthesized,
false);
701 g_autoptr(FlKeyEvent) event8 =
703 static_cast<GdkModifierType
>(0), 0);
707 EXPECT_EQ(call_records->len, 1u);
708 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
709 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeUp);
710 EXPECT_EQ(record->event->physical, kPhysicalKeyA);
711 EXPECT_EQ(record->event->logical, kLogicalKeyA);
712 EXPECT_STREQ(record->event->character,
nullptr);
713 EXPECT_EQ(record->event->synthesized,
false);
722 TEST(FlKeyEmbedderResponderTest, TapLetterKeysBetweenCapsLockEventsReversed) {
723 g_autoptr(GPtrArray) call_records =
724 g_ptr_array_new_with_free_func(g_object_unref);
725 g_autoptr(FlKeyEmbedderResponder) responder =
731 101, kPress, kKeyCodeKeyA, GDK_KEY_a,
static_cast<GdkModifierType
>(0), 0);
735 EXPECT_EQ(call_records->len, 1u);
736 FlKeyEmbedderCallRecord* record =
737 FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
738 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
739 EXPECT_EQ(record->event->physical, kPhysicalKeyA);
740 EXPECT_EQ(record->event->logical, kLogicalKeyA);
741 EXPECT_STREQ(record->event->character,
"a");
742 EXPECT_EQ(record->event->synthesized,
false);
749 102, kPress, kKeyCodeCapsLock, GDK_KEY_Caps_Lock, GDK_LOCK_MASK, 0);
753 EXPECT_EQ(call_records->len, 1u);
754 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
755 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
756 EXPECT_EQ(record->event->physical, kPhysicalCapsLock);
757 EXPECT_EQ(record->event->logical, kLogicalCapsLock);
758 EXPECT_STREQ(record->event->character,
nullptr);
759 EXPECT_EQ(record->event->synthesized,
false);
766 103, kRelease, kKeyCodeCapsLock, GDK_KEY_Caps_Lock, GDK_LOCK_MASK, 0);
770 EXPECT_EQ(call_records->len, 1u);
771 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
772 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeUp);
773 EXPECT_EQ(record->event->physical, kPhysicalCapsLock);
774 EXPECT_EQ(record->event->logical, kLogicalCapsLock);
775 EXPECT_STREQ(record->event->character,
nullptr);
776 EXPECT_EQ(record->event->synthesized,
false);
782 g_autoptr(FlKeyEvent) event4 =
fl_key_event_new(104, kRelease, kKeyCodeKeyA,
783 GDK_KEY_A, GDK_LOCK_MASK, 0);
787 EXPECT_EQ(call_records->len, 1u);
788 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
789 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeUp);
790 EXPECT_EQ(record->event->physical, kPhysicalKeyA);
791 EXPECT_EQ(record->event->logical, kLogicalKeyA);
792 EXPECT_STREQ(record->event->character,
nullptr);
793 EXPECT_EQ(record->event->synthesized,
false);
799 g_autoptr(FlKeyEvent) event5 =
804 EXPECT_EQ(call_records->len, 1u);
805 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
806 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
807 EXPECT_EQ(record->event->physical, kPhysicalKeyA);
808 EXPECT_EQ(record->event->logical, kLogicalKeyA);
809 EXPECT_STREQ(record->event->character,
"A");
810 EXPECT_EQ(record->event->synthesized,
false);
816 g_autoptr(FlKeyEvent) event6 =
818 static_cast<GdkModifierType
>(0), 0);
822 EXPECT_EQ(call_records->len, 1u);
823 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
824 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
825 EXPECT_EQ(record->event->physical, kPhysicalCapsLock);
826 EXPECT_EQ(record->event->logical, kLogicalCapsLock);
827 EXPECT_STREQ(record->event->character,
nullptr);
828 EXPECT_EQ(record->event->synthesized,
false);
835 107, kRelease, kKeyCodeCapsLock, GDK_KEY_Caps_Lock, GDK_LOCK_MASK, 0);
839 EXPECT_EQ(call_records->len, 1u);
840 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
841 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeUp);
842 EXPECT_EQ(record->event->physical, kPhysicalCapsLock);
843 EXPECT_EQ(record->event->logical, kLogicalCapsLock);
844 EXPECT_STREQ(record->event->character,
nullptr);
845 EXPECT_EQ(record->event->synthesized,
false);
851 g_autoptr(FlKeyEvent) event8 =
853 static_cast<GdkModifierType
>(0), 0);
857 EXPECT_EQ(call_records->len, 1u);
858 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
859 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeUp);
860 EXPECT_EQ(record->event->physical, kPhysicalKeyA);
861 EXPECT_EQ(record->event->logical, kLogicalKeyA);
862 EXPECT_STREQ(record->event->character,
nullptr);
863 EXPECT_EQ(record->event->synthesized,
false);
868 TEST(FlKeyEmbedderResponderTest, TurnDuplicateDownEventsToRepeats) {
869 g_autoptr(GPtrArray) call_records =
870 g_ptr_array_new_with_free_func(g_object_unref);
871 g_autoptr(FlKeyEmbedderResponder) responder =
877 101, kPress, kKeyCodeKeyA, GDK_KEY_a,
static_cast<GdkModifierType
>(0), 0);
881 EXPECT_EQ(call_records->len, 1u);
883 FlKeyEmbedderCallRecord* record =
884 FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
891 102, kPress, kKeyCodeKeyA, GDK_KEY_a,
static_cast<GdkModifierType
>(0), 0);
895 EXPECT_EQ(call_records->len, 1u);
897 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
898 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeRepeat);
899 EXPECT_EQ(record->event->physical, kPhysicalKeyA);
900 EXPECT_EQ(record->event->logical, kLogicalKeyA);
901 EXPECT_STREQ(record->event->character,
"a");
902 EXPECT_EQ(record->event->synthesized,
false);
903 EXPECT_NE(record->callback,
nullptr);
909 g_autoptr(FlKeyEvent) event3 =
911 static_cast<GdkModifierType
>(0), 0);
915 EXPECT_EQ(call_records->len, 1u);
916 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
920 TEST(FlKeyEmbedderResponderTest, IgnoreAbruptUpEvent) {
921 g_autoptr(GPtrArray) call_records =
922 g_ptr_array_new_with_free_func(g_object_unref);
923 g_autoptr(FlKeyEmbedderResponder) responder =
929 g_autoptr(FlKeyEvent)
event =
931 static_cast<GdkModifierType
>(0), 0);
935 EXPECT_EQ(call_records->len, 1u);
937 FlKeyEmbedderCallRecord* record =
938 FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
939 EXPECT_EQ(record->event->physical, 0ull);
940 EXPECT_EQ(record->event->logical, 0ull);
941 EXPECT_STREQ(record->event->character,
nullptr);
942 EXPECT_EQ(record->event->synthesized,
false);
943 EXPECT_EQ(record->callback,
nullptr);
948 TEST(FlKeyEmbedderResponderTest, SynthesizeForDesyncPressingStateOnSelfEvents) {
949 g_autoptr(GPtrArray) call_records =
950 g_ptr_array_new_with_free_func(g_object_unref);
951 g_autoptr(FlKeyEmbedderResponder) responder =
958 GdkModifierType
state = GDK_CONTROL_MASK;
962 101, kRelease, kKeyCodeControlLeft, GDK_KEY_Control_L,
state, 0);
966 EXPECT_EQ(call_records->len, 2u);
967 FlKeyEmbedderCallRecord* record =
968 FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
969 EXPECT_EQ(record->event->timestamp, 101000);
970 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
971 EXPECT_EQ(record->event->physical, kPhysicalControlLeft);
972 EXPECT_EQ(record->event->logical, kLogicalControlLeft);
973 EXPECT_STREQ(record->event->character,
nullptr);
974 EXPECT_EQ(record->event->synthesized,
true);
976 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 1));
977 EXPECT_EQ(record->event->timestamp, 101000);
978 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeUp);
979 EXPECT_EQ(record->event->physical, kPhysicalControlLeft);
980 EXPECT_EQ(record->event->logical, kLogicalControlLeft);
981 EXPECT_STREQ(record->event->character,
nullptr);
982 EXPECT_EQ(record->event->synthesized,
false);
990 state =
static_cast<GdkModifierType
>(0);
992 102, kPress, kKeyCodeControlLeft, GDK_KEY_Control_L,
state, 0);
995 EXPECT_EQ(call_records->len, 1u);
996 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
1001 state =
static_cast<GdkModifierType
>(0);
1005 103, kPress, kKeyCodeControlLeft, GDK_KEY_Control_L,
state, 0);
1009 EXPECT_EQ(call_records->len, 2u);
1010 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
1011 EXPECT_EQ(record->event->timestamp, 103000);
1012 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeUp);
1013 EXPECT_EQ(record->event->physical, kPhysicalControlLeft);
1014 EXPECT_EQ(record->event->logical, kLogicalControlLeft);
1015 EXPECT_STREQ(record->event->character,
nullptr);
1016 EXPECT_EQ(record->event->synthesized,
true);
1018 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 1));
1019 EXPECT_EQ(record->event->timestamp, 103000);
1020 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
1021 EXPECT_EQ(record->event->physical, kPhysicalControlLeft);
1022 EXPECT_EQ(record->event->logical, kLogicalControlLeft);
1023 EXPECT_STREQ(record->event->character,
nullptr);
1024 EXPECT_EQ(record->event->synthesized,
false);
1030 state = GDK_CONTROL_MASK;
1032 104, kRelease, kKeyCodeControlLeft, GDK_KEY_Control_L,
state, 0);
1035 EXPECT_EQ(call_records->len, 1u);
1036 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
1043 state = GDK_CONTROL_MASK;
1047 105, kRelease, kKeyCodeControlRight, GDK_KEY_Control_R,
state, 0);
1055 EXPECT_EQ(call_records->len, 1u);
1056 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
1057 EXPECT_EQ(record->event->timestamp, 105000);
1058 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
1059 EXPECT_EQ(record->event->physical, kPhysicalControlLeft);
1060 EXPECT_EQ(record->event->logical, kLogicalControlLeft);
1061 EXPECT_STREQ(record->event->character,
nullptr);
1062 EXPECT_EQ(record->event->synthesized,
true);
1068 SynthesizeForDesyncPressingStateOnNonSelfEvents) {
1069 g_autoptr(GPtrArray) call_records =
1070 g_ptr_array_new_with_free_func(g_object_unref);
1071 g_autoptr(FlKeyEmbedderResponder) responder =
1076 GdkModifierType
state = GDK_CONTROL_MASK;
1079 g_autoptr(FlKeyEvent) event1 =
1084 EXPECT_EQ(call_records->len, 2u);
1085 FlKeyEmbedderCallRecord* record =
1086 FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
1087 EXPECT_EQ(record->event->timestamp, 101000);
1088 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
1089 EXPECT_EQ(record->event->physical, kPhysicalControlLeft);
1090 EXPECT_EQ(record->event->logical, kLogicalControlLeft);
1091 EXPECT_STREQ(record->event->character,
nullptr);
1092 EXPECT_EQ(record->event->synthesized,
true);
1094 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 1));
1095 EXPECT_EQ(record->event->timestamp, 101000);
1096 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
1097 EXPECT_EQ(record->event->physical, kPhysicalKeyA);
1098 EXPECT_EQ(record->event->logical, kLogicalKeyA);
1099 EXPECT_STREQ(record->event->character,
"a");
1100 EXPECT_EQ(record->event->synthesized,
false);
1106 state =
static_cast<GdkModifierType
>(0);
1109 g_autoptr(FlKeyEvent) event2 =
1114 EXPECT_EQ(call_records->len, 2u);
1115 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
1116 EXPECT_EQ(record->event->timestamp, 102000);
1117 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeUp);
1118 EXPECT_EQ(record->event->physical, kPhysicalControlLeft);
1119 EXPECT_EQ(record->event->logical, kLogicalControlLeft);
1120 EXPECT_STREQ(record->event->character,
nullptr);
1121 EXPECT_EQ(record->event->synthesized,
true);
1123 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 1));
1124 EXPECT_EQ(record->event->timestamp, 102000);
1125 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeUp);
1126 EXPECT_EQ(record->event->physical, kPhysicalKeyA);
1127 EXPECT_EQ(record->event->logical, kLogicalKeyA);
1128 EXPECT_STREQ(record->event->character,
nullptr);
1129 EXPECT_EQ(record->event->synthesized,
false);
1137 state =
static_cast<GdkModifierType
>(0);
1139 g_autoptr(FlKeyEvent) event3 =
fl_key_event_new(101, kPress, kKeyCodeCapsLock,
1140 GDK_KEY_Control_L,
state, 0);
1144 EXPECT_EQ(call_records->len, 1u);
1145 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
1146 EXPECT_EQ(record->event->timestamp, 101000);
1147 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
1148 EXPECT_EQ(record->event->physical, kPhysicalCapsLock);
1149 EXPECT_EQ(record->event->logical, kLogicalControlLeft);
1150 EXPECT_STREQ(record->event->character,
nullptr);
1151 EXPECT_EQ(record->event->synthesized,
false);
1157 state =
static_cast<GdkModifierType
>(0);
1160 g_autoptr(FlKeyEvent) event4 =
1167 EXPECT_EQ(call_records->len, 2u);
1168 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
1169 EXPECT_EQ(record->event->timestamp, 102000);
1170 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeUp);
1171 EXPECT_EQ(record->event->physical, kPhysicalCapsLock);
1172 EXPECT_EQ(record->event->logical, kLogicalControlLeft);
1173 EXPECT_STREQ(record->event->character,
nullptr);
1174 EXPECT_EQ(record->event->synthesized,
true);
1176 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 1));
1177 EXPECT_EQ(record->event->timestamp, 102000);
1178 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
1179 EXPECT_EQ(record->event->physical, kPhysicalKeyA);
1180 EXPECT_EQ(record->event->logical, kLogicalKeyA);
1181 EXPECT_STREQ(record->event->character,
"A");
1182 EXPECT_EQ(record->event->synthesized,
false);
1190 SynthesizeForDesyncPressingStateOnRemappedEvents) {
1191 g_autoptr(GPtrArray) call_records =
1192 g_ptr_array_new_with_free_func(g_object_unref);
1193 g_autoptr(FlKeyEmbedderResponder) responder =
1198 GdkModifierType
state =
static_cast<GdkModifierType
>(0);
1200 g_autoptr(FlKeyEvent) event1 =
fl_key_event_new(101, kPress, kKeyCodeCapsLock,
1201 GDK_KEY_Control_L,
state, 0);
1205 EXPECT_EQ(call_records->len, 1u);
1206 FlKeyEmbedderCallRecord* record =
1207 FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
1208 EXPECT_EQ(record->event->timestamp, 101000);
1209 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
1210 EXPECT_EQ(record->event->physical, kPhysicalCapsLock);
1211 EXPECT_EQ(record->event->logical, kLogicalControlLeft);
1212 EXPECT_STREQ(record->event->character,
nullptr);
1213 EXPECT_EQ(record->event->synthesized,
false);
1219 state =
static_cast<GdkModifierType
>(0);
1222 g_autoptr(FlKeyEvent) event2 =
1229 EXPECT_EQ(call_records->len, 2u);
1230 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
1231 EXPECT_EQ(record->event->timestamp, 102000);
1232 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeUp);
1233 EXPECT_EQ(record->event->physical, kPhysicalCapsLock);
1234 EXPECT_EQ(record->event->logical, kLogicalControlLeft);
1235 EXPECT_STREQ(record->event->character,
nullptr);
1236 EXPECT_EQ(record->event->synthesized,
true);
1238 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 1));
1239 EXPECT_EQ(record->event->timestamp, 102000);
1240 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
1241 EXPECT_EQ(record->event->physical, kPhysicalKeyA);
1242 EXPECT_EQ(record->event->logical, kLogicalKeyA);
1243 EXPECT_STREQ(record->event->character,
"A");
1244 EXPECT_EQ(record->event->synthesized,
false);
1251 TEST(FlKeyEmbedderResponderTest, SynthesizeForDesyncLockModeOnNonSelfEvents) {
1252 g_autoptr(GPtrArray) call_records =
1253 g_ptr_array_new_with_free_func(g_object_unref);
1254 g_autoptr(FlKeyEmbedderResponder) responder =
1259 GdkModifierType
state = GDK_MOD2_MASK;
1262 g_autoptr(FlKeyEvent) event1 =
1267 EXPECT_EQ(call_records->len, 2u);
1268 FlKeyEmbedderCallRecord* record =
1269 FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
1270 EXPECT_EQ(record->event->timestamp, 101000);
1271 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
1272 EXPECT_EQ(record->event->physical, kPhysicalNumLock);
1273 EXPECT_EQ(record->event->logical, kLogicalNumLock);
1274 EXPECT_STREQ(record->event->character,
nullptr);
1275 EXPECT_EQ(record->event->synthesized,
true);
1277 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 1));
1278 EXPECT_EQ(record->event->timestamp, 101000);
1279 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
1280 EXPECT_EQ(record->event->physical, kPhysicalKeyA);
1281 EXPECT_EQ(record->event->logical, kLogicalKeyA);
1282 EXPECT_STREQ(record->event->character,
"a");
1283 EXPECT_EQ(record->event->synthesized,
false);
1289 state =
static_cast<GdkModifierType
>(0);
1292 g_autoptr(FlKeyEvent) event2 =
1297 EXPECT_EQ(call_records->len, 4u);
1298 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
1299 EXPECT_EQ(record->event->timestamp, 102000);
1300 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeUp);
1301 EXPECT_EQ(record->event->physical, kPhysicalNumLock);
1302 EXPECT_EQ(record->event->logical, kLogicalNumLock);
1303 EXPECT_STREQ(record->event->character,
nullptr);
1304 EXPECT_EQ(record->event->synthesized,
true);
1306 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 1));
1307 EXPECT_EQ(record->event->timestamp, 102000);
1308 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
1309 EXPECT_EQ(record->event->physical, kPhysicalNumLock);
1310 EXPECT_EQ(record->event->logical, kLogicalNumLock);
1311 EXPECT_STREQ(record->event->character,
nullptr);
1312 EXPECT_EQ(record->event->synthesized,
true);
1314 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 2));
1315 EXPECT_EQ(record->event->timestamp, 102000);
1316 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeUp);
1317 EXPECT_EQ(record->event->physical, kPhysicalNumLock);
1318 EXPECT_EQ(record->event->logical, kLogicalNumLock);
1319 EXPECT_STREQ(record->event->character,
nullptr);
1320 EXPECT_EQ(record->event->synthesized,
true);
1322 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 3));
1323 EXPECT_EQ(record->event->timestamp, 102000);
1324 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeUp);
1325 EXPECT_EQ(record->event->physical, kPhysicalKeyA);
1326 EXPECT_EQ(record->event->logical, kLogicalKeyA);
1327 EXPECT_STREQ(record->event->character,
nullptr);
1328 EXPECT_EQ(record->event->synthesized,
false);
1337 103, kRelease, kKeyCodeNumLock, GDK_KEY_Num_Lock,
state, 0);
1341 EXPECT_EQ(call_records->len, 1u);
1342 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
1343 EXPECT_EQ(record->event->physical, 0ull);
1344 EXPECT_EQ(record->event->logical, 0ull);
1345 EXPECT_STREQ(record->event->character,
nullptr);
1346 EXPECT_EQ(record->event->synthesized,
false);
1347 EXPECT_EQ(record->callback,
nullptr);
1352 TEST(FlKeyEmbedderResponderTest, SynthesizeForDesyncLockModeOnSelfEvents) {
1353 g_autoptr(GPtrArray) call_records =
1354 g_ptr_array_new_with_free_func(g_object_unref);
1355 g_autoptr(FlKeyEmbedderResponder) responder =
1360 GdkModifierType
state = GDK_MOD2_MASK;
1363 g_autoptr(FlKeyEvent) event1 =
fl_key_event_new(101, kPress, kKeyCodeNumLock,
1364 GDK_KEY_Num_Lock,
state, 0);
1368 EXPECT_EQ(call_records->len, 3u);
1369 FlKeyEmbedderCallRecord* record =
1370 FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
1371 EXPECT_EQ(record->event->timestamp, 101000);
1372 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
1373 EXPECT_EQ(record->event->physical, kPhysicalNumLock);
1374 EXPECT_EQ(record->event->logical, kLogicalNumLock);
1375 EXPECT_STREQ(record->event->character,
nullptr);
1376 EXPECT_EQ(record->event->synthesized,
true);
1378 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 1));
1379 EXPECT_EQ(record->event->timestamp, 101000);
1380 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeUp);
1381 EXPECT_EQ(record->event->physical, kPhysicalNumLock);
1382 EXPECT_EQ(record->event->logical, kLogicalNumLock);
1383 EXPECT_STREQ(record->event->character,
nullptr);
1384 EXPECT_EQ(record->event->synthesized,
true);
1386 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 2));
1387 EXPECT_EQ(record->event->timestamp, 101000);
1388 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
1389 EXPECT_EQ(record->event->physical, kPhysicalNumLock);
1390 EXPECT_EQ(record->event->logical, kLogicalNumLock);
1391 EXPECT_STREQ(record->event->character,
nullptr);
1392 EXPECT_EQ(record->event->synthesized,
false);
1398 state = GDK_MOD2_MASK;
1401 g_autoptr(FlKeyEvent) event2 =
fl_key_event_new(102, kPress, kKeyCodeNumLock,
1402 GDK_KEY_Num_Lock,
state, 0);
1406 EXPECT_EQ(call_records->len, 4u);
1407 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
1408 EXPECT_EQ(record->event->timestamp, 102000);
1409 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeUp);
1410 EXPECT_EQ(record->event->physical, kPhysicalNumLock);
1411 EXPECT_EQ(record->event->logical, kLogicalNumLock);
1412 EXPECT_STREQ(record->event->character,
nullptr);
1413 EXPECT_EQ(record->event->synthesized,
true);
1415 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 1));
1416 EXPECT_EQ(record->event->timestamp, 102000);
1417 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
1418 EXPECT_EQ(record->event->physical, kPhysicalNumLock);
1419 EXPECT_EQ(record->event->logical, kLogicalNumLock);
1420 EXPECT_STREQ(record->event->character,
nullptr);
1421 EXPECT_EQ(record->event->synthesized,
true);
1423 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 2));
1424 EXPECT_EQ(record->event->timestamp, 102000);
1425 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeUp);
1426 EXPECT_EQ(record->event->physical, kPhysicalNumLock);
1427 EXPECT_EQ(record->event->logical, kLogicalNumLock);
1428 EXPECT_STREQ(record->event->character,
nullptr);
1429 EXPECT_EQ(record->event->synthesized,
true);
1431 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 3));
1432 EXPECT_EQ(record->event->timestamp, 102000);
1433 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
1434 EXPECT_EQ(record->event->physical, kPhysicalNumLock);
1435 EXPECT_EQ(record->event->logical, kLogicalNumLock);
1436 EXPECT_STREQ(record->event->character,
nullptr);
1437 EXPECT_EQ(record->event->synthesized,
false);
1444 TEST(FlKeyEmbedderResponderTest, SynthesizationOccursOnIgnoredEvents) {
1445 g_autoptr(GPtrArray) call_records =
1446 g_ptr_array_new_with_free_func(g_object_unref);
1447 g_autoptr(FlKeyEmbedderResponder) responder =
1452 GdkModifierType
state =
1453 static_cast<GdkModifierType
>(GDK_MOD2_MASK | GDK_CONTROL_MASK);
1457 g_autoptr(FlKeyEvent)
event =
1462 EXPECT_EQ(call_records->len, 2u);
1463 FlKeyEmbedderCallRecord* record =
1464 FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
1465 EXPECT_EQ(record->event->timestamp, 101000);
1466 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
1467 EXPECT_EQ(record->event->physical, kPhysicalNumLock);
1468 EXPECT_EQ(record->event->logical, kLogicalNumLock);
1469 EXPECT_STREQ(record->event->character,
nullptr);
1470 EXPECT_EQ(record->event->synthesized,
true);
1472 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 1));
1473 EXPECT_EQ(record->event->timestamp, 101000);
1474 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
1475 EXPECT_EQ(record->event->physical, kPhysicalControlLeft);
1476 EXPECT_EQ(record->event->logical, kLogicalControlLeft);
1477 EXPECT_STREQ(record->event->character,
nullptr);
1478 EXPECT_EQ(record->event->synthesized,
true);
1491 TEST(FlKeyEmbedderResponderTest, HandlesShiftAltVersusGroupNext) {
1492 g_autoptr(GPtrArray) call_records =
1493 g_ptr_array_new_with_free_func(g_object_unref);
1494 g_autoptr(FlKeyEmbedderResponder) responder =
1498 guint32 now_time = 1;
1500 auto send_key_event = [responder, &now_time](
bool is_press, guint keyval,
1502 GdkModifierType
state) {
1505 g_autoptr(FlKeyEvent)
event =
1512 GDK_MODIFIER_RESERVED_25_MASK);
1513 EXPECT_EQ(call_records->len, 1u);
1514 FlKeyEmbedderCallRecord* record =
1515 FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
1516 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
1517 EXPECT_EQ(record->event->physical, kPhysicalShiftLeft);
1518 EXPECT_EQ(record->event->logical, kLogicalShiftLeft);
1519 EXPECT_EQ(record->event->synthesized,
false);
1522 static_cast<GdkModifierType
>(GDK_SHIFT_MASK |
1523 GDK_MODIFIER_RESERVED_25_MASK));
1524 EXPECT_EQ(call_records->len, 2u);
1525 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 1));
1526 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
1527 EXPECT_EQ(record->event->physical, kPhysicalAltRight);
1528 EXPECT_EQ(record->event->logical, kLogicalMetaRight);
1529 EXPECT_EQ(record->event->synthesized,
false);
1531 send_key_event(kRelease, GDK_KEY_ISO_Next_Group, kKeyCodeShiftLeft,
1532 static_cast<GdkModifierType
>(GDK_SHIFT_MASK | GDK_MOD1_MASK |
1533 GDK_MODIFIER_RESERVED_25_MASK));
1534 EXPECT_EQ(call_records->len, 5u);
1535 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 2));
1536 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
1537 EXPECT_EQ(record->event->physical, kPhysicalAltLeft);
1538 EXPECT_EQ(record->event->logical, kLogicalAltLeft);
1539 EXPECT_EQ(record->event->synthesized,
true);
1541 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 3));
1542 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeUp);
1543 EXPECT_EQ(record->event->physical, kPhysicalAltRight);
1544 EXPECT_EQ(record->event->logical, kLogicalMetaRight);
1545 EXPECT_EQ(record->event->synthesized,
true);
1547 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 4));
1548 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeUp);
1549 EXPECT_EQ(record->event->physical, kPhysicalShiftLeft);
1550 EXPECT_EQ(record->event->logical, kLogicalShiftLeft);
1551 EXPECT_EQ(record->event->synthesized,
false);
1553 send_key_event(kPress, GDK_KEY_ISO_Next_Group, kKeyCodeShiftLeft,
1554 static_cast<GdkModifierType
>(GDK_MOD1_MASK |
1555 GDK_MODIFIER_RESERVED_25_MASK));
1556 EXPECT_EQ(call_records->len, 6u);
1557 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 5));
1558 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
1559 EXPECT_EQ(record->event->physical, kPhysicalShiftLeft);
1560 EXPECT_EQ(record->event->logical, kLogicalGroupNext);
1561 EXPECT_EQ(record->event->synthesized,
false);
1563 send_key_event(kRelease, GDK_KEY_ISO_Level3_Shift, kKeyCodeAltRight,
1564 static_cast<GdkModifierType
>(GDK_MOD1_MASK |
1565 GDK_MODIFIER_RESERVED_13_MASK |
1566 GDK_MODIFIER_RESERVED_25_MASK));
1567 EXPECT_EQ(call_records->len, 7u);
1568 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 6));
1569 EXPECT_EQ(record->event->physical, 0u);
1570 EXPECT_EQ(record->event->logical, 0u);
1573 static_cast<GdkModifierType
>(GDK_MODIFIER_RESERVED_13_MASK |
1574 GDK_MODIFIER_RESERVED_25_MASK));
1575 EXPECT_EQ(call_records->len, 9u);
1576 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 7));
1577 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeUp);
1578 EXPECT_EQ(record->event->physical, kPhysicalAltLeft);
1579 EXPECT_EQ(record->event->logical, kLogicalAltLeft);
1580 EXPECT_EQ(record->event->synthesized,
true);
1582 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 8));
1583 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeUp);
1584 EXPECT_EQ(record->event->physical, kPhysicalShiftLeft);
1585 EXPECT_EQ(record->event->logical, kLogicalGroupNext);
1586 EXPECT_EQ(record->event->synthesized,
false);
1595 TEST(FlKeyEmbedderResponderTest, HandlesShiftAltLeftIsMetaLeft) {
1596 g_autoptr(GPtrArray) call_records =
1597 g_ptr_array_new_with_free_func(g_object_unref);
1598 g_autoptr(FlKeyEmbedderResponder) responder =
1602 guint32 now_time = 1;
1604 auto send_key_event = [responder, &now_time](
bool is_press, guint keyval,
1606 GdkModifierType
state) {
1609 g_autoptr(FlKeyEvent)
event =
1617 GDK_MODIFIER_RESERVED_25_MASK);
1618 EXPECT_EQ(call_records->len, 1u);
1619 FlKeyEmbedderCallRecord* record =
1620 FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
1621 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
1622 EXPECT_EQ(record->event->physical, kPhysicalShiftLeft);
1623 EXPECT_EQ(record->event->logical, kLogicalShiftLeft);
1624 EXPECT_EQ(record->event->synthesized,
false);
1627 static_cast<GdkModifierType
>(GDK_SHIFT_MASK |
1628 GDK_MODIFIER_RESERVED_25_MASK));
1629 EXPECT_EQ(call_records->len, 2u);
1630 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 1));
1631 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
1632 EXPECT_EQ(record->event->physical, kPhysicalMetaLeft);
1633 EXPECT_EQ(record->event->logical, kLogicalMetaLeft);
1634 EXPECT_EQ(record->event->synthesized,
false);
1637 static_cast<GdkModifierType
>(GDK_MODIFIER_RESERVED_13_MASK |
1638 GDK_MODIFIER_RESERVED_25_MASK));
1640 GDK_MODIFIER_RESERVED_25_MASK);
1645 GDK_MODIFIER_RESERVED_25_MASK);
1646 EXPECT_EQ(call_records->len, 1u);
1647 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 0));
1648 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
1649 EXPECT_EQ(record->event->physical, kPhysicalShiftRight);
1650 EXPECT_EQ(record->event->logical, kLogicalShiftRight);
1651 EXPECT_EQ(record->event->synthesized,
false);
1654 static_cast<GdkModifierType
>(GDK_SHIFT_MASK |
1655 GDK_MODIFIER_RESERVED_25_MASK));
1656 EXPECT_EQ(call_records->len, 2u);
1657 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(call_records, 1));
1658 EXPECT_EQ(record->event->type, kFlutterKeyEventTypeDown);
1659 EXPECT_EQ(record->event->physical, kPhysicalMetaLeft);
1660 EXPECT_EQ(record->event->logical, kLogicalMetaLeft);
1661 EXPECT_EQ(record->event->synthesized,
false);