Index: Source/modules/serviceworkers/RespondWithObserver.cpp |
diff --git a/Source/modules/serviceworkers/RespondWithObserver.cpp b/Source/modules/serviceworkers/RespondWithObserver.cpp |
index 0754ab86355f0a26cfea1338eca57127e8c427ba..3cd14dc7775376b5c643c05792ff55344fa2a86b 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" |
@@ -204,15 +205,21 @@ void RespondWithObserver::responseWasFulfilled(const ScriptValue& value) |
return; |
} |
response->lockBody(Body::PassBody); |
- if (BodyStreamBuffer* buffer = response->internalBuffer()) { |
+ if (BodyStreamBuffer2* buffer = response->internalBuffer()) { |
if (buffer == response->buffer() && response->isBodyConsumed()) |
buffer = response->createDrainingStream(); |
WebServiceWorkerResponse webResponse; |
response->populateWebServiceWorkerResponse(webResponse); |
+ if (RefPtr<BlobDataHandle> blobDataHandle = buffer->handle()->obtainReader(nullptr)->drainAsBlobDataHandle()) { |
+ 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); |
+ StreamUploader* uploader = new StreamUploader(BodyStreamBuffer::create(buffer->releaseHandle(), "Failed"), outStream); |
uploader->start(); |
m_state = Done; |
return; |