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());
414 std::unique_ptr<FlutterWindowsEngine>
engine = builder.Build();
418 const std::vector<uint8_t> test_message = {1, 2, 3, 4};
423 SendPlatformMessage, ([&called, test_message](
auto engine,
auto message) {
425 EXPECT_STREQ(
message->channel,
"test");
426 EXPECT_EQ(
message->message_size, test_message.size());
427 EXPECT_EQ(memcmp(
message->message, test_message.data(),
430 EXPECT_EQ(
message->response_handle,
nullptr);
434 engine->SendPlatformMessage(
channel, test_message.data(), test_message.size(),
443 std::unique_ptr<FlutterWindowsEngine>
engine = builder.Build();
447 auto binary_messenger =
448 std::make_unique<BinaryMessengerImpl>(
engine->messenger());
451 bool did_call_callback =
false;
452 bool did_call_reply =
false;
453 bool did_call_dart_reply =
false;
455 binary_messenger->SetMessageHandler(
457 [&did_call_callback, &did_call_dart_reply](
459 if (message_size == 5) {
460 EXPECT_EQ(
message[0],
static_cast<uint8_t
>(
'h'));
461 char response[] = {
'b',
'y',
'e'};
462 reply(
reinterpret_cast<uint8_t*
>(response), 3);
463 did_call_callback =
true;
465 EXPECT_EQ(message_size, 3);
466 EXPECT_EQ(
message[0],
static_cast<uint8_t
>(
'b'));
467 did_call_dart_reply =
true;
470 char payload[] = {
'h',
'e',
'l',
'l',
'o'};
471 binary_messenger->Send(
472 channel,
reinterpret_cast<uint8_t*
>(payload), 5,
473 [&did_call_reply](
const uint8_t* reply,
size_t reply_size) {
474 EXPECT_EQ(reply_size, 5);
475 EXPECT_EQ(reply[0],
static_cast<uint8_t
>(
'h'));
476 did_call_reply =
true;
479 while (!did_call_callback || !did_call_reply || !did_call_dart_reply) {
480 engine->task_runner()->ProcessTasks();
488 std::unique_ptr<FlutterWindowsEngine>
engine = builder.Build();
493 auto binary_messenger =
494 std::make_unique<BinaryMessengerImpl>(
engine->messenger());
497 bool did_call_callback =
false;
498 bool did_call_reply =
false;
499 bool did_call_dart_reply =
false;
501 std::unique_ptr<std::thread> reply_thread;
502 binary_messenger->SetMessageHandler(
504 [&did_call_callback, &did_call_dart_reply, &reply_thread](
506 if (message_size == 5) {
507 EXPECT_EQ(
message[0],
static_cast<uint8_t
>(
'h'));
508 reply_thread.reset(
new std::thread([reply = std::move(reply)]() {
509 char response[] = {
'b',
'y',
'e'};
510 reply(
reinterpret_cast<uint8_t*
>(response), 3);
512 did_call_callback =
true;
514 EXPECT_EQ(message_size, 3);
515 EXPECT_EQ(
message[0],
static_cast<uint8_t
>(
'b'));
516 did_call_dart_reply =
true;
519 char payload[] = {
'h',
'e',
'l',
'l',
'o'};
520 binary_messenger->Send(
521 channel,
reinterpret_cast<uint8_t*
>(payload), 5,
522 [&did_call_reply](
const uint8_t* reply,
size_t reply_size) {
523 EXPECT_EQ(reply_size, 5);
524 EXPECT_EQ(reply[0],
static_cast<uint8_t
>(
'h'));
525 did_call_reply =
true;
528 while (!did_call_callback || !did_call_reply || !did_call_dart_reply) {
529 engine->task_runner()->ProcessTasks();
531 ASSERT_TRUE(reply_thread);
532 reply_thread->join();
537 std::unique_ptr<FlutterWindowsEngine>
engine = builder.Build();
541 const std::vector<uint8_t> test_message = {1, 2, 3, 4};
542 auto* dummy_response_handle =
545 void* reply_user_data =
reinterpret_cast<void*
>(6);
549 bool create_response_handle_called =
false;
552 PlatformMessageCreateResponseHandle,
553 ([&create_response_handle_called, &reply_handler, reply_user_data,
555 auto response_handle) {
556 create_response_handle_called =
true;
557 EXPECT_EQ(reply, reply_handler);
559 EXPECT_NE(response_handle,
nullptr);
560 *response_handle = dummy_response_handle;
563 bool release_response_handle_called =
false;
566 PlatformMessageReleaseResponseHandle,
567 ([&release_response_handle_called, dummy_response_handle](
568 auto engine,
auto response_handle) {
569 release_response_handle_called =
true;
570 EXPECT_EQ(response_handle, dummy_response_handle);
573 bool send_message_called =
false;
575 SendPlatformMessage, ([&send_message_called, test_message,
577 send_message_called =
true;
578 EXPECT_STREQ(
message->channel,
"test");
579 EXPECT_EQ(
message->message_size, test_message.size());
580 EXPECT_EQ(memcmp(
message->message, test_message.data(),
583 EXPECT_EQ(
message->response_handle, dummy_response_handle);
587 engine->SendPlatformMessage(
channel, test_message.data(), test_message.size(),
588 reply_handler, reply_user_data);
589 EXPECT_TRUE(create_response_handle_called);
590 EXPECT_TRUE(release_response_handle_called);
591 EXPECT_TRUE(send_message_called);
596 std::unique_ptr<FlutterWindowsEngine>
engine = builder.Build();
602 SendSemanticsAction, ([&called, &
message](
auto engine,
auto info) {
604 EXPECT_EQ(info->view_id, 456);
605 EXPECT_EQ(info->node_id, 42);
607 EXPECT_EQ(memcmp(info->data,
message.c_str(),
message.size()), 0);
608 EXPECT_EQ(info->data_length,
message.size());
620 EXPECT_EQ(GetThreadPriority(GetCurrentThread()),
621 THREAD_PRIORITY_BELOW_NORMAL);
624 EXPECT_EQ(GetThreadPriority(GetCurrentThread()),
625 THREAD_PRIORITY_ABOVE_NORMAL);
628 EXPECT_EQ(GetThreadPriority(GetCurrentThread()),
629 THREAD_PRIORITY_ABOVE_NORMAL);
633 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL);
636 EXPECT_EQ(GetThreadPriority(GetCurrentThread()), THREAD_PRIORITY_NORMAL);
641 std::unique_ptr<FlutterWindowsEngine>
engine = builder.Build();
645 std::make_shared<MockKeyResponseController>());
652 engine->AddPluginRegistrarDestructionCallback(
654 auto result =
reinterpret_cast<int*
>(ref);
658 engine->AddPluginRegistrarDestructionCallback(
660 auto result =
reinterpret_cast<int*
>(ref);
666 EXPECT_EQ(result1, 1);
667 EXPECT_EQ(result2, 2);
672 std::unique_ptr<FlutterWindowsEngine>
engine = builder.Build();
688 std::unique_ptr<FlutterWindowsEngine>
engine = builder.Build();
698 engine->SetNextFrameCallback([]() {});
704 std::unique_ptr<FlutterWindowsEngine>
engine = builder.Build();
705 EXPECT_EQ(
engine->GetExecutableName(),
"flutter_windows_unittests.exe");
711 auto windows_proc_table = std::make_shared<MockWindowsProcTable>();
712 EXPECT_CALL(*windows_proc_table, GetHighContrastEnabled)
713 .WillOnce(Return(
true))
714 .WillOnce(Return(
false));
718 std::unique_ptr<FlutterWindowsEngine>
engine = builder.Build();
721 std::optional<FlutterAccessibilityFeature> engine_flags;
723 UpdateAccessibilityFeatures, ([&engine_flags](
auto engine,
auto flags) {
724 engine_flags = flags;
732 engine->UpdateHighContrastMode();
734 EXPECT_TRUE(
engine->high_contrast_enabled());
735 EXPECT_TRUE(engine_flags.has_value());
737 engine_flags.value() &
741 engine_flags.reset();
742 engine->UpdateHighContrastMode();
744 EXPECT_FALSE(
engine->high_contrast_enabled());
745 EXPECT_TRUE(engine_flags.has_value());
747 engine_flags.value() &
753 std::unique_ptr<FlutterWindowsEngine>
engine = builder.Build();
757 PostRenderThreadTask, ([](
auto engine,
auto callback,
auto context) {
763 engine->PostRasterThreadTask([&called]() { called =
true; });
771 std::unique_ptr<WindowBindingHandler> wbh)
780 NotifyWinEventWrapper,
792 auto& context = GetContext();
799 context.AddNativeFunction(
"Signal", native_entry);
802 ASSERT_NE(
engine,
nullptr);
807 auto window_binding_handler =
808 std::make_unique<NiceMock<MockWindowBindingHandler>>();
809 EXPECT_CALL(*window_binding_handler, GetAlertDelegate)
810 .WillOnce(Return(&delegate));
813 MockFlutterWindowsView
view{windows_engine,
814 std::move(window_binding_handler)};
818 windows_engine->UpdateSemanticsEnabled(
true);
820 EXPECT_CALL(
view, NotifyWinEventWrapper).Times(1);
824 windows_engine->task_runner()->ProcessTasks();
830 auto& context = GetContext();
837 context.AddNativeFunction(
"Signal", native_entry);
840 ASSERT_NE(
engine,
nullptr);
847 windows_engine->task_runner()->ProcessTasks();
856 auto& context = GetContext();
863 context.AddNativeFunction(
"Signal", native_entry);
866 ASSERT_NE(controller,
nullptr);
874 windows_engine->task_runner()->ProcessTasks();
880 EXPECT_EQ(log_capture.
str().find(
"tooltip"), std::string::npos);
892 (std::optional<HWND>, std::optional<WPARAM>, std::optional<LPARAM>,
UINT),
911 bool finished =
false;
913 auto engine = builder.Build();
914 auto window_binding_handler =
915 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
916 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
921 auto handler = std::make_unique<MockWindowsLifecycleManager>(
engine.get());
923 .WillOnce([&finished](std::optional<HWND> hwnd,
924 std::optional<WPARAM> wparam,
925 std::optional<LPARAM> lparam,
926 UINT exit_code) { finished = exit_code == 0; });
927 EXPECT_CALL(*
handler, IsLastWindowOfProcess).WillRepeatedly(Return(
true));
930 engine->lifecycle_manager()->BeginProcessingExit();
934 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(0, WM_CLOSE, 0,
940 engine->task_runner()->ProcessTasks();
947 bool did_call =
false;
949 auto engine = builder.Build();
950 auto window_binding_handler =
951 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
952 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
957 auto handler = std::make_unique<MockWindowsLifecycleManager>(
engine.get());
958 EXPECT_CALL(*
handler, IsLastWindowOfProcess).WillRepeatedly(Return(
true));
959 EXPECT_CALL(*
handler, Quit).Times(0);
961 engine->lifecycle_manager()->BeginProcessingExit();
963 auto binary_messenger =
964 std::make_unique<BinaryMessengerImpl>(
engine->messenger());
965 binary_messenger->SetMessageHandler(
966 "flutter/platform", [&did_call](
const uint8_t*
message,
969 EXPECT_NE(contents.find(
"\"method\":\"System.exitApplication\""),
971 EXPECT_NE(contents.find(
"\"type\":\"required\""), std::string::npos);
972 EXPECT_NE(contents.find(
"\"exitCode\":0"), std::string::npos);
974 char response[] =
"";
975 reply(
reinterpret_cast<uint8_t*
>(response), 0);
980 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(0, WM_CLOSE, 0,
984 engine->task_runner()->ProcessTasks();
994 bool second_close =
false;
996 auto engine = builder.Build();
997 auto window_binding_handler =
998 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
999 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
1004 auto handler = std::make_unique<MockWindowsLifecycleManager>(
engine.get());
1005 EXPECT_CALL(*
handler, IsLastWindowOfProcess).WillOnce(Return(
true));
1007 .WillOnce([handler_ptr =
handler.get()](
1008 std::optional<HWND> hwnd, std::optional<WPARAM> wparam,
1009 std::optional<LPARAM> lparam,
UINT exit_code) {
1010 handler_ptr->WindowsLifecycleManager::Quit(hwnd, wparam, lparam,
1016 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(
1017 hwnd, msg, wparam, lparam);
1020 engine->lifecycle_manager()->BeginProcessingExit();
1028 engine->window_proc_delegate_manager()->RegisterTopLevelWindowProcDelegate(
1033 bool* called =
reinterpret_cast<bool*
>(
user_data);
1040 reinterpret_cast<void*
>(&second_close));
1042 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(0, WM_CLOSE, 0,
1045 while (!second_close) {
1046 engine->task_runner()->ProcessTasks();
1053 bool finished =
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([&finished]() {
1069 EXPECT_CALL(*
handler, Quit).Times(0);
1071 engine->lifecycle_manager()->BeginProcessingExit();
1075 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(0, WM_CLOSE, 0,
1079 engine->task_runner()->ProcessTasks();
1086 auto engine = builder.Build();
1087 auto window_binding_handler =
1088 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1089 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
1094 auto handler = std::make_unique<MockWindowsLifecycleManager>(
engine.get());
1095 EXPECT_CALL(*
handler, IsLastWindowOfProcess).Times(0);
1098 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(0, WM_CLOSE, 0,
1105 auto engine = builder.Build();
1106 auto window_binding_handler =
1107 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1108 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
1113 auto handler = std::make_unique<MockWindowsLifecycleManager>(
engine.get());
1114 EXPECT_CALL(*
handler, IsLastWindowOfProcess).WillOnce(Return(
false));
1116 engine->lifecycle_manager()->BeginProcessingExit();
1118 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(0, WM_CLOSE, 0,
1125 auto engine = builder.Build();
1126 auto window_binding_handler =
1127 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1128 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
1133 auto handler = std::make_unique<MockWindowsLifecycleManager>(
engine.get());
1134 EXPECT_CALL(*
handler, IsLastWindowOfProcess).WillOnce(Return(
false));
1136 engine->lifecycle_manager()->BeginProcessingExit();
1138 engine->lifecycle_manager()->ExternalWindowMessage(0, WM_CLOSE, 0, 0);
1144 auto engine = builder.Build();
1145 auto window_binding_handler =
1146 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1147 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
1154 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(
1155 (HWND)1, WM_SIZE, SIZE_RESTORED, 0);
1157 while (
engine->lifecycle_manager()->IsUpdateStateScheduled()) {
1161 EXPECT_EQ(
engine->lifecycle_manager()->GetLifecycleState(),
1164 engine->lifecycle_manager()->OnWindowStateEvent((HWND)1,
1167 while (
engine->lifecycle_manager()->IsUpdateStateScheduled()) {
1171 EXPECT_EQ(
engine->lifecycle_manager()->GetLifecycleState(),
1174 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(
1175 (HWND)1, WM_SIZE, SIZE_MINIMIZED, 0);
1177 while (
engine->lifecycle_manager()->IsUpdateStateScheduled()) {
1181 EXPECT_EQ(
engine->lifecycle_manager()->GetLifecycleState(),
1184 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(
1185 (HWND)1, WM_SIZE, SIZE_RESTORED, 0);
1187 while (
engine->lifecycle_manager()->IsUpdateStateScheduled()) {
1191 EXPECT_EQ(
engine->lifecycle_manager()->GetLifecycleState(),
1198 auto engine = builder.Build();
1199 auto window_binding_handler =
1200 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1201 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
1210 engine->ProcessExternalWindowMessage(
reinterpret_cast<HWND
>(1), WM_SHOWWINDOW,
1212 engine->ProcessExternalWindowMessage(
reinterpret_cast<HWND
>(1), WM_SHOWWINDOW,
1215 while (
engine->lifecycle_manager()->IsUpdateStateScheduled()) {
1219 EXPECT_EQ(
engine->lifecycle_manager()->GetLifecycleState(),
1225 HWND outer =
reinterpret_cast<HWND
>(1);
1226 HWND inner =
reinterpret_cast<HWND
>(2);
1228 auto engine = builder.Build();
1229 auto window_binding_handler =
1230 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1231 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
1232 ON_CALL(
view, GetWindowHandle).WillByDefault([=]() {
return inner; });
1241 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(
1242 outer, WM_SHOWWINDOW,
TRUE, NULL);
1246 while (
engine->lifecycle_manager()->IsUpdateStateScheduled()) {
1250 EXPECT_EQ(
engine->lifecycle_manager()->GetLifecycleState(),
1256 while (
engine->lifecycle_manager()->IsUpdateStateScheduled()) {
1261 EXPECT_EQ(
engine->lifecycle_manager()->GetLifecycleState(),
1268 bool finished =
false;
1270 auto engine = builder.Build();
1271 auto window_binding_handler =
1272 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1273 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
1278 auto handler = std::make_unique<MockWindowsLifecycleManager>(
engine.get());
1279 EXPECT_CALL(*
handler, SetLifecycleState)
1281 handler_ptr->WindowsLifecycleManager::SetLifecycleState(state);
1285 auto binary_messenger =
1286 std::make_unique<BinaryMessengerImpl>(
engine->messenger());
1288 binary_messenger->SetMessageHandler(
1289 "flutter/unittest", [&finished](
const uint8_t*
message,
1292 EXPECT_NE(contents.find(
"AppLifecycleState.inactive"),
1295 char response[] =
"";
1296 reply(
reinterpret_cast<uint8_t*
>(response), 0);
1302 HWND hwnd =
reinterpret_cast<HWND
>(1);
1305 EXPECT_FALSE(finished);
1309 engine->lifecycle_manager()->BeginProcessingLifecycle();
1313 engine->task_runner()->ProcessTasks();
1320 bool enabled_lifecycle =
false;
1321 bool dart_responded =
false;
1323 auto engine = builder.Build();
1324 auto window_binding_handler =
1325 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1326 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
1331 auto handler = std::make_unique<MockWindowsLifecycleManager>(
engine.get());
1332 EXPECT_CALL(*
handler, SetLifecycleState)
1334 handler_ptr->WindowsLifecycleManager::SetLifecycleState(state);
1336 handler->begin_processing_callback = [&]() { enabled_lifecycle =
true; };
1339 auto binary_messenger =
1340 std::make_unique<BinaryMessengerImpl>(
engine->messenger());
1341 binary_messenger->SetMessageHandler(
1345 EXPECT_NE(contents.find(
"AppLifecycleState."), std::string::npos);
1346 dart_responded =
true;
1347 char response[] =
"";
1348 reply(
reinterpret_cast<uint8_t*
>(response), 0);
1353 while (!enabled_lifecycle) {
1354 engine->task_runner()->ProcessTasks();
1357 HWND hwnd =
reinterpret_cast<HWND
>(1);
1361 while (!dart_responded) {
1362 engine->task_runner()->ProcessTasks();
1370 auto engine = builder.Build();
1371 auto window_binding_handler =
1372 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1373 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
1379 bool lifecycle_began =
false;
1380 auto handler = std::make_unique<MockWindowsLifecycleManager>(
engine.get());
1381 handler->begin_processing_callback = [&]() { lifecycle_began =
true; };
1386 while (!lifecycle_began) {
1387 engine->task_runner()->ProcessTasks();
1394 auto engine = builder.Build();
1397 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1399 bool received_call =
false;
1401 auto manager = std::make_unique<MockPlatformViewManager>(
engine.get());
1402 EXPECT_CALL(*
manager, AddPlatformView)
1404 received_call =
true;
1407 modifier.SetPlatformViewPlugin(std::move(
manager));
1411 while (!received_call) {
1412 engine->task_runner()->ProcessTasks();
1418 auto engine = builder.Build();
1422 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1428 ASSERT_TRUE(
engine->Run());
1432 auto implicit_window = std::make_unique<NiceMock<MockWindowBindingHandler>>();
1434 std::unique_ptr<FlutterWindowsView> implicit_view =
1435 engine->CreateView(std::move(implicit_window),
1438 EXPECT_TRUE(implicit_view);
1441 auto second_window = std::make_unique<NiceMock<MockWindowBindingHandler>>();
1444 engine->CreateView(std::move(second_window),
1446 "FlutterEngineAddView returned an unexpected result");
1452 auto engine = builder.Build();
1456 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1462 ASSERT_TRUE(
engine->Run());
1463 EXPECT_DEBUG_DEATH(
engine->RemoveView(123),
1464 "FlutterEngineRemoveView returned an unexpected result");
1468 auto& context = GetContext();
1473 std::optional<std::thread::id> ui_thread_id;
1476 ui_thread_id = std::this_thread::get_id();
1478 context.AddNativeFunction(
"Signal", native_entry);
1481 while (!ui_thread_id) {
1484 ASSERT_EQ(*ui_thread_id, std::this_thread::get_id());
1489 std::unique_ptr<FlutterWindowsEngine>
engine = builder.Build();
1490 auto window_binding_handler =
1491 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1492 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
1500 EXPECT_CALL(
view, Focus()).WillOnce(Return(
true));
1505 auto& context = GetContext();
1513 context.AddNativeFunction(
"Signal", native_entry);
1517 ASSERT_NE(
engine,
nullptr);
1519 auto window_binding_handler1 =
1520 std::make_unique<NiceMock<MockWindowBindingHandler>>();
1521 auto window_binding_handler2 =
1522 std::make_unique<NiceMock<MockWindowBindingHandler>>();
1527 EXPECT_CALL(*window_binding_handler1, GetPhysicalWindowBounds)
1529 EXPECT_CALL(*window_binding_handler1, GetDpiScale)
1530 .WillRepeatedly(testing::Return(96.0));
1531 EXPECT_CALL(*window_binding_handler2, GetPhysicalWindowBounds)
1533 EXPECT_CALL(*window_binding_handler2, GetDpiScale)
1534 .WillRepeatedly(testing::Return(96.0));
1543 auto view1 = windows_engine->CreateView(std::move(window_binding_handler1),
1546 auto view2 = windows_engine->CreateView(std::move(window_binding_handler2),
1552 windows_engine->UpdateSemanticsEnabled(
true);
1555 windows_engine->task_runner()->ProcessTasks();
1558 auto accessibility_bridge1 = view1->accessibility_bridge().lock();
1559 auto accessibility_bridge2 = view2->accessibility_bridge().lock();
1564 !accessibility_bridge1->GetPlatformNodeFromTree(view1->view_id() + 1)) {
1565 windows_engine->task_runner()->ProcessTasks();
1569 !accessibility_bridge2->GetPlatformNodeFromTree(view2->view_id() + 1)) {
1570 windows_engine->task_runner()->ProcessTasks();
1574 auto tree1 = accessibility_bridge1->GetTree();
1575 auto tree2 = accessibility_bridge2->GetTree();
1576 EXPECT_NE(tree1->GetFromId(view1->view_id() + 1),
nullptr);
1577 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)
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)