Title: [186414] trunk
Revision
186414
Author
[email protected]
Date
2015-07-07 01:00:22 -0700 (Tue, 07 Jul 2015)

Log Message

Source/WebCore:
[Streams API] Remove ReadableStreamReader.read() custom binding
https://bugs.webkit.org/show_bug.cgi?id=146643

Reviewed by Darin Adler.

Moved ReadableStreamReader.read handling from callbacks to promises.
Introduced DOMPromiseIteratorWithCallback for that purpose: it takes resolve() to resolve a promise with a not-ending iterator value,
resolveEnd() to resolve a promise with a terminating iterator value and reject().
Added template helper routine to convert typed values to JS iterator wrapping the value.
Removed ReadableStreamReader.read custom binding.

Covered by rebased tests.

* Modules/streams/ReadableStream.cpp: Updated code to use DOMPromiseIteratorWithCallback API.
(WebCore::ReadableStream::releaseReader):
(WebCore::ReadableStream::changeStateToErrored):
(WebCore::ReadableStream::read):
(WebCore::ReadableStream::resolveReadCallback):
* Modules/streams/ReadableStream.h:
* Modules/streams/ReadableStreamReader.cpp:
(WebCore::ReadableStreamReader::read):
* Modules/streams/ReadableStreamReader.h:
* Modules/streams/ReadableStreamReader.idl: Removed custom binding.
* bindings/js/JSDOMBinding.h:
(WebCore::toJSIterator): create JS iterator from typed value.
(WebCore::toJSIteratorEnd): create JS end iterator.
* bindings/js/JSDOMPromise.cpp:
(WebCore::DeferredWrapper::globalObject): Added globaObject getter and removed promise getter.
* bindings/js/JSDOMPromise.h:
(WebCore::DOMPromiseIteratorWithCallback::DOMPromiseIteratorWithCallback):
(WebCore::Error>::resolve):
(WebCore::Error>::resolveEnd):
(WebCore::Error>::reject):
* bindings/js/JSReadableStreamReaderCustom.cpp: Removed custom binding.

LayoutTests:
[Streams API] Remove ReadableStreamStream.read() custom binding
https://bugs.webkit.org/show_bug.cgi?id=146643

Reviewed by Darin Adler.

* streams/reference-implementation/brand-checks-expected.txt:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (186413 => 186414)


--- trunk/LayoutTests/ChangeLog	2015-07-07 07:55:50 UTC (rev 186413)
+++ trunk/LayoutTests/ChangeLog	2015-07-07 08:00:22 UTC (rev 186414)
@@ -1,3 +1,12 @@
+2015-07-07  Youenn Fablet  <[email protected]>
+
+        [Streams API] Remove ReadableStreamStream.read() custom binding
+        https://bugs.webkit.org/show_bug.cgi?id=146643
+
+        Reviewed by Darin Adler.
+
+        * streams/reference-implementation/brand-checks-expected.txt:
+
 2015-07-06  Zalan Bujtas  <[email protected]>
 
         REGRESSION: Slider thumb does not render properly (image tests with <input type="range">)

Modified: trunk/LayoutTests/streams/reference-implementation/brand-checks-expected.txt (186413 => 186414)


--- trunk/LayoutTests/streams/reference-implementation/brand-checks-expected.txt	2015-07-07 07:55:50 UTC (rev 186413)
+++ trunk/LayoutTests/streams/reference-implementation/brand-checks-expected.txt	2015-07-07 08:00:22 UTC (rev 186414)
@@ -5,8 +5,8 @@
 PASS ReadableStreamReader enforces a brand check on its argument 
 FAIL ReadableStreamReader.prototype.closed enforces a brand check undefined is not an object (evaluating 'Object.getOwnPropertyDescriptor(obj, getterName).get')
 PASS ReadableStreamReader.prototype.cancel enforces a brand check 
-FAIL ReadableStreamReader.prototype.read enforces a brand check Can only call ReadableStreamReader.read on instances of ReadableStreamReader
-FAIL ReadableStreamReader.prototype.read enforces a brand check Can only call ReadableStreamReader.read on instances of ReadableStreamReader
+PASS ReadableStreamReader.prototype.read enforces a brand check 
+PASS ReadableStreamReader.prototype.read enforces a brand check 
 PASS ReadableStreamReader.prototype.releaseLock enforces a brand check 
 PASS ReadableStreamController enforces a brand check on its argument 
 PASS ReadableStreamController can't be given a fully-constructed ReadableStream 

