<!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>[200837] trunk/Source</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/200837">200837</a></dd>
<dt>Author</dt> <dd>youenn.fablet@crf.canon.fr</dd>
<dt>Date</dt> <dd>2016-05-13 04:03:00 -0700 (Fri, 13 May 2016)</dd>
</dl>
<h3>Log Message</h3>
<pre>DOMPromise should only restrict the resolution type
https://bugs.webkit.org/show_bug.cgi?id=157307
Reviewed by Darin Adler.
Source/WebCore:
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:
Source/WTF:
* wtf/Ref.h: Adding static constexpr to ease detection of Ref for templates.
* wtf/RefPtr.h: Ditto.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWTFChangeLog">trunk/Source/WTF/ChangeLog</a></li>
<li><a href="#trunkSourceWTFwtfRefh">trunk/Source/WTF/wtf/Ref.h</a></li>
<li><a href="#trunkSourceWTFwtfRefPtrh">trunk/Source/WTF/wtf/RefPtr.h</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreModulesfetchFetchBodycpp">trunk/Source/WebCore/Modules/fetch/FetchBody.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesfetchFetchBodyh">trunk/Source/WebCore/Modules/fetch/FetchBody.h</a></li>
<li><a href="#trunkSourceWebCoreModulesfetchFetchBodyOwnercpp">trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesfetchFetchResponsecpp">trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesfetchFetchResponseh">trunk/Source/WebCore/Modules/fetch/FetchResponse.h</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamMediaDevicesh">trunk/Source/WebCore/Modules/mediastream/MediaDevices.h</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamPeerConnectionBackendh">trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamUserMediaRequestcpp">trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesstreamsReadableStreamSourceh">trunk/Source/WebCore/Modules/streams/ReadableStreamSource.h</a></li>
<li><a href="#trunkSourceWebCoreModuleswebaudioAudioContexth">trunk/Source/WebCore/Modules/webaudio/AudioContext.h</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSDOMBindingh">trunk/Source/WebCore/bindings/js/JSDOMBinding.h</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSDOMPromisecpp">trunk/Source/WebCore/bindings/js/JSDOMPromise.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSDOMPromiseh">trunk/Source/WebCore/bindings/js/JSDOMPromise.h</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSSubtleCryptoCustomcpp">trunk/Source/WebCore/bindings/js/JSSubtleCryptoCustom.cpp</a></li>
<li><a href="#trunkSourceWebCorecssFontFaceh">trunk/Source/WebCore/css/FontFace.h</a></li>
<li><a href="#trunkSourceWebCorecssFontFaceSetcpp">trunk/Source/WebCore/css/FontFaceSet.cpp</a></li>
<li><a href="#trunkSourceWebCorecssFontFaceSeth">trunk/Source/WebCore/css/FontFaceSet.h</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLMediaElementh">trunk/Source/WebCore/html/HTMLMediaElement.h</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWTFChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/ChangeLog (200836 => 200837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/ChangeLog        2016-05-13 11:02:27 UTC (rev 200836)
+++ trunk/Source/WTF/ChangeLog        2016-05-13 11:03:00 UTC (rev 200837)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2016-05-13 Youenn Fablet <youenn.fablet@crf.canon.fr>
+
+ DOMPromise should only restrict the resolution type
+ https://bugs.webkit.org/show_bug.cgi?id=157307
+
+ Reviewed by Darin Adler.
+
+ * wtf/Ref.h: Adding static constexpr to ease detection of Ref for templates.
+ * wtf/RefPtr.h: Ditto.
+
</ins><span class="cx"> 2016-05-12 Daniel Bates <dabates@apple.com>
</span><span class="cx">
</span><span class="cx"> Use SecTask SPI to retrieve code signing identifier for user directory suffix
</span></span></pre></div>
<a id="trunkSourceWTFwtfRefh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/Ref.h (200836 => 200837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/Ref.h        2016-05-13 11:02:27 UTC (rev 200836)
+++ trunk/Source/WTF/wtf/Ref.h        2016-05-13 11:03:00 UTC (rev 200837)
</span><span class="lines">@@ -46,6 +46,8 @@
</span><span class="cx">
</span><span class="cx"> template<typename T> class Ref {
</span><span class="cx"> public:
</span><ins>+ static constexpr bool isRef = true;
+
</ins><span class="cx"> ~Ref()
</span><span class="cx"> {
</span><span class="cx"> #if ASAN_ENABLED
</span></span></pre></div>
<a id="trunkSourceWTFwtfRefPtrh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/RefPtr.h (200836 => 200837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/RefPtr.h        2016-05-13 11:02:27 UTC (rev 200836)
+++ trunk/Source/WTF/wtf/RefPtr.h        2016-05-13 11:03:00 UTC (rev 200837)
</span><span class="lines">@@ -39,6 +39,8 @@
</span><span class="cx"> typedef T ValueType;
</span><span class="cx"> typedef ValueType* PtrType;
</span><span class="cx">
</span><ins>+ static constexpr bool isRefPtr = true;
+
</ins><span class="cx"> ALWAYS_INLINE RefPtr() : m_ptr(nullptr) { }
</span><span class="cx"> ALWAYS_INLINE RefPtr(T* ptr) : m_ptr(ptr) { refIfNotNull(ptr); }
</span><span class="cx"> ALWAYS_INLINE RefPtr(const RefPtr& o) : m_ptr(o.m_ptr) { refIfNotNull(m_ptr); }
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (200836 => 200837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-05-13 11:02:27 UTC (rev 200836)
+++ trunk/Source/WebCore/ChangeLog        2016-05-13 11:03:00 UTC (rev 200837)
</span><span class="lines">@@ -1,3 +1,74 @@
</span><ins>+2016-05-13 Youenn Fablet <youenn.fablet@crf.canon.fr>
+
+ 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:
+
</ins><span class="cx"> 2016-05-12 Sergio Villar Senin <svillar@igalia.com>
</span><span class="cx">
</span><span class="cx"> [css-grid] Show auto-repeat line names in ComputedStyle
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesfetchFetchBodycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/fetch/FetchBody.cpp (200836 => 200837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/fetch/FetchBody.cpp        2016-05-13 11:02:27 UTC (rev 200836)
+++ trunk/Source/WebCore/Modules/fetch/FetchBody.cpp        2016-05-13 11:03:00 UTC (rev 200837)
</span><span class="lines">@@ -43,7 +43,7 @@
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><del>-static RefPtr<Blob> blobFromArrayBuffer(ArrayBuffer*, const String&);
</del><ins>+static Ref<Blob> blobFromArrayBuffer(ArrayBuffer*, const String&);
</ins><span class="cx">
</span><span class="cx"> FetchBody::FetchBody(Ref<Blob>&& blob)
</span><span class="cx"> : m_type(Type::Blob)
</span><span class="lines">@@ -141,7 +141,7 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> // FIXME: Support other types.
</span><del>- promise.reject<ExceptionCode>(0);
</del><ins>+ promise.reject(0);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> #if ENABLE(STREAMS_API)
</span><span class="lines">@@ -200,7 +200,7 @@
</span><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx"> String contentType = Blob::normalizedContentType(extractMIMETypeFromMediaType(m_mimeType));
</span><del>- promise.resolve<RefPtr<Blob>>(Blob::create(extractFromText(), contentType));
</del><ins>+ promise.resolve(Blob::create(extractFromText(), contentType));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> FetchLoader::Type FetchBody::loadingType(Consumer::Type type)
</span><span class="lines">@@ -236,7 +236,7 @@
</span><span class="cx"> return value;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-static inline RefPtr<Blob> blobFromArrayBuffer(ArrayBuffer* buffer, const String& contentType)
</del><ins>+static inline Ref<Blob> blobFromArrayBuffer(ArrayBuffer* buffer, const String& contentType)
</ins><span class="cx"> {
</span><span class="cx"> if (!buffer)
</span><span class="cx"> return Blob::create(Vector<uint8_t>(), contentType);
</span><span class="lines">@@ -259,7 +259,7 @@
</span><span class="cx"> void FetchBody::loadingFailed()
</span><span class="cx"> {
</span><span class="cx"> ASSERT(m_consumer);
</span><del>- m_consumer->promise.reject<ExceptionCode>(0);
</del><ins>+ m_consumer->promise.reject(0);
</ins><span class="cx"> m_consumer = Nullopt;
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesfetchFetchBodyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/fetch/FetchBody.h (200836 => 200837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/fetch/FetchBody.h        2016-05-13 11:02:27 UTC (rev 200836)
+++ trunk/Source/WebCore/Modules/fetch/FetchBody.h        2016-05-13 11:03:00 UTC (rev 200837)
</span><span class="lines">@@ -53,7 +53,7 @@
</span><span class="cx"> void blob(FetchBodyOwner&, DeferredWrapper&&);
</span><span class="cx"> void json(FetchBodyOwner&, DeferredWrapper&&);
</span><span class="cx"> void text(FetchBodyOwner&, DeferredWrapper&&);
</span><del>- void formData(FetchBodyOwner&, DeferredWrapper&& promise) { promise.reject<ExceptionCode>(0); }
</del><ins>+ void formData(FetchBodyOwner&, DeferredWrapper&& promise) { promise.reject(0); }
</ins><span class="cx">
</span><span class="cx"> #if ENABLE(STREAMS_API)
</span><span class="cx"> void consumeAsStream(FetchBodyOwner&, FetchResponseSource&);
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesfetchFetchBodyOwnercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.cpp (200836 => 200837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.cpp        2016-05-13 11:02:27 UTC (rev 200836)
+++ trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.cpp        2016-05-13 11:03:00 UTC (rev 200837)
</span><span class="lines">@@ -75,7 +75,7 @@
</span><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx"> if (isDisturbed()) {
</span><del>- promise.reject<ExceptionCode>(TypeError);
</del><ins>+ promise.reject(TypeError);
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx"> m_isDisturbed = true;
</span><span class="lines">@@ -85,11 +85,11 @@
</span><span class="cx"> void FetchBodyOwner::blob(DeferredWrapper&& promise)
</span><span class="cx"> {
</span><span class="cx"> if (m_body.isEmpty()) {
</span><del>- promise.resolve<RefPtr<Blob>>(Blob::create());
</del><ins>+ promise.resolve(Blob::create());
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx"> if (isDisturbed()) {
</span><del>- promise.reject<ExceptionCode>(TypeError);
</del><ins>+ promise.reject(TypeError);
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx"> m_isDisturbed = true;
</span><span class="lines">@@ -99,11 +99,11 @@
</span><span class="cx"> void FetchBodyOwner::formData(DeferredWrapper&& promise)
</span><span class="cx"> {
</span><span class="cx"> if (m_body.isEmpty()) {
</span><del>- promise.reject<ExceptionCode>(0);
</del><ins>+ promise.reject(0);
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx"> if (isDisturbed()) {
</span><del>- promise.reject<ExceptionCode>(TypeError);
</del><ins>+ promise.reject(TypeError);
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx"> m_isDisturbed = true;
</span><span class="lines">@@ -113,11 +113,11 @@
</span><span class="cx"> void FetchBodyOwner::json(DeferredWrapper&& promise)
</span><span class="cx"> {
</span><span class="cx"> if (m_body.isEmpty()) {
</span><del>- promise.reject<ExceptionCode>(SYNTAX_ERR);
</del><ins>+ promise.reject(SYNTAX_ERR);
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx"> if (isDisturbed()) {
</span><del>- promise.reject<ExceptionCode>(TypeError);
</del><ins>+ promise.reject(TypeError);
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx"> m_isDisturbed = true;
</span><span class="lines">@@ -131,7 +131,7 @@
</span><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx"> if (isDisturbed()) {
</span><del>- promise.reject<ExceptionCode>(TypeError);
</del><ins>+ promise.reject(TypeError);
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx"> m_isDisturbed = true;
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesfetchFetchResponsecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp (200836 => 200837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp        2016-05-13 11:02:27 UTC (rev 200836)
+++ trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp        2016-05-13 11:03:00 UTC (rev 200837)
</span><span class="lines">@@ -213,7 +213,7 @@
</span><span class="cx"> m_response.m_response = resourceResponse;
</span><span class="cx"> m_response.m_headers->filterAndFill(resourceResponse.httpHeaderFields(), FetchHeaders::Guard::Response);
</span><span class="cx">
</span><del>- std::exchange(m_promise, Nullopt)->resolve(&m_response);
</del><ins>+ std::exchange(m_promise, Nullopt)->resolve(m_response);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void FetchResponse::BodyLoader::didReceiveData(const char* data, size_t size)
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesfetchFetchResponseh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/fetch/FetchResponse.h (200836 => 200837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/fetch/FetchResponse.h        2016-05-13 11:02:27 UTC (rev 200836)
+++ trunk/Source/WebCore/Modules/fetch/FetchResponse.h        2016-05-13 11:03:00 UTC (rev 200837)
</span><span class="lines">@@ -54,7 +54,7 @@
</span><span class="cx"> static Ref<FetchResponse> error(ScriptExecutionContext&);
</span><span class="cx"> static RefPtr<FetchResponse> redirect(ScriptExecutionContext&, const String&, int, ExceptionCode&);
</span><span class="cx">
</span><del>- using FetchPromise = DOMPromise<RefPtr<FetchResponse>, ExceptionCode>;
</del><ins>+ using FetchPromise = DOMPromise<FetchResponse>;
</ins><span class="cx"> static void fetch(ScriptExecutionContext&, FetchRequest&, const Dictionary&, FetchPromise&&);
</span><span class="cx"> static void fetch(ScriptExecutionContext&, const String&, const Dictionary&, FetchPromise&&);
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamMediaDevicesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/MediaDevices.h (200836 => 200837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/MediaDevices.h        2016-05-13 11:02:27 UTC (rev 200836)
+++ trunk/Source/WebCore/Modules/mediastream/MediaDevices.h        2016-05-13 11:03:00 UTC (rev 200837)
</span><span class="lines">@@ -58,8 +58,8 @@
</span><span class="cx">
</span><span class="cx"> Document* document() const;
</span><span class="cx">
</span><del>- typedef DOMPromise<RefPtr<MediaStream>, RefPtr<NavigatorUserMediaError>> Promise;
- typedef DOMPromise<MediaDeviceInfoVector, ExceptionCode> EnumerateDevicesPromise;
</del><ins>+ typedef DOMPromise<MediaStream> Promise;
+ typedef DOMPromise<MediaDeviceInfoVector> EnumerateDevicesPromise;
</ins><span class="cx">
</span><span class="cx"> void getUserMedia(const Dictionary&, Promise&&, ExceptionCode&) const;
</span><span class="cx"> void enumerateDevices(EnumerateDevicesPromise&&, ExceptionCode&) const;
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamPeerConnectionBackendh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h (200836 => 200837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h        2016-05-13 11:02:27 UTC (rev 200836)
+++ trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h        2016-05-13 11:03:00 UTC (rev 200837)
</span><span class="lines">@@ -53,9 +53,9 @@
</span><span class="cx"> class ScriptExecutionContext;
</span><span class="cx">
</span><span class="cx"> namespace PeerConnection {
</span><del>-typedef DOMPromise<RefPtr<RTCSessionDescription>, RefPtr<DOMError>> SessionDescriptionPromise;
-typedef DOMPromise<std::nullptr_t, RefPtr<DOMError>> VoidPromise;
-typedef DOMPromise<RefPtr<RTCStatsResponse>, RefPtr<DOMError>> StatsPromise;
</del><ins>+typedef DOMPromise<RTCSessionDescription> SessionDescriptionPromise;
+typedef DOMPromise<std::nullptr_t> VoidPromise;
+typedef DOMPromise<RTCStatsResponse> StatsPromise;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> class PeerConnectionBackendClient {
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamUserMediaRequestcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp (200836 => 200837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp        2016-05-13 11:02:27 UTC (rev 200836)
+++ trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp        2016-05-13 11:03:00 UTC (rev 200837)
</span><span class="lines">@@ -172,7 +172,7 @@
</span><span class="cx"> return;
</span><span class="cx">
</span><span class="cx"> // 4 - Create the MediaStream and pass it to the success callback.
</span><del>- RefPtr<MediaStream> stream = MediaStream::create(*m_scriptExecutionContext, privateStream);
</del><ins>+ Ref<MediaStream> stream = MediaStream::create(*m_scriptExecutionContext, privateStream);
</ins><span class="cx"> if (m_audioConstraints) {
</span><span class="cx"> for (auto& track : stream->getAudioTracks()) {
</span><span class="cx"> track->applyConstraints(*m_audioConstraints);
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesstreamsReadableStreamSourceh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/streams/ReadableStreamSource.h (200836 => 200837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/streams/ReadableStreamSource.h        2016-05-13 11:02:27 UTC (rev 200836)
+++ trunk/Source/WebCore/Modules/streams/ReadableStreamSource.h        2016-05-13 11:03:00 UTC (rev 200837)
</span><span class="lines">@@ -44,7 +44,7 @@
</span><span class="cx"> public:
</span><span class="cx"> virtual ~ReadableStreamSource() { }
</span><span class="cx">
</span><del>- typedef DOMPromise<std::nullptr_t, ExceptionCode> Promise;
</del><ins>+ typedef DOMPromise<std::nullptr_t> Promise;
</ins><span class="cx">
</span><span class="cx"> void start(ReadableStreamController&&, Promise&&);
</span><span class="cx"> void cancel(JSC::JSValue);
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebaudioAudioContexth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webaudio/AudioContext.h (200836 => 200837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webaudio/AudioContext.h        2016-05-13 11:02:27 UTC (rev 200836)
+++ trunk/Source/WebCore/Modules/webaudio/AudioContext.h        2016-05-13 11:03:00 UTC (rev 200837)
</span><span class="lines">@@ -109,7 +109,7 @@
</span><span class="cx"> using ActiveDOMObject::suspend;
</span><span class="cx"> using ActiveDOMObject::resume;
</span><span class="cx">
</span><del>- typedef DOMPromise<std::nullptr_t, ExceptionCode> Promise;
</del><ins>+ typedef DOMPromise<std::nullptr_t> Promise;
</ins><span class="cx">
</span><span class="cx"> void suspend(Promise&&);
</span><span class="cx"> void resume(Promise&&);
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSDOMBindingh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSDOMBinding.h (200836 => 200837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSDOMBinding.h        2016-05-13 11:02:27 UTC (rev 200836)
+++ trunk/Source/WebCore/bindings/js/JSDOMBinding.h        2016-05-13 11:03:00 UTC (rev 200837)
</span><span class="lines">@@ -251,10 +251,10 @@
</span><span class="cx"> JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, JSC::ArrayBuffer*);
</span><span class="cx"> JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, JSC::ArrayBufferView*);
</span><span class="cx"> JSC::JSValue toJS(JSC::ExecState*, JSC::JSGlobalObject*, JSC::ArrayBufferView*);
</span><del>-template<typename T> JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, const RefPtr<T>&);
-template<typename T> JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, const Ref<T>&);
-template<typename T> JSC::JSValue toJSNewlyCreated(JSC::ExecState*, JSDOMGlobalObject*, const RefPtr<T>&);
-template<typename T> JSC::JSValue toJSNewlyCreated(JSC::ExecState*, JSDOMGlobalObject*, const Ref<T>&);
</del><ins>+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 toJSNewlyCreated(JSC::ExecState*, JSDOMGlobalObject*, RefPtr<T>&);
+template<typename T> JSC::JSValue toJSNewlyCreated(JSC::ExecState*, JSDOMGlobalObject*, RefPtr<T>&&);
</ins><span class="cx"> template<typename T> JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, const Vector<T>&);
</span><span class="cx"> template<typename T> JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, const Vector<RefPtr<T>>&);
</span><span class="cx"> JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, const String&);
</span><span class="lines">@@ -269,7 +269,7 @@
</span><span class="cx"> WEBCORE_EXPORT JSC::JSValue jsArray(JSC::ExecState*, JSDOMGlobalObject*, PassRefPtr<DOMStringList>);
</span><span class="cx">
</span><span class="cx"> JSC::JSValue jsPair(JSC::ExecState&, JSDOMGlobalObject*, JSC::JSValue, JSC::JSValue);
</span><del>-template<typename FirstType, typename SecondType> JSC::JSValue jsPair(JSC::ExecState&, JSDOMGlobalObject*, const FirstType&, const SecondType&);
</del><ins>+template<typename FirstType, typename SecondType> JSC::JSValue jsPair(JSC::ExecState&, JSDOMGlobalObject*, FirstType&, SecondType&);
</ins><span class="cx">
</span><span class="cx"> RefPtr<JSC::ArrayBufferView> toArrayBufferView(JSC::JSValue);
</span><span class="cx"> RefPtr<JSC::Int8Array> toInt8Array(JSC::JSValue);
</span><span class="lines">@@ -542,24 +542,29 @@
</span><span class="cx"> return view->wrap(exec, globalObject);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-template<typename T> inline JSC::JSValue toJS(JSC::ExecState* exec, JSDOMGlobalObject* globalObject, const RefPtr<T>& ptr)
</del><ins>+template<typename T> inline JSC::JSValue toJS(JSC::ExecState* exec, JSDOMGlobalObject* globalObject, RefPtr<T>& ptr)
</ins><span class="cx"> {
</span><span class="cx"> return toJS(exec, globalObject, ptr.get());
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+template<typename T> inline JSC::JSValue toJS(JSC::ExecState* exec, JSDOMGlobalObject* globalObject, RefPtr<T>&& ptr)
+{
+ return toJS(exec, globalObject, ptr.get());
+}
+
</ins><span class="cx"> template<typename T> inline JSC::JSValue toJS(JSC::ExecState* exec, JSDOMGlobalObject* globalObject, const Ref<T>& ptr)
</span><span class="cx"> {
</span><span class="cx"> return toJS(exec, globalObject, const_cast<T&>(ptr.get()));
</span><span class="cx"> }
</span><span class="cx">
</span><del>-template<typename T> inline JSC::JSValue toJSNewlyCreated(JSC::ExecState* exec, JSDOMGlobalObject* globalObject, const RefPtr<T>& ptr)
</del><ins>+template<typename T> inline JSC::JSValue toJSNewlyCreated(JSC::ExecState* exec, JSDOMGlobalObject* globalObject, RefPtr<T>&& ptr)
</ins><span class="cx"> {
</span><span class="cx"> return toJSNewlyCreated(exec, globalObject, ptr.get());
</span><span class="cx"> }
</span><span class="cx">
</span><del>-template<typename T> inline JSC::JSValue toJSNewlyCreated(JSC::ExecState* exec, JSDOMGlobalObject* globalObject, const Ref<T>& ptr)
</del><ins>+template<typename T> inline JSC::JSValue toJSNewlyCreated(JSC::ExecState* exec, JSDOMGlobalObject* globalObject, RefPtr<T>& ptr)
</ins><span class="cx"> {
</span><del>- return toJSNewlyCreated(exec, globalObject, const_cast<T&>(ptr.get()));
</del><ins>+ return toJSNewlyCreated(exec, globalObject, ptr.get());
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> template<typename T> inline JSC::JSValue toJS(JSC::ExecState* exec, JSDOMGlobalObject* globalObject, const Vector<T>& vector)
</span><span class="lines">@@ -656,7 +661,7 @@
</span><span class="cx"> return constructArray(&state, 0, globalObject, args);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-template<typename FirstType, typename SecondType> inline JSC::JSValue jsPair(JSC::ExecState& state, JSDOMGlobalObject* globalObject, const FirstType& value1, const SecondType& value2)
</del><ins>+template<typename FirstType, typename SecondType> inline JSC::JSValue jsPair(JSC::ExecState& state, JSDOMGlobalObject* globalObject, FirstType& value1, SecondType& value2)
</ins><span class="cx"> {
</span><span class="cx"> return jsPair(state, globalObject, toJS(&state, globalObject, value1), toJS(&state, globalObject, value2));
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSDOMPromisecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSDOMPromise.cpp (200836 => 200837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSDOMPromise.cpp        2016-05-13 11:02:27 UTC (rev 200836)
+++ trunk/Source/WebCore/bindings/js/JSDOMPromise.cpp        2016-05-13 11:03:00 UTC (rev 200837)
</span><span class="lines">@@ -88,7 +88,7 @@
</span><span class="cx"> {
</span><span class="cx"> JSC::JSValue value = parseAsJSON(promise.globalObject().globalExec(), data);
</span><span class="cx"> if (!value)
</span><del>- promise.reject<ExceptionCode>(SYNTAX_ERR);
</del><ins>+ promise.reject(SYNTAX_ERR);
</ins><span class="cx"> else
</span><span class="cx"> promise.resolve(value);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSDOMPromiseh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSDOMPromise.h (200836 => 200837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSDOMPromise.h        2016-05-13 11:02:27 UTC (rev 200836)
+++ trunk/Source/WebCore/bindings/js/JSDOMPromise.h        2016-05-13 11:03:00 UTC (rev 200837)
</span><span class="lines">@@ -33,16 +33,93 @@
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><ins>+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 testIsRef(int) -> decltype(T::isRef) { return true; }
+ template<typename T> static constexpr bool testIsRef(...) { return false; }
+
+ template<typename T> static constexpr auto testIsRefPtr(int) -> decltype(T::isRefPtr) { return true; }
+ template<typename T> static constexpr bool testIsRefPtr(...) { return false; }
+
+public:
+ static constexpr bool isRefOrRefPtr = testIsRef<DOMClass>(0) || testIsRefPtr<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;
+};
+
</ins><span class="cx"> class DeferredWrapper {
</span><span class="cx"> public:
</span><span class="cx"> DeferredWrapper(JSC::ExecState*, JSDOMGlobalObject*, JSC::JSPromiseDeferred*);
</span><span class="cx">
</span><del>- template<class ResolveResultType>
- void resolve(const ResolveResultType&);
</del><ins>+ 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); }
</ins><span class="cx">
</span><del>- template<class RejectResultType>
- void reject(const RejectResultType&);
</del><ins>+ 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); }
</ins><span class="cx">
</span><ins>+ void reject(ExceptionCode);
+
</ins><span class="cx"> JSDOMGlobalObject& globalObject() const;
</span><span class="cx"> JSC::JSValue promise() const;
</span><span class="cx">
</span><span class="lines">@@ -51,6 +128,9 @@
</span><span class="cx"> void resolve(JSC::ExecState& state, JSC::JSValue resolution) { callFunction(state, m_deferred->resolve(), resolution); }
</span><span class="cx"> void reject(JSC::ExecState& state, JSC::JSValue resolution) { callFunction(state, m_deferred->reject(), resolution); }
</span><span class="cx">
</span><ins>+ template<class RejectResultType> void rejectWithValue(RejectResultType&&);
+ template<class ResolveResultType> void resolveWithValue(ResolveResultType&&);
+
</ins><span class="cx"> JSC::Strong<JSDOMGlobalObject> m_globalObject;
</span><span class="cx"> JSC::Strong<JSC::JSPromiseDeferred> m_deferred;
</span><span class="cx"> };
</span><span class="lines">@@ -71,7 +151,7 @@
</span><span class="cx"> return promiseDeferred.promise();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-template <typename Value, typename Error>
</del><ins>+template <typename Value>
</ins><span class="cx"> class DOMPromise {
</span><span class="cx"> public:
</span><span class="cx"> DOMPromise(DeferredWrapper&& wrapper) : m_wrapper(WTFMove(wrapper)) { }
</span><span class="lines">@@ -80,105 +160,105 @@
</span><span class="cx"> DOMPromise(const DOMPromise&) = default;
</span><span class="cx"> DOMPromise& operator=(DOMPromise const&) = default;
</span><span class="cx">
</span><del>- void resolve(const Value& value) { m_wrapper.resolve<Value>(value); }
- void reject(const Error& error) { m_wrapper.reject<Error>(error); }
</del><ins>+ void resolve(typename PromiseResultInspector<Value>::Type value) { m_wrapper.resolve(value); }
</ins><span class="cx">
</span><ins>+ template<typename ErrorType> void reject(ErrorType&& error) { m_wrapper.reject(std::forward<ErrorType>(error)); }
+
</ins><span class="cx"> private:
</span><span class="cx"> DeferredWrapper m_wrapper;
</span><span class="cx"> };
</span><span class="cx">
</span><del>-template<class ResolveResultType>
-inline void DeferredWrapper::resolve(const ResolveResultType& result)
</del><ins>+inline void DeferredWrapper::reject(ExceptionCode ec)
</ins><span class="cx"> {
</span><span class="cx"> ASSERT(m_deferred);
</span><span class="cx"> ASSERT(m_globalObject);
</span><span class="cx"> JSC::ExecState* exec = m_globalObject->globalExec();
</span><span class="cx"> JSC::JSLockHolder locker(exec);
</span><del>- resolve(*exec, toJS(exec, m_globalObject.get(), result));
</del><ins>+ reject(*exec, createDOMException(exec, ec));
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-template<class RejectResultType>
-inline void DeferredWrapper::reject(const RejectResultType& result)
</del><ins>+template<class ResolveResultType>
+inline void DeferredWrapper::resolveWithValue(ResolveResultType&& result)
</ins><span class="cx"> {
</span><span class="cx"> ASSERT(m_deferred);
</span><span class="cx"> ASSERT(m_globalObject);
</span><span class="cx"> JSC::ExecState* exec = m_globalObject->globalExec();
</span><span class="cx"> JSC::JSLockHolder locker(exec);
</span><del>- reject(*exec, toJS(exec, m_globalObject.get(), result));
</del><ins>+ resolve(*exec, toJS(exec, m_globalObject.get(), std::forward<ResolveResultType>(result)));
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-template<>
-inline void DeferredWrapper::reject(const std::nullptr_t&)
</del><ins>+template<class RejectResultType>
+inline void DeferredWrapper::rejectWithValue(RejectResultType&& result)
</ins><span class="cx"> {
</span><span class="cx"> ASSERT(m_deferred);
</span><span class="cx"> ASSERT(m_globalObject);
</span><span class="cx"> JSC::ExecState* exec = m_globalObject->globalExec();
</span><span class="cx"> JSC::JSLockHolder locker(exec);
</span><del>- reject(*exec, JSC::jsNull());
</del><ins>+ reject(*exec, toJS(exec, m_globalObject.get(), std::forward<RejectResultType>(result)));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> template<>
</span><del>-inline void DeferredWrapper::reject(const JSC::JSValue& value)
</del><ins>+inline void DeferredWrapper::resolve(bool result)
</ins><span class="cx"> {
</span><span class="cx"> ASSERT(m_deferred);
</span><span class="cx"> ASSERT(m_globalObject);
</span><span class="cx"> JSC::ExecState* exec = m_globalObject->globalExec();
</span><span class="cx"> JSC::JSLockHolder locker(exec);
</span><del>- reject(*exec, value);
</del><ins>+ resolve(*exec, JSC::jsBoolean(result));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> template<>
</span><del>-inline void DeferredWrapper::reject<ExceptionCode>(const ExceptionCode& ec)
</del><ins>+inline void DeferredWrapper::resolve(JSC::JSValue value)
</ins><span class="cx"> {
</span><span class="cx"> ASSERT(m_deferred);
</span><span class="cx"> ASSERT(m_globalObject);
</span><span class="cx"> JSC::ExecState* exec = m_globalObject->globalExec();
</span><span class="cx"> JSC::JSLockHolder locker(exec);
</span><del>- reject(*exec, createDOMException(exec, ec));
</del><ins>+ resolve(*exec, value);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> template<>
</span><del>-inline void DeferredWrapper::resolve<String>(const String& result)
</del><ins>+inline void DeferredWrapper::reject(JSC::JSValue value)
</ins><span class="cx"> {
</span><span class="cx"> ASSERT(m_deferred);
</span><span class="cx"> ASSERT(m_globalObject);
</span><span class="cx"> JSC::ExecState* exec = m_globalObject->globalExec();
</span><span class="cx"> JSC::JSLockHolder locker(exec);
</span><del>- resolve(*exec, jsString(exec, result));
</del><ins>+ reject(*exec, value);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> template<>
</span><del>-inline void DeferredWrapper::resolve<bool>(const bool& result)
</del><ins>+inline void DeferredWrapper::resolve(std::nullptr_t)
</ins><span class="cx"> {
</span><span class="cx"> ASSERT(m_deferred);
</span><span class="cx"> ASSERT(m_globalObject);
</span><span class="cx"> JSC::ExecState* exec = m_globalObject->globalExec();
</span><span class="cx"> JSC::JSLockHolder locker(exec);
</span><del>- resolve(*exec, JSC::jsBoolean(result));
</del><ins>+ resolve(*exec, JSC::jsUndefined());
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> template<>
</span><del>-inline void DeferredWrapper::resolve<JSC::JSValue>(const JSC::JSValue& value)
</del><ins>+inline void DeferredWrapper::reject(std::nullptr_t)
</ins><span class="cx"> {
</span><span class="cx"> ASSERT(m_deferred);
</span><span class="cx"> ASSERT(m_globalObject);
</span><span class="cx"> JSC::ExecState* exec = m_globalObject->globalExec();
</span><span class="cx"> JSC::JSLockHolder locker(exec);
</span><del>- resolve(*exec, value);
</del><ins>+ reject(*exec, JSC::jsNull());
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> template<>
</span><del>-inline void DeferredWrapper::resolve(const std::nullptr_t&)
</del><ins>+inline void DeferredWrapper::resolve(const String& result)
</ins><span class="cx"> {
</span><span class="cx"> ASSERT(m_deferred);
</span><span class="cx"> ASSERT(m_globalObject);
</span><span class="cx"> JSC::ExecState* exec = m_globalObject->globalExec();
</span><span class="cx"> JSC::JSLockHolder locker(exec);
</span><del>- resolve(*exec, JSC::jsUndefined());
</del><ins>+ resolve(*exec, jsString(exec, result));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> template<>
</span><del>-inline void DeferredWrapper::reject<String>(const String& result)
</del><ins>+inline void DeferredWrapper::reject(const String& result)
</ins><span class="cx"> {
</span><span class="cx"> ASSERT(m_deferred);
</span><span class="cx"> ASSERT(m_globalObject);
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSSubtleCryptoCustomcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSSubtleCryptoCustom.cpp (200836 => 200837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSSubtleCryptoCustom.cpp        2016-05-13 11:02:27 UTC (rev 200836)
+++ trunk/Source/WebCore/bindings/js/JSSubtleCryptoCustom.cpp        2016-05-13 11:03:00 UTC (rev 200837)
</span><span class="lines">@@ -550,7 +550,7 @@
</span><span class="cx"> JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(&state, globalObject());
</span><span class="cx"> DeferredWrapper wrapper(&state, globalObject(), promiseDeferred);
</span><span class="cx"> auto successCallback = [wrapper](CryptoKey& result) mutable {
</span><del>- wrapper.resolve(&result);
</del><ins>+ wrapper.resolve(result);
</ins><span class="cx"> };
</span><span class="cx"> auto failureCallback = [wrapper]() mutable {
</span><span class="cx"> wrapper.reject(nullptr);
</span><span class="lines">@@ -785,7 +785,7 @@
</span><span class="cx">
</span><span class="cx"> auto decryptSuccessCallback = [domGlobalObject, keyFormat, unwrappedKeyAlgorithmPtr, unwrappedKeyAlgorithmParametersPtr, extractable, keyUsages, wrapper](const Vector<uint8_t>& result) mutable {
</span><span class="cx"> auto importSuccessCallback = [wrapper](CryptoKey& key) mutable {
</span><del>- wrapper.resolve(&key);
</del><ins>+ wrapper.resolve(key);
</ins><span class="cx"> };
</span><span class="cx"> auto importFailureCallback = [wrapper]() mutable {
</span><span class="cx"> wrapper.reject(nullptr);
</span></span></pre></div>
<a id="trunkSourceWebCorecssFontFaceh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/FontFace.h (200836 => 200837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/FontFace.h        2016-05-13 11:02:27 UTC (rev 200836)
+++ trunk/Source/WebCore/css/FontFace.h        2016-05-13 11:03:00 UTC (rev 200837)
</span><span class="lines">@@ -65,7 +65,7 @@
</span><span class="cx"> enum class LoadStatus { Unloaded, Loading, Loaded, Error };
</span><span class="cx"> LoadStatus status() const;
</span><span class="cx">
</span><del>- typedef DOMPromise<FontFace&, ExceptionCode> Promise;
</del><ins>+ typedef DOMPromise<FontFace&> Promise;
</ins><span class="cx"> void registerLoaded(Promise&&);
</span><span class="cx">
</span><span class="cx"> void load();
</span></span></pre></div>
<a id="trunkSourceWebCorecssFontFaceSetcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/FontFaceSet.cpp (200836 => 200837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/FontFaceSet.cpp        2016-05-13 11:02:27 UTC (rev 200836)
+++ trunk/Source/WebCore/css/FontFaceSet.cpp        2016-05-13 11:03:00 UTC (rev 200837)
</span><span class="lines">@@ -83,7 +83,7 @@
</span><span class="cx"> return m_target->backing()[m_index++].wrapper();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-FontFaceSet::PendingPromise::PendingPromise(Promise&& promise)
</del><ins>+FontFaceSet::PendingPromise::PendingPromise(LoadPromise&& promise)
</ins><span class="cx"> : promise(WTFMove(promise))
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="lines">@@ -123,7 +123,7 @@
</span><span class="cx"> m_backing->remove(m_backing.get()[0]);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void FontFaceSet::load(const String& font, const String& text, DeferredWrapper&& promise)
</del><ins>+void FontFaceSet::load(const String& font, const String& text, LoadPromise&& promise)
</ins><span class="cx"> {
</span><span class="cx"> ExceptionCode ec = 0;
</span><span class="cx"> auto matchingFaces = m_backing->matchingFaces(font, text, ec);
</span><span class="lines">@@ -142,7 +142,7 @@
</span><span class="cx">
</span><span class="cx"> for (auto& face : matchingFaces) {
</span><span class="cx"> if (face.get().status() == CSSFontFace::Status::Failure) {
</span><del>- promise.reject(DOMCoreException::create(ExceptionCodeDescription(NETWORK_ERR)).ptr());
</del><ins>+ promise.reject(DOMCoreException::create(ExceptionCodeDescription(NETWORK_ERR)));
</ins><span class="cx"> return;
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="lines">@@ -167,7 +167,7 @@
</span><span class="cx"> return m_backing->check(family, text, ec);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void FontFaceSet::registerReady(Promise&& promise)
</del><ins>+void FontFaceSet::registerReady(ReadyPromise&& promise)
</ins><span class="cx"> {
</span><span class="cx"> ASSERT(!m_promise);
</span><span class="cx"> if (m_isReady) {
</span></span></pre></div>
<a id="trunkSourceWebCorecssFontFaceSeth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/FontFaceSet.h (200836 => 200837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/FontFaceSet.h        2016-05-13 11:02:27 UTC (rev 200836)
+++ trunk/Source/WebCore/css/FontFaceSet.h        2016-05-13 11:03:00 UTC (rev 200837)
</span><span class="lines">@@ -47,14 +47,15 @@
</span><span class="cx"> bool remove(FontFace&);
</span><span class="cx"> void clear();
</span><span class="cx">
</span><del>- void load(const String& font, const String& text, DeferredWrapper&& promise);
</del><ins>+ typedef DOMPromise<Vector<RefPtr<FontFace>>> LoadPromise;
+ void load(const String& font, const String& text, LoadPromise&&);
</ins><span class="cx"> bool check(const String& font, const String& text, ExceptionCode&);
</span><span class="cx">
</span><span class="cx"> enum class LoadStatus { Loading, Loaded };
</span><span class="cx"> LoadStatus status() const;
</span><span class="cx">
</span><del>- typedef DOMPromise<FontFaceSet&, DOMCoreException&> Promise;
- void registerReady(Promise&&);
</del><ins>+ typedef DOMPromise<FontFaceSet&> ReadyPromise;
+ void registerReady(ReadyPromise&&);
</ins><span class="cx">
</span><span class="cx"> CSSFontFaceSet& backing() { return m_backing; }
</span><span class="cx">
</span><span class="lines">@@ -74,19 +75,18 @@
</span><span class="cx">
</span><span class="cx"> private:
</span><span class="cx"> struct PendingPromise : RefCounted<PendingPromise> {
</span><del>- typedef DOMPromise<Vector<RefPtr<FontFace>>&, DOMCoreException&> Promise;
- static Ref<PendingPromise> create(Promise&& promise)
</del><ins>+ static Ref<PendingPromise> create(LoadPromise&& promise)
</ins><span class="cx"> {
</span><span class="cx"> return adoptRef(*new PendingPromise(WTFMove(promise)));
</span><span class="cx"> }
</span><span class="cx"> ~PendingPromise();
</span><span class="cx">
</span><span class="cx"> private:
</span><del>- PendingPromise(Promise&&);
</del><ins>+ PendingPromise(LoadPromise&&);
</ins><span class="cx">
</span><span class="cx"> public:
</span><span class="cx"> Vector<RefPtr<FontFace>> faces;
</span><del>- Promise promise;
</del><ins>+ LoadPromise promise;
</ins><span class="cx"> bool hasReachedTerminalState { false };
</span><span class="cx"> };
</span><span class="cx">
</span><span class="lines">@@ -110,7 +110,7 @@
</span><span class="cx">
</span><span class="cx"> Ref<CSSFontFaceSet> m_backing;
</span><span class="cx"> HashMap<RefPtr<CSSFontFace>, Vector<Ref<PendingPromise>>> m_pendingPromises;
</span><del>- Optional<Promise> m_promise;
</del><ins>+ Optional<ReadyPromise> m_promise;
</ins><span class="cx"> bool m_isReady { false };
</span><span class="cx"> };
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLMediaElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (200836 => 200837)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLMediaElement.h        2016-05-13 11:02:27 UTC (rev 200836)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h        2016-05-13 11:03:00 UTC (rev 200837)
</span><span class="lines">@@ -212,7 +212,7 @@
</span><span class="cx"> bool loop() const;
</span><span class="cx"> void setLoop(bool b);
</span><span class="cx">
</span><del>- typedef DOMPromise<std::nullptr_t, DOMError&> PlayPromise;
</del><ins>+ typedef DOMPromise<std::nullptr_t> PlayPromise;
</ins><span class="cx"> void play(PlayPromise&&);
</span><span class="cx">
</span><span class="cx"> WEBCORE_EXPORT void play() override;
</span></span></pre>
</div>
</div>
</body>
</html>