[Readable Streams API] Fix filling of descriptor from queue
authorromain.bellessort@crf.canon.fr <romain.bellessort@crf.canon.fr@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 16 Dec 2017 18:59:29 +0000 (18:59 +0000)
committerromain.bellessort@crf.canon.fr <romain.bellessort@crf.canon.fr@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 16 Dec 2017 18:59:29 +0000 (18:59 +0000)
https://bugs.webkit.org/show_bug.cgi?id=172717

Reviewed by Youenn Fablet.

LayoutTests/imported/w3c:

Updated test expectations.

* web-platform-tests/streams/readable-byte-streams/detached-buffers-expected.txt: Updated.
* web-platform-tests/streams/readable-byte-streams/detached-buffers.dedicatedworker-expected.txt: Updated.
* 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:

Fixed the filling of descriptor from queue (step 10.d at [1]). When first implemented,
spec comprised a bug and code was not reachable. Spec has now been fixed and code can
now be reached.

[1] https://streams.spec.whatwg.org/#readable-byte-stream-controller-fill-pull-into-descriptor-from-queue

No new tests (covered by WPT tests, whose expectations have been updated).

* Modules/streams/ReadableByteStreamInternals.js:
(readableByteStreamControllerFillDescriptorFromQueue): Updated.

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

LayoutTests/imported/w3c/ChangeLog
LayoutTests/imported/w3c/web-platform-tests/streams/readable-byte-streams/detached-buffers-expected.txt
LayoutTests/imported/w3c/web-platform-tests/streams/readable-byte-streams/detached-buffers.dedicatedworker-expected.txt
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
Source/WebCore/ChangeLog
Source/WebCore/Modules/streams/ReadableByteStreamInternals.js

index 1bb5a64..03245f7 100644 (file)
@@ -1,3 +1,17 @@
+2017-12-16  Romain Bellessort  <romain.bellessort@crf.canon.fr>
+
+        [Readable Streams API] Fix filling of descriptor from queue
+        https://bugs.webkit.org/show_bug.cgi?id=172717
+
+        Reviewed by Youenn Fablet.
+
+        Updated test expectations.
+
+        * web-platform-tests/streams/readable-byte-streams/detached-buffers-expected.txt: Updated.
+        * web-platform-tests/streams/readable-byte-streams/detached-buffers.dedicatedworker-expected.txt: Updated.
+        * web-platform-tests/streams/readable-byte-streams/general-expected.txt: Updated.
+        * web-platform-tests/streams/readable-byte-streams/general.dedicatedworker-expected.txt: Updated.
+
 2017-12-16  Youenn Fablet  <youenn@apple.com>
 
         Skip SharedWorker and NavigationPreload service worker tests
index d9b9bbd..82811fb 100644 (file)
@@ -2,7 +2,7 @@
 Harness Error (TIMEOUT), message = null
 
 FAIL ReadableStream with byte source: read()ing from a closed stream still transfers the buffer assert_not_equals: a different ArrayBuffer must underlie the value got disallowed value object "[object ArrayBuffer]"
-FAIL ReadableStream with byte source: read()ing from a stream with queued chunks still transfers the buffer assert_array_equals: The value read must be the enqueued Uint8Array, not the original values property 0, expected 1 but got 4
+FAIL ReadableStream with byte source: read()ing from a stream with queued chunks still transfers the buffer assert_not_equals: a different ArrayBuffer must underlie the value got disallowed value object "[object ArrayBuffer]"
 FAIL ReadableStream with byte source: enqueuing an already-detached buffer throws assert_throws: enqueuing an already-detached buffer must throw function "() => c.enqueue(view)" did not throw
 TIMEOUT ReadableStream with byte source: reading into an already-detached buffer rejects Test timed out
 FAIL ReadableStream with byte source: respond() throws if the BYOB request's buffer has been detached (in the readable state) assert_throws: respond() must throw if the corresponding view has become detached function "() => c.byobRequest.respond(1)" did not throw
