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

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

Issue 2645493002: Increase the lifetime of Navigation Preload related objects. (Closed)
Patch Set: check fetchEvent in ServiceWorkerGlobalScopeProxy::onNavigationPreloadError Created 3 years, 11 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"
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 ServiceWorkerMetrics::EventType FetchTypeToWaitUntilEventType( 160 ServiceWorkerMetrics::EventType FetchTypeToWaitUntilEventType(
161 ServiceWorkerFetchType type) { 161 ServiceWorkerFetchType type) {
162 if (type == ServiceWorkerFetchType::FOREIGN_FETCH) 162 if (type == ServiceWorkerFetchType::FOREIGN_FETCH)
163 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH_WAITUNTIL; 163 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH_WAITUNTIL;
164 return ServiceWorkerMetrics::EventType::FETCH_WAITUNTIL; 164 return ServiceWorkerMetrics::EventType::FETCH_WAITUNTIL;
165 } 165 }
166 166
167 void OnFetchEventFinished( 167 void OnFetchEventFinished(
168 ServiceWorkerVersion* version, 168 ServiceWorkerVersion* version,
169 int event_finish_id, 169 int event_finish_id,
170 mojom::URLLoaderFactoryPtr url_loader_factory,
171 std::unique_ptr<mojom::URLLoader> url_loader,
172 std::unique_ptr<mojom::URLLoaderClient> url_loader_client,
173 ServiceWorkerStatusCode status, 170 ServiceWorkerStatusCode status,
174 base::Time dispatch_event_time) { 171 base::Time dispatch_event_time) {
175 version->FinishRequest(event_finish_id, status != SERVICE_WORKER_ERROR_ABORT, 172 version->FinishRequest(event_finish_id, status != SERVICE_WORKER_ERROR_ABORT,
176 dispatch_event_time); 173 dispatch_event_time);
177 } 174 }
178 175
179 } // namespace 176 } // namespace
180 177
181 // Helper to receive the fetch event response even if 178 // Helper to receive the fetch event response even if
182 // ServiceWorkerFetchDispatcher has been destroyed. 179 // ServiceWorkerFetchDispatcher has been destroyed.
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
325 322
326 ResponseCallback* response_callback = 323 ResponseCallback* response_callback =
327 new ResponseCallback(weak_factory_.GetWeakPtr(), version_.get()); 324 new ResponseCallback(weak_factory_.GetWeakPtr(), version_.get());
328 version_->RegisterRequestCallback<ServiceWorkerHostMsg_FetchEventResponse>( 325 version_->RegisterRequestCallback<ServiceWorkerHostMsg_FetchEventResponse>(
329 fetch_event_id, 326 fetch_event_id,
330 base::Bind(&ServiceWorkerFetchDispatcher::ResponseCallback::Run, 327 base::Bind(&ServiceWorkerFetchDispatcher::ResponseCallback::Run,
331 base::Owned(response_callback))); 328 base::Owned(response_callback)));
332 329
333 // |event_dispatcher| is owned by |version_|. So it is safe to pass the 330 // |event_dispatcher| is owned by |version_|. So it is safe to pass the
334 // unretained raw pointer of |version_| to OnFetchEventFinished callback. 331 // unretained raw pointer of |version_| to OnFetchEventFinished callback.
335 // Pass |url_loader_factory_|, |url_Loader_| and |url_loader_client_| to the
336 // callback to keep them alive while the FetchEvent is onging in the service
337 // worker.
338 version_->event_dispatcher()->DispatchFetchEvent( 332 version_->event_dispatcher()->DispatchFetchEvent(
339 fetch_event_id, *request_, std::move(preload_handle_), 333 fetch_event_id, *request_, std::move(preload_handle_),
340 base::Bind(&OnFetchEventFinished, base::Unretained(version_.get()), 334 base::Bind(&OnFetchEventFinished, base::Unretained(version_.get()),
341 event_finish_id, base::Passed(std::move(url_loader_factory_)), 335 event_finish_id));
342 base::Passed(std::move(url_loader_)),
343 base::Passed(std::move(url_loader_client_))));
344 } 336 }
345 337
346 void ServiceWorkerFetchDispatcher::DidFailToDispatch( 338 void ServiceWorkerFetchDispatcher::DidFailToDispatch(
347 ServiceWorkerStatusCode status) { 339 ServiceWorkerStatusCode status) {
348 EndNetLogEventWithServiceWorkerStatus( 340 EndNetLogEventWithServiceWorkerStatus(
349 net_log_, net::NetLogEventType::SERVICE_WORKER_FETCH_EVENT, status); 341 net_log_, net::NetLogEventType::SERVICE_WORKER_FETCH_EVENT, status);
350 DidFail(status); 342 DidFail(status);
351 } 343 }
352 344
353 void ServiceWorkerFetchDispatcher::DidFail(ServiceWorkerStatusCode status) { 345 void ServiceWorkerFetchDispatcher::DidFail(ServiceWorkerStatusCode status) {
(...skipping 19 matching lines...) Expand all
373 did_complete_ = true; 365 did_complete_ = true;
374 net_log_.EndEvent( 366 net_log_.EndEvent(
375 net::NetLogEventType::SERVICE_WORKER_DISPATCH_FETCH_EVENT, 367 net::NetLogEventType::SERVICE_WORKER_DISPATCH_FETCH_EVENT,
376 base::Bind(&NetLogFetchEventCallback, status, fetch_result)); 368 base::Bind(&NetLogFetchEventCallback, status, fetch_result));
377 369
378 FetchCallback fetch_callback = fetch_callback_; 370 FetchCallback fetch_callback = fetch_callback_;
379 scoped_refptr<ServiceWorkerVersion> version = version_; 371 scoped_refptr<ServiceWorkerVersion> version = version_;
380 fetch_callback.Run(status, fetch_result, response, version); 372 fetch_callback.Run(status, fetch_result, response, version);
381 } 373 }
382 374
383 void ServiceWorkerFetchDispatcher::MaybeStartNavigationPreload( 375 bool ServiceWorkerFetchDispatcher::MaybeStartNavigationPreload(
384 net::URLRequest* original_request) { 376 net::URLRequest* original_request) {
385 if (resource_type_ != RESOURCE_TYPE_MAIN_FRAME && 377 if (resource_type_ != RESOURCE_TYPE_MAIN_FRAME &&
386 resource_type_ != RESOURCE_TYPE_SUB_FRAME) { 378 resource_type_ != RESOURCE_TYPE_SUB_FRAME) {
387 return; 379 return false;
388 } 380 }
389 if (!version_->navigation_preload_state().enabled) 381 if (!version_->navigation_preload_state().enabled)
390 return; 382 return false;
391 // TODO(horo): Currently NavigationPreload doesn't support request body. 383 // TODO(horo): Currently NavigationPreload doesn't support request body.
392 if (!request_->blob_uuid.empty()) 384 if (!request_->blob_uuid.empty())
393 return; 385 return false;
394 386
395 ServiceWorkerVersion::NavigationPreloadSupportStatus support_status = 387 ServiceWorkerVersion::NavigationPreloadSupportStatus support_status =
396 version_->GetNavigationPreloadSupportStatus(); 388 version_->GetNavigationPreloadSupportStatus();
397 if (support_status != 389 if (support_status !=
398 ServiceWorkerVersion::NavigationPreloadSupportStatus::SUPPORTED) { 390 ServiceWorkerVersion::NavigationPreloadSupportStatus::SUPPORTED) {
399 return; 391 return false;
400 } 392 }
401 393
402 ResourceRequestInfoImpl* original_info = 394 ResourceRequestInfoImpl* original_info =
403 ResourceRequestInfoImpl::ForRequest(original_request); 395 ResourceRequestInfoImpl::ForRequest(original_request);
404 ResourceRequesterInfo* requester_info = original_info->requester_info(); 396 ResourceRequesterInfo* requester_info = original_info->requester_info();
405 if (IsBrowserSideNavigationEnabled()) { 397 if (IsBrowserSideNavigationEnabled()) {
406 DCHECK(requester_info->IsBrowserSideNavigation()); 398 DCHECK(requester_info->IsBrowserSideNavigation());
407 } else { 399 } else {
408 DCHECK(requester_info->IsRenderer()); 400 DCHECK(requester_info->IsRenderer());
409 if (!requester_info->filter()) 401 if (!requester_info->filter())
410 return; 402 return false;
411 } 403 }
412 404
413 DCHECK(!url_loader_factory_); 405 DCHECK(!url_loader_factory_);
414 mojom::URLLoaderFactoryPtr factory; 406 mojom::URLLoaderFactoryPtr factory;
415 URLLoaderFactoryImpl::Create( 407 URLLoaderFactoryImpl::Create(
416 ResourceRequesterInfo::CreateForNavigationPreload(requester_info), 408 ResourceRequesterInfo::CreateForNavigationPreload(requester_info),
417 mojo::MakeRequest(&url_loader_factory_)); 409 mojo::MakeRequest(&url_loader_factory_));
418 410
419 preload_handle_ = mojom::FetchEventPreloadHandle::New(); 411 preload_handle_ = mojom::FetchEventPreloadHandle::New();
420 412
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
464 mojo::MakeRequest(&url_loader_associated_ptr, 456 mojo::MakeRequest(&url_loader_associated_ptr,
465 url_loader_factory_.associated_group()), 457 url_loader_factory_.associated_group()),
466 original_info->GetRouteID(), request_id, request, 458 original_info->GetRouteID(), request_id, request,
467 std::move(url_loader_client_associated_ptr_info)); 459 std::move(url_loader_client_associated_ptr_info));
468 460
469 std::unique_ptr<DelegatingURLLoader> url_loader( 461 std::unique_ptr<DelegatingURLLoader> url_loader(
470 new DelegatingURLLoader(std::move(url_loader_associated_ptr))); 462 new DelegatingURLLoader(std::move(url_loader_associated_ptr)));
471 preload_handle_->url_loader = url_loader->CreateInterfacePtrAndBind(); 463 preload_handle_->url_loader = url_loader->CreateInterfacePtrAndBind();
472 url_loader_ = std::move(url_loader); 464 url_loader_ = std::move(url_loader);
473 url_loader_client_ = std::move(url_loader_client); 465 url_loader_client_ = std::move(url_loader_client);
466 return true;
474 } 467 }
475 468
476 ServiceWorkerMetrics::EventType ServiceWorkerFetchDispatcher::GetEventType() 469 ServiceWorkerMetrics::EventType ServiceWorkerFetchDispatcher::GetEventType()
477 const { 470 const {
478 if (request_->fetch_type == ServiceWorkerFetchType::FOREIGN_FETCH) 471 if (request_->fetch_type == ServiceWorkerFetchType::FOREIGN_FETCH)
479 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH; 472 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH;
480 return ResourceTypeToEventType(resource_type_); 473 return ResourceTypeToEventType(resource_type_);
481 } 474 }
482 475
483 } // namespace content 476 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698