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..c0b66eff6a942489d95cc59012da3bf85d8bd706 100644 | 
| --- a/third_party/WebKit/Source/modules/serviceworkers/FetchRespondWithObserver.cpp | 
| +++ b/third_party/WebKit/Source/modules/serviceworkers/FetchRespondWithObserver.cpp | 
| @@ -113,17 +113,23 @@ bool IsClientRequest(WebURLRequest::FrameType frame_type, | 
| request_context == WebURLRequest::kRequestContextWorker; | 
| } | 
| -class NoopLoaderClient final | 
| - : public GarbageCollectedFinalized<NoopLoaderClient>, | 
| +class FetchLoaderClient final | 
| 
 
haraken
2017/04/13 05:03:44
Would it be possible to remove this wrapper class
 
haraken
2017/04/13 05:05:14
Correction: It would be nicer if we can remove bot
 
shimazu
2017/04/18 01:50:05
IIUC, WebServiceWorkerStreamHandle cannot inherit
 
 | 
| + : 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) | 
| 
 
haraken
2017/04/13 05:03:44
Add explicit.
 
shimazu
2017/04/18 01:50:05
Done.
 
 | 
| + : 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 +160,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 +229,35 @@ 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 { | 
| 
 
falken
2017/04/12 08:00:16
else isn't needed after the if() { return }
 
shimazu
2017/04/18 01:50:05
Done.
 
 | 
| - 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)); | 
| + ServiceWorkerGlobalScopeClient::From(GetExecutionContext()) | 
| + ->RespondToFetchEventWithResponseStream(event_id_, web_response, | 
| + stream_handle.get(), | 
| + 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() { |