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 bool finished =
false;
69 auto runner = std::make_unique<TaskRunner>(
71 return static_cast<uint64_t
>(
72 fml::TimePoint::Now().ToEpochDelta().ToNanoseconds());
74 [&](
const FlutterTask*) { finished =
true; });
75 runner->PostFlutterTask(
77 static_cast<uint64_t
>((fml::TimePoint::Now().ToEpochDelta() +
78 fml::TimeDelta::FromMilliseconds(50))
80 auto start = fml::TimePoint::Now();
84 auto duration = fml::TimePoint::Now() - start;
85 EXPECT_GE(duration, fml::TimeDelta::FromMilliseconds(50));
90 auto runner = std::make_unique<TaskRunner>(
92 return static_cast<uint64_t
>(
93 fml::TimePoint::Now().ToEpochDelta().ToNanoseconds());
95 [&](
const FlutterTask*) {});
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);
124 if (::GetMessage(&msg,
nullptr, 0, 0)) {
125 if (msg.message == WM_PAINT) {
128 ::TranslateMessage(&msg);
129 ::DispatchMessage(&msg);
133 DestroyWindow(window);
134 UnregisterClassW(class_name,
nullptr);
138 FlutterWindowsEngineBuilder builder{GetContext()};
139 builder.AddDartEntrypointArgument(
"arg1");
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();
194 EngineModifier modifier(engine.get());
197 bool run_called =
false;
198 modifier.embedder_api().Run = MOCK_ENGINE_PROC(
199 Run, ([&run_called, engine_instance = engine.get()](
200 size_t version,
const FlutterRendererConfig* config,
201 const FlutterProjectArgs* args,
void*
user_data,
204 *engine_out =
reinterpret_cast<FLUTTER_API_SYMBOL(
FlutterEngine)
>(1);
206 EXPECT_EQ(version, FLUTTER_ENGINE_VERSION);
207 EXPECT_NE(config,
nullptr);
209 EXPECT_EQ(config->type, kOpenGL);
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(
229 FlutterThreadPriority::kRaster);
230 EXPECT_EQ(GetThreadPriority(GetCurrentThread()),
231 THREAD_PRIORITY_ABOVE_NORMAL);
235 modifier.embedder_api().UpdateAccessibilityFeatures = MOCK_ENGINE_PROC(
236 UpdateAccessibilityFeatures,
238 FlutterAccessibilityFeature flags) {
return kSuccess; });
241 bool update_locales_called =
false;
242 modifier.embedder_api().UpdateLocales = MOCK_ENGINE_PROC(
244 ([&update_locales_called](
auto engine,
const FlutterLocale** locales,
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;
256 modifier.embedder_api().SendPlatformMessage = MOCK_ENGINE_PROC(
258 ([&settings_message_sent](
auto engine,
auto message) {
259 if (std::string(
message->channel) == std::string(
"flutter/settings")) {
260 settings_message_sent = true;
267 bool notify_display_update_called =
false;
269 modifier.embedder_api().NotifyDisplayUpdate = MOCK_ENGINE_PROC(
271 ([¬ify_display_update_called](
273 const FlutterEngineDisplaysUpdateType update_type,
274 const FlutterEngineDisplay* embedder_displays,
275 size_t display_count) {
276 EXPECT_EQ(update_type, kFlutterEngineDisplaysUpdateTypeStartup);
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);
293 modifier.embedder_api().Shutdown = [](
auto engine) {
return kSuccess; };
294 modifier.ReleaseEGLManager();
298 FlutterWindowsEngineBuilder builder{GetContext()};
299 std::unique_ptr<FlutterWindowsEngine> engine = builder.Build();
300 EngineModifier modifier(engine.get());
301 bool on_vsync_called =
false;
303 modifier.embedder_api().GetCurrentTime =
304 MOCK_ENGINE_PROC(GetCurrentTime, ([]() -> uint64_t {
return 1; }));
305 modifier.embedder_api().OnVsync = MOCK_ENGINE_PROC(
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;
316 modifier.SetStartTime(0);
317 modifier.SetFrameInterval(16600000);
321 EXPECT_TRUE(on_vsync_called);
325 FlutterWindowsEngineBuilder builder{GetContext()};
326 std::unique_ptr<FlutterWindowsEngine> engine = builder.Build();
327 EngineModifier modifier(engine.get());
329 modifier.embedder_api().NotifyDisplayUpdate =
330 MOCK_ENGINE_PROC(NotifyDisplayUpdate,
331 ([engine_instance = engine.get()](
333 const FlutterEngineDisplaysUpdateType update_type,
334 const FlutterEngineDisplay* embedder_displays,
335 size_t display_count) {
return kSuccess; }));
338 bool run_called =
false;
339 modifier.embedder_api().Run = MOCK_ENGINE_PROC(
340 Run, ([&run_called, engine_instance = engine.get()](
341 size_t version,
const FlutterRendererConfig* config,
342 const FlutterProjectArgs* args,
void*
user_data,
345 *engine_out =
reinterpret_cast<FLUTTER_API_SYMBOL(
FlutterEngine)
>(1);
347 EXPECT_EQ(config->type, kSoftware);
351 modifier.embedder_api().UpdateAccessibilityFeatures = MOCK_ENGINE_PROC(
352 UpdateAccessibilityFeatures,
354 FlutterAccessibilityFeature flags) {
return kSuccess; });
358 modifier.embedder_api().UpdateLocales = MOCK_ENGINE_PROC(
359 UpdateLocales, ([](
auto engine,
const FlutterLocale** locales,
360 size_t locales_count) {
return kSuccess; }));
361 modifier.embedder_api().SendPlatformMessage =
362 MOCK_ENGINE_PROC(SendPlatformMessage,
363 ([](
auto engine,
auto message) {
return kSuccess; }));
366 modifier.SetEGLManager(
nullptr);
370 EXPECT_TRUE(run_called);
374 modifier.embedder_api().Shutdown = [](
auto engine) {
return kSuccess; };
378 FlutterWindowsEngineBuilder builder{GetContext()};
379 builder.SetSwitches({
"--enable-impeller=true"});
380 std::unique_ptr<FlutterWindowsEngine> engine = builder.Build();
381 EngineModifier modifier(engine.get());
383 modifier.embedder_api().NotifyDisplayUpdate =
384 MOCK_ENGINE_PROC(NotifyDisplayUpdate,
385 ([engine_instance = engine.get()](
387 const FlutterEngineDisplaysUpdateType update_type,
388 const FlutterEngineDisplay* embedder_displays,
389 size_t display_count) {
return kSuccess; }));
392 modifier.embedder_api().UpdateAccessibilityFeatures = MOCK_ENGINE_PROC(
393 UpdateAccessibilityFeatures,
395 FlutterAccessibilityFeature flags) {
return kSuccess; });
399 modifier.embedder_api().UpdateLocales = MOCK_ENGINE_PROC(
400 UpdateLocales, ([](
auto engine,
const FlutterLocale** locales,
401 size_t locales_count) {
return kSuccess; }));
402 modifier.embedder_api().SendPlatformMessage =
403 MOCK_ENGINE_PROC(SendPlatformMessage,
404 ([](
auto engine,
auto message) {
return kSuccess; }));
407 modifier.SetEGLManager(
nullptr);
409 EXPECT_FALSE(engine->Run());
413 FlutterWindowsEngineBuilder builder{GetContext()};
414 std::unique_ptr<FlutterWindowsEngine> engine = builder.Build();
415 EngineModifier modifier(engine.get());
417 const char* channel =
"test";
418 const std::vector<uint8_t> test_message = {1, 2, 3, 4};
422 modifier.embedder_api().SendPlatformMessage = MOCK_ENGINE_PROC(
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(),
440 FlutterWindowsEngineBuilder builder{GetContext()};
441 builder.SetDartEntrypoint(
"hiPlatformChannels");
443 std::unique_ptr<FlutterWindowsEngine> engine = builder.Build();
444 EngineModifier modifier(engine.get());
445 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
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;
454 std::string channel =
"hi";
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();
485 FlutterWindowsEngineBuilder builder{GetContext()};
486 builder.SetDartEntrypoint(
"hiPlatformChannels");
488 std::unique_ptr<FlutterWindowsEngine> engine = builder.Build();
490 EngineModifier modifier(engine.get());
491 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
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;
500 std::string channel =
"hi";
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();
536 FlutterWindowsEngineBuilder builder{GetContext()};
537 std::unique_ptr<FlutterWindowsEngine> engine = builder.Build();
538 EngineModifier modifier(engine.get());
540 const char* channel =
"test";
541 const std::vector<uint8_t> test_message = {1, 2, 3, 4};
542 auto* dummy_response_handle =
543 reinterpret_cast<FlutterPlatformMessageResponseHandle*
>(5);
545 void* reply_user_data =
reinterpret_cast<void*
>(6);
549 bool create_response_handle_called =
false;
550 modifier.embedder_api().PlatformMessageCreateResponseHandle =
552 PlatformMessageCreateResponseHandle,
553 ([&create_response_handle_called, &reply_handler, reply_user_data,
554 dummy_response_handle](
auto engine,
auto reply,
auto 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;
564 modifier.embedder_api().PlatformMessageReleaseResponseHandle =
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;
574 modifier.embedder_api().SendPlatformMessage = MOCK_ENGINE_PROC(
575 SendPlatformMessage, ([&send_message_called, test_message,
576 dummy_response_handle](
auto engine,
auto 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);
595 FlutterWindowsEngineBuilder builder{GetContext()};
596 std::unique_ptr<FlutterWindowsEngine> engine = builder.Build();
597 EngineModifier modifier(engine.get());
601 modifier.embedder_api().SendSemanticsAction = MOCK_ENGINE_PROC(
602 SendSemanticsAction, ([&called, &
message](
auto engine,
auto info) {
604 EXPECT_EQ(info->view_id, 456);
605 EXPECT_EQ(info->node_id, 42);
606 EXPECT_EQ(info->action, kFlutterSemanticsActionDismiss);
607 EXPECT_EQ(memcmp(info->data,
message.c_str(),
message.size()), 0);
608 EXPECT_EQ(info->data_length,
message.size());
612 auto data = fml::MallocMapping::Copy(
message.c_str(),
message.size());
613 engine->DispatchSemanticsAction(456, 42, kFlutterSemanticsActionDismiss,
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);
640 FlutterWindowsEngineBuilder builder{GetContext()};
641 std::unique_ptr<FlutterWindowsEngine> engine = builder.Build();
642 EngineModifier modifier(engine.get());
644 MockEmbedderApiForKeyboard(modifier,
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);
671 FlutterWindowsEngineBuilder builder{GetContext()};
672 std::unique_ptr<FlutterWindowsEngine> engine = builder.Build();
673 EngineModifier modifier(engine.get());
676 modifier.embedder_api().ScheduleFrame =
677 MOCK_ENGINE_PROC(ScheduleFrame, ([&called](
auto engine) {
682 engine->ScheduleFrame();
687 FlutterWindowsEngineBuilder builder{GetContext()};
688 std::unique_ptr<FlutterWindowsEngine> engine = builder.Build();
689 EngineModifier modifier(engine.get());
692 modifier.embedder_api().SetNextFrameCallback = MOCK_ENGINE_PROC(
693 SetNextFrameCallback, ([&called](
auto engine,
auto callback,
auto data) {
698 engine->SetNextFrameCallback([]() {});
703 FlutterWindowsEngineBuilder builder{GetContext()};
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));
716 FlutterWindowsEngineBuilder builder{GetContext()};
717 builder.SetWindowsProcTable(windows_proc_table);
718 std::unique_ptr<FlutterWindowsEngine> engine = builder.Build();
719 EngineModifier modifier(engine.get());
721 std::optional<FlutterAccessibilityFeature> engine_flags;
722 modifier.embedder_api().UpdateAccessibilityFeatures = MOCK_ENGINE_PROC(
723 UpdateAccessibilityFeatures, ([&engine_flags](
auto engine,
auto flags) {
724 engine_flags = flags;
727 modifier.embedder_api().SendPlatformMessage = MOCK_ENGINE_PROC(
729 [](
auto engine,
const auto message) {
return kSuccess; });
732 engine->UpdateHighContrastMode();
734 EXPECT_TRUE(engine->high_contrast_enabled());
735 EXPECT_TRUE(engine_flags.has_value());
737 engine_flags.value() &
738 FlutterAccessibilityFeature::kFlutterAccessibilityFeatureHighContrast);
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() &
748 FlutterAccessibilityFeature::kFlutterAccessibilityFeatureHighContrast);
752 FlutterWindowsEngineBuilder builder{GetContext()};
753 std::unique_ptr<FlutterWindowsEngine> engine = builder.Build();
754 EngineModifier modifier(engine.get());
756 modifier.embedder_api().PostRenderThreadTask = MOCK_ENGINE_PROC(
757 PostRenderThreadTask, ([](
auto engine,
auto callback,
auto context) {
763 engine->PostRasterThreadTask([&called]() { called =
true; });
771 std::unique_ptr<WindowBindingHandler> wbh)
780 NotifyWinEventWrapper,
781 (ui::AXPlatformNodeWin*, ax::mojom::Event),
787 FML_DISALLOW_COPY_AND_ASSIGN(MockFlutterWindowsView);
792 auto& context = GetContext();
793 WindowsConfigBuilder builder{context};
794 builder.SetDartEntrypoint(
"sendAccessibilityAnnouncement");
798 CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) { done =
true; });
799 context.AddNativeFunction(
"Signal", native_entry);
801 EnginePtr engine{builder.RunHeadless()};
802 ASSERT_NE(engine,
nullptr);
804 ui::AXPlatformNodeDelegateBase parent_delegate;
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)};
815 EngineModifier modifier{windows_engine};
816 modifier.SetImplicitView(&view);
820 EXPECT_CALL(view, NotifyWinEventWrapper).Times(1);
824 windows_engine->task_runner()->ProcessTasks();
830 auto& context = GetContext();
831 WindowsConfigBuilder builder{context};
832 builder.SetDartEntrypoint(
"sendAccessibilityAnnouncement");
836 CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) { done =
true; });
837 context.AddNativeFunction(
"Signal", native_entry);
839 EnginePtr engine{builder.RunHeadless()};
840 ASSERT_NE(engine,
nullptr);
847 windows_engine->task_runner()->ProcessTasks();
854 fml::testing::LogCapture log_capture;
856 auto& context = GetContext();
857 WindowsConfigBuilder builder{context};
858 builder.SetDartEntrypoint(
"sendAccessibilityTooltipEvent");
862 CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) { done =
true; });
863 context.AddNativeFunction(
"Signal", native_entry);
865 ViewControllerPtr controller{builder.Run()};
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),
909 FlutterWindowsEngineBuilder builder{GetContext()};
910 builder.SetDartEntrypoint(
"exitTestExit");
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));
918 EngineModifier modifier(engine.get());
919 modifier.SetImplicitView(&view);
920 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
921 auto handler = std::make_unique<MockWindowsLifecycleManager>(engine.get());
922 EXPECT_CALL(*handler, Quit)
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));
928 modifier.SetLifecycleManager(std::move(handler));
930 engine->lifecycle_manager()->BeginProcessingExit();
934 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(0, WM_CLOSE, 0,
940 engine->task_runner()->ProcessTasks();
945 FlutterWindowsEngineBuilder builder{GetContext()};
946 builder.SetDartEntrypoint(
"exitTestCancel");
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));
954 EngineModifier modifier(engine.get());
955 modifier.SetImplicitView(&view);
956 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
957 auto handler = std::make_unique<MockWindowsLifecycleManager>(engine.get());
958 EXPECT_CALL(*handler, IsLastWindowOfProcess).WillRepeatedly(Return(
true));
959 EXPECT_CALL(*handler, Quit).Times(0);
960 modifier.SetLifecycleManager(std::move(handler));
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();
992 FlutterWindowsEngineBuilder builder{GetContext()};
993 builder.SetDartEntrypoint(
"exitTestExit");
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));
1001 EngineModifier modifier(engine.get());
1002 modifier.SetImplicitView(&view);
1003 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1004 auto handler = std::make_unique<MockWindowsLifecycleManager>(engine.get());
1005 EXPECT_CALL(*handler, IsLastWindowOfProcess).WillOnce(Return(
true));
1006 EXPECT_CALL(*handler, Quit)
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,
1013 EXPECT_CALL(*handler, DispatchMessage)
1015 [&engine](HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
1016 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(
1017 hwnd, msg, wparam, lparam);
1019 modifier.SetLifecycleManager(std::move(handler));
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();
1051 FlutterWindowsEngineBuilder builder{GetContext()};
1052 builder.SetDartEntrypoint(
"exitTestExit");
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));
1060 EngineModifier modifier(engine.get());
1061 modifier.SetImplicitView(&view);
1062 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1063 auto handler = std::make_unique<MockWindowsLifecycleManager>(engine.get());
1064 EXPECT_CALL(*handler, IsLastWindowOfProcess).WillOnce([&finished]() {
1069 EXPECT_CALL(*handler, Quit).Times(0);
1070 modifier.SetLifecycleManager(std::move(handler));
1071 engine->lifecycle_manager()->BeginProcessingExit();
1075 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(0, WM_CLOSE, 0,
1079 engine->task_runner()->ProcessTasks();
1084 FlutterWindowsEngineBuilder builder{GetContext()};
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));
1091 EngineModifier modifier(engine.get());
1092 modifier.SetImplicitView(&view);
1093 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1094 auto handler = std::make_unique<MockWindowsLifecycleManager>(engine.get());
1095 EXPECT_CALL(*handler, IsLastWindowOfProcess).Times(0);
1096 modifier.SetLifecycleManager(std::move(handler));
1098 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(0, WM_CLOSE, 0,
1103 FlutterWindowsEngineBuilder builder{GetContext()};
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));
1110 EngineModifier modifier(engine.get());
1111 modifier.SetImplicitView(&view);
1112 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1113 auto handler = std::make_unique<MockWindowsLifecycleManager>(engine.get());
1114 EXPECT_CALL(*handler, IsLastWindowOfProcess).WillOnce(Return(
false));
1115 modifier.SetLifecycleManager(std::move(handler));
1116 engine->lifecycle_manager()->BeginProcessingExit();
1118 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(0, WM_CLOSE, 0,
1123 FlutterWindowsEngineBuilder builder{GetContext()};
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));
1130 EngineModifier modifier(engine.get());
1131 modifier.SetImplicitView(&view);
1132 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1133 auto handler = std::make_unique<MockWindowsLifecycleManager>(engine.get());
1134 EXPECT_CALL(*handler, IsLastWindowOfProcess).WillOnce(Return(
false));
1135 modifier.SetLifecycleManager(std::move(handler));
1136 engine->lifecycle_manager()->BeginProcessingExit();
1138 engine->lifecycle_manager()->ExternalWindowMessage(0, WM_CLOSE, 0, 0);
1142 FlutterWindowsEngineBuilder builder{GetContext()};
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));
1149 EngineModifier modifier(engine.get());
1150 modifier.SetImplicitView(&view);
1151 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
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(),
1196 FlutterWindowsEngineBuilder builder{GetContext()};
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));
1203 EngineModifier modifier(engine.get());
1204 modifier.SetImplicitView(&view);
1205 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
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(),
1224 FlutterWindowsEngineBuilder builder{GetContext()};
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; });
1234 EngineModifier modifier(engine.get());
1235 modifier.SetImplicitView(&view);
1236 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
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(),
1266 FlutterWindowsEngineBuilder builder{GetContext()};
1267 builder.SetDartEntrypoint(
"enableLifecycleTest");
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));
1275 EngineModifier modifier(engine.get());
1276 modifier.SetImplicitView(&view);
1277 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1278 auto handler = std::make_unique<MockWindowsLifecycleManager>(engine.get());
1279 EXPECT_CALL(*handler, SetLifecycleState)
1281 handler_ptr->WindowsLifecycleManager::SetLifecycleState(state);
1283 modifier.SetLifecycleManager(std::move(handler));
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();
1318 FlutterWindowsEngineBuilder builder{GetContext()};
1319 builder.SetDartEntrypoint(
"enableLifecycleToFrom");
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));
1328 EngineModifier modifier(engine.get());
1329 modifier.SetImplicitView(&view);
1330 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
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; };
1337 modifier.SetLifecycleManager(std::move(handler));
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();
1367 FlutterWindowsEngineBuilder builder{GetContext()};
1368 builder.SetDartEntrypoint(
"enableLifecycleToFrom");
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));
1375 EngineModifier modifier(engine.get());
1376 modifier.SetImplicitView(&view);
1377 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1379 bool lifecycle_began =
false;
1380 auto handler = std::make_unique<MockWindowsLifecycleManager>(engine.get());
1381 handler->begin_processing_callback = [&]() { lifecycle_began =
true; };
1382 modifier.SetLifecycleManager(std::move(handler));
1386 while (!lifecycle_began) {
1387 engine->task_runner()->ProcessTasks();
1392 FlutterWindowsEngineBuilder builder{GetContext()};
1393 builder.SetDartEntrypoint(
"sendCreatePlatformViewMethod");
1394 auto engine = builder.Build();
1396 EngineModifier modifier{engine.get()};
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();
1417 FlutterWindowsEngineBuilder builder{GetContext()};
1418 auto engine = builder.Build();
1420 EngineModifier modifier{engine.get()};
1422 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1423 modifier.embedder_api().AddView = MOCK_ENGINE_PROC(
1426 const FlutterAddViewInfo* info) {
return kInternalInconsistency; });
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),
1436 false, BoxConstraints());
1438 EXPECT_TRUE(implicit_view);
1441 auto second_window = std::make_unique<NiceMock<MockWindowBindingHandler>>();
1444 engine->CreateView(std::move(second_window),
1445 false, BoxConstraints()),
1446 "FlutterEngineAddView returned an unexpected result");
1450 FlutterWindowsEngineBuilder builder{GetContext()};
1451 builder.SetDartEntrypoint(
"sendCreatePlatformViewMethod");
1452 auto engine = builder.Build();
1454 EngineModifier modifier{engine.get()};
1456 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1457 modifier.embedder_api().RemoveView = MOCK_ENGINE_PROC(
1460 const FlutterRemoveViewInfo* info) {
return kInternalInconsistency; });
1462 ASSERT_TRUE(engine->
Run());
1463 EXPECT_DEBUG_DEATH(engine->RemoveView(123),
1464 "FlutterEngineRemoveView returned an unexpected result");
1468 auto& context = GetContext();
1469 WindowsConfigBuilder builder{context};
1470 builder.SetDartEntrypoint(
"mergedUIThread");
1473 std::optional<std::thread::id> ui_thread_id;
1475 auto native_entry = CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) {
1476 ui_thread_id = std::this_thread::get_id();
1478 context.AddNativeFunction(
"Signal", native_entry);
1480 EnginePtr engine{builder.RunHeadless()};
1481 while (!ui_thread_id) {
1484 ASSERT_EQ(*ui_thread_id, std::this_thread::get_id());
1488 FlutterWindowsEngineBuilder builder{GetContext()};
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));
1494 EngineModifier modifier(engine.get());
1495 modifier.SetImplicitView(&view);
1497 FlutterViewFocusChangeRequest request;
1500 EXPECT_CALL(view, Focus()).WillOnce(Return(
true));
1501 modifier.OnViewFocusChangeRequest(&request);
1505 auto& context = GetContext();
1506 WindowsConfigBuilder builder{context};
1507 builder.SetDartEntrypoint(
"sendSemanticsTreeInfo");
1512 CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) { done =
true; });
1513 context.AddNativeFunction(
"Signal", native_entry);
1516 EnginePtr engine{builder.RunHeadless()};
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));
1537 EngineModifier modifier{windows_engine};
1538 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
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 UpdateSemanticsEnabled(bool enabled)
std::unique_ptr< FlutterWindowsView > CreateView(std::unique_ptr< WindowBindingHandler > window, bool is_sized_to_content, const BoxConstraints &box_constraints, FlutterWindowsViewSizingDelegate *sizing_delegate=nullptr)
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(AccessibilityPluginTest, DirectAnnounceCall)
UINT GetDpiForMonitor(HMONITOR monitor)
std::function< void(const uint8_t *reply, size_t reply_size)> BinaryReply
static void WindowsPlatformThreadPrioritySetter(FlutterThreadPriority priority)
constexpr FlutterViewId kImplicitViewId