Commit 55419f7e authored by Fabrice de Gans-Riberi's avatar Fabrice de Gans-Riberi Committed by Commit Bot

[CastRunner] Use a parameters structure for CastComponent construction.

* Simplify CastComponent constructor to take a single structure.
* Spin-off from https://crrev.com/c/1770434

Bug: 976975
Change-Id: Icb42418bfa60e1b6f34bd3f29f1f1c29d754cf07
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1778915
Commit-Queue: Fabrice de Gans-Riberi <fdegans@chromium.org>
Reviewed-by: default avatarWez <wez@chromium.org>
Cr-Commit-Position: refs/heads/master@{#692201}
parent e919a379
...@@ -38,21 +38,22 @@ TouchInputPolicy TouchInputPolicyFromApplicationConfig( ...@@ -38,21 +38,22 @@ TouchInputPolicy TouchInputPolicyFromApplicationConfig(
} // namespace } // namespace
CastComponent::CastComponent( CastComponent::CastComponentParams::CastComponentParams() = default;
CastRunner* runner, CastComponent::CastComponentParams::CastComponentParams(CastComponentParams&&) =
chromium::cast::ApplicationConfig application_config, default;
std::unique_ptr<ApiBindingsClient> api_bindings_client, CastComponent::CastComponentParams::~CastComponentParams() = default;
std::unique_ptr<base::fuchsia::StartupContext> context,
fidl::InterfaceRequest<fuchsia::sys::ComponentController> CastComponent::CastComponent(CastRunner* runner,
controller_request, CastComponent::CastComponentParams params)
std::unique_ptr<cr_fuchsia::AgentManager> agent_manager) : WebComponent(runner,
: WebComponent(runner, std::move(context), std::move(controller_request)), std::move(params.startup_context),
agent_manager_(std::move(agent_manager)), std::move(params.controller_request)),
application_config_(std::move(application_config)), agent_manager_(std::move(params.agent_manager)),
application_config_(std::move(params.app_config)),
touch_input_policy_( touch_input_policy_(
TouchInputPolicyFromApplicationConfig(application_config_)), TouchInputPolicyFromApplicationConfig(application_config_)),
connector_(frame()), connector_(frame()),
api_bindings_client_(std::move(api_bindings_client)), api_bindings_client_(std::move(params.api_bindings_client)),
navigation_listener_binding_(this) { navigation_listener_binding_(this) {
base::AutoReset<bool> constructor_active_reset(&constructor_active_, true); base::AutoReset<bool> constructor_active_reset(&constructor_active_, true);
......
...@@ -9,6 +9,8 @@ ...@@ -9,6 +9,8 @@
#include <memory> #include <memory>
#include "base/fuchsia/service_directory.h" #include "base/fuchsia/service_directory.h"
#include "base/fuchsia/startup_context.h"
#include "base/optional.h"
#include "fuchsia/base/agent_manager.h" #include "fuchsia/base/agent_manager.h"
#include "fuchsia/runners/cast/api_bindings_client.h" #include "fuchsia/runners/cast/api_bindings_client.h"
#include "fuchsia/runners/cast/application_controller_impl.h" #include "fuchsia/runners/cast/application_controller_impl.h"
...@@ -22,13 +24,23 @@ class CastRunner; ...@@ -22,13 +24,23 @@ class CastRunner;
class CastComponent : public WebComponent, class CastComponent : public WebComponent,
public fuchsia::web::NavigationEventListener { public fuchsia::web::NavigationEventListener {
public: public:
CastComponent(CastRunner* runner, struct CastComponentParams {
chromium::cast::ApplicationConfig application_config, CastComponentParams();
std::unique_ptr<ApiBindingsClient> bindings_manager, CastComponentParams(CastComponentParams&&);
std::unique_ptr<base::fuchsia::StartupContext> startup_context, ~CastComponentParams();
chromium::cast::ApplicationConfigManagerPtr app_config_manager;
std::unique_ptr<base::fuchsia::StartupContext> startup_context;
std::unique_ptr<cr_fuchsia::AgentManager> agent_manager;
std::unique_ptr<ApiBindingsClient> api_bindings_client;
fidl::InterfaceRequest<fuchsia::sys::ComponentController> fidl::InterfaceRequest<fuchsia::sys::ComponentController>
controller_request, controller_request;
std::unique_ptr<cr_fuchsia::AgentManager> agent_manager); chromium::cast::ApplicationConfig app_config;
fuchsia::web::AdditionalHeadersProviderPtr headers_provider;
base::Optional<std::vector<fuchsia::net::http::Header>> headers;
};
CastComponent(CastRunner* runner, CastComponentParams params);
~CastComponent() override; ~CastComponent() override;
private: private:
......
...@@ -10,10 +10,7 @@ ...@@ -10,10 +10,7 @@
#include <utility> #include <utility>
#include "base/fuchsia/fuchsia_logging.h" #include "base/fuchsia/fuchsia_logging.h"
#include "base/fuchsia/startup_context.h"
#include "base/logging.h" #include "base/logging.h"
#include "fuchsia/base/agent_manager.h"
#include "fuchsia/runners/cast/cast_component.h"
#include "url/gurl.h" #include "url/gurl.h"
CastRunner::CastRunner(sys::OutgoingDirectory* outgoing_directory, CastRunner::CastRunner(sys::OutgoingDirectory* outgoing_directory,
...@@ -22,17 +19,6 @@ CastRunner::CastRunner(sys::OutgoingDirectory* outgoing_directory, ...@@ -22,17 +19,6 @@ CastRunner::CastRunner(sys::OutgoingDirectory* outgoing_directory,
CastRunner::~CastRunner() = default; CastRunner::~CastRunner() = default;
struct CastRunner::PendingComponent {
chromium::cast::ApplicationConfigManagerPtr app_config_manager;
std::unique_ptr<base::fuchsia::StartupContext> startup_context;
std::unique_ptr<cr_fuchsia::AgentManager> agent_manager;
std::unique_ptr<ApiBindingsClient> bindings_manager;
fidl::InterfaceRequest<fuchsia::sys::ComponentController> controller_request;
chromium::cast::ApplicationConfig app_config;
fuchsia::web::AdditionalHeadersProviderPtr headers_provider;
base::Optional<std::vector<fuchsia::net::http::Header>> headers;
};
void CastRunner::StartComponent( void CastRunner::StartComponent(
fuchsia::sys::Package package, fuchsia::sys::Package package,
fuchsia::sys::StartupInfo startup_info, fuchsia::sys::StartupInfo startup_info,
...@@ -54,7 +40,8 @@ void CastRunner::StartComponent( ...@@ -54,7 +40,8 @@ void CastRunner::StartComponent(
// The application configuration asynchronously via the per-component // The application configuration asynchronously via the per-component
// ApplicationConfigManager, the pointer to that service must be kept live // ApplicationConfigManager, the pointer to that service must be kept live
// until the request completes, or CastRunner is deleted. // until the request completes, or CastRunner is deleted.
auto pending_component = std::make_unique<PendingComponent>(); auto pending_component =
std::make_unique<CastComponent::CastComponentParams>();
pending_component->startup_context = pending_component->startup_context =
std::make_unique<base::fuchsia::StartupContext>(std::move(startup_info)); std::make_unique<base::fuchsia::StartupContext>(std::move(startup_info));
pending_component->agent_manager = std::make_unique<cr_fuchsia::AgentManager>( pending_component->agent_manager = std::make_unique<cr_fuchsia::AgentManager>(
...@@ -75,7 +62,7 @@ void CastRunner::StartComponent( ...@@ -75,7 +62,7 @@ void CastRunner::StartComponent(
fidl::InterfaceHandle<chromium::cast::ApiBindings> api_bindings_client; fidl::InterfaceHandle<chromium::cast::ApiBindings> api_bindings_client;
pending_component->agent_manager->ConnectToAgentService( pending_component->agent_manager->ConnectToAgentService(
kAgentComponentUrl, api_bindings_client.NewRequest()); kAgentComponentUrl, api_bindings_client.NewRequest());
pending_component->bindings_manager = std::make_unique<ApiBindingsClient>( pending_component->api_bindings_client = std::make_unique<ApiBindingsClient>(
std::move(api_bindings_client), std::move(api_bindings_client),
base::BindOnce(&CastRunner::MaybeStartComponent, base::Unretained(this), base::BindOnce(&CastRunner::MaybeStartComponent, base::Unretained(this),
base::Unretained(pending_component.get()))); base::Unretained(pending_component.get())));
...@@ -116,12 +103,8 @@ const char CastRunner::kAgentComponentUrl[] = ...@@ -116,12 +103,8 @@ const char CastRunner::kAgentComponentUrl[] =
"fuchsia-pkg://fuchsia.com/cast_agent#meta/cast_agent.cmx"; "fuchsia-pkg://fuchsia.com/cast_agent#meta/cast_agent.cmx";
void CastRunner::GetConfigCallback( void CastRunner::GetConfigCallback(
PendingComponent* pending_component, CastComponent::CastComponentParams* pending_component,
chromium::cast::ApplicationConfig app_config) { chromium::cast::ApplicationConfig app_config) {
// Ideally the PendingComponent would be move()d out of |pending_components_|
// here, but that requires extract(), which isn't available until C++17.
// Instead find |pending_component| and move() the individual fields out
// before erase()ing it.
auto it = pending_components_.find(pending_component); auto it = pending_components_.find(pending_component);
DCHECK(it != pending_components_.end()); DCHECK(it != pending_components_.end());
...@@ -137,25 +120,23 @@ void CastRunner::GetConfigCallback( ...@@ -137,25 +120,23 @@ void CastRunner::GetConfigCallback(
MaybeStartComponent(pending_component); MaybeStartComponent(pending_component);
} }
void CastRunner::MaybeStartComponent(PendingComponent* pending_component) { void CastRunner::MaybeStartComponent(
CastComponent::CastComponentParams* pending_component) {
if (pending_component->app_config.IsEmpty()) if (pending_component->app_config.IsEmpty())
return; return;
if (!pending_component->bindings_manager->HasBindings()) if (!pending_component->api_bindings_client->HasBindings())
return; return;
if (!pending_component->headers.has_value()) if (!pending_component->headers.has_value())
return; return;
// Create a component based on the returned configuration, and pass it the // Create a component based on the returned configuration, and pass it the
// fields stashed in PendingComponent. // |pending_component|.
GURL cast_app_url(pending_component->app_config.web_url());
auto component = std::make_unique<CastComponent>(
this, std::move(pending_component->app_config),
std::move(pending_component->bindings_manager),
std::move(pending_component->startup_context),
std::move(pending_component->controller_request),
std::move(pending_component->agent_manager));
std::vector<fuchsia::net::http::Header> additional_headers = std::vector<fuchsia::net::http::Header> additional_headers =
pending_component->headers.value(); pending_component->headers.value();
GURL cast_app_url(pending_component->app_config.web_url());
auto component =
std::make_unique<CastComponent>(this, std::move(*pending_component));
pending_components_.erase(pending_component); pending_components_.erase(pending_component);
component->LoadUrl(std::move(cast_app_url), std::move(additional_headers)); component->LoadUrl(std::move(cast_app_url), std::move(additional_headers));
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include "base/containers/unique_ptr_adapters.h" #include "base/containers/unique_ptr_adapters.h"
#include "base/macros.h" #include "base/macros.h"
#include "fuchsia/fidl/chromium/cast/cpp/fidl.h" #include "fuchsia/fidl/chromium/cast/cpp/fidl.h"
#include "fuchsia/runners/cast/cast_component.h"
#include "fuchsia/runners/common/web_content_runner.h" #include "fuchsia/runners/common/web_content_runner.h"
// sys::Runner which instantiates Cast activities specified via cast/casts URIs. // sys::Runner which instantiates Cast activities specified via cast/casts URIs.
...@@ -34,19 +35,20 @@ class CastRunner : public WebContentRunner { ...@@ -34,19 +35,20 @@ class CastRunner : public WebContentRunner {
static const char kAgentComponentUrl[]; static const char kAgentComponentUrl[];
private: private:
struct PendingComponent; void GetConfigCallback(CastComponent::CastComponentParams* pending_component,
void GetConfigCallback(PendingComponent* pending_component,
chromium::cast::ApplicationConfig app_config); chromium::cast::ApplicationConfig app_config);
void GetBindingsCallback(PendingComponent* pending_component, void GetBindingsCallback(
CastComponent::CastComponentParams* pending_component,
std::vector<chromium::cast::ApiBinding> bindings); std::vector<chromium::cast::ApiBinding> bindings);
// Starts a component once all configuration data is available. // Starts a component once all configuration data is available.
void MaybeStartComponent(PendingComponent* pending_component); void MaybeStartComponent(
CastComponent::CastComponentParams* pending_component);
// Holds StartComponent() requests while the ApplicationConfig is being // Holds StartComponent() requests while the ApplicationConfig is being
// fetched from the ApplicationConfigManager. // fetched from the ApplicationConfigManager.
base::flat_set<std::unique_ptr<PendingComponent>, base::UniquePtrComparator> base::flat_set<std::unique_ptr<CastComponent::CastComponentParams>,
base::UniquePtrComparator>
pending_components_; pending_components_;
DISALLOW_COPY_AND_ASSIGN(CastRunner); DISALLOW_COPY_AND_ASSIGN(CastRunner);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment