Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -299,11 +299,12 @@ bool FlutterWindowsEngine::Run(std::string_view entrypoint) {
custom_task_runners.thread_priority_setter =
&WindowsPlatformThreadPrioritySetter;

if (project_->ui_thread_policy() ==
FlutterUIThreadPolicy::RunOnPlatformThread) {
FML_LOG(WARNING)
<< "Running with merged platform and UI thread. Experimental.";
if (project_->ui_thread_policy() !=
FlutterUIThreadPolicy::RunOnSeparateThread) {
custom_task_runners.ui_task_runner = &platform_task_runner;
} else {
FML_LOG(WARNING) << "Running with unmerged platform and UI threads. This "
"will be removed in future.";
}

FlutterProjectArgs args = {};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,20 +131,23 @@ TEST_F(WindowsTest, LaunchHeadlessEngine) {
ASSERT_NE(engine, nullptr);

std::string view_ids;
fml::AutoResetWaitableEvent latch;
bool signaled = false;
context.AddNativeFunction(
"SignalStringValue", CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) {
auto handle = Dart_GetNativeArgument(args, 0);
ASSERT_FALSE(Dart_IsError(handle));
view_ids = tonic::DartConverter<std::string>::FromDart(handle);
latch.Signal();
signaled = true;
}));

ViewControllerPtr controller{builder.Run()};
ASSERT_NE(controller, nullptr);

while (!signaled) {
PumpMessage();
}

// Verify a headless app has the implicit view.
latch.Wait();
EXPECT_EQ(view_ids, "View IDs: [0]");
}

Expand Down Expand Up @@ -214,16 +217,18 @@ TEST_F(WindowsTest, VerifyNativeFunction) {
WindowsConfigBuilder builder(context);
builder.SetDartEntrypoint("verifyNativeFunction");

fml::AutoResetWaitableEvent latch;
bool signaled = false;
auto native_entry =
CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) { latch.Signal(); });
CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) { signaled = true; });
context.AddNativeFunction("Signal", native_entry);

ViewControllerPtr controller{builder.Run()};
ASSERT_NE(controller, nullptr);

// Wait until signal has been called.
latch.Wait();
while (!signaled) {
PumpMessage();
}
}

// Verify that native functions that pass parameters can be registered and
Expand All @@ -234,19 +239,21 @@ TEST_F(WindowsTest, VerifyNativeFunctionWithParameters) {
builder.SetDartEntrypoint("verifyNativeFunctionWithParameters");

bool bool_value = false;
fml::AutoResetWaitableEvent latch;
bool signaled = false;
auto native_entry = CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) {
auto handle = Dart_GetNativeBooleanArgument(args, 0, &bool_value);
ASSERT_FALSE(Dart_IsError(handle));
latch.Signal();
signaled = true;
});
context.AddNativeFunction("SignalBoolValue", native_entry);

ViewControllerPtr controller{builder.Run()};
ASSERT_NE(controller, nullptr);

// Wait until signalBoolValue has been called.
latch.Wait();
while (!signaled) {
PumpMessage();
}
EXPECT_TRUE(bool_value);
}

Expand All @@ -257,20 +264,22 @@ TEST_F(WindowsTest, PlatformExecutable) {
builder.SetDartEntrypoint("readPlatformExecutable");

std::string executable_name;
fml::AutoResetWaitableEvent latch;
bool signaled = false;
auto native_entry = CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) {
auto handle = Dart_GetNativeArgument(args, 0);
ASSERT_FALSE(Dart_IsError(handle));
executable_name = tonic::DartConverter<std::string>::FromDart(handle);
latch.Signal();
signaled = true;
});
context.AddNativeFunction("SignalStringValue", native_entry);

ViewControllerPtr controller{builder.Run()};
ASSERT_NE(controller, nullptr);

// Wait until signalStringValue has been called.
latch.Wait();
while (!signaled) {
PumpMessage();
}
EXPECT_EQ(executable_name, "flutter_windows_unittests.exe");
}

Expand All @@ -282,26 +291,28 @@ TEST_F(WindowsTest, VerifyNativeFunctionWithReturn) {
builder.SetDartEntrypoint("verifyNativeFunctionWithReturn");

bool bool_value_to_return = true;
fml::CountDownLatch latch(2);
int count = 2;
auto bool_return_entry = CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) {
Dart_SetBooleanReturnValue(args, bool_value_to_return);
latch.CountDown();
--count;
});
context.AddNativeFunction("SignalBoolReturn", bool_return_entry);

bool bool_value_passed = false;
auto bool_pass_entry = CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) {
auto handle = Dart_GetNativeBooleanArgument(args, 0, &bool_value_passed);
ASSERT_FALSE(Dart_IsError(handle));
latch.CountDown();
--count;
});
context.AddNativeFunction("SignalBoolValue", bool_pass_entry);

ViewControllerPtr controller{builder.Run()};
ASSERT_NE(controller, nullptr);

// Wait until signalBoolReturn and signalBoolValue have been called.
latch.Wait();
while (count > 0) {
PumpMessage();
}
EXPECT_TRUE(bool_value_passed);
}

Expand Down Expand Up @@ -614,10 +625,10 @@ TEST_F(WindowsTest, AddRemoveView) {
WindowsConfigBuilder builder(context);
builder.SetDartEntrypoint("onMetricsChangedSignalViewIds");

fml::AutoResetWaitableEvent ready_latch;
bool ready = false;
context.AddNativeFunction(
"Signal", CREATE_NATIVE_ENTRY(
[&](Dart_NativeArguments args) { ready_latch.Signal(); }));
"Signal",
CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) { ready = true; }));

context.AddNativeFunction(
"SignalStringValue", CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) {
Expand All @@ -632,7 +643,9 @@ TEST_F(WindowsTest, AddRemoveView) {
ViewControllerPtr first_controller{builder.Run()};
ASSERT_NE(first_controller, nullptr);

ready_latch.Wait();
while (!ready) {
PumpMessage();
}

// Create a second view.
FlutterDesktopEngineRef engine =
Expand Down Expand Up @@ -670,7 +683,6 @@ TEST_F(WindowsTest, EngineId) {
WindowsConfigBuilder builder(context);
builder.SetDartEntrypoint("testEngineId");

fml::AutoResetWaitableEvent latch;
std::optional<int64_t> engineId;
context.AddNativeFunction(
"NotifyEngineId", CREATE_NATIVE_ENTRY([&](Dart_NativeArguments args) {
Expand All @@ -679,17 +691,15 @@ TEST_F(WindowsTest, EngineId) {
const auto handle = tonic::DartConverter<int64_t>::FromDart(argument);
engineId = handle;
}
latch.Signal();
}));
// Create the implicit view.
ViewControllerPtr first_controller{builder.Run()};
ASSERT_NE(first_controller, nullptr);

latch.Wait();
EXPECT_TRUE(engineId.has_value());
if (!engineId.has_value()) {
return;
while (!engineId.has_value()) {
PumpMessage();
}

auto engine = FlutterDesktopViewControllerGetEngine(first_controller.get());
EXPECT_EQ(engine, FlutterDesktopEngineForId(*engineId));
}
Expand Down