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)
776 NotifyWinEventWrapper,
788 auto& context = GetContext();
795 context.AddNativeFunction(
"Signal", native_entry);
798 ASSERT_NE(
engine,
nullptr);
803 auto window_binding_handler =
804 std::make_unique<NiceMock<MockWindowBindingHandler>>();
805 EXPECT_CALL(*window_binding_handler, GetAlertDelegate)
806 .WillOnce(Return(&delegate));
809 MockFlutterWindowsView
view{windows_engine,
810 std::move(window_binding_handler)};
814 windows_engine->UpdateSemanticsEnabled(
true);
816 EXPECT_CALL(
view, NotifyWinEventWrapper).Times(1);
820 windows_engine->task_runner()->ProcessTasks();
826 auto& context = GetContext();
833 context.AddNativeFunction(
"Signal", native_entry);
836 ASSERT_NE(
engine,
nullptr);
843 windows_engine->task_runner()->ProcessTasks();
852 auto& context = GetContext();
859 context.AddNativeFunction(
"Signal", native_entry);
862 ASSERT_NE(controller,
nullptr);
870 windows_engine->task_runner()->ProcessTasks();
876 EXPECT_EQ(log_capture.
str().find(
"tooltip"), std::string::npos);
888 (std::optional<HWND>, std::optional<WPARAM>, std::optional<LPARAM>,
UINT),
907 bool finished =
false;
909 auto engine = builder.Build();
910 auto window_binding_handler =
911 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
912 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
917 auto handler = std::make_unique<MockWindowsLifecycleManager>(
engine.get());
919 .WillOnce([&finished](std::optional<HWND> hwnd,
920 std::optional<WPARAM> wparam,
921 std::optional<LPARAM> lparam,
922 UINT exit_code) { finished = exit_code == 0; });
923 EXPECT_CALL(*
handler, IsLastWindowOfProcess).WillRepeatedly(Return(
true));
926 engine->lifecycle_manager()->BeginProcessingExit();
930 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(0, WM_CLOSE, 0,
936 engine->task_runner()->ProcessTasks();
943 bool did_call =
false;
945 auto engine = builder.Build();
946 auto window_binding_handler =
947 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
948 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
953 auto handler = std::make_unique<MockWindowsLifecycleManager>(
engine.get());
954 EXPECT_CALL(*
handler, IsLastWindowOfProcess).WillRepeatedly(Return(
true));
955 EXPECT_CALL(*
handler, Quit).Times(0);
957 engine->lifecycle_manager()->BeginProcessingExit();
959 auto binary_messenger =
960 std::make_unique<BinaryMessengerImpl>(
engine->messenger());
961 binary_messenger->SetMessageHandler(
962 "flutter/platform", [&did_call](
const uint8_t*
message,
965 EXPECT_NE(contents.find(
"\"method\":\"System.exitApplication\""),
967 EXPECT_NE(contents.find(
"\"type\":\"required\""), std::string::npos);
968 EXPECT_NE(contents.find(
"\"exitCode\":0"), std::string::npos);
970 char response[] =
"";
971 reply(
reinterpret_cast<uint8_t*
>(response), 0);
976 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(0, WM_CLOSE, 0,
980 engine->task_runner()->ProcessTasks();
990 bool second_close =
false;
992 auto engine = builder.Build();
993 auto window_binding_handler =
994 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
995 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
1000 auto handler = std::make_unique<MockWindowsLifecycleManager>(
engine.get());
1001 EXPECT_CALL(*
handler, IsLastWindowOfProcess).WillOnce(Return(
true));
1003 .WillOnce([handler_ptr =
handler.get()](
1004 std::optional<HWND> hwnd, std::optional<WPARAM> wparam,
1005 std::optional<LPARAM> lparam,
UINT exit_code) {
1006 handler_ptr->WindowsLifecycleManager::Quit(hwnd, wparam, lparam,
1012 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(
1013 hwnd, msg, wparam, lparam);
1016 engine->lifecycle_manager()->BeginProcessingExit();
1024 engine->window_proc_delegate_manager()->RegisterTopLevelWindowProcDelegate(
1029 bool* called =
reinterpret_cast<bool*
>(
user_data);
1036 reinterpret_cast<void*
>(&second_close));
1038 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(0, WM_CLOSE, 0,
1041 while (!second_close) {
1042 engine->task_runner()->ProcessTasks();
1049 bool finished =
false;
1051 auto engine = builder.Build();
1052 auto window_binding_handler =
1053 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1054 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
1059 auto handler = std::make_unique<MockWindowsLifecycleManager>(
engine.get());
1060 EXPECT_CALL(*
handler, IsLastWindowOfProcess).WillOnce([&finished]() {
1065 EXPECT_CALL(*
handler, Quit).Times(0);
1067 engine->lifecycle_manager()->BeginProcessingExit();
1071 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(0, WM_CLOSE, 0,
1075 engine->task_runner()->ProcessTasks();
1082 auto engine = builder.Build();
1083 auto window_binding_handler =
1084 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1085 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
1090 auto handler = std::make_unique<MockWindowsLifecycleManager>(
engine.get());
1091 EXPECT_CALL(*
handler, IsLastWindowOfProcess).Times(0);
1094 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(0, WM_CLOSE, 0,
1101 auto engine = builder.Build();
1102 auto window_binding_handler =
1103 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1104 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
1109 auto handler = std::make_unique<MockWindowsLifecycleManager>(
engine.get());
1110 EXPECT_CALL(*
handler, IsLastWindowOfProcess).WillOnce(Return(
false));
1112 engine->lifecycle_manager()->BeginProcessingExit();
1114 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(0, WM_CLOSE, 0,
1121 auto engine = builder.Build();
1122 auto window_binding_handler =
1123 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1124 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
1129 auto handler = std::make_unique<MockWindowsLifecycleManager>(
engine.get());
1130 EXPECT_CALL(*
handler, IsLastWindowOfProcess).WillOnce(Return(
false));
1132 engine->lifecycle_manager()->BeginProcessingExit();
1134 engine->lifecycle_manager()->ExternalWindowMessage(0, WM_CLOSE, 0, 0);
1140 auto engine = builder.Build();
1141 auto window_binding_handler =
1142 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1143 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
1150 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(
1151 (HWND)1, WM_SIZE, SIZE_RESTORED, 0);
1153 while (
engine->lifecycle_manager()->IsUpdateStateScheduled()) {
1157 EXPECT_EQ(
engine->lifecycle_manager()->GetLifecycleState(),
1160 engine->lifecycle_manager()->OnWindowStateEvent((HWND)1,
1163 while (
engine->lifecycle_manager()->IsUpdateStateScheduled()) {
1167 EXPECT_EQ(
engine->lifecycle_manager()->GetLifecycleState(),
1170 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(
1171 (HWND)1, WM_SIZE, SIZE_MINIMIZED, 0);
1173 while (
engine->lifecycle_manager()->IsUpdateStateScheduled()) {
1177 EXPECT_EQ(
engine->lifecycle_manager()->GetLifecycleState(),
1180 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(
1181 (HWND)1, WM_SIZE, SIZE_RESTORED, 0);
1183 while (
engine->lifecycle_manager()->IsUpdateStateScheduled()) {
1187 EXPECT_EQ(
engine->lifecycle_manager()->GetLifecycleState(),
1194 auto engine = builder.Build();
1195 auto window_binding_handler =
1196 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1197 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
1206 engine->ProcessExternalWindowMessage(
reinterpret_cast<HWND
>(1), WM_SHOWWINDOW,
1208 engine->ProcessExternalWindowMessage(
reinterpret_cast<HWND
>(1), WM_SHOWWINDOW,
1211 while (
engine->lifecycle_manager()->IsUpdateStateScheduled()) {
1215 EXPECT_EQ(
engine->lifecycle_manager()->GetLifecycleState(),
1221 HWND outer =
reinterpret_cast<HWND
>(1);
1222 HWND inner =
reinterpret_cast<HWND
>(2);
1224 auto engine = builder.Build();
1225 auto window_binding_handler =
1226 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1227 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
1228 ON_CALL(
view, GetWindowHandle).WillByDefault([=]() {
return inner; });
1237 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(
1238 outer, WM_SHOWWINDOW,
TRUE, NULL);
1242 while (
engine->lifecycle_manager()->IsUpdateStateScheduled()) {
1246 EXPECT_EQ(
engine->lifecycle_manager()->GetLifecycleState(),
1252 while (
engine->lifecycle_manager()->IsUpdateStateScheduled()) {
1257 EXPECT_EQ(
engine->lifecycle_manager()->GetLifecycleState(),
1264 bool finished =
false;
1266 auto engine = builder.Build();
1267 auto window_binding_handler =
1268 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1269 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
1274 auto handler = std::make_unique<MockWindowsLifecycleManager>(
engine.get());
1275 EXPECT_CALL(*
handler, SetLifecycleState)
1277 handler_ptr->WindowsLifecycleManager::SetLifecycleState(state);
1281 auto binary_messenger =
1282 std::make_unique<BinaryMessengerImpl>(
engine->messenger());
1284 binary_messenger->SetMessageHandler(
1285 "flutter/unittest", [&finished](
const uint8_t*
message,
1288 EXPECT_NE(contents.find(
"AppLifecycleState.inactive"),
1291 char response[] =
"";
1292 reply(
reinterpret_cast<uint8_t*
>(response), 0);
1298 HWND hwnd =
reinterpret_cast<HWND
>(1);
1301 EXPECT_FALSE(finished);
1305 engine->lifecycle_manager()->BeginProcessingLifecycle();
1309 engine->task_runner()->ProcessTasks();
1316 bool enabled_lifecycle =
false;
1317 bool dart_responded =
false;
1319 auto engine = builder.Build();
1320 auto window_binding_handler =
1321 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1322 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
1327 auto handler = std::make_unique<MockWindowsLifecycleManager>(
engine.get());
1328 EXPECT_CALL(*
handler, SetLifecycleState)
1330 handler_ptr->WindowsLifecycleManager::SetLifecycleState(state);
1332 handler->begin_processing_callback = [&]() { enabled_lifecycle =
true; };
1335 auto binary_messenger =
1336 std::make_unique<BinaryMessengerImpl>(
engine->messenger());
1337 binary_messenger->SetMessageHandler(
1341 EXPECT_NE(contents.find(
"AppLifecycleState."), std::string::npos);
1342 dart_responded =
true;
1343 char response[] =
"";
1344 reply(
reinterpret_cast<uint8_t*
>(response), 0);
1349 while (!enabled_lifecycle) {
1350 engine->task_runner()->ProcessTasks();
1353 HWND hwnd =
reinterpret_cast<HWND
>(1);
1357 while (!dart_responded) {
1358 engine->task_runner()->ProcessTasks();
1366 auto engine = builder.Build();
1367 auto window_binding_handler =
1368 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1369 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
1375 bool lifecycle_began =
false;
1376 auto handler = std::make_unique<MockWindowsLifecycleManager>(
engine.get());
1377 handler->begin_processing_callback = [&]() { lifecycle_began =
true; };
1382 while (!lifecycle_began) {
1383 engine->task_runner()->ProcessTasks();
1390 auto engine = builder.Build();
1393 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1395 bool received_call =
false;
1397 auto manager = std::make_unique<MockPlatformViewManager>(
engine.get());
1398 EXPECT_CALL(*
manager, AddPlatformView)
1400 received_call =
true;
1403 modifier.SetPlatformViewPlugin(std::move(
manager));
1407 while (!received_call) {
1408 engine->task_runner()->ProcessTasks();
1414 auto engine = builder.Build();
1418 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1424 ASSERT_TRUE(
engine->Run());
1428 auto implicit_window = std::make_unique<NiceMock<MockWindowBindingHandler>>();
1430 std::unique_ptr<FlutterWindowsView> implicit_view =
1431 engine->CreateView(std::move(implicit_window));
1433 EXPECT_TRUE(implicit_view);
1436 auto second_window = std::make_unique<NiceMock<MockWindowBindingHandler>>();
1438 EXPECT_DEBUG_DEATH(
engine->CreateView(std::move(second_window)),
1439 "FlutterEngineAddView returned an unexpected result");
1445 auto engine = builder.Build();
1449 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1455 ASSERT_TRUE(
engine->Run());
1456 EXPECT_DEBUG_DEATH(
engine->RemoveView(123),
1457 "FlutterEngineRemoveView returned an unexpected result");
1461 auto& context = GetContext();
1466 std::optional<std::thread::id> ui_thread_id;
1469 ui_thread_id = std::this_thread::get_id();
1471 context.AddNativeFunction(
"Signal", native_entry);
1474 while (!ui_thread_id) {
1477 ASSERT_EQ(*ui_thread_id, std::this_thread::get_id());
1482 std::unique_ptr<FlutterWindowsEngine>
engine = builder.Build();
1483 auto window_binding_handler =
1484 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1485 MockFlutterWindowsView
view(
engine.get(), std::move(window_binding_handler));
1493 EXPECT_CALL(
view, Focus()).WillOnce(Return(
true));
1498 auto& context = GetContext();
1506 context.AddNativeFunction(
"Signal", native_entry);
1510 ASSERT_NE(
engine,
nullptr);
1512 auto window_binding_handler1 =
1513 std::make_unique<NiceMock<MockWindowBindingHandler>>();
1514 auto window_binding_handler2 =
1515 std::make_unique<NiceMock<MockWindowBindingHandler>>();
1520 EXPECT_CALL(*window_binding_handler1, GetPhysicalWindowBounds)
1522 EXPECT_CALL(*window_binding_handler1, GetDpiScale)
1523 .WillRepeatedly(testing::Return(96.0));
1524 EXPECT_CALL(*window_binding_handler2, GetPhysicalWindowBounds)
1526 EXPECT_CALL(*window_binding_handler2, GetDpiScale)
1527 .WillRepeatedly(testing::Return(96.0));
1536 auto view1 = windows_engine->CreateView(std::move(window_binding_handler1));
1537 auto view2 = windows_engine->CreateView(std::move(window_binding_handler2));
1541 windows_engine->UpdateSemanticsEnabled(
true);
1544 windows_engine->task_runner()->ProcessTasks();
1547 auto accessibility_bridge1 = view1->accessibility_bridge().lock();
1548 auto accessibility_bridge2 = view2->accessibility_bridge().lock();
1553 !accessibility_bridge1->GetPlatformNodeFromTree(view1->view_id() + 1)) {
1554 windows_engine->task_runner()->ProcessTasks();
1558 !accessibility_bridge2->GetPlatformNodeFromTree(view2->view_id() + 1)) {
1559 windows_engine->task_runner()->ProcessTasks();
1563 auto tree1 = accessibility_bridge1->GetTree();
1564 auto tree2 = accessibility_bridge2->GetTree();
1565 EXPECT_NE(tree1->GetFromId(view1->view_id() + 1),
nullptr);
1566 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
G_BEGIN_DECLS GBytes * message
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)