embedder_config_builder.cc 4.1 KB
Newer Older
1 2 3 4 5 6
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "flutter/shell/platform/embedder/tests/embedder_config_builder.h"

7
namespace flutter {
8 9
namespace testing {

10 11 12 13
EmbedderConfigBuilder::EmbedderConfigBuilder(
    EmbedderContext& context,
    InitializationPreference preference)
    : context_(context) {
14 15
  project_args_.struct_size = sizeof(project_args_);
  software_renderer_config_.struct_size = sizeof(FlutterSoftwareRendererConfig);
16
  custom_task_runners_.struct_size = sizeof(FlutterCustomTaskRunners);
17 18
  software_renderer_config_.surface_present_callback =
      [](void*, const void*, size_t, size_t) { return true; };
19 20 21 22 23 24

  if (preference == InitializationPreference::kInitialize) {
    SetSoftwareRendererConfig();
    SetAssetsPath();
    SetSnapshots();
    SetIsolateCreateCallbackHook();
25
    SetSemanticsCallbackHooks();
26
  }
27 28 29 30 31 32 33 34 35
}

EmbedderConfigBuilder::~EmbedderConfigBuilder() = default;

void EmbedderConfigBuilder::SetSoftwareRendererConfig() {
  renderer_config_.type = FlutterRendererType::kSoftware;
  renderer_config_.software = software_renderer_config_;
}

36 37
void EmbedderConfigBuilder::SetAssetsPath() {
  project_args_.assets_path = context_.GetAssetsPath().c_str();
38 39
}

40 41
void EmbedderConfigBuilder::SetSnapshots() {
  if (auto mapping = context_.GetVMSnapshotData()) {
42 43 44 45
    project_args_.vm_snapshot_data = mapping->GetMapping();
    project_args_.vm_snapshot_data_size = mapping->GetSize();
  }

46
  if (auto mapping = context_.GetVMSnapshotInstructions()) {
47 48 49 50
    project_args_.vm_snapshot_instructions = mapping->GetMapping();
    project_args_.vm_snapshot_instructions_size = mapping->GetSize();
  }

51
  if (auto mapping = context_.GetIsolateSnapshotData()) {
52 53 54 55
    project_args_.isolate_snapshot_data = mapping->GetMapping();
    project_args_.isolate_snapshot_data_size = mapping->GetSize();
  }

56
  if (auto mapping = context_.GetIsolateSnapshotInstructions()) {
57 58 59 60 61
    project_args_.isolate_snapshot_instructions = mapping->GetMapping();
    project_args_.isolate_snapshot_instructions_size = mapping->GetSize();
  }
}

62 63 64 65 66
void EmbedderConfigBuilder::SetIsolateCreateCallbackHook() {
  project_args_.root_isolate_create_callback =
      EmbedderContext::GetIsolateCreateCallbackHook();
}

67 68 69 70 71 72 73
void EmbedderConfigBuilder::SetSemanticsCallbackHooks() {
  project_args_.update_semantics_node_callback =
      EmbedderContext::GetUpdateSemanticsNodeCallbackHook();
  project_args_.update_semantics_custom_action_callback =
      EmbedderContext::GetUpdateSemanticsCustomActionCallbackHook();
}

74 75 76 77 78 79 80 81 82
void EmbedderConfigBuilder::SetDartEntrypoint(std::string entrypoint) {
  if (entrypoint.size() == 0) {
    return;
  }

  dart_entrypoint_ = std::move(entrypoint);
  project_args_.custom_dart_entrypoint = dart_entrypoint_.c_str();
}

83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
void EmbedderConfigBuilder::AddCommandLineArgument(std::string arg) {
  if (arg.size() == 0) {
    return;
  }

  command_line_arguments_.emplace_back(std::move(arg));
}

void EmbedderConfigBuilder::SetPlatformTaskRunner(
    const FlutterTaskRunnerDescription* runner) {
  if (runner == nullptr) {
    return;
  }
  custom_task_runners_.platform_task_runner = runner;
  project_args_.custom_task_runners = &custom_task_runners_;
}

UniqueEngine EmbedderConfigBuilder::LaunchEngine() {
101
  FlutterEngine engine = nullptr;
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119

  std::vector<const char*> args;
  args.reserve(command_line_arguments_.size());

  for (const auto& arg : command_line_arguments_) {
    args.push_back(arg.c_str());
  }

  if (args.size() > 0) {
    project_args_.command_line_argv = args.data();
    project_args_.command_line_argc = args.size();
  } else {
    // Clear it out in case this is not the first engine launch from the
    // embedder config builder.
    project_args_.command_line_argv = nullptr;
    project_args_.command_line_argc = 0;
  }

120
  auto result = FlutterEngineRun(FLUTTER_ENGINE_VERSION, &renderer_config_,
121
                                 &project_args_, &context_, &engine);
122 123 124 125 126 127 128 129 130

  if (result != kSuccess) {
    return {};
  }

  return UniqueEngine{engine};
}

}  // namespace testing
131
}  // namespace flutter