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

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

Issue 2410333006: Implement ServiceWorkerFetchDispatcher::MaybeStartNavigationPreload(). (Closed)
Patch Set: add comment about switch 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"
19 #include "content/common/service_worker/service_worker_utils.h" 21 #include "content/common/service_worker/service_worker_utils.h"
22 #include "content/common/url_loader.mojom.h"
23 #include "content/common/url_loader_factory.mojom.h"
20 #include "net/log/net_log.h" 24 #include "net/log/net_log.h"
21 #include "net/log/net_log_capture_mode.h" 25 #include "net/log/net_log_capture_mode.h"
22
23 #include "net/log/net_log_event_type.h" 26 #include "net/log/net_log_event_type.h"
27 #include "net/url_request/url_request.h"
24 28
25 namespace content { 29 namespace content {
26 30
27 namespace { 31 namespace {
28 32
29 using EventType = ServiceWorkerMetrics::EventType; 33 using EventType = ServiceWorkerMetrics::EventType;
30 EventType ResourceTypeToEventType(ResourceType resource_type) { 34 EventType ResourceTypeToEventType(ResourceType resource_type) {
31 switch (resource_type) { 35 switch (resource_type) {
32 case RESOURCE_TYPE_MAIN_FRAME: 36 case RESOURCE_TYPE_MAIN_FRAME:
33 return EventType::FETCH_MAIN_FRAME; 37 return EventType::FETCH_MAIN_FRAME;
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 net_log_.EndEvent( 269 net_log_.EndEvent(
266 net::NetLogEventType::SERVICE_WORKER_DISPATCH_FETCH_EVENT, 270 net::NetLogEventType::SERVICE_WORKER_DISPATCH_FETCH_EVENT,
267 base::Bind(&NetLogFetchEventCallback, status, fetch_result)); 271 base::Bind(&NetLogFetchEventCallback, status, fetch_result));
268 272
269 FetchCallback fetch_callback = fetch_callback_; 273 FetchCallback fetch_callback = fetch_callback_;
270 scoped_refptr<ServiceWorkerVersion> version = version_; 274 scoped_refptr<ServiceWorkerVersion> version = version_;
271 fetch_callback.Run(status, fetch_result, response, version); 275 fetch_callback.Run(status, fetch_result, response, version);
272 } 276 }
273 277
274 void ServiceWorkerFetchDispatcher::MaybeStartNavigationPreload( 278 void ServiceWorkerFetchDispatcher::MaybeStartNavigationPreload(
275 net::URLRequest* original_request) { 279 net::URLRequest* original_request,
280 const URLLoaderFactoryCallback& url_loader_factory_callback) {
276 if (resource_type_ != RESOURCE_TYPE_MAIN_FRAME && 281 if (resource_type_ != RESOURCE_TYPE_MAIN_FRAME &&
277 resource_type_ != RESOURCE_TYPE_SUB_FRAME) { 282 resource_type_ != RESOURCE_TYPE_SUB_FRAME) {
278 return; 283 return;
279 } 284 }
280 if (!version_->navigation_preload_enabled()) 285 if (!version_->navigation_preload_enabled())
281 return; 286 return;
282 // TODO(horo): Implement this to start the preload request for the navigation 287 // TODO(horo): Currently NavigationPreload doesn't support request body.
283 // request and set |preload_handle_|. 288 if (!request_->blob_uuid.empty())
284 NOTIMPLEMENTED(); 289 return;
290 // TODO(horo): Introduce kEnableServiceWorkerNavigationPreload switch, and use
291 // it instead of kEnableExperimentalWebPlatformFeatures.
292 if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
293 switches::kEnableExperimentalWebPlatformFeatures)) {
294 // TODO(horo): Check |version_|'s origin_trial_tokens() here if we use
295 // Origin-Trial for NavigationPreload.
296 return;
297 }
298 DCHECK(!url_loader_factory_callback.is_null());
299 mojom::URLLoaderFactoryPtr factory;
300 if (!url_loader_factory_callback.Run(mojo::GetProxy(&factory)))
301 return;
302
303 preload_handle_ = mojom::FetchEventPreloadHandle::New();
304 const ResourceRequestInfoImpl* original_info =
305 ResourceRequestInfoImpl::ForRequest(original_request);
306
307 mojom::URLLoaderClientPtr url_loader_client;
308 preload_handle_->url_loader_client_request = GetProxy(&url_loader_client);
309
310 ResourceRequest request;
311 request.method = original_request->method();
312 request.url = original_request->url();
313 request.referrer = GURL(original_request->referrer());
314 request.referrer_policy = original_info->GetReferrerPolicy();
315 request.visibility_state = original_info->GetVisibilityState();
316 request.load_flags = original_request->load_flags();
317 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
318 request.priority = original_request->priority();
319 request.skip_service_worker = SkipServiceWorker::ALL;
320 request.do_not_prompt_for_login = true;
321 request.render_frame_id = original_info->GetRenderFrameID();
322 request.is_main_frame = original_info->IsMainFrame();
323 request.parent_is_main_frame = original_info->ParentIsMainFrame();
324 const int request_id = ResourceDispatcherHostImpl::Get()->MakeRequestID();
325 DCHECK(request_id <= -2);
falken 2016/10/19 05:11:28 nit: DCHECK_LT -1?
horo 2016/10/19 06:22:52 Done.
326 // TODO(horo): Add "Service-Worker-Navigation-Preload" header.
327 // See: https://github.com/w3c/ServiceWorker/issues/920#issuecomment-251150270
328 factory->CreateLoaderAndStart(GetProxy(&preload_handle_->url_loader),
329 original_info->GetRouteID(), request_id,
330 request, std::move(url_loader_client));
285 } 331 }
286 332
287 ServiceWorkerMetrics::EventType ServiceWorkerFetchDispatcher::GetEventType() 333 ServiceWorkerMetrics::EventType ServiceWorkerFetchDispatcher::GetEventType()
288 const { 334 const {
289 if (request_->fetch_type == ServiceWorkerFetchType::FOREIGN_FETCH) 335 if (request_->fetch_type == ServiceWorkerFetchType::FOREIGN_FETCH)
290 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH; 336 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH;
291 return ResourceTypeToEventType(resource_type_); 337 return ResourceTypeToEventType(resource_type_);
292 } 338 }
293 339
294 } // namespace content 340 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698