8 #include "flutter/fml/logging.h"
9 #include "flutter/fml/macros.h"
10 #include "flutter/shell/platform/embedder/embedder.h"
11 #include "flutter/shell/platform/embedder/test_utils/proc_table_replacement.h"
14 #include "flutter/shell/platform/windows/testing/egl/mock_manager.h"
15 #include "flutter/shell/platform/windows/testing/engine_modifier.h"
16 #include "flutter/shell/platform/windows/testing/flutter_windows_engine_builder.h"
17 #include "flutter/shell/platform/windows/testing/mock_platform_view_manager.h"
18 #include "flutter/shell/platform/windows/testing/mock_window_binding_handler.h"
19 #include "flutter/shell/platform/windows/testing/mock_windows_proc_table.h"
20 #include "flutter/shell/platform/windows/testing/test_keyboard.h"
21 #include "flutter/shell/platform/windows/testing/windows_test.h"
22 #include "flutter/shell/platform/windows/testing/windows_test_config_builder.h"
23 #include "flutter/third_party/accessibility/ax/platform/ax_platform_node_win.h"
24 #include "fml/synchronization/waitable_event.h"
25 #include "gmock/gmock.h"
26 #include "gtest/gtest.h"
36 if (::GetMessage(&msg,
nullptr, 0, 0)) {
37 ::TranslateMessage(&msg);
38 ::DispatchMessage(&msg);
47 using ::testing::DoAll;
48 using ::testing::NiceMock;
49 using ::testing::Return;
50 using ::testing::SetArgPointee;
56 FlutterWindowsEngineBuilder builder{GetContext()};
57 std::unique_ptr<FlutterWindowsEngine> engine = builder.Build();
59 EngineModifier modifier(engine.get());
60 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
62 ASSERT_TRUE(engine->Run());
64 ASSERT_EQ(engine->view(123),
nullptr);
68 FlutterWindowsEngineBuilder builder{GetContext()};
69 builder.AddDartEntrypointArgument(
"arg1");
70 builder.AddDartEntrypointArgument(
"arg2");
72 auto windows_proc_table = std::make_shared<MockWindowsProcTable>();
74 HMONITOR mock_monitor =
reinterpret_cast<HMONITOR
>(1);
76 MONITORINFOEXW monitor_info = {};
77 monitor_info.cbSize =
sizeof(MONITORINFOEXW);
78 monitor_info.rcMonitor = {0, 0, 1920, 1080};
79 monitor_info.rcWork = {0, 0, 1920, 1080};
80 monitor_info.dwFlags = MONITORINFOF_PRIMARY;
81 wcscpy_s(monitor_info.szDevice, L
"\\\\.\\DISPLAY1");
83 EXPECT_CALL(*windows_proc_table, GetMonitorInfoW(mock_monitor, _))
84 .WillRepeatedly(DoAll(SetArgPointee<1>(monitor_info), Return(TRUE)));
86 EXPECT_CALL(*windows_proc_table, EnumDisplayMonitors(
nullptr,
nullptr, _, _))
87 .WillRepeatedly([&](HDC hdc, LPCRECT lprcClip, MONITORENUMPROC lpfnEnum,
89 lpfnEnum(mock_monitor,
nullptr, &monitor_info.rcMonitor, dwData);
94 .WillRepeatedly(Return(96));
97 EXPECT_CALL(*windows_proc_table, GetThreadPreferredUILanguages(_, _, _, _))
99 [](DWORD flags, PULONG count, PZZWSTR languages, PULONG length) {
103 if (languages ==
nullptr) {
112 wchar_t* lang_buffer = languages;
113 wcscpy(lang_buffer, L
"fr-FR");
115 lang_buffer += wcslen(L
"fr-FR") + 1;
116 *lang_buffer = L
'\0';
121 builder.SetWindowsProcTable(windows_proc_table);
123 std::unique_ptr<FlutterWindowsEngine> engine = builder.Build();
124 EngineModifier modifier(engine.get());
127 bool run_called =
false;
128 modifier.embedder_api().Run = MOCK_ENGINE_PROC(
129 Run, ([&run_called, engine_instance = engine.get()](
130 size_t version,
const FlutterRendererConfig* config,
131 const FlutterProjectArgs* args,
void*
user_data,
134 *engine_out =
reinterpret_cast<FLUTTER_API_SYMBOL(
FlutterEngine)
>(1);
136 EXPECT_EQ(version, FLUTTER_ENGINE_VERSION);
137 EXPECT_NE(config,
nullptr);
139 EXPECT_EQ(config->type, kOpenGL);
142 EXPECT_NE(args->assets_path,
nullptr);
143 EXPECT_NE(args->icu_data_path,
nullptr);
144 EXPECT_EQ(args->dart_entrypoint_argc, 2U);
145 EXPECT_EQ(strcmp(args->dart_entrypoint_argv[0],
"arg1"), 0);
146 EXPECT_EQ(strcmp(args->dart_entrypoint_argv[1],
"arg2"), 0);
147 EXPECT_NE(args->platform_message_callback,
nullptr);
148 EXPECT_NE(args->custom_task_runners,
nullptr);
149 EXPECT_NE(args->custom_task_runners->thread_priority_setter,
nullptr);
150 EXPECT_EQ(args->custom_dart_entrypoint,
nullptr);
151 EXPECT_NE(args->vsync_callback,
nullptr);
152 EXPECT_EQ(args->update_semantics_callback,
nullptr);
153 EXPECT_NE(args->update_semantics_callback2,
nullptr);
154 EXPECT_EQ(args->update_semantics_node_callback,
nullptr);
155 EXPECT_EQ(args->update_semantics_custom_action_callback,
nullptr);
156 EXPECT_NE(args->view_focus_change_request_callback,
nullptr);
158 args->custom_task_runners->thread_priority_setter(
159 FlutterThreadPriority::kRaster);
160 EXPECT_EQ(GetThreadPriority(GetCurrentThread()),
161 THREAD_PRIORITY_ABOVE_NORMAL);
165 modifier.embedder_api().UpdateAccessibilityFeatures = MOCK_ENGINE_PROC(
166 UpdateAccessibilityFeatures,
168 FlutterAccessibilityFeature flags) {
return kSuccess; });
171 bool update_locales_called =
false;
172 modifier.embedder_api().UpdateLocales = MOCK_ENGINE_PROC(
174 ([&update_locales_called](
auto engine,
const FlutterLocale** locales,
175 size_t locales_count) {
176 update_locales_called =
true;
178 EXPECT_GT(locales_count, 0);
179 EXPECT_NE(locales,
nullptr);
185 bool settings_message_sent =
false;
186 modifier.embedder_api().SendPlatformMessage = MOCK_ENGINE_PROC(
188 ([&settings_message_sent](
auto engine,
auto message) {
189 if (std::string(
message->channel) == std::string(
"flutter/settings")) {
190 settings_message_sent = true;
197 bool notify_display_update_called =
false;
199 modifier.embedder_api().NotifyDisplayUpdate = MOCK_ENGINE_PROC(
201 ([¬ify_display_update_called](
203 const FlutterEngineDisplaysUpdateType update_type,
204 const FlutterEngineDisplay* embedder_displays,
205 size_t display_count) {
206 EXPECT_EQ(update_type, kFlutterEngineDisplaysUpdateTypeStartup);
207 notify_display_update_called =
true;
212 modifier.SetEGLManager(std::make_unique<egl::MockManager>());
216 EXPECT_TRUE(run_called);
217 EXPECT_TRUE(update_locales_called);
218 EXPECT_TRUE(settings_message_sent);
219 EXPECT_TRUE(notify_display_update_called);
223 modifier.embedder_api().Shutdown = [](
auto engine) {
return kSuccess; };
224 modifier.ReleaseEGLManager();
228 FlutterWindowsEngineBuilder builder{GetContext()};
229 std::unique_ptr<FlutterWindowsEngine> engine = builder.Build();
230 EngineModifier modifier(engine.get());
231 bool on_vsync_called =
false;
233 modifier.embedder_api().GetCurrentTime =
234 MOCK_ENGINE_PROC(GetCurrentTime, ([]() -> uint64_t {
return 1; }));
235 modifier.embedder_api().OnVsync = MOCK_ENGINE_PROC(
237 ([&on_vsync_called, engine_instance = engine.get()](
239 uint64_t frame_start_time_nanos, uint64_t frame_target_time_nanos) {
241 EXPECT_EQ(frame_start_time_nanos, 16600000);
242 EXPECT_EQ(frame_target_time_nanos, 33200000);
243 on_vsync_called =
true;
246 modifier.SetStartTime(0);
247 modifier.SetFrameInterval(16600000);
251 EXPECT_TRUE(on_vsync_called);
255 FlutterWindowsEngineBuilder builder{GetContext()};
256 std::unique_ptr<FlutterWindowsEngine> engine = builder.Build();
257 EngineModifier modifier(engine.get());
259 modifier.embedder_api().NotifyDisplayUpdate =
260 MOCK_ENGINE_PROC(NotifyDisplayUpdate,
261 ([engine_instance = engine.get()](
263 const FlutterEngineDisplaysUpdateType update_type,
264 const FlutterEngineDisplay* embedder_displays,
265 size_t display_count) {
return kSuccess; }));
268 bool run_called =
false;
269 modifier.embedder_api().Run = MOCK_ENGINE_PROC(
270 Run, ([&run_called, engine_instance = engine.get()](
271 size_t version,
const FlutterRendererConfig* config,
272 const FlutterProjectArgs* args,
void*
user_data,
275 *engine_out =
reinterpret_cast<FLUTTER_API_SYMBOL(
FlutterEngine)
>(1);
277 EXPECT_EQ(config->type, kSoftware);
281 modifier.embedder_api().UpdateAccessibilityFeatures = MOCK_ENGINE_PROC(
282 UpdateAccessibilityFeatures,
284 FlutterAccessibilityFeature flags) {
return kSuccess; });
288 modifier.embedder_api().UpdateLocales = MOCK_ENGINE_PROC(
289 UpdateLocales, ([](
auto engine,
const FlutterLocale** locales,
290 size_t locales_count) {
return kSuccess; }));
291 modifier.embedder_api().SendPlatformMessage =
292 MOCK_ENGINE_PROC(SendPlatformMessage,
293 ([](
auto engine,
auto message) {
return kSuccess; }));
296 modifier.SetEGLManager(
nullptr);
300 EXPECT_TRUE(run_called);
304 modifier.embedder_api().Shutdown = [](
auto engine) {
return kSuccess; };
308 FlutterWindowsEngineBuilder builder{GetContext()};
309 builder.SetSwitches({
"--enable-impeller=true"});
310 std::unique_ptr<FlutterWindowsEngine> engine = builder.Build();
311 EngineModifier modifier(engine.get());
313 modifier.embedder_api().NotifyDisplayUpdate =
314 MOCK_ENGINE_PROC(NotifyDisplayUpdate,
315 ([engine_instance = engine.get()](
317 const FlutterEngineDisplaysUpdateType update_type,
318 const FlutterEngineDisplay* embedder_displays,
319 size_t display_count) {
return kSuccess; }));
322 modifier.embedder_api().UpdateAccessibilityFeatures = MOCK_ENGINE_PROC(
323 UpdateAccessibilityFeatures,
325 FlutterAccessibilityFeature flags) {
return kSuccess; });
329 modifier.embedder_api().UpdateLocales = MOCK_ENGINE_PROC(
330 UpdateLocales, ([](
auto engine,
const FlutterLocale** locales,
331 size_t locales_count) {
return kSuccess; }));
332 modifier.embedder_api().SendPlatformMessage =
333 MOCK_ENGINE_PROC(SendPlatformMessage,
334 ([](
auto engine,
auto message) {
return kSuccess; }));
337 modifier.SetEGLManager(
nullptr);
339 EXPECT_FALSE(engine->Run());
343 FlutterWindowsEngineBuilder builder{GetContext()};
344 std::unique_ptr<FlutterWindowsEngine> engine = builder.Build();
345 EngineModifier modifier(engine.get());
347 const char* channel =
"test";
348 const std::vector<uint8_t> test_message = {1, 2, 3, 4};
352 modifier.embedder_api().SendPlatformMessage = MOCK_ENGINE_PROC(
353 SendPlatformMessage, ([&called, test_message](
auto engine,
auto message) {
355 EXPECT_STREQ(
message->channel,
"test");
356 EXPECT_EQ(
message->message_size, test_message.size());
357 EXPECT_EQ(memcmp(
message->message, test_message.data(),
360 EXPECT_EQ(
message->response_handle,
nullptr);
364 engine->SendPlatformMessage(channel, test_message.data(), test_message.size(),
370 FlutterWindowsEngineBuilder builder{GetContext()};
371 builder.SetDartEntrypoint(
"hiPlatformChannels");
373 std::unique_ptr<FlutterWindowsEngine> engine = builder.Build();
374 EngineModifier modifier(engine.get());
375 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
377 auto binary_messenger =
378 std::make_unique<BinaryMessengerImpl>(engine->messenger());
381 bool did_call_callback =
false;
382 bool did_call_reply =
false;
383 bool did_call_dart_reply =
false;
384 std::string channel =
"hi";
385 binary_messenger->SetMessageHandler(
387 [&did_call_callback, &did_call_dart_reply](
389 if (message_size == 5) {
390 EXPECT_EQ(
message[0],
static_cast<uint8_t
>(
'h'));
391 char response[] = {
'b',
'y',
'e'};
392 reply(
reinterpret_cast<uint8_t*
>(response), 3);
393 did_call_callback =
true;
395 EXPECT_EQ(message_size, 3);
396 EXPECT_EQ(
message[0],
static_cast<uint8_t
>(
'b'));
397 did_call_dart_reply =
true;
400 char payload[] = {
'h',
'e',
'l',
'l',
'o'};
401 binary_messenger->Send(
402 channel,
reinterpret_cast<uint8_t*
>(payload), 5,
403 [&did_call_reply](
const uint8_t* reply,
size_t reply_size) {
404 EXPECT_EQ(reply_size, 5);
405 EXPECT_EQ(reply[0],
static_cast<uint8_t
>(
'h'));
406 did_call_reply =
true;
409 while (!did_call_callback || !did_call_reply || !did_call_dart_reply) {
410 engine->task_runner()->ProcessTasks();
415 FlutterWindowsEngineBuilder builder{GetContext()};
416 builder.SetDartEntrypoint(
"hiPlatformChannels");
418 std::unique_ptr<FlutterWindowsEngine> engine = builder.Build();
420 EngineModifier modifier(engine.get());
421 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
423 auto binary_messenger =
424 std::make_unique<BinaryMessengerImpl>(engine->messenger());
427 bool did_call_callback =
false;
428 bool did_call_reply =
false;
429 bool did_call_dart_reply =
false;
430 std::string channel =
"hi";
431 std::unique_ptr<std::thread> reply_thread;
432 binary_messenger->SetMessageHandler(
434 [&did_call_callback, &did_call_dart_reply, &reply_thread](
436 if (message_size == 5) {
437 EXPECT_EQ(
message[0],
static_cast<uint8_t
>(
'h'));
438 reply_thread.reset(
new std::thread([reply = std::move(reply)]() {
439 char response[] = {
'b',
'y',
'e'};
440 reply(
reinterpret_cast<uint8_t*
>(response), 3);
442 did_call_callback =
true;
444 EXPECT_EQ(message_size, 3);
445 EXPECT_EQ(
message[0],
static_cast<uint8_t
>(
'b'));
446 did_call_dart_reply =
true;
449 char payload[] = {
'h',
'e',
'l',
'l',
'o'};
450 binary_messenger->Send(
451 channel,
reinterpret_cast<uint8_t*
>(payload), 5,
452 [&did_call_reply](
const uint8_t* reply,
size_t reply_size) {
453 EXPECT_EQ(reply_size, 5);
454 EXPECT_EQ(reply[0],
static_cast<uint8_t
>(
'h'));
455 did_call_reply =
true;
458 while (!did_call_callback || !did_call_reply || !did_call_dart_reply) {
459 engine->task_runner()->ProcessTasks();
461 ASSERT_TRUE(reply_thread);
462 reply_thread->join();
466 FlutterWindowsEngineBuilder builder{GetContext()};
467 std::unique_ptr<FlutterWindowsEngine> engine = builder.Build();
468 EngineModifier modifier(engine.get());
470 const char* channel =
"test";
471 const std::vector<uint8_t> test_message = {1, 2, 3, 4};
472 auto* dummy_response_handle =
473 reinterpret_cast<FlutterPlatformMessageResponseHandle*
>(5);
475 void* reply_user_data =
reinterpret_cast<void*
>(6);
479 bool create_response_handle_called =
false;
480 modifier.embedder_api().PlatformMessageCreateResponseHandle =
482 PlatformMessageCreateResponseHandle,
483 ([&create_response_handle_called, &reply_handler, reply_user_data,
484 dummy_response_handle](
auto engine,
auto reply,
auto user_data,
485 auto response_handle) {
486 create_response_handle_called =
true;
487 EXPECT_EQ(reply, reply_handler);
489 EXPECT_NE(response_handle,
nullptr);
490 *response_handle = dummy_response_handle;
493 bool release_response_handle_called =
false;
494 modifier.embedder_api().PlatformMessageReleaseResponseHandle =
496 PlatformMessageReleaseResponseHandle,
497 ([&release_response_handle_called, dummy_response_handle](
498 auto engine,
auto response_handle) {
499 release_response_handle_called =
true;
500 EXPECT_EQ(response_handle, dummy_response_handle);
503 bool send_message_called =
false;
504 modifier.embedder_api().SendPlatformMessage = MOCK_ENGINE_PROC(
505 SendPlatformMessage, ([&send_message_called, test_message,
506 dummy_response_handle](
auto engine,
auto message) {
507 send_message_called =
true;
508 EXPECT_STREQ(
message->channel,
"test");
509 EXPECT_EQ(
message->message_size, test_message.size());
510 EXPECT_EQ(memcmp(
message->message, test_message.data(),
513 EXPECT_EQ(
message->response_handle, dummy_response_handle);
517 engine->SendPlatformMessage(channel, test_message.data(), test_message.size(),
518 reply_handler, reply_user_data);
519 EXPECT_TRUE(create_response_handle_called);
520 EXPECT_TRUE(release_response_handle_called);
521 EXPECT_TRUE(send_message_called);
525 FlutterWindowsEngineBuilder builder{GetContext()};
526 std::unique_ptr<FlutterWindowsEngine> engine = builder.Build();
527 EngineModifier modifier(engine.get());
531 modifier.embedder_api().SendSemanticsAction = MOCK_ENGINE_PROC(
532 SendSemanticsAction, ([&called, &
message](
auto engine,
auto info) {
534 EXPECT_EQ(info->view_id, 456);
535 EXPECT_EQ(info->node_id, 42);
536 EXPECT_EQ(info->action, kFlutterSemanticsActionDismiss);
537 EXPECT_EQ(memcmp(info->data,
message.c_str(),
message.size()), 0);
538 EXPECT_EQ(info->data_length,
message.size());
542 auto data = fml::MallocMapping::Copy(
message.c_str(),
message.size());
543 engine->DispatchSemanticsAction(456, 42, kFlutterSemanticsActionDismiss,
550 EXPECT_EQ(GetThreadPriority(GetCurrentThread()),
551 THREAD_PRIORITY_BELOW_NORMAL);
554 EXPECT_EQ(GetThreadPriority(GetCurrentThread()),
555 THREAD_PRIORITY_ABOVE_NORMAL);
558 EXPECT_EQ(GetThreadPriority(GetCurrentThread()),
559 THREAD_PRIORITY_ABOVE_NORMAL);
563 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL);
566 EXPECT_EQ(GetThreadPriority(GetCurrentThread()), THREAD_PRIORITY_NORMAL);
570 FlutterWindowsEngineBuilder builder{GetContext()};
571 std::unique_ptr<FlutterWindowsEngine> engine = builder.Build();
572 EngineModifier modifier(engine.get());
574 MockEmbedderApiForKeyboard(modifier,
575 std::make_shared<MockKeyResponseController>());
582 engine->AddPluginRegistrarDestructionCallback(
584 auto result =
reinterpret_cast<int*
>(ref);
588 engine->AddPluginRegistrarDestructionCallback(
590 auto result =
reinterpret_cast<int*
>(ref);
596 EXPECT_EQ(result1, 1);
597 EXPECT_EQ(result2, 2);
601 FlutterWindowsEngineBuilder builder{GetContext()};
602 std::unique_ptr<FlutterWindowsEngine> engine = builder.Build();
603 EngineModifier modifier(engine.get());
606 modifier.embedder_api().ScheduleFrame =
607 MOCK_ENGINE_PROC(ScheduleFrame, ([&called](
auto engine) {
612 engine->ScheduleFrame();
617 FlutterWindowsEngineBuilder builder{GetContext()};
618 std::unique_ptr<FlutterWindowsEngine> engine = builder.Build();
619 EngineModifier modifier(engine.get());
622 modifier.embedder_api().SetNextFrameCallback = MOCK_ENGINE_PROC(
623 SetNextFrameCallback, ([&called](
auto engine,
auto callback,
auto data) {
628 engine->SetNextFrameCallback([]() {});
633 FlutterWindowsEngineBuilder builder{GetContext()};
634 std::unique_ptr<FlutterWindowsEngine> engine = builder.Build();
635 EXPECT_EQ(engine->GetExecutableName(),
"flutter_windows_unittests.exe");
641 auto windows_proc_table = std::make_shared<MockWindowsProcTable>();
642 EXPECT_CALL(*windows_proc_table, GetHighContrastEnabled)
643 .WillOnce(Return(
true))
644 .WillOnce(Return(
false));
646 FlutterWindowsEngineBuilder builder{GetContext()};
647 builder.SetWindowsProcTable(windows_proc_table);
648 std::unique_ptr<FlutterWindowsEngine> engine = builder.Build();
649 EngineModifier modifier(engine.get());
651 std::optional<FlutterAccessibilityFeature> engine_flags;
652 modifier.embedder_api().UpdateAccessibilityFeatures = MOCK_ENGINE_PROC(
653 UpdateAccessibilityFeatures, ([&engine_flags](
auto engine,
auto flags) {
654 engine_flags = flags;
657 modifier.embedder_api().SendPlatformMessage = MOCK_ENGINE_PROC(
659 [](
auto engine,
const auto message) {
return kSuccess; });
662 engine->UpdateHighContrastMode();
664 EXPECT_TRUE(engine->high_contrast_enabled());
665 EXPECT_TRUE(engine_flags.has_value());
667 engine_flags.value() &
668 FlutterAccessibilityFeature::kFlutterAccessibilityFeatureHighContrast);
671 engine_flags.reset();
672 engine->UpdateHighContrastMode();
674 EXPECT_FALSE(engine->high_contrast_enabled());
675 EXPECT_TRUE(engine_flags.has_value());
677 engine_flags.value() &
678 FlutterAccessibilityFeature::kFlutterAccessibilityFeatureHighContrast);
682 FlutterWindowsEngineBuilder builder{GetContext()};
683 std::unique_ptr<FlutterWindowsEngine> engine = builder.Build();
684 EngineModifier modifier(engine.get());
686 modifier.embedder_api().PostRenderThreadTask = MOCK_ENGINE_PROC(
687 PostRenderThreadTask, ([](
auto engine,
auto callback,
auto context) {
693 engine->PostRasterThreadTask([&called]() { called =
true; });
701 std::unique_ptr<WindowBindingHandler> wbh)
706 NotifyWinEventWrapper,
707 (ui::AXPlatformNodeWin*, ax::mojom::Event),
713 FML_DISALLOW_COPY_AND_ASSIGN(MockFlutterWindowsView);
718 auto& context = GetContext();
719 WindowsConfigBuilder builder{context};
720 builder.SetDartEntrypoint(
"sendAccessibilityAnnouncement");
724 CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) { done =
true; });
725 context.AddNativeFunction(
"Signal", native_entry);
727 EnginePtr engine{builder.RunHeadless()};
728 ASSERT_NE(engine,
nullptr);
730 ui::AXPlatformNodeDelegateBase parent_delegate;
733 auto window_binding_handler =
734 std::make_unique<NiceMock<MockWindowBindingHandler>>();
735 EXPECT_CALL(*window_binding_handler, GetAlertDelegate)
736 .WillOnce(Return(&delegate));
739 MockFlutterWindowsView view{windows_engine,
740 std::move(window_binding_handler)};
741 EngineModifier modifier{windows_engine};
742 modifier.SetImplicitView(&view);
746 EXPECT_CALL(view, NotifyWinEventWrapper).Times(1);
750 windows_engine->task_runner()->ProcessTasks();
756 auto& context = GetContext();
757 WindowsConfigBuilder builder{context};
758 builder.SetDartEntrypoint(
"sendAccessibilityAnnouncement");
762 CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) { done =
true; });
763 context.AddNativeFunction(
"Signal", native_entry);
765 EnginePtr engine{builder.RunHeadless()};
766 ASSERT_NE(engine,
nullptr);
773 windows_engine->task_runner()->ProcessTasks();
780 fml::testing::LogCapture log_capture;
782 auto& context = GetContext();
783 WindowsConfigBuilder builder{context};
784 builder.SetDartEntrypoint(
"sendAccessibilityTooltipEvent");
788 CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) { done =
true; });
789 context.AddNativeFunction(
"Signal", native_entry);
791 ViewControllerPtr controller{builder.Run()};
792 ASSERT_NE(controller,
nullptr);
800 windows_engine->task_runner()->ProcessTasks();
806 EXPECT_EQ(log_capture.str().find(
"tooltip"), std::string::npos);
818 (std::optional<HWND>, std::optional<WPARAM>, std::optional<LPARAM>, UINT),
835 FlutterWindowsEngineBuilder builder{GetContext()};
836 builder.SetDartEntrypoint(
"exitTestExit");
837 bool finished =
false;
839 auto engine = builder.Build();
840 auto window_binding_handler =
841 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
842 MockFlutterWindowsView view(engine.get(), std::move(window_binding_handler));
844 EngineModifier modifier(engine.get());
845 modifier.SetImplicitView(&view);
846 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
847 auto handler = std::make_unique<MockWindowsLifecycleManager>(engine.get());
848 EXPECT_CALL(*handler, Quit)
849 .WillOnce([&finished](std::optional<HWND> hwnd,
850 std::optional<WPARAM> wparam,
851 std::optional<LPARAM> lparam,
852 UINT exit_code) { finished = exit_code == 0; });
853 EXPECT_CALL(*handler, IsLastWindowOfProcess).WillRepeatedly(Return(
true));
854 modifier.SetLifecycleManager(std::move(handler));
856 engine->lifecycle_manager()->BeginProcessingExit();
860 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(0, WM_CLOSE, 0,
866 engine->task_runner()->ProcessTasks();
871 FlutterWindowsEngineBuilder builder{GetContext()};
872 builder.SetDartEntrypoint(
"exitTestCancel");
873 bool did_call =
false;
875 auto engine = builder.Build();
876 auto window_binding_handler =
877 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
878 MockFlutterWindowsView view(engine.get(), std::move(window_binding_handler));
880 EngineModifier modifier(engine.get());
881 modifier.SetImplicitView(&view);
882 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
883 auto handler = std::make_unique<MockWindowsLifecycleManager>(engine.get());
884 EXPECT_CALL(*handler, IsLastWindowOfProcess).WillRepeatedly(Return(
true));
885 EXPECT_CALL(*handler, Quit).Times(0);
886 modifier.SetLifecycleManager(std::move(handler));
887 engine->lifecycle_manager()->BeginProcessingExit();
889 auto binary_messenger =
890 std::make_unique<BinaryMessengerImpl>(engine->messenger());
891 binary_messenger->SetMessageHandler(
892 "flutter/platform", [&did_call](
const uint8_t*
message,
895 EXPECT_NE(contents.find(
"\"method\":\"System.exitApplication\""),
897 EXPECT_NE(contents.find(
"\"type\":\"required\""), std::string::npos);
898 EXPECT_NE(contents.find(
"\"exitCode\":0"), std::string::npos);
900 char response[] =
"";
901 reply(
reinterpret_cast<uint8_t*
>(response), 0);
906 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(0, WM_CLOSE, 0,
910 engine->task_runner()->ProcessTasks();
918 FlutterWindowsEngineBuilder builder{GetContext()};
919 builder.SetDartEntrypoint(
"exitTestExit");
920 bool second_close =
false;
922 auto engine = builder.Build();
923 auto window_binding_handler =
924 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
925 MockFlutterWindowsView view(engine.get(), std::move(window_binding_handler));
927 EngineModifier modifier(engine.get());
928 modifier.SetImplicitView(&view);
929 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
930 auto handler = std::make_unique<MockWindowsLifecycleManager>(engine.get());
931 EXPECT_CALL(*handler, IsLastWindowOfProcess).WillOnce(Return(
true));
932 EXPECT_CALL(*handler, Quit)
933 .WillOnce([handler_ptr = handler.get()](
934 std::optional<HWND> hwnd, std::optional<WPARAM> wparam,
935 std::optional<LPARAM> lparam, UINT exit_code) {
936 handler_ptr->WindowsLifecycleManager::Quit(hwnd, wparam, lparam,
939 EXPECT_CALL(*handler, DispatchMessage)
941 [&engine](HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
942 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(
943 hwnd, msg, wparam, lparam);
945 modifier.SetLifecycleManager(std::move(handler));
946 engine->lifecycle_manager()->BeginProcessingExit();
954 engine->window_proc_delegate_manager()->RegisterTopLevelWindowProcDelegate(
959 bool* called =
reinterpret_cast<bool*
>(
user_data);
966 reinterpret_cast<void*
>(&second_close));
968 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(0, WM_CLOSE, 0,
971 while (!second_close) {
972 engine->task_runner()->ProcessTasks();
977 FlutterWindowsEngineBuilder builder{GetContext()};
978 builder.SetDartEntrypoint(
"exitTestExit");
979 bool finished =
false;
981 auto engine = builder.Build();
982 auto window_binding_handler =
983 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
984 MockFlutterWindowsView view(engine.get(), std::move(window_binding_handler));
986 EngineModifier modifier(engine.get());
987 modifier.SetImplicitView(&view);
988 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
989 auto handler = std::make_unique<MockWindowsLifecycleManager>(engine.get());
990 EXPECT_CALL(*handler, IsLastWindowOfProcess).WillOnce([&finished]() {
995 EXPECT_CALL(*handler, Quit).Times(0);
996 modifier.SetLifecycleManager(std::move(handler));
997 engine->lifecycle_manager()->BeginProcessingExit();
1001 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(0, WM_CLOSE, 0,
1005 engine->task_runner()->ProcessTasks();
1010 FlutterWindowsEngineBuilder builder{GetContext()};
1012 auto engine = builder.Build();
1013 auto window_binding_handler =
1014 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1015 MockFlutterWindowsView view(engine.get(), std::move(window_binding_handler));
1017 EngineModifier modifier(engine.get());
1018 modifier.SetImplicitView(&view);
1019 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1020 auto handler = std::make_unique<MockWindowsLifecycleManager>(engine.get());
1021 EXPECT_CALL(*handler, IsLastWindowOfProcess).Times(0);
1022 modifier.SetLifecycleManager(std::move(handler));
1024 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(0, WM_CLOSE, 0,
1029 FlutterWindowsEngineBuilder builder{GetContext()};
1031 auto engine = builder.Build();
1032 auto window_binding_handler =
1033 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1034 MockFlutterWindowsView view(engine.get(), std::move(window_binding_handler));
1036 EngineModifier modifier(engine.get());
1037 modifier.SetImplicitView(&view);
1038 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1039 auto handler = std::make_unique<MockWindowsLifecycleManager>(engine.get());
1040 EXPECT_CALL(*handler, IsLastWindowOfProcess).WillOnce(Return(
false));
1041 modifier.SetLifecycleManager(std::move(handler));
1042 engine->lifecycle_manager()->BeginProcessingExit();
1044 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(0, WM_CLOSE, 0,
1049 FlutterWindowsEngineBuilder builder{GetContext()};
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));
1056 EngineModifier modifier(engine.get());
1057 modifier.SetImplicitView(&view);
1058 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1059 auto handler = std::make_unique<MockWindowsLifecycleManager>(engine.get());
1060 EXPECT_CALL(*handler, IsLastWindowOfProcess).WillOnce(Return(
false));
1061 modifier.SetLifecycleManager(std::move(handler));
1062 engine->lifecycle_manager()->BeginProcessingExit();
1064 engine->lifecycle_manager()->ExternalWindowMessage(0, WM_CLOSE, 0, 0);
1068 FlutterWindowsEngineBuilder builder{GetContext()};
1070 auto engine = builder.Build();
1071 auto window_binding_handler =
1072 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1073 MockFlutterWindowsView view(engine.get(), std::move(window_binding_handler));
1075 EngineModifier modifier(engine.get());
1076 modifier.SetImplicitView(&view);
1077 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1080 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(
1081 (HWND)1, WM_SIZE, SIZE_RESTORED, 0);
1083 while (engine->lifecycle_manager()->IsUpdateStateScheduled()) {
1087 EXPECT_EQ(engine->lifecycle_manager()->GetLifecycleState(),
1090 engine->lifecycle_manager()->OnWindowStateEvent((HWND)1,
1093 while (engine->lifecycle_manager()->IsUpdateStateScheduled()) {
1097 EXPECT_EQ(engine->lifecycle_manager()->GetLifecycleState(),
1100 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(
1101 (HWND)1, WM_SIZE, SIZE_MINIMIZED, 0);
1103 while (engine->lifecycle_manager()->IsUpdateStateScheduled()) {
1107 EXPECT_EQ(engine->lifecycle_manager()->GetLifecycleState(),
1110 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(
1111 (HWND)1, WM_SIZE, SIZE_RESTORED, 0);
1113 while (engine->lifecycle_manager()->IsUpdateStateScheduled()) {
1117 EXPECT_EQ(engine->lifecycle_manager()->GetLifecycleState(),
1122 FlutterWindowsEngineBuilder builder{GetContext()};
1124 auto engine = builder.Build();
1125 auto window_binding_handler =
1126 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1127 MockFlutterWindowsView view(engine.get(), std::move(window_binding_handler));
1129 EngineModifier modifier(engine.get());
1130 modifier.SetImplicitView(&view);
1131 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1136 engine->ProcessExternalWindowMessage(
reinterpret_cast<HWND
>(1), WM_SHOWWINDOW,
1138 engine->ProcessExternalWindowMessage(
reinterpret_cast<HWND
>(1), WM_SHOWWINDOW,
1141 while (engine->lifecycle_manager()->IsUpdateStateScheduled()) {
1145 EXPECT_EQ(engine->lifecycle_manager()->GetLifecycleState(),
1150 FlutterWindowsEngineBuilder builder{GetContext()};
1151 HWND outer =
reinterpret_cast<HWND
>(1);
1152 HWND inner =
reinterpret_cast<HWND
>(2);
1154 auto engine = builder.Build();
1155 auto window_binding_handler =
1156 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1157 MockFlutterWindowsView view(engine.get(), std::move(window_binding_handler));
1158 ON_CALL(view, GetWindowHandle).WillByDefault([=]() {
return inner; });
1160 EngineModifier modifier(engine.get());
1161 modifier.SetImplicitView(&view);
1162 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1167 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(
1168 outer, WM_SHOWWINDOW, TRUE, NULL);
1172 while (engine->lifecycle_manager()->IsUpdateStateScheduled()) {
1176 EXPECT_EQ(engine->lifecycle_manager()->GetLifecycleState(),
1182 while (engine->lifecycle_manager()->IsUpdateStateScheduled()) {
1187 EXPECT_EQ(engine->lifecycle_manager()->GetLifecycleState(),
1192 FlutterWindowsEngineBuilder builder{GetContext()};
1193 builder.SetDartEntrypoint(
"enableLifecycleTest");
1194 bool finished =
false;
1196 auto engine = builder.Build();
1197 auto window_binding_handler =
1198 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1199 MockFlutterWindowsView view(engine.get(), std::move(window_binding_handler));
1201 EngineModifier modifier(engine.get());
1202 modifier.SetImplicitView(&view);
1203 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1204 auto handler = std::make_unique<MockWindowsLifecycleManager>(engine.get());
1205 EXPECT_CALL(*handler, SetLifecycleState)
1207 handler_ptr->WindowsLifecycleManager::SetLifecycleState(state);
1209 modifier.SetLifecycleManager(std::move(handler));
1211 auto binary_messenger =
1212 std::make_unique<BinaryMessengerImpl>(engine->messenger());
1214 binary_messenger->SetMessageHandler(
1215 "flutter/unittest", [&finished](
const uint8_t*
message,
1218 EXPECT_NE(contents.find(
"AppLifecycleState.inactive"),
1221 char response[] =
"";
1222 reply(
reinterpret_cast<uint8_t*
>(response), 0);
1228 HWND hwnd =
reinterpret_cast<HWND
>(1);
1231 EXPECT_FALSE(finished);
1235 engine->lifecycle_manager()->BeginProcessingLifecycle();
1239 engine->task_runner()->ProcessTasks();
1244 FlutterWindowsEngineBuilder builder{GetContext()};
1245 builder.SetDartEntrypoint(
"enableLifecycleToFrom");
1246 bool enabled_lifecycle =
false;
1247 bool dart_responded =
false;
1249 auto engine = builder.Build();
1250 auto window_binding_handler =
1251 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1252 MockFlutterWindowsView view(engine.get(), std::move(window_binding_handler));
1254 EngineModifier modifier(engine.get());
1255 modifier.SetImplicitView(&view);
1256 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1257 auto handler = std::make_unique<MockWindowsLifecycleManager>(engine.get());
1258 EXPECT_CALL(*handler, SetLifecycleState)
1260 handler_ptr->WindowsLifecycleManager::SetLifecycleState(state);
1262 handler->begin_processing_callback = [&]() { enabled_lifecycle =
true; };
1263 modifier.SetLifecycleManager(std::move(handler));
1265 auto binary_messenger =
1266 std::make_unique<BinaryMessengerImpl>(engine->messenger());
1267 binary_messenger->SetMessageHandler(
1271 EXPECT_NE(contents.find(
"AppLifecycleState."), std::string::npos);
1272 dart_responded =
true;
1273 char response[] =
"";
1274 reply(
reinterpret_cast<uint8_t*
>(response), 0);
1279 while (!enabled_lifecycle) {
1280 engine->task_runner()->ProcessTasks();
1283 HWND hwnd =
reinterpret_cast<HWND
>(1);
1287 while (!dart_responded) {
1288 engine->task_runner()->ProcessTasks();
1293 FlutterWindowsEngineBuilder builder{GetContext()};
1294 builder.SetDartEntrypoint(
"enableLifecycleToFrom");
1296 auto engine = builder.Build();
1297 auto window_binding_handler =
1298 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1299 MockFlutterWindowsView view(engine.get(), std::move(window_binding_handler));
1301 EngineModifier modifier(engine.get());
1302 modifier.SetImplicitView(&view);
1303 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1305 bool lifecycle_began =
false;
1306 auto handler = std::make_unique<MockWindowsLifecycleManager>(engine.get());
1307 handler->begin_processing_callback = [&]() { lifecycle_began =
true; };
1308 modifier.SetLifecycleManager(std::move(handler));
1312 while (!lifecycle_began) {
1313 engine->task_runner()->ProcessTasks();
1318 FlutterWindowsEngineBuilder builder{GetContext()};
1319 builder.SetDartEntrypoint(
"sendCreatePlatformViewMethod");
1320 auto engine = builder.Build();
1322 EngineModifier modifier{engine.get()};
1323 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1325 bool received_call =
false;
1327 auto manager = std::make_unique<MockPlatformViewManager>(engine.get());
1328 EXPECT_CALL(*manager, AddPlatformView)
1330 received_call =
true;
1333 modifier.SetPlatformViewPlugin(std::move(manager));
1337 while (!received_call) {
1338 engine->task_runner()->ProcessTasks();
1343 FlutterWindowsEngineBuilder builder{GetContext()};
1344 auto engine = builder.Build();
1346 EngineModifier modifier{engine.get()};
1348 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1349 modifier.embedder_api().AddView = MOCK_ENGINE_PROC(
1352 const FlutterAddViewInfo* info) {
return kInternalInconsistency; });
1354 ASSERT_TRUE(engine->
Run());
1358 auto implicit_window = std::make_unique<NiceMock<MockWindowBindingHandler>>();
1360 std::unique_ptr<FlutterWindowsView> implicit_view =
1361 engine->CreateView(std::move(implicit_window));
1363 EXPECT_TRUE(implicit_view);
1366 auto second_window = std::make_unique<NiceMock<MockWindowBindingHandler>>();
1368 EXPECT_DEBUG_DEATH(engine->CreateView(std::move(second_window)),
1369 "FlutterEngineAddView returned an unexpected result");
1373 FlutterWindowsEngineBuilder builder{GetContext()};
1374 builder.SetDartEntrypoint(
"sendCreatePlatformViewMethod");
1375 auto engine = builder.Build();
1377 EngineModifier modifier{engine.get()};
1379 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1380 modifier.embedder_api().RemoveView = MOCK_ENGINE_PROC(
1383 const FlutterRemoveViewInfo* info) {
return kInternalInconsistency; });
1385 ASSERT_TRUE(engine->
Run());
1386 EXPECT_DEBUG_DEATH(engine->RemoveView(123),
1387 "FlutterEngineRemoveView returned an unexpected result");
1391 auto& context = GetContext();
1392 WindowsConfigBuilder builder{context};
1393 builder.SetDartEntrypoint(
"mergedUIThread");
1396 std::optional<std::thread::id> ui_thread_id;
1398 auto native_entry = CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) {
1399 ui_thread_id = std::this_thread::get_id();
1401 context.AddNativeFunction(
"Signal", native_entry);
1403 EnginePtr engine{builder.RunHeadless()};
1404 while (!ui_thread_id) {
1407 ASSERT_EQ(*ui_thread_id, std::this_thread::get_id());
1411 FlutterWindowsEngineBuilder builder{GetContext()};
1412 std::unique_ptr<FlutterWindowsEngine> engine = builder.Build();
1413 auto window_binding_handler =
1414 std::make_unique<::testing::NiceMock<MockWindowBindingHandler>>();
1415 MockFlutterWindowsView view(engine.get(), std::move(window_binding_handler));
1417 EngineModifier modifier(engine.get());
1418 modifier.SetImplicitView(&view);
1420 FlutterViewFocusChangeRequest request;
1423 EXPECT_CALL(view, Focus()).WillOnce(Return(
true));
1424 modifier.OnViewFocusChangeRequest(&request);
1428 auto& context = GetContext();
1429 WindowsConfigBuilder builder{context};
1430 builder.SetDartEntrypoint(
"sendSemanticsTreeInfo");
1435 CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) { done =
true; });
1436 context.AddNativeFunction(
"Signal", native_entry);
1439 EnginePtr engine{builder.RunHeadless()};
1440 ASSERT_NE(engine,
nullptr);
1442 auto window_binding_handler1 =
1443 std::make_unique<NiceMock<MockWindowBindingHandler>>();
1444 auto window_binding_handler2 =
1445 std::make_unique<NiceMock<MockWindowBindingHandler>>();
1450 EXPECT_CALL(*window_binding_handler1, GetPhysicalWindowBounds)
1452 EXPECT_CALL(*window_binding_handler1, GetDpiScale)
1453 .WillRepeatedly(testing::Return(96.0));
1454 EXPECT_CALL(*window_binding_handler2, GetPhysicalWindowBounds)
1456 EXPECT_CALL(*window_binding_handler2, GetDpiScale)
1457 .WillRepeatedly(testing::Return(96.0));
1460 EngineModifier modifier{windows_engine};
1461 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1466 auto view1 = windows_engine->
CreateView(std::move(window_binding_handler1));
1467 auto view2 = windows_engine->CreateView(std::move(window_binding_handler2));
1471 windows_engine->UpdateSemanticsEnabled(
true);
1474 windows_engine->task_runner()->ProcessTasks();
1477 auto accessibility_bridge1 = view1->accessibility_bridge().lock();
1478 auto accessibility_bridge2 = view2->accessibility_bridge().lock();
1483 !accessibility_bridge1->GetPlatformNodeFromTree(view1->view_id() + 1)) {
1484 windows_engine->task_runner()->ProcessTasks();
1488 !accessibility_bridge2->GetPlatformNodeFromTree(view2->view_id() + 1)) {
1489 windows_engine->task_runner()->ProcessTasks();
1493 auto tree1 = accessibility_bridge1->GetTree();
1494 auto tree2 = accessibility_bridge2->GetTree();
1495 EXPECT_NE(tree1->GetFromId(view1->view_id() + 1),
nullptr);
1496 EXPECT_NE(tree2->GetFromId(view2->view_id() + 1),
nullptr);
void UpdateSemanticsEnabled(bool enabled)
std::unique_ptr< FlutterWindowsView > CreateView(std::unique_ptr< WindowBindingHandler > window)
virtual void Quit(std::optional< HWND > window, std::optional< WPARAM > wparam, std::optional< LPARAM > lparam, UINT exit_code)
virtual void BeginProcessingLifecycle()
virtual void DispatchMessage(HWND window, UINT msg, WPARAM wparam, LPARAM lparam)
virtual bool IsLastWindowOfProcess()
virtual void SetLifecycleState(AppLifecycleState state)
~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(* FlutterDesktopBinaryReply)(const uint8_t *data, size_t data_size, void *user_data)
FlutterDesktopEngineRef FlutterDesktopViewControllerGetEngine(FlutterDesktopViewControllerRef ref)
FlutterDesktopBinaryReply callback
TEST_F(CompositorOpenGLTest, CreateBackingStore)
UINT GetDpiForMonitor(HMONITOR monitor)
std::function< void(const uint8_t *reply, size_t reply_size)> BinaryReply
static void WindowsPlatformThreadPrioritySetter(FlutterThreadPriority priority)
constexpr FlutterViewId kImplicitViewId