index d9b9bbd..82811fb 100644 (file)
@@ -2,7 +2,7 @@
 Harness Error (TIMEOUT), message = null
 
 FAIL ReadableStream with byte source: read()ing from a closed stream still transfers the buffer assert_not_equals: a different ArrayBuffer must underlie the value got disallowed value object "[object ArrayBuffer]"
-FAIL ReadableStream with byte source: read()ing from a stream with queued chunks still transfers the buffer assert_array_equals: The value read must be the enqueued Uint8Array, not the original values property 0, expected 1 but got 4
+FAIL ReadableStream with byte source: read()ing from a stream with queued chunks still transfers the buffer assert_not_equals: a different ArrayBuffer must underlie the value got disallowed value object "[object ArrayBuffer]"
 FAIL ReadableStream with byte source: enqueuing an already-detached buffer throws assert_throws: enqueuing an already-detached buffer must throw function "() => c.enqueue(view)" did not throw
 TIMEOUT ReadableStream with byte source: reading into an already-detached buffer rejects Test timed out
 FAIL ReadableStream with byte source: respond() throws if the BYOB request's buffer has been detached (in the readable state) assert_throws: respond() must throw if the corresponding view has become detached function "() => c.byobRequest.respond(1)" did not throw
index c132f4c..b8cd1bb 100644 (file)
@@ -24,7 +24,7 @@ PASS ReadableStream with byte source: Push source that doesn't understand pull s
 PASS ReadableStream with byte source: read(), but pull() function is not callable 
 PASS ReadableStream with byte source: read(view), but pull() function is not callable 
 PASS ReadableStream with byte source: enqueue() with Uint16Array, getReader(), then read() 
-FAIL ReadableStream with byte source: enqueue(), read(view) partially, then read() assert_equals: expected 1 but got 0
+PASS ReadableStream with byte source: enqueue(), read(view) partially, then read() 
 PASS ReadableStream with byte source: getReader(), enqueue(), close(), then read() 
 PASS ReadableStream with byte source: enqueue(), close(), getReader(), then read() 
 PASS ReadableStream with byte source: Respond to pull() by enqueue() 
@@ -32,18 +32,18 @@ PASS ReadableStream with byte source: Respond to pull() by enqueue() asynchronou
 PASS ReadableStream with byte source: read(view), then respond() 
 PASS ReadableStream with byte source: read(view), then respond() with a transferred ArrayBuffer 
 PASS ReadableStream with byte source: read(view), then respond() with too big value 
-FAIL ReadableStream with byte source: respond(3) to read(view) with 2 element Uint16Array enqueues the 1 byte remainder assert_equals: expected 3 but got 0
-FAIL ReadableStream with byte source: enqueue(), getReader(), then read(view) assert_equals: expected 1 but got 0
+PASS ReadableStream with byte source: respond(3) to read(view) with 2 element Uint16Array enqueues the 1 byte remainder 
+PASS ReadableStream with byte source: enqueue(), getReader(), then read(view) 
 PASS ReadableStream with byte source: enqueue(), getReader(), then cancel() (mode = not BYOB) 
 PASS ReadableStream with byte source: enqueue(), getReader(), then cancel() (mode = BYOB) 
 PASS ReadableStream with byte source: getReader(), read(view), then cancel() 
 PASS ReadableStream with byte source: cancel() with partially filled pending pull() request 
