Index: third_party/WebKit/Source/modules/fetch/BodyStreamBuffer.cpp |
diff --git a/third_party/WebKit/Source/modules/fetch/BodyStreamBuffer.cpp b/third_party/WebKit/Source/modules/fetch/BodyStreamBuffer.cpp |
index f3efdfc5fa6f02cc035f7e2117616d3a56184313..d79b5cce24af4d41018c10caa32bd078d9fcd1de 100644 |
--- a/third_party/WebKit/Source/modules/fetch/BodyStreamBuffer.cpp |
+++ b/third_party/WebKit/Source/modules/fetch/BodyStreamBuffer.cpp |
@@ -14,60 +14,51 @@ |
namespace blink { |
-class BodyStreamBuffer::LoaderHolder final : public GarbageCollectedFinalized<LoaderHolder>, public ActiveDOMObject, public FetchDataLoader::Client { |
- WTF_MAKE_NONCOPYABLE(LoaderHolder); |
- USING_GARBAGE_COLLECTED_MIXIN(LoaderHolder); |
+class BodyStreamBuffer::LoaderClient final : public GarbageCollectedFinalized<LoaderClient>, public ActiveDOMObject, public FetchDataLoader::Client { |
+ WTF_MAKE_NONCOPYABLE(LoaderClient); |
+ USING_GARBAGE_COLLECTED_MIXIN(LoaderClient); |
public: |
- LoaderHolder(ExecutionContext* executionContext, BodyStreamBuffer* buffer, FetchDataLoader* loader, FetchDataLoader::Client* client) |
+ LoaderClient(ExecutionContext* executionContext, BodyStreamBuffer* buffer, FetchDataLoader::Client* client) |
: ActiveDOMObject(executionContext) |
, m_buffer(buffer) |
- , m_loader(loader) |
, m_client(client) |
{ |
suspendIfNeeded(); |
} |
- void start(PassOwnPtr<FetchDataConsumerHandle> handle) { m_loader->start(handle.get(), this); } |
- |
void didFetchDataLoadedBlobHandle(PassRefPtr<BlobDataHandle> blobDataHandle) override |
{ |
- m_loader.clear(); |
- m_buffer->endLoading(this, EndLoadingDone); |
+ m_buffer->endLoading(); |
m_client->didFetchDataLoadedBlobHandle(blobDataHandle); |
} |
void didFetchDataLoadedArrayBuffer(PassRefPtr<DOMArrayBuffer> arrayBuffer) override |
{ |
- m_loader.clear(); |
- m_buffer->endLoading(this, EndLoadingDone); |
+ m_buffer->endLoading(); |
m_client->didFetchDataLoadedArrayBuffer(arrayBuffer); |
} |
void didFetchDataLoadedString(const String& string) override |
{ |
- m_loader.clear(); |
- m_buffer->endLoading(this, EndLoadingDone); |
+ m_buffer->endLoading(); |
m_client->didFetchDataLoadedString(string); |
} |
void didFetchDataLoadedStream() override |
{ |
- m_loader.clear(); |
- m_buffer->endLoading(this, EndLoadingDone); |
+ m_buffer->endLoading(); |
m_client->didFetchDataLoadedStream(); |
} |
void didFetchDataLoadFailed() override |
{ |
- m_loader.clear(); |
- m_buffer->endLoading(this, EndLoadingErrored); |
+ m_buffer->endLoading(); |
m_client->didFetchDataLoadFailed(); |
} |
DEFINE_INLINE_TRACE() |
{ |
visitor->trace(m_buffer); |
- visitor->trace(m_loader); |
visitor->trace(m_client); |
ActiveDOMObject::trace(visitor); |
FetchDataLoader::Client::trace(visitor); |
@@ -76,15 +67,10 @@ public: |
private: |
void stop() override |
{ |
- if (m_loader) { |
- m_loader->cancel(); |
- m_loader.clear(); |
- m_buffer->endLoading(this, EndLoadingErrored); |
- } |
+ m_buffer->stopLoading(); |
} |
Member<BodyStreamBuffer> m_buffer; |
- Member<FetchDataLoader> m_loader; |
Member<FetchDataLoader::Client> m_client; |
}; |
@@ -92,7 +78,6 @@ BodyStreamBuffer::BodyStreamBuffer(PassOwnPtr<FetchDataConsumerHandle> handle) |
: m_handle(handle) |
, m_reader(m_handle->obtainReader(this)) |
, m_stream(new ReadableByteStream(this, new ReadableByteStream::StrictStrategy)) |
- , m_lockLevel(0) |
, m_streamNeedsMore(false) |
{ |
m_stream->didSourceStart(); |
@@ -100,7 +85,8 @@ BodyStreamBuffer::BodyStreamBuffer(PassOwnPtr<FetchDataConsumerHandle> handle) |
PassRefPtr<BlobDataHandle> BodyStreamBuffer::drainAsBlobDataHandle(FetchDataConsumerHandle::Reader::BlobSizePolicy policy) |
{ |
- ASSERT(!isLocked()); |
+ ASSERT(!stream()->isLocked()); |
+ m_stream->setIsDisturbed(); |
if (ReadableStream::Closed == m_stream->stateInternal() || ReadableStream::Errored == m_stream->stateInternal()) |
return nullptr; |
@@ -114,7 +100,8 @@ PassRefPtr<BlobDataHandle> BodyStreamBuffer::drainAsBlobDataHandle(FetchDataCons |
PassRefPtr<EncodedFormData> BodyStreamBuffer::drainAsFormData() |
{ |
- ASSERT(!isLocked()); |
+ ASSERT(!stream()->isLocked()); |
+ m_stream->setIsDisturbed(); |
if (ReadableStream::Closed == m_stream->stateInternal() || ReadableStream::Errored == m_stream->stateInternal()) |
return nullptr; |
@@ -126,28 +113,36 @@ PassRefPtr<EncodedFormData> BodyStreamBuffer::drainAsFormData() |
return nullptr; |
} |
-PassOwnPtr<FetchDataConsumerHandle> BodyStreamBuffer::lock(ExecutionContext* executionContext) |
+PassOwnPtr<FetchDataConsumerHandle> BodyStreamBuffer::releaseHandle(ExecutionContext* executionContext) |
{ |
- ASSERT(!isLocked()); |
- ++m_lockLevel; |
+ ASSERT(!stream()->isLocked()); |
m_reader = nullptr; |
- OwnPtr<FetchDataConsumerHandle> handle = m_handle.release(); |
+ m_stream->setIsDisturbed(); |
+ TrackExceptionState exceptionState; |
+ m_stream->getBytesReader(executionContext, exceptionState); |
+ |
if (ReadableStream::Closed == m_stream->stateInternal()) |
return createFetchDataConsumerHandleFromWebHandle(createDoneDataConsumerHandle()); |
if (ReadableStream::Errored == m_stream->stateInternal()) |
return createFetchDataConsumerHandleFromWebHandle(createUnexpectedErrorDataConsumerHandle()); |
- TrackExceptionState exceptionState; |
- m_streamReader = m_stream->getBytesReader(executionContext, exceptionState); |
+ ASSERT(m_handle); |
+ OwnPtr<FetchDataConsumerHandle> handle = m_handle.release(); |
+ close(); |
return handle.release(); |
} |
void BodyStreamBuffer::startLoading(ExecutionContext* executionContext, FetchDataLoader* loader, FetchDataLoader::Client* client) |
{ |
- OwnPtr<FetchDataConsumerHandle> handle = lock(executionContext); |
- auto holder = new LoaderHolder(executionContext, this, loader, client); |
- m_loaders.add(holder); |
- holder->start(handle.release()); |
+ ASSERT(!m_loader); |
+ OwnPtr<FetchDataConsumerHandle> handle = releaseHandle(executionContext); |
+ m_loader = loader; |
+ loader->start(handle.get(), new LoaderClient(executionContext, this, client)); |
+} |
+ |
+bool BodyStreamBuffer::hasPendingActivity() const |
+{ |
+ return m_loader || (m_stream->isLocked() && m_stream->stateInternal() == ReadableStream::Readable); |
} |
void BodyStreamBuffer::pullSource() |
@@ -233,27 +228,18 @@ void BodyStreamBuffer::processData() |
} |
} |
-void BodyStreamBuffer::unlock() |
+void BodyStreamBuffer::endLoading() |
{ |
- ASSERT(m_lockLevel > 0); |
- if (m_streamReader) { |
- m_streamReader->releaseLock(); |
- m_streamReader = nullptr; |
- } |
- --m_lockLevel; |
+ ASSERT(m_loader); |
+ m_loader = nullptr; |
} |
-void BodyStreamBuffer::endLoading(FetchDataLoader::Client* client, EndLoadingMode mode) |
+void BodyStreamBuffer::stopLoading() |
{ |
- ASSERT(m_loaders.contains(client)); |
- m_loaders.remove(client); |
- unlock(); |
- if (mode == EndLoadingDone) { |
- close(); |
- } else { |
- ASSERT(mode == EndLoadingErrored); |
- error(); |
- } |
+ if (!m_loader) |
+ return; |
+ m_loader->cancel(); |
+ m_loader = nullptr; |
} |
} // namespace blink |