[Readable Streams API] Implement ReadableStreamBYOBReader releaseLock()
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 16 May 2017 12:47:22 +0000 (12:47 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 16 May 2017 12:47:22 +0000 (12:47 +0000)
https://bugs.webkit.org/show_bug.cgi?id=172111

Patch by Romain Bellessort <romain.bellessort@crf.canon.fr> on 2017-05-16
Reviewed by Chris Dumez.

LayoutTests/imported/w3c:

Updated test expectations.

* web-platform-tests/streams/readable-byte-streams/general-expected.txt: Updated.
* web-platform-tests/streams/readable-byte-streams/general.dedicatedworker-expected.txt: Updated.

Source/WebCore:

Implemented ReadableStreamBYOBReader releaseLock():
- https://streams.spec.whatwg.org/#byob-reader-release-lock;
- https://streams.spec.whatwg.org/#readable-stream-reader-generic-release.

Added tests to check releaseLock behavior.

* Modules/streams/ReadableStreamBYOBReader.js:
(releaseLock): Implemented.
* Modules/streams/ReadableStreamInternals.js:
(readableStreamReaderGenericRelease): Aligned with spec.

LayoutTests:

Added tests to check releaseLock() behavior.

* streams/readable-stream-byob-reader-expected.txt: Updated.
* streams/readable-stream-byob-reader.js: Added new tests.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@216926 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/imported/w3c/ChangeLog
LayoutTests/imported/w3c/web-platform-tests/streams/readable-byte-streams/general-expected.txt
LayoutTests/imported/w3c/web-platform-tests/streams/readable-byte-streams/general.dedicatedworker-expected.txt
LayoutTests/streams/readable-stream-byob-reader-expected.txt
LayoutTests/streams/readable-stream-byob-reader.js
Source/WebCore/ChangeLog
Source/WebCore/Modules/streams/ReadableStreamBYOBReader.js
Source/WebCore/Modules/streams/ReadableStreamInternals.js

index d551bbb..c7c8abd 100644 (file)
@@ -1,3 +1,15 @@
+2017-05-16  Romain Bellessort  <romain.bellessort@crf.canon.fr>
+
+        [Readable Streams API] Implement ReadableStreamBYOBReader releaseLock()
+        https://bugs.webkit.org/show_bug.cgi?id=172111
+
+        Reviewed by Chris Dumez.
+
+        Added tests to check releaseLock() behavior.
+
+        * streams/readable-stream-byob-reader-expected.txt: Updated.
+        * streams/readable-stream-byob-reader.js: Added new tests.
+
 2017-05-16  Per Arne Vollan  <pvollan@apple.com>
 
         Unreviewed Windows gardening. Skip svg animation test, since image throttling behaves differently on WK1.
index 5ebb0e4..f9d1164 100644 (file)
@@ -1,3 +1,15 @@
+2017-05-16  Romain Bellessort  <romain.bellessort@crf.canon.fr>
+
+        [Readable Streams API] Implement ReadableStreamBYOBReader releaseLock()
+        https://bugs.webkit.org/show_bug.cgi?id=172111
+
+        Reviewed by Chris Dumez.
+
+        Updated test expectations.
+
+        * web-platform-tests/streams/readable-byte-streams/general-expected.txt: Updated.
+        * web-platform-tests/streams/readable-byte-streams/general.dedicatedworker-expected.txt: Updated.
+
 2017-05-15  Chris Dumez  <cdumez@apple.com>
 
         Import css/geometry-1 web-platform-tests
index ea5683f..86f07ee 100644 (file)
@@ -1,14 +1,14 @@
 
 PASS getReader({mode: "byob"}) throws on non-bytes streams 
 PASS ReadableStream with byte source can be constructed with no errors 
-FAIL getReader({mode}) must perform ToString() ReadableStreamBYOBReader releaseLock() is not implemented
+PASS getReader({mode}) must perform ToString() 
 PASS ReadableStream with byte source: Construct and expect start and pull being called 
 PASS ReadableStream with byte source: No automatic pull call if start doesn't finish 
 PASS ReadableStream with byte source: Construct with highWaterMark of 0 
 FAIL ReadableStream with byte source: desiredSize when closed assert_equals: after closing, desiredSize must be 0 expected 0 but got 10
 FAIL ReadableStream with byte source: desiredSize when errored assert_equals: after erroring, desiredSize must be null expected (object) null but got (number) 10
 PASS ReadableStream with byte source: getReader(), then releaseLock() 
-FAIL ReadableStream with byte source: getReader() with mode set to byob, then releaseLock() ReadableStreamBYOBReader releaseLock() is not implemented
+PASS ReadableStream with byte source: getReader() with mode set to byob, then releaseLock() 
 PASS ReadableStream with byte source: Test that closing a stream does not release a reader automatically 
 PASS ReadableStream with byte source: Test that closing a stream does not release a BYOB reader automatically 
 PASS ReadableStream with byte source: Test that erroring a stream does not release a reader automatically 
index ea5683f..86f07ee 100644 (file)
@@ -1,14 +1,14 @@
 
 PASS getReader({mode: "byob"}) throws on non-bytes streams 
 PASS ReadableStream with byte source can be constructed with no errors 
-FAIL getReader({mode}) must perform ToString() ReadableStreamBYOBReader releaseLock() is not implemented
+PASS getReader({mode}) must perform ToString() 
 PASS ReadableStream with byte source: Construct and expect start and pull being called 
 PASS ReadableStream with byte source: No automatic pull call if start doesn't finish 
 PASS ReadableStream with byte source: Construct with highWaterMark of 0 
 FAIL ReadableStream with byte source: desiredSize when closed assert_equals: after closing, desiredSize must be 0 expected 0 but got 10
 FAIL ReadableStream with byte source: desiredSize when errored assert_equals: after erroring, desiredSize must be null expected (object) null but got (number) 10
 PASS ReadableStream with byte source: getReader(), then releaseLock() 
-FAIL ReadableStream with byte source: getReader() with mode set to byob, then releaseLock() ReadableStreamBYOBReader releaseLock() is not implemented
+PASS ReadableStream with byte source: getReader() with mode set to byob, then releaseLock() 
 PASS ReadableStream with byte source: Test that closing a stream does not release a reader automatically 
 PASS ReadableStream with byte source: Test that closing a stream does not release a BYOB reader automatically 
 PASS ReadableStream with byte source: Test that erroring a stream does not release a reader automatically 
index 2f4fcb7..9ab1060 100644 (file)
@@ -10,6 +10,9 @@ PASS If controller is closed after ReadableStreamBYOBReader creation, ReadableSt
 PASS If controller has already been closed when ReadableStreamBYOBReader is created, ReadableStreamBYOBReader.closed should be a promise resolved with undefined 
 PASS If controller is errored after ReadableStreamBYOBReader creation, ReadableStreamBYOBReader.closed should be a promise rejected with the same error 
 PASS If controller has already been errored when ReadableStreamBYOBReader is created, ReadableStreamBYOBReader.closed should be a promise rejected with the same error 
+PASS Calling ReadableStreamBYOBReader.releaseLock() with a this object different from ReadableStreamBYOBReader should be rejected 
+PASS Calling ReadableStreamBYOBReader.releaseLock() on a stream that is readable should result in ReadableStreamBYOBReader.closed promise to be rejected with a TypeError 
+PASS Calling ReadableStreamBYOBReader.releaseLock() on a stream that is not readable should result in ReadableStreamBYOBReader.closed promise to be rejected with a TypeError 
 PASS Getting a ReadableStreamBYOBReader should succeed 
 PASS ReadableStreamBYOBReader instances should have the correct list of properties 
 PASS Calling getReader() with a this object different from ReadableStream should throw a TypeError 
@@ -21,4 +24,7 @@ PASS If controller is closed after ReadableStreamBYOBReader creation, ReadableSt
 PASS If controller has already been closed when ReadableStreamBYOBReader is created, ReadableStreamBYOBReader.closed should be a promise resolved with undefined 
 PASS If controller is errored after ReadableStreamBYOBReader creation, ReadableStreamBYOBReader.closed should be a promise rejected with the same error 
 PASS If controller has already been errored when ReadableStreamBYOBReader is created, ReadableStreamBYOBReader.closed should be a promise rejected with the same error 
+PASS Calling ReadableStreamBYOBReader.releaseLock() with a this object different from ReadableStreamBYOBReader should be rejected 
+PASS Calling ReadableStreamBYOBReader.releaseLock() on a stream that is readable should result in ReadableStreamBYOBReader.closed promise to be rejected with a TypeError 
+PASS Calling ReadableStreamBYOBReader.releaseLock() on a stream that is not readable should result in ReadableStreamBYOBReader.closed promise to be rejected with a TypeError 
 
index b6f1545..63f7c99 100644 (file)
@@ -178,4 +178,41 @@ promise_test(function(test) {
     return promise_rejects(test, myError, reader.closed);
 }, "If controller has already been errored when ReadableStreamBYOBReader is created, ReadableStreamBYOBReader.closed should be a promise rejected with the same error");
 
+test(function() {
+    const rs = new ReadableStream({ type: 'bytes' });
+    const reader = rs.getReader({ mode: 'byob' });
+    assert_throws(new TypeError("Can only call ReadableStreamBYOBReader.releaseLock() on instances of ReadableStreamBYOBReader"),
+        function() { reader.releaseLock.apply(rs); });
+}, "Calling ReadableStreamBYOBReader.releaseLock() with a this object different from ReadableStreamBYOBReader should be rejected");
+
+promise_test(function(test) {
+    const rs = new ReadableStream({
+        type: "bytes"
+    });
+
+    const reader = rs.getReader({ mode: 'byob' });
+    reader.releaseLock();
+    const myError = new TypeError();
+
+    return promise_rejects(test, myError, reader.closed);
+}, "Calling ReadableStreamBYOBReader.releaseLock() on a stream that is readable should result in ReadableStreamBYOBReader.closed promise to be rejected with a TypeError");
+
+promise_test(function(test) {
+    let controller;
+
+    const rs = new ReadableStream({
+        start: function(c) {
+            controller = c;
+        },
+        type: "bytes"
+    });
+
+    const reader = rs.getReader({ mode: 'byob' });
+    controller.close();
+    reader.releaseLock();
+    const myError = new TypeError();
+
+    return promise_rejects(test, myError, reader.closed);
+}, "Calling ReadableStreamBYOBReader.releaseLock() on a stream that is not readable should result in ReadableStreamBYOBReader.closed promise to be rejected with a TypeError");
+
 done();
index 6bd3e16..6897179 100644 (file)
@@ -1,3 +1,21 @@
+2017-05-16  Romain Bellessort  <romain.bellessort@crf.canon.fr>
+
+        [Readable Streams API] Implement ReadableStreamBYOBReader releaseLock()
+        https://bugs.webkit.org/show_bug.cgi?id=172111
+
+        Reviewed by Chris Dumez.
+
+        Implemented ReadableStreamBYOBReader releaseLock():
+        - https://streams.spec.whatwg.org/#byob-reader-release-lock;
+        - https://streams.spec.whatwg.org/#readable-stream-reader-generic-release.
+
+        Added tests to check releaseLock behavior.
+
+        * Modules/streams/ReadableStreamBYOBReader.js:
+        (releaseLock): Implemented.
+        * Modules/streams/ReadableStreamInternals.js:
+        (readableStreamReaderGenericRelease): Aligned with spec.
+
 2017-05-16  Carlos Garcia Campos  <cgarcia@igalia.com>
 
         Unreviewed. Try to fix GTK+ build with MEDIA_STREAM enabled after r216918.
index b74b2ed..2494a0e 100644 (file)
@@ -49,8 +49,16 @@ function releaseLock()
 {
     "use strict";
 
-    // FIXME: Implement appropriate behavior.
-    @throwTypeError("ReadableStreamBYOBReader releaseLock() is not implemented");
+    if (!@isReadableStreamBYOBReader(this))
+        throw @makeThisTypeError("ReadableStreamBYOBReader", "releaseLock");
+
+    if (!this.@ownerReadableStream)
+        return;
+
+    if (this.@readIntoRequests.length)
+        @throwTypeError("There are still pending read requests, cannot release the lock");
+
+    @readableStreamReaderGenericRelease(this);
 }
 
 function closed()
index 3e20de2..af0fc13 100644 (file)
@@ -498,12 +498,12 @@ function readableStreamReaderGenericRelease(reader)
     @assert(!!reader.@ownerReadableStream);
     @assert(reader.@ownerReadableStream.@reader === reader);
 
-    if (reader.@ownerReadableStream.@state === @streamReadable) {
+    if (reader.@ownerReadableStream.@state === @streamReadable)
         reader.@closedPromiseCapability.@reject.@call(@undefined, new @TypeError("releasing lock of reader whose stream is still in readable state"));
-        reader.@closedPromiseCapability.@promise.@promiseIsHandled = true;
-    } else
+    else
         reader.@closedPromiseCapability = { @promise: @newHandledRejectedPromise(new @TypeError("reader released lock")) };
 
+    reader.@closedPromiseCapability.@promise.@promiseIsHandled = true;
     reader.@ownerReadableStream.@reader = @undefined;
-    reader.@ownerReadableStream = null;
+    reader.@ownerReadableStream = @undefined;
 }