Changeset 183991 in webkit


Ignore:
Timestamp:
May 8, 2015 3:44:06 AM (9 years ago)
Author:
youenn.fablet@crf.canon.fr
Message:

[Streams API] ReadableStream constructor start function should be able to error the stream
https://bugs.webkit.org/show_bug.cgi?id=141162

Reviewed by Darin Adler.

Source/WebCore:

This patch implements the functionality of the ReadableStreamController error function.
It basically changes the state of the stream to errored, resolves the ready promise and rejects the closed promise.
Adding support to reject promise with any JSValue.

Support for storing the error is added to both reader and stream.

Test: streams/readable-stream-controller-error.html and rebased tests

  • Modules/streams/ReadableStream.cpp:

(WebCore::ReadableStream::changeStateToErrored):

  • Modules/streams/ReadableStream.h:
  • Modules/streams/ReadableStreamReader.cpp:

(WebCore::ReadableStreamReader::initialize):
(WebCore::ReadableStreamReader::closed):
(WebCore::ReadableStreamReader::changeStateToClosed):
(WebCore::ReadableStreamReader::changeStateToErrored):

  • Modules/streams/ReadableStreamReader.h:
  • bindings/js/JSDOMPromise.h:

(WebCore::DeferredWrapper::reject):

  • bindings/js/JSReadableStreamControllerCustom.cpp:

(WebCore::JSReadableStreamController::error):

  • bindings/js/JSReadableStreamReaderCustom.cpp:

(WebCore::JSReadableStreamReader::closed):

  • bindings/js/ReadableJSStream.cpp:

(WebCore::ReadableJSStream::createReader):
(WebCore::ReadableJSStream::storeError):
(WebCore::ReadableJSStream::Reader::storeError):
(WebCore::ReadableJSStream::jsController): Deleted.

  • bindings/js/ReadableJSStream.h:

LayoutTests:

  • streams/readable-stream-controller-error-expected.txt: Added.
  • streams/readable-stream-controller-error.html: Added.
  • streams/reference-implementation/bad-underlying-sources-expected.txt:
  • streams/reference-implementation/readable-stream-templated-expected.txt:
