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..e9af208a661c584bc16e48d2fe3e19f5601baf3d 100644 |
--- a/content/browser/service_worker/service_worker_fetch_dispatcher.cc |
+++ b/content/browser/service_worker/service_worker_fetch_dispatcher.cc |
@@ -11,16 +11,21 @@ |
#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_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 "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 +277,61 @@ void ServiceWorkerFetchDispatcher::Complete( |
} |
void ServiceWorkerFetchDispatcher::MaybeStartNavigationPreload( |
- net::URLRequest* original_request) { |
+ net::URLRequest* original_request, |
+ const MojoURLLoaderFactoryGetter& url_loader_factory_getter) { |
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_getter.is_null()); |
+ mojom::URLLoaderFactoryPtr factory; |
+ url_loader_factory_getter.Run(mojo::GetProxy(&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(); |
+ 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(); |
+ // Set to SUB_RESOURCE because we shouldn't trigger NavigationResourceThrottle |
+ // for the service worker navigation preload request. |
+ request.resource_type = RESOURCE_TYPE_SUB_RESOURCE; |
+ 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_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)); |
} |
ServiceWorkerMetrics::EventType ServiceWorkerFetchDispatcher::GetEventType() |