| Index: Source/modules/serviceworkers/RespondWithObserver.cpp
|
| diff --git a/Source/modules/serviceworkers/RespondWithObserver.cpp b/Source/modules/serviceworkers/RespondWithObserver.cpp
|
| index b63f7e1cdf35d5cc3a76825b77ae0a9511e06431..ef63f307392c607c226dee6027030cb79c805117 100644
|
| --- a/Source/modules/serviceworkers/RespondWithObserver.cpp
|
| +++ b/Source/modules/serviceworkers/RespondWithObserver.cpp
|
| @@ -59,6 +59,16 @@ const String getMessageForResponseError(WebServiceWorkerResponseError error, con
|
| return errorMessage;
|
| }
|
|
|
| +class NoopLoaderClient final : public GarbageCollectedFinalized<NoopLoaderClient>, public FetchDataLoader::Client {
|
| + WTF_MAKE_NONCOPYABLE(NoopLoaderClient);
|
| + USING_GARBAGE_COLLECTED_MIXIN(NoopLoaderClient);
|
| +public:
|
| + NoopLoaderClient() = default;
|
| + void didFetchDataLoadedStream() override {}
|
| + void didFetchDataLoadFailed() override {}
|
| + DEFINE_INLINE_TRACE() { FetchDataLoader::Client::trace(visitor); }
|
| +};
|
| +
|
| } // namespace
|
|
|
| class RespondWithObserver::ThenFunction final : public ScriptFunction {
|
| @@ -189,26 +199,20 @@ void RespondWithObserver::responseWasFulfilled(const ScriptValue& value)
|
| return;
|
| }
|
|
|
| - response->lockBody(Body::PassBody);
|
| - if (OwnPtr<DrainingBodyStreamBuffer> buffer = response->createInternalDrainingStream()) {
|
| - WebServiceWorkerResponse webResponse;
|
| - response->populateWebServiceWorkerResponse(webResponse);
|
| - if (RefPtr<BlobDataHandle> blobDataHandle = buffer->drainAsBlobDataHandle(FetchDataConsumerHandle::Reader::AllowBlobWithInvalidSize)) {
|
| + response->setBodyPassed();
|
| + WebServiceWorkerResponse webResponse;
|
| + response->populateWebServiceWorkerResponse(webResponse);
|
| + BodyStreamBuffer* buffer = response->internalBodyBuffer();
|
| + if (buffer->hasBody()) {
|
| + RefPtr<BlobDataHandle> blobDataHandle = buffer->drainAsBlobDataHandle(FetchDataConsumerHandle::Reader::AllowBlobWithInvalidSize);
|
| + if (blobDataHandle) {
|
| webResponse.setBlobDataHandle(blobDataHandle);
|
| - ServiceWorkerGlobalScopeClient::from(executionContext())->didHandleFetchEvent(m_eventID, webResponse);
|
| - m_state = Done;
|
| - return;
|
| + } else {
|
| + Stream* outStream = Stream::create(executionContext(), "");
|
| + webResponse.setStreamURL(outStream->url());
|
| + buffer->startLoading(executionContext(), FetchDataLoader::createLoaderAsStream(outStream), new NoopLoaderClient);
|
| }
|
| - Stream* outStream = Stream::create(executionContext(), "");
|
| - webResponse.setStreamURL(outStream->url());
|
| - ServiceWorkerGlobalScopeClient::from(executionContext())->didHandleFetchEvent(m_eventID, webResponse);
|
| - FetchDataLoader* loader = FetchDataLoader::createLoaderAsStream(outStream);
|
| - buffer->startLoading(loader, nullptr);
|
| - m_state = Done;
|
| - return;
|
| }
|
| - WebServiceWorkerResponse webResponse;
|
| - response->populateWebServiceWorkerResponse(webResponse);
|
| ServiceWorkerGlobalScopeClient::from(executionContext())->didHandleFetchEvent(m_eventID, webResponse);
|
| m_state = Done;
|
| }
|
|
|