5#include "flutter/shell/platform/linux/fl_key_embedder_responder.h"
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"
11#include "flutter/shell/platform/linux/fl_binary_messenger_private.h"
12#include "flutter/shell/platform/linux/fl_engine_private.h"
13#include "flutter/shell/platform/linux/testing/fl_test.h"
16constexpr gboolean kRelease =
FALSE;
19constexpr gboolean kIsModifier =
TRUE;
20constexpr gboolean kIsNotModifier =
FALSE;
22constexpr guint16 kKeyCodeDigit1 = 0x0au;
23constexpr guint16 kKeyCodeKeyA = 0x26u;
25constexpr guint16 kKeyCodeShiftRight = 0x3Eu;
26constexpr guint16 kKeyCodeAltLeft = 0x40u;
27constexpr guint16 kKeyCodeAltRight = 0x6Cu;
28constexpr guint16 kKeyCodeNumpad1 = 0x57u;
29constexpr guint16 kKeyCodeNumLock = 0x4Du;
30constexpr guint16 kKeyCodeCapsLock = 0x42u;
32constexpr guint16 kKeyCodeControlRight = 0x69u;
38 g_ptr_array_remove_range(array, 0, array->len);
42 fl_key_embedder_call_record,
44 KEY_EMBEDDER_CALL_RECORD,
56 fl_key_embedder_call_record,
59static void fl_key_embedder_call_record_init(FlKeyEmbedderCallRecord*
self) {}
63 g_return_if_fail(FL_IS_KEY_EMBEDDER_CALL_RECORD(
object));
65 FlKeyEmbedderCallRecord*
self = FL_KEY_EMBEDDER_CALL_RECORD(
object);
66 if (
self->event !=
nullptr) {
67 g_free(
const_cast<char*
>(
self->event->character));
70 G_OBJECT_CLASS(fl_key_embedder_call_record_parent_class)->dispose(
object);
75 FlKeyEmbedderCallRecordClass* klass) {
83 g_return_val_if_fail(
event !=
nullptr,
nullptr);
85 FlKeyEmbedderCallRecord*
self = FL_KEY_EMBEDDER_CALL_RECORD(
86 g_object_new(fl_key_embedder_call_record_get_type(),
nullptr));
89 *clone_event = *
event;
90 if (
event->character !=
nullptr) {
91 size_t character_length = strlen(
event->character);
92 char* clone_character = g_new(
char, character_length + 1);
93 strncpy(clone_character,
event->character, character_length + 1);
96 self->event = clone_event;
119 GdkModifierType
state,
120 gboolean is_modifier) {
122 _g_key_event.time = time_in_milliseconds;
123 _g_key_event.state =
state;
124 _g_key_event.keyval = keyval;
125 _g_key_event.keycode = keycode;
126 _g_key_event.origin =
nullptr;
127 return &_g_key_event;
139 void* expected_user_data) {
140 g_return_if_fail(record->callback !=
nullptr);
147GPtrArray* g_call_records;
152 void* callback_user_data,
153 void* send_key_event_user_data) {
154 GPtrArray* records_array =
155 reinterpret_cast<GPtrArray*
>(send_key_event_user_data);
156 if (records_array !=
nullptr) {
163 g_ptr_array_free(g_call_records,
TRUE);
164 g_call_records =
nullptr;
168TEST(FlKeyEmbedderResponderTest, SendKeyEvent) {
169 EXPECT_EQ(g_call_records,
nullptr);
170 g_call_records = g_ptr_array_new_with_free_func(g_object_unref);
171 FlKeyResponder* responder = FL_KEY_RESPONDER(
175 FlKeyEmbedderCallRecord* record;
182 static_cast<GdkModifierType
>(0), kIsNotModifier),
185 EXPECT_EQ(g_call_records->len, 1u);
186 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
188 EXPECT_EQ(record->event->timestamp, 12345000);
192 EXPECT_STREQ(record->event->character,
"a");
193 EXPECT_EQ(record->event->synthesized,
false);
202 static_cast<GdkModifierType
>(0), kIsNotModifier),
205 EXPECT_EQ(g_call_records->len, 1u);
206 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
208 EXPECT_EQ(record->event->timestamp, 12346000);
212 EXPECT_STREQ(record->event->character,
nullptr);
213 EXPECT_EQ(record->event->synthesized,
false);
223 static_cast<GdkModifierType
>(0), kIsNotModifier),
226 EXPECT_EQ(g_call_records->len, 1u);
227 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
229 EXPECT_EQ(record->event->timestamp, 12347000);
233 EXPECT_STREQ(record->event->character,
"q");
234 EXPECT_EQ(record->event->synthesized,
false);
243 static_cast<GdkModifierType
>(0), kIsNotModifier),
246 EXPECT_EQ(g_call_records->len, 1u);
247 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
249 EXPECT_EQ(record->event->timestamp, 12348000);
253 EXPECT_STREQ(record->event->character,
nullptr);
254 EXPECT_EQ(record->event->synthesized,
false);
260 g_object_unref(responder);
264TEST(FlKeyEmbedderResponderTest, UsesSpecifiedLogicalKey) {
265 EXPECT_EQ(g_call_records,
nullptr);
266 g_call_records = g_ptr_array_new_with_free_func(g_object_unref);
267 FlKeyResponder* responder = FL_KEY_RESPONDER(
271 FlKeyEmbedderCallRecord* record;
278 static_cast<GdkModifierType
>(0), kIsNotModifier),
281 EXPECT_EQ(g_call_records->len, 1u);
282 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
284 EXPECT_EQ(record->event->timestamp, 12345000);
288 EXPECT_STREQ(record->event->character,
"&");
289 EXPECT_EQ(record->event->synthesized,
false);
295 g_object_unref(responder);
299TEST(FlKeyEmbedderResponderTest, PressShiftDuringLetterKeyTap) {
300 EXPECT_EQ(g_call_records,
nullptr);
301 g_call_records = g_ptr_array_new_with_free_func(g_object_unref);
302 FlKeyResponder* responder = FL_KEY_RESPONDER(
306 FlKeyEmbedderCallRecord* record;
312 static_cast<GdkModifierType
>(0), kIsModifier),
315 EXPECT_EQ(g_call_records->len, 1u);
316 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
320 EXPECT_STREQ(record->event->character,
nullptr);
321 EXPECT_EQ(record->event->synthesized,
false);
330 GDK_SHIFT_MASK, kIsNotModifier),
333 EXPECT_EQ(g_call_records->len, 1u);
334 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
338 EXPECT_STREQ(record->event->character,
"A");
339 EXPECT_EQ(record->event->synthesized,
false);
348 kKeyCodeShiftRight, GDK_SHIFT_MASK, kIsModifier),
351 EXPECT_EQ(g_call_records->len, 1u);
352 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
356 EXPECT_STREQ(record->event->character,
nullptr);
357 EXPECT_EQ(record->event->synthesized,
false);
366 static_cast<GdkModifierType
>(0), kIsNotModifier),
369 EXPECT_EQ(g_call_records->len, 1u);
370 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
374 EXPECT_STREQ(record->event->character,
nullptr);
375 EXPECT_EQ(record->event->synthesized,
false);
381 g_object_unref(responder);
392TEST(FlKeyEmbedderResponderTest, TapNumPadKeysBetweenNumLockEvents) {
393 EXPECT_EQ(g_call_records,
nullptr);
394 g_call_records = g_ptr_array_new_with_free_func(g_object_unref);
395 FlKeyResponder* responder = FL_KEY_RESPONDER(
399 FlKeyEmbedderCallRecord* record;
405 static_cast<GdkModifierType
>(0), kIsNotModifier),
408 EXPECT_EQ(g_call_records->len, 1u);
409 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
413 EXPECT_STREQ(record->event->character,
nullptr);
414 EXPECT_EQ(record->event->synthesized,
false);
423 static_cast<GdkModifierType
>(0), kIsNotModifier),
426 EXPECT_EQ(g_call_records->len, 1u);
427 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
431 EXPECT_STREQ(record->event->character,
nullptr);
432 EXPECT_EQ(record->event->synthesized,
false);
441 GDK_MOD2_MASK, kIsNotModifier),
444 EXPECT_EQ(g_call_records->len, 1u);
445 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
449 EXPECT_STREQ(record->event->character,
nullptr);
450 EXPECT_EQ(record->event->synthesized,
false);
459 GDK_MOD2_MASK, kIsModifier),
462 EXPECT_EQ(g_call_records->len, 1u);
463 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
467 EXPECT_STREQ(record->event->character,
nullptr);
468 EXPECT_EQ(record->event->synthesized,
false);
477 GDK_MOD2_MASK, kIsNotModifier),
480 EXPECT_EQ(g_call_records->len, 1u);
481 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
485 EXPECT_STREQ(record->event->character,
nullptr);
486 EXPECT_EQ(record->event->synthesized,
false);
495 GDK_MOD2_MASK, kIsNotModifier),
498 EXPECT_EQ(g_call_records->len, 1u);
499 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
503 EXPECT_STREQ(record->event->character,
nullptr);
504 EXPECT_EQ(record->event->synthesized,
false);
513 GDK_MOD2_MASK, kIsNotModifier),
516 EXPECT_EQ(g_call_records->len, 1u);
517 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
521 EXPECT_STREQ(record->event->character,
nullptr);
522 EXPECT_EQ(record->event->synthesized,
false);
531 GDK_MOD2_MASK, kIsModifier),
534 EXPECT_EQ(g_call_records->len, 1u);
535 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
539 EXPECT_STREQ(record->event->character,
nullptr);
540 EXPECT_EQ(record->event->synthesized,
false);
546 g_object_unref(responder);
553TEST(FlKeyEmbedderResponderTest, ReleaseShiftKeyBetweenDigitKeyEvents) {
554 EXPECT_EQ(g_call_records,
nullptr);
555 g_call_records = g_ptr_array_new_with_free_func(g_object_unref);
556 FlKeyResponder* responder = FL_KEY_RESPONDER(
560 FlKeyEmbedderCallRecord* record;
562 GdkModifierType
state =
static_cast<GdkModifierType
>(0);
571 EXPECT_EQ(g_call_records->len, 1u);
572 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
576 EXPECT_STREQ(record->event->character,
nullptr);
577 EXPECT_EQ(record->event->synthesized,
false);
582 state = GDK_SHIFT_MASK;
588 state, kIsNotModifier),
591 EXPECT_EQ(g_call_records->len, 1u);
592 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
596 EXPECT_STREQ(record->event->character,
"!");
597 EXPECT_EQ(record->event->synthesized,
false);
609 EXPECT_EQ(g_call_records->len, 1u);
610 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
614 EXPECT_STREQ(record->event->character,
nullptr);
615 EXPECT_EQ(record->event->synthesized,
false);
620 state =
static_cast<GdkModifierType
>(0);
629 EXPECT_EQ(g_call_records->len, 1u);
630 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
634 EXPECT_STREQ(record->event->character,
nullptr);
635 EXPECT_EQ(record->event->synthesized,
false);
641 g_object_unref(responder);
648TEST(FlKeyEmbedderResponderTest, TapLetterKeysBetweenCapsLockEvents) {
649 EXPECT_EQ(g_call_records,
nullptr);
650 g_call_records = g_ptr_array_new_with_free_func(g_object_unref);
651 FlKeyResponder* responder = FL_KEY_RESPONDER(
655 FlKeyEmbedderCallRecord* record;
661 static_cast<GdkModifierType
>(0), kIsModifier),
664 EXPECT_EQ(g_call_records->len, 1u);
665 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
669 EXPECT_STREQ(record->event->character,
nullptr);
670 EXPECT_EQ(record->event->synthesized,
false);
679 GDK_LOCK_MASK, kIsNotModifier),
682 EXPECT_EQ(g_call_records->len, 1u);
683 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
687 EXPECT_STREQ(record->event->character,
"A");
688 EXPECT_EQ(record->event->synthesized,
false);
697 kKeyCodeCapsLock, GDK_LOCK_MASK, kIsModifier),
700 EXPECT_EQ(g_call_records->len, 1u);
701 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
705 EXPECT_STREQ(record->event->character,
nullptr);
706 EXPECT_EQ(record->event->synthesized,
false);
715 GDK_LOCK_MASK, kIsNotModifier),
718 EXPECT_EQ(g_call_records->len, 1u);
719 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
723 EXPECT_STREQ(record->event->character,
nullptr);
724 EXPECT_EQ(record->event->synthesized,
false);
733 GDK_LOCK_MASK, kIsModifier),
736 EXPECT_EQ(g_call_records->len, 1u);
737 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
741 EXPECT_STREQ(record->event->character,
nullptr);
742 EXPECT_EQ(record->event->synthesized,
false);
751 GDK_LOCK_MASK, kIsNotModifier),
754 EXPECT_EQ(g_call_records->len, 1u);
755 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
759 EXPECT_STREQ(record->event->character,
"A");
760 EXPECT_EQ(record->event->synthesized,
false);
769 kKeyCodeCapsLock, GDK_LOCK_MASK, kIsModifier),
772 EXPECT_EQ(g_call_records->len, 1u);
773 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
777 EXPECT_STREQ(record->event->character,
nullptr);
778 EXPECT_EQ(record->event->synthesized,
false);
787 static_cast<GdkModifierType
>(0), kIsNotModifier),
790 EXPECT_EQ(g_call_records->len, 1u);
791 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
795 EXPECT_STREQ(record->event->character,
nullptr);
796 EXPECT_EQ(record->event->synthesized,
false);
802 g_object_unref(responder);
809TEST(FlKeyEmbedderResponderTest, TapLetterKeysBetweenCapsLockEventsReversed) {
810 EXPECT_EQ(g_call_records,
nullptr);
811 g_call_records = g_ptr_array_new_with_free_func(g_object_unref);
812 FlKeyResponder* responder = FL_KEY_RESPONDER(
816 FlKeyEmbedderCallRecord* record;
822 static_cast<GdkModifierType
>(0), kIsNotModifier),
825 EXPECT_EQ(g_call_records->len, 1u);
826 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
830 EXPECT_STREQ(record->event->character,
"a");
831 EXPECT_EQ(record->event->synthesized,
false);
840 GDK_LOCK_MASK, kIsModifier),
843 EXPECT_EQ(g_call_records->len, 1u);
844 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
848 EXPECT_STREQ(record->event->character,
nullptr);
849 EXPECT_EQ(record->event->synthesized,
false);
858 kKeyCodeCapsLock, GDK_LOCK_MASK, kIsModifier),
861 EXPECT_EQ(g_call_records->len, 1u);
862 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
866 EXPECT_STREQ(record->event->character,
nullptr);
867 EXPECT_EQ(record->event->synthesized,
false);
876 GDK_LOCK_MASK, kIsNotModifier),
879 EXPECT_EQ(g_call_records->len, 1u);
880 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
884 EXPECT_STREQ(record->event->character,
nullptr);
885 EXPECT_EQ(record->event->synthesized,
false);
894 GDK_LOCK_MASK, kIsNotModifier),
897 EXPECT_EQ(g_call_records->len, 1u);
898 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
902 EXPECT_STREQ(record->event->character,
"A");
903 EXPECT_EQ(record->event->synthesized,
false);
912 static_cast<GdkModifierType
>(0), kIsModifier),
915 EXPECT_EQ(g_call_records->len, 1u);
916 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
920 EXPECT_STREQ(record->event->character,
nullptr);
921 EXPECT_EQ(record->event->synthesized,
false);
930 kKeyCodeCapsLock, GDK_LOCK_MASK, kIsModifier),
933 EXPECT_EQ(g_call_records->len, 1u);
934 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
938 EXPECT_STREQ(record->event->character,
nullptr);
939 EXPECT_EQ(record->event->synthesized,
false);
948 static_cast<GdkModifierType
>(0), kIsNotModifier),
951 EXPECT_EQ(g_call_records->len, 1u);
952 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
956 EXPECT_STREQ(record->event->character,
nullptr);
957 EXPECT_EQ(record->event->synthesized,
false);
963 g_object_unref(responder);
966TEST(FlKeyEmbedderResponderTest, TurnDuplicateDownEventsToRepeats) {
967 EXPECT_EQ(g_call_records,
nullptr);
968 g_call_records = g_ptr_array_new_with_free_func(g_object_unref);
969 FlKeyResponder* responder = FL_KEY_RESPONDER(
973 FlKeyEmbedderCallRecord* record;
979 static_cast<GdkModifierType
>(0), kIsNotModifier),
982 EXPECT_EQ(g_call_records->len, 1u);
984 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
993 static_cast<GdkModifierType
>(0), kIsNotModifier),
996 EXPECT_EQ(g_call_records->len, 1u);
998 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
1002 EXPECT_STREQ(record->event->character,
"a");
1003 EXPECT_EQ(record->event->synthesized,
false);
1004 EXPECT_NE(record->callback,
nullptr);
1013 static_cast<GdkModifierType
>(0), kIsNotModifier),
1016 EXPECT_EQ(g_call_records->len, 1u);
1017 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
1022 g_object_unref(responder);
1025TEST(FlKeyEmbedderResponderTest, IgnoreAbruptUpEvent) {
1026 FlKeyEmbedderCallRecord* record;
1028 EXPECT_EQ(g_call_records,
nullptr);
1029 g_call_records = g_ptr_array_new_with_free_func(g_object_unref);
1030 FlKeyResponder* responder = FL_KEY_RESPONDER(
1039 static_cast<GdkModifierType
>(0), kIsNotModifier),
1042 EXPECT_EQ(g_call_records->len, 1u);
1044 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
1045 EXPECT_EQ(record->event->physical, 0ull);
1046 EXPECT_EQ(record->event->logical, 0ull);
1047 EXPECT_STREQ(record->event->character,
nullptr);
1048 EXPECT_EQ(record->event->synthesized,
false);
1049 EXPECT_EQ(record->callback,
nullptr);
1052 g_object_unref(responder);
1057TEST(FlKeyEmbedderResponderTest, SynthesizeForDesyncPressingStateOnSelfEvents) {
1058 EXPECT_EQ(g_call_records,
nullptr);
1059 g_call_records = g_ptr_array_new_with_free_func(g_object_unref);
1060 FlKeyResponder* responder = FL_KEY_RESPONDER(
1064 FlKeyEmbedderCallRecord* record;
1069 GdkModifierType
state = GDK_CONTROL_MASK;
1078 EXPECT_EQ(g_call_records->len, 2u);
1079 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
1080 EXPECT_EQ(record->event->timestamp, 101000);
1084 EXPECT_STREQ(record->event->character,
nullptr);
1085 EXPECT_EQ(record->event->synthesized,
true);
1087 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 1));
1088 EXPECT_EQ(record->event->timestamp, 101000);
1092 EXPECT_STREQ(record->event->character,
nullptr);
1093 EXPECT_EQ(record->event->synthesized,
false);
1101 state =
static_cast<GdkModifierType
>(0);
1107 EXPECT_EQ(g_call_records->len, 1u);
1108 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
1113 state =
static_cast<GdkModifierType
>(0);
1122 EXPECT_EQ(g_call_records->len, 2u);
1123 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
1124 EXPECT_EQ(record->event->timestamp, 103000);
1128 EXPECT_STREQ(record->event->character,
nullptr);
1129 EXPECT_EQ(record->event->synthesized,
true);
1131 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 1));
1132 EXPECT_EQ(record->event->timestamp, 103000);
1136 EXPECT_STREQ(record->event->character,
nullptr);
1137 EXPECT_EQ(record->event->synthesized,
false);
1143 state = GDK_CONTROL_MASK;
1149 EXPECT_EQ(g_call_records->len, 1u);
1150 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
1157 state = GDK_CONTROL_MASK;
1163 kKeyCodeControlRight,
state, kIsModifier),
1170 EXPECT_EQ(g_call_records->len, 1u);
1171 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
1172 EXPECT_EQ(record->event->timestamp, 105000);
1176 EXPECT_STREQ(record->event->character,
nullptr);
1177 EXPECT_EQ(record->event->synthesized,
true);
1182 g_object_unref(responder);
1188 SynthesizeForDesyncPressingStateOnNonSelfEvents) {
1189 EXPECT_EQ(g_call_records,
nullptr);
1190 g_call_records = g_ptr_array_new_with_free_func(g_object_unref);
1191 FlKeyResponder* responder = FL_KEY_RESPONDER(
1195 FlKeyEmbedderCallRecord* record;
1198 GdkModifierType
state = GDK_CONTROL_MASK;
1207 EXPECT_EQ(g_call_records->len, 2u);
1208 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
1209 EXPECT_EQ(record->event->timestamp, 101000);
1213 EXPECT_STREQ(record->event->character,
nullptr);
1214 EXPECT_EQ(record->event->synthesized,
true);
1216 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 1));
1217 EXPECT_EQ(record->event->timestamp, 101000);
1221 EXPECT_STREQ(record->event->character,
"a");
1222 EXPECT_EQ(record->event->synthesized,
false);
1228 state =
static_cast<GdkModifierType
>(0);
1237 EXPECT_EQ(g_call_records->len, 2u);
1238 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
1239 EXPECT_EQ(record->event->timestamp, 102000);
1243 EXPECT_STREQ(record->event->character,
nullptr);
1244 EXPECT_EQ(record->event->synthesized,
true);
1246 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 1));
1247 EXPECT_EQ(record->event->timestamp, 102000);
1251 EXPECT_STREQ(record->event->character,
nullptr);
1252 EXPECT_EQ(record->event->synthesized,
false);
1260 state =
static_cast<GdkModifierType
>(0);
1265 state, kIsModifier),
1268 EXPECT_EQ(g_call_records->len, 1u);
1269 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
1270 EXPECT_EQ(record->event->timestamp, 101000);
1274 EXPECT_STREQ(record->event->character,
nullptr);
1275 EXPECT_EQ(record->event->synthesized,
false);
1281 state =
static_cast<GdkModifierType
>(0);
1292 EXPECT_EQ(g_call_records->len, 2u);
1293 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
1294 EXPECT_EQ(record->event->timestamp, 102000);
1298 EXPECT_STREQ(record->event->character,
nullptr);
1299 EXPECT_EQ(record->event->synthesized,
true);
1301 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 1));
1302 EXPECT_EQ(record->event->timestamp, 102000);
1306 EXPECT_STREQ(record->event->character,
"A");
1307 EXPECT_EQ(record->event->synthesized,
false);
1313 g_object_unref(responder);
1319 SynthesizeForDesyncPressingStateOnRemappedEvents) {
1320 EXPECT_EQ(g_call_records,
nullptr);
1321 g_call_records = g_ptr_array_new_with_free_func(g_object_unref);
1322 FlKeyResponder* responder = FL_KEY_RESPONDER(
1326 FlKeyEmbedderCallRecord* record;
1329 GdkModifierType
state =
static_cast<GdkModifierType
>(0);
1334 state, kIsModifier),
1337 EXPECT_EQ(g_call_records->len, 1u);
1338 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
1339 EXPECT_EQ(record->event->timestamp, 101000);
1343 EXPECT_STREQ(record->event->character,
nullptr);
1344 EXPECT_EQ(record->event->synthesized,
false);
1350 state =
static_cast<GdkModifierType
>(0);
1361 EXPECT_EQ(g_call_records->len, 2u);
1362 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
1363 EXPECT_EQ(record->event->timestamp, 102000);
1367 EXPECT_STREQ(record->event->character,
nullptr);
1368 EXPECT_EQ(record->event->synthesized,
true);
1370 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 1));
1371 EXPECT_EQ(record->event->timestamp, 102000);
1375 EXPECT_STREQ(record->event->character,
"A");
1376 EXPECT_EQ(record->event->synthesized,
false);
1382 g_object_unref(responder);
1387TEST(FlKeyEmbedderResponderTest, SynthesizeForDesyncLockModeOnNonSelfEvents) {
1388 EXPECT_EQ(g_call_records,
nullptr);
1389 g_call_records = g_ptr_array_new_with_free_func(g_object_unref);
1390 FlKeyResponder* responder = FL_KEY_RESPONDER(
1394 FlKeyEmbedderCallRecord* record;
1397 GdkModifierType
state = GDK_MOD2_MASK;
1406 EXPECT_EQ(g_call_records->len, 2u);
1407 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
1408 EXPECT_EQ(record->event->timestamp, 101000);
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(g_call_records, 1));
1416 EXPECT_EQ(record->event->timestamp, 101000);
1420 EXPECT_STREQ(record->event->character,
"a");
1421 EXPECT_EQ(record->event->synthesized,
false);
1427 state =
static_cast<GdkModifierType
>(0);
1436 EXPECT_EQ(g_call_records->len, 4u);
1437 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
1438 EXPECT_EQ(record->event->timestamp, 102000);
1442 EXPECT_STREQ(record->event->character,
nullptr);
1443 EXPECT_EQ(record->event->synthesized,
true);
1445 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 1));
1446 EXPECT_EQ(record->event->timestamp, 102000);
1450 EXPECT_STREQ(record->event->character,
nullptr);
1451 EXPECT_EQ(record->event->synthesized,
true);
1453 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 2));
1454 EXPECT_EQ(record->event->timestamp, 102000);
1458 EXPECT_STREQ(record->event->character,
nullptr);
1459 EXPECT_EQ(record->event->synthesized,
true);
1461 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 3));
1462 EXPECT_EQ(record->event->timestamp, 102000);
1466 EXPECT_STREQ(record->event->character,
nullptr);
1467 EXPECT_EQ(record->event->synthesized,
false);
1478 state, kIsModifier),
1481 EXPECT_EQ(g_call_records->len, 1u);
1482 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
1483 EXPECT_EQ(record->event->physical, 0ull);
1484 EXPECT_EQ(record->event->logical, 0ull);
1485 EXPECT_STREQ(record->event->character,
nullptr);
1486 EXPECT_EQ(record->event->synthesized,
false);
1487 EXPECT_EQ(record->callback,
nullptr);
1490 g_object_unref(responder);
1495TEST(FlKeyEmbedderResponderTest, SynthesizeForDesyncLockModeOnSelfEvents) {
1496 EXPECT_EQ(g_call_records,
nullptr);
1497 g_call_records = g_ptr_array_new_with_free_func(g_object_unref);
1498 FlKeyResponder* responder = FL_KEY_RESPONDER(
1502 FlKeyEmbedderCallRecord* record;
1505 GdkModifierType
state = GDK_MOD2_MASK;
1511 state, kIsModifier),
1514 EXPECT_EQ(g_call_records->len, 3u);
1515 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
1516 EXPECT_EQ(record->event->timestamp, 101000);
1520 EXPECT_STREQ(record->event->character,
nullptr);
1521 EXPECT_EQ(record->event->synthesized,
true);
1523 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 1));
1524 EXPECT_EQ(record->event->timestamp, 101000);
1528 EXPECT_STREQ(record->event->character,
nullptr);
1529 EXPECT_EQ(record->event->synthesized,
true);
1531 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 2));
1532 EXPECT_EQ(record->event->timestamp, 101000);
1536 EXPECT_STREQ(record->event->character,
nullptr);
1537 EXPECT_EQ(record->event->synthesized,
false);
1543 state = GDK_MOD2_MASK;
1549 state, kIsModifier),
1552 EXPECT_EQ(g_call_records->len, 4u);
1553 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
1554 EXPECT_EQ(record->event->timestamp, 102000);
1558 EXPECT_STREQ(record->event->character,
nullptr);
1559 EXPECT_EQ(record->event->synthesized,
true);
1561 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 1));
1562 EXPECT_EQ(record->event->timestamp, 102000);
1566 EXPECT_STREQ(record->event->character,
nullptr);
1567 EXPECT_EQ(record->event->synthesized,
true);
1569 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 2));
1570 EXPECT_EQ(record->event->timestamp, 102000);
1574 EXPECT_STREQ(record->event->character,
nullptr);
1575 EXPECT_EQ(record->event->synthesized,
true);
1577 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 3));
1578 EXPECT_EQ(record->event->timestamp, 102000);
1582 EXPECT_STREQ(record->event->character,
nullptr);
1583 EXPECT_EQ(record->event->synthesized,
false);
1589 g_object_unref(responder);
1594TEST(FlKeyEmbedderResponderTest, SynthesizationOccursOnIgnoredEvents) {
1595 EXPECT_EQ(g_call_records,
nullptr);
1596 g_call_records = g_ptr_array_new_with_free_func(g_object_unref);
1597 FlKeyResponder* responder = FL_KEY_RESPONDER(
1601 FlKeyEmbedderCallRecord* record;
1604 GdkModifierType
state =
1605 static_cast<GdkModifierType
>(GDK_MOD2_MASK | GDK_CONTROL_MASK);
1615 EXPECT_EQ(g_call_records->len, 2u);
1616 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
1617 EXPECT_EQ(record->event->timestamp, 101000);
1621 EXPECT_STREQ(record->event->character,
nullptr);
1622 EXPECT_EQ(record->event->synthesized,
true);
1624 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 1));
1625 EXPECT_EQ(record->event->timestamp, 101000);
1629 EXPECT_STREQ(record->event->character,
nullptr);
1630 EXPECT_EQ(record->event->synthesized,
true);
1635 g_object_unref(responder);
1648TEST(FlKeyEmbedderResponderTest, HandlesShiftAltVersusGroupNext) {
1649 EXPECT_EQ(g_call_records,
nullptr);
1650 g_call_records = g_ptr_array_new_with_free_func(g_object_unref);
1651 FlKeyResponder* responder = FL_KEY_RESPONDER(
1655 guint32 now_time = 1;
1657 auto send_key_event = [responder, &now_time](
bool is_press, guint keyval,
1659 GdkModifierType
state) {
1669 FlKeyEmbedderCallRecord* record;
1672 GDK_MODIFIER_RESERVED_25_MASK);
1673 EXPECT_EQ(g_call_records->len, 1u);
1674 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
1678 EXPECT_EQ(record->event->synthesized,
false);
1681 static_cast<GdkModifierType
>(GDK_SHIFT_MASK |
1682 GDK_MODIFIER_RESERVED_25_MASK));
1683 EXPECT_EQ(g_call_records->len, 2u);
1684 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 1));
1688 EXPECT_EQ(record->event->synthesized,
false);
1691 static_cast<GdkModifierType
>(GDK_SHIFT_MASK | GDK_MOD1_MASK |
1692 GDK_MODIFIER_RESERVED_25_MASK));
1693 EXPECT_EQ(g_call_records->len, 5u);
1694 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 2));
1698 EXPECT_EQ(record->event->synthesized,
true);
1700 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 3));
1704 EXPECT_EQ(record->event->synthesized,
true);
1706 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 4));
1710 EXPECT_EQ(record->event->synthesized,
false);
1713 static_cast<GdkModifierType
>(GDK_MOD1_MASK |
1714 GDK_MODIFIER_RESERVED_25_MASK));
1715 EXPECT_EQ(g_call_records->len, 6u);
1716 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 5));
1720 EXPECT_EQ(record->event->synthesized,
false);
1722 send_key_event(kRelease, GDK_KEY_ISO_Level3_Shift, kKeyCodeAltRight,
1723 static_cast<GdkModifierType
>(GDK_MOD1_MASK |
1724 GDK_MODIFIER_RESERVED_13_MASK |
1725 GDK_MODIFIER_RESERVED_25_MASK));
1726 EXPECT_EQ(g_call_records->len, 7u);
1727 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 6));
1728 EXPECT_EQ(record->event->physical, 0u);
1729 EXPECT_EQ(record->event->logical, 0u);
1732 static_cast<GdkModifierType
>(GDK_MODIFIER_RESERVED_13_MASK |
1733 GDK_MODIFIER_RESERVED_25_MASK));
1734 EXPECT_EQ(g_call_records->len, 9u);
1735 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 7));
1739 EXPECT_EQ(record->event->synthesized,
true);
1741 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 8));
1745 EXPECT_EQ(record->event->synthesized,
false);
1748 g_object_unref(responder);
1757TEST(FlKeyEmbedderResponderTest, HandlesShiftAltLeftIsMetaLeft) {
1758 EXPECT_EQ(g_call_records,
nullptr);
1759 g_call_records = g_ptr_array_new_with_free_func(g_object_unref);
1760 FlKeyResponder* responder = FL_KEY_RESPONDER(
1764 guint32 now_time = 1;
1766 auto send_key_event = [responder, &now_time](
bool is_press, guint keyval,
1768 GdkModifierType
state) {
1778 FlKeyEmbedderCallRecord* record;
1782 GDK_MODIFIER_RESERVED_25_MASK);
1783 EXPECT_EQ(g_call_records->len, 1u);
1784 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
1788 EXPECT_EQ(record->event->synthesized,
false);
1791 static_cast<GdkModifierType
>(GDK_SHIFT_MASK |
1792 GDK_MODIFIER_RESERVED_25_MASK));
1793 EXPECT_EQ(g_call_records->len, 2u);
1794 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 1));
1798 EXPECT_EQ(record->event->synthesized,
false);
1801 static_cast<GdkModifierType
>(GDK_MODIFIER_RESERVED_13_MASK |
1802 GDK_MODIFIER_RESERVED_25_MASK));
1804 GDK_MODIFIER_RESERVED_25_MASK);
1809 GDK_MODIFIER_RESERVED_25_MASK);
1810 EXPECT_EQ(g_call_records->len, 1u);
1811 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 0));
1815 EXPECT_EQ(record->event->synthesized,
false);
1818 static_cast<GdkModifierType
>(GDK_SHIFT_MASK |
1819 GDK_MODIFIER_RESERVED_25_MASK));
1820 EXPECT_EQ(g_call_records->len, 2u);
1821 record = FL_KEY_EMBEDDER_CALL_RECORD(g_ptr_array_index(g_call_records, 1));
1825 EXPECT_EQ(record->event->synthesized,
false);
1828 g_object_unref(responder);
void(* FlutterKeyEventCallback)(bool, void *)
@ kFlutterKeyEventTypeDown
@ kFlutterKeyEventTypeRepeat
FlKeyEvent uint64_t FlKeyResponderAsyncCallback callback
static gboolean expected_handled
FlKeyEmbedderResponder * fl_key_embedder_responder_new(EmbedderSendKeyEvent send_key_event, void *send_key_event_user_data)
static void invoke_record_callback_and_verify(FlKeyEmbedderCallRecord *record, bool expected_handled, void *expected_user_data)
static void record_calls(const FlutterKeyEvent *event, FlutterKeyEventCallback callback, void *callback_user_data, void *send_key_event_user_data)
G_DEFINE_TYPE(FlKeyEmbedderCallRecord, fl_key_embedder_call_record, G_TYPE_OBJECT) static void fl_key_embedder_call_record_init(FlKeyEmbedderCallRecord *self)
static void verify_response_handled(bool handled, gpointer user_data)
TEST(FlKeyEmbedderResponderTest, SendKeyEvent)
static void clear_g_call_records()
static gpointer g_expected_user_data
static FlKeyEvent * fl_key_event_new_by_mock(guint32 time_in_milliseconds, bool is_press, guint keyval, guint16 keycode, GdkModifierType state, gboolean is_modifier)
static void fl_key_embedder_call_record_dispose(GObject *object)
static void g_ptr_array_clear(GPtrArray *array)
static gboolean g_expected_handled
static void fl_key_embedder_call_record_class_init(FlKeyEmbedderCallRecordClass *klass)
G_DECLARE_FINAL_TYPE(FlKeyEmbedderCallRecord, fl_key_embedder_call_record, FL, KEY_EMBEDDER_CALL_RECORD, GObject)
static FlKeyEmbedderCallRecord * fl_key_embedder_call_record_new(const FlutterKeyEvent *event, FlutterKeyEventCallback callback, gpointer user_data)
void fl_key_responder_handle_event(FlKeyResponder *self, FlKeyEvent *event, FlKeyResponderAsyncCallback callback, gpointer user_data, uint64_t specified_logical_key)
static void send_key_event(FlTextInputPlugin *plugin, gint keyval, gint state=0)
constexpr uint64_t kPhysicalAltRight
constexpr uint64_t kLogicalShiftRight
constexpr uint64_t kLogicalNumpad1
constexpr uint64_t kPhysicalNumLock
constexpr uint64_t kPhysicalControlLeft
constexpr uint64_t kPhysicalShiftLeft
constexpr uint64_t kLogicalDigit1
constexpr uint64_t kLogicalMetaRight
constexpr uint64_t kLogicalControlLeft
constexpr uint64_t kPhysicalKeyA
constexpr uint64_t kLogicalMetaLeft
constexpr uint64_t kPhysicalCapsLock
constexpr uint64_t kLogicalKeyQ
constexpr uint64_t kLogicalGroupNext
constexpr uint64_t kLogicalKeyA
constexpr uint64_t kPhysicalDigit1
constexpr uint64_t kPhysicalNumpad1
constexpr uint64_t kLogicalExclamation
constexpr uint64_t kLogicalCapsLock
constexpr uint64_t kPhysicalMetaLeft
constexpr uint64_t kPhysicalAltLeft
constexpr uint64_t kLogicalNumLock
constexpr uint64_t kLogicalAltLeft
constexpr uint64_t kLogicalShiftLeft
constexpr uint64_t kPhysicalShiftRight
constexpr int kKeyCodeShiftLeft
constexpr int kKeyCodeControlLeft
FlutterKeyEventCallback callback