Title: [200766] trunk/Source/WebCore
Revision
200766
Author
[email protected]
Date
2016-05-12 02:36:00 -0700 (Thu, 12 May 2016)

Log Message

DOMPromise should only restrict the resolution type
https://bugs.webkit.org/show_bug.cgi?id=157307

Reviewed by Darin Adler.

Removing from DOMPromise the rejection template parameter.
Supported rejection types are integers (Exception codes) and DOM objects (DOMError typically).

Updated toJS and DeferredWrapper to accept Ref<>&& and RefPtr<>&&.
Previously Ref<>&& were not accepted and only "const RefPtr<>&" was accepted.
This in turn created an unecessary churn count when calling toJS.

Changes also allow in most cases to remove the need for explictly declaring the
rejection/resolution type.

Minor refactoring of FontFaceSet promise handling to use DOMPromise in lieu of DeferredWrapper.

Covered by existing tests.
Changes should not be visible from user scripts.

* Modules/fetch/FetchBody.cpp:
(WebCore::FetchBody::consume):
(WebCore::FetchBody::consumeText):
(WebCore::blobFromArrayBuffer):
(WebCore::FetchBody::loadingFailed):
* Modules/fetch/FetchBody.h:
(WebCore::FetchBody::formData):
* Modules/fetch/FetchBodyOwner.cpp:
(WebCore::FetchBodyOwner::arrayBuffer):
(WebCore::FetchBodyOwner::blob):
(WebCore::FetchBodyOwner::formData):
(WebCore::FetchBodyOwner::json):
(WebCore::FetchBodyOwner::text):
* Modules/fetch/FetchResponse.cpp:
(WebCore::FetchResponse::BodyLoader::didReceiveResponse):
* Modules/fetch/FetchResponse.h:
* Modules/mediastream/MediaDevices.h:
* Modules/mediastream/PeerConnectionBackend.h:
* Modules/mediastream/UserMediaRequest.cpp:
(WebCore::UserMediaRequest::didCreateStream):
* Modules/streams/ReadableStreamSource.h:
* Modules/webaudio/AudioContext.h:
* bindings/js/JSDOMBinding.h:
(WebCore::toJS):
(WebCore::jsPair):
* bindings/js/JSDOMPromise.cpp:
(WebCore::fulfillPromiseWithJSON):
* bindings/js/JSDOMPromise.h:
(WebCore::TypeInspector::decltype):
(WebCore::TypeInspector::testIsVector):
(WebCore::TypeInspector::testIsRefOrRefPtr):
(WebCore::DeferredWrapper::resolve):
(WebCore::DeferredWrapper::reject):
(WebCore::DOMPromise::resolve):
(WebCore::DOMPromise::reject):
(WebCore::DeferredWrapper::resolveWithValue):
(WebCore::DeferredWrapper::rejectWithValue):
(WebCore::callPromiseFunction):
* bindings/js/JSSubtleCryptoCustom.cpp:
(WebCore::JSSubtleCrypto::importKey):
(WebCore::JSSubtleCrypto::unwrapKey):
* css/FontFace.h:
* css/FontFaceSet.cpp:
(WebCore::FontFaceSet::PendingPromise::PendingPromise):
(WebCore::FontFaceSet::load):
(WebCore::FontFaceSet::registerReady):
* css/FontFaceSet.h:
* html/HTMLMediaElement.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (200765 => 200766)


