| 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..ebe13f01f66e68633561479a0af6561de7303010 100644
|
| --- a/third_party/WebKit/Source/modules/serviceworkers/FetchRespondWithObserver.cpp
|
| +++ b/third_party/WebKit/Source/modules/serviceworkers/FetchRespondWithObserver.cpp
|
| @@ -110,17 +110,22 @@ bool isClientRequest(WebURLRequest::FrameType frameType,
|
| requestContext == WebURLRequest::RequestContextWorker;
|
| }
|
|
|
| -class NoopLoaderClient final
|
| - : public GarbageCollectedFinalized<NoopLoaderClient>,
|
| +class FetchLoaderClient final
|
| + : public GarbageCollectedFinalized<FetchLoaderClient>,
|
| public FetchDataLoader::Client {
|
| - WTF_MAKE_NONCOPYABLE(NoopLoaderClient);
|
| - USING_GARBAGE_COLLECTED_MIXIN(NoopLoaderClient);
|
| + WTF_MAKE_NONCOPYABLE(FetchLoaderClient);
|
| + USING_GARBAGE_COLLECTED_MIXIN(FetchLoaderClient);
|
|
|
| public:
|
| - NoopLoaderClient() = default;
|
| - void didFetchDataLoadedStream() override {}
|
| - void didFetchDataLoadFailed() override {}
|
| + FetchLoaderClient(std::unique_ptr<WebServiceWorkerStreamHandle> handle)
|
| + : m_handle(std::move(handle)) {}
|
| +
|
| + void didFetchDataLoadedDataPipe() override { m_handle->completed(); }
|
| + void didFetchDataLoadFailed() override { m_handle->aborted(); }
|
| DEFINE_INLINE_TRACE() { FetchDataLoader::Client::trace(visitor); }
|
| +
|
| + private:
|
| + std::unique_ptr<WebServiceWorkerStreamHandle> m_handle;
|
| };
|
|
|
| } // namespace
|
| @@ -151,7 +156,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) {
|
| @@ -217,16 +223,35 @@ void FetchRespondWithObserver::onResponseFulfilled(const ScriptValue& value) {
|
| RefPtr<BlobDataHandle> blobDataHandle = buffer->drainAsBlobDataHandle(
|
| BytesConsumer::BlobSizePolicy::AllowBlobWithInvalidSize);
|
| if (blobDataHandle) {
|
| + // Handle the blob response.
|
| webResponse.setBlobDataHandle(blobDataHandle);
|
| + ServiceWorkerGlobalScopeClient::from(getExecutionContext())
|
| + ->respondToFetchEventWithResponse(m_eventID, webResponse,
|
| + m_eventDispatchTime);
|
| + return;
|
| } else {
|
| - Stream* outStream = Stream::create(getExecutionContext(), "");
|
| - webResponse.setStreamURL(outStream->url());
|
| - buffer->startLoading(FetchDataLoader::createLoaderAsStream(outStream),
|
| - new NoopLoaderClient);
|
| + // Handle the stream response.
|
| + mojo::DataPipe dataPipe;
|
| + DCHECK(dataPipe.producer_handle.is_valid());
|
| + DCHECK(dataPipe.consumer_handle.is_valid());
|
| +
|
| + std::unique_ptr<WebServiceWorkerStreamHandle> streamHandle =
|
| + WTF::makeUnique<WebServiceWorkerStreamHandle>(
|
| + std::move(dataPipe.consumer_handle));
|
| + WebServiceWorkerStreamHandle* streamHandleRawptr = streamHandle.get();
|
| +
|
| + buffer->startLoading(FetchDataLoader::createLoaderAsDataPipe(
|
| + std::move(dataPipe.producer_handle)),
|
| + new FetchLoaderClient(std::move(streamHandle)));
|
| + ServiceWorkerGlobalScopeClient::from(getExecutionContext())
|
| + ->respondToFetchEventWithResponseStream(
|
| + m_eventID, webResponse, streamHandleRawptr, m_eventDispatchTime);
|
| + return;
|
| }
|
| }
|
| ServiceWorkerGlobalScopeClient::from(getExecutionContext())
|
| - ->respondToFetchEvent(m_eventID, webResponse, m_eventDispatchTime);
|
| + ->respondToFetchEventWithResponse(m_eventID, webResponse,
|
| + m_eventDispatchTime);
|
| }
|
|
|
| void FetchRespondWithObserver::onNoResponse() {
|
|
|