// 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_impl.h" #include #include "flutter/content_handler/runtime_holder.h" #include "lib/ftl/logging.h" #include "lib/mtl/data_pipe/vector.h" #include "lib/zip/unzipper.h" #include "mojo/public/cpp/application/connect.h" namespace flutter_content_handler { ApplicationImpl::ApplicationImpl( mojo::InterfaceRequest application, mojo::URLResponsePtr response) : binding_(this, std::move(application)) { // TODO(abarth): Currently we block the UI thread to drain the response body, // but we should do that work asynchronously instead. However, there when I // tried draining the data pipe asynchronously, the drain didn't complete. // We'll need to investigate why in more detail. bool result = mtl::BlockingCopyToVector(std::move(response->body), &bundle_); if (!result) { FTL_LOG(ERROR) << "Failed to receive bundle."; return; } // TODO(abarth): In principle, we should call StartRuntimeIfReady() here but // because we're draining the data pipe synchronously, we know that we can't // possibly be ready yet because we haven't received the Initialize() message. } ApplicationImpl::~ApplicationImpl() {} void ApplicationImpl::Initialize(mojo::InterfaceHandle shell, mojo::Array args, const mojo::String& url) { shell_ = mojo::ShellPtr::Create(shell.Pass()); url_ = url; mojo::ApplicationConnectorPtr connector; shell_->CreateApplicationConnector(mojo::GetProxy(&connector)); runtime_holder_.reset(new RuntimeHolder()); runtime_holder_->Init(std::move(connector)); StartRuntimeIfReady(); } void ApplicationImpl::AcceptConnection( const mojo::String& requestor_url, const mojo::String& resolved_url, mojo::InterfaceRequest services) {} void ApplicationImpl::RequestQuit() { binding_.Close(); delete this; } void ApplicationImpl::StartRuntimeIfReady() { if (!runtime_holder_ || bundle_.empty()) return; runtime_holder_->Run(url_, std::move(bundle_)); } } // namespace flutter_content_handler