--- trunk/Source/WebCore/ChangeLog	2016-05-12 09:28:04 UTC (rev 200765)
+++ trunk/Source/WebCore/ChangeLog	2016-05-12 09:36:00 UTC (rev 200766)
@@ -1,3 +1,74 @@
+2016-05-12  Youenn Fablet  <[email protected]>
+
+        DOMPromise should only restrict the resolution type
+        https://bugs.webkit.org/show_bug.cgi?id=157307
+
+        Reviewed by Darin Adler.
+
+        Removing from DOMPromise the rejection template parameter.
+        Supported rejection types are integers (Exception codes) and DOM objects (DOMError typically).
+
+        Updated toJS and DeferredWrapper to accept Ref<>&& and RefPtr<>&&.
+        Previously Ref<>&& were not accepted and only "const RefPtr<>&" was accepted.
+        This in turn created an unecessary churn count when calling toJS.
+
+        Changes also allow in most cases to remove the need for explictly declaring the
+        rejection/resolution type.
+
+        Minor refactoring of FontFaceSet promise handling to use DOMPromise in lieu of DeferredWrapper.
+
+        Covered by existing tests.
+        Changes should not be visible from user scripts.
+
+        * Modules/fetch/FetchBody.cpp:
+        (WebCore::FetchBody::consume):
+        (WebCore::FetchBody::consumeText):
+        (WebCore::blobFromArrayBuffer):
+        (WebCore::FetchBody::loadingFailed):
+        * Modules/fetch/FetchBody.h:
+        (WebCore::FetchBody::formData):
+        * Modules/fetch/FetchBodyOwner.cpp:
+        (WebCore::FetchBodyOwner::arrayBuffer):
+        (WebCore::FetchBodyOwner::blob):
+        (WebCore::FetchBodyOwner::formData):
+        (WebCore::FetchBodyOwner::json):
+        (WebCore::FetchBodyOwner::text):
+        * Modules/fetch/FetchResponse.cpp:
+        (WebCore::FetchResponse::BodyLoader::didReceiveResponse):
+        * Modules/fetch/FetchResponse.h:
+        * Modules/mediastream/MediaDevices.h:
+        * Modules/mediastream/PeerConnectionBackend.h:
+        * Modules/mediastream/UserMediaRequest.cpp:
+        (WebCore::UserMediaRequest::didCreateStream):
+        * Modules/streams/ReadableStreamSource.h:
+        * Modules/webaudio/AudioContext.h:
+        * bindings/js/JSDOMBinding.h:
+        (WebCore::toJS):
+        (WebCore::jsPair):
+        * bindings/js/JSDOMPromise.cpp:
+        (WebCore::fulfillPromiseWithJSON):
+        * bindings/js/JSDOMPromise.h:
+        (WebCore::TypeInspector::decltype):
+        (WebCore::TypeInspector::testIsVector):
+        (WebCore::TypeInspector::testIsRefOrRefPtr):
+        (WebCore::DeferredWrapper::resolve):
+        (WebCore::DeferredWrapper::reject):
+        (WebCore::DOMPromise::resolve):
+        (WebCore::DOMPromise::reject):
+        (WebCore::DeferredWrapper::resolveWithValue):
+        (WebCore::DeferredWrapper::rejectWithValue):
+        (WebCore::callPromiseFunction):
+        * bindings/js/JSSubtleCryptoCustom.cpp:
+        (WebCore::JSSubtleCrypto::importKey):
+        (WebCore::JSSubtleCrypto::unwrapKey):
+        * css/FontFace.h:
+        * css/FontFaceSet.cpp:
+        (WebCore::FontFaceSet::PendingPromise::PendingPromise):
+        (WebCore::FontFaceSet::load):
+        (WebCore::FontFaceSet::registerReady):
+        * css/FontFaceSet.h:
+        * html/HTMLMediaElement.h:
+
 2016-05-12  Manuel Rego Casasnovas  <[email protected]>
 
         [css-grid] Incorrect parsing when using just 'span" as grid-line value

Modified: trunk/Source/WebCore/Modules/fetch/FetchBody.cpp (200765 => 200766)


--- trunk/Source/WebCore/Modules/fetch/FetchBody.cpp	2016-05-12 09:28:04 UTC (rev 200765)
+++ trunk/Source/WebCore/Modules/fetch/FetchBody.cpp	2016-05-12 09:36:00 UTC (rev 200766)
@@ -43,7 +43,7 @@
 
 namespace WebCore {
 
-static RefPtr<Blob> blobFromArrayBuffer(ArrayBuffer*, const String&);
+static Ref<Blob> blobFromArrayBuffer(ArrayBuffer*, const String&);
 
 FetchBody::FetchBody(Ref<Blob>&& blob)
     : m_type(Type::Blob)
@@ -141,7 +141,7 @@
     }
 
     // FIXME: Support other types.
-    promise.reject<ExceptionCode>(0);
+    promise.reject(0);
 }
 
 #if ENABLE(STREAMS_API)
@@ -200,7 +200,7 @@
         return;
     }
     String contentType = Blob::normalizedContentType(extractMIMETypeFromMediaType(m_mimeType));
-    promise.resolve<RefPtr<Blob>>(Blob::create(extractFromText(), contentType));
+    promise.resolve(Blob::create(extractFromText(), contentType));
 }
 
 FetchLoader::Type FetchBody::loadingType(Consumer::Type type)
@@ -236,7 +236,7 @@
     return value;
 }
 
-static inline RefPtr<Blob> blobFromArrayBuffer(ArrayBuffer* buffer, const String& contentType)
+static inline Ref<Blob> blobFromArrayBuffer(ArrayBuffer* buffer, const String& contentType)
 {
     if (!buffer)
         return Blob::create(Vector<uint8_t>(), contentType);
@@ -259,7 +259,7 @@
 void FetchBody::loadingFailed()
 {
     ASSERT(m_consumer);
-    m_consumer->promise.reject<ExceptionCode>(0);
+    m_consumer->promise.reject(0);
     m_consumer = Nullopt;
 }
 

Modified: trunk/Source/WebCore/Modules/fetch/FetchBody.h (200765 => 200766)


--- trunk/Source/WebCore/Modules/fetch/FetchBody.h	2016-05-12 09:28:04 UTC (rev 200765)
+++ trunk/Source/WebCore/Modules/fetch/FetchBody.h	2016-05-12 09:36:00 UTC (rev 200766)
@@ -53,7 +53,7 @@
     void blob(FetchBodyOwner&, DeferredWrapper&&);
     void json(FetchBodyOwner&, DeferredWrapper&&);
     void text(FetchBodyOwner&, DeferredWrapper&&);
-    void formData(FetchBodyOwner&, DeferredWrapper&& promise) { promise.reject<ExceptionCode>(0); }
+    void formData(FetchBodyOwner&, DeferredWrapper&& promise) { promise.reject(0); }
 
 #if ENABLE(STREAMS_API)
     void consumeAsStream(FetchBodyOwner&, FetchResponseSource&);

Modified: trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.cpp (200765 => 200766)


--- trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.cpp	2016-05-12 09:28:04 UTC (rev 200765)
+++ trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.cpp	2016-05-12 09:36:00 UTC (rev 200766)
@@ -75,7 +75,7 @@
         return;
     }
     if (isDisturbed()) {
-        promise.reject<ExceptionCode>(TypeError);
+        promise.reject(TypeError);
         return;
     }
     m_isDisturbed = true;
