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