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)