@@ -85,11 +85,11 @@
 void FetchBodyOwner::blob(DeferredWrapper&& promise)
 {
     if (m_body.isEmpty()) {
-        promise.resolve<RefPtr<Blob>>(Blob::create());
+        promise.resolve(Blob::create());
         return;
     }
     if (isDisturbed()) {
-        promise.reject<ExceptionCode>(TypeError);
+        promise.reject(TypeError);
         return;
     }
     m_isDisturbed = true;
@@ -99,11 +99,11 @@
 void FetchBodyOwner::formData(DeferredWrapper&& promise)
 {
     if (m_body.isEmpty()) {
-        promise.reject<ExceptionCode>(0);
+        promise.reject(0);
         return;
     }
     if (isDisturbed()) {
-        promise.reject<ExceptionCode>(TypeError);
+        promise.reject(TypeError);
         return;
     }
     m_isDisturbed = true;
@@ -113,11 +113,11 @@
 void FetchBodyOwner::json(DeferredWrapper&& promise)
 {
     if (m_body.isEmpty()) {
-        promise.reject<ExceptionCode>(SYNTAX_ERR);
+        promise.reject(SYNTAX_ERR);
         return;
     }
     if (isDisturbed()) {
-        promise.reject<ExceptionCode>(TypeError);
+        promise.reject(TypeError);
         return;
     }
     m_isDisturbed = true;
@@ -131,7 +131,7 @@
         return;
     }
     if (isDisturbed()) {
-        promise.reject<ExceptionCode>(TypeError);
+        promise.reject(TypeError);
         return;
     }
     m_isDisturbed = true;

Modified: trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp (200765 => 200766)


--- trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp	2016-05-12 09:28:04 UTC (rev 200765)
+++ trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp	2016-05-12 09:36:00 UTC (rev 200766)
@@ -213,7 +213,7 @@
     m_response.m_response = resourceResponse;
     m_response.m_headers->filterAndFill(resourceResponse.httpHeaderFields(), FetchHeaders::Guard::Response);
 
-    std::exchange(m_promise, Nullopt)->resolve(&m_response);
+    std::exchange(m_promise, Nullopt)->resolve(m_response);
 }
 
 void FetchResponse::BodyLoader::didReceiveData(const char* data, size_t size)

Modified: trunk/Source/WebCore/Modules/fetch/FetchResponse.h (200765 => 200766)


--- trunk/Source/WebCore/Modules/fetch/FetchResponse.h	2016-05-12 09:28:04 UTC (rev 200765)
+++ trunk/Source/WebCore/Modules/fetch/FetchResponse.h	2016-05-12 09:36:00 UTC (rev 200766)
@@ -54,7 +54,7 @@
     static Ref<FetchResponse> error(ScriptExecutionContext&);
     static RefPtr<FetchResponse> redirect(ScriptExecutionContext&, const String&, int, ExceptionCode&);
 
-    using FetchPromise = DOMPromise<RefPtr<FetchResponse>, ExceptionCode>;
+    using FetchPromise = DOMPromise<FetchResponse>;
     static void fetch(ScriptExecutionContext&, FetchRequest&, const Dictionary&, FetchPromise&&);
     static void fetch(ScriptExecutionContext&, const String&, const Dictionary&, FetchPromise&&);
 

Modified: trunk/Source/WebCore/Modules/mediastream/MediaDevices.h (200765 => 200766)


--- trunk/Source/WebCore/Modules/mediastream/MediaDevices.h	2016-05-12 09:28:04 UTC (rev 200765)
+++ trunk/Source/WebCore/Modules/mediastream/MediaDevices.h	2016-05-12 09:36:00 UTC (rev 200766)
@@ -58,8 +58,8 @@
 
     Document* document() const;
 
-    typedef DOMPromise<RefPtr<MediaStream>, RefPtr<NavigatorUserMediaError>> Promise;
-    typedef DOMPromise<MediaDeviceInfoVector, ExceptionCode> EnumerateDevicesPromise;
+    typedef DOMPromise<MediaStream> Promise;
+    typedef DOMPromise<MediaDeviceInfoVector> EnumerateDevicesPromise;
 
     void getUserMedia(const Dictionary&, Promise&&, ExceptionCode&) const;
     void enumerateDevices(EnumerateDevicesPromise&&, ExceptionCode&) const;

Modified: trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h (200765 => 200766)


--- trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h	2016-05-12 09:28:04 UTC (rev 200765)
+++ trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h	2016-05-12 09:36:00 UTC (rev 200766)
@@ -53,9 +53,9 @@
 class ScriptExecutionContext;
 
 namespace PeerConnection {
-typedef DOMPromise<RefPtr<RTCSessionDescription>, RefPtr<DOMError>> SessionDescriptionPromise;
-typedef DOMPromise<std::nullptr_t, RefPtr<DOMError>> VoidPromise;
-typedef DOMPromise<RefPtr<RTCStatsResponse>, RefPtr<DOMError>> StatsPromise;
+typedef DOMPromise<RTCSessionDescription> SessionDescriptionPromise;
+typedef DOMPromise<std::nullptr_t> VoidPromise;
+typedef DOMPromise<RTCStatsResponse> StatsPromise;
 }
 
 class PeerConnectionBackendClient {

Modified: trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp (200765 => 200766)


--- trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp	2016-05-12 09:28:04 UTC (rev 200765)
+++ trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp	2016-05-12 09:36:00 UTC (rev 200766)
@@ -172,7 +172,7 @@
         return;
 
     // 4 - Create the MediaStream and pass it to the success callback.
-    RefPtr<MediaStream> stream = MediaStream::create(*m_scriptExecutionContext, privateStream);
+    Ref<MediaStream> stream = MediaStream::create(*m_scriptExecutionContext, privateStream);
     if (m_audioConstraints) {
         for (auto& track : stream->getAudioTracks()) {
             track->applyConstraints(*m_audioConstraints);

Modified: trunk/Source/WebCore/Modules/streams/ReadableStreamSource.h (200765 => 200766)


--- trunk/Source/WebCore/Modules/streams/ReadableStreamSource.h	2016-05-12 09:28:04 UTC (rev 200765)
+++ trunk/Source/WebCore/Modules/streams/ReadableStreamSource.h	2016-05-12 09:36:00 UTC (rev 200766)
@@ -44,7 +44,7 @@
 public:
     virtual ~ReadableStreamSource() { }
 
-    typedef DOMPromise<std::nullptr_t, ExceptionCode> Promise;
+    typedef DOMPromise<std::nullptr_t> Promise;
 
     void start(ReadableStreamController&&, Promise&&);
     void cancel(JSC::JSValue);

Modified: trunk/Source/WebCore/Modules/webaudio/AudioContext.h (200765 => 200766)


--- trunk/Source/WebCore/Modules/webaudio/AudioContext.h	2016-05-12 09:28:04 UTC (rev 200765)
+++ trunk/Source/WebCore/Modules/webaudio/AudioContext.h	2016-05-12 09:36:00 UTC (rev 200766)
@@ -109,7 +109,7 @@
     using ActiveDOMObject::suspend;
     using ActiveDOMObject::resume;
 
-    typedef DOMPromise<std::nullptr_t, ExceptionCode> Promise;
+    typedef DOMPromise<std::nullptr_t> Promise;
 
     void suspend(Promise&&);
     void resume(Promise&&);

Modified: trunk/Source/WebCore/bindings/js/JSDOMBinding.h (200765 => 200766)


--- trunk/Source/WebCore/bindings/js/JSDOMBinding.h	2016-05-12 09:28:04 UTC (rev 200765)
+++ trunk/Source/WebCore/bindings/js/JSDOMBinding.h	2016-05-12 09:36:00 UTC (rev 200766)
@@ -251,7 +251,8 @@
 JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, JSC::ArrayBuffer*);
 JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, JSC::ArrayBufferView*);
 JSC::JSValue toJS(JSC::ExecState*, JSC::JSGlobalObject*, JSC::ArrayBufferView*);
-template<typename T> JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, RefPtr<T>);
+template<typename T> JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, RefPtr<T>&);
+template<typename T> JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, RefPtr<T>&&);
 template<typename T> JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, PassRefPtr<T>);
 template<typename T> JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, const Vector<T>&);
 template<typename T> JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, const Vector<RefPtr<T>>&);