Modified: trunk/Source/WebCore/ChangeLog (186413 => 186414)


--- trunk/Source/WebCore/ChangeLog	2015-07-07 07:55:50 UTC (rev 186413)
+++ trunk/Source/WebCore/ChangeLog	2015-07-07 08:00:22 UTC (rev 186414)
@@ -1,3 +1,40 @@
+2015-07-07  Youenn Fablet  <[email protected]>
+
+        [Streams API] Remove ReadableStreamReader.read() custom binding
+        https://bugs.webkit.org/show_bug.cgi?id=146643
+
+        Reviewed by Darin Adler.
+
+        Moved ReadableStreamReader.read handling from callbacks to promises.
+        Introduced DOMPromiseIteratorWithCallback for that purpose: it takes resolve() to resolve a promise with a not-ending iterator value,
+        resolveEnd() to resolve a promise with a terminating iterator value and reject().
+        Added template helper routine to convert typed values to JS iterator wrapping the value.
+        Removed ReadableStreamReader.read custom binding.
+
+        Covered by rebased tests.
+
+        * Modules/streams/ReadableStream.cpp: Updated code to use DOMPromiseIteratorWithCallback API.
+        (WebCore::ReadableStream::releaseReader):
+        (WebCore::ReadableStream::changeStateToErrored):
+        (WebCore::ReadableStream::read):
+        (WebCore::ReadableStream::resolveReadCallback):
+        * Modules/streams/ReadableStream.h:
+        * Modules/streams/ReadableStreamReader.cpp:
+        (WebCore::ReadableStreamReader::read):
+        * Modules/streams/ReadableStreamReader.h:
+        * Modules/streams/ReadableStreamReader.idl: Removed custom binding.
+        * bindings/js/JSDOMBinding.h:
+        (WebCore::toJSIterator): create JS iterator from typed value.
+        (WebCore::toJSIteratorEnd): create JS end iterator.
+        * bindings/js/JSDOMPromise.cpp:
+        (WebCore::DeferredWrapper::globalObject): Added globaObject getter and removed promise getter.
+        * bindings/js/JSDOMPromise.h:
+        (WebCore::DOMPromiseIteratorWithCallback::DOMPromiseIteratorWithCallback):
+        (WebCore::Error>::resolve):
+        (WebCore::Error>::resolveEnd):
+        (WebCore::Error>::reject):
+        * bindings/js/JSReadableStreamReaderCustom.cpp: Removed custom binding.
+
 2015-07-06  Zalan Bujtas  <[email protected]>
 
         REGRESSION: Slider thumb does not render properly (image tests with <input type="range">)

Modified: trunk/Source/WebCore/Modules/streams/ReadableStream.cpp (186413 => 186414)


--- trunk/Source/WebCore/Modules/streams/ReadableStream.cpp	2015-07-07 07:55:50 UTC (rev 186413)
+++ trunk/Source/WebCore/Modules/streams/ReadableStream.cpp	2015-07-07 08:00:22 UTC (rev 186414)
@@ -94,7 +94,7 @@
         m_closedPromise.value().resolve(nullptr);
 
     for (auto& request : m_readRequests)
-        request.endCallback();
+        request.resolveEnd();
 
     clearCallbacks();
     if (m_reader)
@@ -112,7 +112,7 @@
         m_closedPromise.value().reject(error);
 
     for (auto& request : m_readRequests)
-        request.failureCallback(error);
+        request.reject(error);
 
     clearCallbacks();
     if (m_reader)
@@ -236,25 +236,25 @@
     m_closedPromise = WTF::move(promise);
 }
 
-void ReadableStream::read(ReadSuccessCallback&& successCallback, ReadEndCallback&& endCallback, FailureCallback&& failureCallback)
+void ReadableStream::read(ReadPromise&& readPromise)
 {
     if (m_state == State::Closed) {
-        endCallback();
+        readPromise.resolveEnd();
         return;
     }
     if (m_state == State::Errored) {
-        failureCallback(error());
+        readPromise.reject(error());
         return;
     }
     if (hasValue()) {
-        successCallback(read());
+        readPromise.resolve(read());
         if (!m_closeRequested)
             pull();
         else if (!hasValue())
             close();
         return;
     }
-    m_readRequests.append({ WTF::move(successCallback), WTF::move(endCallback), WTF::move(failureCallback) });
+    m_readRequests.append(WTF::move(readPromise));
     pull();
 }
 
