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