@@ -267,7 +268,7 @@
 WEBCORE_EXPORT JSC::JSValue jsArray(JSC::ExecState*, JSDOMGlobalObject*, PassRefPtr<DOMStringList>);
 
 JSC::JSValue jsPair(JSC::ExecState&, JSDOMGlobalObject*, JSC::JSValue, JSC::JSValue);
-template<typename FirstType, typename SecondType> JSC::JSValue jsPair(JSC::ExecState&, JSDOMGlobalObject*, const FirstType&, const SecondType&);
+template<typename FirstType, typename SecondType> JSC::JSValue jsPair(JSC::ExecState&, JSDOMGlobalObject*, FirstType&, SecondType&);
 
 RefPtr<JSC::ArrayBufferView> toArrayBufferView(JSC::JSValue);
 RefPtr<JSC::Int8Array> toInt8Array(JSC::JSValue);
@@ -540,11 +541,16 @@
     return view->wrap(exec, globalObject);
 }
 
-template<typename T> inline JSC::JSValue toJS(JSC::ExecState* exec, JSDOMGlobalObject* globalObject, RefPtr<T> ptr)
+template<typename T> inline JSC::JSValue toJS(JSC::ExecState* exec, JSDOMGlobalObject* globalObject, RefPtr<T>& ptr)
 {
     return toJS(exec, globalObject, ptr.get());
 }
 
