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..b0c0deb8006ff631ed6cffeb577225fcdcb994d2 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 | 
| @@ -151,10 +156,11 @@ void FetchRespondWithObserver::OnResponseRejected( | 
| // The default value of WebServiceWorkerResponse's status is 0, which maps | 
| // to a network error. | 
| - WebServiceWorkerResponse web_response; | 
| - web_response.SetError(error); | 
| + WebServiceWorkerResponse webResponse; | 
| + webResponse.SetError(error); | 
| ServiceWorkerGlobalScopeClient::From(GetExecutionContext()) | 
| - ->RespondToFetchEvent(event_id_, web_response, event_dispatch_time_); | 
| + ->RespondToFetchEventWithResponse(event_id_, webResponse, | 
| + 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(); | 
| + | 
| + buffer->StartLoading(FetchDataLoader::CreateLoaderAsDataPipe( | 
| + std::move(data_pipe.producer_handle)), | 
| + new FetchLoaderClient(std::move(stream_handle))); | 
| + ServiceWorkerGlobalScopeClient::From(GetExecutionContext()) | 
| + ->RespondToFetchEventWithResponseStream(event_id_, web_response, | 
| 
 
horo
2017/04/10 09:24:38
It is safe to call StartLoading() before RespondTo
 
shimazu
2017/04/11 01:32:58
It makes sense. Changed.
 
 | 
| + stream_handle_rawptr, | 
| + event_dispatch_time_); | 
| + return; | 
| } | 
| } | 
| ServiceWorkerGlobalScopeClient::From(GetExecutionContext()) | 
| - ->RespondToFetchEvent(event_id_, web_response, event_dispatch_time_); | 
| + ->RespondToFetchEventWithResponse(event_id_, web_response, | 
| + event_dispatch_time_); | 
| } | 
| void FetchRespondWithObserver::OnNoResponse() { |