-FAIL ReadableStream with byte source: enqueue(), getReader(), then read(view) where view.buffer is not fully covered by view assert_equals: expected 1 but got 0
-FAIL ReadableStream with byte source: Multiple enqueue(), getReader(), then read(view) assert_equals: Contents are set from the first chunk expected 123 but got 0
-FAIL ReadableStream with byte source: enqueue(), getReader(), then read(view) with a bigger view assert_equals: expected 1 but got 0
-FAIL ReadableStream with byte source: enqueue(), getReader(), then read(view) with a smaller views assert_equals: expected 1 but got 0
-FAIL ReadableStream with byte source: enqueue() 1 byte, getReader(), then read(view) with Uint16Array assert_equals: expected 43775 but got 43520
-FAIL ReadableStream with byte source: enqueue() 3 byte, getReader(), then read(view) with 2-element Uint16Array assert_equals: Contents are set expected 1 but got 0
+PASS ReadableStream with byte source: enqueue(), getReader(), then read(view) where view.buffer is not fully covered by view 
+PASS ReadableStream with byte source: Multiple enqueue(), getReader(), then read(view) 
+PASS ReadableStream with byte source: enqueue(), getReader(), then read(view) with a bigger view 
+PASS ReadableStream with byte source: enqueue(), getReader(), then read(view) with a smaller views 
+PASS ReadableStream with byte source: enqueue() 1 byte, getReader(), then read(view) with Uint16Array 
+PASS ReadableStream with byte source: enqueue() 3 byte, getReader(), then read(view) with 2-element Uint16Array 
 PASS ReadableStream with byte source: read(view) with Uint16Array on close()-d stream with 1 byte enqueue()-d must fail 
 PASS ReadableStream with byte source: A stream must be errored if close()-d before fulfilling read(view) with Uint16Array 
 PASS ReadableStream with byte source: Throw if close()-ed more than once 
index c132f4c..b8cd1bb 100644 (file)
@@ -24,7 +24,7 @@ PASS ReadableStream with byte source: Push source that doesn't understand pull s
 PASS ReadableStream with byte source: read(), but pull() function is not callable 
 PASS ReadableStream with byte source: read(view), but pull() function is not callable 
 PASS ReadableStream with byte source: enqueue() with Uint16Array, getReader(), then read() 
-FAIL ReadableStream with byte source: enqueue(), read(view) partially, then read() assert_equals: expected 1 but got 0
+PASS ReadableStream with byte source: enqueue(), read(view) partially, then read() 
 PASS ReadableStream with byte source: getReader(), enqueue(), close(), then read() 
 PASS ReadableStream with byte source: enqueue(), close(), getReader(), then read() 
 PASS ReadableStream with byte source: Respond to pull() by enqueue() 
@@ -32,18 +32,18 @@ PASS ReadableStream with byte source: Respond to pull() by enqueue() asynchronou
 PASS ReadableStream with byte source: read(view), then respond() 
 PASS ReadableStream with byte source: read(view), then respond() with a transferred ArrayBuffer 
 PASS ReadableStream with byte source: read(view), then respond() with too big value 
-FAIL ReadableStream with byte source: respond(3) to read(view) with 2 element Uint16Array enqueues the 1 byte remainder assert_equals: expected 3 but got 0
-FAIL ReadableStream with byte source: enqueue(), getReader(), then read(view) assert_equals: expected 1 but got 0
+PASS ReadableStream with byte source: respond(3) to read(view) with 2 element Uint16Array enqueues the 1 byte remainder 
+PASS ReadableStream with byte source: enqueue(), getReader(), then read(view) 
 PASS ReadableStream with byte source: enqueue(), getReader(), then cancel() (mode = not BYOB) 
 PASS ReadableStream with byte source: enqueue(), getReader(), then cancel() (mode = BYOB) 
 PASS ReadableStream with byte source: getReader(), read(view), then cancel() 
 PASS ReadableStream with byte source: cancel() with partially filled pending pull() request 