+template<typename T> inline JSC::JSValue toJS(JSC::ExecState* exec, JSDOMGlobalObject* globalObject, RefPtr<T>&& ptr)
+{
+    return toJS(exec, globalObject, ptr.get());
+}
+
 template<typename T> inline JSC::JSValue toJS(JSC::ExecState* exec, JSDOMGlobalObject* globalObject, PassRefPtr<T> ptr)
 {
     return toJS(exec, globalObject, ptr.get());
@@ -644,7 +650,7 @@
     return constructArray(&state, 0, globalObject, args);
 }
 
-template<typename FirstType, typename SecondType> inline JSC::JSValue jsPair(JSC::ExecState& state, JSDOMGlobalObject* globalObject, const FirstType& value1, const SecondType& value2)
+template<typename FirstType, typename SecondType> inline JSC::JSValue jsPair(JSC::ExecState& state, JSDOMGlobalObject* globalObject, FirstType& value1, SecondType& value2)
 {
     return jsPair(state, globalObject, toJS(&state, globalObject, value1), toJS(&state, globalObject, value2));
 }

Modified: trunk/Source/WebCore/bindings/js/JSDOMPromise.cpp (200765 => 200766)


--- trunk/Source/WebCore/bindings/js/JSDOMPromise.cpp	2016-05-12 09:28:04 UTC (rev 200765)
+++ trunk/Source/WebCore/bindings/js/JSDOMPromise.cpp	2016-05-12 09:36:00 UTC (rev 200766)
@@ -88,7 +88,7 @@
 {
     JSC::JSValue value = parseAsJSON(promise.globalObject().globalExec(), data);
     if (!value)
-        promise.reject<ExceptionCode>(SYNTAX_ERR);
+        promise.reject(SYNTAX_ERR);
     else
         promise.resolve(value);
 }

Modified: trunk/Source/WebCore/bindings/js/JSDOMPromise.h (200765 => 200766)


