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 e2a70db1e29ab803780f0bea36a201533f7d6f9a..7aad68037424391da07122c9962aaf307060f949 100644 |
| --- a/third_party/WebKit/Source/modules/serviceworkers/FetchRespondWithObserver.cpp |
| +++ b/third_party/WebKit/Source/modules/serviceworkers/FetchRespondWithObserver.cpp |
| @@ -113,17 +113,22 @@ bool IsClientRequest(WebURLRequest::FrameType frame_type, |
| request_context == WebURLRequest::kRequestContextWorker; |
| } |
| -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) |
| + : handle_(std::move(handle)) {} |
| + |
| + void DidFetchDataLoadedDataPipe() override { handle_->Completed(); } |
| + void DidFetchDataLoadFailed() override { handle_->Aborted(); } |
| DEFINE_INLINE_TRACE() { FetchDataLoader::Client::Trace(visitor); } |
| + |
| + private: |
| + std::unique_ptr<WebServiceWorkerStreamHandle> handle_; |
| }; |
| } // namespace |
| @@ -154,7 +159,8 @@ void FetchRespondWithObserver::OnResponseRejected( |
| WebServiceWorkerResponse web_response; |
| web_response.SetError(error); |
| ServiceWorkerGlobalScopeClient::From(GetExecutionContext()) |
| - ->RespondToFetchEvent(event_id_, web_response, event_dispatch_time_); |
| + ->RespondToFetchEventWithResponse(event_id_, web_response, |
| + event_dispatch_time_); |
| } |
| void FetchRespondWithObserver::OnResponseFulfilled(const ScriptValue& value) { |
| @@ -222,16 +228,36 @@ void FetchRespondWithObserver::OnResponseFulfilled(const ScriptValue& value) { |
| RefPtr<BlobDataHandle> blob_data_handle = buffer->DrainAsBlobDataHandle( |
| BytesConsumer::BlobSizePolicy::kAllowBlobWithInvalidSize); |
| if (blob_data_handle) { |
| + // Handle the blob response. |
| web_response.SetBlobDataHandle(blob_data_handle); |
| + ServiceWorkerGlobalScopeClient::From(GetExecutionContext()) |
| + ->RespondToFetchEventWithResponse(event_id_, web_response, |
| + event_dispatch_time_); |
| + return; |
| } else { |
| - Stream* out_stream = Stream::Create(GetExecutionContext(), ""); |
| - web_response.SetStreamURL(out_stream->Url()); |
| - buffer->StartLoading(FetchDataLoader::CreateLoaderAsStream(out_stream), |
| - new NoopLoaderClient); |
| + // Handle the stream response. |
| + mojo::DataPipe data_pipe; |
| + DCHECK(data_pipe.producer_handle.is_valid()); |
| + DCHECK(data_pipe.consumer_handle.is_valid()); |
| + |
| + std::unique_ptr<WebServiceWorkerStreamHandle> stream_handle = |
| + WTF::MakeUnique<WebServiceWorkerStreamHandle>( |
| + std::move(data_pipe.consumer_handle)); |
| + WebServiceWorkerStreamHandle* stream_handle_rawptr = stream_handle.get(); |
|
horo
2017/04/11 05:41:53
You don't need this.
shimazu
2017/04/12 05:53:35
Thanks, you're right. Done.
|
| + ServiceWorkerGlobalScopeClient::From(GetExecutionContext()) |
| + ->RespondToFetchEventWithResponseStream(event_id_, web_response, |
| + stream_handle_rawptr, |
| + event_dispatch_time_); |
| + |
| + buffer->StartLoading(FetchDataLoader::CreateLoaderAsDataPipe( |
| + std::move(data_pipe.producer_handle)), |
| + new FetchLoaderClient(std::move(stream_handle))); |
| + return; |
| } |
| } |
| ServiceWorkerGlobalScopeClient::From(GetExecutionContext()) |
| - ->RespondToFetchEvent(event_id_, web_response, event_dispatch_time_); |
| + ->RespondToFetchEventWithResponse(event_id_, web_response, |
| + event_dispatch_time_); |
| } |
| void FetchRespondWithObserver::OnNoResponse() { |