Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(823)

Unified Diff: third_party/WebKit/Source/modules/serviceworkers/FetchRespondWithObserver.cpp

Issue 2703343002: ServiceWorker: Use mojo's data pipe for respondWith(stream) (Closed)
Patch Set: Update comments Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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(

Powered by Google App Engine
This is Rietveld 408576698