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

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

Issue 2703343002: ServiceWorker: Use mojo's data pipe for respondWith(stream) (Closed)
Patch Set: Updated 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..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() {

Powered by Google App Engine
This is Rietveld 408576698