6 #include "gtest/gtest.h"
8 #include "flutter/shell/platform/embedder/test_utils/proc_table_replacement.h"
13 #include "flutter/shell/platform/linux/testing/mock_renderable.h"
19 TEST(FlEngineTest, NotifyDisplayUpdate) {
23 g_autoptr(GError)
error =
nullptr;
25 EXPECT_EQ(
error,
nullptr);
30 ([&called](
auto engine, FlutterEngineDisplaysUpdateType update_type,
31 const FlutterEngineDisplay* displays,
size_t displays_length) {
33 EXPECT_EQ(update_type, kFlutterEngineDisplaysUpdateTypeStartup);
34 EXPECT_EQ(displays_length, 2u);
36 EXPECT_EQ(displays[0].display_id, 1u);
37 EXPECT_EQ(displays[0].refresh_rate, 60);
38 EXPECT_EQ(displays[0].
width, 1024u);
39 EXPECT_EQ(displays[0].
height, 768u);
40 EXPECT_EQ(displays[0].device_pixel_ratio, 1.0);
42 EXPECT_EQ(displays[1].display_id, 2u);
43 EXPECT_EQ(displays[1].refresh_rate, 120);
44 EXPECT_EQ(displays[1].
width, 3840u);
45 EXPECT_EQ(displays[1].
height, 2160u);
46 EXPECT_EQ(displays[1].device_pixel_ratio, 2.0);
51 FlutterEngineDisplay displays[2] = {
53 .struct_size =
sizeof(FlutterEngineDisplay),
55 .single_display =
false,
59 .device_pixel_ratio = 1.0,
62 .struct_size =
sizeof(FlutterEngineDisplay),
64 .single_display =
false,
65 .refresh_rate = 120.0,
68 .device_pixel_ratio = 2.0,
76 TEST(FlEngineTest, WindowMetrics) {
80 g_autoptr(GError)
error =
nullptr;
82 EXPECT_EQ(
error,
nullptr);
86 SendWindowMetricsEvent,
87 ([&called](
auto engine,
const FlutterWindowMetricsEvent* event) {
89 EXPECT_EQ(event->display_id, 99u);
90 EXPECT_EQ(event->view_id, 1);
91 EXPECT_EQ(event->width,
static_cast<size_t>(3840));
92 EXPECT_EQ(event->height,
static_cast<size_t>(2160));
93 EXPECT_EQ(event->pixel_ratio, 2.0);
104 TEST(FlEngineTest, MousePointer) {
111 ([&called](
auto engine,
const FlutterPointerEvent* events,
112 size_t events_count) {
114 EXPECT_EQ(events_count,
static_cast<size_t>(1));
115 EXPECT_EQ(events[0].
view_id, 1);
116 EXPECT_EQ(events[0].phase, kDown);
117 EXPECT_EQ(events[0].timestamp,
static_cast<size_t>(1234567890));
118 EXPECT_EQ(events[0].x, 800);
119 EXPECT_EQ(events[0].y, 600);
120 EXPECT_EQ(events[0].device,
static_cast<int32_t
>(0));
121 EXPECT_EQ(events[0].signal_kind, kFlutterPointerSignalKindScroll);
122 EXPECT_EQ(events[0].scroll_delta_x, 1.2);
123 EXPECT_EQ(events[0].scroll_delta_y, -3.4);
124 EXPECT_EQ(events[0].device_kind, kFlutterPointerDeviceKindMouse);
125 EXPECT_EQ(events[0].buttons, kFlutterPointerButtonMouseSecondary);
130 g_autoptr(GError)
error =
nullptr;
132 EXPECT_EQ(
error,
nullptr);
134 kFlutterPointerDeviceKindMouse, 1.2, -3.4,
135 kFlutterPointerButtonMouseSecondary);
141 TEST(FlEngineTest, PointerPanZoom) {
148 ([&called](
auto engine,
const FlutterPointerEvent* events,
149 size_t events_count) {
151 EXPECT_EQ(events_count,
static_cast<size_t>(1));
152 EXPECT_EQ(events[0].
view_id, 1);
153 EXPECT_EQ(events[0].phase, kPanZoomUpdate);
154 EXPECT_EQ(events[0].timestamp,
static_cast<size_t>(1234567890));
155 EXPECT_EQ(events[0].x, 800);
156 EXPECT_EQ(events[0].y, 600);
157 EXPECT_EQ(events[0].device,
static_cast<int32_t
>(1));
158 EXPECT_EQ(events[0].signal_kind, kFlutterPointerSignalKindNone);
159 EXPECT_EQ(events[0].pan_x, 1.5);
160 EXPECT_EQ(events[0].pan_y, 2.5);
161 EXPECT_EQ(events[0].scale, 3.5);
162 EXPECT_EQ(events[0].rotation, 4.5);
163 EXPECT_EQ(events[0].device_kind, kFlutterPointerDeviceKindTrackpad);
164 EXPECT_EQ(events[0].buttons, 0);
169 g_autoptr(GError)
error =
nullptr;
171 EXPECT_EQ(
error,
nullptr);
173 kPanZoomUpdate, 1.5, 2.5, 3.5, 4.5);
179 TEST(FlEngineTest, DispatchSemanticsAction) {
186 ([&called](
auto engine,
const FlutterSendSemanticsActionInfo* info) {
187 EXPECT_EQ(info->view_id,
static_cast<int64_t
>(456));
188 EXPECT_EQ(info->node_id,
static_cast<uint64_t
>(42));
189 EXPECT_EQ(info->action, kFlutterSemanticsActionTap);
190 EXPECT_EQ(info->data_length,
static_cast<size_t>(4));
191 EXPECT_EQ(info->data[0],
't');
192 EXPECT_EQ(info->data[1],
'e');
193 EXPECT_EQ(info->data[2],
's');
194 EXPECT_EQ(info->data[3],
't');
200 g_autoptr(GError)
error =
nullptr;
202 EXPECT_EQ(
error,
nullptr);
203 g_autoptr(GBytes) data = g_bytes_new_static(
"test", 4);
205 kFlutterSemanticsActionTap, data);
211 TEST(FlEngineTest, PlatformMessage) {
216 FlutterEngineSendPlatformMessageFnPtr old_handler =
220 ([&called, old_handler](
auto engine,
221 const FlutterPlatformMessage* message) {
222 if (strcmp(message->channel,
"test") != 0) {
223 return old_handler(engine, message);
228 EXPECT_EQ(message->message_size,
static_cast<size_t>(4));
229 EXPECT_EQ(message->message[0],
't');
230 EXPECT_EQ(message->message[1],
'e');
231 EXPECT_EQ(message->message[2],
's');
232 EXPECT_EQ(message->message[3],
't');
237 g_autoptr(GError)
error =
nullptr;
239 EXPECT_EQ(
error,
nullptr);
240 g_autoptr(GBytes) message = g_bytes_new_static(
"test", 4);
248 TEST(FlEngineTest, PlatformMessageResponse) {
255 SendPlatformMessageResponse,
256 ([&called](
auto engine,
257 const FlutterPlatformMessageResponseHandle* handle,
258 const uint8_t* data,
size_t data_length) {
263 reinterpret_cast<const FlutterPlatformMessageResponseHandle*
>(
265 EXPECT_EQ(data_length,
static_cast<size_t>(4));
266 EXPECT_EQ(data[0],
't');
267 EXPECT_EQ(data[1],
'e');
268 EXPECT_EQ(data[2],
's');
269 EXPECT_EQ(data[3],
't');
274 g_autoptr(GError)
error =
nullptr;
276 EXPECT_EQ(
error,
nullptr);
277 g_autoptr(GBytes) response = g_bytes_new_static(
"test", 4);
279 engine,
reinterpret_cast<const FlutterPlatformMessageResponseHandle*
>(42),
281 EXPECT_EQ(
error,
nullptr);
287 TEST(FlEngineTest, SettingsHandler) {
294 ([&called](
auto engine,
const FlutterPlatformMessage* message) {
297 EXPECT_STREQ(message->channel,
"flutter/settings");
300 g_autoptr(GBytes) data =
301 g_bytes_new(message->message, message->message_size);
302 g_autoptr(GError)
error =
nullptr;
304 FL_MESSAGE_CODEC(codec), data, &
error);
305 EXPECT_NE(settings,
nullptr);
306 EXPECT_EQ(
error,
nullptr);
310 EXPECT_NE(text_scale_factor,
nullptr);
313 FlValue* always_use_24hr_format =
315 EXPECT_NE(always_use_24hr_format,
nullptr);
321 EXPECT_NE(platform_brightness,
nullptr);
327 g_autoptr(GError)
error =
nullptr;
329 EXPECT_EQ(
error,
nullptr);
335 int* count =
reinterpret_cast<int*
>(
user_data);
340 TEST(FlEngineTest, OnPreEngineRestart) {
344 OnPreEngineRestartCallback callback;
345 void* callback_user_data;
349 Initialize, ([&callback, &callback_user_data, &called](
350 size_t version,
const FlutterRendererConfig* config,
352 FLUTTER_API_SYMBOL(FlutterEngine) * engine_out) {
354 callback =
args->on_pre_engine_restart_callback;
360 MOCK_ENGINE_PROC(RunInitialized, ([](
auto engine) {
return kSuccess; }));
362 g_autoptr(GError)
error =
nullptr;
364 EXPECT_EQ(
error,
nullptr);
367 EXPECT_NE(callback,
nullptr);
370 callback(callback_user_data);
378 g_signal_connect(engine,
"on-pre-engine-restart",
381 callback(callback_user_data);
385 TEST(FlEngineTest, DartEntrypointArgs) {
386 GPtrArray* args_array = g_ptr_array_new();
387 g_ptr_array_add(args_array,
const_cast<char*
>(
"arg_one"));
388 g_ptr_array_add(args_array,
const_cast<char*
>(
"arg_two"));
389 g_ptr_array_add(args_array,
const_cast<char*
>(
"arg_three"));
390 g_ptr_array_add(args_array,
nullptr);
391 gchar**
args =
reinterpret_cast<gchar**
>(g_ptr_array_free(args_array,
false));
399 Initialize, ([&called, &set_args =
args](
400 size_t version,
const FlutterRendererConfig* config,
402 FLUTTER_API_SYMBOL(FlutterEngine) * engine_out) {
404 EXPECT_NE(set_args,
args->dart_entrypoint_argv);
405 EXPECT_EQ(
args->dart_entrypoint_argc, 3);
410 MOCK_ENGINE_PROC(RunInitialized, ([](
auto engine) {
return kSuccess; }));
412 g_autoptr(GError)
error =
nullptr;
414 EXPECT_EQ(
error,
nullptr);
425 ([&engine_id](
size_t version,
const FlutterRendererConfig* config,
427 FLUTTER_API_SYMBOL(FlutterEngine) * engine_out) {
428 engine_id =
args->engine_id;
432 MOCK_ENGINE_PROC(RunInitialized, ([](
auto engine) {
return kSuccess; }));
434 g_autoptr(GError)
error =
nullptr;
436 EXPECT_EQ(
error,
nullptr);
437 EXPECT_TRUE(engine_id != 0);
442 TEST(FlEngineTest, UIIsolateOnPlatformTaskRunner) {
448 bool same_task_runner =
false;
452 ([&same_task_runner](
size_t version,
const FlutterRendererConfig* config,
454 FLUTTER_API_SYMBOL(FlutterEngine) * engine_out) {
455 same_task_runner =
args->custom_task_runners->platform_task_runner ==
456 args->custom_task_runners->ui_task_runner;
460 MOCK_ENGINE_PROC(RunInitialized, ([](
auto engine) {
return kSuccess; }));
462 g_autoptr(GError)
error =
nullptr;
464 EXPECT_EQ(
error,
nullptr);
465 EXPECT_TRUE(same_task_runner);
468 TEST(FlEngineTest, UIIsolateOnSeparateThread) {
474 bool separate_thread =
false;
478 ([&separate_thread](
size_t version,
const FlutterRendererConfig* config,
480 FLUTTER_API_SYMBOL(FlutterEngine) * engine_out) {
481 separate_thread =
args->custom_task_runners->ui_task_runner ==
nullptr;
485 MOCK_ENGINE_PROC(RunInitialized, ([](
auto engine) {
return kSuccess; }));
487 g_autoptr(GError)
error =
nullptr;
489 EXPECT_EQ(
error,
nullptr);
490 EXPECT_TRUE(separate_thread);
494 g_autofree gchar* initial_language = g_strdup(g_getenv(
"LANGUAGE"));
495 g_setenv(
"LANGUAGE",
"de:en_US",
TRUE);
502 UpdateLocales, ([&called](
auto engine,
const FlutterLocale** locales,
503 size_t locales_count) {
506 EXPECT_EQ(locales_count,
static_cast<size_t>(4));
508 EXPECT_STREQ(locales[0]->language_code,
"de");
509 EXPECT_STREQ(locales[0]->country_code,
nullptr);
510 EXPECT_STREQ(locales[0]->script_code,
nullptr);
511 EXPECT_STREQ(locales[0]->variant_code,
nullptr);
513 EXPECT_STREQ(locales[1]->language_code,
"en");
514 EXPECT_STREQ(locales[1]->country_code,
"US");
515 EXPECT_STREQ(locales[1]->script_code,
nullptr);
516 EXPECT_STREQ(locales[1]->variant_code,
nullptr);
518 EXPECT_STREQ(locales[2]->language_code,
"en");
519 EXPECT_STREQ(locales[2]->country_code,
nullptr);
520 EXPECT_STREQ(locales[2]->script_code,
nullptr);
521 EXPECT_STREQ(locales[2]->variant_code,
nullptr);
523 EXPECT_STREQ(locales[3]->language_code,
"C");
524 EXPECT_STREQ(locales[3]->country_code,
nullptr);
525 EXPECT_STREQ(locales[3]->script_code,
nullptr);
526 EXPECT_STREQ(locales[3]->variant_code,
nullptr);
531 g_autoptr(GError)
error =
nullptr;
533 EXPECT_EQ(
error,
nullptr);
537 if (initial_language) {
538 g_setenv(
"LANGUAGE", initial_language,
TRUE);
540 g_unsetenv(
"LANGUAGE");
545 g_autofree gchar* initial_language = g_strdup(g_getenv(
"LANGUAGE"));
546 g_setenv(
"LANGUAGE",
"C",
TRUE);
553 UpdateLocales, ([&called](
auto engine,
const FlutterLocale** locales,
554 size_t locales_count) {
557 EXPECT_EQ(locales_count,
static_cast<size_t>(1));
559 EXPECT_STREQ(locales[0]->language_code,
"C");
560 EXPECT_STREQ(locales[0]->country_code,
nullptr);
561 EXPECT_STREQ(locales[0]->script_code,
nullptr);
562 EXPECT_STREQ(locales[0]->variant_code,
nullptr);
567 g_autoptr(GError)
error =
nullptr;
569 EXPECT_EQ(
error,
nullptr);
573 if (initial_language) {
574 g_setenv(
"LANGUAGE", initial_language,
TRUE);
576 g_unsetenv(
"LANGUAGE");
580 TEST(FlEngineTest, DuplicateLocale) {
581 g_autofree gchar* initial_language = g_strdup(g_getenv(
"LANGUAGE"));
582 g_setenv(
"LANGUAGE",
"en:en",
TRUE);
589 UpdateLocales, ([&called](
auto engine,
const FlutterLocale** locales,
590 size_t locales_count) {
593 EXPECT_EQ(locales_count,
static_cast<size_t>(2));
595 EXPECT_STREQ(locales[0]->language_code,
"en");
596 EXPECT_STREQ(locales[0]->country_code,
nullptr);
597 EXPECT_STREQ(locales[0]->script_code,
nullptr);
598 EXPECT_STREQ(locales[0]->variant_code,
nullptr);
600 EXPECT_STREQ(locales[1]->language_code,
"C");
601 EXPECT_STREQ(locales[1]->country_code,
nullptr);
602 EXPECT_STREQ(locales[1]->script_code,
nullptr);
603 EXPECT_STREQ(locales[1]->variant_code,
nullptr);
608 g_autoptr(GError)
error =
nullptr;
610 EXPECT_EQ(
error,
nullptr);
614 if (initial_language) {
615 g_setenv(
"LANGUAGE", initial_language,
TRUE);
617 g_unsetenv(
"LANGUAGE");
621 TEST(FlEngineTest, EmptyLocales) {
622 g_autofree gchar* initial_language = g_strdup(g_getenv(
"LANGUAGE"));
623 g_setenv(
"LANGUAGE",
"de:: :en_US",
TRUE);
630 UpdateLocales, ([&called](
auto engine,
const FlutterLocale** locales,
631 size_t locales_count) {
634 EXPECT_EQ(locales_count,
static_cast<size_t>(4));
636 EXPECT_STREQ(locales[0]->language_code,
"de");
637 EXPECT_STREQ(locales[0]->country_code,
nullptr);
638 EXPECT_STREQ(locales[0]->script_code,
nullptr);
639 EXPECT_STREQ(locales[0]->variant_code,
nullptr);
641 EXPECT_STREQ(locales[1]->language_code,
"en");
642 EXPECT_STREQ(locales[1]->country_code,
"US");
643 EXPECT_STREQ(locales[1]->script_code,
nullptr);
644 EXPECT_STREQ(locales[1]->variant_code,
nullptr);
646 EXPECT_STREQ(locales[2]->language_code,
"en");
647 EXPECT_STREQ(locales[2]->country_code,
nullptr);
648 EXPECT_STREQ(locales[2]->script_code,
nullptr);
649 EXPECT_STREQ(locales[2]->variant_code,
nullptr);
651 EXPECT_STREQ(locales[3]->language_code,
"C");
652 EXPECT_STREQ(locales[3]->country_code,
nullptr);
653 EXPECT_STREQ(locales[3]->script_code,
nullptr);
654 EXPECT_STREQ(locales[3]->variant_code,
nullptr);
659 g_autoptr(GError)
error =
nullptr;
661 EXPECT_EQ(
error,
nullptr);
665 if (initial_language) {
666 g_setenv(
"LANGUAGE", initial_language,
TRUE);
668 g_unsetenv(
"LANGUAGE");
673 GAsyncResult* result,
675 g_autoptr(GError)
error =
nullptr;
678 EXPECT_EQ(
error,
nullptr);
680 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
684 g_autoptr(GMainLoop) loop = g_main_loop_new(
nullptr, 0);
691 AddView, ([&called](
auto engine,
const FlutterAddViewInfo* info) {
693 EXPECT_EQ(info->view_metrics->width, 123u);
694 EXPECT_EQ(info->view_metrics->height, 456u);
695 EXPECT_EQ(info->view_metrics->pixel_ratio, 2.0);
697 FlutterAddViewResult result;
698 result.struct_size =
sizeof(FlutterAddViewResult);
700 result.user_data = info->user_data;
701 info->add_view_callback(&result);
706 g_autoptr(FlMockRenderable) renderable = fl_mock_renderable_new();
714 g_main_loop_run(loop);
718 GAsyncResult* result,
720 g_autoptr(GError)
error =
nullptr;
723 EXPECT_NE(
error,
nullptr);
725 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
728 TEST(FlEngineTest, AddViewError) {
729 g_autoptr(GMainLoop) loop = g_main_loop_new(
nullptr, 0);
735 AddView, ([](
auto engine,
const FlutterAddViewInfo* info) {
736 FlutterAddViewResult result;
737 result.struct_size =
sizeof(FlutterAddViewResult);
738 result.added =
false;
739 result.user_data = info->user_data;
740 info->add_view_callback(&result);
745 g_autoptr(FlMockRenderable) renderable = fl_mock_renderable_new();
752 g_main_loop_run(loop);
756 GAsyncResult* result,
758 g_autoptr(GError)
error =
nullptr;
761 EXPECT_NE(
error,
nullptr);
763 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
766 TEST(FlEngineTest, AddViewEngineError) {
767 g_autoptr(GMainLoop) loop = g_main_loop_new(
nullptr, 0);
773 AddView, ([](
auto engine,
const FlutterAddViewInfo* info) {
774 return kInvalidArguments;
777 g_autoptr(FlMockRenderable) renderable = fl_mock_renderable_new();
784 g_main_loop_run(loop);
788 GAsyncResult* result,
790 g_autoptr(GError)
error =
nullptr;
793 EXPECT_EQ(
error,
nullptr);
795 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
798 TEST(FlEngineTest, RemoveView) {
799 g_autoptr(GMainLoop) loop = g_main_loop_new(
nullptr, 0);
806 RemoveView, ([&called](
auto engine,
const FlutterRemoveViewInfo* info) {
808 EXPECT_EQ(info->view_id, 123);
810 FlutterRemoveViewResult result;
811 result.struct_size =
sizeof(FlutterRemoveViewResult);
812 result.removed =
true;
813 result.user_data = info->user_data;
814 info->remove_view_callback(&result);
823 g_main_loop_run(loop);
827 GAsyncResult* result,
829 g_autoptr(GError)
error =
nullptr;
832 EXPECT_NE(
error,
nullptr);
834 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
837 TEST(FlEngineTest, RemoveViewError) {
838 g_autoptr(GMainLoop) loop = g_main_loop_new(
nullptr, 0);
844 RemoveView, ([](
auto engine,
const FlutterRemoveViewInfo* info) {
845 FlutterRemoveViewResult result;
846 result.struct_size =
sizeof(FlutterRemoveViewResult);
847 result.removed =
false;
848 result.user_data = info->user_data;
849 info->remove_view_callback(&result);
857 g_main_loop_run(loop);
861 GAsyncResult* result,
863 g_autoptr(GError)
error =
nullptr;
866 EXPECT_NE(
error,
nullptr);
868 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
871 TEST(FlEngineTest, RemoveViewEngineError) {
872 g_autoptr(GMainLoop) loop = g_main_loop_new(
nullptr, 0);
878 RemoveView, ([](
auto engine,
const FlutterRemoveViewInfo* info) {
879 return kInvalidArguments;
886 g_main_loop_run(loop);
889 TEST(FlEngineTest, SendKeyEvent) {
890 g_autoptr(GMainLoop) loop = g_main_loop_new(
nullptr, 0);
895 g_autoptr(GError)
error =
nullptr;
897 EXPECT_EQ(
error,
nullptr);
902 ([&called](
auto engine,
const FlutterKeyEvent* event,
903 FlutterKeyEventCallback callback,
void*
user_data) {
905 EXPECT_EQ(event->timestamp, 1234);
906 EXPECT_EQ(event->type, kFlutterKeyEventTypeUp);
907 EXPECT_EQ(event->physical,
static_cast<uint64_t
>(42));
908 EXPECT_EQ(event->logical,
static_cast<uint64_t
>(123));
909 EXPECT_TRUE(event->synthesized);
910 EXPECT_EQ(event->device_type, kFlutterKeyEventDeviceTypeKeyboard);
915 FlutterKeyEvent
event = {.struct_size =
sizeof(FlutterKeyEvent),
917 .
type = kFlutterKeyEventTypeUp,
920 .character =
nullptr,
922 .device_type = kFlutterKeyEventDeviceTypeKeyboard};
924 engine, &event,
nullptr,
925 [](GObject*
object, GAsyncResult* result, gpointer
user_data) {
927 g_autoptr(GError)
error =
nullptr;
930 EXPECT_EQ(
error,
nullptr);
931 EXPECT_TRUE(handled);
932 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
936 g_main_loop_run(loop);
940 TEST(FlEngineTest, SendKeyEventNotHandled) {
941 g_autoptr(GMainLoop) loop = g_main_loop_new(
nullptr, 0);
946 g_autoptr(GError)
error =
nullptr;
948 EXPECT_EQ(
error,
nullptr);
953 ([&called](
auto engine,
const FlutterKeyEvent* event,
954 FlutterKeyEventCallback callback,
void*
user_data) {
960 FlutterKeyEvent
event = {.struct_size =
sizeof(FlutterKeyEvent),
962 .
type = kFlutterKeyEventTypeUp,
965 .character =
nullptr,
967 .device_type = kFlutterKeyEventDeviceTypeKeyboard};
969 engine, &event,
nullptr,
970 [](GObject*
object, GAsyncResult* result, gpointer
user_data) {
972 g_autoptr(GError)
error =
nullptr;
975 EXPECT_EQ(
error,
nullptr);
976 EXPECT_FALSE(handled);
977 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
981 g_main_loop_run(loop);
985 TEST(FlEngineTest, SendKeyEventError) {
986 g_autoptr(GMainLoop) loop = g_main_loop_new(
nullptr, 0);
991 g_autoptr(GError)
error =
nullptr;
993 EXPECT_EQ(
error,
nullptr);
998 ([&called](
auto engine,
const FlutterKeyEvent* event,
999 FlutterKeyEventCallback callback,
void*
user_data) {
1001 return kInvalidArguments;
1004 FlutterKeyEvent
event = {.struct_size =
sizeof(FlutterKeyEvent),
1006 .
type = kFlutterKeyEventTypeUp,
1009 .character =
nullptr,
1010 .synthesized =
true,
1011 .device_type = kFlutterKeyEventDeviceTypeKeyboard};
1013 engine, &event,
nullptr,
1014 [](GObject*
object, GAsyncResult* result, gpointer
user_data) {
1016 g_autoptr(GError)
error =
nullptr;
1019 EXPECT_NE(
error,
nullptr);
1020 EXPECT_STREQ(
error->message,
"Failed to send key event");
1021 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
1025 g_main_loop_run(loop);
1026 EXPECT_TRUE(called);
G_MODULE_EXPORT FlDartProject * fl_dart_project_new()
G_MODULE_EXPORT void fl_dart_project_set_ui_thread_policy(FlDartProject *project, FlUIThreadPolicy policy)
G_MODULE_EXPORT void fl_dart_project_set_dart_entrypoint_arguments(FlDartProject *self, char **argv)
@ FL_UI_THREAD_POLICY_RUN_ON_PLATFORM_THREAD
@ FL_UI_THREAD_POLICY_RUN_ON_SEPARATE_THREAD
FlMouseCursorHandler * fl_engine_get_mouse_cursor_handler(FlEngine *self)
void fl_engine_send_mouse_pointer_event(FlEngine *self, FlutterViewId view_id, FlutterPointerPhase phase, size_t timestamp, double x, double y, FlutterPointerDeviceKind device_kind, double scroll_delta_x, double scroll_delta_y, int64_t buttons)
gboolean fl_engine_send_key_event_finish(FlEngine *self, GAsyncResult *result, gboolean *handled, GError **error)
FlutterEngineProcTable * fl_engine_get_embedder_api(FlEngine *self)
void fl_engine_dispatch_semantics_action(FlEngine *self, FlutterViewId view_id, uint64_t node_id, FlutterSemanticsAction action, GBytes *data)
void fl_engine_notify_display_update(FlEngine *self, const FlutterEngineDisplay *displays, size_t displays_length)
void fl_engine_send_window_metrics_event(FlEngine *self, FlutterEngineDisplayId display_id, FlutterViewId view_id, size_t width, size_t height, double pixel_ratio)
FlWindowingHandler * fl_engine_get_windowing_handler(FlEngine *self)
gboolean fl_engine_remove_view_finish(FlEngine *self, GAsyncResult *result, GError **error)
FlTaskRunner * fl_engine_get_task_runner(FlEngine *self)
FlKeyboardManager * fl_engine_get_keyboard_manager(FlEngine *self)
FlDisplayMonitor * fl_engine_get_display_monitor(FlEngine *self)
gboolean fl_engine_send_platform_message_response(FlEngine *self, const FlutterPlatformMessageResponseHandle *handle, GBytes *response, GError **error)
void fl_engine_send_platform_message(FlEngine *self, const gchar *channel, GBytes *message, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
FlEngine * fl_engine_for_id(int64_t id)
void fl_engine_remove_view(FlEngine *self, FlutterViewId view_id, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
G_MODULE_EXPORT FlBinaryMessenger * fl_engine_get_binary_messenger(FlEngine *self)
gboolean fl_engine_add_view_finish(FlEngine *self, GAsyncResult *result, GError **error)
void fl_engine_send_key_event(FlEngine *self, const FlutterKeyEvent *event, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
void fl_engine_send_pointer_pan_zoom_event(FlEngine *self, FlutterViewId view_id, size_t timestamp, double x, double y, FlutterPointerPhase phase, double pan_x, double pan_y, double scale, double rotation)
FlutterViewId fl_engine_add_view(FlEngine *self, FlRenderable *renderable, size_t width, size_t height, double pixel_ratio, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
gboolean fl_engine_start(FlEngine *self, GError **error)
G_MODULE_EXPORT FlEngine * fl_engine_new(FlDartProject *project)
void on_pre_engine_restart_cb(FlEngine *engine, gpointer user_data)
static void remove_view_engine_error_cb(GObject *object, GAsyncResult *result, gpointer user_data)
TEST(FlEngineTest, NotifyDisplayUpdate)
static void remove_view_cb(GObject *object, GAsyncResult *result, gpointer user_data)
static void add_view_error_cb(GObject *object, GAsyncResult *result, gpointer user_data)
static void add_view_engine_error_cb(GObject *object, GAsyncResult *result, gpointer user_data)
static void remove_view_error_cb(GObject *object, GAsyncResult *result, gpointer user_data)
static void add_view_cb(GObject *object, GAsyncResult *result, gpointer user_data)
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
G_BEGIN_DECLS G_MODULE_EXPORT FlValue gpointer user_data
G_MODULE_EXPORT FlJsonMessageCodec * fl_json_message_codec_new()
G_MODULE_EXPORT FlValue * fl_message_codec_decode_message(FlMessageCodec *self, GBytes *message, GError **error)
const uint8_t uint32_t uint32_t * height
const uint8_t uint32_t * width
const uint8_t uint32_t uint32_t GError ** error
G_MODULE_EXPORT FlValue * fl_value_lookup_string(FlValue *self, const gchar *key)
G_MODULE_EXPORT FlValueType fl_value_get_type(FlValue *self)
typedefG_BEGIN_DECLS struct _FlValue FlValue
G_BEGIN_DECLS FlutterViewId view_id