| Index: Source/modules/fetch/Body.cpp
|
| diff --git a/Source/modules/fetch/Body.cpp b/Source/modules/fetch/Body.cpp
|
| index 892a13b10b8e8f415f58ccd49d951061b2143ab3..97e750314e5112c7ee716805fc2165dade5a56fb 100644
|
| --- a/Source/modules/fetch/Body.cpp
|
| +++ b/Source/modules/fetch/Body.cpp
|
| @@ -15,6 +15,7 @@
|
| #include "core/fileapi/FileReaderLoader.h"
|
| #include "core/fileapi/FileReaderLoaderClient.h"
|
| #include "core/frame/UseCounter.h"
|
| +#include "core/streams/ExclusiveStreamReader.h"
|
| #include "core/streams/UnderlyingSource.h"
|
| #include "modules/fetch/BodyStreamBuffer.h"
|
|
|
| @@ -233,7 +234,7 @@ private:
|
|
|
| ScriptPromise Body::readAsync(ScriptState* scriptState, ResponseType type)
|
| {
|
| - if (m_bodyUsed)
|
| + if (bodyUsed())
|
| return ScriptPromise::reject(scriptState, V8ThrowException::createTypeError(scriptState->isolate(), "Already read"));
|
|
|
| // When the main thread sends a V8::TerminateExecution() signal to a worker
|
| @@ -246,7 +247,7 @@ ScriptPromise Body::readAsync(ScriptState* scriptState, ResponseType type)
|
| if (!executionContext)
|
| return ScriptPromise();
|
|
|
| - m_bodyUsed = true;
|
| + setBodyUsed();
|
| m_responseType = type;
|
|
|
| ASSERT(!m_resolver);
|
| @@ -346,11 +347,20 @@ ReadableStream* Body::body()
|
|
|
| bool Body::bodyUsed() const
|
| {
|
| - return m_bodyUsed;
|
| + return m_bodyUsed || (m_stream && m_stream->isLocked());
|
| }
|
|
|
| void Body::setBodyUsed()
|
| {
|
| + ASSERT(!m_bodyUsed);
|
| + ASSERT(!m_stream || !m_stream->isLocked());
|
| + // Note that technically we can set BodyUsed even when the stream is
|
| + // closed or errored, but getReader doesn't work then.
|
| + if (m_stream && m_stream->stateInternal() != ReadableStream::Closed && m_stream->stateInternal() != ReadableStream::Errored) {
|
| + TrackExceptionState exceptionState;
|
| + m_streamReader = m_stream->getReader(exceptionState);
|
| + ASSERT(!exceptionState.hadException());
|
| + }
|
| m_bodyUsed = true;
|
| }
|
|
|
| @@ -391,6 +401,7 @@ DEFINE_TRACE(Body)
|
| visitor->trace(m_resolver);
|
| visitor->trace(m_stream);
|
| visitor->trace(m_streamSource);
|
| + visitor->trace(m_streamReader);
|
| ActiveDOMObject::trace(visitor);
|
| }
|
|
|
|
|