Chromium Code Reviews| 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..6fb75a4251c60512dfb0de07cba6f3c67222bb59 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,36 @@ 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); |
| } else { |
| - Stream* outStream = Stream::create(getExecutionContext(), ""); |
| - webResponse.setStreamURL(outStream->url()); |
| - buffer->startLoading(FetchDataLoader::createLoaderAsStream(outStream), |
| - new NoopLoaderClient); |
| + // Handle the stream response. |
| + // MojoCreateDataPipeOptions options; |
|
shimazu
2017/04/06 03:22:16
Do you have insight for these parameters?
I think
horo
2017/04/06 05:22:09
SGTM
shimazu
2017/04/07 08:52:29
Done.
|
| + // 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 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); |
| } |
| } |
| - ServiceWorkerGlobalScopeClient::from(getExecutionContext()) |
| - ->respondToFetchEvent(m_eventID, webResponse, m_eventDispatchTime); |
| } |
| void FetchRespondWithObserver::onNoResponse() { |