5#include "flutter/fml/mapping.h"
6#include "flutter/fml/synchronization/count_down_latch.h"
7#include "flutter/fml/synchronization/waitable_event.h"
8#include "flutter/lib/ui/window/platform_message.h"
9#include "flutter/runtime/dart_isolate.h"
10#include "flutter/runtime/dart_vm.h"
11#include "flutter/runtime/dart_vm_lifecycle.h"
12#include "flutter/runtime/isolate_configuration.h"
13#include "flutter/runtime/platform_isolate_manager.h"
14#include "flutter/testing/dart_isolate_runner.h"
15#include "flutter/testing/fixture_test.h"
16#include "flutter/testing/testing.h"
17#include "third_party/dart/runtime/include/dart_api.h"
43 auto settings = CreateSettingsForFixture();
46 auto vm_data = vm_ref.GetVMData();
55 auto isolate_configuration =
62 vm_data->GetSettings(),
63 vm_data->GetIsolateSnapshot(),
72 std::move(isolate_configuration),
75 auto root_isolate = weak_isolate.lock();
76 ASSERT_TRUE(root_isolate);
78 ASSERT_TRUE(root_isolate->Shutdown());
83 auto settings = CreateSettingsForFixture();
86 auto vm_data = vm_ref.GetVMData();
94 auto isolate_configuration =
101 vm_data->GetSettings(),
102 vm_data->GetIsolateSnapshot(),
111 std::move(isolate_configuration),
114 auto root_isolate = weak_isolate.lock();
115 ASSERT_TRUE(root_isolate);
117 size_t destruction_callback_count = 0;
118 root_isolate->AddIsolateShutdownCallback([&destruction_callback_count]() {
120 destruction_callback_count++;
122 ASSERT_TRUE(root_isolate->Shutdown());
123 ASSERT_EQ(destruction_callback_count, 1u);
128 const auto settings = CreateSettingsForFixture();
138 ASSERT_TRUE(isolate);
144 const auto settings = CreateSettingsForFixture();
155 ASSERT_FALSE(isolate);
160 const auto settings = CreateSettingsForFixture();
171 ASSERT_TRUE(isolate);
173 ASSERT_TRUE(isolate->RunInIsolateScope([]() ->
bool {
174 if (tonic::CheckAndHandleError(::Dart_Invoke(
175 Dart_RootLibrary(), tonic::ToDart(
"sayHi"), 0, nullptr))) {
184 auto settings = CreateSettingsForFixture();
196 ASSERT_TRUE(isolate);
198 ASSERT_TRUE(isolate->RunInIsolateScope([
settings]() ->
bool {
199 Dart_Handle dart_ui = ::Dart_LookupLibrary(tonic::ToDart(
"dart:ui"));
200 if (tonic::CheckAndHandleError(dart_ui)) {
218 ASSERT_FALSE(DartVMRef::IsInstanceRunning());
219 auto settings = CreateSettingsForFixture();
231 ASSERT_TRUE(isolate);
232 ASSERT_EQ(isolate->get()->GetPhase(), DartIsolate::Phase::Running);
233 ASSERT_TRUE(isolate->RunInIsolateScope([
settings]() ->
bool {
234 Dart_Handle dart_ui = ::Dart_LookupLibrary(tonic::ToDart(
"dart:ui"));
235 if (tonic::CheckAndHandleError(dart_ui)) {
253 ASSERT_FALSE(DartVMRef::IsInstanceRunning());
257 const auto settings = CreateSettingsForFixture();
267 "canRegisterNativeCallback", {},
269 ASSERT_TRUE(isolate);
270 ASSERT_EQ(isolate->get()->GetPhase(), DartIsolate::Phase::Running);
289 return root_isolate_shutdown_latch_.IsSignaledForTest();
301 AddNativeCallback(
"NotifyNative",
309 ASSERT_EQ(
"Hello from code is secondary isolate.",
message);
312 auto settings = CreateSettingsForFixture();
313 settings.root_isolate_shutdown_callback = [
this]() {
314 RootIsolateShutdownSignal();
316 settings.isolate_shutdown_callback = [
this]() { ChildShutdownSignal(); };
326 "testCanLaunchSecondaryIsolate", {},
328 ASSERT_TRUE(isolate);
329 ASSERT_EQ(isolate->get()->GetPhase(), DartIsolate::Phase::Running);
331 ASSERT_FALSE(RootIsolateIsSignaled());
349 HandlesIsolateInitializationFailureCorrectly) {
350 AddNativeCallback(
"MakeNextIsolateSpawnFail",
354 AddNativeCallback(
"NotifyNative",
357 auto settings = CreateSettingsForFixture();
367 "testIsolateStartupFailure", {},
369 ASSERT_TRUE(isolate);
370 ASSERT_EQ(isolate->get()->GetPhase(), DartIsolate::Phase::Running);
375 AddNativeCallback(
"NotifyNative",
382 const auto settings = CreateSettingsForFixture();
392 "testCanReceiveArguments", {
"arg1"},
394 ASSERT_TRUE(isolate);
395 ASSERT_EQ(isolate->get()->GetPhase(), DartIsolate::Phase::Running);
401#if (FLUTTER_RUNTIME_MODE != FLUTTER_RUNTIME_MODE_DEBUG) && \
402 (FLUTTER_RUNTIME_MODE != FLUTTER_RUNTIME_MODE_PROFILE)
405 ASSERT_FALSE(DartVMRef::IsInstanceRunning());
407 auto settings = CreateSettingsForFixture();
410 settings.vm_service_host =
"127.0.0.1";
411 settings.enable_service_port_fallback =
true;
412 settings.service_isolate_create_callback = [&service_isolate_latch]() {
413 service_isolate_latch.
Signal();
417 auto vm_data = vm_ref.GetVMData();
418 ASSERT_TRUE(vm_data);
426 auto isolate_configuration =
427 IsolateConfiguration::InferFromSettings(
settings);
432 auto weak_isolate = DartIsolate::CreateRunningRootIsolate(
433 vm_data->GetSettings(),
434 vm_data->GetIsolateSnapshot(),
443 std::move(isolate_configuration),
447 auto root_isolate = weak_isolate.lock();
448 ASSERT_TRUE(root_isolate);
449 ASSERT_EQ(root_isolate->GetPhase(), DartIsolate::Phase::Running);
450 service_isolate_latch.
Wait();
451 ASSERT_TRUE(root_isolate->Shutdown());
455 RootIsolateCreateCallbackIsMadeOnceAndBeforeIsolateRunning) {
456 ASSERT_FALSE(DartVMRef::IsInstanceRunning());
457 auto settings = CreateSettingsForFixture();
458 size_t create_callback_count = 0u;
459 settings.root_isolate_create_callback =
460 [&create_callback_count](
const auto& isolate) {
461 ASSERT_EQ(isolate.GetPhase(), DartIsolate::Phase::Ready);
462 create_callback_count++;
475 ASSERT_TRUE(isolate);
476 ASSERT_EQ(isolate->get()->GetPhase(), DartIsolate::Phase::Running);
478 ASSERT_EQ(create_callback_count, 1u);
482 IsolateCreateCallbacksTakeInstanceSettingsInsteadOfVMSettings) {
483 ASSERT_FALSE(DartVMRef::IsInstanceRunning());
484 auto vm_settings = CreateSettingsForFixture();
486 auto instance_settings = vm_settings;
487 size_t create_callback_count = 0u;
488 instance_settings.root_isolate_create_callback =
489 [&create_callback_count](
const auto& isolate) {
490 ASSERT_EQ(isolate.GetPhase(), DartIsolate::Phase::Ready);
491 create_callback_count++;
503 ASSERT_TRUE(isolate);
504 ASSERT_EQ(isolate->get()->GetPhase(), DartIsolate::Phase::Running);
506 ASSERT_EQ(create_callback_count, 1u);
510 if (!DartVM::IsRunningPrecompiledCode()) {
511 FML_LOG(INFO) <<
"Split AOT does not work in JIT mode";
514 ASSERT_FALSE(DartVMRef::IsInstanceRunning());
515 auto settings = CreateSettingsForFixture();
518 auto vm_data = vm_ref.GetVMData();
519 ASSERT_TRUE(vm_data);
526 auto isolate_configuration =
527 IsolateConfiguration::InferFromSettings(
settings);
532 auto weak_isolate = DartIsolate::CreateRunningRootIsolate(
533 vm_data->GetSettings(),
534 vm_data->GetIsolateSnapshot(),
543 std::move(isolate_configuration),
547 auto root_isolate = weak_isolate.lock();
548 ASSERT_TRUE(root_isolate);
549 ASSERT_EQ(root_isolate->GetPhase(), DartIsolate::Phase::Running);
551 auto isolate_data = std::make_unique<const fml::NonOwnedMapping>(
552 split_aot_symbols_.vm_isolate_data, 0);
553 auto isolate_instructions = std::make_unique<const fml::NonOwnedMapping>(
554 split_aot_symbols_.vm_isolate_instrs, 0);
557 ASSERT_FALSE(root_isolate->LoadLoadingUnit(3, std::move(isolate_data),
558 std::move(isolate_instructions)));
559 ASSERT_TRUE(root_isolate->Shutdown());
563 ASSERT_FALSE(DartVMRef::IsInstanceRunning());
565 std::vector<std::string> messages;
577 const auto settings = CreateSettingsForFixture();
587 "mainForPluginRegistrantTest", {},
589 ASSERT_TRUE(isolate);
590 ASSERT_EQ(isolate->get()->GetPhase(), DartIsolate::Phase::Running);
592 ASSERT_EQ(messages.size(), 1u);
593 ASSERT_EQ(messages[0],
"_PluginRegistrant.register() was called");
597 ASSERT_FALSE(DartVMRef::IsInstanceRunning());
598 auto settings = CreateSettingsForFixture();
601 auto vm_data = vm_ref.GetVMData();
602 ASSERT_TRUE(vm_data);
610 size_t get_kernel_count = 0u;
611 if (!DartVM::IsRunningPrecompiledCode()) {
612 ASSERT_TRUE(
settings.application_kernels);
613 auto mappings =
settings.application_kernels();
614 ASSERT_EQ(mappings.size(), 1u);
621 mapping = std::move(mappings.front())]() mutable ->
Mappings {
623 EXPECT_EQ(get_kernel_count, 1u)
624 <<
"Unexpectedly got more than one call for the kernel mapping.";
625 EXPECT_TRUE(mapping);
626 std::vector<std::unique_ptr<const fml::Mapping>> kernel_mappings;
628 kernel_mappings.emplace_back(std::move(mapping));
630 return kernel_mappings;
634 std::shared_ptr<DartIsolate> root_isolate;
636 auto isolate_configuration =
637 IsolateConfiguration::InferFromSettings(
settings);
640 context.advisory_script_uri =
"main.dart";
641 context.advisory_script_entrypoint =
"main";
642 auto weak_isolate = DartIsolate::CreateRunningRootIsolate(
643 vm_data->GetSettings(),
644 vm_data->GetIsolateSnapshot(),
653 std::move(isolate_configuration),
655 root_isolate = weak_isolate.lock();
657 ASSERT_TRUE(root_isolate);
658 ASSERT_EQ(root_isolate->GetPhase(), DartIsolate::Phase::Running);
659 if (!DartVM::IsRunningPrecompiledCode()) {
660 ASSERT_EQ(get_kernel_count, 1u);
664 auto isolate_configuration = IsolateConfiguration::InferFromSettings(
668 IsolateLaunchType::kExistingGroup);
670 UIDartState::Context context(task_runners);
671 context.advisory_script_uri =
"main.dart";
672 context.advisory_script_entrypoint =
"main";
673 auto weak_isolate = DartIsolate::CreateRunningRootIsolate(
674 vm_data->GetSettings(),
675 vm_data->GetIsolateSnapshot(),
684 std::move(isolate_configuration),
687 auto spawned_isolate = weak_isolate.lock();
688 ASSERT_TRUE(spawned_isolate);
689 ASSERT_EQ(spawned_isolate->GetPhase(), DartIsolate::Phase::Running);
690 if (!DartVM::IsRunningPrecompiledCode()) {
691 ASSERT_EQ(get_kernel_count, 1u);
693 ASSERT_TRUE(spawned_isolate->Shutdown());
696 ASSERT_TRUE(root_isolate->Shutdown());
701 std::shared_ptr<PlatformIsolateManager> mgr =
713 double height)
override {}
716 std::unique_ptr<PlatformMessage>
message)
override {}
723 int64_t isolate_port)
override {}
729 const std::vector<std::string>& supported_locale_data)
override {
735 int configuration_id)
const override {
747 ASSERT_EQ(
"Platform isolate is ready",
message);
752 auto platform_configuration =
753 std::make_unique<PlatformConfiguration>(&client);
757 ASSERT_FALSE(DartVMRef::IsInstanceRunning());
758 auto settings = CreateSettingsForFixture();
761 auto vm_data = vm_ref.GetVMData();
762 ASSERT_TRUE(vm_data);
775 std::move(platform_configuration));
776 ASSERT_TRUE(isolate);
777 auto root_isolate = isolate->get();
778 ASSERT_EQ(root_isolate->GetPhase(), DartIsolate::Phase::Running);
780 client.mgr->IsRegisteredForTestingOnly(root_isolate->isolate()));
787 platform_thread_latch.
Wait();
794 isolate->RunInIsolateScope([root_isolate, &platform_isolate]() {
795 Dart_Handle lib = Dart_RootLibrary();
796 Dart_Handle entry_point = Dart_GetField(
797 lib, tonic::ToDart(
"mainForPlatformIsolates"));
798 char* error = nullptr;
800 root_isolate->CreatePlatformIsolate(entry_point, &error);
803 EXPECT_TRUE(platform_isolate);
804 EXPECT_EQ(Dart_CurrentIsolate(), root_isolate->isolate());
810 ui_thread_latch.
Wait();
811 ASSERT_TRUE(platform_isolate);
812 EXPECT_TRUE(client.mgr->IsRegisteredForTestingOnly(platform_isolate));
815 platform_thread_latch.
Signal();
818 message_latch.
Wait();
822 EXPECT_FALSE(client.mgr->IsRegisteredForTestingOnly(platform_isolate));
827 auto platform_configuration =
828 std::make_unique<PlatformConfiguration>(&client);
830 ASSERT_FALSE(DartVMRef::IsInstanceRunning());
831 auto settings = CreateSettingsForFixture();
834 auto vm_data = vm_ref.GetVMData();
835 ASSERT_TRUE(vm_data);
848 std::move(platform_configuration));
849 ASSERT_TRUE(isolate);
850 auto root_isolate = isolate->get();
851 ASSERT_EQ(root_isolate->GetPhase(), DartIsolate::Phase::Running);
852 EXPECT_FALSE(client.
mgr->IsRegisteredForTestingOnly(root_isolate->isolate()));
859 isolate->RunInIsolateScope([root_isolate, &platform_isolate]() {
860 Dart_Handle lib = Dart_RootLibrary();
861 Dart_Handle entry_point =
862 Dart_GetField(lib, tonic::ToDart(
"emptyMain"));
863 char* error = nullptr;
865 root_isolate->CreatePlatformIsolate(entry_point, &error);
868 EXPECT_TRUE(platform_isolate);
869 EXPECT_EQ(Dart_CurrentIsolate(), root_isolate->isolate());
876 ui_thread_latch.
Wait();
877 ASSERT_TRUE(platform_isolate);
878 EXPECT_TRUE(client.
mgr->IsRegisteredForTestingOnly(platform_isolate));
887 platform_thread_latch.
Signal();
889 platform_thread_latch.
Wait();
892 EXPECT_FALSE(client.
mgr->IsRegisteredForTestingOnly(platform_isolate));
904 ASSERT_EQ(
"Platform isolate received: Hello from root isolate!",
910 auto platform_configuration =
911 std::make_unique<PlatformConfiguration>(&client);
913 ASSERT_FALSE(DartVMRef::IsInstanceRunning());
914 auto settings = CreateSettingsForFixture();
917 auto vm_data = vm_ref.GetVMData();
918 ASSERT_TRUE(vm_data);
931 std::move(platform_configuration));
932 ASSERT_TRUE(isolate);
933 auto root_isolate = isolate->get();
934 ASSERT_EQ(root_isolate->GetPhase(), DartIsolate::Phase::Running);
940 ASSERT_TRUE(isolate->RunInIsolateScope([root_isolate,
941 &platform_isolate]() {
942 Dart_Handle lib = Dart_RootLibrary();
943 Dart_Handle entry_point = Dart_Invoke(
944 lib, tonic::ToDart(
"createEntryPointForPlatIsoSendAndRecvTest"),
946 char* error = nullptr;
948 root_isolate->CreatePlatformIsolate(entry_point, &error);
954 ui_thread_latch.
Wait();
957 message_latch.
Wait();
966 epilogue_latch.
Wait();
972 AddNativeCallback(
"PassMessage",
977 auto platform_configuration =
978 std::make_unique<PlatformConfiguration>(&client);
980 ASSERT_FALSE(DartVMRef::IsInstanceRunning());
981 auto settings = CreateSettingsForFixture();
984 auto vm_data = vm_ref.GetVMData();
985 ASSERT_TRUE(vm_data);
998 std::move(platform_configuration));
999 ASSERT_TRUE(isolate);
1000 auto root_isolate = isolate->get();
1001 ASSERT_EQ(root_isolate->GetPhase(), DartIsolate::Phase::Running);
1008 client.mgr->ShutdownPlatformIsolates();
1009 manager_shutdown_latch.
Signal();
1011 manager_shutdown_latch.
Wait();
1016 ASSERT_TRUE(isolate->RunInIsolateScope([root_isolate]() {
1017 Dart_Handle lib = Dart_RootLibrary();
1018 Dart_Handle entry_point =
1019 Dart_GetField(lib, tonic::ToDart(
"mainForPlatformIsolates"));
1020 char* error = nullptr;
1021 Dart_Isolate platform_isolate =
1022 root_isolate->CreatePlatformIsolate(entry_point, &error);
1026 EXPECT_FALSE(error);
1027 EXPECT_FALSE(platform_isolate);
1028 EXPECT_EQ(Dart_CurrentIsolate(), root_isolate->isolate());
1032 ui_thread_latch.
Signal();
1034 ui_thread_latch.
Wait();
1040 AddNativeCallback(
"PassMessage",
1045 auto platform_configuration =
1046 std::make_unique<PlatformConfiguration>(&client);
1048 ASSERT_FALSE(DartVMRef::IsInstanceRunning());
1049 auto settings = CreateSettingsForFixture();
1051 ASSERT_TRUE(vm_ref);
1052 auto vm_data = vm_ref.GetVMData();
1053 ASSERT_TRUE(vm_data);
1066 std::move(platform_configuration));
1067 ASSERT_TRUE(isolate);
1068 auto root_isolate = isolate->get();
1069 ASSERT_EQ(root_isolate->GetPhase(), DartIsolate::Phase::Running);
1079 &platform_isolate]()
mutable {
1080 platform_thread_latch.
Wait();
1081 client.mgr->ShutdownPlatformIsolates();
1083 EXPECT_FALSE(client.mgr->IsRegisteredForTestingOnly(platform_isolate));
1090 isolate->RunInIsolateScope([root_isolate, &platform_isolate]() {
1091 Dart_Handle lib = Dart_RootLibrary();
1092 Dart_Handle entry_point =
1093 Dart_GetField(lib, tonic::ToDart(
"mainForPlatformIsolates"));
1094 char* error = nullptr;
1096 root_isolate->CreatePlatformIsolate(entry_point, &error);
1098 EXPECT_FALSE(error);
1099 EXPECT_TRUE(platform_isolate);
1100 EXPECT_EQ(Dart_CurrentIsolate(), root_isolate->isolate());
1104 ui_thread_latch.
Signal();
1106 ui_thread_latch.
Wait();
1107 ASSERT_TRUE(platform_isolate);
1108 EXPECT_TRUE(client.mgr->IsRegisteredForTestingOnly(platform_isolate));
1111 platform_thread_latch.
Signal();
1120 epilogue_latch.
Wait();
1126 AddNativeCallback(
"PassMessage",
1131 auto platform_configuration =
1132 std::make_unique<PlatformConfiguration>(&client);
1134 ASSERT_FALSE(DartVMRef::IsInstanceRunning());
1135 auto settings = CreateSettingsForFixture();
1137 ASSERT_TRUE(vm_ref);
1138 auto vm_data = vm_ref.GetVMData();
1139 ASSERT_TRUE(vm_data);
1152 std::move(platform_configuration));
1153 ASSERT_TRUE(isolate);
1154 auto root_isolate = isolate->get();
1155 ASSERT_EQ(root_isolate->GetPhase(), DartIsolate::Phase::Running);
1162 isolate->RunInIsolateScope([root_isolate, &platform_isolate]() {
1163 Dart_Handle lib = Dart_RootLibrary();
1164 Dart_Handle entry_point = Dart_GetField(
1165 lib, tonic::ToDart(
"mainForPlatformIsolatesThrowError"));
1166 char* error = nullptr;
1168 root_isolate->CreatePlatformIsolate(entry_point, &error);
1170 EXPECT_FALSE(error);
1171 EXPECT_TRUE(platform_isolate);
1172 EXPECT_EQ(Dart_CurrentIsolate(), root_isolate->isolate());
1176 ui_thread_latch.
Signal();
1178 ui_thread_latch.
Wait();
1179 ASSERT_TRUE(platform_isolate);
1180 EXPECT_TRUE(client.mgr->IsRegisteredForTestingOnly(platform_isolate));
1189 epilogue_latch.
Wait();
static sk_sp< Effect > Create()
static std::weak_ptr< DartIsolate > CreateRunningRootIsolate(const Settings &settings, const fml::RefPtr< const DartSnapshot > &isolate_snapshot, std::unique_ptr< PlatformConfiguration > platform_configuration, Flags flags, const fml::closure &root_isolate_create_callback, const fml::closure &isolate_create_callback, const fml::closure &isolate_shutdown_callback, std::optional< std::string > dart_entrypoint, std::optional< std::string > dart_entrypoint_library, const std::vector< std::string > &dart_entrypoint_args, std::unique_ptr< IsolateConfiguration > isolate_configuration, const UIDartState::Context &context, const DartIsolate *spawning_isolate=nullptr)
Creates an instance of a root isolate and returns a weak pointer to the same. The isolate instance ma...
static DartVMRef Create(const Settings &settings, fml::RefPtr< const DartSnapshot > vm_snapshot=nullptr, fml::RefPtr< const DartSnapshot > isolate_snapshot=nullptr)
static bool IsInstanceRunning()
static std::unique_ptr< IsolateConfiguration > InferFromSettings(const Settings &settings, const std::shared_ptr< AssetManager > &asset_manager=nullptr, const fml::RefPtr< fml::TaskRunner > &io_worker=nullptr, IsolateLaunchType launch_type=IsolateLaunchType::kNewGroup)
Attempts to infer the isolate configuration from the Settings object. If the VM is configured for AOT...
DartSecondaryIsolateTest()
bool RootIsolateIsSignaled()
void RootIsolateShutdownSignal()
void ChildShutdownSignal()
Tests error handling path of Isolate.spawn() in the engine.
IsolateStartupFailureTest()
static void RunNowOrPostTask(const fml::RefPtr< fml::TaskRunner > &runner, const fml::closure &task)
DART_EXPORT void Dart_ShutdownIsolate(void)
struct _Dart_Handle * Dart_Handle
struct _Dart_Isolate * Dart_Isolate
DART_EXPORT Dart_Handle Dart_GetNativeArgument(Dart_NativeArguments args, int index)
struct _Dart_NativeArguments * Dart_NativeArguments
DART_EXPORT Dart_Isolate Dart_CurrentIsolate(void)
DART_EXPORT Dart_Handle Dart_Null(void)
DART_EXPORT DART_WARN_UNUSED_RESULT Dart_Handle Dart_GetField(Dart_Handle container, Dart_Handle name)
DART_EXPORT void Dart_EnterIsolate(Dart_Isolate isolate)
DART_EXPORT Dart_Handle Dart_BooleanValue(Dart_Handle boolean_obj, bool *value)
DART_EXPORT Dart_Handle Dart_SetRootLibrary(Dart_Handle library)
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
#define FML_LOG(severity)
#define FML_UNREACHABLE()
#define FML_DISALLOW_COPY_AND_ASSIGN(TypeName)
fml::RefPtr< fml::TaskRunner > CreateNewThread(const std::string &name)
fml::RefPtr< fml::TaskRunner > GetCurrentTaskRunner()
std::string GetCurrentTestName()
Gets the name of the currently running test. This is useful in generating logs or assets based on tes...
TEST_F(DisplayListTest, Defaults)
std::string GetDefaultKernelFilePath()
Returns the default path to kernel_blob.bin. This file is within the directory returned by GetFixture...
TEST_F(DartIsolateTest, PlatformIsolateMainThrowsError)
std::unique_ptr< AutoIsolateShutdown > RunDartCodeInIsolate(DartVMRef &vm_ref, const Settings &settings, const TaskRunners &task_runners, std::string entrypoint, const std::vector< std::string > &args, const std::string &kernel_file_path, fml::WeakPtr< IOManager > io_manager, std::shared_ptr< VolatilePathTracker > volatile_path_tracker, std::unique_ptr< PlatformConfiguration > platform_configuration)
DEF_SWITCHES_START aot vmservice shared library name
std::vector< std::unique_ptr< const fml::Mapping > > Mappings
TEST_F(EngineAnimatorTest, AnimatorAcceptsMultipleRenders)
internal::CopyableLambda< T > MakeCopyable(T lambda)
Dart_Handle ToDart(const T &object)
bool CheckAndHandleError(Dart_Handle handle)
The subset of state which is owned by the shell or engine and passed through the RuntimeController in...
std::string advisory_script_uri
std::string advisory_script_entrypoint
#define CREATE_NATIVE_ENTRY(native_entry)
#define EXPECT_TRUE(handle)