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

[fuchsia] Handle UrlRequestRewriteRulesProvider in CastRunner.

* Implement handling of the
  chromium.cast.UrlRequestRewriteRulesProvider API in CastRunner.
* Remove handling of the fuchsia.web.AdditionalHeadersProvider API in
  CastRunner as it is deprecated.
* Adapt the integration test to use the new API.

Bug: 976975
Change-Id: If1e97c474f79a4b6f3f0c03428b85557e3e73460
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1770434
Commit-Queue: Wez <wez@chromium.org>
Reviewed-by: default avatarWez <wez@chromium.org>
Cr-Commit-Position: refs/heads/master@{#695766}
parent a925d2d4
......@@ -21,6 +21,7 @@
namespace {
constexpr int kBindingsFailureExitCode = 129;
constexpr int kRewriteRulesProviderDisconnectExitCode = 130;
constexpr char kStubBindingsPath[] =
FILE_PATH_LITERAL("fuchsia/runners/cast/not_implemented_api_bindings.js");
......@@ -50,6 +51,7 @@ CastComponent::CastComponent(CastRunner* runner,
std::move(params.controller_request)),
agent_manager_(std::move(params.agent_manager)),
application_config_(std::move(params.app_config)),
rewrite_rules_provider_(std::move(params.rewrite_rules_provider)),
touch_input_policy_(
TouchInputPolicyFromApplicationConfig(application_config_)),
connector_(frame()),
......@@ -57,6 +59,15 @@ CastComponent::CastComponent(CastRunner* runner,
navigation_listener_binding_(this) {
base::AutoReset<bool> constructor_active_reset(&constructor_active_, true);
rewrite_rules_provider_.set_error_handler([this](zx_status_t status) {
ZX_LOG(ERROR, status) << "UrlRequestRewriteRulesProvider disconnected.";
DestroyComponent(kRewriteRulesProviderDisconnectExitCode,
fuchsia::sys::TerminationReason::INTERNAL_ERROR);
});
DCHECK(params.rewrite_rules);
OnRewriteRulesReceived(std::move(params.rewrite_rules.value()));
frame()->SetEnableInput(false);
frame()->SetNavigationEventListener(
navigation_listener_binding_.NewBinding());
......@@ -83,6 +94,14 @@ void CastComponent::DestroyComponent(int termination_exit_code,
WebComponent::DestroyComponent(termination_exit_code, reason);
}
void CastComponent::OnRewriteRulesReceived(
std::vector<fuchsia::web::UrlRequestRewriteRule> rewrite_rules) {
frame()->SetUrlRequestRewriteRules(std::move(rewrite_rules), [this]() {
rewrite_rules_provider_->GetUrlRequestRewriteRules(
fit::bind_member(this, &CastComponent::OnRewriteRulesReceived));
});
}
void CastComponent::OnNavigationStateChanged(
fuchsia::web::NavigationState change,
OnNavigationStateChangedCallback callback) {
......
......@@ -36,8 +36,9 @@ class CastComponent : public WebComponent,
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;
chromium::cast::UrlRequestRewriteRulesProviderPtr rewrite_rules_provider;
base::Optional<std::vector<fuchsia::web::UrlRequestRewriteRule>>
rewrite_rules;
};
CastComponent(CastRunner* runner, CastComponentParams params);
......@@ -51,6 +52,9 @@ class CastComponent : public WebComponent,
void DestroyComponent(int termination_exit_code,
fuchsia::sys::TerminationReason reason) override;
void OnRewriteRulesReceived(
std::vector<fuchsia::web::UrlRequestRewriteRule> rewrite_rules);
// fuchsia::web::NavigationEventListener implementation.
// Triggers the injection of API channels into the page content.
void OnNavigationStateChanged(
......@@ -59,6 +63,7 @@ class CastComponent : public WebComponent,
std::unique_ptr<cr_fuchsia::AgentManager> agent_manager_;
chromium::cast::ApplicationConfig application_config_;
chromium::cast::UrlRequestRewriteRulesProviderPtr rewrite_rules_provider_;
bool constructor_active_ = false;
TouchInputPolicy touch_input_policy_;
......
......@@ -4,7 +4,6 @@
#include "fuchsia/runners/cast/cast_runner.h"
#include <fuchsia/sys/cpp/fidl.h>
#include <memory>
#include <string>
#include <utility>
......@@ -67,25 +66,26 @@ void CastRunner::StartComponent(
base::BindOnce(&CastRunner::MaybeStartComponent, base::Unretained(this),
base::Unretained(pending_component.get())));
// Get AdditionalHeadersProvider from the Agent.
fidl::InterfaceHandle<fuchsia::web::AdditionalHeadersProvider>
additional_headers_provider;
// Get UrlRequestRewriteRulesProvider from the Agent.
fidl::InterfaceHandle<chromium::cast::UrlRequestRewriteRulesProvider>
url_request_rules_provider;
pending_component->agent_manager->ConnectToAgentService(
kAgentComponentUrl, additional_headers_provider.NewRequest());
pending_component->headers_provider = additional_headers_provider.Bind();
pending_component->headers_provider.set_error_handler(
[this, pending_component = pending_component.get()](zx_status_t error) {
if (pending_component->headers.has_value())
return;
pending_component->headers = {};
MaybeStartComponent(pending_component);
kAgentComponentUrl, url_request_rules_provider.NewRequest());
pending_component->rewrite_rules_provider = url_request_rules_provider.Bind();
pending_component->rewrite_rules_provider.set_error_handler(
[this, pending_component = pending_component.get()](zx_status_t status) {
ZX_LOG(ERROR, status) << "UrlRequestRewriteRulesProvider disconnected.";
// The rules provider disconnected, cancel the component launch.
size_t count = pending_components_.erase(pending_component);
DCHECK_EQ(count, 1u);
});
pending_component->headers_provider->GetHeaders(
pending_component->rewrite_rules_provider->GetUrlRequestRewriteRules(
[this, pending_component = pending_component.get()](
std::vector<fuchsia::net::http::Header> headers, zx_time_t expiry) {
pending_component->headers =
base::Optional<std::vector<fuchsia::net::http::Header>>(
std::move(headers));
std::vector<fuchsia::web::UrlRequestRewriteRule> rewrite_rules) {
pending_component->rewrite_rules =
base::Optional<std::vector<fuchsia::web::UrlRequestRewriteRule>>(
std::move(rewrite_rules));
MaybeStartComponent(pending_component);
});
......@@ -126,19 +126,17 @@ void CastRunner::MaybeStartComponent(
return;
if (!pending_component->api_bindings_client->HasBindings())
return;
if (!pending_component->headers.has_value())
if (!pending_component->rewrite_rules.has_value())
return;
// Create a component based on the returned configuration, and pass it the
// |pending_component|.
std::vector<fuchsia::net::http::Header> additional_headers =
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);
component->LoadUrl(std::move(cast_app_url), std::move(additional_headers));
component->LoadUrl(std::move(cast_app_url),
std::vector<fuchsia::net::http::Header>());
RegisterComponent(std::move(component));
}
......@@ -12,7 +12,9 @@
#include "base/callback.h"
#include "base/containers/flat_set.h"
#include "base/containers/unique_ptr_adapters.h"
#include "base/fuchsia/startup_context.h"
#include "base/macros.h"
#include "fuchsia/base/agent_manager.h"
#include "fuchsia/fidl/chromium/cast/cpp/fidl.h"
#include "fuchsia/runners/cast/cast_component.h"
#include "fuchsia/runners/common/web_content_runner.h"
......
......@@ -23,6 +23,7 @@
#include "fuchsia/base/result_receiver.h"
#include "fuchsia/base/string_util.h"
#include "fuchsia/base/test_navigation_listener.h"
#include "fuchsia/base/url_request_rewrite_test_util.h"
#include "fuchsia/runners/cast/cast_runner.h"
#include "fuchsia/runners/cast/fake_application_config_manager.h"
#include "fuchsia/runners/cast/test_api_bindings.h"
......@@ -45,28 +46,36 @@ void ComponentErrorHandler(zx_status_t status) {
ADD_FAILURE();
}
class FakeAdditionalHeadersProvider
: public fuchsia::web::AdditionalHeadersProvider {
class FakeUrlRequestRewriteRulesProvider
: public chromium::cast::UrlRequestRewriteRulesProvider {
public:
explicit FakeAdditionalHeadersProvider(sys::OutgoingDirectory* directory)
explicit FakeUrlRequestRewriteRulesProvider(sys::OutgoingDirectory* directory)
: binding_(directory, this) {}
~FakeAdditionalHeadersProvider() override = default;
~FakeUrlRequestRewriteRulesProvider() override = default;
private:
void GetHeaders(GetHeadersCallback callback) override {
std::vector<fuchsia::net::http::Header> headers;
fuchsia::net::http::Header header;
header.name = cr_fuchsia::StringToBytes("Test");
header.value = cr_fuchsia::StringToBytes("Value");
headers.push_back(std::move(header));
callback(std::move(headers), 0);
void GetUrlRequestRewriteRules(
GetUrlRequestRewriteRulesCallback callback) override {
// Only send the rules once. They do not expire
if (rules_sent_)
return;
rules_sent_ = true;
std::vector<fuchsia::web::UrlRequestRewrite> rewrites;
rewrites.push_back(cr_fuchsia::CreateRewriteAddHeaders("Test", "Value"));
fuchsia::web::UrlRequestRewriteRule rule;
rule.set_rewrites(std::move(rewrites));
std::vector<fuchsia::web::UrlRequestRewriteRule> rules;
rules.push_back(std::move(rule));
callback(std::move(rules));
}
bool rules_sent_ = false;
const base::fuchsia::ScopedServiceBinding<
fuchsia::web::AdditionalHeadersProvider>
chromium::cast::UrlRequestRewriteRulesProvider>
binding_;
DISALLOW_COPY_AND_ASSIGN(FakeAdditionalHeadersProvider);
DISALLOW_COPY_AND_ASSIGN(FakeUrlRequestRewriteRulesProvider);
};
class FakeApplicationControllerReceiver
......@@ -104,8 +113,8 @@ class FakeComponentState : public cr_fuchsia::AgentImpl::ComponentStateBase {
bool provide_controller_receiver)
: ComponentStateBase(component_url),
app_config_binding_(outgoing_directory(), app_config_manager),
additional_headers_provider_(
std::make_unique<FakeAdditionalHeadersProvider>(
url_request_rules_provider_(
std::make_unique<FakeUrlRequestRewriteRulesProvider>(
outgoing_directory())) {
if (bindings_manager) {
bindings_manager_binding_ = std::make_unique<
......@@ -138,7 +147,8 @@ class FakeComponentState : public cr_fuchsia::AgentImpl::ComponentStateBase {
std::unique_ptr<
base::fuchsia::ScopedServiceBinding<chromium::cast::ApiBindings>>
bindings_manager_binding_;
std::unique_ptr<FakeAdditionalHeadersProvider> additional_headers_provider_;
std::unique_ptr<FakeUrlRequestRewriteRulesProvider>
url_request_rules_provider_;
FakeApplicationControllerReceiver controller_receiver_;
base::Optional<base::fuchsia::ScopedServiceBinding<
chromium::cast::ApplicationControllerReceiver>>
......@@ -394,7 +404,7 @@ TEST_F(CastRunnerIntegrationTest, IncorrectCastAppId) {
EXPECT_FALSE(web_component.has_value());
}
TEST_F(CastRunnerIntegrationTest, AdditionalHeadersProvider) {
TEST_F(CastRunnerIntegrationTest, UrlRequestRewriteRulesProvider) {
const char kEchoAppId[] = "00000000";
const char kEchoAppPath[] = "/echoheader?Test";
const GURL echo_app_url = test_server_.GetURL(kEchoAppPath);
......
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