<!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>[185404] trunk/Source/WebCore</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/185404">185404</a></dd>
<dt>Author</dt> <dd>youenn.fablet@crf.canon.fr</dd>
<dt>Date</dt> <dd>2015-06-09 23:26:57 -0700 (Tue, 09 Jun 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>DeferredWrapper should clear its JS strong references once its promise is resolved/rejected
https://bugs.webkit.org/show_bug.cgi?id=145753

Reviewed by Darin Adler.

Clear strong references at the end of DeferredWrapper::resolve and DeferredWrapper::reject.
Added assertions to check that resolve or reject is called only once.

Removed DeferredWrapper constructor that creates internally its promise.
Reason is DeferredWrapper can be resolved synchronously and promise
will be lost when returning it at the end of the binding promise function.
Updated all custom bindings accordingly.

Covered by existing tests.

* bindings/js/JSAudioContextCustom.cpp:
(WebCore::JSAudioContext::suspend): Updated DeferredWrapper constructor to properly return the promise.
(WebCore::JSAudioContext::resume): Ditto.
(WebCore::JSAudioContext::close): Ditto.
* bindings/js/JSDOMPromise.cpp:
(WebCore::DeferredWrapper::resolve): Cleared strong references after promise resolution.
(WebCore::DeferredWrapper::reject): Cleared strong references after promise rejection.
* bindings/js/JSDOMPromise.h:
(WebCore::DeferredWrapper::resolve): Added ASSERT to check promise is not yet rejected/resolved.
(WebCore::DeferredWrapper::reject): Ditto.
(WebCore::DeferredWrapper::reject&lt;ExceptionCode&gt;): Ditto.
(WebCore::DeferredWrapper::resolve&lt;String&gt;): Ditto.
(WebCore::DeferredWrapper::resolve&lt;bool&gt;): Ditto.
(WebCore::DeferredWrapper::resolve&lt;JSC::JSValue&gt;): Ditto.
(WebCore::char&gt;&gt;):
(WebCore::DeferredWrapper::reject&lt;String&gt;): Ditto.
* bindings/js/JSMediaDevicesCustom.cpp:
(WebCore::JSMediaDevices::getUserMedia): Updated DeferredWrapper constructor to properly return the promise.
* bindings/js/JSReadableStreamReaderCustom.cpp:
(WebCore::JSReadableStreamReader::read): Ditto.
(WebCore::JSReadableStreamReader::closed): Ditto.
* bindings/js/JSSubtleCryptoCustom.cpp:
(WebCore::JSSubtleCrypto::encrypt): Ditto.
(WebCore::JSSubtleCrypto::decrypt): Ditto.
(WebCore::JSSubtleCrypto::sign): Ditto.
(WebCore::JSSubtleCrypto::verify): Ditto.
(WebCore::JSSubtleCrypto::digest): Ditto.
(WebCore::JSSubtleCrypto::generateKey): Ditto.
(WebCore::JSSubtleCrypto::importKey): Ditto.
(WebCore::JSSubtleCrypto::exportKey): Ditto.
(WebCore::JSSubtleCrypto::wrapKey): Ditto.
(WebCore::JSSubtleCrypto::unwrapKey): Ditto.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSAudioContextCustomcpp">trunk/Source/WebCore/bindings/js/JSAudioContextCustom.cpp</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="#trunkSourceWebCorebindingsjsJSMediaDevicesCustomcpp">trunk/Source/WebCore/bindings/js/JSMediaDevicesCustom.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSReadableStreamReaderCustomcpp">trunk/Source/WebCore/bindings/js/JSReadableStreamReaderCustom.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSSubtleCryptoCustomcpp">trunk/Source/WebCore/bindings/js/JSSubtleCryptoCustom.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (185403 => 185404)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-06-10 05:59:54 UTC (rev 185403)
+++ trunk/Source/WebCore/ChangeLog        2015-06-10 06:26:57 UTC (rev 185404)
</span><span class="lines">@@ -1,3 +1,53 @@
</span><ins>+2015-06-09  Youenn Fablet  &lt;youenn.fablet@crf.canon.fr&gt;
+
+        DeferredWrapper should clear its JS strong references once its promise is resolved/rejected
+        https://bugs.webkit.org/show_bug.cgi?id=145753
+
+        Reviewed by Darin Adler.
+
+        Clear strong references at the end of DeferredWrapper::resolve and DeferredWrapper::reject.
+        Added assertions to check that resolve or reject is called only once.
+
+        Removed DeferredWrapper constructor that creates internally its promise.
+        Reason is DeferredWrapper can be resolved synchronously and promise
+        will be lost when returning it at the end of the binding promise function.
+        Updated all custom bindings accordingly.
+
+        Covered by existing tests.
+
+        * bindings/js/JSAudioContextCustom.cpp:
+        (WebCore::JSAudioContext::suspend): Updated DeferredWrapper constructor to properly return the promise.
+        (WebCore::JSAudioContext::resume): Ditto.
+        (WebCore::JSAudioContext::close): Ditto.
+        * bindings/js/JSDOMPromise.cpp:
+        (WebCore::DeferredWrapper::resolve): Cleared strong references after promise resolution.
+        (WebCore::DeferredWrapper::reject): Cleared strong references after promise rejection.
+        * bindings/js/JSDOMPromise.h:
+        (WebCore::DeferredWrapper::resolve): Added ASSERT to check promise is not yet rejected/resolved.
+        (WebCore::DeferredWrapper::reject): Ditto.
+        (WebCore::DeferredWrapper::reject&lt;ExceptionCode&gt;): Ditto.
+        (WebCore::DeferredWrapper::resolve&lt;String&gt;): Ditto.
+        (WebCore::DeferredWrapper::resolve&lt;bool&gt;): Ditto.
+        (WebCore::DeferredWrapper::resolve&lt;JSC::JSValue&gt;): Ditto.
+        (WebCore::char&gt;&gt;):
+        (WebCore::DeferredWrapper::reject&lt;String&gt;): Ditto.
+        * bindings/js/JSMediaDevicesCustom.cpp:
+        (WebCore::JSMediaDevices::getUserMedia): Updated DeferredWrapper constructor to properly return the promise.
+        * bindings/js/JSReadableStreamReaderCustom.cpp:
+        (WebCore::JSReadableStreamReader::read): Ditto.
+        (WebCore::JSReadableStreamReader::closed): Ditto.
+        * bindings/js/JSSubtleCryptoCustom.cpp:
+        (WebCore::JSSubtleCrypto::encrypt): Ditto.
+        (WebCore::JSSubtleCrypto::decrypt): Ditto.
+        (WebCore::JSSubtleCrypto::sign): Ditto.
+        (WebCore::JSSubtleCrypto::verify): Ditto.
+        (WebCore::JSSubtleCrypto::digest): Ditto.
+        (WebCore::JSSubtleCrypto::generateKey): Ditto.
+        (WebCore::JSSubtleCrypto::importKey): Ditto.
+        (WebCore::JSSubtleCrypto::exportKey): Ditto.
+        (WebCore::JSSubtleCrypto::wrapKey): Ditto.
+        (WebCore::JSSubtleCrypto::unwrapKey): Ditto.
+
</ins><span class="cx"> 2015-06-09  Zalan Bujtas  &lt;zalan@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Protect FrameView from being destroyed in Document::recalcStyle()
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSAudioContextCustomcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSAudioContextCustom.cpp (185403 => 185404)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSAudioContextCustom.cpp        2015-06-10 05:59:54 UTC (rev 185403)
+++ trunk/Source/WebCore/bindings/js/JSAudioContextCustom.cpp        2015-06-10 06:26:57 UTC (rev 185404)
</span><span class="lines">@@ -113,7 +113,8 @@
</span><span class="cx"> 
</span><span class="cx"> JSValue JSAudioContext::suspend(ExecState* exec)
</span><span class="cx"> {
</span><del>-    DeferredWrapper wrapper(exec, globalObject());
</del><ins>+    JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(exec, globalObject());
+    DeferredWrapper wrapper(exec, globalObject(), promiseDeferred);
</ins><span class="cx">     auto successCallback = [wrapper]() mutable {
</span><span class="cx">         wrapper.resolve(nullptr);
</span><span class="cx">     };
</span><span class="lines">@@ -123,12 +124,13 @@
</span><span class="cx"> 
</span><span class="cx">     impl().suspendContext(WTF::move(successCallback), WTF::move(failureCallback));
</span><span class="cx"> 
</span><del>-    return wrapper.promise();
</del><ins>+    return promiseDeferred-&gt;promise();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> JSValue JSAudioContext::resume(ExecState* exec)
</span><span class="cx"> {
</span><del>-    DeferredWrapper wrapper(exec, globalObject());
</del><ins>+    JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(exec, globalObject());
+    DeferredWrapper wrapper(exec, globalObject(), promiseDeferred);
</ins><span class="cx">     auto successCallback = [wrapper]() mutable {
</span><span class="cx">         wrapper.resolve(nullptr);
</span><span class="cx">     };
</span><span class="lines">@@ -138,12 +140,13 @@
</span><span class="cx"> 
</span><span class="cx">     impl().resumeContext(WTF::move(successCallback), WTF::move(failureCallback));
</span><span class="cx"> 
</span><del>-    return wrapper.promise();
</del><ins>+    return promiseDeferred-&gt;promise();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> JSValue JSAudioContext::close(ExecState* exec)
</span><span class="cx"> {
</span><del>-    DeferredWrapper wrapper(exec, globalObject());
</del><ins>+    JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(exec, globalObject());
+    DeferredWrapper wrapper(exec, globalObject(), promiseDeferred);
</ins><span class="cx">     auto successCallback = [wrapper]() mutable {
</span><span class="cx">         wrapper.resolve(nullptr);
</span><span class="cx">     };
</span><span class="lines">@@ -153,7 +156,7 @@
</span><span class="cx"> 
</span><span class="cx">     impl().closeContext(WTF::move(successCallback), WTF::move(failureCallback));
</span><span class="cx"> 
</span><del>-    return wrapper.promise();
</del><ins>+    return promiseDeferred-&gt;promise();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSDOMPromisecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSDOMPromise.cpp (185403 => 185404)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSDOMPromise.cpp        2015-06-10 05:59:54 UTC (rev 185403)
+++ trunk/Source/WebCore/bindings/js/JSDOMPromise.cpp        2015-06-10 06:26:57 UTC (rev 185404)
</span><span class="lines">@@ -32,12 +32,6 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-DeferredWrapper::DeferredWrapper(ExecState* exec, JSDOMGlobalObject* globalObject)
-    : m_globalObject(exec-&gt;vm(), globalObject)
-    , m_deferred(exec-&gt;vm(), JSPromiseDeferred::create(exec, globalObject))
-{
-}
-
</del><span class="cx"> DeferredWrapper::DeferredWrapper(ExecState* exec, JSDOMGlobalObject* globalObject, JSPromiseDeferred* promiseDeferred)
</span><span class="cx">     : m_globalObject(exec-&gt;vm(), globalObject)
</span><span class="cx">     , m_deferred(exec-&gt;vm(), promiseDeferred)
</span><span class="lines">@@ -46,6 +40,8 @@
</span><span class="cx"> 
</span><span class="cx"> JSObject* DeferredWrapper::promise() const
</span><span class="cx"> {
</span><ins>+    // FIXME: Remove this accessor once ReadableStreamReader custom binding does not need it.
+    ASSERT(m_deferred);
</ins><span class="cx">     return m_deferred-&gt;promise();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -61,6 +57,9 @@
</span><span class="cx">     arguments.append(resolution);
</span><span class="cx"> 
</span><span class="cx">     call(exec, deferredResolve, resolveCallType, resolveCallData, jsUndefined(), arguments);
</span><ins>+
+    m_globalObject.clear();
+    m_deferred.clear();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void DeferredWrapper::reject(ExecState* exec, JSValue reason)
</span><span class="lines">@@ -75,6 +74,9 @@
</span><span class="cx">     arguments.append(reason);
</span><span class="cx"> 
</span><span class="cx">     call(exec, deferredReject, rejectCallType, rejectCallData, jsUndefined(), arguments);
</span><ins>+
+    m_globalObject.clear();
+    m_deferred.clear();
</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 (185403 => 185404)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSDOMPromise.h        2015-06-10 05:59:54 UTC (rev 185403)
+++ trunk/Source/WebCore/bindings/js/JSDOMPromise.h        2015-06-10 06:26:57 UTC (rev 185404)
</span><span class="lines">@@ -38,7 +38,6 @@
</span><span class="cx"> 
</span><span class="cx"> class DeferredWrapper {
</span><span class="cx"> public:
</span><del>-    DeferredWrapper(JSC::ExecState*, JSDOMGlobalObject*);
</del><span class="cx">     DeferredWrapper(JSC::ExecState*, JSDOMGlobalObject*, JSC::JSPromiseDeferred*);
</span><span class="cx"> 
</span><span class="cx">     template&lt;class ResolveResultType&gt;
</span><span class="lines">@@ -60,6 +59,8 @@
</span><span class="cx"> template&lt;class ResolveResultType&gt;
</span><span class="cx"> inline void DeferredWrapper::resolve(const ResolveResultType&amp; result)
</span><span class="cx"> {
</span><ins>+    ASSERT(m_deferred);
+    ASSERT(m_globalObject);
</ins><span class="cx">     JSC::ExecState* exec = m_globalObject-&gt;globalExec();
</span><span class="cx">     JSC::JSLockHolder locker(exec);
</span><span class="cx">     resolve(exec, toJS(exec, m_globalObject.get(), result));
</span><span class="lines">@@ -68,6 +69,8 @@
</span><span class="cx"> template&lt;class RejectResultType&gt;
</span><span class="cx"> inline void DeferredWrapper::reject(const RejectResultType&amp; result)
</span><span class="cx"> {
</span><ins>+    ASSERT(m_deferred);
+    ASSERT(m_globalObject);
</ins><span class="cx">     JSC::ExecState* exec = m_globalObject-&gt;globalExec();
</span><span class="cx">     JSC::JSLockHolder locker(exec);
</span><span class="cx">     reject(exec, toJS(exec, m_globalObject.get(), result));
</span><span class="lines">@@ -76,6 +79,8 @@
</span><span class="cx"> template&lt;&gt;
</span><span class="cx"> inline void DeferredWrapper::reject(const std::nullptr_t&amp;)
</span><span class="cx"> {
</span><ins>+    ASSERT(m_deferred);
+    ASSERT(m_globalObject);
</ins><span class="cx">     JSC::ExecState* exec = m_globalObject-&gt;globalExec();
</span><span class="cx">     JSC::JSLockHolder locker(exec);
</span><span class="cx">     reject(exec, JSC::jsNull());
</span><span class="lines">@@ -84,6 +89,8 @@
</span><span class="cx"> template&lt;&gt;
</span><span class="cx"> inline void DeferredWrapper::reject(const JSC::JSValue&amp; value)
</span><span class="cx"> {
</span><ins>+    ASSERT(m_deferred);
+    ASSERT(m_globalObject);
</ins><span class="cx">     JSC::ExecState* exec = m_globalObject-&gt;globalExec();
</span><span class="cx">     JSC::JSLockHolder locker(exec);
</span><span class="cx">     reject(exec, value);
</span><span class="lines">@@ -92,6 +99,8 @@
</span><span class="cx"> template&lt;&gt;
</span><span class="cx"> inline void DeferredWrapper::reject&lt;ExceptionCode&gt;(const ExceptionCode&amp; ec)
</span><span class="cx"> {
</span><ins>+    ASSERT(m_deferred);
+    ASSERT(m_globalObject);
</ins><span class="cx">     JSC::ExecState* exec = m_globalObject-&gt;globalExec();
</span><span class="cx">     JSC::JSLockHolder locker(exec);
</span><span class="cx">     reject(exec, createDOMException(exec, ec));
</span><span class="lines">@@ -100,6 +109,8 @@
</span><span class="cx"> template&lt;&gt;
</span><span class="cx"> inline void DeferredWrapper::resolve&lt;String&gt;(const String&amp; result)
</span><span class="cx"> {
</span><ins>+    ASSERT(m_deferred);
+    ASSERT(m_globalObject);
</ins><span class="cx">     JSC::ExecState* exec = m_globalObject-&gt;globalExec();
</span><span class="cx">     JSC::JSLockHolder locker(exec);
</span><span class="cx">     resolve(exec, jsString(exec, result));
</span><span class="lines">@@ -108,6 +119,8 @@
</span><span class="cx"> template&lt;&gt;
</span><span class="cx"> inline void DeferredWrapper::resolve&lt;bool&gt;(const bool&amp; result)
</span><span class="cx"> {
</span><ins>+    ASSERT(m_deferred);
+    ASSERT(m_globalObject);
</ins><span class="cx">     JSC::ExecState* exec = m_globalObject-&gt;globalExec();
</span><span class="cx">     JSC::JSLockHolder locker(exec);
</span><span class="cx">     resolve(exec, JSC::jsBoolean(result));
</span><span class="lines">@@ -116,6 +129,8 @@
</span><span class="cx"> template&lt;&gt;
</span><span class="cx"> inline void DeferredWrapper::resolve&lt;JSC::JSValue&gt;(const JSC::JSValue&amp; value)
</span><span class="cx"> {
</span><ins>+    ASSERT(m_deferred);
+    ASSERT(m_globalObject);
</ins><span class="cx">     JSC::ExecState* exec = m_globalObject-&gt;globalExec();
</span><span class="cx">     JSC::JSLockHolder locker(exec);
</span><span class="cx">     resolve(exec, value);
</span><span class="lines">@@ -123,6 +138,8 @@
</span><span class="cx"> template&lt;&gt;
</span><span class="cx"> inline void DeferredWrapper::resolve&lt;Vector&lt;unsigned char&gt;&gt;(const Vector&lt;unsigned char&gt;&amp; result)
</span><span class="cx"> {
</span><ins>+    ASSERT(m_deferred);
+    ASSERT(m_globalObject);
</ins><span class="cx">     JSC::ExecState* exec = m_globalObject-&gt;globalExec();
</span><span class="cx">     JSC::JSLockHolder locker(exec);
</span><span class="cx">     RefPtr&lt;ArrayBuffer&gt; buffer = ArrayBuffer::create(result.data(), result.size());
</span><span class="lines">@@ -132,6 +149,8 @@
</span><span class="cx"> template&lt;&gt;
</span><span class="cx"> inline void DeferredWrapper::resolve(const std::nullptr_t&amp;)
</span><span class="cx"> {
</span><ins>+    ASSERT(m_deferred);
+    ASSERT(m_globalObject);
</ins><span class="cx">     JSC::ExecState* exec = m_globalObject-&gt;globalExec();
</span><span class="cx">     JSC::JSLockHolder locker(exec);
</span><span class="cx">     resolve(exec, JSC::jsUndefined());
</span><span class="lines">@@ -140,6 +159,8 @@
</span><span class="cx"> template&lt;&gt;
</span><span class="cx"> inline void DeferredWrapper::reject&lt;String&gt;(const String&amp; result)
</span><span class="cx"> {
</span><ins>+    ASSERT(m_deferred);
+    ASSERT(m_globalObject);
</ins><span class="cx">     JSC::ExecState* exec = m_globalObject-&gt;globalExec();
</span><span class="cx">     JSC::JSLockHolder locker(exec);
</span><span class="cx">     reject(exec, jsString(exec, result));
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSMediaDevicesCustomcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSMediaDevicesCustom.cpp (185403 => 185404)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSMediaDevicesCustom.cpp        2015-06-10 05:59:54 UTC (rev 185403)
+++ trunk/Source/WebCore/bindings/js/JSMediaDevicesCustom.cpp        2015-06-10 06:26:57 UTC (rev 185404)
</span><span class="lines">@@ -47,20 +47,21 @@
</span><span class="cx"> 
</span><span class="cx"> JSValue JSMediaDevices::getUserMedia(ExecState* exec)
</span><span class="cx"> {
</span><del>-    DeferredWrapper wrapper(exec, globalObject());
</del><ins>+    JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(exec, globalObject());
+    DeferredWrapper wrapper(exec, globalObject(), promiseDeferred);
</ins><span class="cx"> 
</span><span class="cx">     Dictionary options(exec, exec-&gt;argument(0));
</span><span class="cx">     if (exec-&gt;hadException()) {
</span><span class="cx">         Exception* exception = exec-&gt;exception();
</span><span class="cx">         exec-&gt;clearException();
</span><span class="cx">         wrapper.reject(exception-&gt;value());
</span><del>-        return wrapper.promise();
</del><ins>+        return promiseDeferred-&gt;promise();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (!options.isObject()) {
</span><span class="cx">         JSValue error = createTypeError(exec, &quot;First argument of getUserMedia must be a valid Dictionary&quot;);
</span><span class="cx">         wrapper.reject(error);
</span><del>-        return wrapper.promise();
</del><ins>+        return promiseDeferred-&gt;promise();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     auto resolveCallback = [wrapper](MediaStream&amp; stream) mutable {
</span><span class="lines">@@ -75,7 +76,7 @@
</span><span class="cx">     if (ec)
</span><span class="cx">         wrapper.reject(ec);
</span><span class="cx"> 
</span><del>-    return wrapper.promise();
</del><ins>+    return promiseDeferred-&gt;promise();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSReadableStreamReaderCustomcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSReadableStreamReaderCustom.cpp (185403 => 185404)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSReadableStreamReaderCustom.cpp        2015-06-10 05:59:54 UTC (rev 185403)
+++ trunk/Source/WebCore/bindings/js/JSReadableStreamReaderCustom.cpp        2015-06-10 06:26:57 UTC (rev 185404)
</span><span class="lines">@@ -46,7 +46,9 @@
</span><span class="cx"> 
</span><span class="cx"> JSValue JSReadableStreamReader::read(ExecState* exec)
</span><span class="cx"> {
</span><del>-    DeferredWrapper wrapper(exec, globalObject());
</del><ins>+    JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(exec, globalObject());
+    DeferredWrapper wrapper(exec, globalObject(), promiseDeferred);
+
</ins><span class="cx">     auto successCallback = [wrapper](JSValue value) mutable {
</span><span class="cx">         JSValue result = createIteratorResultObject(wrapper.promise()-&gt;globalObject()-&gt;globalExec(), value, false);
</span><span class="cx">         wrapper.resolve(result);
</span><span class="lines">@@ -61,7 +63,7 @@
</span><span class="cx"> 
</span><span class="cx">     impl().read(WTF::move(successCallback), WTF::move(endCallback), WTF::move(failureCallback));
</span><span class="cx"> 
</span><del>-    return wrapper.promise();
</del><ins>+    return promiseDeferred-&gt;promise();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> JSValue JSReadableStreamReader::closed(ExecState* exec) const
</span><span class="lines">@@ -81,7 +83,7 @@
</span><span class="cx"> 
</span><span class="cx">     impl().closed(WTF::move(successCallback), WTF::move(failureCallback));
</span><span class="cx"> 
</span><del>-    return wrapper.promise();
</del><ins>+    return m_closedPromiseDeferred-&gt;promise();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> JSValue JSReadableStreamReader::cancel(ExecState* exec)
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSSubtleCryptoCustomcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSSubtleCryptoCustom.cpp (185403 => 185404)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSSubtleCryptoCustom.cpp        2015-06-10 05:59:54 UTC (rev 185403)
+++ trunk/Source/WebCore/bindings/js/JSSubtleCryptoCustom.cpp        2015-06-10 06:26:57 UTC (rev 185404)
</span><span class="lines">@@ -162,7 +162,8 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     
</span><del>-    DeferredWrapper wrapper(exec, globalObject());
</del><ins>+    JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(exec, globalObject());
+    DeferredWrapper wrapper(exec, globalObject(), promiseDeferred);
</ins><span class="cx">     auto successCallback = [wrapper](const Vector&lt;uint8_t&gt;&amp; result) mutable {
</span><span class="cx">         wrapper.resolve(result);
</span><span class="cx">     };
</span><span class="lines">@@ -177,7 +178,7 @@
</span><span class="cx">         return jsUndefined();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return wrapper.promise();
</del><ins>+    return promiseDeferred-&gt;promise();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> JSValue JSSubtleCrypto::decrypt(ExecState* exec)
</span><span class="lines">@@ -213,7 +214,8 @@
</span><span class="cx">         return jsUndefined();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    DeferredWrapper wrapper(exec, globalObject());
</del><ins>+    JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(exec, globalObject());
+    DeferredWrapper wrapper(exec, globalObject(), promiseDeferred);
</ins><span class="cx">     auto successCallback = [wrapper](const Vector&lt;uint8_t&gt;&amp; result) mutable {
</span><span class="cx">         wrapper.resolve(result);
</span><span class="cx">     };
</span><span class="lines">@@ -228,7 +230,7 @@
</span><span class="cx">         return jsUndefined();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return wrapper.promise();
</del><ins>+    return promiseDeferred-&gt;promise();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> JSValue JSSubtleCrypto::sign(ExecState* exec)
</span><span class="lines">@@ -264,7 +266,8 @@
</span><span class="cx">         return jsUndefined();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    DeferredWrapper wrapper(exec, globalObject());
</del><ins>+    JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(exec, globalObject());
+    DeferredWrapper wrapper(exec, globalObject(), promiseDeferred);
</ins><span class="cx">     auto successCallback = [wrapper](const Vector&lt;uint8_t&gt;&amp; result) mutable {
</span><span class="cx">         wrapper.resolve(result);
</span><span class="cx">     };
</span><span class="lines">@@ -279,7 +282,7 @@
</span><span class="cx">         return jsUndefined();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return wrapper.promise();
</del><ins>+    return promiseDeferred-&gt;promise();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> JSValue JSSubtleCrypto::verify(ExecState* exec)
</span><span class="lines">@@ -321,7 +324,8 @@
</span><span class="cx">         return jsUndefined();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    DeferredWrapper wrapper(exec, globalObject());
</del><ins>+    JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(exec, globalObject());
+    DeferredWrapper wrapper(exec, globalObject(), promiseDeferred);
</ins><span class="cx">     auto successCallback = [wrapper](bool result) mutable {
</span><span class="cx">         wrapper.resolve(result);
</span><span class="cx">     };
</span><span class="lines">@@ -336,7 +340,7 @@
</span><span class="cx">         return jsUndefined();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return wrapper.promise();
</del><ins>+    return promiseDeferred-&gt;promise();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> JSValue JSSubtleCrypto::digest(ExecState* exec)
</span><span class="lines">@@ -362,7 +366,8 @@
</span><span class="cx">         return jsUndefined();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    DeferredWrapper wrapper(exec, globalObject());
</del><ins>+    JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(exec, globalObject());
+    DeferredWrapper wrapper(exec, globalObject(), promiseDeferred);
</ins><span class="cx">     auto successCallback = [wrapper](const Vector&lt;uint8_t&gt;&amp; result) mutable {
</span><span class="cx">         wrapper.resolve(result);
</span><span class="cx">     };
</span><span class="lines">@@ -377,7 +382,7 @@
</span><span class="cx">         return jsUndefined();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return wrapper.promise();
</del><ins>+    return promiseDeferred-&gt;promise();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> JSValue JSSubtleCrypto::generateKey(ExecState* exec)
</span><span class="lines">@@ -412,7 +417,8 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    DeferredWrapper wrapper(exec, globalObject());
</del><ins>+    JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(exec, globalObject());
+    DeferredWrapper wrapper(exec, 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="lines">@@ -432,7 +438,7 @@
</span><span class="cx">         return jsUndefined();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return wrapper.promise();
</del><ins>+    return promiseDeferred-&gt;promise();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static void importKey(ExecState* exec, CryptoKeyFormat keyFormat, CryptoOperationData data, std::unique_ptr&lt;CryptoAlgorithm&gt; algorithm, std::unique_ptr&lt;CryptoAlgorithmParameters&gt; parameters, bool extractable, CryptoKeyUsage keyUsages, CryptoAlgorithm::KeyCallback callback, CryptoAlgorithm::VoidCallback failureCallback)
</span><span class="lines">@@ -539,7 +545,8 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    DeferredWrapper wrapper(exec, globalObject());
</del><ins>+    JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(exec, globalObject());
+    DeferredWrapper wrapper(exec, globalObject(), promiseDeferred);
</ins><span class="cx">     auto successCallback = [wrapper](CryptoKey&amp; result) mutable {
</span><span class="cx">         wrapper.resolve(&amp;result);
</span><span class="cx">     };
</span><span class="lines">@@ -551,7 +558,7 @@
</span><span class="cx">     if (exec-&gt;hadException())
</span><span class="cx">         return jsUndefined();
</span><span class="cx"> 
</span><del>-    return wrapper.promise();
</del><ins>+    return promiseDeferred-&gt;promise();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static void exportKey(ExecState* exec, CryptoKeyFormat keyFormat, const CryptoKey&amp; key, CryptoAlgorithm::VectorCallback callback, CryptoAlgorithm::VoidCallback failureCallback)
</span><span class="lines">@@ -601,7 +608,8 @@
</span><span class="cx">     if (!key)
</span><span class="cx">         return throwTypeError(exec);
</span><span class="cx"> 
</span><del>-    DeferredWrapper wrapper(exec, globalObject());
</del><ins>+    JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(exec, globalObject());
+    DeferredWrapper wrapper(exec, globalObject(), promiseDeferred);
</ins><span class="cx">     auto successCallback = [wrapper](const Vector&lt;uint8_t&gt;&amp; result) mutable {
</span><span class="cx">         wrapper.resolve(result);
</span><span class="cx">     };
</span><span class="lines">@@ -613,7 +621,7 @@
</span><span class="cx">     if (exec-&gt;hadException())
</span><span class="cx">         return jsUndefined();
</span><span class="cx"> 
</span><del>-    return wrapper.promise();
</del><ins>+    return promiseDeferred-&gt;promise();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> JSValue JSSubtleCrypto::wrapKey(ExecState* exec)
</span><span class="lines">@@ -653,7 +661,8 @@
</span><span class="cx">         return jsUndefined();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    DeferredWrapper wrapper(exec, globalObject());
</del><ins>+    JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(exec, globalObject());
+    DeferredWrapper wrapper(exec, globalObject(), promiseDeferred);
</ins><span class="cx"> 
</span><span class="cx">     CryptoAlgorithm* algorithmPtr = algorithm.release();
</span><span class="cx">     CryptoAlgorithmParameters* parametersPtr = parameters.release();
</span><span class="lines">@@ -692,7 +701,7 @@
</span><span class="cx">         return jsUndefined();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return wrapper.promise();
</del><ins>+    return promiseDeferred-&gt;promise();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> JSValue JSSubtleCrypto::unwrapKey(ExecState* exec)
</span><span class="lines">@@ -765,7 +774,8 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    DeferredWrapper wrapper(exec, globalObject());
</del><ins>+    JSPromiseDeferred* promiseDeferred = JSPromiseDeferred::create(exec, globalObject());
+    DeferredWrapper wrapper(exec, globalObject(), promiseDeferred);
</ins><span class="cx">     Strong&lt;JSDOMGlobalObject&gt; domGlobalObject(exec-&gt;vm(), globalObject());
</span><span class="cx"> 
</span><span class="cx">     CryptoAlgorithm* unwrappedKeyAlgorithmPtr = unwrappedKeyAlgorithm.release();
</span><span class="lines">@@ -802,7 +812,7 @@
</span><span class="cx">         return jsUndefined();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return wrapper.promise();
</del><ins>+    return promiseDeferred-&gt;promise();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre>
</div>
</div>

</body>
</html>