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 fefc7137f6e953a3a34b43563943dc094bab16ab..4f70baf6a13f91de0ac8c7fa725a6eb19cd74000 100644 |
| --- a/content/browser/service_worker/service_worker_fetch_dispatcher.cc |
| +++ b/content/browser/service_worker/service_worker_fetch_dispatcher.cc |
| @@ -11,16 +11,20 @@ |
| #include "base/command_line.h" |
| #include "base/time/time.h" |
| #include "base/trace_event/trace_event.h" |
| +#include "content/browser/loader/resource_dispatcher_host_impl.h" |
| +#include "content/browser/loader/resource_request_info_impl.h" |
| #include "content/browser/service_worker/embedded_worker_status.h" |
| #include "content/browser/service_worker/service_worker_version.h" |
| #include "content/common/service_worker/fetch_event_dispatcher.mojom.h" |
| #include "content/common/service_worker/service_worker_messages.h" |
| #include "content/common/service_worker/service_worker_status_code.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 "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" |
| namespace content { |
| @@ -272,16 +276,58 @@ void ServiceWorkerFetchDispatcher::Complete( |
| } |
| void ServiceWorkerFetchDispatcher::MaybeStartNavigationPreload( |
| - net::URLRequest* original_request) { |
| + net::URLRequest* original_request, |
| + const URLLoaderFactoryCallback& url_loader_factory_callback) { |
| if (resource_type_ != RESOURCE_TYPE_MAIN_FRAME && |
| resource_type_ != RESOURCE_TYPE_SUB_FRAME) { |
| return; |
| } |
| if (!version_->navigation_preload_enabled()) |
| return; |
| - // TODO(horo): Implement this to start the preload request for the navigation |
| - // request and set |preload_handle_|. |
| - NOTIMPLEMENTED(); |
| + // TODO(horo): Currently NavigationPreload doesn't support request body. |
| + if (!request_->blob_uuid.empty()) |
| + return; |
| + // TODO(horo): Introduce kEnableServiceWorkerNavigationPreload switch, and use |
| + // it instead of kEnableExperimentalWebPlatformFeatures. |
| + if (!base::CommandLine::ForCurrentProcess()->HasSwitch( |
| + switches::kEnableExperimentalWebPlatformFeatures)) { |
| + // TODO(horo): Check |version_|'s origin_trial_tokens() here if we use |
| + // Origin-Trial for NavigationPreload. |
| + return; |
| + } |
| + DCHECK(!url_loader_factory_callback.is_null()); |
| + mojom::URLLoaderFactoryPtr factory; |
| + if (!url_loader_factory_callback.Run(mojo::GetProxy(&factory))) |
| + 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(); |
| + request.referrer = GURL(original_request->referrer()); |
| + request.referrer_policy = original_info->GetReferrerPolicy(); |
| + request.visibility_state = original_info->GetVisibilityState(); |
| + request.load_flags = original_request->load_flags(); |
| + request.resource_type = RESOURCE_TYPE_SUB_RESOURCE; |
|
falken
2016/10/19 05:11:27
Why SUB_RESOURCE instead of resource_type_?
horo
2016/10/19 06:22:52
It is because we shouldn't trigger NavigationResou
|
| + request.priority = original_request->priority(); |
| + request.skip_service_worker = SkipServiceWorker::ALL; |
| + request.do_not_prompt_for_login = true; |
| + request.render_frame_id = original_info->GetRenderFrameID(); |
| + request.is_main_frame = original_info->IsMainFrame(); |
| + request.parent_is_main_frame = original_info->ParentIsMainFrame(); |
| + const int request_id = ResourceDispatcherHostImpl::Get()->MakeRequestID(); |
| + DCHECK(request_id <= -2); |
|
falken
2016/10/19 05:11:28
nit: DCHECK_LT -1?
horo
2016/10/19 06:22:52
Done.
|
| + // 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)); |
| } |
| ServiceWorkerMetrics::EventType ServiceWorkerFetchDispatcher::GetEventType() |