| OLD | NEW |
| 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 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 273 ServiceWorkerFetchType type) { | 273 ServiceWorkerFetchType type) { |
| 274 if (type == ServiceWorkerFetchType::FOREIGN_FETCH) | 274 if (type == ServiceWorkerFetchType::FOREIGN_FETCH) |
| 275 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH_WAITUNTIL; | 275 return ServiceWorkerMetrics::EventType::FOREIGN_FETCH_WAITUNTIL; |
| 276 return ServiceWorkerMetrics::EventType::FETCH_WAITUNTIL; | 276 return ServiceWorkerMetrics::EventType::FETCH_WAITUNTIL; |
| 277 } | 277 } |
| 278 | 278 |
| 279 } // namespace | 279 } // namespace |
| 280 | 280 |
| 281 // Helper to receive the fetch event response even if | 281 // Helper to receive the fetch event response even if |
| 282 // ServiceWorkerFetchDispatcher has been destroyed. | 282 // ServiceWorkerFetchDispatcher has been destroyed. |
| 283 class ServiceWorkerFetchDispatcher::ResponseCallback { | 283 class ServiceWorkerFetchDispatcher::ResponseCallback |
| 284 : public mojom::ServiceWorkerFetchResponseCallback { |
| 284 public: | 285 public: |
| 285 ResponseCallback(base::WeakPtr<ServiceWorkerFetchDispatcher> fetch_dispatcher, | 286 ResponseCallback(base::WeakPtr<ServiceWorkerFetchDispatcher> fetch_dispatcher, |
| 286 ServiceWorkerVersion* version) | 287 ServiceWorkerVersion* version, |
| 287 : fetch_dispatcher_(fetch_dispatcher), version_(version) {} | 288 int fetch_event_id) |
| 289 : fetch_dispatcher_(fetch_dispatcher), |
| 290 version_(version), |
| 291 fetch_event_id_(fetch_event_id), |
| 292 binding_(this) {} |
| 293 ~ResponseCallback() override {} |
| 288 | 294 |
| 289 void Run(int request_id, | 295 void Run(int request_id, |
| 290 ServiceWorkerFetchEventResult fetch_result, | |
| 291 const ServiceWorkerResponse& response, | 296 const ServiceWorkerResponse& response, |
| 292 base::Time dispatch_event_time) { | 297 base::Time dispatch_event_time) { |
| 293 const bool handled = | 298 // Legacy IPC callback is only for blob handling. |
| 294 (fetch_result == SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE); | 299 DCHECK_EQ(fetch_event_id_, request_id); |
| 295 if (!version_->FinishRequest(request_id, handled, dispatch_event_time)) | 300 DCHECK(response.blob_uuid.size()); |
| 296 NOTREACHED() << "Should only receive one reply per event"; | 301 HandleResponse(response, blink::mojom::ServiceWorkerStreamHandlePtr(), |
| 302 SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE, |
| 303 dispatch_event_time); |
| 304 } |
| 297 | 305 |
| 298 // |fetch_dispatcher| is null if the URLRequest was killed. | 306 // Implements mojom::ServiceWorkerFetchResponseCallback. |
| 299 if (fetch_dispatcher_) | 307 void OnResponse(const ServiceWorkerResponse& response, |
| 300 fetch_dispatcher_->DidFinish(request_id, fetch_result, response); | 308 base::Time dispatch_event_time) override { |
| 309 HandleResponse(response, blink::mojom::ServiceWorkerStreamHandlePtr(), |
| 310 SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE, |
| 311 dispatch_event_time); |
| 312 } |
| 313 void OnResponseStream( |
| 314 const ServiceWorkerResponse& response, |
| 315 blink::mojom::ServiceWorkerStreamHandlePtr stream_handle, |
| 316 base::Time dispatch_event_time) override { |
| 317 HandleResponse(response, std::move(stream_handle), |
| 318 SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE, |
| 319 dispatch_event_time); |
| 320 } |
| 321 void OnFallback(base::Time dispatch_event_time) override { |
| 322 HandleResponse( |
| 323 ServiceWorkerResponse(), blink::mojom::ServiceWorkerStreamHandlePtr(), |
| 324 SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, dispatch_event_time); |
| 325 } |
| 326 |
| 327 mojom::ServiceWorkerFetchResponseCallbackPtr CreateInterfacePtrAndBind() { |
| 328 return binding_.CreateInterfacePtrAndBind(); |
| 301 } | 329 } |
| 302 | 330 |
| 303 private: | 331 private: |
| 332 void HandleResponse(const ServiceWorkerResponse& response, |
| 333 blink::mojom::ServiceWorkerStreamHandlePtr stream_handle, |
| 334 ServiceWorkerFetchEventResult fetch_result, |
| 335 base::Time dispatch_event_time) { |
| 336 // Protects |fetch_dispatcher_|. |
| 337 base::WeakPtr<ServiceWorkerFetchDispatcher> dispatcher(fetch_dispatcher_); |
| 338 const int event_id(fetch_event_id_); |
| 339 // FinishRequest() will delete |this|. |
| 340 if (!version_->FinishRequest( |
| 341 fetch_event_id_, |
| 342 fetch_result == SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE, |
| 343 dispatch_event_time)) |
| 344 NOTREACHED() << "Should only receive one reply per event"; |
| 345 // |dispatcher| is null if the URLRequest was killed. |
| 346 if (!dispatcher) |
| 347 return; |
| 348 dispatcher->DidFinish(event_id, fetch_result, response, |
| 349 std::move(stream_handle)); |
| 350 } |
| 351 |
| 304 base::WeakPtr<ServiceWorkerFetchDispatcher> fetch_dispatcher_; | 352 base::WeakPtr<ServiceWorkerFetchDispatcher> fetch_dispatcher_; |
| 305 // Owns |this|. | 353 // Owns |this|. |
| 306 ServiceWorkerVersion* version_; | 354 ServiceWorkerVersion* version_; |
| 355 const int fetch_event_id_; |
| 356 mojo::Binding<mojom::ServiceWorkerFetchResponseCallback> binding_; |
| 307 | 357 |
| 308 DISALLOW_COPY_AND_ASSIGN(ResponseCallback); | 358 DISALLOW_COPY_AND_ASSIGN(ResponseCallback); |
| 309 }; | 359 }; |
| 310 | 360 |
| 311 // This class keeps the URL loader related assets alive while the FetchEvent is | 361 // This class keeps the URL loader related assets alive while the FetchEvent is |
| 312 // ongoing in the service worker. | 362 // ongoing in the service worker. |
| 313 class ServiceWorkerFetchDispatcher::URLLoaderAssets | 363 class ServiceWorkerFetchDispatcher::URLLoaderAssets |
| 314 : public base::RefCounted<ServiceWorkerFetchDispatcher::URLLoaderAssets> { | 364 : public base::RefCounted<ServiceWorkerFetchDispatcher::URLLoaderAssets> { |
| 315 public: | 365 public: |
| 316 URLLoaderAssets(mojom::URLLoaderFactoryPtr url_loader_factory, | 366 URLLoaderAssets(mojom::URLLoaderFactoryPtr url_loader_factory, |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 444 } else { | 494 } else { |
| 445 fetch_event_id = version_->StartRequest( | 495 fetch_event_id = version_->StartRequest( |
| 446 GetEventType(), | 496 GetEventType(), |
| 447 base::Bind(&ServiceWorkerFetchDispatcher::DidFailToDispatch, | 497 base::Bind(&ServiceWorkerFetchDispatcher::DidFailToDispatch, |
| 448 weak_factory_.GetWeakPtr())); | 498 weak_factory_.GetWeakPtr())); |
| 449 event_finish_id = version_->StartRequest( | 499 event_finish_id = version_->StartRequest( |
| 450 FetchTypeToWaitUntilEventType(request_->fetch_type), | 500 FetchTypeToWaitUntilEventType(request_->fetch_type), |
| 451 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); | 501 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
| 452 } | 502 } |
| 453 | 503 |
| 454 ResponseCallback* response_callback = | 504 std::unique_ptr<ResponseCallback> response_callback = |
| 455 new ResponseCallback(weak_factory_.GetWeakPtr(), version_.get()); | 505 base::MakeUnique<ResponseCallback>(weak_factory_.GetWeakPtr(), |
| 506 version_.get(), fetch_event_id); |
| 507 mojom::ServiceWorkerFetchResponseCallbackPtr response_callback_ptr = |
| 508 response_callback->CreateInterfacePtrAndBind(); |
| 456 version_->RegisterRequestCallback<ServiceWorkerHostMsg_FetchEventResponse>( | 509 version_->RegisterRequestCallback<ServiceWorkerHostMsg_FetchEventResponse>( |
| 457 fetch_event_id, | 510 fetch_event_id, |
| 458 base::Bind(&ServiceWorkerFetchDispatcher::ResponseCallback::Run, | 511 base::Bind(&ServiceWorkerFetchDispatcher::ResponseCallback::Run, |
| 459 base::Owned(response_callback))); | 512 base::Passed(&response_callback))); |
| 460 | 513 |
| 461 if (url_loader_assets_) { | 514 if (url_loader_assets_) { |
| 462 url_loader_assets_->MayBeReportToDevTools( | 515 url_loader_assets_->MayBeReportToDevTools( |
| 463 std::make_pair( | 516 std::make_pair( |
| 464 version_->embedded_worker()->process_id(), | 517 version_->embedded_worker()->process_id(), |
| 465 version_->embedded_worker()->worker_devtools_agent_route_id()), | 518 version_->embedded_worker()->worker_devtools_agent_route_id()), |
| 466 fetch_event_id); | 519 fetch_event_id); |
| 467 } | 520 } |
| 468 | 521 |
| 469 // |event_dispatcher| is owned by |version_|. So it is safe to pass the | 522 // |event_dispatcher| is owned by |version_|. So it is safe to pass the |
| 470 // unretained raw pointer of |version_| to OnFetchEventFinished callback. | 523 // unretained raw pointer of |version_| to OnFetchEventFinished callback. |
| 471 // Pass |url_loader_assets_| to the callback to keep the URL loader related | 524 // Pass |url_loader_assets_| to the callback to keep the URL loader related |
| 472 // assets alive while the FetchEvent is ongoing in the service worker. | 525 // assets alive while the FetchEvent is ongoing in the service worker. |
| 473 version_->event_dispatcher()->DispatchFetchEvent( | 526 version_->event_dispatcher()->DispatchFetchEvent( |
| 474 fetch_event_id, *request_, std::move(preload_handle_), | 527 fetch_event_id, *request_, std::move(preload_handle_), |
| 528 std::move(response_callback_ptr), |
| 475 base::Bind(&ServiceWorkerFetchDispatcher::OnFetchEventFinished, | 529 base::Bind(&ServiceWorkerFetchDispatcher::OnFetchEventFinished, |
| 476 base::Unretained(version_.get()), event_finish_id, | 530 base::Unretained(version_.get()), event_finish_id, |
| 477 url_loader_assets_)); | 531 url_loader_assets_)); |
| 478 } | 532 } |
| 479 | 533 |
| 480 void ServiceWorkerFetchDispatcher::DidFailToDispatch( | 534 void ServiceWorkerFetchDispatcher::DidFailToDispatch( |
| 481 ServiceWorkerStatusCode status) { | 535 ServiceWorkerStatusCode status) { |
| 482 EndNetLogEventWithServiceWorkerStatus( | 536 EndNetLogEventWithServiceWorkerStatus( |
| 483 net_log_, net::NetLogEventType::SERVICE_WORKER_FETCH_EVENT, status); | 537 net_log_, net::NetLogEventType::SERVICE_WORKER_FETCH_EVENT, status); |
| 484 DidFail(status); | 538 DidFail(status); |
| 485 } | 539 } |
| 486 | 540 |
| 487 void ServiceWorkerFetchDispatcher::DidFail(ServiceWorkerStatusCode status) { | 541 void ServiceWorkerFetchDispatcher::DidFail(ServiceWorkerStatusCode status) { |
| 488 DCHECK_NE(SERVICE_WORKER_OK, status); | 542 DCHECK_NE(SERVICE_WORKER_OK, status); |
| 489 Complete(status, SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, | 543 Complete(status, SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, |
| 490 ServiceWorkerResponse()); | 544 ServiceWorkerResponse(), |
| 545 blink::mojom::ServiceWorkerStreamHandlePtr()); |
| 491 } | 546 } |
| 492 | 547 |
| 493 void ServiceWorkerFetchDispatcher::DidFinish( | 548 void ServiceWorkerFetchDispatcher::DidFinish( |
| 494 int request_id, | 549 int request_id, |
| 495 ServiceWorkerFetchEventResult fetch_result, | 550 ServiceWorkerFetchEventResult fetch_result, |
| 496 const ServiceWorkerResponse& response) { | 551 const ServiceWorkerResponse& response, |
| 552 blink::mojom::ServiceWorkerStreamHandlePtr stream_handle) { |
| 497 net_log_.EndEvent(net::NetLogEventType::SERVICE_WORKER_FETCH_EVENT); | 553 net_log_.EndEvent(net::NetLogEventType::SERVICE_WORKER_FETCH_EVENT); |
| 498 Complete(SERVICE_WORKER_OK, fetch_result, response); | 554 Complete(SERVICE_WORKER_OK, fetch_result, response, std::move(stream_handle)); |
| 499 } | 555 } |
| 500 | 556 |
| 501 void ServiceWorkerFetchDispatcher::Complete( | 557 void ServiceWorkerFetchDispatcher::Complete( |
| 502 ServiceWorkerStatusCode status, | 558 ServiceWorkerStatusCode status, |
| 503 ServiceWorkerFetchEventResult fetch_result, | 559 ServiceWorkerFetchEventResult fetch_result, |
| 504 const ServiceWorkerResponse& response) { | 560 const ServiceWorkerResponse& response, |
| 561 blink::mojom::ServiceWorkerStreamHandlePtr stream_handle) { |
| 505 DCHECK(!fetch_callback_.is_null()); | 562 DCHECK(!fetch_callback_.is_null()); |
| 506 | 563 |
| 507 did_complete_ = true; | 564 did_complete_ = true; |
| 508 net_log_.EndEvent( | 565 net_log_.EndEvent( |
| 509 net::NetLogEventType::SERVICE_WORKER_DISPATCH_FETCH_EVENT, | 566 net::NetLogEventType::SERVICE_WORKER_DISPATCH_FETCH_EVENT, |
| 510 base::Bind(&NetLogFetchEventCallback, status, fetch_result)); | 567 base::Bind(&NetLogFetchEventCallback, status, fetch_result)); |
| 511 | 568 |
| 512 FetchCallback fetch_callback = fetch_callback_; | 569 FetchCallback fetch_callback = fetch_callback_; |
| 513 scoped_refptr<ServiceWorkerVersion> version = version_; | 570 scoped_refptr<ServiceWorkerVersion> version = version_; |
| 514 fetch_callback.Run(status, fetch_result, response, version); | 571 fetch_callback.Run(status, fetch_result, response, std::move(stream_handle), |
| 572 version); |
| 515 } | 573 } |
| 516 | 574 |
| 517 bool ServiceWorkerFetchDispatcher::MaybeStartNavigationPreload( | 575 bool ServiceWorkerFetchDispatcher::MaybeStartNavigationPreload( |
| 518 net::URLRequest* original_request, | 576 net::URLRequest* original_request, |
| 519 base::OnceClosure on_response) { | 577 base::OnceClosure on_response) { |
| 520 if (resource_type_ != RESOURCE_TYPE_MAIN_FRAME && | 578 if (resource_type_ != RESOURCE_TYPE_MAIN_FRAME && |
| 521 resource_type_ != RESOURCE_TYPE_SUB_FRAME) { | 579 resource_type_ != RESOURCE_TYPE_SUB_FRAME) { |
| 522 return false; | 580 return false; |
| 523 } | 581 } |
| 524 if (!version_->navigation_preload_state().enabled) | 582 if (!version_->navigation_preload_state().enabled) |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 624 ServiceWorkerVersion* version, | 682 ServiceWorkerVersion* version, |
| 625 int event_finish_id, | 683 int event_finish_id, |
| 626 scoped_refptr<URLLoaderAssets> url_loader_assets, | 684 scoped_refptr<URLLoaderAssets> url_loader_assets, |
| 627 ServiceWorkerStatusCode status, | 685 ServiceWorkerStatusCode status, |
| 628 base::Time dispatch_event_time) { | 686 base::Time dispatch_event_time) { |
| 629 version->FinishRequest(event_finish_id, status != SERVICE_WORKER_ERROR_ABORT, | 687 version->FinishRequest(event_finish_id, status != SERVICE_WORKER_ERROR_ABORT, |
| 630 dispatch_event_time); | 688 dispatch_event_time); |
| 631 } | 689 } |
| 632 | 690 |
| 633 } // namespace content | 691 } // namespace content |
| OLD | NEW |