--- trunk/Source/WebCore/bindings/js/JSDOMPromise.h	2016-05-12 09:28:04 UTC (rev 200765)
+++ trunk/Source/WebCore/bindings/js/JSDOMPromise.h	2016-05-12 09:36:00 UTC (rev 200766)
@@ -33,16 +33,90 @@
 
 namespace WebCore {
 
+template<typename DOMClass>
+struct TypeInspector {
+private:
+    template<typename T> static constexpr auto testIsVector(int) -> decltype(std::declval<T>().shrinkToFit(), bool()) { return true; }
+    template<typename T> static constexpr bool testIsVector(...) { return false; }
+
+    template<typename T> static constexpr auto testIsRefOrRefPtr(int) -> decltype(std::declval<T>().leakRef(), bool()) { return true; }
+    template<typename T> static constexpr bool testIsRefOrRefPtr(...) { return false; }
+
+public:
+    static constexpr bool isRefOrRefPtr = testIsRefOrRefPtr<DOMClass>(0);
+    static constexpr bool isPassByValueType = std::is_pointer<DOMClass>::value
+        || std::is_same<DOMClass, std::nullptr_t>::value
+        || std::is_same<DOMClass, JSC::JSValue>::value
+        || std::is_same<DOMClass, bool>::value;
+    static constexpr bool isPassByConstRefType = testIsVector<DOMClass>(0) 
+        || std::is_same<DOMClass, String>::value;
+};
+
+template<typename DOMClass, typename Enable = void>
+struct PromiseResultInspector {
+public:
+    static constexpr bool passByValue = false;
+    static constexpr bool passByRef = true;
+    static constexpr bool passByURef = false;
+    static constexpr bool passByConstRef = false;
+
+    typedef DOMClass& Type;
+};
+
+template<typename DOMClass>
+struct PromiseResultInspector<DOMClass, typename std::enable_if<TypeInspector<DOMClass>::isPassByValueType>::type> {
+public:
+    static constexpr bool passByValue = true;
+    static constexpr bool passByRef = false;
+    static constexpr bool passByURef = false;
+    static constexpr bool passByConstRef = false;
+
+    typedef DOMClass Type;
+};
+
+template<typename DOMClass>
+struct PromiseResultInspector<DOMClass, typename std::enable_if<TypeInspector<DOMClass>::isPassByConstRefType>::type> {
+public:
+    static constexpr bool passByValue = false;
+    static constexpr bool passByRef = false;
+    static constexpr bool passByURef = false;
+    static constexpr bool passByConstRef = true;
+
+    typedef const DOMClass& Type;
+};
+
+template<typename DOMClass>
+struct PromiseResultInspector<DOMClass, typename std::enable_if<TypeInspector<DOMClass>::isRefOrRefPtr>::type> {
+    static constexpr bool passByValue = false;
+    static constexpr bool passByRef = false;
+    static constexpr bool passByURef = true;
+    static constexpr bool passByConstRef = false;
+};
+
 class DeferredWrapper {
 public:
     DeferredWrapper(JSC::ExecState*, JSDOMGlobalObject*, JSC::JSPromiseDeferred*);
 
-    template<class ResolveResultType>
-    void resolve(const ResolveResultType&);
+    template<class ResolveResultType> typename std::enable_if<PromiseResultInspector<ResolveResultType>::passByValue, void>::type
+    resolve(ResolveResultType result) { resolveWithValue(result); }
+    template<class ResolveResultType> typename std::enable_if<PromiseResultInspector<ResolveResultType>::passByRef, void>::type
+    resolve(ResolveResultType& result) { resolveWithValue(result); }
+    template<class ResolveResultType> typename std::enable_if<PromiseResultInspector<ResolveResultType>::passByURef, void>::type
+    resolve(ResolveResultType&& result) { resolveWithValue(std::forward<ResolveResultType>(result)); }
+    template<class ResolveResultType> typename std::enable_if<PromiseResultInspector<ResolveResultType>::passByConstRef, void>::type
+    resolve(const ResolveResultType& result) { resolveWithValue(result); }
 
-    template<class RejectResultType>
-    void reject(const RejectResultType&);
+    template<class RejectResultType> typename std::enable_if<PromiseResultInspector<RejectResultType>::passByValue, void>::type
+    reject(RejectResultType result) { rejectWithValue(result); }
+    template<class RejectResultType> typename std::enable_if<PromiseResultInspector<RejectResultType>::passByRef, void>::type
+    reject(RejectResultType& result) { rejectWithValue(result); }
+    template<class RejectResultType> typename std::enable_if<PromiseResultInspector<RejectResultType>::passByURef, void>::type
+    reject(RejectResultType&& result) { rejectWithValue(std::forward<RejectResultType>(result)); }
+    template<class RejectResultType> typename std::enable_if<PromiseResultInspector<RejectResultType>::passByConstRef, void>::type
+    reject(const RejectResultType& result) { rejectWithValue(result); }
 
+    void reject(ExceptionCode);
+
     JSDOMGlobalObject& globalObject() const;
     JSC::JSValue promise() const;
 
@@ -51,6 +125,9 @@
     void resolve(JSC::ExecState& state, JSC::JSValue resolution) { callFunction(state, m_deferred->resolve(), resolution); }
     void reject(JSC::ExecState& state, JSC::JSValue resolution) { callFunction(state, m_deferred->reject(), resolution); }
 
+    template<class RejectResultType> void rejectWithValue(RejectResultType&&);
+    template<class ResolveResultType> void resolveWithValue(ResolveResultType&&);
+
     JSC::Strong<JSDOMGlobalObject> m_globalObject;
     JSC::Strong<JSC::JSPromiseDeferred> m_deferred;
 };
@@ -71,7 +148,7 @@
     return promiseDeferred.promise();
 }
 
-template <typename Value, typename Error>
+template <typename Value>
 class DOMPromise {
 public:
     DOMPromise(DeferredWrapper&& wrapper) : m_wrapper(WTFMove(wrapper)) { }
@@ -80,105 +157,105 @@
     DOMPromise(const DOMPromise&) = default;
     DOMPromise& operator=(DOMPromise const&) = default;
 
-    void resolve(const Value& value) { m_wrapper.resolve<Value>(value); }
-    void reject(const Error& error) { m_wrapper.reject<Error>(error); }
+    void resolve(typename PromiseResultInspector<Value>::Type value) { m_wrapper.resolve(value); }
 
+    template<typename ErrorType> void reject(ErrorType&& error) { m_wrapper.reject(std::forward<ErrorType>(error)); }
+
 private:
     DeferredWrapper m_wrapper;
 };
 
-template<class ResolveResultType>
-inline void DeferredWrapper::resolve(const ResolveResultType& result)
+inline void DeferredWrapper::reject(ExceptionCode ec)
 {
     ASSERT(m_deferred);
     ASSERT(m_globalObject);
     JSC::ExecState* exec = m_globalObject->globalExec();
     JSC::JSLockHolder locker(exec);
-    resolve(*exec, toJS(exec, m_globalObject.get(), result));
+    reject(*exec, createDOMException(exec, ec));
 }
 
-template<class RejectResultType>
-inline void DeferredWrapper::reject(const RejectResultType& result)
+template<class ResolveResultType>
+inline void DeferredWrapper::resolveWithValue(ResolveResultType&& result)
 {
     ASSERT(m_deferred);
     ASSERT(m_globalObject);
     JSC::ExecState* exec = m_globalObject->globalExec();
     JSC::JSLockHolder locker(exec);
-    reject(*exec, toJS(exec, m_globalObject.get(), result));
+    resolve(*exec, toJS(exec, m_globalObject.get(), std::forward<ResolveResultType>(result)));
 }
 
