<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[206508] trunk/Source/WebCore</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/206508">206508</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2016-09-28 02:17:57 -0700 (Wed, 28 Sep 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>[Streams API] Align cancelReadableStream() with spec
https://bugs.webkit.org/show_bug.cgi?id=162556

Patch by Romain Bellessort &lt;romain.bellessort@crf.canon.fr&gt; on 2016-09-28
Reviewed by Xabier Rodriguez-Calvar.

Aligned cancelReadableStream() with Streams API. In particular, private cancel() method
was added to ReadableStreamDefaultController and function name was replaced by readableStreamCancel().
Implementation of cancel() (as well as pull()) is actually made in ReadableStreamInternals.js to
avoid creating new function for each controller.

No change in behaviour.

* Modules/streams/ReadableStream.js:
(cancel): Updated with reference to readableStreamCancel().
* Modules/streams/ReadableStreamDefaultReader.js:
(cancel): Updated with reference to readableStreamCancel().
* Modules/streams/ReadableStreamInternals.js:
(privateInitializeReadableStreamDefaultController): Refer to external functions (cancel/pull) to avoid
creating new functions.
(teeReadableStreamBranch2CancelFunction): Updated with reference to readableStreamCancel().
(readableStreamCancel): New name for cancelReadableStream(), behaviour aligned with spec.
(readableStreamDefaultControllerCancel): Added to avoid creating new function for each controller.
(readableStreamDefaultControllerPull): Added to avoid creating new function for each controller.
(readFromReadableStreamDefaultReader): Updated call to pull method to pass controller.
* bindings/js/WebCoreBuiltinNames.h: Added &quot;cancel&quot;.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreModulesstreamsReadableStreamjs">trunk/Source/WebCore/Modules/streams/ReadableStream.js</a></li>
<li><a href="#trunkSourceWebCoreModulesstreamsReadableStreamDefaultReaderjs">trunk/Source/WebCore/Modules/streams/ReadableStreamDefaultReader.js</a></li>
<li><a href="#trunkSourceWebCoreModulesstreamsReadableStreamInternalsjs">trunk/Source/WebCore/Modules/streams/ReadableStreamInternals.js</a></li>
<li><a href="#trunkSourceWebCorebindingsjsWebCoreBuiltinNamesh">trunk/Source/WebCore/bindings/js/WebCoreBuiltinNames.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (206507 => 206508)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-09-28 08:17:55 UTC (rev 206507)
+++ trunk/Source/WebCore/ChangeLog        2016-09-28 09:17:57 UTC (rev 206508)
</span><span class="lines">@@ -1,3 +1,31 @@
</span><ins>+2016-09-28  Romain Bellessort  &lt;romain.bellessort@crf.canon.fr&gt;
+
+        [Streams API] Align cancelReadableStream() with spec
+        https://bugs.webkit.org/show_bug.cgi?id=162556
+
+        Reviewed by Xabier Rodriguez-Calvar.
+
+        Aligned cancelReadableStream() with Streams API. In particular, private cancel() method
+        was added to ReadableStreamDefaultController and function name was replaced by readableStreamCancel().
+        Implementation of cancel() (as well as pull()) is actually made in ReadableStreamInternals.js to
+        avoid creating new function for each controller.
+
+        No change in behaviour.
+
+        * Modules/streams/ReadableStream.js:
+        (cancel): Updated with reference to readableStreamCancel().
+        * Modules/streams/ReadableStreamDefaultReader.js:
+        (cancel): Updated with reference to readableStreamCancel().
+        * Modules/streams/ReadableStreamInternals.js:
+        (privateInitializeReadableStreamDefaultController): Refer to external functions (cancel/pull) to avoid
+        creating new functions.
+        (teeReadableStreamBranch2CancelFunction): Updated with reference to readableStreamCancel().
+        (readableStreamCancel): New name for cancelReadableStream(), behaviour aligned with spec.
+        (readableStreamDefaultControllerCancel): Added to avoid creating new function for each controller.
+        (readableStreamDefaultControllerPull): Added to avoid creating new function for each controller.
+        (readFromReadableStreamDefaultReader): Updated call to pull method to pass controller.
+        * bindings/js/WebCoreBuiltinNames.h: Added &quot;cancel&quot;.
+
</ins><span class="cx"> 2016-09-27  Joonghun Park  &lt;jh718.park@samsung.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [EFL] Fix debug build break since r206481. Unreviewed
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesstreamsReadableStreamjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/streams/ReadableStream.js (206507 => 206508)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/streams/ReadableStream.js        2016-09-28 08:17:55 UTC (rev 206507)
+++ trunk/Source/WebCore/Modules/streams/ReadableStream.js        2016-09-28 09:17:57 UTC (rev 206508)
</span><span class="lines">@@ -74,7 +74,7 @@
</span><span class="cx">     if (@isReadableStreamLocked(this))
</span><span class="cx">         return @Promise.@reject(new @TypeError(&quot;ReadableStream is locked&quot;));
</span><span class="cx"> 
</span><del>-    return @cancelReadableStream(this, reason);
</del><ins>+    return @readableStreamCancel(this, reason);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> function getReader(options)
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesstreamsReadableStreamDefaultReaderjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/streams/ReadableStreamDefaultReader.js (206507 => 206508)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/streams/ReadableStreamDefaultReader.js        2016-09-28 08:17:55 UTC (rev 206507)
+++ trunk/Source/WebCore/Modules/streams/ReadableStreamDefaultReader.js        2016-09-28 09:17:57 UTC (rev 206508)
</span><span class="lines">@@ -35,7 +35,7 @@
</span><span class="cx">     if (!this.@ownerReadableStream)
</span><span class="cx">         return @Promise.@reject(new @TypeError(&quot;cancel() called on a reader owned by no readable stream&quot;));
</span><span class="cx"> 
</span><del>-    return @cancelReadableStream(this.@ownerReadableStream, reason);
</del><ins>+    return @readableStreamCancel(this.@ownerReadableStream, reason);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> function read()
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesstreamsReadableStreamInternalsjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/streams/ReadableStreamInternals.js (206507 => 206508)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/streams/ReadableStreamInternals.js        2016-09-28 08:17:55 UTC (rev 206507)
+++ trunk/Source/WebCore/Modules/streams/ReadableStreamInternals.js        2016-09-28 09:17:57 UTC (rev 206508)
</span><span class="lines">@@ -82,22 +82,9 @@
</span><span class="cx">             @readableStreamDefaultControllerError(controller, error);
</span><span class="cx">     });
</span><span class="cx"> 
</span><del>-    this.@pull = function() {
-        &quot;use strict&quot;;
</del><ins>+    this.@cancel = @readableStreamDefaultControllerCancel;
</ins><span class="cx"> 
</span><del>-        const stream = controller.@controlledReadableStream;
-        if (controller.@queue.content.length) {
-            const chunk = @dequeueValue(controller.@queue);
-            if (controller.@closeRequested &amp;&amp; controller.@queue.content.length === 0)
-                @closeReadableStream(stream);
-            else
-                @requestReadableStreamPull(controller);
-            return @Promise.@resolve({value: chunk, done: false});
-        }
-        const pendingPromise = @readableStreamAddReadRequest(stream);
-        @requestReadableStreamPull(controller);
-        return pendingPromise;
-    }
</del><ins>+    this.@pull = @readableStreamDefaultControllerPull;
</ins><span class="cx"> 
</span><span class="cx">     return this;
</span><span class="cx"> }
</span><span class="lines">@@ -206,7 +193,7 @@
</span><span class="cx">         teeState.canceled1 = true;
</span><span class="cx">         teeState.reason1 = r;
</span><span class="cx">         if (teeState.canceled2) {
</span><del>-            @cancelReadableStream(stream, [teeState.reason1, teeState.reason2]).@then(
</del><ins>+            @readableStreamCancel(stream, [teeState.reason1, teeState.reason2]).@then(
</ins><span class="cx">                 teeState.cancelPromiseCapability.@resolve,
</span><span class="cx">                 teeState.cancelPromiseCapability.@reject);
</span><span class="cx">         }
</span><span class="lines">@@ -222,7 +209,7 @@
</span><span class="cx">         teeState.canceled2 = true;
</span><span class="cx">         teeState.reason2 = r;
</span><span class="cx">         if (teeState.canceled1) {
</span><del>-            @cancelReadableStream(stream, [teeState.reason1, teeState.reason2]).@then(
</del><ins>+            @readableStreamCancel(stream, [teeState.reason1, teeState.reason2]).@then(
</ins><span class="cx">                 teeState.cancelPromiseCapability.@resolve,
</span><span class="cx">                 teeState.cancelPromiseCapability.@reject);
</span><span class="cx">         }
</span><span class="lines">@@ -336,7 +323,7 @@
</span><span class="cx">    return controller.@strategy.highWaterMark - controller.@queue.size;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-function cancelReadableStream(stream, reason)
</del><ins>+function readableStreamCancel(stream, reason)
</ins><span class="cx"> {
</span><span class="cx">     &quot;use strict&quot;;
</span><span class="cx"> 
</span><span class="lines">@@ -346,18 +333,35 @@
</span><span class="cx">     if (stream.@state === @streamErrored)
</span><span class="cx">         return @Promise.@reject(stream.@storedError);
</span><span class="cx">     @closeReadableStream(stream);
</span><del>-    // FIXME: Fix below, which is a temporary solution to the case where controller is undefined.
-    // This issue is due to the fact that in previous version of the spec, cancel was associated
-    // to underlyingSource, whereas in new version it is associated to controller. As this patch
-    // does not yet fully implement the new version, this solution is used.
-    const controller = stream.@readableStreamController;
-    var underlyingSource = @undefined;
-    if (controller !== @undefined)
-        underlyingSource = controller.@underlyingSource;
-    return @promiseInvokeOrNoop(underlyingSource, &quot;cancel&quot;, [reason]).@then(function() { });
</del><ins>+    return stream.@readableStreamController.@cancel(stream.@readableStreamController, reason).@then(function() {  });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+function readableStreamDefaultControllerCancel(controller, reason)
+{
+    &quot;use strict&quot;;
</ins><span class="cx"> 
</span><ins>+    controller.@queue = @newQueue();
+    return @promiseInvokeOrNoop(controller.@underlyingSource, &quot;cancel&quot;, [reason]);
+}
+
+function readableStreamDefaultControllerPull(controller)
+{
+    &quot;use strict&quot;;
+
+    const stream = controller.@controlledReadableStream;
+    if (controller.@queue.content.length) {
+        const chunk = @dequeueValue(controller.@queue);
+        if (controller.@closeRequested &amp;&amp; controller.@queue.content.length === 0)
+            @closeReadableStream(stream);
+        else
+            @requestReadableStreamPull(controller);
+        return @Promise.@resolve({value: chunk, done: false});
+    }
+    const pendingPromise = @readableStreamAddReadRequest(stream);
+    @requestReadableStreamPull(controller);
+    return pendingPromise;
+}
+
</ins><span class="cx"> function readableStreamDefaultControllerClose(controller)
</span><span class="cx"> {
</span><span class="cx">     &quot;use strict&quot;;
</span><span class="lines">@@ -433,7 +437,7 @@
</span><span class="cx">         return @Promise.@reject(stream.@storedError);
</span><span class="cx">     @assert(stream.@state === @streamReadable);
</span><span class="cx"> 
</span><del>-    return stream.@readableStreamController.@pull();
</del><ins>+    return stream.@readableStreamController.@pull(stream.@readableStreamController);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> function readableStreamAddReadRequest(stream)
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsWebCoreBuiltinNamesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/WebCoreBuiltinNames.h (206507 => 206508)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/WebCoreBuiltinNames.h        2016-09-28 08:17:55 UTC (rev 206507)
+++ trunk/Source/WebCore/bindings/js/WebCoreBuiltinNames.h        2016-09-28 09:17:57 UTC (rev 206508)
</span><span class="lines">@@ -35,6 +35,7 @@
</span><span class="cx">     macro(addTrack) \
</span><span class="cx">     macro(appendFromJS) \
</span><span class="cx">     macro(body) \
</span><ins>+    macro(cancel) \
</ins><span class="cx">     macro(cloneForJS) \
</span><span class="cx">     macro(closeRequested) \
</span><span class="cx">     macro(closedPromiseCapability) \
</span></span></pre>
</div>
</div>

</body>
</html>