<!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>[200766] trunk/Source/WebCore</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/200766">200766</a></dd>
<dt>Author</dt> <dd>youenn.fablet@crf.canon.fr</dd>
<dt>Date</dt> <dd>2016-05-12 02:36:00 -0700 (Thu, 12 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.

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&lt;&gt;&amp;&amp; and RefPtr&lt;&gt;&amp;&amp;.
Previously Ref&lt;&gt;&amp;&amp; were not accepted and only &quot;const RefPtr&lt;&gt;&amp;&quot; 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:</pre>

<h3>Modified Paths</h3>
<ul>
<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="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (200765 => 200766)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -1,3 +1,74 @@
</span><ins>+2016-05-12  Youenn Fablet  &lt;youenn.fablet@crf.canon.fr&gt;
+
+        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&lt;&gt;&amp;&amp; and RefPtr&lt;&gt;&amp;&amp;.
+        Previously Ref&lt;&gt;&amp;&amp; were not accepted and only &quot;const RefPtr&lt;&gt;&amp;&quot; 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  Manuel Rego Casasnovas  &lt;rego@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [css-grid] Incorrect parsing when using just 'span&quot; as grid-line value
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesfetchFetchBodycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/fetch/FetchBody.cpp (200765 => 200766)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</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&lt;Blob&gt; blobFromArrayBuffer(ArrayBuffer*, const String&amp;);
</del><ins>+static Ref&lt;Blob&gt; blobFromArrayBuffer(ArrayBuffer*, const String&amp;);
</ins><span class="cx"> 
</span><span class="cx"> FetchBody::FetchBody(Ref&lt;Blob&gt;&amp;&amp; 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&lt;ExceptionCode&gt;(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&lt;RefPtr&lt;Blob&gt;&gt;(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&lt;Blob&gt; blobFromArrayBuffer(ArrayBuffer* buffer, const String&amp; contentType)
</del><ins>+static inline Ref&lt;Blob&gt; blobFromArrayBuffer(ArrayBuffer* buffer, const String&amp; contentType)
</ins><span class="cx"> {
</span><span class="cx">     if (!buffer)
</span><span class="cx">         return Blob::create(Vector&lt;uint8_t&gt;(), 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-&gt;promise.reject&lt;ExceptionCode&gt;(0);
</del><ins>+    m_consumer-&gt;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 (200765 => 200766)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -53,7 +53,7 @@
</span><span class="cx">     void blob(FetchBodyOwner&amp;, DeferredWrapper&amp;&amp;);
</span><span class="cx">     void json(FetchBodyOwner&amp;, DeferredWrapper&amp;&amp;);
</span><span class="cx">     void text(FetchBodyOwner&amp;, DeferredWrapper&amp;&amp;);
</span><del>-    void formData(FetchBodyOwner&amp;, DeferredWrapper&amp;&amp; promise) { promise.reject&lt;ExceptionCode&gt;(0); }
</del><ins>+    void formData(FetchBodyOwner&amp;, DeferredWrapper&amp;&amp; promise) { promise.reject(0); }
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(STREAMS_API)
</span><span class="cx">     void consumeAsStream(FetchBodyOwner&amp;, FetchResponseSource&amp;);
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesfetchFetchBodyOwnercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.cpp (200765 => 200766)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</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&lt;ExceptionCode&gt;(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&amp;&amp; promise)
</span><span class="cx"> {
</span><span class="cx">     if (m_body.isEmpty()) {
</span><del>-        promise.resolve&lt;RefPtr&lt;Blob&gt;&gt;(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&lt;ExceptionCode&gt;(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&amp;&amp; promise)
</span><span class="cx"> {
</span><span class="cx">     if (m_body.isEmpty()) {
</span><del>-        promise.reject&lt;ExceptionCode&gt;(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&lt;ExceptionCode&gt;(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&amp;&amp; promise)
</span><span class="cx"> {
</span><span class="cx">     if (m_body.isEmpty()) {
</span><del>-        promise.reject&lt;ExceptionCode&gt;(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&lt;ExceptionCode&gt;(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&lt;ExceptionCode&gt;(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 (200765 => 200766)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</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-&gt;filterAndFill(resourceResponse.httpHeaderFields(), FetchHeaders::Guard::Response);
</span><span class="cx"> 
</span><del>-    std::exchange(m_promise, Nullopt)-&gt;resolve(&amp;m_response);
</del><ins>+    std::exchange(m_promise, Nullopt)-&gt;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 (200765 => 200766)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -54,7 +54,7 @@
</span><span class="cx">     static Ref&lt;FetchResponse&gt; error(ScriptExecutionContext&amp;);
</span><span class="cx">     static RefPtr&lt;FetchResponse&gt; redirect(ScriptExecutionContext&amp;, const String&amp;, int, ExceptionCode&amp;);
</span><span class="cx"> 
</span><del>-    using FetchPromise = DOMPromise&lt;RefPtr&lt;FetchResponse&gt;, ExceptionCode&gt;;
</del><ins>+    using FetchPromise = DOMPromise&lt;FetchResponse&gt;;
</ins><span class="cx">     static void fetch(ScriptExecutionContext&amp;, FetchRequest&amp;, const Dictionary&amp;, FetchPromise&amp;&amp;);
</span><span class="cx">     static void fetch(ScriptExecutionContext&amp;, const String&amp;, const Dictionary&amp;, FetchPromise&amp;&amp;);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamMediaDevicesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/MediaDevices.h (200765 => 200766)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</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&lt;RefPtr&lt;MediaStream&gt;, RefPtr&lt;NavigatorUserMediaError&gt;&gt; Promise;
-    typedef DOMPromise&lt;MediaDeviceInfoVector, ExceptionCode&gt; EnumerateDevicesPromise;
</del><ins>+    typedef DOMPromise&lt;MediaStream&gt; Promise;
+    typedef DOMPromise&lt;MediaDeviceInfoVector&gt; EnumerateDevicesPromise;
</ins><span class="cx"> 
</span><span class="cx">     void getUserMedia(const Dictionary&amp;, Promise&amp;&amp;, ExceptionCode&amp;) const;
</span><span class="cx">     void enumerateDevices(EnumerateDevicesPromise&amp;&amp;, ExceptionCode&amp;) const;
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamPeerConnectionBackendh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h (200765 => 200766)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</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&lt;RefPtr&lt;RTCSessionDescription&gt;, RefPtr&lt;DOMError&gt;&gt; SessionDescriptionPromise;
-typedef DOMPromise&lt;std::nullptr_t, RefPtr&lt;DOMError&gt;&gt; VoidPromise;
-typedef DOMPromise&lt;RefPtr&lt;RTCStatsResponse&gt;, RefPtr&lt;DOMError&gt;&gt; StatsPromise;
</del><ins>+typedef DOMPromise&lt;RTCSessionDescription&gt; SessionDescriptionPromise;
+typedef DOMPromise&lt;std::nullptr_t&gt; VoidPromise;
+typedef DOMPromise&lt;RTCStatsResponse&gt; 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 (200765 => 200766)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</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&lt;MediaStream&gt; stream = MediaStream::create(*m_scriptExecutionContext, privateStream);
</del><ins>+    Ref&lt;MediaStream&gt; stream = MediaStream::create(*m_scriptExecutionContext, privateStream);
</ins><span class="cx">     if (m_audioConstraints) {
</span><span class="cx">         for (auto&amp; track : stream-&gt;getAudioTracks()) {
</span><span class="cx">             track-&gt;applyConstraints(*m_audioConstraints);
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesstreamsReadableStreamSourceh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/streams/ReadableStreamSource.h (200765 => 200766)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</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&lt;std::nullptr_t, ExceptionCode&gt; Promise;
</del><ins>+    typedef DOMPromise&lt;std::nullptr_t&gt; Promise;
</ins><span class="cx"> 
</span><span class="cx">     void start(ReadableStreamController&amp;&amp;, Promise&amp;&amp;);
</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 (200765 => 200766)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</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&lt;std::nullptr_t, ExceptionCode&gt; Promise;
</del><ins>+    typedef DOMPromise&lt;std::nullptr_t&gt; Promise;
</ins><span class="cx"> 
</span><span class="cx">     void suspend(Promise&amp;&amp;);
</span><span class="cx">     void resume(Promise&amp;&amp;);
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSDOMBindingh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSDOMBinding.h (200765 => 200766)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -251,7 +251,8 @@
</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&lt;typename T&gt; JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, RefPtr&lt;T&gt;);
</del><ins>+template&lt;typename T&gt; JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, RefPtr&lt;T&gt;&amp;);
+template&lt;typename T&gt; JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, RefPtr&lt;T&gt;&amp;&amp;);
</ins><span class="cx"> template&lt;typename T&gt; JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, PassRefPtr&lt;T&gt;);
</span><span class="cx"> template&lt;typename T&gt; JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, const Vector&lt;T&gt;&amp;);
</span><span class="cx"> template&lt;typename T&gt; JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, const Vector&lt;RefPtr&lt;T&gt;&gt;&amp;);
</span><span class="lines">@@ -267,7 +268,7 @@
</span><span class="cx"> WEBCORE_EXPORT JSC::JSValue jsArray(JSC::ExecState*, JSDOMGlobalObject*, PassRefPtr&lt;DOMStringList&gt;);
</span><span class="cx"> 
</span><span class="cx"> JSC::JSValue jsPair(JSC::ExecState&amp;, JSDOMGlobalObject*, JSC::JSValue, JSC::JSValue);
</span><del>-template&lt;typename FirstType, typename SecondType&gt; JSC::JSValue jsPair(JSC::ExecState&amp;, JSDOMGlobalObject*, const FirstType&amp;, const SecondType&amp;);
</del><ins>+template&lt;typename FirstType, typename SecondType&gt; JSC::JSValue jsPair(JSC::ExecState&amp;, JSDOMGlobalObject*, FirstType&amp;, SecondType&amp;);
</ins><span class="cx"> 
</span><span class="cx"> RefPtr&lt;JSC::ArrayBufferView&gt; toArrayBufferView(JSC::JSValue);
</span><span class="cx"> RefPtr&lt;JSC::Int8Array&gt; toInt8Array(JSC::JSValue);
</span><span class="lines">@@ -540,11 +541,16 @@
</span><span class="cx">     return view-&gt;wrap(exec, globalObject);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename T&gt; inline JSC::JSValue toJS(JSC::ExecState* exec, JSDOMGlobalObject* globalObject, RefPtr&lt;T&gt; ptr)
</del><ins>+template&lt;typename T&gt; inline JSC::JSValue toJS(JSC::ExecState* exec, JSDOMGlobalObject* globalObject, RefPtr&lt;T&gt;&amp; 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&lt;typename T&gt; inline JSC::JSValue toJS(JSC::ExecState* exec, JSDOMGlobalObject* globalObject, RefPtr&lt;T&gt;&amp;&amp; ptr)
+{
+    return toJS(exec, globalObject, ptr.get());
+}
+
</ins><span class="cx"> template&lt;typename T&gt; inline JSC::JSValue toJS(JSC::ExecState* exec, JSDOMGlobalObject* globalObject, PassRefPtr&lt;T&gt; ptr)
</span><span class="cx"> {
</span><span class="cx">     return toJS(exec, globalObject, ptr.get());
</span><span class="lines">@@ -644,7 +650,7 @@
</span><span class="cx">     return constructArray(&amp;state, 0, globalObject, args);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename FirstType, typename SecondType&gt; inline JSC::JSValue jsPair(JSC::ExecState&amp; state, JSDOMGlobalObject* globalObject, const FirstType&amp; value1, const SecondType&amp; value2)
</del><ins>+template&lt;typename FirstType, typename SecondType&gt; inline JSC::JSValue jsPair(JSC::ExecState&amp; state, JSDOMGlobalObject* globalObject, FirstType&amp; value1, SecondType&amp; value2)
</ins><span class="cx"> {
</span><span class="cx">     return jsPair(state, globalObject, toJS(&amp;state, globalObject, value1), toJS(&amp;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 (200765 => 200766)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</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&lt;ExceptionCode&gt;(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 (200765 => 200766)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -33,16 +33,90 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><ins>+template&lt;typename DOMClass&gt;
+struct TypeInspector {
+private:
+    template&lt;typename T&gt; static constexpr auto testIsVector(int) -&gt; decltype(std::declval&lt;T&gt;().shrinkToFit(), bool()) { return true; }
+    template&lt;typename T&gt; static constexpr bool testIsVector(...) { return false; }
+
+    template&lt;typename T&gt; static constexpr auto testIsRefOrRefPtr(int) -&gt; decltype(std::declval&lt;T&gt;().leakRef(), bool()) { return true; }
+    template&lt;typename T&gt; static constexpr bool testIsRefOrRefPtr(...) { return false; }
+
+public:
+    static constexpr bool isRefOrRefPtr = testIsRefOrRefPtr&lt;DOMClass&gt;(0);
+    static constexpr bool isPassByValueType = std::is_pointer&lt;DOMClass&gt;::value
+        || std::is_same&lt;DOMClass, std::nullptr_t&gt;::value
+        || std::is_same&lt;DOMClass, JSC::JSValue&gt;::value
+        || std::is_same&lt;DOMClass, bool&gt;::value;
+    static constexpr bool isPassByConstRefType = testIsVector&lt;DOMClass&gt;(0) 
+        || std::is_same&lt;DOMClass, String&gt;::value;
+};
+
+template&lt;typename DOMClass, typename Enable = void&gt;
+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&amp; Type;
+};
+
+template&lt;typename DOMClass&gt;
+struct PromiseResultInspector&lt;DOMClass, typename std::enable_if&lt;TypeInspector&lt;DOMClass&gt;::isPassByValueType&gt;::type&gt; {
+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&lt;typename DOMClass&gt;
+struct PromiseResultInspector&lt;DOMClass, typename std::enable_if&lt;TypeInspector&lt;DOMClass&gt;::isPassByConstRefType&gt;::type&gt; {
+public:
+    static constexpr bool passByValue = false;
+    static constexpr bool passByRef = false;
+    static constexpr bool passByURef = false;
+    static constexpr bool passByConstRef = true;
+
+    typedef const DOMClass&amp; Type;
+};
+
+template&lt;typename DOMClass&gt;
+struct PromiseResultInspector&lt;DOMClass, typename std::enable_if&lt;TypeInspector&lt;DOMClass&gt;::isRefOrRefPtr&gt;::type&gt; {
+    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&lt;class ResolveResultType&gt;
-    void resolve(const ResolveResultType&amp;);
</del><ins>+    template&lt;class ResolveResultType&gt; typename std::enable_if&lt;PromiseResultInspector&lt;ResolveResultType&gt;::passByValue, void&gt;::type
+    resolve(ResolveResultType result) { resolveWithValue(result); }
+    template&lt;class ResolveResultType&gt; typename std::enable_if&lt;PromiseResultInspector&lt;ResolveResultType&gt;::passByRef, void&gt;::type
+    resolve(ResolveResultType&amp; result) { resolveWithValue(result); }
+    template&lt;class ResolveResultType&gt; typename std::enable_if&lt;PromiseResultInspector&lt;ResolveResultType&gt;::passByURef, void&gt;::type
+    resolve(ResolveResultType&amp;&amp; result) { resolveWithValue(std::forward&lt;ResolveResultType&gt;(result)); }
+    template&lt;class ResolveResultType&gt; typename std::enable_if&lt;PromiseResultInspector&lt;ResolveResultType&gt;::passByConstRef, void&gt;::type
+    resolve(const ResolveResultType&amp; result) { resolveWithValue(result); }
</ins><span class="cx"> 
</span><del>-    template&lt;class RejectResultType&gt;
-    void reject(const RejectResultType&amp;);
</del><ins>+    template&lt;class RejectResultType&gt; typename std::enable_if&lt;PromiseResultInspector&lt;RejectResultType&gt;::passByValue, void&gt;::type
+    reject(RejectResultType result) { rejectWithValue(result); }
+    template&lt;class RejectResultType&gt; typename std::enable_if&lt;PromiseResultInspector&lt;RejectResultType&gt;::passByRef, void&gt;::type
+    reject(RejectResultType&amp; result) { rejectWithValue(result); }
+    template&lt;class RejectResultType&gt; typename std::enable_if&lt;PromiseResultInspector&lt;RejectResultType&gt;::passByURef, void&gt;::type
+    reject(RejectResultType&amp;&amp; result) { rejectWithValue(std::forward&lt;RejectResultType&gt;(result)); }
+    template&lt;class RejectResultType&gt; typename std::enable_if&lt;PromiseResultInspector&lt;RejectResultType&gt;::passByConstRef, void&gt;::type
+    reject(const RejectResultType&amp; result) { rejectWithValue(result); }
</ins><span class="cx"> 
</span><ins>+    void reject(ExceptionCode);
+
</ins><span class="cx">     JSDOMGlobalObject&amp; globalObject() const;
</span><span class="cx">     JSC::JSValue promise() const;
</span><span class="cx"> 
</span><span class="lines">@@ -51,6 +125,9 @@
</span><span class="cx">     void resolve(JSC::ExecState&amp; state, JSC::JSValue resolution) { callFunction(state, m_deferred-&gt;resolve(), resolution); }
</span><span class="cx">     void reject(JSC::ExecState&amp; state, JSC::JSValue resolution) { callFunction(state, m_deferred-&gt;reject(), resolution); }
</span><span class="cx"> 
</span><ins>+    template&lt;class RejectResultType&gt; void rejectWithValue(RejectResultType&amp;&amp;);
+    template&lt;class ResolveResultType&gt; void resolveWithValue(ResolveResultType&amp;&amp;);
+
</ins><span class="cx">     JSC::Strong&lt;JSDOMGlobalObject&gt; m_globalObject;
</span><span class="cx">     JSC::Strong&lt;JSC::JSPromiseDeferred&gt; m_deferred;
</span><span class="cx"> };
</span><span class="lines">@@ -71,7 +148,7 @@
</span><span class="cx">     return promiseDeferred.promise();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template &lt;typename Value, typename Error&gt;
</del><ins>+template &lt;typename Value&gt;
</ins><span class="cx"> class DOMPromise {
</span><span class="cx"> public:
</span><span class="cx">     DOMPromise(DeferredWrapper&amp;&amp; wrapper) : m_wrapper(WTFMove(wrapper)) { }
</span><span class="lines">@@ -80,105 +157,105 @@
</span><span class="cx">     DOMPromise(const DOMPromise&amp;) = default;
</span><span class="cx">     DOMPromise&amp; operator=(DOMPromise const&amp;) = default;
</span><span class="cx"> 
</span><del>-    void resolve(const Value&amp; value) { m_wrapper.resolve&lt;Value&gt;(value); }
-    void reject(const Error&amp; error) { m_wrapper.reject&lt;Error&gt;(error); }
</del><ins>+    void resolve(typename PromiseResultInspector&lt;Value&gt;::Type value) { m_wrapper.resolve(value); }
</ins><span class="cx"> 
</span><ins>+    template&lt;typename ErrorType&gt; void reject(ErrorType&amp;&amp; error) { m_wrapper.reject(std::forward&lt;ErrorType&gt;(error)); }
+
</ins><span class="cx"> private:
</span><span class="cx">     DeferredWrapper m_wrapper;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-template&lt;class ResolveResultType&gt;
-inline void DeferredWrapper::resolve(const ResolveResultType&amp; 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-&gt;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&lt;class RejectResultType&gt;
-inline void DeferredWrapper::reject(const RejectResultType&amp; result)
</del><ins>+template&lt;class ResolveResultType&gt;
+inline void DeferredWrapper::resolveWithValue(ResolveResultType&amp;&amp; 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-&gt;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&lt;ResolveResultType&gt;(result)));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;&gt;
-inline void DeferredWrapper::reject(const std::nullptr_t&amp;)
</del><ins>+template&lt;class RejectResultType&gt;
+inline void DeferredWrapper::rejectWithValue(RejectResultType&amp;&amp; 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-&gt;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&lt;RejectResultType&gt;(result)));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline void DeferredWrapper::reject(const JSC::JSValue&amp; 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-&gt;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&lt;&gt;
</span><del>-inline void DeferredWrapper::reject&lt;ExceptionCode&gt;(const ExceptionCode&amp; 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-&gt;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&lt;&gt;
</span><del>-inline void DeferredWrapper::resolve&lt;String&gt;(const String&amp; 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-&gt;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&lt;&gt;
</span><del>-inline void DeferredWrapper::resolve&lt;bool&gt;(const bool&amp; 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-&gt;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&lt;&gt;
</span><del>-inline void DeferredWrapper::resolve&lt;JSC::JSValue&gt;(const JSC::JSValue&amp; 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-&gt;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&lt;&gt;
</span><del>-inline void DeferredWrapper::resolve(const std::nullptr_t&amp;)
</del><ins>+inline void DeferredWrapper::resolve(const String&amp; 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-&gt;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&lt;&gt;
</span><del>-inline void DeferredWrapper::reject&lt;String&gt;(const String&amp; result)
</del><ins>+inline void DeferredWrapper::reject(const String&amp; 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 (200765 => 200766)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -550,7 +550,7 @@
</span><span class="cx">     JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(&amp;state, globalObject());
</span><span class="cx">     DeferredWrapper wrapper(&amp;state, globalObject(), promiseDeferred);
</span><span class="cx">     auto successCallback = [wrapper](CryptoKey&amp; result) mutable {
</span><del>-        wrapper.resolve(&amp;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&lt;uint8_t&gt;&amp; result) mutable {
</span><span class="cx">         auto importSuccessCallback = [wrapper](CryptoKey&amp; key) mutable {
</span><del>-            wrapper.resolve(&amp;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 (200765 => 200766)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</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&lt;FontFace&amp;, ExceptionCode&gt; Promise;
</del><ins>+    typedef DOMPromise&lt;FontFace&amp;&gt; Promise;
</ins><span class="cx">     void registerLoaded(Promise&amp;&amp;);
</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 (200765 => 200766)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -83,7 +83,7 @@
</span><span class="cx">     return m_target-&gt;backing()[m_index++].wrapper();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-FontFaceSet::PendingPromise::PendingPromise(Promise&amp;&amp; promise)
</del><ins>+FontFaceSet::PendingPromise::PendingPromise(LoadPromise&amp;&amp; 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-&gt;remove(m_backing.get()[0]);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FontFaceSet::load(const String&amp; font, const String&amp; text, DeferredWrapper&amp;&amp; promise)
</del><ins>+void FontFaceSet::load(const String&amp; font, const String&amp; text, LoadPromise&amp;&amp; promise)
</ins><span class="cx"> {
</span><span class="cx">     ExceptionCode ec = 0;
</span><span class="cx">     auto matchingFaces = m_backing-&gt;matchingFaces(font, text, ec);
</span><span class="lines">@@ -142,7 +142,7 @@
</span><span class="cx"> 
</span><span class="cx">     for (auto&amp; 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-&gt;check(family, text, ec);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FontFaceSet::registerReady(Promise&amp;&amp; promise)
</del><ins>+void FontFaceSet::registerReady(ReadyPromise&amp;&amp; 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 (200765 => 200766)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -47,14 +47,15 @@
</span><span class="cx">     bool remove(FontFace&amp;);
</span><span class="cx">     void clear();
</span><span class="cx"> 
</span><del>-    void load(const String&amp; font, const String&amp; text, DeferredWrapper&amp;&amp; promise);
</del><ins>+    typedef DOMPromise&lt;Vector&lt;RefPtr&lt;FontFace&gt;&gt;&gt; LoadPromise;
+    void load(const String&amp; font, const String&amp; text, LoadPromise&amp;&amp;);
</ins><span class="cx">     bool check(const String&amp; font, const String&amp; text, ExceptionCode&amp;);
</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&lt;FontFaceSet&amp;, DOMCoreException&amp;&gt; Promise;
-    void registerReady(Promise&amp;&amp;);
</del><ins>+    typedef DOMPromise&lt;FontFaceSet&amp;&gt; ReadyPromise;
+    void registerReady(ReadyPromise&amp;&amp;);
</ins><span class="cx"> 
</span><span class="cx">     CSSFontFaceSet&amp; 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&lt;PendingPromise&gt; {
</span><del>-        typedef DOMPromise&lt;Vector&lt;RefPtr&lt;FontFace&gt;&gt;&amp;, DOMCoreException&amp;&gt; Promise;
-        static Ref&lt;PendingPromise&gt; create(Promise&amp;&amp; promise)
</del><ins>+        static Ref&lt;PendingPromise&gt; create(LoadPromise&amp;&amp; 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&amp;&amp;);
</del><ins>+        PendingPromise(LoadPromise&amp;&amp;);
</ins><span class="cx"> 
</span><span class="cx">     public:
</span><span class="cx">         Vector&lt;RefPtr&lt;FontFace&gt;&gt; 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&lt;CSSFontFaceSet&gt; m_backing;
</span><span class="cx">     HashMap&lt;RefPtr&lt;CSSFontFace&gt;, Vector&lt;Ref&lt;PendingPromise&gt;&gt;&gt; m_pendingPromises;
</span><del>-    Optional&lt;Promise&gt; m_promise;
</del><ins>+    Optional&lt;ReadyPromise&gt; 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 (200765 => 200766)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</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&lt;std::nullptr_t, DOMError&amp;&gt; PlayPromise;
</del><ins>+    typedef DOMPromise&lt;std::nullptr_t&gt; PlayPromise;
</ins><span class="cx">     void play(PlayPromise&amp;&amp;);
</span><span class="cx"> 
</span><span class="cx">     WEBCORE_EXPORT void play() override;
</span></span></pre>
</div>
</div>

</body>
</html>