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

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

Issue 2703343002: ServiceWorker: Use mojo's data pipe for respondWith(stream) (Closed)
Patch Set: Used TEST_P to test closing the connection first and On{Aborted,Completed} first 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 46bf173b5eb584c9f76d33900ba450af7d34dc49..ebe13f01f66e68633561479a0af6561de7303010 100644
--- a/third_party/WebKit/Source/modules/serviceworkers/FetchRespondWithObserver.cpp
+++ b/third_party/WebKit/Source/modules/serviceworkers/FetchRespondWithObserver.cpp
@@ -110,17 +110,22 @@ bool isClientRequest(WebURLRequest::FrameType frameType,
requestContext == WebURLRequest::RequestContextWorker;
}
-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)
+ : m_handle(std::move(handle)) {}
+
+ void didFetchDataLoadedDataPipe() override { m_handle->completed(); }
+ void didFetchDataLoadFailed() override { m_handle->aborted(); }
DEFINE_INLINE_TRACE() { FetchDataLoader::Client::trace(visitor); }
+
+ private:
+ std::unique_ptr<WebServiceWorkerStreamHandle> m_handle;
};
} // namespace
@@ -151,7 +156,8 @@ void FetchRespondWithObserver::onResponseRejected(
WebServiceWorkerResponse webResponse;
webResponse.setError(error);
ServiceWorkerGlobalScopeClient::from(getExecutionContext())
- ->respondToFetchEvent(m_eventID, webResponse, m_eventDispatchTime);
+ ->respondToFetchEventWithResponse(m_eventID, webResponse,
+ m_eventDispatchTime);
}
void FetchRespondWithObserver::onResponseFulfilled(const ScriptValue& value) {
@@ -217,16 +223,35 @@ void FetchRespondWithObserver::onResponseFulfilled(const ScriptValue& value) {
RefPtr<BlobDataHandle> blobDataHandle = buffer->drainAsBlobDataHandle(
BytesConsumer::BlobSizePolicy::AllowBlobWithInvalidSize);
if (blobDataHandle) {
+ // Handle the blob response.
webResponse.setBlobDataHandle(blobDataHandle);
+ ServiceWorkerGlobalScopeClient::from(getExecutionContext())
+ ->respondToFetchEventWithResponse(m_eventID, webResponse,
+ m_eventDispatchTime);
+ return;
} else {
- Stream* outStream = Stream::create(getExecutionContext(), "");
- webResponse.setStreamURL(outStream->url());
- buffer->startLoading(FetchDataLoader::createLoaderAsStream(outStream),
- new NoopLoaderClient);
+ // Handle the stream response.
+ mojo::DataPipe dataPipe;
+ DCHECK(dataPipe.producer_handle.is_valid());
+ DCHECK(dataPipe.consumer_handle.is_valid());
+
+ std::unique_ptr<WebServiceWorkerStreamHandle> streamHandle =
+ WTF::makeUnique<WebServiceWorkerStreamHandle>(
+ std::move(dataPipe.consumer_handle));
+ WebServiceWorkerStreamHandle* streamHandleRawptr = streamHandle.get();
+
+ buffer->startLoading(FetchDataLoader::createLoaderAsDataPipe(
+ std::move(dataPipe.producer_handle)),
+ new FetchLoaderClient(std::move(streamHandle)));
+ ServiceWorkerGlobalScopeClient::from(getExecutionContext())
+ ->respondToFetchEventWithResponseStream(
+ m_eventID, webResponse, streamHandleRawptr, m_eventDispatchTime);
+ return;
}
}
ServiceWorkerGlobalScopeClient::from(getExecutionContext())
- ->respondToFetchEvent(m_eventID, webResponse, m_eventDispatchTime);
+ ->respondToFetchEventWithResponse(m_eventID, webResponse,
+ m_eventDispatchTime);
}
void FetchRespondWithObserver::onNoResponse() {

Powered by Google App Engine
This is Rietveld 408576698