⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 185697 in webkit


Ignore:
Timestamp:
Jun 18, 2015, 1:58:18 AM (11 years ago)
Author:
calvaris@igalia.com
Message:

[Streams API] Implement ReadableStreamReader.releaseLock
https://bugs.webkit.org/show_bug.cgi?id=145299

Reviewed by Darin Adler.

Source/WebCore:

Covered by rebased tests.

  • Modules/streams/ReadableStream.cpp:

(WebCore::ReadableStream::close): Moving some close code to newly added releaseReader.
(WebCore::ReadableStream::releaseReader): Implements reader release and callbacks finalization.
(WebCore::ReadableStream::changeStateToErrored): Calls releaseReader.

  • Modules/streams/ReadableStream.h:

(WebCore::ReadableStream::hasReadPendingRequests): Added to enable reader.releaseLock throwing if read requests are pending.

  • Modules/streams/ReadableStreamReader.cpp:

(WebCore::ReadableStreamReader::releaseLock): Implementation of releaseLock

  • Modules/streams/ReadableStreamReader.h:
  • Modules/streams/ReadableStreamReader.idl:

(WebCore::releaseLock): Deleted.

LayoutTests:

  • streams/reference-implementation/readable-stream-expected.txt: Rebasing expectations.
  • streams/reference-implementation/readable-stream-reader-expected.txt: Ditto.
  • streams/reference-implementation/readable-stream-templated-expected.txt: Ditto.