Location:
trunk
Files:
2 added
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r183990 r183991  
     12015-05-08  Xabier Rodriguez Calvar  <calvaris@igalia.com> and Youenn Fablet <youenn.fablet@crf.canon.fr>
     2
     3        [Streams API] ReadableStream constructor start function should be able to error the stream
     4        https://bugs.webkit.org/show_bug.cgi?id=141162
     5
     6        Reviewed by Darin Adler.
     7
     8        * streams/readable-stream-controller-error-expected.txt: Added.
     9        * streams/readable-stream-controller-error.html: Added.
     10        * streams/reference-implementation/bad-underlying-sources-expected.txt:
     11        * streams/reference-implementation/readable-stream-templated-expected.txt:
     12
    1132015-05-08  Commit Queue  <commit-queue@webkit.org>
    214
  • trunk/LayoutTests/streams/reference-implementation/bad-underlying-sources-expected.txt

    r183395 r183991  
    2222FAIL Underlying source: calling close on an empty canceled stream should not throw cancel is not implemented
    2323FAIL Underlying source: calling close on a non-empty canceled stream should not throw cancel is not implemented
    24 TIMEOUT Underlying source: calling close after error should throw Test timed out
    25 TIMEOUT Underlying source: calling error twice should throw the second time Test timed out
     24PASS Underlying source: calling close after error should throw
     25PASS Underlying source: calling error twice should throw the second time
    2626PASS Underlying source: calling error after close should throw
    2727
  • trunk/LayoutTests/streams/reference-implementation/readable-stream-templated-expected.txt

    r183395 r183991  
    2929FAIL cancel() should return a distinct rejected promise each time cancel is not implemented
    3030FAIL reader cancel() should return a distinct rejected promise each time cancel is not implemented
    31 FAIL should be able to acquire multiple readers, since they are all auto-released ReadableStream is locked
     31PASS should be able to acquire multiple readers, since they are all auto-released
    3232PASS Running templatedRSErrored with ReadableStream (errored via returning a rejected promise in start)
    3333FAIL getReader() should return a reader that acts errored read is not implemented
  • trunk/Source/WebCore/ChangeLog

    r183990 r183991  
     12015-05-08  Xabier Rodriguez Calvar  <calvaris@igalia.com> and Youenn Fablet <youenn.fablet@crf.canon.fr>
     2
     3        [Streams API] ReadableStream constructor start function should be able to error the stream
     4        https://bugs.webkit.org/show_bug.cgi?id=141162
     5
     6        Reviewed by Darin Adler.
     7
     8        This patch implements the functionality of the ReadableStreamController error function.
     9        It basically changes the state of the stream to errored, resolves the ready promise and rejects the closed promise.
     10        Adding support to reject promise with any JSValue.
     11
     12        Support for storing the error is added to both reader and stream.
     13
     14        Test: streams/readable-stream-controller-error.html and rebased tests
     15
     16        * Modules/streams/ReadableStream.cpp:
     17        (WebCore::ReadableStream::changeStateToErrored):
     18        * Modules/streams/ReadableStream.h:
     19        * Modules/streams/ReadableStreamReader.cpp:
     20        (WebCore::ReadableStreamReader::initialize):
     21        (WebCore::ReadableStreamReader::closed):
     22        (WebCore::ReadableStreamReader::changeStateToClosed):
     23        (WebCore::ReadableStreamReader::changeStateToErrored):
     24        * Modules/streams/ReadableStreamReader.h:
     25        * bindings/js/JSDOMPromise.h:
     26        (WebCore::DeferredWrapper::reject):
     27        * bindings/js/JSReadableStreamControllerCustom.cpp:
     28        (WebCore::JSReadableStreamController::error):
     29        * bindings/js/JSReadableStreamReaderCustom.cpp:
     30        (WebCore::JSReadableStreamReader::closed):
     31        * bindings/js/ReadableJSStream.cpp:
     32        (WebCore::ReadableJSStream::createReader):
     33        (WebCore::ReadableJSStream::storeError):
     34        (WebCore::ReadableJSStream::Reader::storeError):
     35        (WebCore::ReadableJSStream::jsController): Deleted.
     36        * bindings/js/ReadableJSStream.h:
     37
    1382015-05-08  Commit Queue  <commit-queue@webkit.org>
    239
  • trunk/Source/WebCore/Modules/streams/ReadableStream.cpp

    r183395 r183991  
    6969}
    7070
     71void ReadableStream::changeStateToErrored()
     72{
     73    if (m_state != State::Readable)
     74        return;
     75    m_state = State::Errored;
     76    if (m_reader)
     77        m_reader->changeStateToErrored();
     78    ASSERT(!m_reader);
     79}
     80
    7181void ReadableStream::start()
    7282{
  • trunk/Source/WebCore/Modules/streams/ReadableStream.h

    r183744 r183991  
    7070    void start();
    7171    void changeStateToClosed();
     72    void changeStateToErrored();
    7273
    7374    ReadableStreamSource& source() { return m_source.get(); }
  • trunk/Source/WebCore/Modules/streams/ReadableStreamReader.cpp

    r183395 r183991  
    7070        return;
    7171    }
     72    if (m_stream->internalState() == ReadableStream::State::Errored) {
     73        changeStateToErrored();
     74        return;
     75    }
    7276}
    7377
     
    7983}
    8084
    81 void ReadableStreamReader::closed(ClosedSuccessCallback successCallback, ClosedErrorCallback)
     85void ReadableStreamReader::closed(ClosedSuccessCallback successCallback, ClosedErrorCallback errorCallback)
    8286{
    8387    if (m_state == State::Closed) {
     
    8589        return;
    8690    }
     91    if (m_state == State::Errored) {
     92        errorCallback();
     93        return;
     94    }
    8795    m_closedSuccessCallback = WTF::move(successCallback);
     96    m_closedErrorCallback = WTF::move(errorCallback);
    8897}
    8998
     
    98107    }
    99108    ASSERT(!m_closedSuccessCallback);
     109    m_closedErrorCallback = nullptr;
     110
     111    // FIXME: Implement read promise fulfilling.
     112
    100113    releaseStream();
    101     // FIXME: Implement read promise fulfilling.
     114}
     115
     116void ReadableStreamReader::changeStateToErrored()
     117{
     118    ASSERT(m_state == State::Readable);
     119    m_state = State::Errored;
     120
     121    if (m_closedErrorCallback) {
     122        ClosedErrorCallback closedErrorCallback = WTF::move(m_closedErrorCallback);
     123        closedErrorCallback();
     124    }
     125    ASSERT(!m_closedErrorCallback);
     126    m_closedSuccessCallback = nullptr;
     127
     128    // FIXME: Implement read promise rejection.
     129
     130    releaseStream();
    102131}
    103132
  • trunk/Source/WebCore/Modules/streams/ReadableStreamReader.h

    r183395 r183991  
    3737#include "ScriptWrappable.h"
    3838#include <functional>
     39#include <runtime/JSCJSValue.h>
    3940#include <wtf/Ref.h>
    4041#include <wtf/RefCounted.h>
     
    6263
    6364    void changeStateToClosed();
     65    void changeStateToErrored();
     66
     67    virtual JSC::JSValue error() = 0;
    6468
    6569protected:
     
    7882
    7983    ClosedSuccessCallback m_closedSuccessCallback;
     84    ClosedErrorCallback m_closedErrorCallback;
    8085};
    8186
  • trunk/Source/WebCore/bindings/js/JSDOMPromise.h

    r183395 r183991  
    8383
    8484template<>
     85inline void DeferredWrapper::reject(const JSC::JSValue& value)
     86{
     87    JSC::ExecState* exec = m_globalObject->globalExec();
     88    JSC::JSLockHolder locker(exec);
     89    reject(exec, value);
     90}
     91
     92template<>
    8593inline void DeferredWrapper::resolve<String>(const String& result)
    8694{
  • trunk/Source/WebCore/bindings/js/JSReadableStreamControllerCustom.cpp

    r183866 r183991  
    6363    if (stream.internalState() != ReadableStream::State::Readable)
    6464        return exec->vm().throwException(exec, createTypeError(exec, ASCIILiteral("Calling error on a stream which is not readable")));
    65     notImplemented();
     65    stream.storeError(*exec);
    6666    return jsUndefined();
    6767}
  • trunk/Source/WebCore/bindings/js/JSReadableStreamReaderCustom.cpp

    r183866 r183991  
    7676    };
    7777    auto failureCallback = [this, wrapper]() mutable {
    78         // FIXME: return stored error.
    79         wrapper.reject(&impl());
     78        wrapper.reject(impl().error());
    8079    };
    8180
  • trunk/Source/WebCore/bindings/js/ReadableJSStream.cpp

    r183866 r183991  
    142142Ref<ReadableStreamReader> ReadableJSStream::createReader()
    143143{
    144     return Reader::create(*this);
     144    Ref<Reader> reader = Reader::create(*this);
     145    if (m_error)
     146        reader->storeError(*jsSource().globalObject()->globalExec(), m_error.get());
     147    return static_reference_cast<ReadableStreamReader>(reader);
    145148}
    146149
     
    162165}
    163166
     167void ReadableJSStream::storeError(JSC::ExecState& exec)
     168{
     169    if (m_error)
     170        return;
     171    JSValue error = exec.argumentCount() ? exec.argument(0) : createError(&exec, ASCIILiteral("Error function called."));
     172    m_error.set(exec.vm(), error);
     173
     174    if (auto reader = static_cast<Reader*>(this->reader()))
     175        reader->storeError(exec, error);
     176
     177    changeStateToErrored();
     178}
     179
    164180Ref<ReadableJSStream::Reader> ReadableJSStream::Reader::create(ReadableJSStream& stream)
    165181{
     
    172188}
    173189
     190void ReadableJSStream::Reader::storeError(JSC::ExecState& exec, JSValue error)
     191{
     192    m_error.set(exec.vm(), error);
     193}
     194
    174195} // namespace WebCore
    175196
  • trunk/Source/WebCore/bindings/js/ReadableJSStream.h

    r183866 r183991  
    5252    public:
    5353        static Ref<Reader> create(ReadableJSStream&);
     54        void storeError(JSC::ExecState&, JSC::JSValue);
     55        JSC::JSValue error() { return m_error.get(); }
     56
    5457    private:
    5558        explicit Reader(ReadableJSStream&);
     59
     60        JSC::Strong<JSC::Unknown> m_error;
    5661    };
    5762
     
    7681    JSC::JSValue jsController(JSC::ExecState&, JSDOMGlobalObject*);
    7782
     83    void storeError(JSC::ExecState&);
     84    JSC::JSValue error() { return m_error.get(); }
     85
    7886private:
    7987    ReadableJSStream(ScriptExecutionContext&, Ref<ReadableJSStream::Source>&&);
    8088
    8189    std::unique_ptr<ReadableStreamController> m_controller;
     90    JSC::Strong<JSC::Unknown> m_error;
    8291};
    8392
Note: See TracChangeset for help on using the changeset viewer.