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..bdef3497fe88e33fabb4b5ac50a9647073098ae8 100644 |
| --- a/third_party/WebKit/Source/modules/serviceworkers/FetchRespondWithObserver.cpp |
| +++ b/third_party/WebKit/Source/modules/serviceworkers/FetchRespondWithObserver.cpp |
| @@ -113,17 +113,24 @@ bool IsClientRequest(WebURLRequest::FrameType frame_type, |
| request_context == WebURLRequest::kRequestContextWorker; |
| } |
| -class NoopLoaderClient final |
| - : public GarbageCollectedFinalized<NoopLoaderClient>, |
| +class FetchLoaderClient final |
|
haraken
2017/04/19 11:29:10
Add a class-level comment. e.g., why this indirect
shimazu
2017/04/20 04:20:42
Done.
|
| + : 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 {} |
| + explicit 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 |
| @@ -222,13 +229,29 @@ 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); |
| - } else { |
| - Stream* out_stream = Stream::Create(GetExecutionContext(), ""); |
| - web_response.SetStreamURL(out_stream->Url()); |
| - buffer->StartLoading(FetchDataLoader::CreateLoaderAsStream(out_stream), |
| - new NoopLoaderClient); |
| + ServiceWorkerGlobalScopeClient::From(GetExecutionContext()) |
| + ->RespondToFetchEvent(event_id_, web_response, event_dispatch_time_); |
| + return; |
| } |
| + // 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> body_stream_handle = |
| + WTF::MakeUnique<WebServiceWorkerStreamHandle>( |
| + std::move(data_pipe.consumer_handle)); |
| + ServiceWorkerGlobalScopeClient::From(GetExecutionContext()) |
| + ->RespondToFetchEventWithResponseStream(event_id_, web_response, |
| + body_stream_handle.get(), |
| + event_dispatch_time_); |
| + |
| + buffer->StartLoading(FetchDataLoader::CreateLoaderAsDataPipe( |
| + std::move(data_pipe.producer_handle)), |
| + new FetchLoaderClient(std::move(body_stream_handle))); |
| + return; |
| } |
| ServiceWorkerGlobalScopeClient::From(GetExecutionContext()) |
| ->RespondToFetchEvent(event_id_, web_response, event_dispatch_time_); |
| @@ -236,7 +259,7 @@ void FetchRespondWithObserver::OnResponseFulfilled(const ScriptValue& value) { |
| void FetchRespondWithObserver::OnNoResponse() { |
| ServiceWorkerGlobalScopeClient::From(GetExecutionContext()) |
| - ->RespondToFetchEvent(event_id_, event_dispatch_time_); |
| + ->RespondToFetchEventWithNoResponse(event_id_, event_dispatch_time_); |
| } |
| FetchRespondWithObserver::FetchRespondWithObserver( |