Location:
trunk
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r185695 r185697  
     12015-06-18  Youenn Fablet <youenn.fablet@crf.canon.fr> and Xabier Rodriguez Calvar  <calvaris@igalia.com>
     2
     3        [Streams API] Implement ReadableStreamReader.releaseLock
     4        https://bugs.webkit.org/show_bug.cgi?id=145299
     5
     6        Reviewed by Darin Adler.
     7
     8        * streams/reference-implementation/readable-stream-expected.txt: Rebasing expectations.
     9        * streams/reference-implementation/readable-stream-reader-expected.txt: Ditto.
     10        * streams/reference-implementation/readable-stream-templated-expected.txt: Ditto.
     11
    1122015-06-18  Youenn Fablet <youenn.fablet@crf.canon.fr> and Xabier Rodriguez Calvar  <calvaris@igalia.com>
    213
  • trunk/LayoutTests/streams/reference-implementation/readable-stream-expected.txt

    r185695 r185697  
    2626PASS ReadableStream: enqueue should throw when the stream is closed
    2727PASS ReadableStream: enqueue should throw the stored error when the stream is errored
    28 FAIL ReadableStream: should call underlying source methods as methods releaseLock is not implemented
     28FAIL ReadableStream: should call underlying source methods as methods cancel is not implemented
    2929FAIL ReadableStream strategies: the default strategy should give desiredSize of 1 to start, decreasing by 1 per enqueue assert_equals: expected (number) 1 but got (undefined) undefined
    3030FAIL ReadableStream strategies: the default strategy should continue giving desiredSize of 1 if the chunks are read immediately assert_equals: desiredSize should start at 1 expected (number) 1 but got (undefined) undefined
  • trunk/LayoutTests/streams/reference-implementation/readable-stream-reader-expected.txt

    r185586 r185697  
    1313FAIL cancel() on a reader releases the reader before calling through cancel is not implemented
    1414PASS closed should be fulfilled after stream is closed (.closed access before acquiring)
    15 FAIL closed should be fulfilled after reader releases its lock (multiple stream locks) releaseLock is not implemented
    16 FAIL Multiple readers can access the stream in sequence releaseLock is not implemented
    17 FAIL Cannot use an already-released reader to unlock a stream again releaseLock is not implemented
    18 FAIL cancel() on a released reader is a no-op and does not pass through releaseLock is not implemented
     15PASS closed should be fulfilled after reader releases its lock (multiple stream locks)
     16PASS Multiple readers can access the stream in sequence
     17PASS Cannot use an already-released reader to unlock a stream again
     18FAIL cancel() on a released reader is a no-op and does not pass through cancel is not implemented
    1919PASS Getting a second reader after erroring the stream should succeed
    2020PASS Garbage-collecting a ReadableStreamReader should not unlock its stream
  • trunk/LayoutTests/streams/reference-implementation/readable-stream-templated-expected.txt

    r185641 r185697  
    99PASS read() should return distinct promises each time
    1010PASS getReader() again on the stream should fail
    11 FAIL releasing the lock with pending read requests should throw but the read requests should stay pending releaseLock is not implemented
    12 FAIL releasing the lock should cause further read() calls to resolve as if the stream is closed releaseLock is not implemented
    13 FAIL releasing the lock should cause closed to fulfill releaseLock is not implemented
    14 FAIL releasing the lock should cause locked to become false releaseLock is not implemented
     11FAIL releasing the lock with pending read requests should throw but the read requests should stay pending Type error
     12PASS releasing the lock should cause further read() calls to resolve as if the stream is closed
     13PASS releasing the lock should cause closed to fulfill
     14PASS releasing the lock should cause locked to become false
    1515FAIL canceling via the reader should cause the reader to act closed cancel is not implemented
    1616FAIL canceling via the stream should fail cancel is not implemented
     
    5555PASS third read, with waiting, should give { value: undefined, done: true }
    5656PASS draining the stream via read() should cause the reader closed promise to fulfill and locked to be false
    57 FAIL releasing the lock after the stream is closed should do nothing releaseLock is not implemented
    58 FAIL releasing the lock should cause read() to act as if the stream is closed releaseLock is not implemented
    59 FAIL reader's closed property always returns the same promise releaseLock is not implemented
     57PASS releasing the lock after the stream is closed should do nothing
     58PASS releasing the lock should cause read() to act as if the stream is closed
     59PASS reader's closed property always returns the same promise
    6060
  • trunk/Source/WebCore/ChangeLog

    r185694 r185697  
     12015-06-18  Youenn Fablet <youenn.fablet@crf.canon.fr> and Xabier Rodriguez Calvar  <calvaris@igalia.com>
     2
     3        [Streams API] Implement ReadableStreamReader.releaseLock
     4        https://bugs.webkit.org/show_bug.cgi?id=145299
     5
     6        Reviewed by Darin Adler.
     7
     8        Covered by rebased tests.
     9
     10        * Modules/streams/ReadableStream.cpp:
     11        (WebCore::ReadableStream::close): Moving some close code to newly added releaseReader.
     12        (WebCore::ReadableStream::releaseReader): Implements reader release and callbacks finalization.
     13        (WebCore::ReadableStream::changeStateToErrored): Calls releaseReader.
     14        * Modules/streams/ReadableStream.h:
     15        (WebCore::ReadableStream::hasReadPendingRequests): Added to enable reader.releaseLock throwing if read requests are pending.
     16        * Modules/streams/ReadableStreamReader.cpp:
     17        (WebCore::ReadableStreamReader::releaseLock): Implementation of releaseLock
     18        * Modules/streams/ReadableStreamReader.h:
     19        * Modules/streams/ReadableStreamReader.idl:
     20        (WebCore::releaseLock): Deleted.
     21
    1222015-06-18  Youenn Fablet  <youenn.fablet@crf.canon.fr>
    223
  • trunk/Source/WebCore/Modules/streams/ReadableStream.cpp

    r185648 r185697  
    8080{
    8181    m_state = State::Closed;
    82 
     82    releaseReader();
     83}
     84
     85void ReadableStream::releaseReader()
     86{
     87    if (m_closedSuccessCallback)
     88        m_closedSuccessCallback();
     89
     90    for (auto& request : m_readRequests)
     91        request.endCallback();
     92
     93    clearCallbacks();
    8394    if (m_reader)
    8495        m_releasedReaders.append(WTF::move(m_reader));
    85 
    86     if (m_closedSuccessCallback)
    87         m_closedSuccessCallback();
    88 
    89     for (auto& request : m_readRequests)
    90         request.endCallback();
    91 
    92     clearCallbacks();
    9396}
    9497
     
    98101        return;
    99102    m_state = State::Errored;
    100 
    101     if (m_reader)
    102         m_releasedReaders.append(WTF::move(m_reader));
    103103
    104104    JSC::JSValue error = this->error();
     
    110110
    111111    clearCallbacks();
     112    if (m_reader)
     113        releaseReader();
    112114}
    113115
  • trunk/Source/WebCore/Modules/streams/ReadableStream.h

    r185648 r185697  
    6868    bool locked() const { return !!m_reader; }
    6969
     70    void releaseReader();
     71    bool hasReadPendingRequests() { return !m_readRequests.isEmpty(); }
     72
    7073    bool isErrored() const { return m_state == State::Errored; }
    7174    bool isReadable() const { return m_state == State::Readable; }
  • trunk/Source/WebCore/Modules/streams/ReadableStreamReader.cpp

    r185406 r185697  
    3131#include "ReadableStreamReader.h"
    3232
     33#include "ExceptionCode.h"
    3334#include <runtime/JSCJSValueInlines.h>
    3435
     
    5556}
    5657
     58void ReadableStreamReader::releaseLock(ExceptionCode& ec)
     59{
     60    if (m_stream.reader() != this)
     61        return;
     62    if (m_stream.hasReadPendingRequests()) {
     63        ec = TypeError;
     64        return;
     65    }
     66    m_stream.releaseReader();
     67}
     68
    5769}
    5870
  • trunk/Source/WebCore/Modules/streams/ReadableStreamReader.h

    r185114 r185697  
    4242namespace WebCore {
    4343
     44typedef int ExceptionCode;
     45
    4446// ReadableStreamReader implements access to ReadableStream from JavaScript.
    4547// It basically allows access to the ReadableStream iff the ReadableStreamReader instance is the active reader
     
    5456    void closed(ReadableStream::ClosedSuccessCallback&&, ReadableStream::FailureCallback&&);
    5557    void read(ReadableStream::ReadSuccessCallback&&, ReadableStream::ReadEndCallback&&, ReadableStream::FailureCallback&&);
     58    void releaseLock(ExceptionCode&);
    5659
    5760    void ref() { m_stream.ref(); }
  • trunk/Source/WebCore/Modules/streams/ReadableStreamReader.idl

    r184955 r185697  
    3737    [Custom, RaisesException] Object read();
    3838    [Custom, RaisesException] Promise cancel(DOMString reason);
    39     [Custom, RaisesException] void releaseLock();
     39    [RaisesException] void releaseLock();
    4040
    4141    [CustomGetter] readonly attribute Promise closed;
  • trunk/Source/WebCore/bindings/js/JSReadableStreamReaderCustom.cpp

    r185641 r185697  
    9393}
    9494
    95 JSValue JSReadableStreamReader::releaseLock(ExecState* exec)
    96 {
    97     JSValue error = createError(exec, ASCIILiteral("releaseLock is not implemented"));
    98     return exec->vm().throwException(exec, error);
    99 }
    100 
    10195EncodedJSValue JSC_HOST_CALL constructJSReadableStreamReader(ExecState* exec)
    10296{
Note: See TracChangeset for help on using the changeset viewer.