blob: 025e4917ac48358ca235bc179ef1801989fc9298 [file] [log] [blame]
// Copyright 2015 The Chromium 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/runtime/runtime_controller.h"
#include "flutter/glue/trace_event.h"
#include "flutter/lib/ui/compositing/scene.h"
#include "flutter/lib/ui/ui_dart_state.h"
#include "flutter/lib/ui/window/window.h"
#include "flutter/runtime/dart_controller.h"
#include "flutter/runtime/runtime_delegate.h"
#include "lib/tonic/dart_message_handler.h"
using tonic::DartState;
namespace blink {
std::unique_ptr<RuntimeController> RuntimeController::Create(
RuntimeDelegate* client) {
return std::unique_ptr<RuntimeController>(new RuntimeController(client));
}
RuntimeController::RuntimeController(RuntimeDelegate* client)
: client_(client) {}
RuntimeController::~RuntimeController() {}
void RuntimeController::CreateDartController(
const std::string& script_uri,
const uint8_t* isolate_snapshot_data,
const uint8_t* isolate_snapshot_instr) {
FXL_DCHECK(!dart_controller_);
dart_controller_.reset(new DartController());
dart_controller_->CreateIsolateFor(
script_uri, isolate_snapshot_data, isolate_snapshot_instr,
std::make_unique<UIDartState>(this, std::make_unique<Window>(this)));
UIDartState* dart_state = dart_controller_->dart_state();
DartState::Scope scope(dart_state);
dart_state->window()->DidCreateIsolate();
client_->DidCreateMainIsolate(dart_state->isolate());
Window* window = GetWindow();
window->UpdateLocale(language_code_, country_code_);
if (semantics_enabled_)
window->UpdateSemanticsEnabled(semantics_enabled_);
}
void RuntimeController::SetViewportMetrics(const ViewportMetrics& metrics) {
GetWindow()->UpdateWindowMetrics(metrics);
}
void RuntimeController::SetLocale(const std::string& language_code,
const std::string& country_code) {
if (language_code_ == language_code && country_code_ == country_code)
return;
language_code_ = language_code;
country_code_ = country_code;
GetWindow()->UpdateLocale(language_code_, country_code_);
}
void RuntimeController::SetUserSettingsData(const std::string& data) {
if (user_settings_data_ == data)
return;
user_settings_data_ = data;
GetWindow()->UpdateUserSettingsData(user_settings_data_);
}
void RuntimeController::SetSemanticsEnabled(bool enabled) {
if (semantics_enabled_ == enabled)
return;
semantics_enabled_ = enabled;
GetWindow()->UpdateSemanticsEnabled(semantics_enabled_);
}
void RuntimeController::BeginFrame(fxl::TimePoint frame_time) {
GetWindow()->BeginFrame(frame_time);
}
void RuntimeController::NotifyIdle(int64_t deadline) {
UIDartState* dart_state = dart_controller_->dart_state();
if (!dart_state) {
return;
}
DartState::Scope scope(dart_state);
Dart_NotifyIdle(deadline);
}
void RuntimeController::DispatchPlatformMessage(
fxl::RefPtr<PlatformMessage> message) {
TRACE_EVENT1("flutter", "RuntimeController::DispatchPlatformMessage", "mode",
"basic");
GetWindow()->DispatchPlatformMessage(std::move(message));
}
void RuntimeController::DispatchPointerDataPacket(
const PointerDataPacket& packet) {
TRACE_EVENT1("flutter", "RuntimeController::DispatchPointerDataPacket",
"mode", "basic");
GetWindow()->DispatchPointerDataPacket(packet);
}
void RuntimeController::DispatchSemanticsAction(int32_t id,
SemanticsAction action,
std::vector<uint8_t> args) {
TRACE_EVENT1("flutter", "RuntimeController::DispatchSemanticsAction", "mode",
"basic");
GetWindow()->DispatchSemanticsAction(id, action, std::move(args));
}
Window* RuntimeController::GetWindow() {
return dart_controller_->dart_state()->window();
}
std::string RuntimeController::DefaultRouteName() {
return client_->DefaultRouteName();
}
void RuntimeController::ScheduleFrame() {
client_->ScheduleFrame();
}
void RuntimeController::Render(Scene* scene) {
client_->Render(scene->takeLayerTree());
}
void RuntimeController::UpdateSemantics(SemanticsUpdate* update) {
if (semantics_enabled_)
client_->UpdateSemantics(update->takeNodes());
}
void RuntimeController::HandlePlatformMessage(
fxl::RefPtr<PlatformMessage> message) {
client_->HandlePlatformMessage(std::move(message));
}
void RuntimeController::DidCreateSecondaryIsolate(Dart_Isolate isolate) {
client_->DidCreateSecondaryIsolate(isolate);
}
void RuntimeController::DidShutdownMainIsolate() {
client_->DidShutdownMainIsolate();
}
Dart_Port RuntimeController::GetMainPort() {
if (!dart_controller_) {
return ILLEGAL_PORT;
}
if (!dart_controller_->dart_state()) {
return ILLEGAL_PORT;
}
return dart_controller_->dart_state()->main_port();
}
std::string RuntimeController::GetIsolateName() {
if (!dart_controller_) {
return "";
}
if (!dart_controller_->dart_state()) {
return "";
}
return dart_controller_->dart_state()->debug_name();
}
bool RuntimeController::HasLivePorts() {
if (!dart_controller_) {
return false;
}
UIDartState* dart_state = dart_controller_->dart_state();
if (!dart_state) {
return false;
}
DartState::Scope scope(dart_state);
return Dart_HasLivePorts();
}
tonic::DartErrorHandleType RuntimeController::GetLastError() {
if (!dart_controller_) {
return tonic::kNoError;
}
UIDartState* dart_state = dart_controller_->dart_state();
if (!dart_state) {
return tonic::kNoError;
}
return dart_state->message_handler().isolate_last_error();
}
} // namespace blink