Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(216)

Side by Side Diff: content/browser/service_worker/service_worker_fetch_dispatcher.cc

Issue 2410333006: Implement ServiceWorkerFetchDispatcher::MaybeStartNavigationPreload(). (Closed)
Patch Set: incorporated falken's comment Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/service_worker/service_worker_fetch_dispatcher.h" 5 #include "content/browser/service_worker/service_worker_fetch_dispatcher.h"
6 6
7 #include <string> 7 #include <string>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/command_line.h" 11 #include "base/command_line.h"
12 #include "base/time/time.h" 12 #include "base/time/time.h"
13 #include "base/trace_event/trace_event.h" 13 #include "base/trace_event/trace_event.h"
14 #include "content/browser/loader/resource_dispatcher_host_impl.h"
15 #include "content/browser/loader/resource_request_info_impl.h"
14 #include "content/browser/service_worker/embedded_worker_status.h" 16 #include "content/browser/service_worker/embedded_worker_status.h"
15 #include "content/browser/service_worker/service_worker_version.h" 17 #include "content/browser/service_worker/service_worker_version.h"
16 #include "content/common/service_worker/fetch_event_dispatcher.mojom.h" 18 #include "content/common/service_worker/fetch_event_dispatcher.mojom.h"
17 #include "content/common/service_worker/service_worker_messages.h" 19 #include "content/common/service_worker/service_worker_messages.h"
18 #include "content/common/service_worker/service_worker_status_code.h" 20 #include "content/common/service_worker/service_worker_status_code.h"
21 #include "content/common/service_worker/service_worker_types.h"
19 #include "content/common/service_worker/service_worker_utils.h" 22 #include "content/common/service_worker/service_worker_utils.h"
23 #include "content/common/url_loader.mojom.h"
24 #include "content/common/url_loader_factory.mojom.h"
20 #include "net/log/net_log.h" 25 #include "net/log/net_log.h"
21 #include "net/log/net_log_capture_mode.h" 26 #include "net/log/net_log_capture_mode.h"
22
23 #include "net/log/net_log_event_type.h" 27 #include "net/log/net_log_event_type.h"
28 #include "net/url_request/url_request.h"
24 29
25 namespace content { 30 namespace content {
26 31
27 namespace { 32 namespace {
28 33
29 using EventType = ServiceWorkerMetrics::EventType; 34 using EventType = ServiceWorkerMetrics::EventType;
30 EventType ResourceTypeToEventType(ResourceType resource_type) { 35 EventType ResourceTypeToEventType(ResourceType resource_type) {
31 switch (resource_type) { 36 switch (resource_type) {
32 case RESOURCE_TYPE_MAIN_FRAME: 37 case RESOURCE_TYPE_MAIN_FRAME:
33 return EventType::FETCH_MAIN_FRAME; 38 return EventType::FETCH_MAIN_FRAME;
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 net_log_.EndEvent( 270 net_log_.EndEvent(
266 net::NetLogEventType::SERVICE_WORKER_DISPATCH_FETCH_EVENT, 271 net::NetLogEventType::SERVICE_WORKER_DISPATCH_FETCH_EVENT,
267 base::Bind(&NetLogFetchEventCallback, status, fetch_result)); 272 base::Bind(&NetLogFetchEventCallback, status, fetch_result));
268 273
269 FetchCallback fetch_callback = fetch_callback_; 274 FetchCallback fetch_callback = fetch_callback_;
270 scoped_refptr<ServiceWorkerVersion> version = version_; 275 scoped_refptr<ServiceWorkerVersion> version = version_;
271 fetch_callback.Run(status, fetch_result, response, version); 276 fetch_callback.Run(status, fetch_result, response, version);
272 } 277 }
273 278
274 void ServiceWorkerFetchDispatcher::MaybeStartNavigationPreload( 279 void ServiceWorkerFetchDispatcher::MaybeStartNavigationPreload(
275 net::URLRequest* original_request) { 280 net::URLRequest* original_request,
281 const MojoURLLoaderFactoryGetter& url_loader_factory_getter) {
276 if (resource_type_ != RESOURCE_TYPE_MAIN_FRAME && 282 if (resource_type_ != RESOURCE_TYPE_MAIN_FRAME &&
277 resource_type_ != RESOURCE_TYPE_SUB_FRAME) { 283 resource_type_ != RESOURCE_TYPE_SUB_FRAME) {
278 return; 284 return;
279 } 285 }
280 if (!version_->navigation_preload_enabled()) 286 if (!version_->navigation_preload_enabled())
281 return; 287 return;
282 // TODO(horo): Implement this to start the preload request for the navigation 288 // TODO(horo): Currently NavigationPreload doesn't support request body.
283 // request and set |preload_handle_|. 289 if (!request_->blob_uuid.empty())
284 NOTIMPLEMENTED(); 290 return;
291 // TODO(horo): Introduce kEnableServiceWorkerNavigationPreload switch, and use
292 // it instead of kEnableExperimentalWebPlatformFeatures.
293 if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
294 switches::kEnableExperimentalWebPlatformFeatures)) {
295 // TODO(horo): Check |version_|'s origin_trial_tokens() here if we use
296 // Origin-Trial for NavigationPreload.
297 return;
298 }
299 DCHECK(!url_loader_factory_getter.is_null());
300 mojom::URLLoaderFactoryPtr factory;
301 if (!url_loader_factory_getter.Run(mojo::GetProxy(&factory)))
302 return;
303
304 preload_handle_ = mojom::FetchEventPreloadHandle::New();
305 const ResourceRequestInfoImpl* original_info =
306 ResourceRequestInfoImpl::ForRequest(original_request);
307
308 mojom::URLLoaderClientPtr url_loader_client;
309 preload_handle_->url_loader_client_request = GetProxy(&url_loader_client);
310
311 ResourceRequest request;
312 request.method = original_request->method();
313 request.url = original_request->url();
314 request.referrer = GURL(original_request->referrer());
315 request.referrer_policy = original_info->GetReferrerPolicy();
316 request.visibility_state = original_info->GetVisibilityState();
317 request.load_flags = original_request->load_flags();
318 request.resource_type = RESOURCE_TYPE_SUB_RESOURCE;
falken 2016/10/19 06:43:18 Let's add a comment like what you said: Set to SUB
horo 2016/10/19 07:02:11 Done.
319 request.priority = original_request->priority();
320 request.skip_service_worker = SkipServiceWorker::ALL;
321 request.do_not_prompt_for_login = true;
322 request.render_frame_id = original_info->GetRenderFrameID();
323 request.is_main_frame = original_info->IsMainFrame();
324 request.parent_is_main_frame = original_info->ParentIsMainFrame();
325 const int request_id = ResourceDispatcherHostImpl::Get()->MakeRequestID();
326 DCHECK_LT(request_id, -1);
327 // TODO(horo): Add "Service-Worker-Navigation-Preload" header.
328 // See: https://github.com/w3c/ServiceWorker/issues/920#issuecomment-251150270
329 factory->CreateLoaderAndStart(GetProxy(&preload_handle_->url_loader),
330 original_info->GetRouteID(), request_id,
331 request, std::move(url_loader_client));
285 } 332 }
286 333
287 ServiceWorkerMetrics::EventType ServiceWorkerFetchDispatcher::GetEventType() 334 ServiceWorkerMetrics::EventType ServiceWorkerFetchDispatcher::GetEventType()
288 const { 335 const {
289 if (request_->fetch_type == ServiceWorkerFetchType::FOREIGN_FETCH) 336 if (request_->fetch_type == ServiceWorkerFetchType::FOREIGN_FETCH)
290 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH; 337 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH;
291 return ResourceTypeToEventType(resource_type_); 338 return ResourceTypeToEventType(resource_type_);
292 } 339 }
293 340
294 } // namespace content 341 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698