Diff
Modified: trunk/Source/WebCore/ChangeLog (186108 => 186109)
--- trunk/Source/WebCore/ChangeLog 2015-06-30 06:02:24 UTC (rev 186108)
+++ trunk/Source/WebCore/ChangeLog 2015-06-30 06:47:19 UTC (rev 186109)
@@ -1,3 +1,27 @@
+2015-06-29 Youenn Fablet <[email protected]>
+
+ [Streams API] ReadableStreamReader.closed should use DOMPromise
+ https://bugs.webkit.org/show_bug.cgi?id=146406
+
+ Reviewed by Darin Adler.
+
+ Added storage of ClosedPromise as Optional of ReadableStream.
+ Updated code accordingly.
+
+ Covered by existing tests.
+
+ * Modules/streams/ReadableStream.cpp:
+ (WebCore::ReadableStream::clearCallbacks):
+ (WebCore::ReadableStream::releaseReader):
+ (WebCore::ReadableStream::changeStateToErrored):
+ (WebCore::ReadableStream::closed):
+ * Modules/streams/ReadableStream.h:
+ * Modules/streams/ReadableStreamReader.cpp:
+ (WebCore::ReadableStreamReader::closed):
+ * Modules/streams/ReadableStreamReader.h:
+ * bindings/js/JSReadableStreamReaderCustom.cpp:
+ (WebCore::JSReadableStreamReader::closed):
+
2015-06-29 Simon Fraser <[email protected]>
[iOS WK2] WKWebViews in Facebook app start off black
Modified: trunk/Source/WebCore/Modules/streams/ReadableStream.cpp (186108 => 186109)
--- trunk/Source/WebCore/Modules/streams/ReadableStream.cpp 2015-06-30 06:02:24 UTC (rev 186108)
+++ trunk/Source/WebCore/Modules/streams/ReadableStream.cpp 2015-06-30 06:47:19 UTC (rev 186109)
@@ -59,9 +59,7 @@
void ReadableStream::clearCallbacks()
{
- m_closedSuccessCallback = nullptr;
- m_closedFailureCallback = nullptr;
-
+ m_closedPromise = Nullopt;
m_readRequests.clear();
}
@@ -85,8 +83,8 @@
void ReadableStream::releaseReader()
{
- if (m_closedSuccessCallback)
- m_closedSuccessCallback();
+ if (m_closedPromise)
+ m_closedPromise.value().resolve(nullptr);
for (auto& request : m_readRequests)
request.endCallback();
@@ -103,8 +101,8 @@
m_state = State::Errored;
JSC::JSValue error = this->error();
- if (m_closedFailureCallback)
- m_closedFailureCallback(error);
+ if (m_closedPromise)
+ m_closedPromise.value().reject(error);
for (auto& request : m_readRequests)
request.failureCallback(error);
@@ -210,18 +208,17 @@
m_cancelPromise = Nullopt;
}
-void ReadableStream::closed(ClosedSuccessCallback&& successCallback, FailureCallback&& failureCallback)
+void ReadableStream::closed(ClosedPromise&& promise)
{
if (m_state == State::Closed) {
- successCallback();
+ promise.resolve(nullptr);
return;
}
if (m_state == State::Errored) {
- failureCallback(error());
+ promise.reject(error());
return;
}
- m_closedSuccessCallback = WTF::move(successCallback);
- m_closedFailureCallback = WTF::move(failureCallback);
+ m_closedPromise = WTF::move(promise);
}
void ReadableStream::read(ReadSuccessCallback&& successCallback, ReadEndCallback&& endCallback, FailureCallback&& failureCallback)
Modified: trunk/Source/WebCore/Modules/streams/ReadableStream.h (186108 => 186109)
--- trunk/Source/WebCore/Modules/streams/ReadableStream.h 2015-06-30 06:02:24 UTC (rev 186108)
+++ trunk/Source/WebCore/Modules/streams/ReadableStream.h 2015-06-30 06:47:19 UTC (rev 186109)
@@ -93,8 +93,8 @@
void cancel(JSC::JSValue, CancelPromise&&, ExceptionCode&);
void cancelNoCheck(JSC::JSValue, CancelPromise&&);
- typedef std::function<void()> ClosedSuccessCallback;
- void closed(ClosedSuccessCallback&&, FailureCallback&&);
+ typedef DOMPromise<std::nullptr_t, JSC::JSValue> ClosedPromise;
+ void closed(ClosedPromise&&);
typedef std::function<void(JSC::JSValue)> ReadSuccessCallback;
typedef std::function<void()> ReadEndCallback;
@@ -124,10 +124,8 @@
Vector<std::unique_ptr<ReadableStreamReader>> m_releasedReaders;
Optional<CancelPromise> m_cancelPromise;
+ Optional<ClosedPromise> m_closedPromise;
- ClosedSuccessCallback m_closedSuccessCallback;
- FailureCallback m_closedFailureCallback;
-
struct ReadCallbacks {
ReadSuccessCallback successCallback;
ReadEndCallback endCallback;
Modified: trunk/Source/WebCore/Modules/streams/ReadableStreamReader.cpp (186108 => 186109)
--- trunk/Source/WebCore/Modules/streams/ReadableStreamReader.cpp 2015-06-30 06:02:24 UTC (rev 186108)
+++ trunk/Source/WebCore/Modules/streams/ReadableStreamReader.cpp 2015-06-30 06:47:19 UTC (rev 186109)
@@ -46,13 +46,13 @@
m_stream.cancelNoCheck(reason, WTF::move(promise));
}
-void ReadableStreamReader::closed(ReadableStream::ClosedSuccessCallback&& successCallback, ReadableStream::FailureCallback&& failureCallback)
+void ReadableStreamReader::closed(ReadableStream::ClosedPromise&& promise)
{
if (m_stream.isReadable() && m_stream.reader() != this) {
- successCallback();
+ promise.resolve(nullptr);
return;
}
- m_stream.closed(WTF::move(successCallback), WTF::move(failureCallback));
+ m_stream.closed(WTF::move(promise));
}
void ReadableStreamReader::read(ReadableStream::ReadSuccessCallback&& successCallback, ReadableStream::ReadEndCallback&& endCallback, ReadableStream::FailureCallback&& failureCallback)
Modified: trunk/Source/WebCore/Modules/streams/ReadableStreamReader.h (186108 => 186109)
--- trunk/Source/WebCore/Modules/streams/ReadableStreamReader.h 2015-06-30 06:02:24 UTC (rev 186108)
+++ trunk/Source/WebCore/Modules/streams/ReadableStreamReader.h 2015-06-30 06:47:19 UTC (rev 186109)
@@ -54,7 +54,7 @@
: m_stream(stream) { }
void cancel(JSC::JSValue, ReadableStream::CancelPromise&&);
- void closed(ReadableStream::ClosedSuccessCallback&&, ReadableStream::FailureCallback&&);
+ void closed(ReadableStream::ClosedPromise&&);
void read(ReadableStream::ReadSuccessCallback&&, ReadableStream::ReadEndCallback&&, ReadableStream::FailureCallback&&);
void releaseLock(ExceptionCode&);
Modified: trunk/Source/WebCore/bindings/js/JSReadableStreamReaderCustom.cpp (186108 => 186109)
--- trunk/Source/WebCore/bindings/js/JSReadableStreamReaderCustom.cpp 2015-06-30 06:02:24 UTC (rev 186108)
+++ trunk/Source/WebCore/bindings/js/JSReadableStreamReaderCustom.cpp 2015-06-30 06:47:19 UTC (rev 186109)
@@ -72,17 +72,8 @@
return m_closedPromiseDeferred->promise();
const_cast<JSReadableStreamReader*>(this)->m_closedPromiseDeferred.set(exec->vm(), JSPromiseDeferred::create(exec, globalObject()));
- DeferredWrapper wrapper(exec, globalObject(), m_closedPromiseDeferred.get());
+ impl().closed(DeferredWrapper(exec, globalObject(), m_closedPromiseDeferred.get()));
- auto successCallback = [wrapper]() mutable {
- wrapper.resolve(jsUndefined());
- };
- auto failureCallback = [wrapper](JSValue value) mutable {
- wrapper.reject(value);
- };
-
- impl().closed(WTF::move(successCallback), WTF::move(failureCallback));
-
return m_closedPromiseDeferred->promise();
}