| Index: content/browser/service_worker/service_worker_fetch_dispatcher.cc
|
| diff --git a/content/browser/service_worker/service_worker_fetch_dispatcher.cc b/content/browser/service_worker/service_worker_fetch_dispatcher.cc
|
| index c6810ef22f171dfa8faedc56dd62e2bb0a1824fe..3e27d4b2b8b3069e99846770065f7784014b1187 100644
|
| --- a/content/browser/service_worker/service_worker_fetch_dispatcher.cc
|
| +++ b/content/browser/service_worker/service_worker_fetch_dispatcher.cc
|
| @@ -20,19 +20,71 @@
|
| #include "content/common/service_worker/service_worker_status_code.h"
|
| #include "content/common/service_worker/service_worker_types.h"
|
| #include "content/common/service_worker/service_worker_utils.h"
|
| -#include "content/common/url_loader.mojom.h"
|
| -#include "content/common/url_loader_factory.mojom.h"
|
| #include "content/public/common/browser_side_navigation_policy.h"
|
| #include "content/public/common/content_features.h"
|
| +#include "mojo/public/cpp/bindings/associated_binding.h"
|
| +#include "mojo/public/cpp/bindings/binding.h"
|
| #include "net/log/net_log.h"
|
| #include "net/log/net_log_capture_mode.h"
|
| #include "net/log/net_log_event_type.h"
|
| #include "net/url_request/url_request.h"
|
| +#include "services/service_manager/public/cpp/identity.h"
|
| +#include "services/service_manager/public/cpp/interface_provider_spec.h"
|
|
|
| namespace content {
|
|
|
| namespace {
|
|
|
| +class DelegatingURLLoader final : public mojom::URLLoader {
|
| + public:
|
| + explicit DelegatingURLLoader(mojom::URLLoaderAssociatedPtr loader)
|
| + : binding_(this), loader_(std::move(loader)) {}
|
| + ~DelegatingURLLoader() override {}
|
| +
|
| + void FollowRedirect() override { loader_->FollowRedirect(); }
|
| + void Cancel() override { loader_->Cancel(); }
|
| +
|
| + mojom::URLLoaderPtr CreateInterfacePtrAndBind() {
|
| + return binding_.CreateInterfacePtrAndBind();
|
| + }
|
| +
|
| + private:
|
| + mojo::Binding<mojom::URLLoader> binding_;
|
| + mojom::URLLoaderAssociatedPtr loader_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(DelegatingURLLoader);
|
| +};
|
| +
|
| +class DelegatingURLLoaderClient final : public mojom::URLLoaderClient {
|
| + public:
|
| + explicit DelegatingURLLoaderClient(mojom::URLLoaderClientPtr client)
|
| + : binding_(this), client_(std::move(client)) {}
|
| + ~DelegatingURLLoaderClient() override {}
|
| +
|
| + void OnReceiveResponse(const ResourceResponseHead& head) override {
|
| + client_->OnReceiveResponse(head);
|
| + }
|
| + void OnStartLoadingResponseBody(
|
| + mojo::ScopedDataPipeConsumerHandle body) override {
|
| + client_->OnStartLoadingResponseBody(std::move(body));
|
| + }
|
| + void OnComplete(
|
| + const ResourceRequestCompletionStatus& completion_status) override {
|
| + client_->OnComplete(completion_status);
|
| + }
|
| +
|
| + void Bind(mojom::URLLoaderClientAssociatedPtrInfo* ptr_info,
|
| + mojo::AssociatedGroup* associated_group) {
|
| + binding_.Bind(ptr_info, associated_group);
|
| + }
|
| +
|
| + private:
|
| + mojo::AssociatedBinding<mojom::URLLoaderClient> binding_;
|
| + mojom::URLLoaderClientPtr client_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(DelegatingURLLoaderClient);
|
| +};
|
| +
|
| using EventType = ServiceWorkerMetrics::EventType;
|
| EventType ResourceTypeToEventType(ResourceType resource_type) {
|
| switch (resource_type) {
|
| @@ -138,6 +190,8 @@ ServiceWorkerFetchDispatcher::ServiceWorkerFetchDispatcher(
|
| request_(std::move(request)),
|
| resource_type_(resource_type),
|
| did_complete_(false),
|
| + interface_registry_(service_manager::Identity(),
|
| + service_manager::InterfaceProviderSpec()),
|
| weak_factory_(this) {
|
| net_log_.BeginEvent(net::NetLogEventType::SERVICE_WORKER_DISPATCH_FETCH_EVENT,
|
| net::NetLog::StringCallback(
|
| @@ -301,19 +355,22 @@ void ServiceWorkerFetchDispatcher::MaybeStartNavigationPreload(
|
| NOTIMPLEMENTED();
|
| return;
|
| }
|
| +
|
| + DCHECK(!url_loader_factory_);
|
| + service_manager::mojom::InterfaceProviderPtr provider_proxy;
|
| + interface_registry_.Bind(mojo::GetProxy(&provider_proxy),
|
| + service_manager::Identity(),
|
| + service_manager::InterfaceProviderSpec());
|
| + interface_provider_.Bind(std::move(provider_proxy));
|
| + interface_registry_.AddInterface(url_loader_factory_getter);
|
| + interface_provider_.GetInterface(&url_loader_factory_);
|
| +
|
| DCHECK(!url_loader_factory_getter.is_null());
|
| - mojom::URLLoaderFactoryPtr factory;
|
| - url_loader_factory_getter.Run(mojo::GetProxy(&factory));
|
| - if (url_loader_factory_getter.IsCancelled())
|
| - return;
|
| + url_loader_factory_getter.Run(mojo::GetProxy(&url_loader_factory_));
|
|
|
| - preload_handle_ = mojom::FetchEventPreloadHandle::New();
|
| const ResourceRequestInfoImpl* original_info =
|
| ResourceRequestInfoImpl::ForRequest(original_request);
|
|
|
| - mojom::URLLoaderClientPtr url_loader_client;
|
| - preload_handle_->url_loader_client_request = GetProxy(&url_loader_client);
|
| -
|
| ResourceRequest request;
|
| request.method = original_request->method();
|
| request.url = original_request->url();
|
| @@ -332,11 +389,31 @@ void ServiceWorkerFetchDispatcher::MaybeStartNavigationPreload(
|
| request.parent_is_main_frame = original_info->ParentIsMainFrame();
|
| const int request_id = ResourceDispatcherHostImpl::Get()->MakeRequestID();
|
| DCHECK_LT(request_id, -1);
|
| - // TODO(horo): Add "Service-Worker-Navigation-Preload" header.
|
| - // See: https://github.com/w3c/ServiceWorker/issues/920#issuecomment-251150270
|
| - factory->CreateLoaderAndStart(GetProxy(&preload_handle_->url_loader),
|
| - original_info->GetRouteID(), request_id,
|
| - request, std::move(url_loader_client));
|
| +
|
| + preload_handle_ = mojom::FetchEventPreloadHandle::New();
|
| + mojom::URLLoaderClientPtr url_loader_client_ptr;
|
| + preload_handle_->url_loader_client_request =
|
| + mojo::GetProxy(&url_loader_client_ptr);
|
| + std::unique_ptr<DelegatingURLLoaderClient> url_loader_client(
|
| + new DelegatingURLLoaderClient(std::move(url_loader_client_ptr)));
|
| + mojom::URLLoaderClientAssociatedPtrInfo url_loader_client_associated_ptr_info;
|
| + url_loader_client->Bind(&url_loader_client_associated_ptr_info,
|
| + url_loader_factory_.associated_group());
|
| + mojom::URLLoaderAssociatedPtr url_loader_associated_ptr;
|
| +
|
| + // TODO(horo): Add "Service-Worker-Navigation-Preload" header. See
|
| + // https://getithub.com/w3c/ServiceWorker/issues/920#issuecomment-251150270
|
| + url_loader_factory_->CreateLoaderAndStart(
|
| + mojo::GetProxy(&url_loader_associated_ptr,
|
| + url_loader_factory_.associated_group()),
|
| + original_info->GetRouteID(), request_id, request,
|
| + std::move(url_loader_client_associated_ptr_info));
|
| +
|
| + std::unique_ptr<DelegatingURLLoader> url_loader(
|
| + new DelegatingURLLoader(std::move(url_loader_associated_ptr)));
|
| + preload_handle_->url_loader = url_loader->CreateInterfacePtrAndBind();
|
| + url_loader_ = std::move(url_loader);
|
| + url_loader_client_ = std::move(url_loader_client);
|
| }
|
|
|
| ServiceWorkerMetrics::EventType ServiceWorkerFetchDispatcher::GetEventType()
|
|
|