<!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>[205257] 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/205257">205257</a></dd>
<dt>Author</dt> <dd>rniwa@webkit.org</dd>
<dt>Date</dt> <dd>2016-08-31 11:36:46 -0700 (Wed, 31 Aug 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Avoid using strong reference in JSDOMPromise’s DeferredWrapper
https://bugs.webkit.org/show_bug.cgi?id=161426
&lt;rdar://problem/28091123&gt;

Reviewed by Geoffrey Garen.

Replace JSC::Strong in DeferredWrapper by JSC::Weak, and make the global object own JSPromiseDeferred.

DeferredWrapper adds itself to JSDOMGlobalObject's newly added HashSet when it's created and clears itself
from the HashSet inside its destructor as well as when the promise is resolved or rejected.
This is so that JSDOMGlobalObject's visitChildren can visit every live DeferredWrapper.

Because this operation is rather expense, this patch turns DeferredWrapper into a RefCounted object to avoid
HashMap churns. Most of code changes in this patch is due to this type change, and the fact lambda cannot
capture Ref&lt;DeferredWrapper&gt; since its copy constructor doesn't exist.

We also create a write barrier from the global object to JSPromiseDeferred so that they won't be collected
during an eden collection when it happens before JSDOMGlobalObject's visitChildren is invoked.

Note that it's possible for the entire DOM wrapper world of the promise to go away before the promise is
resolved or rejected by a ref-counted C++ object. In this case, m_deferred and m_globalObject become dead.
Various member resolve* and reject functions of DeferredWrapper have been modified to check this condition.

Because JSDOMGlobalObject can be finalized before DeferredWrapper is finalized. DeferredWrapper's destructor,
which calls DeferredWrapper::clear, should only remove itself from m_globalObject when m_globalObject is alive.

Finally, this patch makes DeferredWrapper inherit from ActiveDOMCallback so that it won't try to execute scripts
when the active DOM objects have been suspended; e.g. after a page navigation.

No new tests since there should be no author/user visible behavioral change.

* Modules/applepay/ApplePaySession.cpp:
(WebCore::ApplePaySession::canMakePaymentsWithActiveCard):
* Modules/applepay/ApplePaySession.h:
* Modules/fetch/DOMWindowFetch.cpp:
(WebCore::DOMWindowFetch::fetch):
* Modules/fetch/DOMWindowFetch.h:
* Modules/fetch/FetchBody.cpp:
(WebCore::FetchBody::arrayBuffer):
(WebCore::FetchBody::blob):
(WebCore::FetchBody::json):
(WebCore::FetchBody::text):
(WebCore::FetchBody::consume):
(WebCore::FetchBody::consumeArrayBuffer):
(WebCore::FetchBody::consumeArrayBufferView):
(WebCore::FetchBody::consumeText):
(WebCore::FetchBody::consumeBlob):
(WebCore::FetchBody::loadingFailed):
(WebCore::FetchBody::loadingSucceeded):
* Modules/fetch/FetchBody.h:
(WebCore::FetchBody::formData):
(WebCore::FetchBody::cleanConsumePromise):
(WebCore::FetchBody): Use RefPtr&lt;DeferredWrapper&gt; instead of Optional&lt;DeferredWrapper&gt; now that DeferredWrapper
is ref counted. Perhaps we could use Optional&lt;Ref&lt;DeferredWrapper&gt;&gt; here but that seemed rather verbose.
* Modules/fetch/FetchBodyConsumer.cpp:
(WebCore::FetchBodyConsumer::resolveWithData):
(WebCore::FetchBodyConsumer::resolve):
* Modules/fetch/FetchBodyConsumer.h:
* Modules/fetch/FetchBodyOwner.cpp:
(WebCore::FetchBodyOwner::arrayBuffer):
(WebCore::FetchBodyOwner::blob):
(WebCore::FetchBodyOwner::formData):
(WebCore::FetchBodyOwner::json):
(WebCore::FetchBodyOwner::text):
* Modules/fetch/FetchBodyOwner.h:
* Modules/fetch/FetchResponse.cpp:
(WebCore::FetchResponse::consume):
(WebCore::FetchResponse::finishConsumingStream):
* Modules/fetch/FetchResponse.h:
* Modules/fetch/WorkerGlobalScopeFetch.cpp:
(WebCore::WorkerGlobalScopeFetch::fetch):
* Modules/fetch/WorkerGlobalScopeFetch.h:
* Modules/mediastream/UserMediaPermissionCheck.h:
* WebCore.xcodeproj/project.pbxproj:
* bindings/js/JSDOMGlobalObject.cpp:
(WebCore::JSDOMGlobalObject::~JSDOMGlobalObject): Added.
(WebCore::JSDOMGlobalObject::visitChildren): Added visits to each JSPromiseDeferred owned by this global object.
* bindings/js/JSDOMGlobalObject.h:
(WebCore::JSDOMGlobalObject::deferredWrappers): Added. This map is only used by JSDOMGlobalObject's visitChildren.
* bindings/js/JSDOMPromise.cpp:
(WebCore::DeferredWrapper::DeferredWrapper):
(WebCore::DeferredWrapper::~DeferredWrapper): Calls clear. When the global object has already been finalized,
m_globalObject is dead. In that case, there is no need to remove itself from the global object. When m_deferred
has been cleared, either clear() has already been called (1) or the callback is dead (2). Since (2) happens only
when the global object itself is dead (as its visitChildren would have visited m_deferred otherwise), again, there
is no need to remove itself from global object.
(WebCore::DeferredWrapper::clear): Added. Clears m_deferred and removes itself from JSDOMGlobalObject.
(WebCore::DeferredWrapper::contextDestroyed): ScriptExecutionContext has been destroyed. We must call clear().
(WebCore::DeferredWrapper::callFunction): Check canInvokeCallback in ActiveDOMCallback.
(WebCore::DeferredWrapper::reject): Exit early when isSuspended() is true. See below.
(WebCore::rejectPromiseWithExceptionIfAny):
(WebCore::fulfillPromiseWithJSON):
(WebCore::fulfillPromiseWithArrayBuffer):
* bindings/js/JSDOMPromise.h:
(WebCore::DeferredWrapper::create): Added.
(WebCore::DeferredWrapper::isSuspended): Added. Returns true iff the DOM wrapper world has gone away or active DOM
objects have been suspended.
(WebCore::DeferredWrapper::globalObject): Made this inline.
(WebCore::DeferredWrapper::visitAggregate): Added. Called by JSDOMGlobalObject::visitChildren.
(WebCore::DOMPromise::resolve):
(WebCore::DOMPromise::reject):
(WebCore::DeferredWrapper::resolveWithValue): Exit early when isSuspended() is true.
(WebCore::DeferredWrapper::resolveWithNewlyCreated): Ditto.
(WebCore::DeferredWrapper::rejectWithValue): Ditto.
(WebCore::DeferredWrapper::resolve): Ditto.
(WebCore::DeferredWrapper::reject): Ditto.
* bindings/js/JSFontFaceCustom.cpp:
(WebCore::JSFontFace::loaded):
* bindings/js/JSFontFaceSetCustom.cpp:
(WebCore::JSFontFaceSet::ready):
* bindings/js/JSMediaDevicesCustom.cpp:
(WebCore::JSMediaDevices::getUserMedia):
* bindings/js/JSReadableStreamSourceCustom.cpp:
(WebCore::JSReadableStreamSource::start):
* bindings/js/JSWebKitSubtleCryptoCustom.cpp:
(WebCore::JSWebKitSubtleCrypto::encrypt):
(WebCore::JSWebKitSubtleCrypto::decrypt):
(WebCore::JSWebKitSubtleCrypto::sign):
(WebCore::JSWebKitSubtleCrypto::verify):
(WebCore::JSWebKitSubtleCrypto::digest):
(WebCore::JSWebKitSubtleCrypto::generateKey):
(WebCore::JSWebKitSubtleCrypto::importKey):
(WebCore::JSWebKitSubtleCrypto::exportKey):
(WebCore::JSWebKitSubtleCrypto::wrapKey):
(WebCore::JSWebKitSubtleCrypto::unwrapKey):
* bindings/scripts/CodeGeneratorJS.pm:
(GenerateReturnParameters):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreModulesapplepayApplePaySessioncpp">trunk/Source/WebCore/Modules/applepay/ApplePaySession.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesapplepayApplePaySessionh">trunk/Source/WebCore/Modules/applepay/ApplePaySession.h</a></li>
<li><a href="#trunkSourceWebCoreModulesfetchDOMWindowFetchcpp">trunk/Source/WebCore/Modules/fetch/DOMWindowFetch.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesfetchDOMWindowFetchh">trunk/Source/WebCore/Modules/fetch/DOMWindowFetch.h</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="#trunkSourceWebCoreModulesfetchFetchBodyConsumercpp">trunk/Source/WebCore/Modules/fetch/FetchBodyConsumer.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesfetchFetchBodyConsumerh">trunk/Source/WebCore/Modules/fetch/FetchBodyConsumer.h</a></li>
<li><a href="#trunkSourceWebCoreModulesfetchFetchBodyOwnercpp">trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesfetchFetchBodyOwnerh">trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.h</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="#trunkSourceWebCoreModulesfetchWorkerGlobalScopeFetchcpp">trunk/Source/WebCore/Modules/fetch/WorkerGlobalScopeFetch.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesfetchWorkerGlobalScopeFetchh">trunk/Source/WebCore/Modules/fetch/WorkerGlobalScopeFetch.h</a></li>
<li><a href="#trunkSourceWebCoreModulesmediastreamUserMediaPermissionCheckh">trunk/Source/WebCore/Modules/mediastream/UserMediaPermissionCheck.h</a></li>
<li><a href="#trunkSourceWebCoreWebCorexcodeprojprojectpbxproj">trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSDOMGlobalObjectcpp">trunk/Source/WebCore/bindings/js/JSDOMGlobalObject.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSDOMGlobalObjecth">trunk/Source/WebCore/bindings/js/JSDOMGlobalObject.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="#trunkSourceWebCorebindingsjsJSFontFaceCustomcpp">trunk/Source/WebCore/bindings/js/JSFontFaceCustom.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSFontFaceSetCustomcpp">trunk/Source/WebCore/bindings/js/JSFontFaceSetCustom.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSMediaDevicesCustomcpp">trunk/Source/WebCore/bindings/js/JSMediaDevicesCustom.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSReadableStreamSourceCustomcpp">trunk/Source/WebCore/bindings/js/JSReadableStreamSourceCustom.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSWebKitSubtleCryptoCustomcpp">trunk/Source/WebCore/bindings/js/JSWebKitSubtleCryptoCustom.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsscriptsCodeGeneratorJSpm">trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm</a></li>
<li><a href="#trunkSourceWebKit2CMakeListstxt">trunk/Source/WebKit2/CMakeLists.txt</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (205256 => 205257)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-08-31 17:44:22 UTC (rev 205256)
+++ trunk/Source/WebCore/ChangeLog        2016-08-31 18:36:46 UTC (rev 205257)
</span><span class="lines">@@ -1,3 +1,133 @@
</span><ins>+2016-08-30  Ryosuke Niwa  &lt;rniwa@webkit.org&gt;
+
+        Avoid using strong reference in JSDOMPromise’s DeferredWrapper
+        https://bugs.webkit.org/show_bug.cgi?id=161426
+        &lt;rdar://problem/28091123&gt;
+
+        Reviewed by Geoffrey Garen.
+
+        Replace JSC::Strong in DeferredWrapper by JSC::Weak, and make the global object own JSPromiseDeferred.
+
+        DeferredWrapper adds itself to JSDOMGlobalObject's newly added HashSet when it's created and clears itself
+        from the HashSet inside its destructor as well as when the promise is resolved or rejected.
+        This is so that JSDOMGlobalObject's visitChildren can visit every live DeferredWrapper.
+
+        Because this operation is rather expense, this patch turns DeferredWrapper into a RefCounted object to avoid
+        HashMap churns. Most of code changes in this patch is due to this type change, and the fact lambda cannot
+        capture Ref&lt;DeferredWrapper&gt; since its copy constructor doesn't exist.
+
+        We also create a write barrier from the global object to JSPromiseDeferred so that they won't be collected
+        during an eden collection when it happens before JSDOMGlobalObject's visitChildren is invoked.
+
+        Note that it's possible for the entire DOM wrapper world of the promise to go away before the promise is
+        resolved or rejected by a ref-counted C++ object. In this case, m_deferred and m_globalObject become dead.
+        Various member resolve* and reject functions of DeferredWrapper have been modified to check this condition.
+
+        Because JSDOMGlobalObject can be finalized before DeferredWrapper is finalized. DeferredWrapper's destructor,
+        which calls DeferredWrapper::clear, should only remove itself from m_globalObject when m_globalObject is alive.
+
+        Finally, this patch makes DeferredWrapper inherit from ActiveDOMCallback so that it won't try to execute scripts
+        when the active DOM objects have been suspended; e.g. after a page navigation.
+
+        No new tests since there should be no author/user visible behavioral change.
+
+        * Modules/applepay/ApplePaySession.cpp:
+        (WebCore::ApplePaySession::canMakePaymentsWithActiveCard):
+        * Modules/applepay/ApplePaySession.h:
+        * Modules/fetch/DOMWindowFetch.cpp:
+        (WebCore::DOMWindowFetch::fetch):
+        * Modules/fetch/DOMWindowFetch.h:
+        * Modules/fetch/FetchBody.cpp:
+        (WebCore::FetchBody::arrayBuffer):
+        (WebCore::FetchBody::blob):
+        (WebCore::FetchBody::json):
+        (WebCore::FetchBody::text):
+        (WebCore::FetchBody::consume):
+        (WebCore::FetchBody::consumeArrayBuffer):
+        (WebCore::FetchBody::consumeArrayBufferView):
+        (WebCore::FetchBody::consumeText):
+        (WebCore::FetchBody::consumeBlob):
+        (WebCore::FetchBody::loadingFailed):
+        (WebCore::FetchBody::loadingSucceeded):
+        * Modules/fetch/FetchBody.h:
+        (WebCore::FetchBody::formData):
+        (WebCore::FetchBody::cleanConsumePromise):
+        (WebCore::FetchBody): Use RefPtr&lt;DeferredWrapper&gt; instead of Optional&lt;DeferredWrapper&gt; now that DeferredWrapper
+        is ref counted. Perhaps we could use Optional&lt;Ref&lt;DeferredWrapper&gt;&gt; here but that seemed rather verbose.
+        * Modules/fetch/FetchBodyConsumer.cpp:
+        (WebCore::FetchBodyConsumer::resolveWithData):
+        (WebCore::FetchBodyConsumer::resolve):
+        * Modules/fetch/FetchBodyConsumer.h:
+        * Modules/fetch/FetchBodyOwner.cpp:
+        (WebCore::FetchBodyOwner::arrayBuffer):
+        (WebCore::FetchBodyOwner::blob):
+        (WebCore::FetchBodyOwner::formData):
+        (WebCore::FetchBodyOwner::json):
+        (WebCore::FetchBodyOwner::text):
+        * Modules/fetch/FetchBodyOwner.h:
+        * Modules/fetch/FetchResponse.cpp:
+        (WebCore::FetchResponse::consume):
+        (WebCore::FetchResponse::finishConsumingStream):
+        * Modules/fetch/FetchResponse.h:
+        * Modules/fetch/WorkerGlobalScopeFetch.cpp:
+        (WebCore::WorkerGlobalScopeFetch::fetch):
+        * Modules/fetch/WorkerGlobalScopeFetch.h:
+        * Modules/mediastream/UserMediaPermissionCheck.h:
+        * WebCore.xcodeproj/project.pbxproj:
+        * bindings/js/JSDOMGlobalObject.cpp:
+        (WebCore::JSDOMGlobalObject::~JSDOMGlobalObject): Added.
+        (WebCore::JSDOMGlobalObject::visitChildren): Added visits to each JSPromiseDeferred owned by this global object.
+        * bindings/js/JSDOMGlobalObject.h:
+        (WebCore::JSDOMGlobalObject::deferredWrappers): Added. This map is only used by JSDOMGlobalObject's visitChildren.
+        * bindings/js/JSDOMPromise.cpp:
+        (WebCore::DeferredWrapper::DeferredWrapper):
+        (WebCore::DeferredWrapper::~DeferredWrapper): Calls clear. When the global object has already been finalized,
+        m_globalObject is dead. In that case, there is no need to remove itself from the global object. When m_deferred
+        has been cleared, either clear() has already been called (1) or the callback is dead (2). Since (2) happens only
+        when the global object itself is dead (as its visitChildren would have visited m_deferred otherwise), again, there
+        is no need to remove itself from global object.
+        (WebCore::DeferredWrapper::clear): Added. Clears m_deferred and removes itself from JSDOMGlobalObject.
+        (WebCore::DeferredWrapper::contextDestroyed): ScriptExecutionContext has been destroyed. We must call clear().
+        (WebCore::DeferredWrapper::callFunction): Check canInvokeCallback in ActiveDOMCallback.
+        (WebCore::DeferredWrapper::reject): Exit early when isSuspended() is true. See below.
+        (WebCore::rejectPromiseWithExceptionIfAny):
+        (WebCore::fulfillPromiseWithJSON):
+        (WebCore::fulfillPromiseWithArrayBuffer):
+        * bindings/js/JSDOMPromise.h:
+        (WebCore::DeferredWrapper::create): Added.
+        (WebCore::DeferredWrapper::isSuspended): Added. Returns true iff the DOM wrapper world has gone away or active DOM
+        objects have been suspended.
+        (WebCore::DeferredWrapper::globalObject): Made this inline.
+        (WebCore::DeferredWrapper::visitAggregate): Added. Called by JSDOMGlobalObject::visitChildren.
+        (WebCore::DOMPromise::resolve):
+        (WebCore::DOMPromise::reject):
+        (WebCore::DeferredWrapper::resolveWithValue): Exit early when isSuspended() is true.
+        (WebCore::DeferredWrapper::resolveWithNewlyCreated): Ditto.
+        (WebCore::DeferredWrapper::rejectWithValue): Ditto.
+        (WebCore::DeferredWrapper::resolve): Ditto.
+        (WebCore::DeferredWrapper::reject): Ditto.
+        * bindings/js/JSFontFaceCustom.cpp:
+        (WebCore::JSFontFace::loaded):
+        * bindings/js/JSFontFaceSetCustom.cpp:
+        (WebCore::JSFontFaceSet::ready):
+        * bindings/js/JSMediaDevicesCustom.cpp:
+        (WebCore::JSMediaDevices::getUserMedia):
+        * bindings/js/JSReadableStreamSourceCustom.cpp:
+        (WebCore::JSReadableStreamSource::start):
+        * bindings/js/JSWebKitSubtleCryptoCustom.cpp:
+        (WebCore::JSWebKitSubtleCrypto::encrypt):
+        (WebCore::JSWebKitSubtleCrypto::decrypt):
+        (WebCore::JSWebKitSubtleCrypto::sign):
+        (WebCore::JSWebKitSubtleCrypto::verify):
+        (WebCore::JSWebKitSubtleCrypto::digest):
+        (WebCore::JSWebKitSubtleCrypto::generateKey):
+        (WebCore::JSWebKitSubtleCrypto::importKey):
+        (WebCore::JSWebKitSubtleCrypto::exportKey):
+        (WebCore::JSWebKitSubtleCrypto::wrapKey):
+        (WebCore::JSWebKitSubtleCrypto::unwrapKey):
+        * bindings/scripts/CodeGeneratorJS.pm:
+        (GenerateReturnParameters):
+
</ins><span class="cx"> 2016-08-31  Youenn Fablet  &lt;youenn@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [Fetch API] Request construction failure should not set &quot;bodyUsed&quot;
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesapplepayApplePaySessioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/applepay/ApplePaySession.cpp (205256 => 205257)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/applepay/ApplePaySession.cpp        2016-08-31 17:44:22 UTC (rev 205256)
+++ trunk/Source/WebCore/Modules/applepay/ApplePaySession.cpp        2016-08-31 18:36:46 UTC (rev 205257)
</span><span class="lines">@@ -733,7 +733,7 @@
</span><span class="cx">     return paymentCoordinator.canMakePayments();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ApplePaySession::canMakePaymentsWithActiveCard(ScriptExecutionContext&amp; scriptExecutionContext, const String&amp; merchantIdentifier, DeferredWrapper&amp;&amp; promise, ExceptionCode&amp; ec)
</del><ins>+void ApplePaySession::canMakePaymentsWithActiveCard(ScriptExecutionContext&amp; scriptExecutionContext, const String&amp; merchantIdentifier, Ref&lt;DeferredWrapper&gt;&amp;&amp; passedPromise, ExceptionCode&amp; ec)
</ins><span class="cx"> {
</span><span class="cx">     auto&amp; document = downcast&lt;Document&gt;(scriptExecutionContext);
</span><span class="cx">     DOMWindow&amp; window = *document.domWindow();
</span><span class="lines">@@ -745,12 +745,13 @@
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    RefPtr&lt;DeferredWrapper&gt; promise(WTFMove(passedPromise));
</ins><span class="cx">     if (!shouldDiscloseApplePayCapability(document)) {
</span><span class="cx">         auto&amp; paymentCoordinator = document.frame()-&gt;mainFrame().paymentCoordinator();
</span><span class="cx">         bool canMakePayments = paymentCoordinator.canMakePayments();
</span><span class="cx"> 
</span><span class="cx">         RunLoop::main().dispatch([promise, canMakePayments]() mutable {
</span><del>-            promise.resolve(canMakePayments);
</del><ins>+            promise-&gt;resolve(canMakePayments);
</ins><span class="cx">         });
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="lines">@@ -758,7 +759,7 @@
</span><span class="cx">     auto&amp; paymentCoordinator = document.frame()-&gt;mainFrame().paymentCoordinator();
</span><span class="cx"> 
</span><span class="cx">     paymentCoordinator.canMakePaymentsWithActiveCard(merchantIdentifier, document.domain(), [promise](bool canMakePayments) mutable {
</span><del>-        promise.resolve(canMakePayments);
</del><ins>+        promise-&gt;resolve(canMakePayments);
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesapplepayApplePaySessionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/applepay/ApplePaySession.h (205256 => 205257)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/applepay/ApplePaySession.h        2016-08-31 17:44:22 UTC (rev 205256)
+++ trunk/Source/WebCore/Modules/applepay/ApplePaySession.h        2016-08-31 18:36:46 UTC (rev 205257)
</span><span class="lines">@@ -63,7 +63,7 @@
</span><span class="cx"> 
</span><span class="cx">     static bool supportsVersion(ScriptExecutionContext&amp;, unsigned version, ExceptionCode&amp;);
</span><span class="cx">     static bool canMakePayments(ScriptExecutionContext&amp;, ExceptionCode&amp;);
</span><del>-    static void canMakePaymentsWithActiveCard(ScriptExecutionContext&amp;, const String&amp; merchantIdentifier, DeferredWrapper&amp;&amp;, ExceptionCode&amp;);
</del><ins>+    static void canMakePaymentsWithActiveCard(ScriptExecutionContext&amp;, const String&amp; merchantIdentifier, Ref&lt;DeferredWrapper&gt;&amp;&amp;, ExceptionCode&amp;);
</ins><span class="cx"> 
</span><span class="cx">     void begin(ExceptionCode&amp;);
</span><span class="cx">     void abort(ExceptionCode&amp;);
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesfetchDOMWindowFetchcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/fetch/DOMWindowFetch.cpp (205256 => 205257)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/fetch/DOMWindowFetch.cpp        2016-08-31 17:44:22 UTC (rev 205256)
+++ trunk/Source/WebCore/Modules/fetch/DOMWindowFetch.cpp        2016-08-31 18:36:46 UTC (rev 205257)
</span><span class="lines">@@ -37,7 +37,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-void DOMWindowFetch::fetch(DOMWindow&amp; window, FetchRequest&amp; request, DeferredWrapper&amp;&amp; promise)
</del><ins>+void DOMWindowFetch::fetch(DOMWindow&amp; window, FetchRequest&amp; request, DOMPromise&lt;FetchResponse&gt;&amp;&amp; promise)
</ins><span class="cx"> {
</span><span class="cx">     if (!window.scriptExecutionContext())
</span><span class="cx">         return;
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesfetchDOMWindowFetchh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/fetch/DOMWindowFetch.h (205256 => 205257)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/fetch/DOMWindowFetch.h        2016-08-31 17:44:22 UTC (rev 205256)
+++ trunk/Source/WebCore/Modules/fetch/DOMWindowFetch.h        2016-08-31 18:36:46 UTC (rev 205257)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(FETCH_API)
</span><span class="cx"> 
</span><ins>+#include &quot;JSDOMPromise.h&quot;
</ins><span class="cx"> #include &lt;wtf/Forward.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -38,10 +39,11 @@
</span><span class="cx"> class DeferredWrapper;
</span><span class="cx"> class Dictionary;
</span><span class="cx"> class FetchRequest;
</span><ins>+class FetchResponse;
</ins><span class="cx"> 
</span><span class="cx"> class DOMWindowFetch {
</span><span class="cx"> public:
</span><del>-    static void fetch(DOMWindow&amp;, FetchRequest&amp;, DeferredWrapper&amp;&amp;);
</del><ins>+    static void fetch(DOMWindow&amp;, FetchRequest&amp;, DOMPromise&lt;FetchResponse&gt;&amp;&amp;);
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesfetchFetchBodycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/fetch/FetchBody.cpp (205256 => 205257)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/fetch/FetchBody.cpp        2016-08-31 17:44:22 UTC (rev 205256)
+++ trunk/Source/WebCore/Modules/fetch/FetchBody.cpp        2016-08-31 18:36:46 UTC (rev 205257)
</span><span class="lines">@@ -124,7 +124,7 @@
</span><span class="cx">         headers.fastSet(HTTPHeaderName::ContentType, m_contentType);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FetchBody::arrayBuffer(FetchBodyOwner&amp; owner, DeferredWrapper&amp;&amp; promise)
</del><ins>+void FetchBody::arrayBuffer(FetchBodyOwner&amp; owner, Ref&lt;DeferredWrapper&gt;&amp;&amp; promise)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(m_type != Type::None);
</span><span class="cx">     m_consumer.setType(FetchBodyConsumer::Type::ArrayBuffer);
</span><span class="lines">@@ -131,7 +131,7 @@
</span><span class="cx">     consume(owner, WTFMove(promise));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FetchBody::blob(FetchBodyOwner&amp; owner, DeferredWrapper&amp;&amp; promise)
</del><ins>+void FetchBody::blob(FetchBodyOwner&amp; owner, Ref&lt;DeferredWrapper&gt;&amp;&amp; promise)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(m_type != Type::None);
</span><span class="cx">     m_consumer.setType(FetchBodyConsumer::Type::Blob);
</span><span class="lines">@@ -139,12 +139,12 @@
</span><span class="cx">     consume(owner, WTFMove(promise));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FetchBody::json(FetchBodyOwner&amp; owner, DeferredWrapper&amp;&amp; promise)
</del><ins>+void FetchBody::json(FetchBodyOwner&amp; owner, Ref&lt;DeferredWrapper&gt;&amp;&amp; promise)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(m_type != Type::None);
</span><span class="cx"> 
</span><span class="cx">     if (m_type == Type::Text) {
</span><del>-        fulfillPromiseWithJSON(promise, m_text);
</del><ins>+        fulfillPromiseWithJSON(WTFMove(promise), m_text);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx">     m_consumer.setType(FetchBodyConsumer::Type::JSON);
</span><span class="lines">@@ -151,12 +151,12 @@
</span><span class="cx">     consume(owner, WTFMove(promise));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FetchBody::text(FetchBodyOwner&amp; owner, DeferredWrapper&amp;&amp; promise)
</del><ins>+void FetchBody::text(FetchBodyOwner&amp; owner, Ref&lt;DeferredWrapper&gt;&amp;&amp; promise)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(m_type != Type::None);
</span><span class="cx"> 
</span><span class="cx">     if (m_type == Type::Text) {
</span><del>-        promise.resolve(m_text);
</del><ins>+        promise-&gt;resolve(m_text);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx">     m_consumer.setType(FetchBodyConsumer::Type::Text);
</span><span class="lines">@@ -163,7 +163,7 @@
</span><span class="cx">     consume(owner, WTFMove(promise));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FetchBody::consume(FetchBodyOwner&amp; owner, DeferredWrapper&amp;&amp; promise)
</del><ins>+void FetchBody::consume(FetchBodyOwner&amp; owner, Ref&lt;DeferredWrapper&gt;&amp;&amp; promise)
</ins><span class="cx"> {
</span><span class="cx">     // This should be handled by FetchBodyOwner
</span><span class="cx">     ASSERT(m_type != Type::None);
</span><span class="lines">@@ -172,13 +172,13 @@
</span><span class="cx"> 
</span><span class="cx">     switch (m_type) {
</span><span class="cx">     case Type::ArrayBuffer:
</span><del>-        consumeArrayBuffer(promise);
</del><ins>+        consumeArrayBuffer(WTFMove(promise));
</ins><span class="cx">         return;
</span><span class="cx">     case Type::ArrayBufferView:
</span><del>-        consumeArrayBufferView(promise);
</del><ins>+        consumeArrayBufferView(WTFMove(promise));
</ins><span class="cx">         return;
</span><span class="cx">     case Type::Text:
</span><del>-        consumeText(promise);
</del><ins>+        consumeText(WTFMove(promise));
</ins><span class="cx">         return;
</span><span class="cx">     case Type::Blob:
</span><span class="cx">         consumeBlob(owner, WTFMove(promise));
</span><span class="lines">@@ -187,11 +187,11 @@
</span><span class="cx">         m_consumePromise = WTFMove(promise);
</span><span class="cx">         return;
</span><span class="cx">     case Type::Loaded:
</span><del>-        m_consumer.resolve(promise);
</del><ins>+        m_consumer.resolve(WTFMove(promise));
</ins><span class="cx">         return;
</span><span class="cx">     case Type::FormData:
</span><span class="cx">         // FIXME: Support consuming FormData.
</span><del>-        promise.reject(0);
</del><ins>+        promise-&gt;reject(0);
</ins><span class="cx">         return;
</span><span class="cx">     default:
</span><span class="cx">         ASSERT_NOT_REACHED();
</span><span class="lines">@@ -246,28 +246,28 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-void FetchBody::consumeArrayBuffer(DeferredWrapper&amp; promise)
</del><ins>+void FetchBody::consumeArrayBuffer(Ref&lt;DeferredWrapper&gt;&amp;&amp; promise)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(m_data);
</span><del>-    m_consumer.resolveWithData(promise, static_cast&lt;const uint8_t*&gt;(m_data-&gt;data()), m_data-&gt;byteLength());
</del><ins>+    m_consumer.resolveWithData(WTFMove(promise), static_cast&lt;const uint8_t*&gt;(m_data-&gt;data()), m_data-&gt;byteLength());
</ins><span class="cx">     m_data = nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FetchBody::consumeArrayBufferView(DeferredWrapper&amp; promise)
</del><ins>+void FetchBody::consumeArrayBufferView(Ref&lt;DeferredWrapper&gt;&amp;&amp; promise)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(m_dataView);
</span><del>-    m_consumer.resolveWithData(promise, static_cast&lt;const uint8_t*&gt;(m_dataView-&gt;baseAddress()), m_dataView-&gt;byteLength());
</del><ins>+    m_consumer.resolveWithData(WTFMove(promise), static_cast&lt;const uint8_t*&gt;(m_dataView-&gt;baseAddress()), m_dataView-&gt;byteLength());
</ins><span class="cx">     m_dataView = nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FetchBody::consumeText(DeferredWrapper&amp; promise)
</del><ins>+void FetchBody::consumeText(Ref&lt;DeferredWrapper&gt;&amp;&amp; promise)
</ins><span class="cx"> {
</span><span class="cx">     Vector&lt;uint8_t&gt; data = extractFromText();
</span><del>-    m_consumer.resolveWithData(promise, data.data(), data.size());
</del><ins>+    m_consumer.resolveWithData(WTFMove(promise), data.data(), data.size());
</ins><span class="cx">     m_text = { };
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FetchBody::consumeBlob(FetchBodyOwner&amp; owner, DeferredWrapper&amp;&amp; promise)
</del><ins>+void FetchBody::consumeBlob(FetchBodyOwner&amp; owner, Ref&lt;DeferredWrapper&gt;&amp;&amp; promise)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(m_blob);
</span><span class="cx"> 
</span><span class="lines">@@ -290,7 +290,7 @@
</span><span class="cx"> {
</span><span class="cx">     if (m_consumePromise) {
</span><span class="cx">         m_consumePromise-&gt;reject(0);
</span><del>-        m_consumePromise = Nullopt;
</del><ins>+        m_consumePromise = nullptr;
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -297,10 +297,8 @@
</span><span class="cx"> void FetchBody::loadingSucceeded()
</span><span class="cx"> {
</span><span class="cx">     m_type = m_consumer.hasData() ? Type::Loaded : Type::None;
</span><del>-    if (m_consumePromise) {
-        m_consumer.resolve(*m_consumePromise);
-        m_consumePromise = Nullopt;
-    }
</del><ins>+    if (m_consumePromise)
+        m_consumer.resolve(m_consumePromise.releaseNonNull());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> RefPtr&lt;FormData&gt; FetchBody::bodyForInternalRequest(ScriptExecutionContext&amp; context) const
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesfetchFetchBodyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/fetch/FetchBody.h (205256 => 205257)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/fetch/FetchBody.h        2016-08-31 17:44:22 UTC (rev 205256)
+++ trunk/Source/WebCore/Modules/fetch/FetchBody.h        2016-08-31 18:36:46 UTC (rev 205257)
</span><span class="lines">@@ -52,11 +52,11 @@
</span><span class="cx"> 
</span><span class="cx"> class FetchBody {
</span><span class="cx"> public:
</span><del>-    void arrayBuffer(FetchBodyOwner&amp;, DeferredWrapper&amp;&amp;);
-    void blob(FetchBodyOwner&amp;, DeferredWrapper&amp;&amp;);
-    void json(FetchBodyOwner&amp;, DeferredWrapper&amp;&amp;);
-    void text(FetchBodyOwner&amp;, DeferredWrapper&amp;&amp;);
-    void formData(FetchBodyOwner&amp;, DeferredWrapper&amp;&amp; promise) { promise.reject(0); }
</del><ins>+    void arrayBuffer(FetchBodyOwner&amp;, Ref&lt;DeferredWrapper&gt;&amp;&amp;);
+    void blob(FetchBodyOwner&amp;, Ref&lt;DeferredWrapper&gt;&amp;&amp;);
+    void json(FetchBodyOwner&amp;, Ref&lt;DeferredWrapper&gt;&amp;&amp;);
+    void text(FetchBodyOwner&amp;, Ref&lt;DeferredWrapper&gt;&amp;&amp;);
+    void formData(FetchBodyOwner&amp;, Ref&lt;DeferredWrapper&gt;&amp;&amp; promise) { promise.get().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 class="lines">@@ -83,7 +83,7 @@
</span><span class="cx"> 
</span><span class="cx">     FetchBodyConsumer&amp; consumer() { return m_consumer; }
</span><span class="cx"> 
</span><del>-    void cleanConsumePromise() { m_consumePromise = Nullopt; }
</del><ins>+    void cleanConsumePromise() { m_consumePromise = nullptr; }
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     FetchBody(Ref&lt;Blob&gt;&amp;&amp;);
</span><span class="lines">@@ -93,13 +93,13 @@
</span><span class="cx">     FetchBody(String&amp;&amp;);
</span><span class="cx">     FetchBody(Type type) : m_type(type) { }
</span><span class="cx"> 
</span><del>-    void consume(FetchBodyOwner&amp;, DeferredWrapper&amp;&amp;);
</del><ins>+    void consume(FetchBodyOwner&amp;, Ref&lt;DeferredWrapper&gt;&amp;&amp;);
</ins><span class="cx"> 
</span><span class="cx">     Vector&lt;uint8_t&gt; extractFromText() const;
</span><del>-    void consumeArrayBuffer(DeferredWrapper&amp;);
-    void consumeArrayBufferView(DeferredWrapper&amp;);
-    void consumeText(DeferredWrapper&amp;);
-    void consumeBlob(FetchBodyOwner&amp;, DeferredWrapper&amp;&amp;);
</del><ins>+    void consumeArrayBuffer(Ref&lt;DeferredWrapper&gt;&amp;&amp;);
+    void consumeArrayBufferView(Ref&lt;DeferredWrapper&gt;&amp;&amp;);
+    void consumeText(Ref&lt;DeferredWrapper&gt;&amp;&amp;);
+    void consumeBlob(FetchBodyOwner&amp;, Ref&lt;DeferredWrapper&gt;&amp;&amp;);
</ins><span class="cx"> 
</span><span class="cx">     Type m_type { Type::None };
</span><span class="cx">     String m_contentType;
</span><span class="lines">@@ -112,7 +112,7 @@
</span><span class="cx">     String m_text;
</span><span class="cx"> 
</span><span class="cx">     FetchBodyConsumer m_consumer { FetchBodyConsumer::Type::None };
</span><del>-    Optional&lt;DeferredWrapper&gt; m_consumePromise;
</del><ins>+    RefPtr&lt;DeferredWrapper&gt; m_consumePromise;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesfetchFetchBodyConsumercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/fetch/FetchBodyConsumer.cpp (205256 => 205257)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/fetch/FetchBodyConsumer.cpp        2016-08-31 17:44:22 UTC (rev 205256)
+++ trunk/Source/WebCore/Modules/fetch/FetchBodyConsumer.cpp        2016-08-31 18:36:46 UTC (rev 205257)
</span><span class="lines">@@ -59,20 +59,20 @@
</span><span class="cx">     return decoder-&gt;decodeAndFlush(reinterpret_cast&lt;const char*&gt;(data), length);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FetchBodyConsumer::resolveWithData(DeferredWrapper&amp; promise, const unsigned char* data, unsigned length)
</del><ins>+void FetchBodyConsumer::resolveWithData(Ref&lt;DeferredWrapper&gt;&amp;&amp; promise, const unsigned char* data, unsigned length)
</ins><span class="cx"> {
</span><span class="cx">     switch (m_type) {
</span><span class="cx">     case Type::ArrayBuffer:
</span><del>-        fulfillPromiseWithArrayBuffer(promise, data, length);
</del><ins>+        fulfillPromiseWithArrayBuffer(WTFMove(promise), data, length);
</ins><span class="cx">         return;
</span><span class="cx">     case Type::Blob:
</span><del>-        promise.resolveWithNewlyCreated(blobFromData(data, length, m_contentType));
</del><ins>+        promise-&gt;resolveWithNewlyCreated(blobFromData(data, length, m_contentType));
</ins><span class="cx">         return;
</span><span class="cx">     case Type::JSON:
</span><del>-        fulfillPromiseWithJSON(promise, textFromUTF8(data, length));
</del><ins>+        fulfillPromiseWithJSON(WTFMove(promise), textFromUTF8(data, length));
</ins><span class="cx">         return;
</span><span class="cx">     case Type::Text:
</span><del>-        promise.resolve(textFromUTF8(data, length));
</del><ins>+        promise-&gt;resolve(textFromUTF8(data, length));
</ins><span class="cx">         return;
</span><span class="cx">     case Type::None:
</span><span class="cx">         ASSERT_NOT_REACHED();
</span><span class="lines">@@ -80,21 +80,21 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FetchBodyConsumer::resolve(DeferredWrapper&amp; promise)
</del><ins>+void FetchBodyConsumer::resolve(Ref&lt;DeferredWrapper&gt;&amp;&amp; promise)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(m_type != Type::None);
</span><span class="cx">     switch (m_type) {
</span><span class="cx">     case Type::ArrayBuffer:
</span><del>-        fulfillPromiseWithArrayBuffer(promise, takeAsArrayBuffer().get());
</del><ins>+        fulfillPromiseWithArrayBuffer(WTFMove(promise), takeAsArrayBuffer().get());
</ins><span class="cx">         return;
</span><span class="cx">     case Type::Blob:
</span><del>-        promise.resolveWithNewlyCreated(takeAsBlob());
</del><ins>+        promise-&gt;resolveWithNewlyCreated(takeAsBlob());
</ins><span class="cx">         return;
</span><span class="cx">     case Type::JSON:
</span><del>-        fulfillPromiseWithJSON(promise, takeAsText());
</del><ins>+        fulfillPromiseWithJSON(WTFMove(promise), takeAsText());
</ins><span class="cx">         return;
</span><span class="cx">     case Type::Text:
</span><del>-        promise.resolve(takeAsText());
</del><ins>+        promise-&gt;resolve(takeAsText());
</ins><span class="cx">         return;
</span><span class="cx">     case Type::None:
</span><span class="cx">         ASSERT_NOT_REACHED();
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesfetchFetchBodyConsumerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/fetch/FetchBodyConsumer.h (205256 => 205257)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/fetch/FetchBodyConsumer.h        2016-08-31 17:44:22 UTC (rev 205256)
+++ trunk/Source/WebCore/Modules/fetch/FetchBodyConsumer.h        2016-08-31 18:36:46 UTC (rev 205257)
</span><span class="lines">@@ -57,8 +57,8 @@
</span><span class="cx"> 
</span><span class="cx">     void clean() { m_buffer = nullptr; }
</span><span class="cx"> 
</span><del>-    void resolve(DeferredWrapper&amp;);
-    void resolveWithData(DeferredWrapper&amp;, const unsigned char*, unsigned);
</del><ins>+    void resolve(Ref&lt;DeferredWrapper&gt;&amp;&amp;);
+    void resolveWithData(Ref&lt;DeferredWrapper&gt;&amp;&amp;, const unsigned char*, unsigned);
</ins><span class="cx"> 
</span><span class="cx">     bool hasData() const { return !!m_buffer; }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesfetchFetchBodyOwnercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.cpp (205256 => 205257)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.cpp        2016-08-31 17:44:22 UTC (rev 205256)
+++ trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.cpp        2016-08-31 18:36:46 UTC (rev 205257)
</span><span class="lines">@@ -71,14 +71,14 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FetchBodyOwner::arrayBuffer(DeferredWrapper&amp;&amp; promise)
</del><ins>+void FetchBodyOwner::arrayBuffer(Ref&lt;DeferredWrapper&gt;&amp;&amp; promise)
</ins><span class="cx"> {
</span><span class="cx">     if (m_body.isEmpty()) {
</span><del>-        fulfillPromiseWithArrayBuffer(promise, nullptr, 0);
</del><ins>+        fulfillPromiseWithArrayBuffer(WTFMove(promise), nullptr, 0);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx">     if (isDisturbedOrLocked()) {
</span><del>-        promise.reject(TypeError);
</del><ins>+        promise-&gt;reject(TypeError);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx">     m_isDisturbed = true;
</span><span class="lines">@@ -85,14 +85,14 @@
</span><span class="cx">     m_body.arrayBuffer(*this, WTFMove(promise));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FetchBodyOwner::blob(DeferredWrapper&amp;&amp; promise)
</del><ins>+void FetchBodyOwner::blob(Ref&lt;DeferredWrapper&gt;&amp;&amp; promise)
</ins><span class="cx"> {
</span><span class="cx">     if (m_body.isEmpty()) {
</span><del>-        promise.resolve(Blob::create(Vector&lt;uint8_t&gt;(), Blob::normalizedContentType(extractMIMETypeFromMediaType(m_body.contentType()))));
</del><ins>+        promise-&gt;resolve(Blob::create(Vector&lt;uint8_t&gt;(), Blob::normalizedContentType(extractMIMETypeFromMediaType(m_body.contentType()))));
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx">     if (isDisturbedOrLocked()) {
</span><del>-        promise.reject(TypeError);
</del><ins>+        promise-&gt;reject(TypeError);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx">     m_isDisturbed = true;
</span><span class="lines">@@ -99,14 +99,14 @@
</span><span class="cx">     m_body.blob(*this, WTFMove(promise));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FetchBodyOwner::formData(DeferredWrapper&amp;&amp; promise)
</del><ins>+void FetchBodyOwner::formData(Ref&lt;DeferredWrapper&gt;&amp;&amp; promise)
</ins><span class="cx"> {
</span><span class="cx">     if (m_body.isEmpty()) {
</span><del>-        promise.reject(0);
</del><ins>+        promise-&gt;reject(0);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx">     if (isDisturbedOrLocked()) {
</span><del>-        promise.reject(TypeError);
</del><ins>+        promise-&gt;reject(TypeError);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx">     m_isDisturbed = true;
</span><span class="lines">@@ -113,14 +113,14 @@
</span><span class="cx">     m_body.formData(*this, WTFMove(promise));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FetchBodyOwner::json(DeferredWrapper&amp;&amp; promise)
</del><ins>+void FetchBodyOwner::json(Ref&lt;DeferredWrapper&gt;&amp;&amp; promise)
</ins><span class="cx"> {
</span><span class="cx">     if (m_body.isEmpty()) {
</span><del>-        promise.reject(SYNTAX_ERR);
</del><ins>+        promise-&gt;reject(SYNTAX_ERR);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx">     if (isDisturbedOrLocked()) {
</span><del>-        promise.reject(TypeError);
</del><ins>+        promise-&gt;reject(TypeError);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx">     m_isDisturbed = true;
</span><span class="lines">@@ -127,14 +127,14 @@
</span><span class="cx">     m_body.json(*this, WTFMove(promise));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FetchBodyOwner::text(DeferredWrapper&amp;&amp; promise)
</del><ins>+void FetchBodyOwner::text(Ref&lt;DeferredWrapper&gt;&amp;&amp; promise)
</ins><span class="cx"> {
</span><span class="cx">     if (m_body.isEmpty()) {
</span><del>-        promise.resolve(String());
</del><ins>+        promise-&gt;resolve(String());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx">     if (isDisturbedOrLocked()) {
</span><del>-        promise.reject(TypeError);
</del><ins>+        promise-&gt;reject(TypeError);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx">     m_isDisturbed = true;
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesfetchFetchBodyOwnerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.h (205256 => 205257)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.h        2016-08-31 17:44:22 UTC (rev 205256)
+++ trunk/Source/WebCore/Modules/fetch/FetchBodyOwner.h        2016-08-31 18:36:46 UTC (rev 205257)
</span><span class="lines">@@ -46,11 +46,11 @@
</span><span class="cx">     // Exposed Body API
</span><span class="cx">     bool isDisturbed() const { return m_isDisturbed; };
</span><span class="cx"> 
</span><del>-    void arrayBuffer(DeferredWrapper&amp;&amp;);
-    void blob(DeferredWrapper&amp;&amp;);
-    void formData(DeferredWrapper&amp;&amp;);
-    void json(DeferredWrapper&amp;&amp;);
-    void text(DeferredWrapper&amp;&amp;);
</del><ins>+    void arrayBuffer(Ref&lt;DeferredWrapper&gt;&amp;&amp;);
+    void blob(Ref&lt;DeferredWrapper&gt;&amp;&amp;);
+    void formData(Ref&lt;DeferredWrapper&gt;&amp;&amp;);
+    void json(Ref&lt;DeferredWrapper&gt;&amp;&amp;);
+    void text(Ref&lt;DeferredWrapper&gt;&amp;&amp;);
</ins><span class="cx"> 
</span><span class="cx">     bool isDisturbedOrLocked() const;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesfetchFetchResponsecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp (205256 => 205257)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp        2016-08-31 17:44:22 UTC (rev 205256)
+++ trunk/Source/WebCore/Modules/fetch/FetchResponse.cpp        2016-08-31 18:36:46 UTC (rev 205257)
</span><span class="lines">@@ -206,7 +206,7 @@
</span><span class="cx">         m_loader-&gt;stop();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FetchResponse::consume(unsigned type, DeferredWrapper&amp;&amp; wrapper)
</del><ins>+void FetchResponse::consume(unsigned type, Ref&lt;DeferredWrapper&gt;&amp;&amp; wrapper)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(type &lt;= static_cast&lt;unsigned&gt;(FetchBodyConsumer::Type::Text));
</span><span class="cx"> 
</span><span class="lines">@@ -241,9 +241,9 @@
</span><span class="cx">     m_consumer.append(chunk-&gt;data(), chunk-&gt;byteLength());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void FetchResponse::finishConsumingStream(DeferredWrapper&amp;&amp; promise)
</del><ins>+void FetchResponse::finishConsumingStream(Ref&lt;DeferredWrapper&gt;&amp;&amp; promise)
</ins><span class="cx"> {
</span><del>-    m_consumer.resolve(promise);
</del><ins>+    m_consumer.resolve(WTFMove(promise));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void FetchResponse::consumeBodyAsStream()
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesfetchFetchResponseh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/fetch/FetchResponse.h (205256 => 205257)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/fetch/FetchResponse.h        2016-08-31 17:44:22 UTC (rev 205256)
+++ trunk/Source/WebCore/Modules/fetch/FetchResponse.h        2016-08-31 18:36:46 UTC (rev 205257)
</span><span class="lines">@@ -60,11 +60,11 @@
</span><span class="cx">     using FetchPromise = DOMPromise&lt;FetchResponse&gt;;
</span><span class="cx">     static void fetch(ScriptExecutionContext&amp;, FetchRequest&amp;, FetchPromise&amp;&amp;);
</span><span class="cx"> 
</span><del>-    void consume(unsigned, DeferredWrapper&amp;&amp;);
</del><ins>+    void consume(unsigned, Ref&lt;DeferredWrapper&gt;&amp;&amp;);
</ins><span class="cx"> #if ENABLE(STREAMS_API)
</span><span class="cx">     void startConsumingStream(unsigned);
</span><span class="cx">     void consumeChunk(Ref&lt;JSC::Uint8Array&gt;&amp;&amp;);
</span><del>-    void finishConsumingStream(DeferredWrapper&amp;&amp;);
</del><ins>+    void finishConsumingStream(Ref&lt;DeferredWrapper&gt;&amp;&amp;);
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     void setStatus(int, const String&amp;, ExceptionCode&amp;);
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesfetchWorkerGlobalScopeFetchcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/fetch/WorkerGlobalScopeFetch.cpp (205256 => 205257)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/fetch/WorkerGlobalScopeFetch.cpp        2016-08-31 17:44:22 UTC (rev 205256)
+++ trunk/Source/WebCore/Modules/fetch/WorkerGlobalScopeFetch.cpp        2016-08-31 18:36:46 UTC (rev 205257)
</span><span class="lines">@@ -36,7 +36,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-void WorkerGlobalScopeFetch::fetch(WorkerGlobalScope&amp; scope, FetchRequest&amp; request, DeferredWrapper&amp;&amp; promise)
</del><ins>+void WorkerGlobalScopeFetch::fetch(WorkerGlobalScope&amp; scope, FetchRequest&amp; request, Ref&lt;DeferredWrapper&gt;&amp;&amp; promise)
</ins><span class="cx"> {
</span><span class="cx">     if (!scope.scriptExecutionContext())
</span><span class="cx">         return;
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesfetchWorkerGlobalScopeFetchh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/fetch/WorkerGlobalScopeFetch.h (205256 => 205257)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/fetch/WorkerGlobalScopeFetch.h        2016-08-31 17:44:22 UTC (rev 205256)
+++ trunk/Source/WebCore/Modules/fetch/WorkerGlobalScopeFetch.h        2016-08-31 18:36:46 UTC (rev 205257)
</span><span class="lines">@@ -41,7 +41,7 @@
</span><span class="cx"> 
</span><span class="cx"> class WorkerGlobalScopeFetch {
</span><span class="cx"> public:
</span><del>-    static void fetch(WorkerGlobalScope&amp;, FetchRequest&amp;, DeferredWrapper&amp;&amp;);
</del><ins>+    static void fetch(WorkerGlobalScope&amp;, FetchRequest&amp;, Ref&lt;DeferredWrapper&gt;&amp;&amp;);
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesmediastreamUserMediaPermissionCheckh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/mediastream/UserMediaPermissionCheck.h (205256 => 205257)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/mediastream/UserMediaPermissionCheck.h        2016-08-31 17:44:22 UTC (rev 205256)
+++ trunk/Source/WebCore/Modules/mediastream/UserMediaPermissionCheck.h        2016-08-31 18:36:46 UTC (rev 205257)
</span><span class="lines">@@ -30,7 +30,6 @@
</span><span class="cx"> #if ENABLE(MEDIA_STREAM)
</span><span class="cx"> 
</span><span class="cx"> #include &quot;ActiveDOMObject.h&quot;
</span><del>-#include &quot;MediaDevices.h&quot;
</del><span class="cx"> #include &lt;wtf/RefCounted.h&gt;
</span><span class="cx"> #include &lt;wtf/text/WTFString.h&gt;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (205256 => 205257)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2016-08-31 17:44:22 UTC (rev 205256)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2016-08-31 18:36:46 UTC (rev 205257)
</span><span class="lines">@@ -4941,7 +4941,7 @@
</span><span class="cx">                 B5B7A17017C10AA800E4AA0A /* ElementData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5B7A16F17C1080600E4AA0A /* ElementData.cpp */; };
</span><span class="cx">                 B5B7A17117C10AC000E4AA0A /* ElementData.h in Headers */ = {isa = PBXBuildFile; fileRef = B5B7A16E17C1048000E4AA0A /* ElementData.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 B5D31DFA11CF610B009F22B4 /* ActiveDOMCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5D31DF811CF610B009F22B4 /* ActiveDOMCallback.cpp */; };
</span><del>-                B5D31DFB11CF610B009F22B4 /* ActiveDOMCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = B5D31DF911CF610B009F22B4 /* ActiveDOMCallback.h */; };
</del><ins>+                B5D31DFB11CF610B009F22B4 /* ActiveDOMCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = B5D31DF911CF610B009F22B4 /* ActiveDOMCallback.h */; settings = {ATTRIBUTES = (Private, ); }; };
</ins><span class="cx">                 B6566270120B1227006EA85C /* JSIDBTransaction.h in Headers */ = {isa = PBXBuildFile; fileRef = B656626E120B1227006EA85C /* JSIDBTransaction.h */; };
</span><span class="cx">                 B658FFA11522EF3A00DD5595 /* JSRadioNodeList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B658FF9F1522EF3A00DD5595 /* JSRadioNodeList.cpp */; };
</span><span class="cx">                 B658FFA21522EF3A00DD5595 /* JSRadioNodeList.h in Headers */ = {isa = PBXBuildFile; fileRef = B658FFA01522EF3A00DD5595 /* JSRadioNodeList.h */; };
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSDOMGlobalObjectcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSDOMGlobalObject.cpp (205256 => 205257)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSDOMGlobalObject.cpp        2016-08-31 17:44:22 UTC (rev 205256)
+++ trunk/Source/WebCore/bindings/js/JSDOMGlobalObject.cpp        2016-08-31 18:36:46 UTC (rev 205257)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx"> #include &quot;JSDOMGlobalObject.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;Document.h&quot;
</span><ins>+#include &quot;JSDOMPromise.h&quot;
</ins><span class="cx"> #include &quot;JSDOMWindow.h&quot;
</span><span class="cx"> #include &quot;JSEventListener.h&quot;
</span><span class="cx"> #include &quot;JSMediaStream.h&quot;
</span><span class="lines">@@ -61,6 +62,10 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+JSDOMGlobalObject::~JSDOMGlobalObject()
+{
+}
+
</ins><span class="cx"> void JSDOMGlobalObject::destroy(JSCell* cell)
</span><span class="cx"> {
</span><span class="cx">     static_cast&lt;JSDOMGlobalObject*&gt;(cell)-&gt;JSDOMGlobalObject::~JSDOMGlobalObject();
</span><span class="lines">@@ -167,6 +172,9 @@
</span><span class="cx">     for (auto&amp; constructor : thisObject-&gt;constructors().values())
</span><span class="cx">         visitor.append(&amp;constructor);
</span><span class="cx"> 
</span><ins>+    for (auto&amp; deferredWrapper : thisObject-&gt;deferredWrappers())
+        deferredWrapper-&gt;visitAggregate(visitor);
+
</ins><span class="cx">     thisObject-&gt;m_builtinInternalFunctions.visit(visitor);
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSDOMGlobalObjecth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSDOMGlobalObject.h (205256 => 205257)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSDOMGlobalObject.h        2016-08-31 17:44:22 UTC (rev 205256)
+++ trunk/Source/WebCore/bindings/js/JSDOMGlobalObject.h        2016-08-31 18:36:46 UTC (rev 205257)
</span><span class="lines">@@ -34,6 +34,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><ins>+    class DeferredWrapper;
</ins><span class="cx">     class Document;
</span><span class="cx">     class Event;
</span><span class="cx">     class DOMWrapperWorld;
</span><span class="lines">@@ -41,6 +42,7 @@
</span><span class="cx"> 
</span><span class="cx">     typedef HashMap&lt;const JSC::ClassInfo*, JSC::WriteBarrier&lt;JSC::Structure&gt;&gt; JSDOMStructureMap;
</span><span class="cx">     typedef HashMap&lt;const JSC::ClassInfo*, JSC::WriteBarrier&lt;JSC::JSObject&gt;&gt; JSDOMConstructorMap;
</span><ins>+    typedef HashSet&lt;DeferredWrapper*&gt; DeferredWrapperSet;
</ins><span class="cx"> 
</span><span class="cx">     class WEBCORE_EXPORT JSDOMGlobalObject : public JSC::JSGlobalObject {
</span><span class="cx">         typedef JSC::JSGlobalObject Base;
</span><span class="lines">@@ -56,6 +58,8 @@
</span><span class="cx">         JSDOMStructureMap&amp; structures() { return m_structures; }
</span><span class="cx">         JSDOMConstructorMap&amp; constructors() { return m_constructors; }
</span><span class="cx"> 
</span><ins>+        DeferredWrapperSet&amp; deferredWrappers() { return m_deferredWrappers; }
+
</ins><span class="cx">         ScriptExecutionContext* scriptExecutionContext() const;
</span><span class="cx"> 
</span><span class="cx">         // Make binding code generation easier.
</span><span class="lines">@@ -75,6 +79,8 @@
</span><span class="cx">         static const JSC::ClassInfo s_info;
</span><span class="cx"> 
</span><span class="cx">     public:
</span><ins>+        ~JSDOMGlobalObject();
+
</ins><span class="cx">         static const JSC::ClassInfo* info() { return &amp;s_info; }
</span><span class="cx"> 
</span><span class="cx">         static JSC::Structure* createStructure(JSC::VM&amp; vm, JSC::JSValue prototype)
</span><span class="lines">@@ -85,6 +91,7 @@
</span><span class="cx">     protected:
</span><span class="cx">         JSDOMStructureMap m_structures;
</span><span class="cx">         JSDOMConstructorMap m_constructors;
</span><ins>+        DeferredWrapperSet m_deferredWrappers;
</ins><span class="cx"> 
</span><span class="cx">         Event* m_currentEvent;
</span><span class="cx">         Ref&lt;DOMWrapperWorld&gt; m_world;
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSDOMPromisecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSDOMPromise.cpp (205256 => 205257)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSDOMPromise.cpp        2016-08-31 17:44:22 UTC (rev 205256)
+++ trunk/Source/WebCore/bindings/js/JSDOMPromise.cpp        2016-08-31 18:36:46 UTC (rev 205257)
</span><span class="lines">@@ -35,18 +35,33 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-DeferredWrapper::DeferredWrapper(ExecState* exec, JSDOMGlobalObject* globalObject, JSPromiseDeferred* promiseDeferred)
-    : m_globalObject(exec-&gt;vm(), globalObject)
-    , m_deferred(exec-&gt;vm(), promiseDeferred)
</del><ins>+DeferredWrapper::DeferredWrapper(ExecState*, JSDOMGlobalObject* globalObject, JSPromiseDeferred* promiseDeferred)
+    : ActiveDOMCallback(globalObject-&gt;scriptExecutionContext())
+    , m_deferred(promiseDeferred)
+    , m_globalObject(globalObject)
</ins><span class="cx"> {
</span><ins>+    globalObject-&gt;vm().heap.writeBarrier(globalObject, promiseDeferred);
+    m_globalObject-&gt;deferredWrappers().add(this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-JSDOMGlobalObject&amp; DeferredWrapper::globalObject() const
</del><ins>+DeferredWrapper::~DeferredWrapper()
</ins><span class="cx"> {
</span><del>-    ASSERT(m_globalObject);
-    return *m_globalObject.get();
</del><ins>+    clear();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void DeferredWrapper::clear()
+{
+    ASSERT(!m_deferred || m_globalObject);
+    if (m_deferred &amp;&amp; m_globalObject)
+        m_globalObject-&gt;deferredWrappers().remove(this);
+    m_deferred.clear();
+}
+
+void DeferredWrapper::contextDestroyed()
+{
+    clear();
+}
+
</ins><span class="cx"> JSC::JSValue DeferredWrapper::promise() const
</span><span class="cx"> {
</span><span class="cx">     ASSERT(m_deferred);
</span><span class="lines">@@ -55,6 +70,9 @@
</span><span class="cx"> 
</span><span class="cx"> void DeferredWrapper::callFunction(ExecState&amp; exec, JSValue function, JSValue resolution)
</span><span class="cx"> {
</span><ins>+    if (!canInvokeCallback())
+        return;
+
</ins><span class="cx">     CallData callData;
</span><span class="cx">     CallType callType = getCallData(function, callData);
</span><span class="cx">     ASSERT(callType != CallType::None);
</span><span class="lines">@@ -64,12 +82,14 @@
</span><span class="cx"> 
</span><span class="cx">     call(&amp;exec, function, callType, callData, jsUndefined(), arguments);
</span><span class="cx"> 
</span><del>-    m_globalObject.clear();
-    m_deferred.clear();
</del><ins>+    clear();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void DeferredWrapper::reject(ExceptionCode ec, const String&amp; message)
</span><span class="cx"> {
</span><ins>+    if (isSuspended())
+        return;
+
</ins><span class="cx">     ASSERT(m_deferred);
</span><span class="cx">     ASSERT(m_globalObject);
</span><span class="cx">     JSC::ExecState* state = m_globalObject-&gt;globalExec();
</span><span class="lines">@@ -85,7 +105,7 @@
</span><span class="cx">     JSValue error = state.exception()-&gt;value();
</span><span class="cx">     state.clearException();
</span><span class="cx"> 
</span><del>-    DeferredWrapper(&amp;state, &amp;globalObject, &amp;promiseDeferred).reject(error);
</del><ins>+    DeferredWrapper::create(&amp;state, &amp;globalObject, &amp;promiseDeferred)-&gt;reject(error);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static inline JSC::JSValue parseAsJSON(JSC::ExecState* state, const String&amp; data)
</span><span class="lines">@@ -94,27 +114,27 @@
</span><span class="cx">     return JSC::JSONParse(state, data);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void fulfillPromiseWithJSON(DeferredWrapper&amp; promise, const String&amp; data)
</del><ins>+void fulfillPromiseWithJSON(Ref&lt;DeferredWrapper&gt;&amp;&amp; promise, const String&amp; data)
</ins><span class="cx"> {
</span><del>-    JSC::JSValue value = parseAsJSON(promise.globalObject().globalExec(), data);
</del><ins>+    JSC::JSValue value = parseAsJSON(promise-&gt;globalObject()-&gt;globalExec(), data);
</ins><span class="cx">     if (!value)
</span><del>-        promise.reject(SYNTAX_ERR);
</del><ins>+        promise-&gt;reject(SYNTAX_ERR);
</ins><span class="cx">     else
</span><del>-        promise.resolve(value);
</del><ins>+        promise-&gt;resolve(value);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void fulfillPromiseWithArrayBuffer(DeferredWrapper&amp; promise, ArrayBuffer* arrayBuffer)
</del><ins>+void fulfillPromiseWithArrayBuffer(Ref&lt;DeferredWrapper&gt;&amp;&amp; promise, ArrayBuffer* arrayBuffer)
</ins><span class="cx"> {
</span><span class="cx">     if (!arrayBuffer) {
</span><del>-        promise.reject&lt;JSValue&gt;(createOutOfMemoryError(promise.globalObject().globalExec()));
</del><ins>+        promise-&gt;reject&lt;JSValue&gt;(createOutOfMemoryError(promise-&gt;globalObject()-&gt;globalExec()));
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><del>-    promise.resolve(arrayBuffer);
</del><ins>+    promise-&gt;resolve(arrayBuffer);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void fulfillPromiseWithArrayBuffer(DeferredWrapper&amp; promise, const void* data, size_t length)
</del><ins>+void fulfillPromiseWithArrayBuffer(Ref&lt;DeferredWrapper&gt;&amp;&amp; promise, const void* data, size_t length)
</ins><span class="cx"> {
</span><del>-    fulfillPromiseWithArrayBuffer(promise, ArrayBuffer::tryCreate(data, length).get());
</del><ins>+    fulfillPromiseWithArrayBuffer(WTFMove(promise), ArrayBuffer::tryCreate(data, length).get());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSDOMPromiseh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSDOMPromise.h (205256 => 205257)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSDOMPromise.h        2016-08-31 17:44:22 UTC (rev 205256)
+++ trunk/Source/WebCore/bindings/js/JSDOMPromise.h        2016-08-31 18:36:46 UTC (rev 205257)
</span><span class="lines">@@ -26,6 +26,7 @@
</span><span class="cx"> #ifndef JSDOMPromise_h
</span><span class="cx"> #define JSDOMPromise_h
</span><span class="cx"> 
</span><ins>+#include &quot;ActiveDOMCallback.h&quot;
</ins><span class="cx"> #include &quot;JSDOMBinding.h&quot;
</span><span class="cx"> #include &lt;heap/StrongInlines.h&gt;
</span><span class="cx"> #include &lt;runtime/JSPromiseDeferred.h&gt;
</span><span class="lines">@@ -95,10 +96,15 @@
</span><span class="cx">     static constexpr bool passByConstRef = false;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-class DeferredWrapper {
</del><ins>+class DeferredWrapper : public RefCounted&lt;DeferredWrapper&gt;, public ActiveDOMCallback {
</ins><span class="cx"> public:
</span><del>-    DeferredWrapper(JSC::ExecState*, JSDOMGlobalObject*, JSC::JSPromiseDeferred*);
</del><ins>+    static Ref&lt;DeferredWrapper&gt; create(JSC::ExecState* state, JSDOMGlobalObject* globalObject, JSC::JSPromiseDeferred* deferred)
+    {
+        return adoptRef(*new DeferredWrapper(state, globalObject, deferred));
+    }
</ins><span class="cx"> 
</span><ins>+    ~DeferredWrapper();
+
</ins><span class="cx">     template&lt;class ResolveResultType&gt; typename std::enable_if&lt;PromiseResultInspector&lt;ResolveResultType&gt;::passByValue, void&gt;::type
</span><span class="cx">     resolve(ResolveResultType result) { resolveWithValue(result); }
</span><span class="cx">     template&lt;class ResolveResultType&gt; typename std::enable_if&lt;PromiseResultInspector&lt;ResolveResultType&gt;::passByRef, void&gt;::type
</span><span class="lines">@@ -121,10 +127,19 @@
</span><span class="cx"> 
</span><span class="cx">     void reject(ExceptionCode, const String&amp; = { });
</span><span class="cx"> 
</span><del>-    JSDOMGlobalObject&amp; globalObject() const;
</del><span class="cx">     JSC::JSValue promise() const;
</span><span class="cx"> 
</span><ins>+    bool isSuspended() { return !m_deferred || !canInvokeCallback(); } // The wrapper world has gone away or active DOM objects have been suspended.
+    JSDOMGlobalObject* globalObject() { return m_globalObject.get(); }
+
+    void visitAggregate(JSC::SlotVisitor&amp; visitor) { visitor.appendUnbarrieredWeak(&amp;m_deferred); }
+
</ins><span class="cx"> private:
</span><ins>+    DeferredWrapper(JSC::ExecState*, JSDOMGlobalObject*, JSC::JSPromiseDeferred*);
+
+    void clear();
+    void contextDestroyed() override;
+
</ins><span class="cx">     void callFunction(JSC::ExecState&amp;, JSC::JSValue function, JSC::JSValue resolution);
</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="lines">@@ -132,13 +147,13 @@
</span><span class="cx">     template&lt;class RejectResultType&gt; void rejectWithValue(RejectResultType&amp;&amp;);
</span><span class="cx">     template&lt;class ResolveResultType&gt; void resolveWithValue(ResolveResultType&amp;&amp;);
</span><span class="cx"> 
</span><del>-    JSC::Strong&lt;JSDOMGlobalObject&gt; m_globalObject;
-    JSC::Strong&lt;JSC::JSPromiseDeferred&gt; m_deferred;
</del><ins>+    JSC::Weak&lt;JSC::JSPromiseDeferred&gt; m_deferred;
+    JSC::Weak&lt;JSDOMGlobalObject&gt; m_globalObject;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><del>-void fulfillPromiseWithJSON(DeferredWrapper&amp;, const String&amp;);
-void fulfillPromiseWithArrayBuffer(DeferredWrapper&amp;, ArrayBuffer*);
-void fulfillPromiseWithArrayBuffer(DeferredWrapper&amp;, const void*, size_t);
</del><ins>+void fulfillPromiseWithJSON(Ref&lt;DeferredWrapper&gt;&amp;&amp;, const String&amp;);
+void fulfillPromiseWithArrayBuffer(Ref&lt;DeferredWrapper&gt;&amp;&amp;, ArrayBuffer*);
+void fulfillPromiseWithArrayBuffer(Ref&lt;DeferredWrapper&gt;&amp;&amp;, const void*, size_t);
</ins><span class="cx"> void rejectPromiseWithExceptionIfAny(JSC::ExecState&amp;, JSDOMGlobalObject&amp;, JSC::JSPromiseDeferred&amp;);
</span><span class="cx"> 
</span><span class="cx"> inline JSC::JSValue callPromiseFunction(JSC::ExecState&amp; state, JSC::EncodedJSValue promiseFunction(JSC::ExecState*, JSC::JSPromiseDeferred*))
</span><span class="lines">@@ -156,26 +171,31 @@
</span><span class="cx"> template &lt;typename Value&gt;
</span><span class="cx"> class DOMPromise {
</span><span class="cx"> public:
</span><del>-    DOMPromise(DeferredWrapper&amp;&amp; wrapper) : m_wrapper(WTFMove(wrapper)) { }
</del><ins>+    DOMPromise(Ref&lt;DeferredWrapper&gt;&amp;&amp; wrapper)
+        : m_wrapper(WTFMove(wrapper))
+    {
+    }
+
</ins><span class="cx">     DOMPromise(DOMPromise&amp;&amp; promise) : m_wrapper(WTFMove(promise.m_wrapper)) { }
</span><span class="cx"> 
</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(typename PromiseResultInspector&lt;Value&gt;::Type value) { m_wrapper.resolve(value); }
</del><ins>+    void resolve(typename PromiseResultInspector&lt;Value&gt;::Type value) { m_wrapper-&gt;resolve(value); }
</ins><span class="cx"> 
</span><del>-    template&lt;typename... ErrorType&gt; void reject(ErrorType&amp;&amp;... error) { m_wrapper.reject(std::forward&lt;ErrorType&gt;(error)...); }
</del><ins>+    template&lt;typename... ErrorType&gt; void reject(ErrorType&amp;&amp;... error) { m_wrapper-&gt;reject(std::forward&lt;ErrorType&gt;(error)...); }
</ins><span class="cx"> 
</span><span class="cx">     DeferredWrapper&amp; deferredWrapper() { return m_wrapper; }
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    DeferredWrapper m_wrapper;
</del><ins>+    Ref&lt;DeferredWrapper&gt; m_wrapper;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> template&lt;class ResolveResultType&gt;
</span><span class="cx"> inline void DeferredWrapper::resolveWithValue(ResolveResultType&amp;&amp; result)
</span><span class="cx"> {
</span><del>-    ASSERT(m_deferred);
</del><ins>+    if (isSuspended())
+        return;
</ins><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><span class="lines">@@ -185,6 +205,8 @@
</span><span class="cx"> template&lt;class ResolveResultType&gt;
</span><span class="cx"> inline void DeferredWrapper::resolveWithNewlyCreated(Ref&lt;ResolveResultType&gt;&amp;&amp; result)
</span><span class="cx"> {
</span><ins>+    if (isSuspended())
+        return;
</ins><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="lines">@@ -195,6 +217,8 @@
</span><span class="cx"> template&lt;class RejectResultType&gt;
</span><span class="cx"> inline void DeferredWrapper::rejectWithValue(RejectResultType&amp;&amp; result)
</span><span class="cx"> {
</span><ins>+    if (isSuspended())
+        return;
</ins><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="lines">@@ -205,6 +229,8 @@
</span><span class="cx"> template&lt;&gt;
</span><span class="cx"> inline void DeferredWrapper::resolve(bool result)
</span><span class="cx"> {
</span><ins>+    if (isSuspended())
+        return;
</ins><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="lines">@@ -215,6 +241,8 @@
</span><span class="cx"> template&lt;&gt;
</span><span class="cx"> inline void DeferredWrapper::resolve(JSC::JSValue value)
</span><span class="cx"> {
</span><ins>+    if (isSuspended())
+        return;
</ins><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="lines">@@ -225,6 +253,8 @@
</span><span class="cx"> template&lt;&gt;
</span><span class="cx"> inline void DeferredWrapper::reject(JSC::JSValue value)
</span><span class="cx"> {
</span><ins>+    if (isSuspended())
+        return;
</ins><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="lines">@@ -235,6 +265,8 @@
</span><span class="cx"> template&lt;&gt;
</span><span class="cx"> inline void DeferredWrapper::resolve(std::nullptr_t)
</span><span class="cx"> {
</span><ins>+    if (isSuspended())
+        return;
</ins><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="lines">@@ -245,6 +277,8 @@
</span><span class="cx"> template&lt;&gt;
</span><span class="cx"> inline void DeferredWrapper::reject(std::nullptr_t)
</span><span class="cx"> {
</span><ins>+    if (isSuspended())
+        return;
</ins><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="lines">@@ -255,6 +289,8 @@
</span><span class="cx"> template&lt;&gt;
</span><span class="cx"> inline void DeferredWrapper::resolve(const String&amp; result)
</span><span class="cx"> {
</span><ins>+    if (isSuspended())
+        return;
</ins><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="lines">@@ -265,6 +301,8 @@
</span><span class="cx"> template&lt;&gt;
</span><span class="cx"> inline void DeferredWrapper::reject(const String&amp; result)
</span><span class="cx"> {
</span><ins>+    if (isSuspended())
+        return;
</ins><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></pre></div>
<a id="trunkSourceWebCorebindingsjsJSFontFaceCustomcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSFontFaceCustom.cpp (205256 => 205257)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSFontFaceCustom.cpp        2016-08-31 17:44:22 UTC (rev 205256)
+++ trunk/Source/WebCore/bindings/js/JSFontFaceCustom.cpp        2016-08-31 18:36:46 UTC (rev 205257)
</span><span class="lines">@@ -39,8 +39,8 @@
</span><span class="cx"> {
</span><span class="cx">     if (!m_loaded) {
</span><span class="cx">         if (!wrapped().promise()) {
</span><del>-            DeferredWrapper promise(&amp;state, globalObject(), JSC::JSPromiseDeferred::create(&amp;state, globalObject()));
-            m_loaded.set(state.vm(), this, promise.promise());
</del><ins>+            Ref&lt;DeferredWrapper&gt; promise = DeferredWrapper::create(&amp;state, globalObject(), JSC::JSPromiseDeferred::create(&amp;state, globalObject()));
+            m_loaded.set(state.vm(), this, promise-&gt;promise());
</ins><span class="cx">             wrapped().registerLoaded(WTFMove(promise));
</span><span class="cx">         } else
</span><span class="cx">             m_loaded.set(state.vm(), this, wrapped().promise().value().deferredWrapper().promise());
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSFontFaceSetCustomcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSFontFaceSetCustom.cpp (205256 => 205257)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSFontFaceSetCustom.cpp        2016-08-31 17:44:22 UTC (rev 205256)
+++ trunk/Source/WebCore/bindings/js/JSFontFaceSetCustom.cpp        2016-08-31 18:36:46 UTC (rev 205257)
</span><span class="lines">@@ -34,8 +34,8 @@
</span><span class="cx"> JSC::JSValue JSFontFaceSet::ready(JSC::ExecState&amp; state) const
</span><span class="cx"> {
</span><span class="cx">     if (!m_ready) {
</span><del>-        DeferredWrapper promise(&amp;state, globalObject(), JSC::JSPromiseDeferred::create(&amp;state, globalObject()));
-        m_ready.set(state.vm(), this, promise.promise());
</del><ins>+        Ref&lt;DeferredWrapper&gt; promise = DeferredWrapper::create(&amp;state, globalObject(), JSC::JSPromiseDeferred::create(&amp;state, globalObject()));
+        m_ready.set(state.vm(), this, promise-&gt;promise());
</ins><span class="cx">         wrapped().registerReady(WTFMove(promise));
</span><span class="cx">     }
</span><span class="cx">     return m_ready.get();
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSMediaDevicesCustomcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSMediaDevicesCustom.cpp (205256 => 205257)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSMediaDevicesCustom.cpp        2016-08-31 17:44:22 UTC (rev 205256)
+++ trunk/Source/WebCore/bindings/js/JSMediaDevicesCustom.cpp        2016-08-31 18:36:46 UTC (rev 205257)
</span><span class="lines">@@ -391,7 +391,7 @@
</span><span class="cx">     auto audioConstraints = MediaConstraintsImpl::create(WTFMove(mandatoryAudioConstraints), WTFMove(advancedAudioConstraints), areAudioConstraintsValid);
</span><span class="cx">     auto videoConstraints = MediaConstraintsImpl::create(WTFMove(mandatoryVideoConstraints), WTFMove(advancedVideoConstraints), areVideoConstraintsValid);
</span><span class="cx">     JSC::JSPromiseDeferred* promiseDeferred = JSC::JSPromiseDeferred::create(&amp;state, globalObject());
</span><del>-    wrapped().getUserMedia(WTFMove(audioConstraints), WTFMove(videoConstraints), DeferredWrapper(&amp;state, globalObject(), promiseDeferred), ec);
</del><ins>+    wrapped().getUserMedia(WTFMove(audioConstraints), WTFMove(videoConstraints), DeferredWrapper::create(&amp;state, globalObject(), promiseDeferred), ec);
</ins><span class="cx">     setDOMException(&amp;state, ec);
</span><span class="cx">     return promiseDeferred-&gt;promise();
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSReadableStreamSourceCustomcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSReadableStreamSourceCustom.cpp (205256 => 205257)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSReadableStreamSourceCustom.cpp        2016-08-31 17:44:22 UTC (rev 205256)
+++ trunk/Source/WebCore/bindings/js/JSReadableStreamSourceCustom.cpp        2016-08-31 18:36:46 UTC (rev 205257)
</span><span class="lines">@@ -44,7 +44,7 @@
</span><span class="cx">     m_controller.set(state.vm(), jsSource, state.argument(0));
</span><span class="cx"> 
</span><span class="cx">     JSC::JSPromiseDeferred* promiseDeferred = JSC::JSPromiseDeferred::create(&amp;state, globalObject());
</span><del>-    wrapped().start(ReadableStreamDefaultController(controller), DeferredWrapper(&amp;state, globalObject(), promiseDeferred));
</del><ins>+    wrapped().start(ReadableStreamDefaultController(controller), DeferredWrapper::create(&amp;state, globalObject(), promiseDeferred));
</ins><span class="cx">     return promiseDeferred-&gt;promise();
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSWebKitSubtleCryptoCustomcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSWebKitSubtleCryptoCustom.cpp (205256 => 205257)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSWebKitSubtleCryptoCustom.cpp        2016-08-31 17:44:22 UTC (rev 205256)
+++ trunk/Source/WebCore/bindings/js/JSWebKitSubtleCryptoCustom.cpp        2016-08-31 18:36:46 UTC (rev 205257)
</span><span class="lines">@@ -174,12 +174,12 @@
</span><span class="cx"> 
</span><span class="cx">     
</span><span class="cx">     JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(&amp;state, globalObject());
</span><del>-    DeferredWrapper wrapper(&amp;state, globalObject(), promiseDeferred);
</del><ins>+    RefPtr&lt;DeferredWrapper&gt; wrapper = DeferredWrapper::create(&amp;state, globalObject(), promiseDeferred);
</ins><span class="cx">     auto successCallback = [wrapper](const Vector&lt;uint8_t&gt;&amp; result) mutable {
</span><del>-        fulfillPromiseWithArrayBuffer(wrapper, result.data(), result.size());
</del><ins>+        fulfillPromiseWithArrayBuffer(wrapper.releaseNonNull(), result.data(), result.size());
</ins><span class="cx">     };
</span><span class="cx">     auto failureCallback = [wrapper]() mutable {
</span><del>-        wrapper.reject(nullptr);
</del><ins>+        wrapper-&gt;reject(nullptr);
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     ExceptionCode ec = 0;
</span><span class="lines">@@ -229,12 +229,12 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(&amp;state, globalObject());
</span><del>-    DeferredWrapper wrapper(&amp;state, globalObject(), promiseDeferred);
</del><ins>+    RefPtr&lt;DeferredWrapper&gt; wrapper = DeferredWrapper::create(&amp;state, globalObject(), promiseDeferred);
</ins><span class="cx">     auto successCallback = [wrapper](const Vector&lt;uint8_t&gt;&amp; result) mutable {
</span><del>-        fulfillPromiseWithArrayBuffer(wrapper, result.data(), result.size());
</del><ins>+        fulfillPromiseWithArrayBuffer(wrapper.releaseNonNull(), result.data(), result.size());
</ins><span class="cx">     };
</span><span class="cx">     auto failureCallback = [wrapper]() mutable {
</span><del>-        wrapper.reject(nullptr);
</del><ins>+        wrapper-&gt;reject(nullptr);
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     ExceptionCode ec = 0;
</span><span class="lines">@@ -284,12 +284,12 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(&amp;state, globalObject());
</span><del>-    DeferredWrapper wrapper(&amp;state, globalObject(), promiseDeferred);
</del><ins>+    RefPtr&lt;DeferredWrapper&gt; wrapper = DeferredWrapper::create(&amp;state, globalObject(), promiseDeferred);
</ins><span class="cx">     auto successCallback = [wrapper](const Vector&lt;uint8_t&gt;&amp; result) mutable {
</span><del>-        fulfillPromiseWithArrayBuffer(wrapper, result.data(), result.size());
</del><ins>+        fulfillPromiseWithArrayBuffer(wrapper.releaseNonNull(), result.data(), result.size());
</ins><span class="cx">     };
</span><span class="cx">     auto failureCallback = [wrapper]() mutable {
</span><del>-        wrapper.reject(nullptr);
</del><ins>+        wrapper-&gt;reject(nullptr);
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     ExceptionCode ec = 0;
</span><span class="lines">@@ -345,12 +345,12 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(&amp;state, globalObject());
</span><del>-    DeferredWrapper wrapper(&amp;state, globalObject(), promiseDeferred);
</del><ins>+    RefPtr&lt;DeferredWrapper&gt; wrapper = DeferredWrapper::create(&amp;state, globalObject(), promiseDeferred);
</ins><span class="cx">     auto successCallback = [wrapper](bool result) mutable {
</span><del>-        wrapper.resolve(result);
</del><ins>+        wrapper-&gt;resolve(result);
</ins><span class="cx">     };
</span><span class="cx">     auto failureCallback = [wrapper]() mutable {
</span><del>-        wrapper.reject(nullptr);
</del><ins>+        wrapper-&gt;reject(nullptr);
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     ExceptionCode ec = 0;
</span><span class="lines">@@ -390,12 +390,12 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(&amp;state, globalObject());
</span><del>-    DeferredWrapper wrapper(&amp;state, globalObject(), promiseDeferred);
</del><ins>+    RefPtr&lt;DeferredWrapper&gt; wrapper = DeferredWrapper::create(&amp;state, globalObject(), promiseDeferred);
</ins><span class="cx">     auto successCallback = [wrapper](const Vector&lt;uint8_t&gt;&amp; result) mutable {
</span><del>-        fulfillPromiseWithArrayBuffer(wrapper, result.data(), result.size());
</del><ins>+        fulfillPromiseWithArrayBuffer(wrapper.releaseNonNull(), result.data(), result.size());
</ins><span class="cx">     };
</span><span class="cx">     auto failureCallback = [wrapper]() mutable {
</span><del>-        wrapper.reject(nullptr);
</del><ins>+        wrapper-&gt;reject(nullptr);
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     ExceptionCode ec = 0;
</span><span class="lines">@@ -444,17 +444,17 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(&amp;state, globalObject());
</span><del>-    DeferredWrapper wrapper(&amp;state, globalObject(), promiseDeferred);
</del><ins>+    RefPtr&lt;DeferredWrapper&gt; wrapper = DeferredWrapper::create(&amp;state, globalObject(), promiseDeferred);
</ins><span class="cx">     auto successCallback = [wrapper](CryptoKey* key, CryptoKeyPair* keyPair) mutable {
</span><span class="cx">         ASSERT(key || keyPair);
</span><span class="cx">         ASSERT(!key || !keyPair);
</span><span class="cx">         if (key)
</span><del>-            wrapper.resolve(key);
</del><ins>+            wrapper-&gt;resolve(key);
</ins><span class="cx">         else
</span><del>-            wrapper.resolve(keyPair);
</del><ins>+            wrapper-&gt;resolve(keyPair);
</ins><span class="cx">     };
</span><span class="cx">     auto failureCallback = [wrapper]() mutable {
</span><del>-        wrapper.reject(nullptr);
</del><ins>+        wrapper-&gt;reject(nullptr);
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     ExceptionCode ec = 0;
</span><span class="lines">@@ -581,12 +581,12 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(&amp;state, globalObject());
</span><del>-    DeferredWrapper wrapper(&amp;state, globalObject(), promiseDeferred);
</del><ins>+    RefPtr&lt;DeferredWrapper&gt; wrapper = DeferredWrapper::create(&amp;state, globalObject(), promiseDeferred);
</ins><span class="cx">     auto successCallback = [wrapper](CryptoKey&amp; result) mutable {
</span><del>-        wrapper.resolve(result);
</del><ins>+        wrapper-&gt;resolve(result);
</ins><span class="cx">     };
</span><span class="cx">     auto failureCallback = [wrapper]() mutable {
</span><del>-        wrapper.reject(nullptr);
</del><ins>+        wrapper-&gt;reject(nullptr);
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     WebCore::importKey(state, keyFormat, data, WTFMove(algorithm), WTFMove(parameters), extractable, keyUsages, WTFMove(successCallback), WTFMove(failureCallback));
</span><span class="lines">@@ -650,12 +650,12 @@
</span><span class="cx">         return throwTypeError(&amp;state, scope);
</span><span class="cx"> 
</span><span class="cx">     JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(&amp;state, globalObject());
</span><del>-    DeferredWrapper wrapper(&amp;state, globalObject(), promiseDeferred);
</del><ins>+    RefPtr&lt;DeferredWrapper&gt; wrapper = DeferredWrapper::create(&amp;state, globalObject(), promiseDeferred);
</ins><span class="cx">     auto successCallback = [wrapper](const Vector&lt;uint8_t&gt;&amp; result) mutable {
</span><del>-        fulfillPromiseWithArrayBuffer(wrapper, result.data(), result.size());
</del><ins>+        fulfillPromiseWithArrayBuffer(wrapper.releaseNonNull(), result.data(), result.size());
</ins><span class="cx">     };
</span><span class="cx">     auto failureCallback = [wrapper]() mutable {
</span><del>-        wrapper.reject(nullptr);
</del><ins>+        wrapper-&gt;reject(nullptr);
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     WebCore::exportKey(state, keyFormat, *key, WTFMove(successCallback), WTFMove(failureCallback));
</span><span class="lines">@@ -706,25 +706,25 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(&amp;state, globalObject());
</span><del>-    DeferredWrapper wrapper(&amp;state, globalObject(), promiseDeferred);
</del><ins>+    RefPtr&lt;DeferredWrapper&gt; wrapper = DeferredWrapper::create(&amp;state, globalObject(), promiseDeferred);
</ins><span class="cx"> 
</span><span class="cx">     auto exportSuccessCallback = [keyFormat, algorithm, parameters, wrappingKey, wrapper](const Vector&lt;uint8_t&gt;&amp; exportedKeyData) mutable {
</span><span class="cx">         auto encryptSuccessCallback = [wrapper](const Vector&lt;uint8_t&gt;&amp; encryptedData) mutable {
</span><del>-            fulfillPromiseWithArrayBuffer(wrapper, encryptedData.data(), encryptedData.size());
</del><ins>+            fulfillPromiseWithArrayBuffer(wrapper.releaseNonNull(), encryptedData.data(), encryptedData.size());
</ins><span class="cx">         };
</span><span class="cx">         auto encryptFailureCallback = [wrapper]() mutable {
</span><del>-            wrapper.reject(nullptr);
</del><ins>+            wrapper-&gt;reject(nullptr);
</ins><span class="cx">         };
</span><span class="cx">         ExceptionCode ec = 0;
</span><span class="cx">         algorithm-&gt;encryptForWrapKey(*parameters, *wrappingKey, std::make_pair(exportedKeyData.data(), exportedKeyData.size()), WTFMove(encryptSuccessCallback), WTFMove(encryptFailureCallback), ec);
</span><span class="cx">         if (ec) {
</span><span class="cx">             // FIXME: Report failure details to console, and possibly to calling script once there is a standardized way to pass errors to WebCrypto promise reject functions.
</span><del>-            wrapper.reject(nullptr);
</del><ins>+            wrapper-&gt;reject(nullptr);
</ins><span class="cx">         }
</span><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     auto exportFailureCallback = [wrapper]() mutable {
</span><del>-        wrapper.reject(nullptr);
</del><ins>+        wrapper-&gt;reject(nullptr);
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     ExceptionCode ec = 0;
</span><span class="lines">@@ -809,15 +809,15 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(&amp;state, globalObject());
</span><del>-    DeferredWrapper wrapper(&amp;state, globalObject(), promiseDeferred);
</del><ins>+    RefPtr&lt;DeferredWrapper&gt; wrapper = DeferredWrapper::create(&amp;state, globalObject(), promiseDeferred);
</ins><span class="cx">     Strong&lt;JSDOMGlobalObject&gt; domGlobalObject(state.vm(), globalObject());
</span><span class="cx"> 
</span><span class="cx">     auto decryptSuccessCallback = [domGlobalObject, keyFormat, unwrappedKeyAlgorithm, unwrappedKeyAlgorithmParameters, 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(key);
</del><ins>+            wrapper-&gt;resolve(key);
</ins><span class="cx">         };
</span><span class="cx">         auto importFailureCallback = [wrapper]() mutable {
</span><del>-            wrapper.reject(nullptr);
</del><ins>+            wrapper-&gt;reject(nullptr);
</ins><span class="cx">         };
</span><span class="cx">         ExecState&amp; state = *domGlobalObject-&gt;globalExec();
</span><span class="cx">         WebCore::importKey(state, keyFormat, std::make_pair(result.data(), result.size()), unwrappedKeyAlgorithm, unwrappedKeyAlgorithmParameters, extractable, keyUsages, WTFMove(importSuccessCallback), WTFMove(importFailureCallback));
</span><span class="lines">@@ -824,12 +824,12 @@
</span><span class="cx">         if (state.hadException()) {
</span><span class="cx">             // FIXME: Report exception details to console, and possibly to calling script once there is a standardized way to pass errors to WebCrypto promise reject functions.
</span><span class="cx">             state.clearException();
</span><del>-            wrapper.reject(nullptr);
</del><ins>+            wrapper-&gt;reject(nullptr);
</ins><span class="cx">         }
</span><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     auto decryptFailureCallback = [wrapper]() mutable {
</span><del>-        wrapper.reject(nullptr);
</del><ins>+        wrapper-&gt;reject(nullptr);
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     ExceptionCode ec = 0;
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsscriptsCodeGeneratorJSpm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm (205256 => 205257)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm        2016-08-31 17:44:22 UTC (rev 205256)
+++ trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm        2016-08-31 18:36:46 UTC (rev 205257)
</span><span class="lines">@@ -4114,9 +4114,9 @@
</span><span class="cx"> 
</span><span class="cx">     if (IsReturningPromise($function)) {
</span><span class="cx">         if ($function-&gt;isStatic) {
</span><del>-            push(@arguments, &quot;DeferredWrapper(state, jsCast&lt;JSDOMGlobalObject*&gt;(state-&gt;lexicalGlobalObject()), promiseDeferred)&quot;);
</del><ins>+            push(@arguments, &quot;DeferredWrapper::create(state, jsCast&lt;JSDOMGlobalObject*&gt;(state-&gt;lexicalGlobalObject()), promiseDeferred)&quot;);
</ins><span class="cx">         } else {
</span><del>-            push(@arguments, &quot;DeferredWrapper(state, castedThis-&gt;globalObject(), promiseDeferred)&quot;);
</del><ins>+            push(@arguments, &quot;DeferredWrapper::create(state, castedThis-&gt;globalObject(), promiseDeferred)&quot;);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx">     push(@arguments, &quot;ec&quot;) if $function-&gt;signature-&gt;extendedAttributes-&gt;{&quot;RaisesException&quot;} || $function-&gt;signature-&gt;extendedAttributes-&gt;{&quot;RaisesExceptionWithMessage&quot;};
</span></span></pre></div>
<a id="trunkSourceWebKit2CMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/CMakeLists.txt (205256 => 205257)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/CMakeLists.txt        2016-08-31 17:44:22 UTC (rev 205256)
+++ trunk/Source/WebKit2/CMakeLists.txt        2016-08-31 18:36:46 UTC (rev 205257)
</span><span class="lines">@@ -88,6 +88,7 @@
</span><span class="cx">     &quot;${WEBCORE_DIR}/Modules/vibration&quot;
</span><span class="cx">     &quot;${WEBCORE_DIR}/Modules/webdatabase&quot;
</span><span class="cx">     &quot;${WEBCORE_DIR}/accessibility&quot;
</span><ins>+    &quot;${WEBCORE_DIR}/bindings/generic&quot;
</ins><span class="cx">     &quot;${WEBCORE_DIR}/bindings/js&quot;
</span><span class="cx">     &quot;${WEBCORE_DIR}/bindings&quot;
</span><span class="cx">     &quot;${WEBCORE_DIR}/bridge&quot;
</span></span></pre>
</div>
</div>

</body>
</html>