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

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: (temp) alternative to calling didGetReadable in sync. Created 5 years, 6 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: Source/modules/serviceworkers/RespondWithObserver.cpp
diff --git a/Source/modules/serviceworkers/RespondWithObserver.cpp b/Source/modules/serviceworkers/RespondWithObserver.cpp
index 0754ab86355f0a26cfea1338eca57127e8c427ba..291721905f8c02873f0aadf8e60d2270911842c1 100644
--- a/Source/modules/serviceworkers/RespondWithObserver.cpp
+++ b/Source/modules/serviceworkers/RespondWithObserver.cpp
@@ -10,6 +10,7 @@
#include "bindings/core/v8/ScriptValue.h"
#include "bindings/core/v8/V8Binding.h"
#include "bindings/modules/v8/V8Response.h"
+#include "core/dom/ExceptionCode.h"
#include "core/dom/ExecutionContext.h"
#include "core/inspector/ConsoleMessage.h"
#include "core/streams/Stream.h"
@@ -22,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 +144,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;
}

Powered by Google App Engine
This is Rietveld 408576698