blob: 35376e241f062ea5b0fa83611c81db87eacd611e [file] [log] [blame]
// 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/windows/testing/windows_test_config_builder.h"
#include <combaseapi.h>
#include <string>
#include <string_view>
#include <vector>
#include "flutter/fml/logging.h"
#include "flutter/shell/platform/windows/flutter_windows_engine.h"
#include "flutter/shell/platform/windows/public/flutter_windows.h"
#include "flutter/shell/platform/windows/testing/windows_test_context.h"
namespace flutter {
namespace testing {
WindowsConfigBuilder::WindowsConfigBuilder(WindowsTestContext& context)
: context_(context) {}
WindowsConfigBuilder::~WindowsConfigBuilder() = default;
void WindowsConfigBuilder::SetDartEntrypoint(std::string_view entrypoint) {
if (entrypoint.empty()) {
return;
}
dart_entrypoint_ = entrypoint;
}
void WindowsConfigBuilder::AddDartEntrypointArgument(std::string_view arg) {
if (arg.empty()) {
return;
}
dart_entrypoint_arguments_.emplace_back(std::move(arg));
}
FlutterDesktopEngineProperties WindowsConfigBuilder::GetEngineProperties()
const {
FlutterDesktopEngineProperties engine_properties = {};
engine_properties.assets_path = context_.GetAssetsPath().c_str();
engine_properties.icu_data_path = context_.GetIcuDataPath().c_str();
// Set Dart entrypoint.
engine_properties.dart_entrypoint = dart_entrypoint_.c_str();
// Set Dart entrypoint argc, argv.
std::vector<const char*> dart_args;
dart_args.reserve(dart_entrypoint_arguments_.size());
for (const auto& arg : dart_entrypoint_arguments_) {
dart_args.push_back(arg.c_str());
}
if (!dart_args.empty()) {
engine_properties.dart_entrypoint_argv = dart_args.data();
engine_properties.dart_entrypoint_argc = dart_args.size();
} else {
// Clear this out in case this is not the first engine launch from the
// embedder config builder.
engine_properties.dart_entrypoint_argv = nullptr;
engine_properties.dart_entrypoint_argc = 0;
}
return engine_properties;
}
EnginePtr WindowsConfigBuilder::InitializeEngine() const {
FlutterDesktopEngineProperties engine_properties = GetEngineProperties();
return EnginePtr(FlutterDesktopEngineCreate(&engine_properties));
}
ViewControllerPtr WindowsConfigBuilder::Run() const {
InitializeCOM();
EnginePtr engine = InitializeEngine();
if (!engine) {
return {};
}
// Register native functions.
FlutterWindowsEngine* windows_engine =
reinterpret_cast<FlutterWindowsEngine*>(engine.get());
windows_engine->SetRootIsolateCreateCallback(
context_.GetRootIsolateCallback());
int width = 600;
int height = 400;
ViewControllerPtr controller(
FlutterDesktopViewControllerCreate(width, height, engine.release()));
if (!controller) {
return {};
}
return controller;
}
void WindowsConfigBuilder::InitializeCOM() const {
FML_CHECK(SUCCEEDED(::CoInitializeEx(nullptr, COINIT_MULTITHREADED)));
}
} // namespace testing
} // namespace flutter