Chromium Code Reviews| 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..058c2c7bac798eb619786d905fed2bd6b25778f4 100644 |
| --- a/content/browser/service_worker/service_worker_fetch_dispatcher.cc |
| +++ b/content/browser/service_worker/service_worker_fetch_dispatcher.cc |
| @@ -20,10 +20,10 @@ |
| #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" |
| @@ -33,6 +33,56 @@ 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) { |
| @@ -302,18 +352,14 @@ void ServiceWorkerFetchDispatcher::MaybeStartNavigationPreload( |
| return; |
| } |
| DCHECK(!url_loader_factory_getter.is_null()); |
| - mojom::URLLoaderFactoryPtr factory; |
| - url_loader_factory_getter.Run(mojo::GetProxy(&factory)); |
| + DCHECK(!url_loader_factory_); |
| + url_loader_factory_getter.Run(mojo::GetProxy(&url_loader_factory_)); |
| if (url_loader_factory_getter.IsCancelled()) |
| return; |
| - 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 +378,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://ggetithub.com/w3c/ServiceWorker/issues/920#issuecomment-251150270 |
|
Ken Rockot(use gerrit already)
2016/10/27 16:20:23
nit: trampled URL
yhirano
2016/11/01 10:45:19
Done.
|
| + 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() |