-template<>
-inline void DeferredWrapper::reject(const std::nullptr_t&)
+template<class RejectResultType>
+inline void DeferredWrapper::rejectWithValue(RejectResultType&& result)
 {
     ASSERT(m_deferred);
     ASSERT(m_globalObject);
     JSC::ExecState* exec = m_globalObject->globalExec();
     JSC::JSLockHolder locker(exec);
-    reject(*exec, JSC::jsNull());
+    reject(*exec, toJS(exec, m_globalObject.get(), std::forward<RejectResultType>(result)));
 }
 
 template<>
-inline void DeferredWrapper::reject(const JSC::JSValue& value)
+inline void DeferredWrapper::resolve(bool result)
 {
     ASSERT(m_deferred);
     ASSERT(m_globalObject);
     JSC::ExecState* exec = m_globalObject->globalExec();
     JSC::JSLockHolder locker(exec);
-    reject(*exec, value);
+    resolve(*exec, JSC::jsBoolean(result));
 }
 
 template<>
-inline void DeferredWrapper::reject<ExceptionCode>(const ExceptionCode& ec)
+inline void DeferredWrapper::resolve(JSC::JSValue value)
 {
     ASSERT(m_deferred);
     ASSERT(m_globalObject);
     JSC::ExecState* exec = m_globalObject->globalExec();
     JSC::JSLockHolder locker(exec);
-    reject(*exec, createDOMException(exec, ec));
+    resolve(*exec, value);
 }
 
 template<>
-inline void DeferredWrapper::resolve<String>(const String& result)
+inline void DeferredWrapper::reject(JSC::JSValue value)
 {
     ASSERT(m_deferred);
     ASSERT(m_globalObject);
     JSC::ExecState* exec = m_globalObject->globalExec();
     JSC::JSLockHolder locker(exec);
-    resolve(*exec, jsString(exec, result));
+    reject(*exec, value);
 }
 
 template<>
-inline void DeferredWrapper::resolve<bool>(const bool& result)
+inline void DeferredWrapper::resolve(std::nullptr_t)
 {
     ASSERT(m_deferred);
     ASSERT(m_globalObject);
     JSC::ExecState* exec = m_globalObject->globalExec();
     JSC::JSLockHolder locker(exec);
-    resolve(*exec, JSC::jsBoolean(result));
+    resolve(*exec, JSC::jsUndefined());
 }
 
 template<>
-inline void DeferredWrapper::resolve<JSC::JSValue>(const JSC::JSValue& value)
+inline void DeferredWrapper::reject(std::nullptr_t)
 {
     ASSERT(m_deferred);
     ASSERT(m_globalObject);
     JSC::ExecState* exec = m_globalObject->globalExec();
     JSC::JSLockHolder locker(exec);
-    resolve(*exec, value);
+    reject(*exec, JSC::jsNull());
 }
 
 template<>
-inline void DeferredWrapper::resolve(const std::nullptr_t&)
+inline void DeferredWrapper::resolve(const String& result)
 {
     ASSERT(m_deferred);
     ASSERT(m_globalObject);
     JSC::ExecState* exec = m_globalObject->globalExec();
     JSC::JSLockHolder locker(exec);
-    resolve(*exec, JSC::jsUndefined());
+    resolve(*exec, jsString(exec, result));
 }
 
 template<>