@@ -263,7 +263,7 @@
     if (m_readRequests.isEmpty())
         return false;
 
-    m_readRequests.takeFirst().successCallback(value);
+    m_readRequests.takeFirst().resolve(value);
     return true;
 }
 

Modified: trunk/Source/WebCore/Modules/streams/ReadableStream.h (186413 => 186414)


--- trunk/Source/WebCore/Modules/streams/ReadableStream.h	2015-07-07 07:55:50 UTC (rev 186413)
+++ trunk/Source/WebCore/Modules/streams/ReadableStream.h	2015-07-07 08:00:22 UTC (rev 186414)
@@ -89,8 +89,6 @@
     void notifyCancelSucceeded();
     void notifyCancelFailed();
 
-    typedef std::function<void(JSC::JSValue)> FailureCallback;
-
     typedef DOMPromise<std::nullptr_t, JSC::JSValue> CancelPromise;
     void cancel(JSC::JSValue, CancelPromise&&, ExceptionCode&);
     void cancelNoCheck(JSC::JSValue, CancelPromise&&);
@@ -98,9 +96,8 @@
     typedef DOMPromise<std::nullptr_t, JSC::JSValue> ClosedPromise;
     void closed(ClosedPromise&&);
 
-    typedef std::function<void(JSC::JSValue)> ReadSuccessCallback;
-    typedef std::function<void()> ReadEndCallback;
-    void read(ReadSuccessCallback&&, ReadEndCallback&&, FailureCallback&&);
+    typedef DOMPromiseIteratorWithCallback<JSC::JSValue, JSC::JSValue> ReadPromise;
+    void read(ReadPromise&&);
 
 protected:
     explicit ReadableStream(ScriptExecutionContext&);
@@ -128,12 +125,7 @@
     Optional<CancelPromise> m_cancelPromise;
     Optional<ClosedPromise> m_closedPromise;
 
-    struct ReadCallbacks {
-        ReadSuccessCallback successCallback;
-        ReadEndCallback endCallback;
-        FailureCallback failureCallback;
-    };
-    Deque<ReadCallbacks> m_readRequests;
+    Deque<ReadPromise> m_readRequests;
 
     bool m_isStarted { false };
     bool m_isPulling { false };

Modified: trunk/Source/WebCore/Modules/streams/ReadableStreamReader.cpp (186413 => 186414)


--- trunk/Source/WebCore/Modules/streams/ReadableStreamReader.cpp	2015-07-07 07:55:50 UTC (rev 186413)
+++ trunk/Source/WebCore/Modules/streams/ReadableStreamReader.cpp	2015-07-07 08:00:22 UTC (rev 186414)
@@ -55,13 +55,13 @@
     m_stream.closed(WTF::move(promise));
 }
 
-void ReadableStreamReader::read(ReadableStream::ReadSuccessCallback&& successCallback, ReadableStream::ReadEndCallback&& endCallback, ReadableStream::FailureCallback&& failureCallback)
+void ReadableStreamReader::read(ReadableStream::ReadPromise&& promise)
 {
     if (m_stream.isReadable() && m_stream.reader() != this) {
-        endCallback();
+        promise.resolveEnd();
         return;
     }
-    m_stream.read(WTF::move(successCallback), WTF::move(endCallback), WTF::move(failureCallback));
+    m_stream.read(WTF::move(promise));
 }
 
 void ReadableStreamReader::releaseLock(ExceptionCode& ec)

Modified: trunk/Source/WebCore/Modules/streams/ReadableStreamReader.h (186413 => 186414)


--- trunk/Source/WebCore/Modules/streams/ReadableStreamReader.h	2015-07-07 07:55:50 UTC (rev 186413)
+++ trunk/Source/WebCore/Modules/streams/ReadableStreamReader.h	2015-07-07 08:00:22 UTC (rev 186414)
@@ -55,7 +55,7 @@
 
     void cancel(JSC::JSValue, ReadableStream::CancelPromise&&);
     void closed(ReadableStream::ClosedPromise&&);
-    void read(ReadableStream::ReadSuccessCallback&&, ReadableStream::ReadEndCallback&&, ReadableStream::FailureCallback&&);
+    void read(ReadableStream::ReadPromise&&);
     void releaseLock(ExceptionCode&);
 
     void ref() { m_stream.ref(); }

Modified: trunk/Source/WebCore/Modules/streams/ReadableStreamReader.idl (186413 => 186414)


