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

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

Powered by Google App Engine
This is Rietveld 408576698