8 #include <wrl/client.h>
11 #include "flutter/fml/synchronization/count_down_latch.h"
12 #include "flutter/fml/synchronization/waitable_event.h"
14 #include "flutter/shell/platform/embedder/test_utils/proc_table_replacement.h"
17 #include "flutter/shell/platform/windows/testing/engine_modifier.h"
18 #include "flutter/shell/platform/windows/testing/mock_window_binding_handler.h"
19 #include "flutter/shell/platform/windows/testing/windows_test.h"
20 #include "flutter/shell/platform/windows/testing/windows_test_config_builder.h"
21 #include "flutter/shell/platform/windows/testing/windows_test_context.h"
23 #include "flutter/testing/stream_capture.h"
24 #include "gmock/gmock.h"
25 #include "gtest/gtest.h"
26 #include "third_party/tonic/converter/dart_converter.h"
34 class HalfBrokenEGLManager :
public egl::Manager {
38 std::unique_ptr<egl::WindowSurface>
39 CreateWindowSurface(HWND hwnd,
size_t width,
size_t height)
override {
44 class MockWindowsLifecycleManager :
public WindowsLifecycleManager {
56 if (::GetMessage(&msg,
nullptr, 0, 0)) {
57 ::TranslateMessage(&msg);
58 ::DispatchMessage(&msg);
66 TEST(WindowsNoFixtureTest, GetTextureRegistrar) {
72 ASSERT_NE(engine,
nullptr);
74 EXPECT_NE(texture_registrar,
nullptr);
80 auto& context = GetContext();
81 WindowsConfigBuilder builder(context);
82 ViewControllerPtr controller{builder.Run()};
83 ASSERT_NE(controller,
nullptr);
87 TEST_F(WindowsTest, LaunchMainHasNoOutput) {
90 StreamCapture stderr_capture(&std::cerr);
92 auto& context = GetContext();
93 WindowsConfigBuilder builder(context);
94 ViewControllerPtr controller{builder.Run()};
95 ASSERT_NE(controller,
nullptr);
97 stderr_capture.Stop();
100 EXPECT_TRUE(stderr_capture.GetOutput().empty());
104 TEST_F(WindowsTest, LaunchCustomEntrypoint) {
105 auto& context = GetContext();
106 WindowsConfigBuilder builder(context);
107 builder.SetDartEntrypoint(
"customEntrypoint");
108 ViewControllerPtr controller{builder.Run()};
109 ASSERT_NE(controller,
nullptr);
117 TEST_F(WindowsTest, LaunchCustomEntrypointInEngineRunInvocation) {
118 auto& context = GetContext();
119 WindowsConfigBuilder builder(context);
120 EnginePtr engine{builder.InitializeEngine()};
121 ASSERT_NE(engine,
nullptr);
127 TEST_F(WindowsTest, LaunchHeadlessEngine) {
128 auto& context = GetContext();
129 WindowsConfigBuilder builder(context);
130 builder.SetDartEntrypoint(
"signalViewIds");
131 EnginePtr engine{builder.RunHeadless()};
132 ASSERT_NE(engine,
nullptr);
134 std::string view_ids;
135 bool signaled =
false;
136 context.AddNativeFunction(
137 "SignalStringValue", CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) {
138 auto handle = Dart_GetNativeArgument(args, 0);
139 ASSERT_FALSE(Dart_IsError(handle));
140 view_ids = tonic::DartConverter<std::string>::FromDart(handle);
144 ViewControllerPtr controller{builder.Run()};
145 ASSERT_NE(controller,
nullptr);
152 EXPECT_EQ(view_ids,
"View IDs: [0]");
156 TEST_F(WindowsTest, EngineCanTransitionToHeadless) {
157 auto& context = GetContext();
158 WindowsConfigBuilder builder(context);
159 EnginePtr engine{builder.RunHeadless()};
160 ASSERT_NE(engine,
nullptr);
166 ViewControllerPtr controller{
169 ASSERT_NE(controller,
nullptr);
173 ASSERT_NE(engine,
nullptr);
176 ASSERT_TRUE(engine_ptr->running());
180 TEST_F(WindowsTest, LaunchRefreshesAccessibility) {
181 auto& context = GetContext();
182 WindowsConfigBuilder builder(context);
183 EnginePtr engine{builder.InitializeEngine()};
184 EngineModifier modifier{
189 UpdateAccessibilityFeatures, ([&called](
auto engine,
auto flags) {
194 ViewControllerPtr controller{
205 TEST_F(WindowsTest, LaunchConflictingCustomEntrypoints) {
206 auto& context = GetContext();
207 WindowsConfigBuilder builder(context);
208 builder.SetDartEntrypoint(
"customEntrypoint");
209 EnginePtr engine{builder.InitializeEngine()};
210 ASSERT_NE(engine,
nullptr);
216 TEST_F(WindowsTest, VerifyNativeFunction) {
217 auto& context = GetContext();
218 WindowsConfigBuilder builder(context);
219 builder.SetDartEntrypoint(
"verifyNativeFunction");
221 bool signaled =
false;
223 CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) { signaled =
true; });
224 context.AddNativeFunction(
"Signal", native_entry);
226 ViewControllerPtr controller{builder.Run()};
227 ASSERT_NE(controller,
nullptr);
237 TEST_F(WindowsTest, VerifyNativeFunctionWithParameters) {
238 auto& context = GetContext();
239 WindowsConfigBuilder builder(context);
240 builder.SetDartEntrypoint(
"verifyNativeFunctionWithParameters");
242 bool bool_value =
false;
243 bool signaled =
false;
244 auto native_entry = CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) {
245 auto handle = Dart_GetNativeBooleanArgument(args, 0, &bool_value);
246 ASSERT_FALSE(Dart_IsError(handle));
249 context.AddNativeFunction(
"SignalBoolValue", native_entry);
251 ViewControllerPtr controller{builder.Run()};
252 ASSERT_NE(controller,
nullptr);
258 EXPECT_TRUE(bool_value);
262 TEST_F(WindowsTest, PlatformExecutable) {
263 auto& context = GetContext();
264 WindowsConfigBuilder builder(context);
265 builder.SetDartEntrypoint(
"readPlatformExecutable");
267 std::string executable_name;
268 bool signaled =
false;
269 auto native_entry = CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) {
270 auto handle = Dart_GetNativeArgument(args, 0);
271 ASSERT_FALSE(Dart_IsError(handle));
272 executable_name = tonic::DartConverter<std::string>::FromDart(handle);
275 context.AddNativeFunction(
"SignalStringValue", native_entry);
277 ViewControllerPtr controller{builder.Run()};
278 ASSERT_NE(controller,
nullptr);
284 EXPECT_EQ(executable_name,
"flutter_windows_unittests.exe");
289 TEST_F(WindowsTest, VerifyNativeFunctionWithReturn) {
290 auto& context = GetContext();
291 WindowsConfigBuilder builder(context);
292 builder.SetDartEntrypoint(
"verifyNativeFunctionWithReturn");
294 bool bool_value_to_return =
true;
296 auto bool_return_entry = CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) {
297 Dart_SetBooleanReturnValue(args, bool_value_to_return);
300 context.AddNativeFunction(
"SignalBoolReturn", bool_return_entry);
302 bool bool_value_passed =
false;
303 auto bool_pass_entry = CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) {
304 auto handle = Dart_GetNativeBooleanArgument(args, 0, &bool_value_passed);
305 ASSERT_FALSE(Dart_IsError(handle));
308 context.AddNativeFunction(
"SignalBoolValue", bool_pass_entry);
310 ViewControllerPtr controller{builder.Run()};
311 ASSERT_NE(controller,
nullptr);
317 EXPECT_TRUE(bool_value_passed);
323 fml::AutoResetWaitableEvent frame_scheduled_latch;
324 std::thread::id thread_id;
329 auto platform_thread = std::make_unique<fml::Thread>(
"test_platform_thread");
330 platform_thread->GetTaskRunner()->PostTask([&]() {
331 captures.thread_id = std::this_thread::get_id();
333 auto& context = GetContext();
334 WindowsConfigBuilder builder(context);
335 builder.SetDartEntrypoint(
"drawHelloWorld");
337 auto native_entry = CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) {
338 captures.frame_scheduled_latch.Signal();
340 context.AddNativeFunction(
"NotifyFirstFrameScheduled", native_entry);
342 ViewControllerPtr controller{builder.Run()};
343 EXPECT_NE(controller,
nullptr);
350 auto captures =
static_cast<Captures*
>(
user_data);
352 EXPECT_TRUE(captures->frame_scheduled_latch.IsSignaledForTest());
355 EXPECT_EQ(std::this_thread::get_id(), captures->thread_id);
358 captures->done =
true;
363 while (!captures.done) {
369 platform_thread->Join();
375 auto& context = GetContext();
376 WindowsConfigBuilder builder(context);
377 builder.SetDartEntrypoint(
"renderImplicitView");
379 EnginePtr engine{builder.RunHeadless()};
380 ASSERT_NE(engine,
nullptr);
387 auto done = reinterpret_cast<std::atomic<bool>*>(user_data);
396 FlutterWindowMetricsEvent metrics = {};
397 metrics.struct_size =
sizeof(FlutterWindowMetricsEvent);
399 metrics.height = 100;
400 metrics.pixel_ratio = 1.0;
402 engine_ptr->SendWindowMetricsEvent(metrics);
412 auto& context = GetContext();
413 WindowsConfigBuilder builder(context);
415 EnginePtr engine{builder.RunHeadless()};
416 ASSERT_NE(engine,
nullptr);
422 TEST_F(WindowsTest, IsNotPlatformThread) {
423 auto& context = GetContext();
424 WindowsConfigBuilder builder(context);
426 EnginePtr engine{builder.RunHeadless()};
427 ASSERT_NE(engine,
nullptr);
430 std::thread background(
434 EXPECT_FALSE(result);
439 TEST_F(WindowsTest, PostPlatformThreadTaskFromPlatformThread) {
440 auto& context = GetContext();
441 WindowsConfigBuilder builder(context);
443 EnginePtr engine{builder.RunHeadless()};
444 ASSERT_NE(engine,
nullptr);
447 std::thread::id thread_id;
454 auto captures = static_cast<Captures*>(user_data);
455 captures->thread_id = std::this_thread::get_id();
456 captures->done = true;
460 while (!captures.done) {
464 EXPECT_EQ(captures.thread_id, std::this_thread::get_id());
469 TEST_F(WindowsTest, PostPlatformThreadTaskFromBackgroundThread) {
470 auto& context = GetContext();
471 WindowsConfigBuilder builder(context);
473 EnginePtr engine{builder.RunHeadless()};
474 ASSERT_NE(engine,
nullptr);
476 std::mutex background_thread_id_mutex;
478 std::thread::id background_thread_id;
479 std::thread::id platform_thread_id;
483 std::thread background([&]() {
485 std::scoped_lock lock{background_thread_id_mutex};
486 captures.background_thread_id = std::this_thread::get_id();
492 auto captures = static_cast<Captures*>(user_data);
493 captures->platform_thread_id = std::this_thread::get_id();
494 captures->done = true;
500 while (!captures.done) {
504 std::scoped_lock lock{background_thread_id_mutex};
505 EXPECT_NE(captures.background_thread_id, std::thread::id{});
506 EXPECT_NE(captures.background_thread_id, captures.platform_thread_id);
507 EXPECT_EQ(captures.platform_thread_id, std::this_thread::get_id());
512 TEST_F(WindowsTest, PostPlatformThreadTaskCancelledOnEngineDestroy) {
513 auto& context = GetContext();
514 WindowsConfigBuilder builder(context);
516 EnginePtr engine{builder.RunHeadless()};
517 ASSERT_NE(engine,
nullptr);
520 bool callback_called =
false;
521 bool cancel_called =
false;
527 static_cast<Captures*>(user_data)->callback_called = true;
530 static_cast<Captures*>(user_data)->cancel_called = true;
538 EXPECT_FALSE(captures.callback_called);
539 EXPECT_TRUE(captures.cancel_called);
544 auto& context = GetContext();
545 WindowsConfigBuilder builder(context);
546 ViewControllerPtr controller{builder.Run()};
547 ASSERT_NE(controller,
nullptr);
554 TEST_F(WindowsTest, GetGraphicsAdapter) {
555 auto& context = GetContext();
556 WindowsConfigBuilder builder(context);
557 ViewControllerPtr controller{builder.Run()};
558 ASSERT_NE(controller,
nullptr);
561 Microsoft::WRL::ComPtr<IDXGIAdapter> dxgi_adapter;
563 ASSERT_NE(dxgi_adapter,
nullptr);
564 DXGI_ADAPTER_DESC desc{};
565 ASSERT_TRUE(SUCCEEDED(dxgi_adapter->GetDesc(&desc)));
568 TEST_F(WindowsTest, GetEngineGraphicsAdapter) {
569 auto& context = GetContext();
570 WindowsConfigBuilder builder(context);
571 ViewControllerPtr controller{builder.Run()};
572 ASSERT_NE(controller,
nullptr);
576 IDXGIAdapter* dxgi_adapter;
578 ASSERT_NE(dxgi_adapter,
nullptr);
579 DXGI_ADAPTER_DESC desc{};
580 ASSERT_TRUE(SUCCEEDED(dxgi_adapter->GetDesc(&desc)));
583 TEST_F(WindowsTest, GetGraphicsAdapterWithLowPowerPreference) {
586 GTEST_SKIP() <<
"Not able to find low power GPU, nothing to check.";
589 auto& context = GetContext();
590 WindowsConfigBuilder builder(context);
592 ViewControllerPtr controller{builder.Run()};
593 ASSERT_NE(controller,
nullptr);
596 Microsoft::WRL::ComPtr<IDXGIAdapter> dxgi_adapter;
598 ASSERT_NE(dxgi_adapter,
nullptr);
599 DXGI_ADAPTER_DESC desc{};
600 ASSERT_TRUE(SUCCEEDED(dxgi_adapter->GetDesc(&desc)));
601 ASSERT_EQ(desc.AdapterLuid.HighPart, luid->HighPart);
602 ASSERT_EQ(desc.AdapterLuid.LowPart, luid->LowPart);
605 TEST_F(WindowsTest, GetGraphicsAdapterWithHighPerformancePreference) {
608 GTEST_SKIP() <<
"Not able to find high performance GPU, nothing to check.";
611 auto& context = GetContext();
612 WindowsConfigBuilder builder(context);
613 builder.SetGpuPreference(
615 ViewControllerPtr controller{builder.Run()};
616 ASSERT_NE(controller,
nullptr);
619 Microsoft::WRL::ComPtr<IDXGIAdapter> dxgi_adapter;
621 ASSERT_NE(dxgi_adapter,
nullptr);
622 DXGI_ADAPTER_DESC desc{};
623 ASSERT_TRUE(SUCCEEDED(dxgi_adapter->GetDesc(&desc)));
624 ASSERT_EQ(desc.AdapterLuid.HighPart, luid->HighPart);
625 ASSERT_EQ(desc.AdapterLuid.LowPart, luid->LowPart);
628 TEST_F(WindowsTest, GetEngineGraphicsAdapterWithLowPowerPreference) {
631 GTEST_SKIP() <<
"Not able to find low power GPU, nothing to check.";
634 auto& context = GetContext();
635 WindowsConfigBuilder builder(context);
637 ViewControllerPtr controller{builder.Run()};
638 ASSERT_NE(controller,
nullptr);
642 IDXGIAdapter* dxgi_adapter;
644 ASSERT_NE(dxgi_adapter,
nullptr);
645 DXGI_ADAPTER_DESC desc{};
646 ASSERT_TRUE(SUCCEEDED(dxgi_adapter->GetDesc(&desc)));
647 ASSERT_EQ(desc.AdapterLuid.HighPart, luid->HighPart);
648 ASSERT_EQ(desc.AdapterLuid.LowPart, luid->LowPart);
651 TEST_F(WindowsTest, GetEngineGraphicsAdapterWithHighPerformancePreference) {
654 GTEST_SKIP() <<
"Not able to find high performance GPU, nothing to check.";
657 auto& context = GetContext();
658 WindowsConfigBuilder builder(context);
659 builder.SetGpuPreference(
661 ViewControllerPtr controller{builder.Run()};
662 ASSERT_NE(controller,
nullptr);
666 IDXGIAdapter* dxgi_adapter;
668 ASSERT_NE(dxgi_adapter,
nullptr);
669 DXGI_ADAPTER_DESC desc{};
670 ASSERT_TRUE(SUCCEEDED(dxgi_adapter->GetDesc(&desc)));
671 ASSERT_EQ(desc.AdapterLuid.HighPart, luid->HighPart);
672 ASSERT_EQ(desc.AdapterLuid.LowPart, luid->LowPart);
676 TEST_F(WindowsTest, PluginRegistrarGetImplicitView) {
677 auto& context = GetContext();
678 WindowsConfigBuilder builder(context);
679 ViewControllerPtr controller{builder.Run()};
680 ASSERT_NE(controller,
nullptr);
689 ASSERT_NE(implicit_view,
nullptr);
692 TEST_F(WindowsTest, PluginRegistrarGetView) {
693 auto& context = GetContext();
694 WindowsConfigBuilder builder(context);
695 ViewControllerPtr controller{builder.Run()};
696 ASSERT_NE(controller,
nullptr);
711 ASSERT_NE(view,
nullptr);
712 ASSERT_EQ(view_123,
nullptr);
715 TEST_F(WindowsTest, PluginRegistrarGetViewHeadless) {
716 auto& context = GetContext();
717 WindowsConfigBuilder builder(context);
718 EnginePtr engine{builder.RunHeadless()};
719 ASSERT_NE(engine,
nullptr);
729 ASSERT_EQ(implicit_view,
nullptr);
730 ASSERT_EQ(view_123,
nullptr);
736 auto& context = GetContext();
737 WindowsConfigBuilder builder(context);
738 EnginePtr engine{builder.InitializeEngine()};
739 EngineModifier modifier{
742 auto egl_manager = std::make_unique<HalfBrokenEGLManager>();
743 ASSERT_TRUE(egl_manager->IsValid());
744 modifier.SetEGLManager(std::move(egl_manager));
746 ViewControllerPtr controller{
749 ASSERT_NE(controller,
nullptr);
754 auto& context = GetContext();
755 WindowsConfigBuilder builder(context);
756 EnginePtr engine{builder.InitializeEngine()};
758 EngineModifier modifier{windows_engine};
760 auto lifecycle_manager =
761 std::make_unique<MockWindowsLifecycleManager>(windows_engine);
762 auto lifecycle_manager_ptr = lifecycle_manager.get();
763 modifier.SetLifecycleManager(std::move(lifecycle_manager));
765 EXPECT_CALL(*lifecycle_manager_ptr,
768 lifecycle_manager_ptr->WindowsLifecycleManager::SetLifecycleState(
772 EXPECT_CALL(*lifecycle_manager_ptr,
775 lifecycle_manager_ptr->WindowsLifecycleManager::SetLifecycleState(
783 ViewControllerPtr controller{
788 ASSERT_NE(view,
nullptr);
791 ASSERT_NE(hwnd,
nullptr);
796 ::MoveWindow(hwnd, 0, 0, 100, 100,
799 while (lifecycle_manager_ptr->IsUpdateStateScheduled()) {
806 while (lifecycle_manager_ptr->IsUpdateStateScheduled()) {
811 TEST_F(WindowsTest, GetKeyboardStateHeadless) {
812 auto& context = GetContext();
813 WindowsConfigBuilder builder(context);
814 builder.SetDartEntrypoint(
"sendGetKeyboardState");
816 std::atomic<bool> done =
false;
817 context.AddNativeFunction(
818 "SignalStringValue", CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) {
819 auto handle = Dart_GetNativeArgument(args, 0);
820 ASSERT_FALSE(Dart_IsError(handle));
821 auto value = tonic::DartConverter<std::string>::FromDart(handle);
822 EXPECT_EQ(value,
"Success");
826 ViewControllerPtr controller{builder.Run()};
827 ASSERT_NE(controller,
nullptr);
839 std::string view_ids;
841 auto& context = GetContext();
842 WindowsConfigBuilder builder(context);
843 builder.SetDartEntrypoint(
"onMetricsChangedSignalViewIds");
846 context.AddNativeFunction(
848 CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) { ready =
true; }));
850 context.AddNativeFunction(
851 "SignalStringValue", CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) {
852 auto handle = Dart_GetNativeArgument(args, 0);
853 ASSERT_FALSE(Dart_IsError(handle));
855 std::scoped_lock lock{mutex};
856 view_ids = tonic::DartConverter<std::string>::FromDart(handle);
860 ViewControllerPtr first_controller{builder.Run()};
861 ASSERT_NE(first_controller,
nullptr);
871 properties.
width = 100;
873 ViewControllerPtr second_controller{
875 ASSERT_NE(second_controller,
nullptr);
880 std::scoped_lock lock{mutex};
881 if (view_ids ==
"View IDs: [0, 1]") {
888 second_controller.reset();
891 std::scoped_lock lock{mutex};
892 if (view_ids ==
"View IDs: [0]") {
899 auto& context = GetContext();
900 WindowsConfigBuilder builder(context);
901 builder.SetDartEntrypoint(
"testEngineId");
903 std::optional<int64_t> engineId;
904 context.AddNativeFunction(
905 "NotifyEngineId", CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) {
906 const auto argument = Dart_GetNativeArgument(args, 0);
907 if (!Dart_IsNull(argument)) {
908 const auto handle = tonic::DartConverter<int64_t>::FromDart(argument);
913 ViewControllerPtr first_controller{builder.Run()};
914 ASSERT_NE(first_controller,
nullptr);
916 while (!engineId.has_value()) {
925 auto& context = GetContext();
926 WindowsConfigBuilder builder(context);
927 builder.SetAccessibilityMode(
929 builder.SetDartEntrypoint(
"sendSemanticsTree");
934 CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) { done =
true; });
935 context.AddNativeFunction(
"Signal", native_entry);
938 ViewControllerPtr controller{builder.Run()};
939 ASSERT_NE(controller,
nullptr);
942 ASSERT_NE(view,
nullptr);
954 ASSERT_NE(hwnd,
nullptr);
956 LRESULT lres = SendMessage(hwnd, WM_GETOBJECT, 0, OBJID_CLIENT);
962 HRESULT hr = ObjectFromLresult(lres, IID_IAccessible, 0, (
void**)&accessible);
963 ASSERT_TRUE(SUCCEEDED(hr));
964 ASSERT_NE(accessible,
nullptr);
967 hr = ObjectFromLresult(lres, IID_IAccessibleEx, 0, (
void**)&accessible_ex);
968 ASSERT_TRUE(FAILED(hr));
969 ASSERT_EQ(accessible_ex,
nullptr);
972 TEST_F(WindowsTest, EnableIAccessibleEx) {
973 auto& context = GetContext();
974 WindowsConfigBuilder builder(context);
975 builder.SetAccessibilityMode(
977 builder.SetDartEntrypoint(
"sendSemanticsTree");
982 CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) { done =
true; });
983 context.AddNativeFunction(
"Signal", native_entry);
986 ViewControllerPtr controller{builder.Run()};
987 ASSERT_NE(controller,
nullptr);
990 ASSERT_NE(view,
nullptr);
1002 ASSERT_NE(hwnd,
nullptr);
1004 LRESULT lres = SendMessage(hwnd, WM_GETOBJECT, 0, OBJID_CLIENT);
1011 ObjectFromLresult(lres, IID_IAccessibleEx, 0, (
void**)&accessible_ex);
1012 ASSERT_TRUE(SUCCEEDED(hr));
1013 ASSERT_NE(accessible_ex,
nullptr);
1014 accessible_ex->Release();
void UpdateAccessibilityFeatures()
virtual void OnUpdateSemanticsEnabled(bool enabled) override
WindowsLifecycleManager(FlutterWindowsEngine *engine)
virtual void SetLifecycleState(AppLifecycleState state)
static std::optional< LUID > GetLowPowerGpuLuid()
static std::optional< LUID > GetHighPerformanceGpuLuid()
MOCK_METHOD(void, Quit,(std::optional< HWND >, std::optional< WPARAM >, std::optional< LPARAM >, UINT),(override))
MockWindowsLifecycleManager(FlutterWindowsEngine *engine)
bool FlutterDesktopEngineGetGraphicsAdapter(FlutterDesktopEngineRef engine, IDXGIAdapter **adapter_out)
FlutterDesktopEngineRef FlutterDesktopEngineCreate(const FlutterDesktopEngineProperties *engine_properties)
FLUTTER_EXPORT FlutterDesktopEngineRef FlutterDesktopEngineForId(int64_t engine_id)
FlutterDesktopViewRef FlutterDesktopPluginRegistrarGetViewById(FlutterDesktopPluginRegistrarRef registrar, FlutterDesktopViewId view_id)
FlutterDesktopPluginRegistrarRef FlutterDesktopEngineGetPluginRegistrar(FlutterDesktopEngineRef engine, const char *plugin_name)
bool FlutterDesktopEngineIsPlatformThread(FlutterDesktopEngineRef engine)
FlutterDesktopViewControllerRef FlutterDesktopViewControllerCreate(int width, int height, FlutterDesktopEngineRef engine)
bool FlutterDesktopEngineDestroy(FlutterDesktopEngineRef engine_ref)
void FlutterDesktopEnginePostPlatformThreadTask(FlutterDesktopEngineRef engine, VoidCallback callback, VoidCallback on_cancel, void *user_data)
FlutterDesktopTextureRegistrarRef FlutterDesktopEngineGetTextureRegistrar(FlutterDesktopEngineRef engine)
IDXGIAdapter * FlutterDesktopViewGetGraphicsAdapter(FlutterDesktopViewRef view)
FlutterDesktopViewId FlutterDesktopViewControllerGetViewId(FlutterDesktopViewControllerRef ref)
FlutterDesktopEngineRef FlutterDesktopViewControllerGetEngine(FlutterDesktopViewControllerRef ref)
void FlutterDesktopEngineSetNextFrameCallback(FlutterDesktopEngineRef engine, VoidCallback callback, void *user_data)
HWND FlutterDesktopViewGetHWND(FlutterDesktopViewRef view)
FlutterDesktopViewRef FlutterDesktopViewControllerGetView(FlutterDesktopViewControllerRef ref)
FlutterDesktopViewRef FlutterDesktopPluginRegistrarGetView(FlutterDesktopPluginRegistrarRef registrar)
FlutterDesktopViewControllerRef FlutterDesktopEngineCreateViewController(FlutterDesktopEngineRef engine, const FlutterDesktopViewControllerProperties *properties)
bool FlutterDesktopEngineRun(FlutterDesktopEngineRef engine, const char *entry_point)
struct FlutterDesktopEngine * FlutterDesktopEngineRef
int64_t FlutterDesktopViewId
struct FlutterDesktopView * FlutterDesktopViewRef
@ HighPerformancePreference
TEST_F(AccessibilityPluginTest, DirectAnnounceCall)
TEST(AccessibilityBridgeWindows, GetParent)
constexpr FlutterViewId kImplicitViewId
const wchar_t * icu_data_path
const wchar_t * assets_path
FlutterDesktopImpellerSwitch impeller_switch