Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 11d756a

Browse files
author
George Wright
authored
Add dart_entrypoint_argc/argv to the FlutterProjectArgs (#21737)
1 parent ec1d111 commit 11d756a

File tree

6 files changed

+89
-0
lines changed

6 files changed

+89
-0
lines changed

shell/platform/embedder/embedder.cc

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1126,6 +1126,20 @@ FlutterEngineResult FlutterEngineInitialize(size_t version,
11261126
}
11271127
}
11281128

1129+
if (SAFE_ACCESS(args, dart_entrypoint_argc, 0) > 0) {
1130+
if (SAFE_ACCESS(args, dart_entrypoint_argv, nullptr) == nullptr) {
1131+
return LOG_EMBEDDER_ERROR(kInvalidArguments,
1132+
"Could not determine Dart entrypoint arguments "
1133+
"as dart_entrypoint_argc "
1134+
"was set, but dart_entrypoint_argv was null.");
1135+
}
1136+
std::vector<std::string> arguments(args->dart_entrypoint_argc);
1137+
for (int i = 0; i < args->dart_entrypoint_argc; ++i) {
1138+
arguments[i] = std::string{args->dart_entrypoint_argv[i]};
1139+
}
1140+
settings.dart_entrypoint_args = std::move(arguments);
1141+
}
1142+
11291143
if (!run_configuration.IsValid()) {
11301144
return LOG_EMBEDDER_ERROR(
11311145
kInvalidArguments,

shell/platform/embedder/embedder.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1368,6 +1368,19 @@ typedef struct {
13681368
/// matches what the platform would natively resolve to as possible.
13691369
FlutterComputePlatformResolvedLocaleCallback
13701370
compute_platform_resolved_locale_callback;
1371+
1372+
/// The command line argument count for arguments passed through to the Dart
1373+
/// entrypoint.
1374+
int dart_entrypoint_argc;
1375+
1376+
/// The command line arguments passed through to the Dart entrypoint. The
1377+
/// strings must be `NULL` terminated.
1378+
///
1379+
/// The strings will be copied out and so any strings passed in here can
1380+
/// be safely collected after initializing the engine with
1381+
/// `FlutterProjectArgs`.
1382+
const char* const* dart_entrypoint_argv;
1383+
13711384
} FlutterProjectArgs;
13721385

13731386
//------------------------------------------------------------------------------

shell/platform/embedder/fixtures/main.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -733,3 +733,10 @@ void render_targets_are_recycled() {
733733
};
734734
window.scheduleFrame();
735735
}
736+
737+
void nativeArgumentsCallback(List<String> args) native 'NativeArgumentsCallback';
738+
739+
@pragma('vm:entry-point')
740+
void dart_entrypoint_args(List<String> args) {
741+
nativeArgumentsCallback(args);
742+
}

shell/platform/embedder/tests/embedder_config_builder.cc

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,14 @@ void EmbedderConfigBuilder::AddCommandLineArgument(std::string arg) {
217217
command_line_arguments_.emplace_back(std::move(arg));
218218
}
219219

220+
void EmbedderConfigBuilder::AddDartEntrypointArgument(std::string arg) {
221+
if (arg.size() == 0) {
222+
return;
223+
}
224+
225+
dart_entrypoint_arguments_.emplace_back(std::move(arg));
226+
}
227+
220228
void EmbedderConfigBuilder::SetPlatformTaskRunner(
221229
const FlutterTaskRunnerDescription* runner) {
222230
if (runner == nullptr) {
@@ -317,6 +325,23 @@ UniqueEngine EmbedderConfigBuilder::SetupEngine(bool run) const {
317325
project_args.command_line_argc = 0;
318326
}
319327

328+
std::vector<const char*> dart_args;
329+
dart_args.reserve(dart_entrypoint_arguments_.size());
330+
331+
for (const auto& arg : dart_entrypoint_arguments_) {
332+
dart_args.push_back(arg.c_str());
333+
}
334+
335+
if (dart_args.size() > 0) {
336+
project_args.dart_entrypoint_argv = dart_args.data();
337+
project_args.dart_entrypoint_argc = dart_args.size();
338+
} else {
339+
// Clear it out in case this is not the first engine launch from the
340+
// embedder config builder.
341+
project_args.dart_entrypoint_argv = nullptr;
342+
project_args.dart_entrypoint_argc = 0;
343+
}
344+
320345
auto result =
321346
run ? FlutterEngineRun(FLUTTER_ENGINE_VERSION, &renderer_config_,
322347
&project_args, &context_, &engine)

shell/platform/embedder/tests/embedder_config_builder.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ class EmbedderConfigBuilder {
7676

7777
void AddCommandLineArgument(std::string arg);
7878

79+
void AddDartEntrypointArgument(std::string arg);
80+
7981
void SetPlatformTaskRunner(const FlutterTaskRunnerDescription* runner);
8082

8183
void SetRenderTaskRunner(const FlutterTaskRunnerDescription* runner);
@@ -106,6 +108,7 @@ class EmbedderConfigBuilder {
106108
FlutterCustomTaskRunners custom_task_runners_ = {};
107109
FlutterCompositor compositor_ = {};
108110
std::vector<std::string> command_line_arguments_;
111+
std::vector<std::string> dart_entrypoint_arguments_;
109112

110113
UniqueEngine SetupEngine(bool run) const;
111114

shell/platform/embedder/tests/embedder_unittests.cc

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,33 @@ TEST_F(EmbedderTest, VMShutsDownWhenNoEnginesInProcess) {
473473
}
474474
}
475475

476+
//------------------------------------------------------------------------------
477+
///
478+
TEST_F(EmbedderTest, DartEntrypointArgs) {
479+
auto& context = GetEmbedderContext(ContextType::kSoftwareContext);
480+
EmbedderConfigBuilder builder(context);
481+
builder.SetSoftwareRendererConfig();
482+
builder.AddDartEntrypointArgument("foo");
483+
builder.AddDartEntrypointArgument("bar");
484+
builder.SetDartEntrypoint("dart_entrypoint_args");
485+
fml::AutoResetWaitableEvent callback_latch;
486+
std::vector<std::string> callback_args;
487+
auto nativeArgumentsCallback = [&callback_args,
488+
&callback_latch](Dart_NativeArguments args) {
489+
Dart_Handle exception = nullptr;
490+
callback_args =
491+
tonic::DartConverter<std::vector<std::string>>::FromArguments(
492+
args, 0, exception);
493+
callback_latch.Signal();
494+
};
495+
context.AddNativeCallback("NativeArgumentsCallback",
496+
CREATE_NATIVE_ENTRY(nativeArgumentsCallback));
497+
auto engine = builder.LaunchEngine();
498+
callback_latch.Wait();
499+
ASSERT_EQ(callback_args[0], "foo");
500+
ASSERT_EQ(callback_args[1], "bar");
501+
}
502+
476503
//------------------------------------------------------------------------------
477504
/// These snapshots may be materialized from symbols and the size field may not
478505
/// be relevant. Since this information is redundant, engine launch should not

0 commit comments

Comments
 (0)