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

Unified Diff: Source/modules/serviceworkers/RespondWithObserver.cpp

Issue 1192913007: Change BodyStreamBuffer to be FetchDataConsumerHandle-based and enable backpressure in Fetch API (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebase. Created 5 years, 5 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
« no previous file with comments | « Source/modules/fetch/ResponseTest.cpp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/modules/serviceworkers/RespondWithObserver.cpp
diff --git a/Source/modules/serviceworkers/RespondWithObserver.cpp b/Source/modules/serviceworkers/RespondWithObserver.cpp
index 755400cd922ed9397a1bef6bbfc7aaebe16579fa..b2684c1c82e854da9974cbacfaf1da094bb1d6b5 100644
--- a/Source/modules/serviceworkers/RespondWithObserver.cpp
+++ b/Source/modules/serviceworkers/RespondWithObserver.cpp
@@ -23,67 +23,6 @@
#include <v8.h>
namespace blink {
-namespace {
-
-class StreamUploader : public BodyStreamBuffer::Observer {
-public:
- StreamUploader(BodyStreamBuffer* buffer, Stream* outStream)
- : m_buffer(buffer), m_outStream(outStream)
- {
- }
- ~StreamUploader() override { }
- void onWrite() override
- {
- bool needToFlush = false;
- while (RefPtr<DOMArrayBuffer> buf = m_buffer->read()) {
- needToFlush = true;
- m_outStream->addData(static_cast<const char*>(buf->data()), buf->byteLength());
- }
- if (needToFlush)
- m_outStream->flush();
- }
- void onClose() override
- {
- m_outStream->finalize();
- cleanup();
- }
- void onError() override
- {
- // If the stream is aborted soon after the stream is registered to the
- // StreamRegistry, ServiceWorkerURLRequestJob may not notice the error
- // and continue waiting forever.
- // FIXME: Add new message to report the error to the browser process.
- m_outStream->abort();
- cleanup();
- }
- DEFINE_INLINE_TRACE()
- {
- visitor->trace(m_buffer);
- visitor->trace(m_outStream);
- BodyStreamBuffer::Observer::trace(visitor);
- }
- void start()
- {
- m_buffer->registerObserver(this);
- onWrite();
- if (m_buffer->hasError())
- return onError();
- if (m_buffer->isClosed())
- return onClose();
- }
-
-private:
- void cleanup()
- {
- m_buffer->unregisterObserver();
- m_buffer.clear();
- m_outStream.clear();
- }
- Member<BodyStreamBuffer> m_buffer;
- Member<Stream> m_outStream;
-};
-
-} // namespace
class RespondWithObserver::ThenFunction final : public ScriptFunction {
public:
@@ -204,16 +143,20 @@ void RespondWithObserver::responseWasFulfilled(const ScriptValue& value)
return;
}
response->lockBody(Body::PassBody);
- if (BodyStreamBuffer* buffer = response->internalBuffer()) {
- if (buffer == response->buffer() && response->isBodyConsumed())
- buffer = response->createDrainingStream();
+ if (OwnPtr<DrainingBodyStreamBuffer> buffer = response->createInternalDrainingStream()) {
WebServiceWorkerResponse webResponse;
response->populateWebServiceWorkerResponse(webResponse);
+ if (RefPtr<BlobDataHandle> blobDataHandle = buffer->drainAsBlobDataHandle(FetchDataConsumerHandle::Reader::AllowBlobWithInvalidSize)) {
+ webResponse.setBlobDataHandle(blobDataHandle);
+ ServiceWorkerGlobalScopeClient::from(executionContext())->didHandleFetchEvent(m_eventID, webResponse);
+ m_state = Done;
+ return;
+ }
Stream* outStream = Stream::create(executionContext(), "");
webResponse.setStreamURL(outStream->url());
ServiceWorkerGlobalScopeClient::from(executionContext())->didHandleFetchEvent(m_eventID, webResponse);
- StreamUploader* uploader = new StreamUploader(buffer, outStream);
- uploader->start();
+ FetchDataLoader* loader = FetchDataLoader::createLoaderAsStream(outStream);
+ buffer->startLoading(loader, nullptr);
m_state = Done;
return;
}
« no previous file with comments | « Source/modules/fetch/ResponseTest.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698