25#include "gmock/gmock.h"
26#include "gtest/gtest.h"
37 ::TranslateMessage(&msg);
47using ::testing::DoAll;
48using ::testing::NiceMock;
49using ::testing::Return;
50using ::testing::SetArgPointee;
57 std::unique_ptr<FlutterWindowsEngine>
engine = builder.Build();
62 ASSERT_TRUE(
engine->Run());
64 ASSERT_EQ(
engine->view(123),
nullptr);
68 bool finished =
false;
69 auto runner = std::make_unique<TaskRunner>(
71 return static_cast<uint64_t
>(
75 runner->PostFlutterTask(
90 auto runner = std::make_unique<TaskRunner>(
92 return static_cast<uint64_t
>(
99 runner->PostTask([
this] { PostTaskLoop(); });
101 std::unique_ptr<TaskRunner> runner;
104 RunnerHolder container{.runner = std::move(runner)};
106 container.PostTaskLoop();
108 const LPCWSTR class_name = L
"FlutterTestWindowClass";
110 wc.lpfnWndProc = DefWindowProc;
111 wc.lpszClassName = class_name;
115 container.runner->PostTask([&] {
116 window = CreateWindowEx(0, class_name, L
"Empty Window", WS_OVERLAPPEDWINDOW,
117 CW_USEDEFAULT, CW_USEDEFAULT, 800, 600,
nullptr,
118 nullptr,
nullptr,
nullptr);
119 ShowWindow(
window, SW_SHOW);
125 if (msg.message == WM_PAINT) {
128 ::TranslateMessage(&msg);
134 UnregisterClassW(class_name,
nullptr);
140 builder.AddDartEntrypointArgument(
"arg2");
142 auto windows_proc_table = std::make_shared<MockWindowsProcTable>();
144 HMONITOR mock_monitor =
reinterpret_cast<HMONITOR
>(1);
146 MONITORINFOEXW monitor_info = {};
147 monitor_info.cbSize =
sizeof(MONITORINFOEXW);
148 monitor_info.rcMonitor = {0, 0, 1920, 1080};
149 monitor_info.rcWork = {0, 0, 1920, 1080};
150 monitor_info.dwFlags = MONITORINFOF_PRIMARY;
151 wcscpy_s(monitor_info.szDevice, L
"\\\\.\\DISPLAY1");
153 EXPECT_CALL(*windows_proc_table, GetMonitorInfoW(mock_monitor, _))
154 .WillRepeatedly(DoAll(SetArgPointee<1>(monitor_info), Return(
TRUE)));
156 EXPECT_CALL(*windows_proc_table, EnumDisplayMonitors(
nullptr,
nullptr, _, _))
157 .WillRepeatedly([&](HDC hdc, LPCRECT lprcClip, MONITORENUMPROC lpfnEnum,
159 lpfnEnum(mock_monitor,
nullptr, &monitor_info.rcMonitor, dwData);
164 .WillRepeatedly(Return(96));
167 EXPECT_CALL(*windows_proc_table, GetThreadPreferredUILanguages(_, _, _, _))
169 [](
DWORD flags, PULONG count, PZZWSTR languages, PULONG
length) {
173 if (languages ==
nullptr) {
182 wchar_t* lang_buffer = languages;
183 wcscpy(lang_buffer, L
"fr-FR");
185 lang_buffer += wcslen(L
"fr-FR") + 1;
186 *lang_buffer = L
'\0';
191 builder.SetWindowsProcTable(windows_proc_table);
193 std::unique_ptr<FlutterWindowsEngine>
engine = builder.Build();
197 bool run_called =
false;
199 Run, ([&run_called, engine_instance =
engine.get()](
207 EXPECT_NE(config,
nullptr);
212 EXPECT_NE(
args->assets_path,
nullptr);
213 EXPECT_NE(
args->icu_data_path,
nullptr);
214 EXPECT_EQ(
args->dart_entrypoint_argc, 2U);
215 EXPECT_EQ(strcmp(
args->dart_entrypoint_argv[0],
"arg1"), 0);
216 EXPECT_EQ(strcmp(
args->dart_entrypoint_argv[1],
"arg2"), 0);
217 EXPECT_NE(
args->platform_message_callback,
nullptr);
218 EXPECT_NE(
args->custom_task_runners,
nullptr);
219 EXPECT_NE(
args->custom_task_runners->thread_priority_setter,
nullptr);
220 EXPECT_EQ(
args->custom_dart_entrypoint,
nullptr);
221 EXPECT_NE(
args->vsync_callback,
nullptr);
222 EXPECT_EQ(
args->update_semantics_callback,
nullptr);
223 EXPECT_NE(
args->update_semantics_callback2,
nullptr);
224 EXPECT_EQ(
args->update_semantics_node_callback,
nullptr);
225 EXPECT_EQ(
args->update_semantics_custom_action_callback,
nullptr);
226 EXPECT_NE(
args->view_focus_change_request_callback,
nullptr);
228 args->custom_task_runners->thread_priority_setter(
230 EXPECT_EQ(GetThreadPriority(GetCurrentThread()),
231 THREAD_PRIORITY_ABOVE_NORMAL);
236 UpdateAccessibilityFeatures,
241 bool update_locales_called =
false;
245 size_t locales_count) {
246 update_locales_called =
true;
248 EXPECT_GT(locales_count, 0);
249 EXPECT_NE(locales,
nullptr);
255 bool settings_message_sent =
false;
259 if (std::string(
message->channel) == std::string(
"flutter/settings")) {
260 settings_message_sent = true;
267 bool notify_display_update_called =
false;
271 ([¬ify_display_update_called](
275 size_t display_count) {
277 notify_display_update_called =
true;
282 modifier.
SetEGLManager(std::make_unique<egl::MockManager>());
286 EXPECT_TRUE(run_called);
287 EXPECT_TRUE(update_locales_called);
288 EXPECT_TRUE(settings_message_sent);
289 EXPECT_TRUE(notify_display_update_called);
299 std::unique_ptr<FlutterWindowsEngine>
engine = builder.Build();
301 bool on_vsync_called =
false;
307 ([&on_vsync_called, engine_instance =
engine.get()](
309 uint64_t frame_start_time_nanos, uint64_t frame_target_time_nanos) {
311 EXPECT_EQ(frame_start_time_nanos, 16600000);
312 EXPECT_EQ(frame_target_time_nanos, 33200000);
313 on_vsync_called =
true;
321 EXPECT_TRUE(on_vsync_called);
326 std::unique_ptr<FlutterWindowsEngine>
engine = builder.Build();
331 ([engine_instance =
engine.get()](
335 size_t display_count) {
return kSuccess; }));
338 bool run_called =
false;
340 Run, ([&run_called, engine_instance =
engine.get()](
352 UpdateAccessibilityFeatures,
360 size_t locales_count) {
return kSuccess; }));
370 EXPECT_TRUE(run_called);
380 std::unique_ptr<FlutterWindowsEngine>
engine = builder.Build();
385 ([engine_instance =
engine.get()](
389 size_t display_count) {
return kSuccess; }));
393 UpdateAccessibilityFeatures,
401 size_t locales_count) {
return kSuccess; }));
409 EXPECT_FALSE(
engine->Run());
415 std::unique_ptr<FlutterWindowsEngine>
engine = builder.Build();
420 ([engine_instance =
engine.get()](
424 size_t display_count) {
return kSuccess; }));
427 UpdateAccessibilityFeatures,
433 size_t locales_count) {
return kSuccess; }));
439 bool run_called =
false;
441 Run, ([&run_called, engine_instance =
engine.get()](
448 bool has_sdf_switch =
false;
449 for (
int i = 0;
i <
args->command_line_argc; ++
i) {
450 if (strcmp(
args->command_line_argv[
i],
"--impeller-use-sdfs=true") ==
452 has_sdf_switch = true;
456 EXPECT_TRUE(has_sdf_switch);
461 modifier.
SetEGLManager(std::make_unique<egl::MockManager>());
465 EXPECT_TRUE(run_called);
473 std::unique_ptr<FlutterWindowsEngine>
engine = builder.Build();
477 const std::vector<uint8_t> test_message = {1, 2, 3, 4};
482 SendPlatformMessage, ([&called, test_message](
auto engine,
auto message) {
484 EXPECT_STREQ(
message->channel,
"test");
485 EXPECT_EQ(
message->message_size, test_message.size());
486 EXPECT_EQ(memcmp(
message->message, test_message.data(),
489 EXPECT_EQ(
message->response_handle,
nullptr);
493 engine->SendPlatformMessage(
channel, test_message.data(), test_message.size(),
502 std::unique_ptr<FlutterWindowsEngine>
engine = builder.Build();
506 auto binary_messenger =
507 std::make_unique<BinaryMessengerImpl>(
engine->messenger());
510 bool did_call_callback =
false;
511 bool did_call_reply =
false;
512 bool did_call_dart_reply =
false;
514 binary_messenger->SetMessageHandler(
516 [&did_call_callback, &did_call_dart_reply](
518 if (message_size == 5) {
519 EXPECT_EQ(
message[0],
static_cast<uint8_t
>(
'h'));
520 char response[] = {
'b',
'y',
'e'};
521 reply(
reinterpret_cast<uint8_t*
>(response), 3);
522 did_call_callback =
true;
524 EXPECT_EQ(message_size, 3);
525 EXPECT_EQ(
message[0],
static_cast<uint8_t
>(
'b'));
526 did_call_dart_reply =
true;
529 char payload[] = {
'h',
'e',
'l',
'l',
'o'};
530 binary_messenger->Send(
531 channel,
reinterpret_cast<uint8_t*
>(payload), 5,
532 [&did_call_reply](
const uint8_t* reply,
size_t reply_size) {
533 EXPECT_EQ(reply_size, 5);
534 EXPECT_EQ(reply[0],
static_cast<uint8_t
>(
'h'));
535 did_call_reply =
true;
538 while (!did_call_callback || !did_call_reply || !did_call_dart_reply) {
539 engine->task_runner()->ProcessTasks();
547 std::unique_ptr<FlutterWindowsEngine>
engine = builder.Build();
552 auto binary_messenger =
553 std::make_unique<BinaryMessengerImpl>(
engine->messenger());
556 bool did_call_callback =
false;
557 bool did_call_reply =
false;
558 bool did_call_dart_reply =
false;
560 std::unique_ptr<std::thread> reply_thread;
561 binary_messenger->SetMessageHandler(
563 [&did_call_callback, &did_call_dart_reply, &reply_thread](
565 if (message_size == 5) {
566 EXPECT_EQ(
message[0],
static_cast<uint8_t
>(
'h'));
567 reply_thread.reset(
new std::thread([reply = std::move(reply)]() {
568 char response[] = {
'b',
'y',
'e'};
569 reply(
reinterpret_cast<uint8_t*
>(response), 3);
571 did_call_callback =
true;
573 EXPECT_EQ(message_size, 3);
574 EXPECT_EQ(
message[0],
static_cast<uint8_t
>(
'b'));
575 did_call_dart_reply =
true;
578 char payload[] = {
'h',
'e',
'l',
'l',
'o'};
579 binary_messenger->Send(
580 channel,
reinterpret_cast<uint8_t*
>(payload), 5,
581 [&did_call_reply](
const uint8_t* reply,
size_t reply_size) {
582 EXPECT_EQ(reply_size, 5);
583 EXPECT_EQ(reply[0],
static_cast<uint8_t
>(
'h'));
584 did_call_reply =
true;
587 while (!did_call_callback || !did_call_reply || !did_call_dart_reply) {
588 engine->task_runner()->ProcessTasks();
590 ASSERT_TRUE(reply_thread);
591 reply_thread->join();
596 std::unique_ptr<FlutterWindowsEngine>
engine = builder.Build();
600 const std::vector<uint8_t> test_message = {1, 2, 3, 4};
601 auto* dummy_response_handle =
604 void* reply_user_data =
reinterpret_cast<void*
>(6);
608 bool create_response_handle_called =
false;
611 PlatformMessageCreateResponseHandle,
612 ([&create_response_handle_called, &reply_handler, reply_user_data,
614 auto response_handle) {
615 create_response_handle_called =
true;
616 EXPECT_EQ(reply, reply_handler);
618 EXPECT_NE(response_handle,
nullptr);
619 *response_handle = dummy_response_handle;
622 bool release_response_handle_called =
false;
625 PlatformMessageReleaseResponseHandle,
626 ([&release_response_handle_called, dummy_response_handle](
627 auto engine,
auto response_handle) {
628 release_response_handle_called =
true;
629 EXPECT_EQ(response_handle, dummy_response_handle);
632 bool send_message_called =
false;
634 SendPlatformMessage, ([&send_message_called, test_message,
636 send_message_called =
true;
637 EXPECT_STREQ(
message->channel,
"test");
638 EXPECT_EQ(
message->message_size, test_message.size());
639 EXPECT_EQ(memcmp(
message->message, test_message.data(),
642 EXPECT_EQ(
message->response_handle, dummy_response_handle);
646 engine->SendPlatformMessage(
channel, test_message.data(), test_message.size(),
647 reply_handler, reply_user_data);
648 EXPECT_TRUE(create_response_handle_called);
649 EXPECT_TRUE(release_response_handle_called);
650 EXPECT_TRUE(send_message_called);
655 std::unique_ptr<FlutterWindowsEngine>
engine = builder.Build();
661 SendSemanticsAction, ([&called, &
message](
auto engine,
auto info) {
663 EXPECT_EQ(info->view_id, 456);
664 EXPECT_EQ(info->node_id, 42);
666 EXPECT_EQ(memcmp(info->data,
message.c_str(),
message.size()), 0);
667 EXPECT_EQ(info->data_length,
message.size());
679 EXPECT_EQ(GetThreadPriority(GetCurrentThread()),
680 THREAD_PRIORITY_BELOW_NORMAL);
683 EXPECT_EQ(GetThreadPriority(GetCurrentThread()),
684 THREAD_PRIORITY_ABOVE_NORMAL);
687 EXPECT_EQ(GetThreadPriority(GetCurrentThread()),
688 THREAD_PRIORITY_ABOVE_NORMAL);
692 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL);
695 EXPECT_EQ(GetThreadPriority(GetCurrentThread()), THREAD_PRIORITY_NORMAL);
700 std::unique_ptr<FlutterWindowsEngine>
engine = builder.Build();
704 std::make_shared<MockKeyResponseController>());
711 engine->AddPluginRegistrarDestructionCallback(
713 auto result =
reinterpret_cast<int*
>(ref);
717 engine->AddPluginRegistrarDestructionCallback(
719 auto result =
reinterpret_cast<int*
>(ref);
725 EXPECT_EQ(result1, 1);
726 EXPECT_EQ(result2, 2);
731 std::unique_ptr<FlutterWindowsEngine>
engine = builder.Build();
747 std::unique_ptr<FlutterWindowsEngine>
engine = builder.Build();
757 engine->SetNextFrameCallback([]() {});
763 std::unique_ptr<FlutterWindowsEngine>
engine = builder.Build();
764 EXPECT_EQ(
engine->GetExecutableName(),
"flutter_windows_unittests.exe");
770 auto windows_proc_table = std::make_shared<MockWindowsProcTable>();
771 EXPECT_CALL(*windows_proc_table, GetHighContrastEnabled)
772 .WillOnce(Return(
true))
773 .WillOnce(Return(
false));
777 std::unique_ptr<FlutterWindowsEngine>
engine = builder.Build();
780 std::optional<FlutterAccessibilityFeature> engine_flags;
782 UpdateAccessibilityFeatures, ([&engine_flags](
auto engine,
auto flags) {
783 engine_flags = flags;
791 engine->UpdateHighContrastMode();
793 EXPECT_TRUE(
engine->high_contrast_enabled());
794 EXPECT_TRUE(engine_flags.has_value());
796 engine_flags.value() &
800 engine_flags.reset();
801 engine->UpdateHighContrastMode();
803 EXPECT_FALSE(
engine->high_contrast_enabled());
804 EXPECT_TRUE(engine_flags.has_value());
806 engine_flags.value() &
812 std::unique_ptr<FlutterWindowsEngine>
engine = builder.Build();
822 engine->PostRasterThreadTask([&called]() { called =
true; });
830 std::unique_ptr<WindowBindingHandler> wbh)
839 NotifyWinEventWrapper,
858 context.AddNativeFunction(
"Signal", native_entry);
861 ASSERT_NE(
engine,
nullptr);
866 auto window_binding_handler =
867 std::make_unique<NiceMock<MockWindowBindingHandler>>();
868 EXPECT_CALL(*window_binding_handler, GetAlertDelegate)
869 .WillOnce(Return(&delegate));
872 MockFlutterWindowsView
view{windows_engine,
873 std::move(window_binding_handler)};
877 windows_engine->UpdateSemanticsEnabled(
true);
879 EXPECT_CALL(
view, NotifyWinEventWrapper).Times(1);
883 windows_engine->task_runner()->ProcessTasks();
896 context.AddNativeFunction(
"Signal", native_entry);
899 ASSERT_NE(
engine,
nullptr);
906 windows_engine->task_runner()->ProcessTasks();
922 context.AddNativeFunction(
"Signal", native_entry);
925 ASSERT_NE(controller,
nullptr);
933 windows_engine->task_runner()->ProcessTasks();
939 EXPECT_EQ(log_capture.
str().find(
"tooltip"), std::string::npos);
951 (std::optional<HWND>, std::optional<WPARAM>, std::optional<LPARAM>,
UINT),
970 bool finished =
false;
972 auto engine = builder.Build();
973 auto window_binding_handler =
974 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
975 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
980 auto handler = std::make_unique<MockWindowsLifecycleManager>(
engine.get());
982 .WillOnce([&finished](std::optional<HWND> hwnd,
983 std::optional<WPARAM> wparam,
984 std::optional<LPARAM> lparam,
985 UINT exit_code) { finished = exit_code == 0; });
986 EXPECT_CALL(*
handler, IsLastWindowOfProcess).WillRepeatedly(Return(
true));
989 engine->lifecycle_manager()->BeginProcessingExit();
993 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(0, WM_CLOSE, 0,
999 engine->task_runner()->ProcessTasks();
1006 bool did_call =
false;
1008 auto engine = builder.Build();
1009 auto window_binding_handler =
1010 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1011 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
1016 auto handler = std::make_unique<MockWindowsLifecycleManager>(
engine.get());
1017 EXPECT_CALL(*
handler, IsLastWindowOfProcess).WillRepeatedly(Return(
true));
1018 EXPECT_CALL(*
handler, Quit).Times(0);
1020 engine->lifecycle_manager()->BeginProcessingExit();
1022 auto binary_messenger =
1023 std::make_unique<BinaryMessengerImpl>(
engine->messenger());
1024 binary_messenger->SetMessageHandler(
1025 "flutter/platform", [&did_call](
const uint8_t*
message,
1028 EXPECT_NE(contents.find(
"\"method\":\"System.exitApplication\""),
1030 EXPECT_NE(contents.find(
"\"type\":\"required\""), std::string::npos);
1031 EXPECT_NE(contents.find(
"\"exitCode\":0"), std::string::npos);
1033 char response[] =
"";
1034 reply(
reinterpret_cast<uint8_t*
>(response), 0);
1039 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(0, WM_CLOSE, 0,
1043 engine->task_runner()->ProcessTasks();
1053 bool second_close =
false;
1055 auto engine = builder.Build();
1056 auto window_binding_handler =
1057 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1058 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
1063 auto handler = std::make_unique<MockWindowsLifecycleManager>(
engine.get());
1064 EXPECT_CALL(*
handler, IsLastWindowOfProcess).WillOnce(Return(
true));
1066 .WillOnce([handler_ptr =
handler.get()](
1067 std::optional<HWND> hwnd, std::optional<WPARAM> wparam,
1068 std::optional<LPARAM> lparam,
UINT exit_code) {
1069 handler_ptr->WindowsLifecycleManager::Quit(hwnd, wparam, lparam,
1075 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(
1076 hwnd, msg, wparam, lparam);
1079 engine->lifecycle_manager()->BeginProcessingExit();
1087 engine->window_proc_delegate_manager()->RegisterTopLevelWindowProcDelegate(
1092 bool* called =
reinterpret_cast<bool*
>(
user_data);
1099 reinterpret_cast<void*
>(&second_close));
1101 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(0, WM_CLOSE, 0,
1104 while (!second_close) {
1105 engine->task_runner()->ProcessTasks();
1112 bool finished =
false;
1114 auto engine = builder.Build();
1115 auto window_binding_handler =
1116 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1117 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
1122 auto handler = std::make_unique<MockWindowsLifecycleManager>(
engine.get());
1123 EXPECT_CALL(*
handler, IsLastWindowOfProcess).WillOnce([&finished]() {
1128 EXPECT_CALL(*
handler, Quit).Times(0);
1130 engine->lifecycle_manager()->BeginProcessingExit();
1134 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(0, WM_CLOSE, 0,
1138 engine->task_runner()->ProcessTasks();
1145 auto engine = builder.Build();
1146 auto window_binding_handler =
1147 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1148 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
1153 auto handler = std::make_unique<MockWindowsLifecycleManager>(
engine.get());
1154 EXPECT_CALL(*
handler, IsLastWindowOfProcess).Times(0);
1157 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(0, WM_CLOSE, 0,
1164 auto engine = builder.Build();
1165 auto window_binding_handler =
1166 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1167 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
1172 auto handler = std::make_unique<MockWindowsLifecycleManager>(
engine.get());
1173 EXPECT_CALL(*
handler, IsLastWindowOfProcess).WillOnce(Return(
false));
1175 engine->lifecycle_manager()->BeginProcessingExit();
1177 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(0, WM_CLOSE, 0,
1184 auto engine = builder.Build();
1185 auto window_binding_handler =
1186 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1187 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
1192 auto handler = std::make_unique<MockWindowsLifecycleManager>(
engine.get());
1193 EXPECT_CALL(*
handler, IsLastWindowOfProcess).WillOnce(Return(
false));
1195 engine->lifecycle_manager()->BeginProcessingExit();
1197 engine->lifecycle_manager()->ExternalWindowMessage(0, WM_CLOSE, 0, 0);
1203 auto engine = builder.Build();
1204 auto window_binding_handler =
1205 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1206 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
1213 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(
1214 (HWND)1, WM_SIZE, SIZE_RESTORED, 0);
1216 while (
engine->lifecycle_manager()->IsUpdateStateScheduled()) {
1220 EXPECT_EQ(
engine->lifecycle_manager()->GetLifecycleState(),
1223 engine->lifecycle_manager()->OnWindowStateEvent((HWND)1,
1226 while (
engine->lifecycle_manager()->IsUpdateStateScheduled()) {
1230 EXPECT_EQ(
engine->lifecycle_manager()->GetLifecycleState(),
1233 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(
1234 (HWND)1, WM_SIZE, SIZE_MINIMIZED, 0);
1236 while (
engine->lifecycle_manager()->IsUpdateStateScheduled()) {
1240 EXPECT_EQ(
engine->lifecycle_manager()->GetLifecycleState(),
1243 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(
1244 (HWND)1, WM_SIZE, SIZE_RESTORED, 0);
1246 while (
engine->lifecycle_manager()->IsUpdateStateScheduled()) {
1250 EXPECT_EQ(
engine->lifecycle_manager()->GetLifecycleState(),
1257 auto engine = builder.Build();
1258 auto window_binding_handler =
1259 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1260 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
1269 engine->ProcessExternalWindowMessage(
reinterpret_cast<HWND
>(1), WM_SHOWWINDOW,
1271 engine->ProcessExternalWindowMessage(
reinterpret_cast<HWND
>(1), WM_SHOWWINDOW,
1274 while (
engine->lifecycle_manager()->IsUpdateStateScheduled()) {
1278 EXPECT_EQ(
engine->lifecycle_manager()->GetLifecycleState(),
1284 HWND outer =
reinterpret_cast<HWND
>(1);
1285 HWND inner =
reinterpret_cast<HWND
>(2);
1287 auto engine = builder.Build();
1288 auto window_binding_handler =
1289 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1290 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
1291 ON_CALL(
view, GetWindowHandle).WillByDefault([=]() {
return inner; });
1300 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(
1301 outer, WM_SHOWWINDOW,
TRUE, NULL);
1305 while (
engine->lifecycle_manager()->IsUpdateStateScheduled()) {
1309 EXPECT_EQ(
engine->lifecycle_manager()->GetLifecycleState(),
1315 while (
engine->lifecycle_manager()->IsUpdateStateScheduled()) {
1320 EXPECT_EQ(
engine->lifecycle_manager()->GetLifecycleState(),
1327 bool finished =
false;
1329 auto engine = builder.Build();
1330 auto window_binding_handler =
1331 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1332 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
1337 auto handler = std::make_unique<MockWindowsLifecycleManager>(
engine.get());
1338 EXPECT_CALL(*
handler, SetLifecycleState)
1340 handler_ptr->WindowsLifecycleManager::SetLifecycleState(state);
1344 auto binary_messenger =
1345 std::make_unique<BinaryMessengerImpl>(
engine->messenger());
1347 binary_messenger->SetMessageHandler(
1348 "flutter/unittest", [&finished](
const uint8_t*
message,
1351 EXPECT_NE(contents.find(
"AppLifecycleState.inactive"),
1354 char response[] =
"";
1355 reply(
reinterpret_cast<uint8_t*
>(response), 0);
1361 HWND hwnd =
reinterpret_cast<HWND
>(1);
1364 EXPECT_FALSE(finished);
1368 engine->lifecycle_manager()->BeginProcessingLifecycle();
1372 engine->task_runner()->ProcessTasks();
1379 bool enabled_lifecycle =
false;
1380 bool dart_responded =
false;
1382 auto engine = builder.Build();
1383 auto window_binding_handler =
1384 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1385 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
1390 auto handler = std::make_unique<MockWindowsLifecycleManager>(
engine.get());
1391 EXPECT_CALL(*
handler, SetLifecycleState)
1393 handler_ptr->WindowsLifecycleManager::SetLifecycleState(state);
1395 handler->begin_processing_callback = [&]() { enabled_lifecycle =
true; };
1398 auto binary_messenger =
1399 std::make_unique<BinaryMessengerImpl>(
engine->messenger());
1400 binary_messenger->SetMessageHandler(
1404 EXPECT_NE(contents.find(
"AppLifecycleState."), std::string::npos);
1405 dart_responded =
true;
1406 char response[] =
"";
1407 reply(
reinterpret_cast<uint8_t*
>(response), 0);
1412 while (!enabled_lifecycle) {
1413 engine->task_runner()->ProcessTasks();
1416 HWND hwnd =
reinterpret_cast<HWND
>(1);
1420 while (!dart_responded) {
1421 engine->task_runner()->ProcessTasks();
1429 auto engine = builder.Build();
1430 auto window_binding_handler =
1431 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1432 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
1438 bool lifecycle_began =
false;
1439 auto handler = std::make_unique<MockWindowsLifecycleManager>(
engine.get());
1440 handler->begin_processing_callback = [&]() { lifecycle_began =
true; };
1445 while (!lifecycle_began) {
1446 engine->task_runner()->ProcessTasks();
1453 auto engine = builder.Build();
1456 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1458 bool received_call =
false;
1460 auto manager = std::make_unique<MockPlatformViewManager>(
engine.get());
1461 EXPECT_CALL(*
manager, AddPlatformView)
1463 received_call =
true;
1466 modifier.SetPlatformViewPlugin(std::move(
manager));
1470 while (!received_call) {
1471 engine->task_runner()->ProcessTasks();
1477 auto engine = builder.Build();
1481 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1487 ASSERT_TRUE(
engine->Run());
1491 auto implicit_window = std::make_unique<NiceMock<MockWindowBindingHandler>>();
1493 std::unique_ptr<FlutterWindowsView> implicit_view =
1494 engine->CreateView(std::move(implicit_window),
1497 EXPECT_TRUE(implicit_view);
1500 auto second_window = std::make_unique<NiceMock<MockWindowBindingHandler>>();
1503 engine->CreateView(std::move(second_window),
1505 "FlutterEngineAddView returned an unexpected result");
1511 auto engine = builder.Build();
1515 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1521 ASSERT_TRUE(
engine->Run());
1522 EXPECT_DEBUG_DEATH(
engine->RemoveView(123),
1523 "FlutterEngineRemoveView returned an unexpected result");
1532 std::optional<std::thread::id> ui_thread_id;
1535 ui_thread_id = std::this_thread::get_id();
1537 context.AddNativeFunction(
"Signal", native_entry);
1540 while (!ui_thread_id) {
1543 ASSERT_EQ(*ui_thread_id, std::this_thread::get_id());
1548 std::unique_ptr<FlutterWindowsEngine>
engine = builder.Build();
1549 auto window_binding_handler =
1550 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1551 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
1559 EXPECT_CALL(
view, Focus()).WillOnce(Return(
true));
1572 context.AddNativeFunction(
"Signal", native_entry);
1576 ASSERT_NE(
engine,
nullptr);
1578 auto window_binding_handler1 =
1579 std::make_unique<NiceMock<MockWindowBindingHandler>>();
1580 auto window_binding_handler2 =
1581 std::make_unique<NiceMock<MockWindowBindingHandler>>();
1586 EXPECT_CALL(*window_binding_handler1, GetPhysicalWindowBounds)
1588 EXPECT_CALL(*window_binding_handler1, GetDpiScale)
1589 .WillRepeatedly(testing::Return(96.0));
1590 EXPECT_CALL(*window_binding_handler2, GetPhysicalWindowBounds)
1592 EXPECT_CALL(*window_binding_handler2, GetDpiScale)
1593 .WillRepeatedly(testing::Return(96.0));
1602 auto view1 = windows_engine->CreateView(std::move(window_binding_handler1),
1605 auto view2 = windows_engine->CreateView(std::move(window_binding_handler2),
1611 windows_engine->UpdateSemanticsEnabled(
true);
1614 windows_engine->task_runner()->ProcessTasks();
1617 auto accessibility_bridge1 = view1->accessibility_bridge().lock();
1618 auto accessibility_bridge2 = view2->accessibility_bridge().lock();
1623 !accessibility_bridge1->GetPlatformNodeFromTree(view1->view_id() + 1)) {
1624 windows_engine->task_runner()->ProcessTasks();
1628 !accessibility_bridge2->GetPlatformNodeFromTree(view2->view_id() + 1)) {
1629 windows_engine->task_runner()->ProcessTasks();
1633 auto tree1 = accessibility_bridge1->GetTree();
1634 auto tree2 = accessibility_bridge2->GetTree();
1635 EXPECT_NE(tree1->GetFromId(view1->view_id() + 1),
nullptr);
1636 EXPECT_NE(tree2->GetFromId(view2->view_id() + 1),
nullptr);
void SetLifecycleManager(std::unique_ptr< WindowsLifecycleManager > &&handler)
void SetFrameInterval(uint64_t frame_interval_nanos)
void OnViewFocusChangeRequest(const FlutterViewFocusChangeRequest *request)
void SetEGLManager(std::unique_ptr< egl::Manager > egl_manager)
void SetStartTime(uint64_t start_time_nanos)
Reset the start_time field that is used to align vsync events.
FlutterEngineProcTable & embedder_api()
void SetImplicitView(FlutterWindowsView *view)
void UpdateSemanticsEnabled(bool enabled)
virtual void Quit(std::optional< HWND > window, std::optional< WPARAM > wparam, std::optional< LPARAM > lparam, UINT exit_code)
virtual void BeginProcessingLifecycle()
virtual bool IsLastWindowOfProcess()
virtual void SetLifecycleState(AppLifecycleState state)
void SetDartEntrypoint(std::string entrypoint)
void AddDartEntrypointArgument(std::string arg)
void SetSwitches(std::vector< std::string > switches)
void SetWindowsProcTable(std::shared_ptr< WindowsProcTable > windows_proc_table)
~MockFlutterWindowsView()
MOCK_METHOD(bool, Focus,(),(override))
MOCK_METHOD(void, NotifyWinEventWrapper,(ui::AXPlatformNodeWin *, ax::mojom::Event),(override))
MockFlutterWindowsView(FlutterWindowsEngine *engine, std::unique_ptr< WindowBindingHandler > wbh)
MOCK_METHOD(HWND, GetWindowHandle,(),(const, override))
virtual ~MockWindowsLifecycleManager()
std::function< void()> begin_processing_callback
MOCK_METHOD(void, DispatchMessage,(HWND, UINT, WPARAM, LPARAM),(override))
MOCK_METHOD(void, Quit,(std::optional< HWND >, std::optional< WPARAM >, std::optional< LPARAM >, UINT),(override))
MOCK_METHOD(void, SetLifecycleState,(AppLifecycleState),(override))
void BeginProcessingLifecycle() override
MOCK_METHOD(bool, IsLastWindowOfProcess,(),(override))
MockWindowsLifecycleManager(FlutterWindowsEngine *engine)
void SetDartEntrypoint(std::string_view entrypoint)
static MallocMapping Copy(const T *begin, const T *end)
static constexpr TimeDelta FromMilliseconds(int64_t millis)
constexpr int64_t ToNanoseconds() const
constexpr TimeDelta ToEpochDelta() const
#define FLUTTER_API_SYMBOL(symbol)
FlutterAccessibilityFeature
@ kFlutterAccessibilityFeatureHighContrast
Request that UI be rendered with darker colors.
FlutterEngineDisplaysUpdateType
@ kFlutterEngineDisplaysUpdateTypeStartup
@ kBackground
Suitable for threads that shouldn't disrupt high priority work.
@ kDisplay
Suitable for threads which generate data for the display.
@ kNormal
Default priority level.
@ kRaster
Suitable for thread which raster data.
@ kFlutterSemanticsActionDismiss
A request that the node should be dismissed.
#define FLUTTER_ENGINE_VERSION
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
const gchar FlBinaryMessengerMessageHandler handler
void(* FlutterDesktopBinaryReply)(const uint8_t *data, size_t data_size, void *user_data)
FlutterDesktopBinaryReply callback
#define FML_DISALLOW_COPY_AND_ASSIGN(TypeName)
TEST_F(DisplayListTest, Defaults)
std::unique_ptr< FlutterDesktopEngine, EngineDeleter > EnginePtr
std::unique_ptr< FlutterDesktopViewController, ViewControllerDeleter > ViewControllerPtr
void MockEmbedderApiForKeyboard(EngineModifier &modifier, std::shared_ptr< MockKeyResponseController > response_controller)
constexpr int64_t kImplicitViewId
UINT GetDpiForMonitor(HMONITOR monitor)
it will be possible to load the file into Perfetto s trace viewer use test Running tests that layout and measure text will not yield consistent results across various platforms Enabling this option will make font resolution default to the Ahem test font on all disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via prefetched default font manager
static void DispatchSemanticsAction(JNIEnv *env, jobject jcaller, jlong shell_holder, jint id, jint action, jobject args, jint args_position)
std::function< void(const uint8_t *reply, size_t reply_size)> BinaryReply
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot data
static void WindowsPlatformThreadPrioritySetter(FlutterThreadPriority priority)
static void ScheduleFrame(JNIEnv *env, jobject jcaller, jlong shell_holder)
#define MOCK_ENGINE_PROC(proc, mock_impl)
std::shared_ptr< ContextGLES > context
FlutterEngineScheduleFrameFnPtr ScheduleFrame
FlutterEnginePlatformMessageReleaseResponseHandleFnPtr PlatformMessageReleaseResponseHandle
FlutterEngineUpdateLocalesFnPtr UpdateLocales
FlutterEngineRunsAOTCompiledDartCodeFnPtr RunsAOTCompiledDartCode
FlutterEngineSetNextFrameCallbackFnPtr SetNextFrameCallback
FlutterEngineShutdownFnPtr Shutdown
FlutterEngineOnVsyncFnPtr OnVsync
FlutterEngineGetCurrentTimeFnPtr GetCurrentTime
FlutterEngineNotifyDisplayUpdateFnPtr NotifyDisplayUpdate
FlutterEngineSendPlatformMessageFnPtr SendPlatformMessage
FlutterEnginePlatformMessageCreateResponseHandleFnPtr PlatformMessageCreateResponseHandle
FlutterEngineRunFnPtr Run
FlutterEngineUpdateAccessibilityFeaturesFnPtr UpdateAccessibilityFeatures
FlutterEnginePostRenderThreadTaskFnPtr PostRenderThreadTask
FlutterEngineSendSemanticsActionFnPtr SendSemanticsAction
FlutterViewId view_id
The identifier of the view that received the focus event.
FlutterDesktopEngineRef FlutterDesktopViewControllerGetEngine(FlutterDesktopViewControllerRef controller)
#define CREATE_NATIVE_ENTRY(native_entry)