--- trunk/Source/WebCore/Modules/streams/ReadableStreamReader.idl	2015-07-07 07:55:50 UTC (rev 186413)
+++ trunk/Source/WebCore/Modules/streams/ReadableStreamReader.idl	2015-07-07 08:00:22 UTC (rev 186414)
@@ -33,7 +33,7 @@
     NoInterfaceObject,
     SkipVTableValidation
 ] interface ReadableStreamReader {
-    [Custom] Object read();
+    Promise read();
     Promise cancel([Default=Undefined] optional any reason);
     [RaisesException] void releaseLock();
 

Modified: trunk/Source/WebCore/bindings/js/JSDOMBinding.h (186413 => 186414)


--- trunk/Source/WebCore/bindings/js/JSDOMBinding.h	2015-07-07 07:55:50 UTC (rev 186413)
+++ trunk/Source/WebCore/bindings/js/JSDOMBinding.h	2015-07-07 08:00:22 UTC (rev 186414)
@@ -35,6 +35,7 @@
 #include <heap/Weak.h>
 #include <heap/WeakInlines.h>
 #include <runtime/Error.h>
+#include <runtime/IteratorOperations.h>
 #include <runtime/JSArray.h>
 #include <runtime/JSArrayBuffer.h>
 #include <runtime/JSCJSValueInlines.h>
@@ -396,6 +397,21 @@
     return jsStringOrNull(exec, value);
 }
 
+inline JSC::JSValue toJSIterator(JSC::ExecState& state, JSDOMGlobalObject&, JSC::JSValue value)
+{
+    return createIteratorResultObject(&state, value, false);
+}
+
+template<typename T> inline JSC::JSValue toJSIterator(JSC::ExecState& state, JSDOMGlobalObject& globalObject, const T& value)
+{
+    return createIteratorResultObject(&state, toJS(&state, &globalObject, value), false);
+}
+
+inline JSC::JSValue toJSIteratorEnd(JSC::ExecState& state)
+{
+    return createIteratorResultObject(&state, JSC::jsUndefined(), true);
+}
+
 template<typename T> struct JSValueTraits {
     static JSC::JSValue arrayJSValue(JSC::ExecState* exec, JSDOMGlobalObject* globalObject, const T& value)
     {

Modified: trunk/Source/WebCore/bindings/js/JSDOMPromise.cpp (186413 => 186414)


--- trunk/Source/WebCore/bindings/js/JSDOMPromise.cpp	2015-07-07 07:55:50 UTC (rev 186413)
+++ trunk/Source/WebCore/bindings/js/JSDOMPromise.cpp	2015-07-07 08:00:22 UTC (rev 186414)
@@ -41,12 +41,11 @@
 {
 }
 
-JSObject* DeferredWrapper::promise() const
+JSDOMGlobalObject& DeferredWrapper::globalObject() const
 {
-    // FIXME: Remove this accessor once ReadableStreamReader custom binding does not need it.
-    ASSERT(m_deferred);
-    return m_deferred->promise();
-}
+    ASSERT(m_globalObject);
+    return *m_globalObject.get();
+} 
 
 void DeferredWrapper::callFunction(ExecState& exec, JSValue function, JSValue resolution)
 {

Modified: trunk/Source/WebCore/bindings/js/JSDOMPromise.h (186413 => 186414)


--- trunk/Source/WebCore/bindings/js/JSDOMPromise.h	2015-07-07 07:55:50 UTC (rev 186413)
+++ trunk/Source/WebCore/bindings/js/JSDOMPromise.h	2015-07-07 08:00:22 UTC (rev 186414)
@@ -45,7 +45,7 @@
     template<class RejectResultType>
     void reject(const RejectResultType&);
 
-    JSC::JSObject* promise() const;
+    JSDOMGlobalObject& globalObject() const;
 
 private:
     void callFunction(JSC::ExecState&, JSC::JSValue function, JSC::JSValue resolution);
@@ -96,10 +96,6 @@
         ASSERT(m_resolveCallback);
         ASSERT(m_rejectCallback);
     }
-    explicit DOMPromiseWithCallback(DOMPromiseWithCallback&& promise)
-        : m_wrapper(WTF::move(promise.m_wrapper))
-        , m_resolveCallback(WTF::move(promise.m_resolveCallback))
-        , m_rejectCallback(WTF::move(promise.m_rejectCallback)) { }
 
     void resolve(const Value&);
     void reject(const Error&);
@@ -110,6 +106,31 @@
     std::function<void(const Error&)> m_rejectCallback;
 };
 
