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

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

Issue 2703343002: ServiceWorker: Use mojo's data pipe for respondWith(stream) (Closed)
Patch Set: Addressed falken's comments Created 3 years, 8 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 265 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698