blob: c65f30ed5eaa2abc4504ae247861e918f99ae77e [file] [log] [blame]
// Copyright 2018 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.
#ifndef FUCHSIA_RUNNERS_COMMON_WEB_CONTENT_RUNNER_H_
#define FUCHSIA_RUNNERS_COMMON_WEB_CONTENT_RUNNER_H_
#include <fuchsia/sys/cpp/fidl.h>
#include <memory>
#include <set>
#include "base/callback.h"
#include "base/containers/unique_ptr_adapters.h"
#include "base/fuchsia/scoped_service_binding.h"
#include "base/fuchsia/service_directory.h"
#include "base/macros.h"
#include "fuchsia/fidl/chromium/web/cpp/fidl.h"
class WebComponent;
// sys::Runner that instantiates components hosting standard web content.
class WebContentRunner : public fuchsia::sys::Runner {
public:
// Creates and returns a web.Context with a default path and parameters,
// and with access to the same services as this Runner. The returned binding
// is configured to exit this process on error.
static chromium::web::ContextPtr CreateDefaultWebContext();
// |service_directory|: ServiceDirectory into which this Runner will be
// published. |on_idle_closure| will be invoked when the final client of the
// published service disconnects, even if one or more Components are still
// active.
// |content|: Context (e.g. persisted profile storage) under which all web
// content launched through this Runner instance will be run.
// |on_idle_closure|: A callback which is invoked when the WebContentRunner
// has entered an idle state and may be safely torn down.
WebContentRunner(base::fuchsia::ServiceDirectory* service_directory,
chromium::web::ContextPtr context,
base::OnceClosure on_idle_closure);
~WebContentRunner() override;
chromium::web::Context* context() { return context_.get(); }
// Used by WebComponent instances to signal that the ComponentController
// channel was dropped, and therefore the component should be destroyed.
void DestroyComponent(WebComponent* component);
// fuchsia::sys::Runner implementation.
void StartComponent(fuchsia::sys::Package package,
fuchsia::sys::StartupInfo startup_info,
fidl::InterfaceRequest<fuchsia::sys::ComponentController>
controller_request) override;
// Used by tests to asynchronously access the first WebComponent.
void GetWebComponentForTest(base::OnceCallback<void(WebComponent*)> callback);
protected:
// Registers a WebComponent, or specialization, with this Runner.
void RegisterComponent(std::unique_ptr<WebComponent> component);
private:
void RunOnIdleClosureIfValid();
chromium::web::ContextPtr context_;
std::set<std::unique_ptr<WebComponent>, base::UniquePtrComparator>
components_;
// Publishes this Runner into the service directory specified at construction.
base::fuchsia::ScopedServiceBinding<fuchsia::sys::Runner> service_binding_;
// Run when no components remain, or the last |service_binding_| client
// disconnects, to quit the Runner.
base::OnceClosure on_idle_closure_;
// Test-only callback for GetWebComponentForTest.
base::OnceCallback<void(WebComponent*)> web_component_test_callback_;
DISALLOW_COPY_AND_ASSIGN(WebContentRunner);
};
#endif // FUCHSIA_RUNNERS_COMMON_WEB_CONTENT_RUNNER_H_