Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(451)

Unified Diff: third_party/WebKit/Source/modules/fetch/BodyStreamBuffer.cpp

Issue 1418813004: [Fetch API] Reflect spec changes of bodyUsed property (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698