[Readable Streams API] Implement canCloseOrEnqueue
https://bugs.webkit.org/show_bug.cgi?id=178005

Reviewed by Youenn Fablet.

Implemented readableStreamDefaultControllerCanCloseOrEnqueue [1]. This is
just a refactoring (based on spec) aiming at factorizing a set of tests
that are done at multiple places.

[1] https://streams.spec.whatwg.org/#readable-stream-default-controller-can-close-or-enqueue

No new tests (refactoring, no new behavior).

* Modules/streams/ReadableStreamDefaultController.js:
(enqueue): Updated.
(close): Updated.
* Modules/streams/ReadableStreamInternals.js:
(readableStreamDefaultControllerClose): Updated.
(readableStreamDefaultControllerCanCloseOrEnqueue): Added.


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@223044 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/Modules/streams/ReadableStreamInternals.js b/Source/WebCore/Modules/streams/ReadableStreamInternals.js
index 54277f3..869f416 100644
--- a/Source/WebCore/Modules/streams/ReadableStreamInternals.js
+++ b/Source/WebCore/Modules/streams/ReadableStreamInternals.js
@@ -319,9 +319,7 @@
 
     const stream = controller.@controlledReadableStream;
 
-    if (stream.@state === @streamClosed || stream.@state === @streamErrored)
-        return;
-    if (controller.@closeRequested)
+    if (!@readableStreamDefaultControllerCanCloseOrEnqueue(controller))
         return;
     if (!controller.@started)
         return;
@@ -423,12 +421,10 @@
 {
     "use strict";
 
-    const stream = controller.@controlledReadableStream;
-    @assert(!controller.@closeRequested);
-    @assert(stream.@state === @streamReadable);
+    @assert(@readableStreamDefaultControllerCanCloseOrEnqueue(controller));
     controller.@closeRequested = true;
     if (controller.@queue.content.length === 0)
-        @readableStreamClose(stream);
+        @readableStreamClose(controller.@controlledReadableStream);
 }
 
 function readableStreamClose(stream)
@@ -464,8 +460,7 @@
     "use strict";
 
     const stream = controller.@controlledReadableStream;
-    @assert(!controller.@closeRequested);
-    @assert(stream.@state === @streamReadable);
+    @assert(@readableStreamDefaultControllerCanCloseOrEnqueue(controller));
 
     if (@isReadableStreamLocked(stream) && stream.@reader.@readRequests.length) {
         @readableStreamFulfillReadRequest(stream, chunk, false);
@@ -541,3 +536,10 @@
     reader.@ownerReadableStream.@reader = @undefined;
     reader.@ownerReadableStream = @undefined;
 }
+
+function readableStreamDefaultControllerCanCloseOrEnqueue(controller)
+{
+    "use strict";
+
+    return !controller.@closeRequested && controller.@controlledReadableStream.@state === @streamReadable;
+}