Chromium Code Reviews| Index: Source/core/streams/ReadableStream.cpp |
| diff --git a/Source/core/streams/ReadableStream.cpp b/Source/core/streams/ReadableStream.cpp |
| index 92ac8a87bceb92eb7f076a89f3d1bb8532553598..4ad76e494d3e0f2ff5cba49951d8dea538b89a5f 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,36 @@ 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_state != Readable) |
| + return; |
| + |
| + if (isQueueEmpty()) { |
| + resolveAllPendingReadsAsDone(); |
|
tyoshino (SeeGerritForStatus)
2015/03/18 07:39:10
L83-L86 and L95-L99 are the same.
yhirano
2015/03/18 08:07:49
Done.
|
| + m_state = Closed; |
| if (m_reader) |
| m_reader->releaseLock(); |
| - m_state = Closed; |
| - } else if (m_state == Readable) { |
| + } else { |
| 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()); |
| - return; |
| - } |
| -} |
| - |
| 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) { |
| + m_state = Closed; |
|
tyoshino (SeeGerritForStatus)
2015/03/18 07:39:10
this should be done after resolving the promises?
yhirano
2015/03/18 08:07:49
We don't have to care about it, because it is Scri
|
| + resolveAllPendingReadsAsDone(); |
| + if (m_reader) |
| + m_reader->releaseLock(); |
| } |
| 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 +110,25 @@ 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()); |
| + ASSERT(m_state == Readable); |
| clearQueue(); |
| - m_closed->resolve(ToV8UndefinedGenerator()); |
| m_state = Closed; |
| - return m_source->cancelSource(scriptState, reason).then(ConstUndefined::create(scriptState)); |
| -} |
| + resolveAllPendingReadsAsDone(); |
| -ScriptPromise ReadableStream::closed(ScriptState* scriptState) |
| -{ |
| - return m_closed->promise(scriptState->world()); |
| + 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 +139,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; |
| @@ -287,7 +167,7 @@ void ReadableStream::callPullIfNeeded() |
| bool ReadableStream::hasPendingActivity() const |
| { |
| - return m_state == Waiting || m_state == Readable; |
| + return m_state == Readable; |
| } |
| void ReadableStream::stop() |
| @@ -299,27 +179,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 |