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

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 comments from kinuko and haraken 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 // Copy |fetch_dispatcher_| and |fetch_event_id_| for use after |this| is
340 // destroyed.
341 base::WeakPtr<ServiceWorkerFetchDispatcher> dispatcher(fetch_dispatcher_);
342 const int event_id(fetch_event_id_);
343 // FinishRequest() will delete |this|.
344 if (!version_->FinishRequest(
345 fetch_event_id_,
346 fetch_result == SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE,
347 dispatch_event_time))
348 NOTREACHED() << "Should only receive one reply per event";
349 // |dispatcher| is null if the URLRequest was killed.
350 if (!dispatcher)
351 return;
352 dispatcher->DidFinish(event_id, fetch_result, response,
353 std::move(body_as_stream));
354 }
355
307 base::WeakPtr<ServiceWorkerFetchDispatcher> fetch_dispatcher_; 356 base::WeakPtr<ServiceWorkerFetchDispatcher> fetch_dispatcher_;
308 // Owns |this|. 357 // Owns |this|.
309 ServiceWorkerVersion* version_; 358 ServiceWorkerVersion* version_;
359 const int fetch_event_id_;
360 mojo::Binding<mojom::ServiceWorkerFetchResponseCallback> binding_;
310 361
311 DISALLOW_COPY_AND_ASSIGN(ResponseCallback); 362 DISALLOW_COPY_AND_ASSIGN(ResponseCallback);
312 }; 363 };
313 364
314 // This class keeps the URL loader related assets alive while the FetchEvent is 365 // This class keeps the URL loader related assets alive while the FetchEvent is
315 // ongoing in the service worker. 366 // ongoing in the service worker.
316 class ServiceWorkerFetchDispatcher::URLLoaderAssets 367 class ServiceWorkerFetchDispatcher::URLLoaderAssets
317 : public base::RefCounted<ServiceWorkerFetchDispatcher::URLLoaderAssets> { 368 : public base::RefCounted<ServiceWorkerFetchDispatcher::URLLoaderAssets> {
318 public: 369 public:
319 URLLoaderAssets(mojom::URLLoaderFactoryPtr url_loader_factory, 370 URLLoaderAssets(mojom::URLLoaderFactoryPtr url_loader_factory,
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
447 } else { 498 } else {
448 fetch_event_id = version_->StartRequest( 499 fetch_event_id = version_->StartRequest(
449 GetEventType(), 500 GetEventType(),
450 base::Bind(&ServiceWorkerFetchDispatcher::DidFailToDispatch, 501 base::Bind(&ServiceWorkerFetchDispatcher::DidFailToDispatch,
451 weak_factory_.GetWeakPtr())); 502 weak_factory_.GetWeakPtr()));
452 event_finish_id = version_->StartRequest( 503 event_finish_id = version_->StartRequest(
453 FetchTypeToWaitUntilEventType(request_->fetch_type), 504 FetchTypeToWaitUntilEventType(request_->fetch_type),
454 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); 505 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));
455 } 506 }
456 507
457 ResponseCallback* response_callback = 508 std::unique_ptr<ResponseCallback> response_callback =
458 new ResponseCallback(weak_factory_.GetWeakPtr(), version_.get()); 509 base::MakeUnique<ResponseCallback>(weak_factory_.GetWeakPtr(),
510 version_.get(), fetch_event_id);
511 mojom::ServiceWorkerFetchResponseCallbackPtr response_callback_ptr =
512 response_callback->CreateInterfacePtrAndBind();
459 version_->RegisterRequestCallback<ServiceWorkerHostMsg_FetchEventResponse>( 513 version_->RegisterRequestCallback<ServiceWorkerHostMsg_FetchEventResponse>(
460 fetch_event_id, 514 fetch_event_id,
461 base::Bind(&ServiceWorkerFetchDispatcher::ResponseCallback::Run, 515 base::Bind(&ServiceWorkerFetchDispatcher::ResponseCallback::Run,
462 base::Owned(response_callback))); 516 base::Passed(&response_callback)));
463 517
464 if (url_loader_assets_) { 518 if (url_loader_assets_) {
465 url_loader_assets_->MayBeReportToDevTools( 519 url_loader_assets_->MayBeReportToDevTools(
466 std::make_pair( 520 std::make_pair(
467 version_->embedded_worker()->process_id(), 521 version_->embedded_worker()->process_id(),
468 version_->embedded_worker()->worker_devtools_agent_route_id()), 522 version_->embedded_worker()->worker_devtools_agent_route_id()),
469 fetch_event_id); 523 fetch_event_id);
470 } 524 }
471 525
472 // |event_dispatcher| is owned by |version_|. So it is safe to pass the 526 // |event_dispatcher| is owned by |version_|. So it is safe to pass the
473 // unretained raw pointer of |version_| to OnFetchEventFinished callback. 527 // unretained raw pointer of |version_| to OnFetchEventFinished callback.
474 // Pass |url_loader_assets_| to the callback to keep the URL loader related 528 // 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. 529 // assets alive while the FetchEvent is ongoing in the service worker.
476 version_->event_dispatcher()->DispatchFetchEvent( 530 version_->event_dispatcher()->DispatchFetchEvent(
477 fetch_event_id, *request_, std::move(preload_handle_), 531 fetch_event_id, *request_, std::move(preload_handle_),
532 std::move(response_callback_ptr),
478 base::Bind(&ServiceWorkerFetchDispatcher::OnFetchEventFinished, 533 base::Bind(&ServiceWorkerFetchDispatcher::OnFetchEventFinished,
479 base::Unretained(version_.get()), event_finish_id, 534 base::Unretained(version_.get()), event_finish_id,
480 url_loader_assets_)); 535 url_loader_assets_));
481 } 536 }
482 537
483 void ServiceWorkerFetchDispatcher::DidFailToDispatch( 538 void ServiceWorkerFetchDispatcher::DidFailToDispatch(
484 ServiceWorkerStatusCode status) { 539 ServiceWorkerStatusCode status) {
485 EndNetLogEventWithServiceWorkerStatus( 540 EndNetLogEventWithServiceWorkerStatus(
486 net_log_, net::NetLogEventType::SERVICE_WORKER_FETCH_EVENT, status); 541 net_log_, net::NetLogEventType::SERVICE_WORKER_FETCH_EVENT, status);
487 DidFail(status); 542 DidFail(status);
488 } 543 }
489 544
490 void ServiceWorkerFetchDispatcher::DidFail(ServiceWorkerStatusCode status) { 545 void ServiceWorkerFetchDispatcher::DidFail(ServiceWorkerStatusCode status) {
491 DCHECK_NE(SERVICE_WORKER_OK, status); 546 DCHECK_NE(SERVICE_WORKER_OK, status);
492 Complete(status, SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, 547 Complete(status, SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK,
493 ServiceWorkerResponse()); 548 ServiceWorkerResponse(),
549 blink::mojom::ServiceWorkerStreamHandlePtr());
494 } 550 }
495 551
496 void ServiceWorkerFetchDispatcher::DidFinish( 552 void ServiceWorkerFetchDispatcher::DidFinish(
497 int request_id, 553 int request_id,
498 ServiceWorkerFetchEventResult fetch_result, 554 ServiceWorkerFetchEventResult fetch_result,
499 const ServiceWorkerResponse& response) { 555 const ServiceWorkerResponse& response,
556 blink::mojom::ServiceWorkerStreamHandlePtr body_as_stream) {
500 net_log_.EndEvent(net::NetLogEventType::SERVICE_WORKER_FETCH_EVENT); 557 net_log_.EndEvent(net::NetLogEventType::SERVICE_WORKER_FETCH_EVENT);
501 Complete(SERVICE_WORKER_OK, fetch_result, response); 558 Complete(SERVICE_WORKER_OK, fetch_result, response,
559 std::move(body_as_stream));
502 } 560 }
503 561
504 void ServiceWorkerFetchDispatcher::Complete( 562 void ServiceWorkerFetchDispatcher::Complete(
505 ServiceWorkerStatusCode status, 563 ServiceWorkerStatusCode status,
506 ServiceWorkerFetchEventResult fetch_result, 564 ServiceWorkerFetchEventResult fetch_result,
507 const ServiceWorkerResponse& response) { 565 const ServiceWorkerResponse& response,
566 blink::mojom::ServiceWorkerStreamHandlePtr body_as_stream) {
508 DCHECK(!fetch_callback_.is_null()); 567 DCHECK(!fetch_callback_.is_null());
509 568
510 did_complete_ = true; 569 did_complete_ = true;
511 net_log_.EndEvent( 570 net_log_.EndEvent(
512 net::NetLogEventType::SERVICE_WORKER_DISPATCH_FETCH_EVENT, 571 net::NetLogEventType::SERVICE_WORKER_DISPATCH_FETCH_EVENT,
513 base::Bind(&NetLogFetchEventCallback, status, fetch_result)); 572 base::Bind(&NetLogFetchEventCallback, status, fetch_result));
514 573
515 FetchCallback fetch_callback = fetch_callback_; 574 FetchCallback fetch_callback = fetch_callback_;
516 scoped_refptr<ServiceWorkerVersion> version = version_; 575 scoped_refptr<ServiceWorkerVersion> version = version_;
517 fetch_callback.Run(status, fetch_result, response, version); 576 fetch_callback.Run(status, fetch_result, response, std::move(body_as_stream),
577 version);
518 } 578 }
519 579
520 bool ServiceWorkerFetchDispatcher::MaybeStartNavigationPreload( 580 bool ServiceWorkerFetchDispatcher::MaybeStartNavigationPreload(
521 net::URLRequest* original_request, 581 net::URLRequest* original_request,
522 base::OnceClosure on_response) { 582 base::OnceClosure on_response) {
523 if (resource_type_ != RESOURCE_TYPE_MAIN_FRAME && 583 if (resource_type_ != RESOURCE_TYPE_MAIN_FRAME &&
524 resource_type_ != RESOURCE_TYPE_SUB_FRAME) { 584 resource_type_ != RESOURCE_TYPE_SUB_FRAME) {
525 return false; 585 return false;
526 } 586 }
527 if (!version_->navigation_preload_state().enabled) 587 if (!version_->navigation_preload_state().enabled)
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
623 ServiceWorkerVersion* version, 683 ServiceWorkerVersion* version,
624 int event_finish_id, 684 int event_finish_id,
625 scoped_refptr<URLLoaderAssets> url_loader_assets, 685 scoped_refptr<URLLoaderAssets> url_loader_assets,
626 ServiceWorkerStatusCode status, 686 ServiceWorkerStatusCode status,
627 base::Time dispatch_event_time) { 687 base::Time dispatch_event_time) {
628 version->FinishRequest(event_finish_id, status != SERVICE_WORKER_ERROR_ABORT, 688 version->FinishRequest(event_finish_id, status != SERVICE_WORKER_ERROR_ABORT,
629 dispatch_event_time); 689 dispatch_event_time);
630 } 690 }
631 691
632 } // namespace content 692 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698