Index: Source/core/streams/ReadableStream.cpp |
diff --git a/Source/core/streams/ReadableStream.cpp b/Source/core/streams/ReadableStream.cpp |
index 92ac8a87bceb92eb7f076a89f3d1bb8532553598..684e1358ad5e7b81c9271b425e3b255884e9ac8b 100644 |
--- a/Source/core/streams/ReadableStream.cpp |
+++ b/Source/core/streams/ReadableStream.cpp |
@@ -34,32 +34,6 @@ private: |
} |
}; |
-class ResolveWithReady : public ScriptFunction { |
-public: |
- static v8::Handle<v8::Function> create(ScriptState* scriptState, ReadableStream* stream) |
- { |
- return (new ResolveWithReady(scriptState, stream))->bindToV8Function(); |
- } |
- |
- DEFINE_INLINE_TRACE() |
- { |
- visitor->trace(m_stream); |
- ScriptFunction::trace(visitor); |
- } |
- |
-private: |
- ResolveWithReady(ScriptState* scriptState, ReadableStream* stream) |
- : ScriptFunction(scriptState) |
- , m_stream(stream) { } |
- |
- ScriptValue call(ScriptValue value) override |
- { |
- return ScriptValue(scriptState(), m_stream->ready(scriptState()).v8Value()); |
- } |
- |
- Member<ReadableStream> m_stream; |
-}; |
- |
} // namespace |
ReadableStream::ReadableStream(ExecutionContext* executionContext, UnderlyingSource* source) |
@@ -68,9 +42,7 @@ ReadableStream::ReadableStream(ExecutionContext* executionContext, UnderlyingSou |
, m_isStarted(false) |
, m_isDraining(false) |
, m_isPulling(false) |
- , m_state(Waiting) |
- , m_ready(new WaitPromise(executionContext, this, WaitPromise::Ready)) |
- , m_closed(new ClosedPromise(executionContext, this, ClosedPromise::Closed)) |
+ , m_state(Readable) |
{ |
suspendIfNeeded(); |
} |
@@ -79,14 +51,6 @@ ReadableStream::~ReadableStream() |
{ |
} |
-String ReadableStream::stateString() const |
-{ |
- if (m_reader) |
- return "waiting"; |
- |
- return stateToString(m_state); |
-} |
- |
bool ReadableStream::enqueuePreliminaryCheck() |
{ |
// This is a bit different from what spec says: it says we should throw |
@@ -107,93 +71,28 @@ bool ReadableStream::enqueuePostAction() |
if (m_state == Errored) |
return false; |
- if (m_state == Waiting) { |
- // ReadableStream::hasPendingActivity return value gets false when |
- // |m_state| is changed to Closed or Errored from Waiting or Readable. |
- // On the other hand, the wrappers should be kept alive when |m_ready| |
- // and |m_close| resolution and rejection are called. Hence we call |
- // ScriptPromiseProperty::resolve and ScriptPromiseProperty::reject |
- // *before* changing state, no matter if the state change actually |
- // changes hasPendingActivity return value. |
- m_ready->resolve(ToV8UndefinedGenerator()); |
- m_state = Readable; |
- } |
- |
return !shouldApplyBackpressure; |
} |
void ReadableStream::close() |
{ |
- if (m_state == Waiting) { |
- m_ready->resolve(ToV8UndefinedGenerator()); |
- m_closed->resolve(ToV8UndefinedGenerator()); |
- if (m_reader) |
- m_reader->releaseLock(); |
- m_state = Closed; |
- } else if (m_state == Readable) { |
- m_isDraining = true; |
- } |
-} |
- |
-void ReadableStream::readInternalPreliminaryCheck(ExceptionState& exceptionState) |
-{ |
- if (m_state == Waiting) { |
- exceptionState.throwTypeError("read is called while state is waiting"); |
- return; |
- } |
- if (m_state == Closed) { |
- exceptionState.throwTypeError("read is called while state is closed"); |
- return; |
- } |
- if (m_state == Errored) { |
- exceptionState.throwDOMException(m_exception->code(), m_exception->message()); |
+ if (m_state != Readable) |
return; |
- } |
+ |
+ if (isQueueEmpty()) |
+ closeInternal(); |
+ else |
+ m_isDraining = true; |
} |
void ReadableStream::readInternalPostAction() |
{ |
ASSERT(m_state == Readable); |
- if (isQueueEmpty()) { |
- if (m_isDraining) { |
- m_state = Closed; |
- m_closed->resolve(ToV8UndefinedGenerator()); |
- if (m_reader) |
- m_reader->releaseLock(); |
- } else { |
- m_ready->reset(); |
- m_state = Waiting; |
- } |
- } |
+ if (isQueueEmpty() && m_isDraining) |
+ closeInternal(); |
callPullIfNeeded(); |
} |
-ScriptValue ReadableStream::read(ScriptState* scriptState, ExceptionState& exceptionState) |
-{ |
- if (m_reader) { |
- exceptionState.throwTypeError("this stream is locked to a ReadableStreamReader"); |
- return ScriptValue(); |
- } |
- return readInternal(scriptState, exceptionState); |
-} |
- |
-ScriptPromise ReadableStream::ready(ScriptState* scriptState) |
-{ |
- if (m_reader) { |
- return m_reader->released(scriptState).then(ResolveWithReady::create(scriptState, this)); |
- } |
- |
- if (m_state == Waiting) { |
- return readyInternal(scriptState).then(ResolveWithReady::create(scriptState, this)); |
- } |
- return readyInternal(scriptState); |
-} |
- |
-ScriptPromise ReadableStream::readyInternal(ScriptState* scriptState) |
-{ |
- return m_ready->promise(scriptState->world()); |
-} |
- |
ScriptPromise ReadableStream::cancel(ScriptState* scriptState, ScriptValue reason) |
{ |
if (m_reader) |
@@ -203,44 +102,26 @@ ScriptPromise ReadableStream::cancel(ScriptState* scriptState, ScriptValue reaso |
if (m_state == Errored) |
return ScriptPromise::rejectWithDOMException(scriptState, m_exception); |
- ASSERT(m_state == Readable || m_state == Waiting); |
- if (m_state == Waiting) |
- m_ready->resolve(ToV8UndefinedGenerator()); |
- clearQueue(); |
- m_closed->resolve(ToV8UndefinedGenerator()); |
- m_state = Closed; |
- return m_source->cancelSource(scriptState, reason).then(ConstUndefined::create(scriptState)); |
+ return cancelInternal(scriptState, reason); |
} |
-ScriptPromise ReadableStream::closed(ScriptState* scriptState) |
+ScriptPromise ReadableStream::cancelInternal(ScriptState* scriptState, ScriptValue reason) |
{ |
- return m_closed->promise(scriptState->world()); |
+ closeInternal(); |
+ return m_source->cancelSource(scriptState, reason).then(ConstUndefined::create(scriptState)); |
} |
void ReadableStream::error(PassRefPtrWillBeRawPtr<DOMException> exception) |
{ |
- switch (m_state) { |
- case Waiting: |
- m_exception = exception; |
- m_ready->reject(m_exception); |
- m_closed->reject(m_exception); |
- m_state = Errored; |
- if (m_reader) |
- m_reader->releaseLock(); |
- break; |
- case Readable: |
- clearQueue(); |
- m_exception = exception; |
- m_ready->reset(); |
- m_ready->reject(m_exception); |
- m_closed->reject(m_exception); |
- m_state = Errored; |
- if (m_reader) |
- m_reader->releaseLock(); |
- break; |
- default: |
- break; |
- } |
+ if (m_state != ReadableStream::Readable) |
+ return; |
+ |
+ m_exception = exception; |
+ clearQueue(); |
+ rejectAllPendingReads(m_exception); |
+ m_state = Errored; |
+ if (m_reader) |
+ m_reader->releaseLock(); |
} |
void ReadableStream::didSourceStart() |
@@ -251,14 +132,6 @@ void ReadableStream::didSourceStart() |
ReadableStreamReader* ReadableStream::getReader(ExceptionState& exceptionState) |
{ |
- if (m_state == Closed) { |
- exceptionState.throwTypeError("this stream is already closed"); |
- return nullptr; |
- } |
- if (m_state == Errored) { |
- exceptionState.throwDOMException(m_exception->code(), m_exception->message()); |
- return nullptr; |
- } |
if (m_reader) { |
exceptionState.throwTypeError("already locked to a ReadableStreamReader"); |
return nullptr; |
@@ -285,9 +158,19 @@ void ReadableStream::callPullIfNeeded() |
m_source->pullSource(); |
} |
+void ReadableStream::closeInternal() |
+{ |
+ ASSERT(m_state == Readable); |
+ m_state = Closed; |
+ resolveAllPendingReadsAsDone(); |
+ clearQueue(); |
+ if (m_reader) |
+ m_reader->releaseLock(); |
+} |
+ |
bool ReadableStream::hasPendingActivity() const |
{ |
- return m_state == Waiting || m_state == Readable; |
+ return m_state == Readable; |
} |
void ReadableStream::stop() |
@@ -299,27 +182,9 @@ void ReadableStream::stop() |
DEFINE_TRACE(ReadableStream) |
{ |
visitor->trace(m_source); |
- visitor->trace(m_ready); |
- visitor->trace(m_closed); |
visitor->trace(m_exception); |
visitor->trace(m_reader); |
ActiveDOMObject::trace(visitor); |
} |
-String ReadableStream::stateToString(State state) |
-{ |
- switch (state) { |
- case Readable: |
- return "readable"; |
- case Waiting: |
- return "waiting"; |
- case Closed: |
- return "closed"; |
- case Errored: |
- return "errored"; |
- } |
- ASSERT(false); |
- return String(); |
-} |
- |
} // namespace blink |