+template<typename Value, typename Error>
+class DOMPromiseIteratorWithCallback {
+public:
+    DOMPromiseIteratorWithCallback(DeferredWrapper&& wrapper) : m_wrapper(WTF::move(wrapper)) { }
+    DOMPromiseIteratorWithCallback(std::function<void(const Value&)> resolve, std::function<void()> resolveEnd, std::function<void(const Error&)> reject)
+        : m_resolveCallback(WTF::move(resolve))
+        , m_resolveEndCallback(WTF::move(resolveEnd))
+        , m_rejectCallback(WTF::move(reject))
+    {
+        ASSERT(m_resolveCallback);
+        ASSERT(m_resolveEndCallback);
+        ASSERT(m_rejectCallback);
+    }
+
+    void resolve(const Value&);
+    void resolveEnd();
+    void reject(const Error&);
+
+private:
+    Optional<DeferredWrapper> m_wrapper;
+    std::function<void(const Value&)> m_resolveCallback;
+    std::function<void()> m_resolveEndCallback;
+    std::function<void(const Error&)> m_rejectCallback;
+};
+
 template<class ResolveResultType>
 inline void DeferredWrapper::resolve(const ResolveResultType& result)
 {
@@ -227,7 +248,6 @@
         m_resolveCallback(value);
         return;
     }
-    ASSERT(m_wrapper);
     m_wrapper.value().resolve(value);
 }
 
@@ -238,12 +258,42 @@
         m_rejectCallback(error);
         return;
     }
-    ASSERT(m_wrapper);
     m_wrapper.value().reject(error);
 }
 
+template<typename Value, typename Error>
+inline void DOMPromiseIteratorWithCallback<Value, Error>::resolve(const Value& value)
+{
+    if (m_resolveCallback) {
+        m_resolveCallback(value);
+        return;
+    }
+    JSDOMGlobalObject& globalObject = m_wrapper.value().globalObject();
+    m_wrapper.value().resolve(toJSIterator(*globalObject.globalExec(), globalObject, value));
 }
 
+template<typename Value, typename Error>
+inline void DOMPromiseIteratorWithCallback<Value, Error>::resolveEnd()
+{
+    if (m_resolveEndCallback) {
+        m_resolveEndCallback();
+        return;
+    }
+    m_wrapper.value().resolve(toJSIteratorEnd(*m_wrapper.value().globalObject().globalExec()));
+}
+
+template<typename Value, typename Error>
+inline void DOMPromiseIteratorWithCallback<Value, Error>::reject(const Error& error)
+{
+    if (m_rejectCallback) {
+        m_rejectCallback(error);
+        return;
+    }
+    m_wrapper.value().reject(error);
+}
+
+}
+
 #endif // ENABLE(PROMISES)
 
 #endif // JSDOMPromise_h

Modified: trunk/Source/WebCore/bindings/js/JSReadableStreamReaderCustom.cpp (186413 => 186414)


--- trunk/Source/WebCore/bindings/js/JSReadableStreamReaderCustom.cpp	2015-07-07 07:55:50 UTC (rev 186413)
+++ trunk/Source/WebCore/bindings/js/JSReadableStreamReaderCustom.cpp	2015-07-07 08:00:22 UTC (rev 186414)
@@ -44,28 +44,6 @@
 
 namespace WebCore {
 
-JSValue JSReadableStreamReader::read(ExecState* exec)
-{
-    JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(exec, globalObject());
-    DeferredWrapper wrapper(exec, globalObject(), promiseDeferred);
-
-    auto successCallback = [wrapper](JSValue value) mutable {
-        JSValue result = createIteratorResultObject(wrapper.promise()->globalObject()->globalExec(), value, false);
-        wrapper.resolve(result);
-    };
-    auto endCallback = [wrapper]() mutable {
-        JSValue result = createIteratorResultObject(wrapper.promise()->globalObject()->globalExec(), JSC::jsUndefined(), true);
-        wrapper.resolve(result);
-    };
-    auto failureCallback = [wrapper](JSValue value) mutable {
-        wrapper.reject(value);
-    };
-
-    impl().read(WTF::move(successCallback), WTF::move(endCallback), WTF::move(failureCallback));
-
-    return promiseDeferred->promise();
-}
-
 JSValue JSReadableStreamReader::closed(ExecState* exec) const
 {
     if (m_closedPromiseDeferred)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to