// Copyright 2016 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/content_handler/application_controller_impl.h" #include #include "application/lib/app/connect.h" #include "flutter/content_handler/app.h" #include "flutter/content_handler/runtime_holder.h" #include "lib/ftl/logging.h" #include "lib/mtl/vmo/vector.h" namespace flutter_runner { ApplicationControllerImpl::ApplicationControllerImpl( App* app, app::ApplicationPackagePtr application, app::ApplicationStartupInfoPtr startup_info, fidl::InterfaceRequest controller) : app_(app), binding_(this) { if (controller.is_pending()) { binding_.Bind(std::move(controller)); binding_.set_connection_error_handler([this] { app_->Destroy(this); // |this| has been deleted at this point. }); } std::vector bundle; if (!mtl::VectorFromVmo(std::move(application->data), &bundle)) { FTL_LOG(ERROR) << "Failed to receive bundle."; return; } // TODO(jeffbrown): Decide what to do with command-line arguments and // startup handles. if (startup_info->launch_info->services) { service_provider_bridge_.AddBinding( std::move(startup_info->launch_info->services)); } if (startup_info->launch_info->service_request.is_valid()) { service_provider_bridge_.ServeDirectory( std::move(startup_info->launch_info->service_request)); } service_provider_bridge_.AddService( [this](fidl::InterfaceRequest request) { view_provider_bindings_.AddBinding(this, std::move(request)); }); app::ServiceProviderPtr service_provider; auto request = service_provider.NewRequest(); service_provider_bridge_.set_backend(std::move(service_provider)); url_ = startup_info->launch_info->url; runtime_holder_.reset(new RuntimeHolder()); runtime_holder_->Init( app::ApplicationContext::CreateFrom(std::move(startup_info)), std::move(request), std::move(bundle)); } ApplicationControllerImpl::~ApplicationControllerImpl() = default; void ApplicationControllerImpl::Kill() { runtime_holder_.reset(); app_->Destroy(this); // |this| has been deleted at this point. } void ApplicationControllerImpl::Detach() { binding_.set_connection_error_handler(ftl::Closure()); } void ApplicationControllerImpl::CreateView( fidl::InterfaceRequest view_owner_request, fidl::InterfaceRequest services) { runtime_holder_->CreateView(url_, std::move(view_owner_request), std::move(services)); } Dart_Port ApplicationControllerImpl::GetUIIsolateMainPort() { if (!runtime_holder_) return ILLEGAL_PORT; return runtime_holder_->GetUIIsolateMainPort(); } std::string ApplicationControllerImpl::GetUIIsolateName() { if (!runtime_holder_) { return ""; } return runtime_holder_->GetUIIsolateName(); } } // namespace flutter_runner