Index: content/renderer/service_worker/service_worker_context_client.cc |
diff --git a/content/renderer/service_worker/service_worker_context_client.cc b/content/renderer/service_worker/service_worker_context_client.cc |
index 097d14c961bf45379c780382ce950e34577b3177..b69364f7c462e84f05b68b0d1ebbed85912b8074 100644 |
--- a/content/renderer/service_worker/service_worker_context_client.cc |
+++ b/content/renderer/service_worker/service_worker_context_client.cc |
@@ -280,6 +280,8 @@ struct ServiceWorkerContextClient::WorkerContextData { |
using PushEventCallbacksMap = |
IDMap<std::unique_ptr<const DispatchPushEventCallback>>; |
using FetchEventCallbacksMap = IDMap<std::unique_ptr<const FetchCallback>>; |
+ using FetchResponseReceiverMap = |
+ IDMap<std::unique_ptr<mojom::ServiceWorkerFetchResponseReceiverPtr>>; |
using ExtendableMessageEventCallbacksMap = |
IDMap<std::unique_ptr<const DispatchExtendableMessageEventCallback>>; |
using NavigationPreloadRequestsMap = IDMap< |
@@ -348,6 +350,8 @@ struct ServiceWorkerContextClient::WorkerContextData { |
// Pending callbacks for Fetch Events. |
FetchEventCallbacksMap fetch_event_callbacks; |
+ FetchResponseReceiverMap fetch_response_receivers; |
+ |
// Pending callbacks for Extendable Message Events. |
ExtendableMessageEventCallbacksMap message_event_callbacks; |
@@ -864,21 +868,45 @@ void ServiceWorkerContextClient::didHandleInstallEvent( |
void ServiceWorkerContextClient::respondToFetchEvent( |
int fetch_event_id, |
double event_dispatch_time) { |
- Send(new ServiceWorkerHostMsg_FetchEventResponse( |
- GetRoutingID(), fetch_event_id, |
- SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, ServiceWorkerResponse(), |
- base::Time::FromDoubleT(event_dispatch_time))); |
+ mojom::ServiceWorkerFetchResponseReceiverPtr* response_receiver( |
+ context_->fetch_response_receivers.Lookup(fetch_event_id)); |
+ (*response_receiver) |
+ ->OnFallback(base::Time::FromDoubleT(event_dispatch_time)); |
+ context_->fetch_response_receivers.Remove(fetch_event_id); |
} |
-void ServiceWorkerContextClient::respondToFetchEvent( |
+void ServiceWorkerContextClient::respondToFetchEventWithResponse( |
int fetch_event_id, |
const blink::WebServiceWorkerResponse& web_response, |
double event_dispatch_time) { |
- Send(new ServiceWorkerHostMsg_FetchEventResponse( |
- GetRoutingID(), fetch_event_id, |
- SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE, |
- GetServiceWorkerResponseFromWebResponse(web_response), |
- base::Time::FromDoubleT(event_dispatch_time))); |
+ ServiceWorkerResponse response( |
+ GetServiceWorkerResponseFromWebResponse(web_response)); |
+ mojom::ServiceWorkerFetchResponseReceiverPtr* response_receiver( |
+ context_->fetch_response_receivers.Lookup(fetch_event_id)); |
+ if (response.blob_uuid.size()) { |
+ Send(new ServiceWorkerHostMsg_FetchEventResponse( |
+ GetRoutingID(), fetch_event_id, response, |
+ base::Time::FromDoubleT(event_dispatch_time))); |
+ } else { |
+ (*response_receiver) |
+ ->OnResponse(response, base::Time::FromDoubleT(event_dispatch_time)); |
+ } |
+ context_->fetch_response_receivers.Remove(fetch_event_id); |
+} |
+ |
+void ServiceWorkerContextClient::respondToFetchEventWithResponseStream( |
+ int fetch_event_id, |
+ const blink::WebServiceWorkerResponse& web_response, |
+ mojo::ScopedDataPipeConsumerHandle data_stream, |
+ double event_dispatch_time) { |
+ ServiceWorkerResponse response( |
+ GetServiceWorkerResponseFromWebResponse(web_response)); |
+ mojom::ServiceWorkerFetchResponseReceiverPtr* response_receiver( |
+ context_->fetch_response_receivers.Lookup(fetch_event_id)); |
+ (*response_receiver) |
+ ->OnResponseStream(response, std::move(data_stream), |
+ base::Time::FromDoubleT(event_dispatch_time)); |
+ context_->fetch_response_receivers.Remove(fetch_event_id); |
} |
void ServiceWorkerContextClient::didHandleFetchEvent( |
@@ -1327,6 +1355,7 @@ void ServiceWorkerContextClient::DispatchFetchEvent( |
int fetch_event_id, |
const ServiceWorkerFetchRequest& request, |
mojom::FetchEventPreloadHandlePtr preload_handle, |
+ mojom::ServiceWorkerFetchResponseReceiverPtr response_receiver, |
const DispatchFetchEventCallback& callback) { |
std::unique_ptr<NavigationPreloadRequest> preload_request = |
preload_handle |
@@ -1336,6 +1365,10 @@ void ServiceWorkerContextClient::DispatchFetchEvent( |
const bool navigation_preload_sent = !!preload_request; |
TRACE_EVENT0("ServiceWorker", |
"ServiceWorkerContextClient::DispatchFetchEvent"); |
+ context_->fetch_response_receivers.AddWithID( |
+ base::MakeUnique<mojom::ServiceWorkerFetchResponseReceiverPtr>( |
+ std::move(response_receiver)), |
+ fetch_event_id); |
context_->fetch_event_callbacks.AddWithID( |
base::MakeUnique<FetchCallback>(callback), fetch_event_id); |
if (preload_request) { |