Chromium Code Reviews| Index: content/browser/service_worker/service_worker_fetch_dispatcher.cc |
| diff --git a/content/browser/service_worker/service_worker_fetch_dispatcher.cc b/content/browser/service_worker/service_worker_fetch_dispatcher.cc |
| index 26fadcacb3e1268133f1d822838883c9c947b519..1a65d4117a66084380ec4b9f46f09a945b4362a0 100644 |
| --- a/content/browser/service_worker/service_worker_fetch_dispatcher.cc |
| +++ b/content/browser/service_worker/service_worker_fetch_dispatcher.cc |
| @@ -280,30 +280,82 @@ ServiceWorkerMetrics::EventType FetchTypeToWaitUntilEventType( |
| // Helper to receive the fetch event response even if |
| // ServiceWorkerFetchDispatcher has been destroyed. |
| -class ServiceWorkerFetchDispatcher::ResponseCallback { |
| +class ServiceWorkerFetchDispatcher::ResponseCallback |
| + : public mojom::ServiceWorkerFetchResponseCallback { |
| public: |
| ResponseCallback(base::WeakPtr<ServiceWorkerFetchDispatcher> fetch_dispatcher, |
| - ServiceWorkerVersion* version) |
| - : fetch_dispatcher_(fetch_dispatcher), version_(version) {} |
| + ServiceWorkerVersion* version, |
| + int fetch_event_id) |
| + : fetch_dispatcher_(fetch_dispatcher), |
| + version_(version), |
| + fetch_event_id_(fetch_event_id), |
| + binding_(this) {} |
| + ~ResponseCallback() override {} |
| void Run(int request_id, |
| - ServiceWorkerFetchEventResult fetch_result, |
| const ServiceWorkerResponse& response, |
| base::Time dispatch_event_time) { |
| - const bool handled = |
| - (fetch_result == SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE); |
| - if (!version_->FinishRequest(request_id, handled, dispatch_event_time)) |
| + // Legacy IPC callback is only for blob handling. |
| + DCHECK_EQ(fetch_event_id_, request_id); |
| + DCHECK(response.blob_uuid.size()); |
| + 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.
|
| NOTREACHED() << "Should only receive one reply per event"; |
| // |fetch_dispatcher| is null if the URLRequest was killed. |
| if (fetch_dispatcher_) |
| - fetch_dispatcher_->DidFinish(request_id, fetch_result, response); |
| + fetch_dispatcher_->DidFinish( |
| + request_id, SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE, response, |
| + blink::mojom::ServiceWorkerStreamHandlePtr()); |
| + } |
| + |
| + // Implements mojom::ServiceWorkerFetchResponseCallback. |
| + void OnResponse(const ServiceWorkerResponse& response, |
| + base::Time dispatch_event_time) override { |
| + HandleResponse(response, blink::mojom::ServiceWorkerStreamHandlePtr(), |
| + SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE, |
| + dispatch_event_time); |
| + } |
| + void OnResponseStream( |
| + const ServiceWorkerResponse& response, |
| + blink::mojom::ServiceWorkerStreamHandlePtr stream_handle, |
| + base::Time dispatch_event_time) override { |
| + HandleResponse(response, std::move(stream_handle), |
| + SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE, |
| + dispatch_event_time); |
| + } |
| + void OnFallback(base::Time dispatch_event_time) override { |
| + HandleResponse( |
| + ServiceWorkerResponse(), blink::mojom::ServiceWorkerStreamHandlePtr(), |
| + SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, dispatch_event_time); |
| + } |
| + |
| + mojom::ServiceWorkerFetchResponseCallbackPtr CreateInterfacePtrAndBind() { |
| + return binding_.CreateInterfacePtrAndBind(); |
| } |
| private: |
| + void HandleResponse(const ServiceWorkerResponse& response, |
| + blink::mojom::ServiceWorkerStreamHandlePtr stream_handle, |
| + ServiceWorkerFetchEventResult fetch_result, |
| + base::Time dispatch_event_time) { |
| + // Protects |fetch_dispatcher_|. |
| + base::WeakPtr<ServiceWorkerFetchDispatcher> dispatcher(fetch_dispatcher_); |
| + const int event_id(fetch_event_id_); |
| + // FinishRequest() will delete |this|. |
| + 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.
|
| + NOTREACHED() << "Should only receive one reply per event"; |
| + // |dispatcher| is null if the URLRequest was killed. |
| + if (!dispatcher) |
| + return; |
| + dispatcher->DidFinish(event_id, fetch_result, response, |
| + std::move(stream_handle)); |
| + } |
| + |
| base::WeakPtr<ServiceWorkerFetchDispatcher> fetch_dispatcher_; |
| // Owns |this|. |
| ServiceWorkerVersion* version_; |
| + const int fetch_event_id_; |
| + mojo::Binding<mojom::ServiceWorkerFetchResponseCallback> binding_; |
| DISALLOW_COPY_AND_ASSIGN(ResponseCallback); |
| }; |
| @@ -451,12 +503,15 @@ void ServiceWorkerFetchDispatcher::DispatchFetchEvent() { |
| base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
| } |
| - ResponseCallback* response_callback = |
| - new ResponseCallback(weak_factory_.GetWeakPtr(), version_.get()); |
| + std::unique_ptr<ResponseCallback> response_callback = |
| + base::MakeUnique<ResponseCallback>(weak_factory_.GetWeakPtr(), |
| + version_.get(), fetch_event_id); |
| + mojom::ServiceWorkerFetchResponseCallbackPtr response_callback_ptr = |
| + response_callback->CreateInterfacePtrAndBind(); |
| version_->RegisterRequestCallback<ServiceWorkerHostMsg_FetchEventResponse>( |
| fetch_event_id, |
| base::Bind(&ServiceWorkerFetchDispatcher::ResponseCallback::Run, |
| - base::Owned(response_callback))); |
| + base::Passed(&response_callback))); |
| if (url_loader_assets_) { |
| url_loader_assets_->MayBeReportToDevTools( |
| @@ -472,6 +527,7 @@ void ServiceWorkerFetchDispatcher::DispatchFetchEvent() { |
| // assets alive while the FetchEvent is ongoing in the service worker. |
| version_->event_dispatcher()->DispatchFetchEvent( |
| fetch_event_id, *request_, std::move(preload_handle_), |
| + std::move(response_callback_ptr), |
| base::Bind(&ServiceWorkerFetchDispatcher::OnFetchEventFinished, |
| base::Unretained(version_.get()), event_finish_id, |
| url_loader_assets_)); |
| @@ -487,21 +543,24 @@ void ServiceWorkerFetchDispatcher::DidFailToDispatch( |
| void ServiceWorkerFetchDispatcher::DidFail(ServiceWorkerStatusCode status) { |
| DCHECK_NE(SERVICE_WORKER_OK, status); |
| Complete(status, SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, |
| - ServiceWorkerResponse()); |
| + ServiceWorkerResponse(), |
| + blink::mojom::ServiceWorkerStreamHandlePtr()); |
| } |
| void ServiceWorkerFetchDispatcher::DidFinish( |
| int request_id, |
| ServiceWorkerFetchEventResult fetch_result, |
| - const ServiceWorkerResponse& response) { |
| + const ServiceWorkerResponse& response, |
| + blink::mojom::ServiceWorkerStreamHandlePtr stream_handle) { |
| net_log_.EndEvent(net::NetLogEventType::SERVICE_WORKER_FETCH_EVENT); |
| - Complete(SERVICE_WORKER_OK, fetch_result, response); |
| + Complete(SERVICE_WORKER_OK, fetch_result, response, std::move(stream_handle)); |
| } |
| void ServiceWorkerFetchDispatcher::Complete( |
| ServiceWorkerStatusCode status, |
| ServiceWorkerFetchEventResult fetch_result, |
| - const ServiceWorkerResponse& response) { |
| + const ServiceWorkerResponse& response, |
| + blink::mojom::ServiceWorkerStreamHandlePtr stream_handle) { |
| DCHECK(!fetch_callback_.is_null()); |
| did_complete_ = true; |
| @@ -511,7 +570,8 @@ void ServiceWorkerFetchDispatcher::Complete( |
| FetchCallback fetch_callback = fetch_callback_; |
| scoped_refptr<ServiceWorkerVersion> version = version_; |
| - fetch_callback.Run(status, fetch_result, response, version); |
| + fetch_callback.Run(status, fetch_result, response, std::move(stream_handle), |
| + version); |
| } |
| bool ServiceWorkerFetchDispatcher::MaybeStartNavigationPreload( |