Index: third_party/WebKit/Source/modules/serviceworkers/FetchRespondWithObserver.cpp |
diff --git a/third_party/WebKit/Source/modules/serviceworkers/FetchRespondWithObserver.cpp b/third_party/WebKit/Source/modules/serviceworkers/FetchRespondWithObserver.cpp |
index 46bf173b5eb584c9f76d33900ba450af7d34dc49..bd56379f080b6cce88f8d41e97789a90af8f6986 100644 |
--- a/third_party/WebKit/Source/modules/serviceworkers/FetchRespondWithObserver.cpp |
+++ b/third_party/WebKit/Source/modules/serviceworkers/FetchRespondWithObserver.cpp |
@@ -151,7 +151,8 @@ void FetchRespondWithObserver::onResponseRejected( |
WebServiceWorkerResponse webResponse; |
webResponse.setError(error); |
ServiceWorkerGlobalScopeClient::from(getExecutionContext()) |
- ->respondToFetchEvent(m_eventID, webResponse, m_eventDispatchTime); |
+ ->respondToFetchEventWithResponse(m_eventID, webResponse, |
+ m_eventDispatchTime); |
} |
void FetchRespondWithObserver::onResponseFulfilled(const ScriptValue& value) { |
@@ -213,20 +214,36 @@ void FetchRespondWithObserver::onResponseFulfilled(const ScriptValue& value) { |
WebServiceWorkerResponse webResponse; |
response->populateWebServiceWorkerResponse(webResponse); |
BodyStreamBuffer* buffer = response->internalBodyBuffer(); |
- if (buffer) { |
+ if (!buffer) { |
+ ServiceWorkerGlobalScopeClient::from(getExecutionContext()) |
+ ->respondToFetchEventWithResponse(m_eventID, webResponse, |
+ m_eventDispatchTime); |
+ } else { |
RefPtr<BlobDataHandle> blobDataHandle = buffer->drainAsBlobDataHandle( |
BytesConsumer::BlobSizePolicy::AllowBlobWithInvalidSize); |
if (blobDataHandle) { |
webResponse.setBlobDataHandle(blobDataHandle); |
+ ServiceWorkerGlobalScopeClient::from(getExecutionContext()) |
+ ->respondToFetchEventWithResponse(m_eventID, webResponse, |
+ m_eventDispatchTime); |
} else { |
- Stream* outStream = Stream::create(getExecutionContext(), ""); |
- webResponse.setStreamURL(outStream->url()); |
- buffer->startLoading(FetchDataLoader::createLoaderAsStream(outStream), |
+ MojoCreateDataPipeOptions options; |
+ options.struct_size = sizeof(MojoCreateDataPipeOptions); |
+ options.flags = MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE; |
+ options.element_num_bytes = 1; |
+ options.capacity_num_bytes = 512 * 1024; |
+ mojo::DataPipe data_pipe(options); |
+ DCHECK(data_pipe.producer_handle.is_valid()); |
+ DCHECK(data_pipe.consumer_handle.is_valid()); |
+ buffer->startLoading(FetchDataLoader::createLoaderAsDataPipe( |
+ std::move(data_pipe.producer_handle)), |
new NoopLoaderClient); |
+ ServiceWorkerGlobalScopeClient::from(getExecutionContext()) |
+ ->respondToFetchEventWithResponseStream( |
+ m_eventID, webResponse, std::move(data_pipe.consumer_handle), |
+ m_eventDispatchTime); |
} |
} |
- ServiceWorkerGlobalScopeClient::from(getExecutionContext()) |
- ->respondToFetchEvent(m_eventID, webResponse, m_eventDispatchTime); |
} |
void FetchRespondWithObserver::onNoResponse() { |