| 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; | 
| } | 
|  |