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)
776 NotifyWinEventWrapper,
777 (ui::AXPlatformNodeWin*, ax::mojom::Event),
783 FML_DISALLOW_COPY_AND_ASSIGN(MockFlutterWindowsView);
788 auto& context = GetContext();
789 WindowsConfigBuilder builder{context};
790 builder.SetDartEntrypoint(
"sendAccessibilityAnnouncement");
794 CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) { done =
true; });
795 context.AddNativeFunction(
"Signal", native_entry);
797 EnginePtr engine{builder.RunHeadless()};
798 ASSERT_NE(engine,
nullptr);
800 ui::AXPlatformNodeDelegateBase parent_delegate;
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)};
811 EngineModifier modifier{windows_engine};
812 modifier.SetImplicitView(&view);
816 EXPECT_CALL(view, NotifyWinEventWrapper).Times(1);
820 windows_engine->task_runner()->ProcessTasks();
826 auto& context = GetContext();
827 WindowsConfigBuilder builder{context};
828 builder.SetDartEntrypoint(
"sendAccessibilityAnnouncement");
832 CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) { done =
true; });
833 context.AddNativeFunction(
"Signal", native_entry);
835 EnginePtr engine{builder.RunHeadless()};
836 ASSERT_NE(engine,
nullptr);
843 windows_engine->task_runner()->ProcessTasks();
850 fml::testing::LogCapture log_capture;
852 auto& context = GetContext();
853 WindowsConfigBuilder builder{context};
854 builder.SetDartEntrypoint(
"sendAccessibilityTooltipEvent");
858 CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) { done =
true; });
859 context.AddNativeFunction(
"Signal", native_entry);
861 ViewControllerPtr controller{builder.Run()};
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),
905 FlutterWindowsEngineBuilder builder{GetContext()};
906 builder.SetDartEntrypoint(
"exitTestExit");
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));
914 EngineModifier modifier(engine.get());
915 modifier.SetImplicitView(&view);
916 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
917 auto handler = std::make_unique<MockWindowsLifecycleManager>(engine.get());
918 EXPECT_CALL(*handler, Quit)
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));
924 modifier.SetLifecycleManager(std::move(handler));
926 engine->lifecycle_manager()->BeginProcessingExit();
930 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(0, WM_CLOSE, 0,
936 engine->task_runner()->ProcessTasks();
941 FlutterWindowsEngineBuilder builder{GetContext()};
942 builder.SetDartEntrypoint(
"exitTestCancel");
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));
950 EngineModifier modifier(engine.get());
951 modifier.SetImplicitView(&view);
952 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
953 auto handler = std::make_unique<MockWindowsLifecycleManager>(engine.get());
954 EXPECT_CALL(*handler, IsLastWindowOfProcess).WillRepeatedly(Return(
true));
955 EXPECT_CALL(*handler, Quit).Times(0);
956 modifier.SetLifecycleManager(std::move(handler));
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();
988 FlutterWindowsEngineBuilder builder{GetContext()};
989 builder.SetDartEntrypoint(
"exitTestExit");
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));
997 EngineModifier modifier(engine.get());
998 modifier.SetImplicitView(&view);
999 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1000 auto handler = std::make_unique<MockWindowsLifecycleManager>(engine.get());
1001 EXPECT_CALL(*handler, IsLastWindowOfProcess).WillOnce(Return(
true));
1002 EXPECT_CALL(*handler, Quit)
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,
1009 EXPECT_CALL(*handler, DispatchMessage)
1011 [&engine](HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
1012 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(
1013 hwnd, msg, wparam, lparam);
1015 modifier.SetLifecycleManager(std::move(handler));
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();
1047 FlutterWindowsEngineBuilder builder{GetContext()};
1048 builder.SetDartEntrypoint(
"exitTestExit");
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));
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([&finished]() {
1065 EXPECT_CALL(*handler, Quit).Times(0);
1066 modifier.SetLifecycleManager(std::move(handler));
1067 engine->lifecycle_manager()->BeginProcessingExit();
1071 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(0, WM_CLOSE, 0,
1075 engine->task_runner()->ProcessTasks();
1080 FlutterWindowsEngineBuilder builder{GetContext()};
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));
1087 EngineModifier modifier(engine.get());
1088 modifier.SetImplicitView(&view);
1089 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1090 auto handler = std::make_unique<MockWindowsLifecycleManager>(engine.get());
1091 EXPECT_CALL(*handler, IsLastWindowOfProcess).Times(0);
1092 modifier.SetLifecycleManager(std::move(handler));
1094 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(0, WM_CLOSE, 0,
1099 FlutterWindowsEngineBuilder builder{GetContext()};
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));
1106 EngineModifier modifier(engine.get());
1107 modifier.SetImplicitView(&view);
1108 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1109 auto handler = std::make_unique<MockWindowsLifecycleManager>(engine.get());
1110 EXPECT_CALL(*handler, IsLastWindowOfProcess).WillOnce(Return(
false));
1111 modifier.SetLifecycleManager(std::move(handler));
1112 engine->lifecycle_manager()->BeginProcessingExit();
1114 engine->window_proc_delegate_manager()->OnTopLevelWindowProc(0, WM_CLOSE, 0,
1119 FlutterWindowsEngineBuilder builder{GetContext()};
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));
1126 EngineModifier modifier(engine.get());
1127 modifier.SetImplicitView(&view);
1128 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1129 auto handler = std::make_unique<MockWindowsLifecycleManager>(engine.get());
1130 EXPECT_CALL(*handler, IsLastWindowOfProcess).WillOnce(Return(
false));
1131 modifier.SetLifecycleManager(std::move(handler));
1132 engine->lifecycle_manager()->BeginProcessingExit();
1134 engine->lifecycle_manager()->ExternalWindowMessage(0, WM_CLOSE, 0, 0);
1138 FlutterWindowsEngineBuilder builder{GetContext()};
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));
1145 EngineModifier modifier(engine.get());
1146 modifier.SetImplicitView(&view);
1147 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
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(),
1192 FlutterWindowsEngineBuilder builder{GetContext()};
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));
1199 EngineModifier modifier(engine.get());
1200 modifier.SetImplicitView(&view);
1201 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
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(),
1220 FlutterWindowsEngineBuilder builder{GetContext()};
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; });
1230 EngineModifier modifier(engine.get());
1231 modifier.SetImplicitView(&view);
1232 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
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(),
1262 FlutterWindowsEngineBuilder builder{GetContext()};
1263 builder.SetDartEntrypoint(
"enableLifecycleTest");
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));
1271 EngineModifier modifier(engine.get());
1272 modifier.SetImplicitView(&view);
1273 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1274 auto handler = std::make_unique<MockWindowsLifecycleManager>(engine.get());
1275 EXPECT_CALL(*handler, SetLifecycleState)
1277 handler_ptr->WindowsLifecycleManager::SetLifecycleState(state);
1279 modifier.SetLifecycleManager(std::move(handler));
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();
1314 FlutterWindowsEngineBuilder builder{GetContext()};
1315 builder.SetDartEntrypoint(
"enableLifecycleToFrom");
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));
1324 EngineModifier modifier(engine.get());
1325 modifier.SetImplicitView(&view);
1326 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
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; };
1333 modifier.SetLifecycleManager(std::move(handler));
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();
1363 FlutterWindowsEngineBuilder builder{GetContext()};
1364 builder.SetDartEntrypoint(
"enableLifecycleToFrom");
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));
1371 EngineModifier modifier(engine.get());
1372 modifier.SetImplicitView(&view);
1373 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1375 bool lifecycle_began =
false;
1376 auto handler = std::make_unique<MockWindowsLifecycleManager>(engine.get());
1377 handler->begin_processing_callback = [&]() { lifecycle_began =
true; };
1378 modifier.SetLifecycleManager(std::move(handler));
1382 while (!lifecycle_began) {
1383 engine->task_runner()->ProcessTasks();
1388 FlutterWindowsEngineBuilder builder{GetContext()};
1389 builder.SetDartEntrypoint(
"sendCreatePlatformViewMethod");
1390 auto engine = builder.Build();
1392 EngineModifier modifier{engine.get()};
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();
1413 FlutterWindowsEngineBuilder builder{GetContext()};
1414 auto engine = builder.Build();
1416 EngineModifier modifier{engine.get()};
1418 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1419 modifier.embedder_api().AddView = MOCK_ENGINE_PROC(
1422 const FlutterAddViewInfo* info) {
return kInternalInconsistency; });
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");
1443 FlutterWindowsEngineBuilder builder{GetContext()};
1444 builder.SetDartEntrypoint(
"sendCreatePlatformViewMethod");
1445 auto engine = builder.Build();
1447 EngineModifier modifier{engine.get()};
1449 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
1450 modifier.embedder_api().RemoveView = MOCK_ENGINE_PROC(
1453 const FlutterRemoveViewInfo* info) {
return kInternalInconsistency; });
1455 ASSERT_TRUE(engine->
Run());
1456 EXPECT_DEBUG_DEATH(engine->RemoveView(123),
1457 "FlutterEngineRemoveView returned an unexpected result");
1461 auto& context = GetContext();
1462 WindowsConfigBuilder builder{context};
1463 builder.SetDartEntrypoint(
"mergedUIThread");
1466 std::optional<std::thread::id> ui_thread_id;
1468 auto native_entry = CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) {
1469 ui_thread_id = std::this_thread::get_id();
1471 context.AddNativeFunction(
"Signal", native_entry);
1473 EnginePtr engine{builder.RunHeadless()};
1474 while (!ui_thread_id) {
1477 ASSERT_EQ(*ui_thread_id, std::this_thread::get_id());
1481 FlutterWindowsEngineBuilder builder{GetContext()};
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));
1487 EngineModifier modifier(engine.get());
1488 modifier.SetImplicitView(&view);
1490 FlutterViewFocusChangeRequest request;
1493 EXPECT_CALL(view, Focus()).WillOnce(Return(
true));
1494 modifier.OnViewFocusChangeRequest(&request);
1498 auto& context = GetContext();
1499 WindowsConfigBuilder builder{context};
1500 builder.SetDartEntrypoint(
"sendSemanticsTreeInfo");
1505 CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) { done =
true; });
1506 context.AddNativeFunction(
"Signal", native_entry);
1509 EnginePtr engine{builder.RunHeadless()};
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));
1530 EngineModifier modifier{windows_engine};
1531 modifier.embedder_api().RunsAOTCompiledDartCode = []() {
return false; };
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 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