-inline void DeferredWrapper::reject<String>(const String& result)
+inline void DeferredWrapper::reject(const String& result)
 {
     ASSERT(m_deferred);
     ASSERT(m_globalObject);

Modified: trunk/Source/WebCore/bindings/js/JSSubtleCryptoCustom.cpp (200765 => 200766)


--- trunk/Source/WebCore/bindings/js/JSSubtleCryptoCustom.cpp	2016-05-12 09:28:04 UTC (rev 200765)
+++ trunk/Source/WebCore/bindings/js/JSSubtleCryptoCustom.cpp	2016-05-12 09:36:00 UTC (rev 200766)
@@ -550,7 +550,7 @@
     JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(&state, globalObject());
     DeferredWrapper wrapper(&state, globalObject(), promiseDeferred);
     auto successCallback = [wrapper](CryptoKey& result) mutable {
-        wrapper.resolve(&result);
+        wrapper.resolve(result);
     };
     auto failureCallback = [wrapper]() mutable {
         wrapper.reject(nullptr);
@@ -785,7 +785,7 @@
 
     auto decryptSuccessCallback = [domGlobalObject, keyFormat, unwrappedKeyAlgorithmPtr, unwrappedKeyAlgorithmParametersPtr, extractable, keyUsages, wrapper](const Vector<uint8_t>& result) mutable {
         auto importSuccessCallback = [wrapper](CryptoKey& key) mutable {
-            wrapper.resolve(&key);
+            wrapper.resolve(key);
         };
         auto importFailureCallback = [wrapper]() mutable {
             wrapper.reject(nullptr);

Modified: trunk/Source/WebCore/css/FontFace.h (200765 => 200766)


--- trunk/Source/WebCore/css/FontFace.h	2016-05-12 09:28:04 UTC (rev 200765)
+++ trunk/Source/WebCore/css/FontFace.h	2016-05-12 09:36:00 UTC (rev 200766)
@@ -65,7 +65,7 @@
     enum class LoadStatus { Unloaded, Loading, Loaded, Error };
     LoadStatus status() const;
 
-    typedef DOMPromise<FontFace&, ExceptionCode> Promise;
+    typedef DOMPromise<FontFace&> Promise;
     void registerLoaded(Promise&&);
 
     void load();

Modified: trunk/Source/WebCore/css/FontFaceSet.cpp (200765 => 200766)


--- trunk/Source/WebCore/css/FontFaceSet.cpp	2016-05-12 09:28:04 UTC (rev 200765)
+++ trunk/Source/WebCore/css/FontFaceSet.cpp	2016-05-12 09:36:00 UTC (rev 200766)
@@ -83,7 +83,7 @@
     return m_target->backing()[m_index++].wrapper();
 }
 
-FontFaceSet::PendingPromise::PendingPromise(Promise&& promise)
+FontFaceSet::PendingPromise::PendingPromise(LoadPromise&& promise)
     : promise(WTFMove(promise))
 {
 }
@@ -123,7 +123,7 @@
         m_backing->remove(m_backing.get()[0]);
 }
 
-void FontFaceSet::load(const String& font, const String& text, DeferredWrapper&& promise)
+void FontFaceSet::load(const String& font, const String& text, LoadPromise&& promise)
 {
     ExceptionCode ec = 0;
     auto matchingFaces = m_backing->matchingFaces(font, text, ec);
@@ -142,7 +142,7 @@
 
     for (auto& face : matchingFaces) {
         if (face.get().status() == CSSFontFace::Status::Failure) {
-            promise.reject(DOMCoreException::create(ExceptionCodeDescription(NETWORK_ERR)).ptr());
+            promise.reject(DOMCoreException::create(ExceptionCodeDescription(NETWORK_ERR)));
             return;
         }
     }
@@ -167,7 +167,7 @@
     return m_backing->check(family, text, ec);
 }
 
-void FontFaceSet::registerReady(Promise&& promise)
+void FontFaceSet::registerReady(ReadyPromise&& promise)
 {
     ASSERT(!m_promise);
     if (m_isReady) {

Modified: trunk/Source/WebCore/css/FontFaceSet.h (200765 => 200766)


--- trunk/Source/WebCore/css/FontFaceSet.h	2016-05-12 09:28:04 UTC (rev 200765)
+++ trunk/Source/WebCore/css/FontFaceSet.h	2016-05-12 09:36:00 UTC (rev 200766)
@@ -47,14 +47,15 @@
     bool remove(FontFace&);
     void clear();
 
-    void load(const String& font, const String& text, DeferredWrapper&& promise);
+    typedef DOMPromise<Vector<RefPtr<FontFace>>> LoadPromise;
+    void load(const String& font, const String& text, LoadPromise&&);
     bool check(const String& font, const String& text, ExceptionCode&);
 
     enum class LoadStatus { Loading, Loaded };
     LoadStatus status() const;
 
-    typedef DOMPromise<FontFaceSet&, DOMCoreException&> Promise;
-    void registerReady(Promise&&);
+    typedef DOMPromise<FontFaceSet&> ReadyPromise;
+    void registerReady(ReadyPromise&&);
 
     CSSFontFaceSet& backing() { return m_backing; }
 
@@ -74,19 +75,18 @@
 
 private:
     struct PendingPromise : RefCounted<PendingPromise> {
-        typedef DOMPromise<Vector<RefPtr<FontFace>>&, DOMCoreException&> Promise;
-        static Ref<PendingPromise> create(Promise&& promise)
+        static Ref<PendingPromise> create(LoadPromise&& promise)
         {
             return adoptRef(*new PendingPromise(WTFMove(promise)));
         }
         ~PendingPromise();
 
     private:
-        PendingPromise(Promise&&);
+        PendingPromise(LoadPromise&&);
 
     public:
         Vector<RefPtr<FontFace>> faces;
-        Promise promise;
+        LoadPromise promise;
         bool hasReachedTerminalState { false };
     };
 
@@ -110,7 +110,7 @@
 
     Ref<CSSFontFaceSet> m_backing;
     HashMap<RefPtr<CSSFontFace>, Vector<Ref<PendingPromise>>> m_pendingPromises;
-    Optional<Promise> m_promise;
+    Optional<ReadyPromise> m_promise;
     bool m_isReady { false };
 };
 

Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (200765 => 200766)


--- trunk/Source/WebCore/html/HTMLMediaElement.h	2016-05-12 09:28:04 UTC (rev 200765)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h	2016-05-12 09:36:00 UTC (rev 200766)
@@ -212,7 +212,7 @@
     bool loop() const;
     void setLoop(bool b);
 
-    typedef DOMPromise<std::nullptr_t, DOMError&> PlayPromise;
+    typedef DOMPromise<std::nullptr_t> PlayPromise;
     void play(PlayPromise&&);
 
     WEBCORE_EXPORT void play() override;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to