-FAIL ReadableStream with byte source: enqueue(), getReader(), then read(view) where view.buffer is not fully covered by view assert_equals: expected 1 but got 0
-FAIL ReadableStream with byte source: Multiple enqueue(), getReader(), then read(view) assert_equals: Contents are set from the first chunk expected 123 but got 0
-FAIL ReadableStream with byte source: enqueue(), getReader(), then read(view) with a bigger view assert_equals: expected 1 but got 0
-FAIL ReadableStream with byte source: enqueue(), getReader(), then read(view) with a smaller views assert_equals: expected 1 but got 0
-FAIL ReadableStream with byte source: enqueue() 1 byte, getReader(), then read(view) with Uint16Array assert_equals: expected 43775 but got 43520
-FAIL ReadableStream with byte source: enqueue() 3 byte, getReader(), then read(view) with 2-element Uint16Array assert_equals: Contents are set expected 1 but got 0
+PASS ReadableStream with byte source: enqueue(), getReader(), then read(view) where view.buffer is not fully covered by view 
+PASS ReadableStream with byte source: Multiple enqueue(), getReader(), then read(view) 
+PASS ReadableStream with byte source: enqueue(), getReader(), then read(view) with a bigger view 
+PASS ReadableStream with byte source: enqueue(), getReader(), then read(view) with a smaller views 
+PASS ReadableStream with byte source: enqueue() 1 byte, getReader(), then read(view) with Uint16Array 
+PASS ReadableStream with byte source: enqueue() 3 byte, getReader(), then read(view) with 2-element Uint16Array 
 PASS ReadableStream with byte source: read(view) with Uint16Array on close()-d stream with 1 byte enqueue()-d must fail 
 PASS ReadableStream with byte source: A stream must be errored if close()-d before fulfilling read(view) with Uint16Array 
 PASS ReadableStream with byte source: Throw if close()-ed more than once 
index ba57c93..e694888 100644 (file)
@@ -1,3 +1,21 @@
+2017-12-16  Romain Bellessort  <romain.bellessort@crf.canon.fr>
+
+        [Readable Streams API] Fix filling of descriptor from queue
+        https://bugs.webkit.org/show_bug.cgi?id=172717
+
+        Reviewed by Youenn Fablet.
+
+        Fixed the filling of descriptor from queue (step 10.d at [1]). When first implemented,
+        spec comprised a bug and code was not reachable. Spec has now been fixed and code can
+        now be reached.
+
+        [1] https://streams.spec.whatwg.org/#readable-byte-stream-controller-fill-pull-into-descriptor-from-queue
+
+        No new tests (covered by WPT tests, whose expectations have been updated).
+
+        * Modules/streams/ReadableByteStreamInternals.js:
+        (readableByteStreamControllerFillDescriptorFromQueue): Updated.
+
 2017-12-16  Brady Eidson  <beidson@apple.com>
 
         Implement getting ServiceWorker registrations for the WKWebsiteDataStore API
index 16ca572..e2d676e 100644 (file)
@@ -503,15 +503,10 @@ function readableByteStreamControllerFillDescriptorFromQueue(controller, pullInt
         // Copy appropriate part of pullIntoDescriptor.buffer to headOfQueue.buffer.
         // Remark: this implementation is not completely aligned on the definition of CopyDataBlockBytes
         // operation of ECMAScript (the case of Shared Data Block is not considered here, but it doesn't seem to be an issue).
-        let fromIndex = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled;
-        let count = bytesToCopy;
-        let toIndex = headOfQueue.byteOffset;
-        while (count > 0) {
-            headOfQueue.buffer[toIndex] = pullIntoDescriptor.buffer[fromIndex];
-            toIndex++;
-            fromIndex++;
-            count--;
-        }
+        const destStart = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled;
+        // FIXME: As indicated in comments of bug 172717, access to set is not safe. However, using prototype.@set.@call does
+        // not work (@set is undefined). A safe way to do that is needed.
+        new @Uint8Array(pullIntoDescriptor.buffer).set(new @Uint8Array(headOfQueue.buffer, headOfQueue.byteOffset, bytesToCopy), destStart);
 
         if (headOfQueue.byteLength === bytesToCopy)
             controller.@queue.content.@shift();