Chromium Code Reviews| Index: Source/modules/serviceworkers/RespondWithObserver.cpp |
| diff --git a/Source/modules/serviceworkers/RespondWithObserver.cpp b/Source/modules/serviceworkers/RespondWithObserver.cpp |
| index 0c2884931d38c5d312c58b075686ef42c5cab3ec..495464a19722e7bf6ec35658ad8275bff31d1f67 100644 |
| --- a/Source/modules/serviceworkers/RespondWithObserver.cpp |
| +++ b/Source/modules/serviceworkers/RespondWithObserver.cpp |
| @@ -24,6 +24,20 @@ |
| namespace blink { |
| +namespace { |
| + |
| +class LoaderClient final : public GarbageCollectedFinalized<LoaderClient>, public FetchDataLoader::Client { |
| + WTF_MAKE_NONCOPYABLE(LoaderClient); |
| + USING_GARBAGE_COLLECTED_MIXIN(LoaderClient); |
| +public: |
| + LoaderClient() = default; |
| + void didFetchDataLoadedStream() override {} |
| + void didFetchDataLoadFailed() override {} |
| + DEFINE_INLINE_TRACE() { FetchDataLoader::Client::trace(visitor); } |
| +}; |
| + |
| +} // namespace |
| + |
| class RespondWithObserver::ThenFunction final : public ScriptFunction { |
| public: |
| enum ResolveType { |
| @@ -150,26 +164,22 @@ 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()) { |
| + OwnPtr<FetchDataConsumerHandle> handle = buffer->lock(executionContext()); |
| + RefPtr<BlobDataHandle> blobDataHandle = handle->obtainReader(nullptr)->drainAsBlobDataHandle(FetchDataConsumerHandle::Reader::AllowBlobWithInvalidSize); |
| + buffer->unlock(handle.release()); |
|
hiroshige
2015/07/21 12:14:01
Same for the comment in FetchManager.cpp.
yhirano
2015/07/22 09:42:45
Done.
|
| + 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 LoaderClient); |
| } |
| - 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; |
| } |