<!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>[161241] trunk</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/161241">161241</a></dd>
<dt>Author</dt> <dd>weinig@apple.com</dd>
<dt>Date</dt> <dd>2014-01-02 16:40:16 -0800 (Thu, 02 Jan 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Update Promises to the https://github.com/domenic/promises-unwrapping spec
https://bugs.webkit.org/show_bug.cgi?id=120954

Reviewed by Filip Pizlo.

Source/JavaScriptCore: 

Update Promises to the revised spec. Notable changes:
- JSPromiseResolver is gone.
- TaskContext has been renamed Microtask and now has a virtual run() function.
- Instead of using custom InternalFunction subclasses, JSFunctions are used
  with PrivateName properties for internal slots.

* CMakeLists.txt:
* DerivedSources.make:
* GNUmakefile.list.am:
* JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
* JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:
* JavaScriptCore.xcodeproj/project.pbxproj:
* interpreter/CallFrame.h:
(JSC::ExecState::promiseConstructorTable):
* runtime/CommonIdentifiers.cpp:
(JSC::CommonIdentifiers::CommonIdentifiers):
* runtime/CommonIdentifiers.h:
* runtime/JSGlobalObject.cpp:
(JSC::JSGlobalObject::reset):
(JSC::JSGlobalObject::visitChildren):
(JSC::JSGlobalObject::queueMicrotask):
* runtime/JSGlobalObject.h:
(JSC::JSGlobalObject::promiseConstructor):
(JSC::JSGlobalObject::promisePrototype):
(JSC::JSGlobalObject::promiseStructure):
* runtime/JSPromise.cpp:
(JSC::JSPromise::create):
(JSC::JSPromise::JSPromise):
(JSC::JSPromise::finishCreation):
(JSC::JSPromise::visitChildren):
(JSC::JSPromise::reject):
(JSC::JSPromise::resolve):
(JSC::JSPromise::appendResolveReaction):
(JSC::JSPromise::appendRejectReaction):
(JSC::triggerPromiseReactions):
* runtime/JSPromise.h:
(JSC::JSPromise::status):
(JSC::JSPromise::result):
(JSC::JSPromise::constructor):
* runtime/JSPromiseCallback.cpp: Removed.
* runtime/JSPromiseCallback.h: Removed.
* runtime/JSPromiseConstructor.cpp:
(JSC::constructPromise):
(JSC::JSPromiseConstructor::getCallData):
(JSC::JSPromiseConstructorFuncCast):
(JSC::JSPromiseConstructorFuncResolve):
(JSC::JSPromiseConstructorFuncReject):
* runtime/JSPromiseConstructor.h:
* runtime/JSPromiseDeferred.cpp: Added.
(JSC::JSPromiseDeferred::create):
(JSC::JSPromiseDeferred::JSPromiseDeferred):
(JSC::JSPromiseDeferred::finishCreation):
(JSC::JSPromiseDeferred::visitChildren):
(JSC::createJSPromiseDeferredFromConstructor):
(JSC::updateDeferredFromPotentialThenable):
* runtime/JSPromiseDeferred.h: Added.
(JSC::JSPromiseDeferred::createStructure):
(JSC::JSPromiseDeferred::promise):
(JSC::JSPromiseDeferred::resolve):
(JSC::JSPromiseDeferred::reject):
* runtime/JSPromiseFunctions.cpp: Added.
(JSC::deferredConstructionFunction):
(JSC::createDeferredConstructionFunction):
(JSC::identifyFunction):
(JSC::createIdentifyFunction):
(JSC::promiseAllCountdownFunction):
(JSC::createPromiseAllCountdownFunction):
(JSC::promiseResolutionHandlerFunction):
(JSC::createPromiseResolutionHandlerFunction):
(JSC::rejectPromiseFunction):
(JSC::createRejectPromiseFunction):
(JSC::resolvePromiseFunction):
(JSC::createResolvePromiseFunction):
(JSC::throwerFunction):
(JSC::createThrowerFunction):
* runtime/JSPromiseFunctions.h: Added.
* runtime/JSPromisePrototype.cpp:
(JSC::JSPromisePrototypeFuncThen):
(JSC::JSPromisePrototypeFuncCatch):
* runtime/JSPromiseReaction.cpp: Added.
(JSC::createExecutePromiseReactionMicroTask):
(JSC::ExecutePromiseReactionMicroTask::run):
(JSC::JSPromiseReaction::create):
(JSC::JSPromiseReaction::JSPromiseReaction):
(JSC::JSPromiseReaction::finishCreation):
(JSC::JSPromiseReaction::visitChildren):
* runtime/JSPromiseReaction.h: Added.
(JSC::JSPromiseReaction::createStructure):
(JSC::JSPromiseReaction::deferred):
(JSC::JSPromiseReaction::handler):
* runtime/JSPromiseResolver.cpp: Removed.
* runtime/JSPromiseResolver.h: Removed.
* runtime/JSPromiseResolverConstructor.cpp: Removed.
* runtime/JSPromiseResolverConstructor.h: Removed.
* runtime/JSPromiseResolverPrototype.cpp: Removed.
* runtime/JSPromiseResolverPrototype.h: Removed.
* runtime/Microtask.h: Added.
* runtime/VM.cpp:
(JSC::VM::VM):
(JSC::VM::~VM):
* runtime/VM.h:

Source/WebCore: 

* ForwardingHeaders/runtime/JSPromiseDeferred.h: Added.
* ForwardingHeaders/runtime/JSPromiseResolver.h: Removed.
* bindings/js/JSDOMGlobalObjectTask.cpp:
(WebCore::JSGlobalObjectTask::JSGlobalObjectTask):
* bindings/js/JSDOMGlobalObjectTask.h:
* bindings/js/JSDOMPromise.cpp:
(WebCore::DeferredWrapper::DeferredWrapper):
(WebCore::DeferredWrapper::promise):
(WebCore::DeferredWrapper::resolve):
(WebCore::DeferredWrapper::reject):
* bindings/js/JSDOMPromise.h:
(WebCore::DeferredWrapper::resolve):
(WebCore::DeferredWrapper::reject):
(WebCore::DeferredWrapper::resolve&lt;String&gt;):
(WebCore::DeferredWrapper::resolve&lt;bool&gt;):
(WebCore::char&gt;&gt;):
(WebCore::DeferredWrapper::reject&lt;String&gt;):
* bindings/js/JSDOMWindowBase.cpp:
(WebCore::JSDOMWindowBase::queueTaskToEventLoop):
* bindings/js/JSDOMWindowBase.h:
* bindings/js/JSSubtleCryptoCustom.cpp:
(WebCore::JSSubtleCrypto::encrypt):
(WebCore::JSSubtleCrypto::decrypt):
(WebCore::JSSubtleCrypto::sign):
(WebCore::JSSubtleCrypto::verify):
(WebCore::JSSubtleCrypto::digest):
(WebCore::JSSubtleCrypto::generateKey):
(WebCore::JSSubtleCrypto::importKey):
(WebCore::JSSubtleCrypto::exportKey):
(WebCore::JSSubtleCrypto::wrapKey):
(WebCore::JSSubtleCrypto::unwrapKey):
* bindings/js/JSWorkerGlobalScopeBase.cpp:
(WebCore::JSWorkerGlobalScopeBase::queueTaskToEventLoop):
* bindings/js/JSWorkerGlobalScopeBase.h:

LayoutTests: 

* crypto/subtle/argument-conversion.html:
* crypto/subtle/resources/common.js:
* crypto/subtle/sha-1.html:
* crypto/subtle/sha-224.html:
* crypto/subtle/sha-256.html:
* crypto/subtle/sha-384.html:
* crypto/subtle/sha-512.html:
* js/dom/Promise-already-fulfilled-expected.txt: Removed.
* js/dom/Promise-already-fulfilled.html: Removed.
* js/dom/Promise-already-rejected.html:
* js/dom/Promise-already-resolved.html:
* js/dom/Promise-catch-expected.txt:
* js/dom/Promise-catch-in-workers-expected.txt:
* js/dom/Promise-catch.html:
* js/dom/Promise-chain.html:
* js/dom/Promise-exception-expected.txt:
* js/dom/Promise-exception.html:
* js/dom/Promise-expected.txt:
* js/dom/Promise-fulfill-expected.txt: Removed.
* js/dom/Promise-fulfill-in-workers-expected.txt: Removed.
* js/dom/Promise-fulfill-in-workers.html: Removed.
* js/dom/Promise-fulfill.html: Removed.
* js/dom/Promise-init-callback-receiver-expected.txt: Added.
* js/dom/Promise-init-callback-receiver.html: Added.
* js/dom/Promise-init-expected.txt:
* js/dom/Promise-init-in-workers-expected.txt:
* js/dom/Promise-init.html:
* js/dom/Promise-onFulfilled-deep-expected.txt: Added.
* js/dom/Promise-onFulfilled-deep.html: Added.
* js/dom/Promise-onRejected-deep-expected.txt: Added.
* js/dom/Promise-onRejected-deep.html: Added.
* js/dom/Promise-reject.html:
* js/dom/Promise-resolve-chain.html:
* js/dom/Promise-resolve-expected.txt:
* js/dom/Promise-resolve-in-workers-expected.txt:
* js/dom/Promise-resolve-state-expected.txt: Added.
* js/dom/Promise-resolve-state-in-workers-expected.txt: Added.
* js/dom/Promise-resolve-state-in-workers.html: Added.
* js/dom/Promise-resolve-state.html: Added.
* js/dom/Promise-resolve-with-itself-expected.txt: Added.
* js/dom/Promise-resolve-with-itself.html: Added.
* js/dom/Promise-resolve-with-then-exception.html:
* js/dom/Promise-resolve-with-then-fulfill-expected.txt:
* js/dom/Promise-resolve-with-then-fulfill.html:
* js/dom/Promise-resolve-with-then-reject-expected.txt:
* js/dom/Promise-resolve-with-then-reject.html:
* js/dom/Promise-resolve.html:
* js/dom/Promise-simple-expected.txt:
* js/dom/Promise-simple-fulfill-expected.txt: Removed.
* js/dom/Promise-simple-fulfill-inside-callback-expected.txt: Removed.
* js/dom/Promise-simple-fulfill-inside-callback.html: Removed.
* js/dom/Promise-simple-fulfill.html: Removed.
* js/dom/Promise-simple-in-workers-expected.txt:
* js/dom/Promise-simple-resolve-expected.txt: Added.
* js/dom/Promise-simple-resolve.html: Added.
* js/dom/Promise-simple.html:
* js/dom/Promise-static-all-expected.txt: Added.
* js/dom/Promise-static-all.html: Added.
* js/dom/Promise-static-cast-expected.txt: Added.
* js/dom/Promise-static-cast.html: Added.
* js/dom/Promise-static-fulfill-expected.txt: Removed.
* js/dom/Promise-static-fulfill.html: Removed.
* js/dom/Promise-static-race-expected.txt: Added.
* js/dom/Promise-static-race.html: Added.
* js/dom/Promise-static-resolve.html:
* js/dom/Promise-then-callback-receiver-expected.txt: Added.
* js/dom/Promise-then-callback-receiver.html: Added.
* js/dom/Promise-then-expected.txt:
* js/dom/Promise-then-in-workers-expected.txt:
* js/dom/Promise-then-without-callbacks.html:
* js/dom/Promise-then.html:
* js/dom/Promise-types-expected.txt:
* js/dom/Promise-types.html:
* js/dom/Promise.html:
* js/resources/Promise-catch-in-workers.js:
* js/resources/Promise-fulfill-in-workers.js: Removed.
* js/resources/Promise-init-in-workers.js:
* js/resources/Promise-reject-in-workers.js:
* js/resources/Promise-resolve-in-workers.js:
* js/resources/Promise-resolve-state-in-workers.js: Added.
* js/resources/Promise-simple-in-workers.js:
* js/resources/Promise-then-in-workers.js:
* js/resources/Promise-then-without-callbacks-in-workers.js:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestscryptosubtleargumentconversionhtml">trunk/LayoutTests/crypto/subtle/argument-conversion.html</a></li>
<li><a href="#trunkLayoutTestscryptosubtleresourcescommonjs">trunk/LayoutTests/crypto/subtle/resources/common.js</a></li>
<li><a href="#trunkLayoutTestscryptosubtlesha1html">trunk/LayoutTests/crypto/subtle/sha-1.html</a></li>
<li><a href="#trunkLayoutTestscryptosubtlesha224html">trunk/LayoutTests/crypto/subtle/sha-224.html</a></li>
<li><a href="#trunkLayoutTestscryptosubtlesha256html">trunk/LayoutTests/crypto/subtle/sha-256.html</a></li>
<li><a href="#trunkLayoutTestscryptosubtlesha384html">trunk/LayoutTests/crypto/subtle/sha-384.html</a></li>
<li><a href="#trunkLayoutTestscryptosubtlesha512html">trunk/LayoutTests/crypto/subtle/sha-512.html</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisealreadyrejectedhtml">trunk/LayoutTests/js/dom/Promise-already-rejected.html</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisealreadyresolvedhtml">trunk/LayoutTests/js/dom/Promise-already-resolved.html</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisecatchexpectedtxt">trunk/LayoutTests/js/dom/Promise-catch-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisecatchinworkersexpectedtxt">trunk/LayoutTests/js/dom/Promise-catch-in-workers-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisecatchhtml">trunk/LayoutTests/js/dom/Promise-catch.html</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisechainhtml">trunk/LayoutTests/js/dom/Promise-chain.html</a></li>
<li><a href="#trunkLayoutTestsjsdomPromiseexceptionexpectedtxt">trunk/LayoutTests/js/dom/Promise-exception-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomPromiseexceptionhtml">trunk/LayoutTests/js/dom/Promise-exception.html</a></li>
<li><a href="#trunkLayoutTestsjsdomPromiseexpectedtxt">trunk/LayoutTests/js/dom/Promise-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomPromiseinitexpectedtxt">trunk/LayoutTests/js/dom/Promise-init-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomPromiseinitinworkersexpectedtxt">trunk/LayoutTests/js/dom/Promise-init-in-workers-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomPromiseinithtml">trunk/LayoutTests/js/dom/Promise-init.html</a></li>
<li><a href="#trunkLayoutTestsjsdomPromiserejecthtml">trunk/LayoutTests/js/dom/Promise-reject.html</a></li>
<li><a href="#trunkLayoutTestsjsdomPromiseresolvechainhtml">trunk/LayoutTests/js/dom/Promise-resolve-chain.html</a></li>
<li><a href="#trunkLayoutTestsjsdomPromiseresolveexpectedtxt">trunk/LayoutTests/js/dom/Promise-resolve-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomPromiseresolveinworkersexpectedtxt">trunk/LayoutTests/js/dom/Promise-resolve-in-workers-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomPromiseresolvewiththenexceptionhtml">trunk/LayoutTests/js/dom/Promise-resolve-with-then-exception.html</a></li>
<li><a href="#trunkLayoutTestsjsdomPromiseresolvewiththenfulfillexpectedtxt">trunk/LayoutTests/js/dom/Promise-resolve-with-then-fulfill-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomPromiseresolvewiththenfulfillhtml">trunk/LayoutTests/js/dom/Promise-resolve-with-then-fulfill.html</a></li>
<li><a href="#trunkLayoutTestsjsdomPromiseresolvewiththenrejectexpectedtxt">trunk/LayoutTests/js/dom/Promise-resolve-with-then-reject-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomPromiseresolvewiththenrejecthtml">trunk/LayoutTests/js/dom/Promise-resolve-with-then-reject.html</a></li>
<li><a href="#trunkLayoutTestsjsdomPromiseresolvehtml">trunk/LayoutTests/js/dom/Promise-resolve.html</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisesimpleexpectedtxt">trunk/LayoutTests/js/dom/Promise-simple-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisesimpleinworkersexpectedtxt">trunk/LayoutTests/js/dom/Promise-simple-in-workers-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisesimplehtml">trunk/LayoutTests/js/dom/Promise-simple.html</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisestaticresolvehtml">trunk/LayoutTests/js/dom/Promise-static-resolve.html</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisethenexpectedtxt">trunk/LayoutTests/js/dom/Promise-then-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisetheninworkersexpectedtxt">trunk/LayoutTests/js/dom/Promise-then-in-workers-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisethenwithoutcallbackshtml">trunk/LayoutTests/js/dom/Promise-then-without-callbacks.html</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisethenhtml">trunk/LayoutTests/js/dom/Promise-then.html</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisetypesexpectedtxt">trunk/LayoutTests/js/dom/Promise-types-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisetypeshtml">trunk/LayoutTests/js/dom/Promise-types.html</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisehtml">trunk/LayoutTests/js/dom/Promise.html</a></li>
<li><a href="#trunkLayoutTestsjsresourcesPromisecatchinworkersjs">trunk/LayoutTests/js/resources/Promise-catch-in-workers.js</a></li>
<li><a href="#trunkLayoutTestsjsresourcesPromiseinitinworkersjs">trunk/LayoutTests/js/resources/Promise-init-in-workers.js</a></li>
<li><a href="#trunkLayoutTestsjsresourcesPromiserejectinworkersjs">trunk/LayoutTests/js/resources/Promise-reject-in-workers.js</a></li>
<li><a href="#trunkLayoutTestsjsresourcesPromiseresolveinworkersjs">trunk/LayoutTests/js/resources/Promise-resolve-in-workers.js</a></li>
<li><a href="#trunkLayoutTestsjsresourcesPromisesimpleinworkersjs">trunk/LayoutTests/js/resources/Promise-simple-in-workers.js</a></li>
<li><a href="#trunkLayoutTestsjsresourcesPromisetheninworkersjs">trunk/LayoutTests/js/resources/Promise-then-in-workers.js</a></li>
<li><a href="#trunkLayoutTestsjsresourcesPromisethenwithoutcallbacksinworkersjs">trunk/LayoutTests/js/resources/Promise-then-without-callbacks-in-workers.js</a></li>
<li><a href="#trunkSourceJavaScriptCoreCMakeListstxt">trunk/Source/JavaScriptCore/CMakeLists.txt</a></li>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreDerivedSourcesmake">trunk/Source/JavaScriptCore/DerivedSources.make</a></li>
<li><a href="#trunkSourceJavaScriptCoreGNUmakefilelistam">trunk/Source/JavaScriptCore/GNUmakefile.list.am</a></li>
<li><a href="#trunkSourceJavaScriptCoreJavaScriptCorevcxprojJavaScriptCorevcxproj">trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj</a></li>
<li><a href="#trunkSourceJavaScriptCoreJavaScriptCorevcxprojJavaScriptCorevcxprojfilters">trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters</a></li>
<li><a href="#trunkSourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj">trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapSlotVisitorh">trunk/Source/JavaScriptCore/heap/SlotVisitor.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapSlotVisitorInlinesh">trunk/Source/JavaScriptCore/heap/SlotVisitorInlines.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreinterpreterCallFrameh">trunk/Source/JavaScriptCore/interpreter/CallFrame.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeCommonIdentifierscpp">trunk/Source/JavaScriptCore/runtime/CommonIdentifiers.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeCommonIdentifiersh">trunk/Source/JavaScriptCore/runtime/CommonIdentifiers.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSGlobalObjectcpp">trunk/Source/JavaScriptCore/runtime/JSGlobalObject.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSGlobalObjecth">trunk/Source/JavaScriptCore/runtime/JSGlobalObject.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSPromisecpp">trunk/Source/JavaScriptCore/runtime/JSPromise.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSPromiseh">trunk/Source/JavaScriptCore/runtime/JSPromise.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSPromiseConstructorcpp">trunk/Source/JavaScriptCore/runtime/JSPromiseConstructor.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSPromiseConstructorh">trunk/Source/JavaScriptCore/runtime/JSPromiseConstructor.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSPromisePrototypecpp">trunk/Source/JavaScriptCore/runtime/JSPromisePrototype.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeVMcpp">trunk/Source/JavaScriptCore/runtime/VM.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeVMh">trunk/Source/JavaScriptCore/runtime/VM.h</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSDOMGlobalObjectTaskcpp">trunk/Source/WebCore/bindings/js/JSDOMGlobalObjectTask.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSDOMGlobalObjectTaskh">trunk/Source/WebCore/bindings/js/JSDOMGlobalObjectTask.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="#trunkSourceWebCorebindingsjsJSDOMWindowBasecpp">trunk/Source/WebCore/bindings/js/JSDOMWindowBase.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSDOMWindowBaseh">trunk/Source/WebCore/bindings/js/JSDOMWindowBase.h</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSSubtleCryptoCustomcpp">trunk/Source/WebCore/bindings/js/JSSubtleCryptoCustom.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSWorkerGlobalScopeBasecpp">trunk/Source/WebCore/bindings/js/JSWorkerGlobalScopeBase.cpp</a></li>
<li><a href="#trunkSourceWebCorebindingsjsJSWorkerGlobalScopeBaseh">trunk/Source/WebCore/bindings/js/JSWorkerGlobalScopeBase.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsjsdomPromiseinitcallbackreceiverexpectedtxt">trunk/LayoutTests/js/dom/Promise-init-callback-receiver-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomPromiseinitcallbackreceiverhtml">trunk/LayoutTests/js/dom/Promise-init-callback-receiver.html</a></li>
<li><a href="#trunkLayoutTestsjsdomPromiseonFulfilleddeepexpectedtxt">trunk/LayoutTests/js/dom/Promise-onFulfilled-deep-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomPromiseonFulfilleddeephtml">trunk/LayoutTests/js/dom/Promise-onFulfilled-deep.html</a></li>
<li><a href="#trunkLayoutTestsjsdomPromiseonRejecteddeepexpectedtxt">trunk/LayoutTests/js/dom/Promise-onRejected-deep-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomPromiseonRejecteddeephtml">trunk/LayoutTests/js/dom/Promise-onRejected-deep.html</a></li>
<li><a href="#trunkLayoutTestsjsdomPromiseresolvestateexpectedtxt">trunk/LayoutTests/js/dom/Promise-resolve-state-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomPromiseresolvestateinworkersexpectedtxt">trunk/LayoutTests/js/dom/Promise-resolve-state-in-workers-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomPromiseresolvestateinworkershtml">trunk/LayoutTests/js/dom/Promise-resolve-state-in-workers.html</a></li>
<li><a href="#trunkLayoutTestsjsdomPromiseresolvestatehtml">trunk/LayoutTests/js/dom/Promise-resolve-state.html</a></li>
<li><a href="#trunkLayoutTestsjsdomPromiseresolvewithitselfexpectedtxt">trunk/LayoutTests/js/dom/Promise-resolve-with-itself-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomPromiseresolvewithitselfhtml">trunk/LayoutTests/js/dom/Promise-resolve-with-itself.html</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisesimpleresolveexpectedtxt">trunk/LayoutTests/js/dom/Promise-simple-resolve-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisesimpleresolvehtml">trunk/LayoutTests/js/dom/Promise-simple-resolve.html</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisestaticallexpectedtxt">trunk/LayoutTests/js/dom/Promise-static-all-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisestaticallhtml">trunk/LayoutTests/js/dom/Promise-static-all.html</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisestaticcastexpectedtxt">trunk/LayoutTests/js/dom/Promise-static-cast-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisestaticcasthtml">trunk/LayoutTests/js/dom/Promise-static-cast.html</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisestaticraceexpectedtxt">trunk/LayoutTests/js/dom/Promise-static-race-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisestaticracehtml">trunk/LayoutTests/js/dom/Promise-static-race.html</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisethencallbackreceiverexpectedtxt">trunk/LayoutTests/js/dom/Promise-then-callback-receiver-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisethencallbackreceiverhtml">trunk/LayoutTests/js/dom/Promise-then-callback-receiver.html</a></li>
<li><a href="#trunkLayoutTestsjsresourcesPromiseresolvestateinworkersjs">trunk/LayoutTests/js/resources/Promise-resolve-state-in-workers.js</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSPromiseDeferredcpp">trunk/Source/JavaScriptCore/runtime/JSPromiseDeferred.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSPromiseDeferredh">trunk/Source/JavaScriptCore/runtime/JSPromiseDeferred.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSPromiseFunctionscpp">trunk/Source/JavaScriptCore/runtime/JSPromiseFunctions.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSPromiseFunctionsh">trunk/Source/JavaScriptCore/runtime/JSPromiseFunctions.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSPromiseReactioncpp">trunk/Source/JavaScriptCore/runtime/JSPromiseReaction.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSPromiseReactionh">trunk/Source/JavaScriptCore/runtime/JSPromiseReaction.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeMicrotaskh">trunk/Source/JavaScriptCore/runtime/Microtask.h</a></li>
<li><a href="#trunkSourceWebCoreForwardingHeadersruntimeJSPromiseDeferredh">trunk/Source/WebCore/ForwardingHeaders/runtime/JSPromiseDeferred.h</a></li>
<li><a href="#trunkSourceWebCoreForwardingHeadersruntimeMicrotaskh">trunk/Source/WebCore/ForwardingHeaders/runtime/Microtask.h</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsjsdomPromisealreadyfulfilledexpectedtxt">trunk/LayoutTests/js/dom/Promise-already-fulfilled-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisealreadyfulfilledhtml">trunk/LayoutTests/js/dom/Promise-already-fulfilled.html</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisefulfillexpectedtxt">trunk/LayoutTests/js/dom/Promise-fulfill-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisefulfillinworkersexpectedtxt">trunk/LayoutTests/js/dom/Promise-fulfill-in-workers-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisefulfillinworkershtml">trunk/LayoutTests/js/dom/Promise-fulfill-in-workers.html</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisefulfillhtml">trunk/LayoutTests/js/dom/Promise-fulfill.html</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisesimplefulfillexpectedtxt">trunk/LayoutTests/js/dom/Promise-simple-fulfill-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisesimplefulfillinsidecallbackexpectedtxt">trunk/LayoutTests/js/dom/Promise-simple-fulfill-inside-callback-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisesimplefulfillinsidecallbackhtml">trunk/LayoutTests/js/dom/Promise-simple-fulfill-inside-callback.html</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisesimplefulfillhtml">trunk/LayoutTests/js/dom/Promise-simple-fulfill.html</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisestaticfulfillexpectedtxt">trunk/LayoutTests/js/dom/Promise-static-fulfill-expected.txt</a></li>
<li><a href="#trunkLayoutTestsjsdomPromisestaticfulfillhtml">trunk/LayoutTests/js/dom/Promise-static-fulfill.html</a></li>
<li><a href="#trunkLayoutTestsjsresourcesPromisefulfillinworkersjs">trunk/LayoutTests/js/resources/Promise-fulfill-in-workers.js</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSPromiseCallbackcpp">trunk/Source/JavaScriptCore/runtime/JSPromiseCallback.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSPromiseCallbackh">trunk/Source/JavaScriptCore/runtime/JSPromiseCallback.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSPromiseResolvercpp">trunk/Source/JavaScriptCore/runtime/JSPromiseResolver.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSPromiseResolverh">trunk/Source/JavaScriptCore/runtime/JSPromiseResolver.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSPromiseResolverConstructorcpp">trunk/Source/JavaScriptCore/runtime/JSPromiseResolverConstructor.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSPromiseResolverConstructorh">trunk/Source/JavaScriptCore/runtime/JSPromiseResolverConstructor.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSPromiseResolverPrototypecpp">trunk/Source/JavaScriptCore/runtime/JSPromiseResolverPrototype.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeJSPromiseResolverPrototypeh">trunk/Source/JavaScriptCore/runtime/JSPromiseResolverPrototype.h</a></li>
<li><a href="#trunkSourceWebCoreForwardingHeadersruntimeJSPromiseResolverh">trunk/Source/WebCore/ForwardingHeaders/runtime/JSPromiseResolver.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/ChangeLog        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -1,3 +1,94 @@
</span><ins>+2014-01-02  Sam Weinig  &lt;sam@webkit.org&gt;
+
+        Update Promises to the https://github.com/domenic/promises-unwrapping spec
+        https://bugs.webkit.org/show_bug.cgi?id=120954
+
+        Reviewed by Filip Pizlo.
+
+        * crypto/subtle/argument-conversion.html:
+        * crypto/subtle/resources/common.js:
+        * crypto/subtle/sha-1.html:
+        * crypto/subtle/sha-224.html:
+        * crypto/subtle/sha-256.html:
+        * crypto/subtle/sha-384.html:
+        * crypto/subtle/sha-512.html:
+        * js/dom/Promise-already-fulfilled-expected.txt: Removed.
+        * js/dom/Promise-already-fulfilled.html: Removed.
+        * js/dom/Promise-already-rejected.html:
+        * js/dom/Promise-already-resolved.html:
+        * js/dom/Promise-catch-expected.txt:
+        * js/dom/Promise-catch-in-workers-expected.txt:
+        * js/dom/Promise-catch.html:
+        * js/dom/Promise-chain.html:
+        * js/dom/Promise-exception-expected.txt:
+        * js/dom/Promise-exception.html:
+        * js/dom/Promise-expected.txt:
+        * js/dom/Promise-fulfill-expected.txt: Removed.
+        * js/dom/Promise-fulfill-in-workers-expected.txt: Removed.
+        * js/dom/Promise-fulfill-in-workers.html: Removed.
+        * js/dom/Promise-fulfill.html: Removed.
+        * js/dom/Promise-init-callback-receiver-expected.txt: Added.
+        * js/dom/Promise-init-callback-receiver.html: Added.
+        * js/dom/Promise-init-expected.txt:
+        * js/dom/Promise-init-in-workers-expected.txt:
+        * js/dom/Promise-init.html:
+        * js/dom/Promise-onFulfilled-deep-expected.txt: Added.
+        * js/dom/Promise-onFulfilled-deep.html: Added.
+        * js/dom/Promise-onRejected-deep-expected.txt: Added.
+        * js/dom/Promise-onRejected-deep.html: Added.
+        * js/dom/Promise-reject.html:
+        * js/dom/Promise-resolve-chain.html:
+        * js/dom/Promise-resolve-expected.txt:
+        * js/dom/Promise-resolve-in-workers-expected.txt:
+        * js/dom/Promise-resolve-state-expected.txt: Added.
+        * js/dom/Promise-resolve-state-in-workers-expected.txt: Added.
+        * js/dom/Promise-resolve-state-in-workers.html: Added.
+        * js/dom/Promise-resolve-state.html: Added.
+        * js/dom/Promise-resolve-with-itself-expected.txt: Added.
+        * js/dom/Promise-resolve-with-itself.html: Added.
+        * js/dom/Promise-resolve-with-then-exception.html:
+        * js/dom/Promise-resolve-with-then-fulfill-expected.txt:
+        * js/dom/Promise-resolve-with-then-fulfill.html:
+        * js/dom/Promise-resolve-with-then-reject-expected.txt:
+        * js/dom/Promise-resolve-with-then-reject.html:
+        * js/dom/Promise-resolve.html:
+        * js/dom/Promise-simple-expected.txt:
+        * js/dom/Promise-simple-fulfill-expected.txt: Removed.
+        * js/dom/Promise-simple-fulfill-inside-callback-expected.txt: Removed.
+        * js/dom/Promise-simple-fulfill-inside-callback.html: Removed.
+        * js/dom/Promise-simple-fulfill.html: Removed.
+        * js/dom/Promise-simple-in-workers-expected.txt:
+        * js/dom/Promise-simple-resolve-expected.txt: Added.
+        * js/dom/Promise-simple-resolve.html: Added.
+        * js/dom/Promise-simple.html:
+        * js/dom/Promise-static-all-expected.txt: Added.
+        * js/dom/Promise-static-all.html: Added.
+        * js/dom/Promise-static-cast-expected.txt: Added.
+        * js/dom/Promise-static-cast.html: Added.
+        * js/dom/Promise-static-fulfill-expected.txt: Removed.
+        * js/dom/Promise-static-fulfill.html: Removed.
+        * js/dom/Promise-static-race-expected.txt: Added.
+        * js/dom/Promise-static-race.html: Added.
+        * js/dom/Promise-static-resolve.html:
+        * js/dom/Promise-then-callback-receiver-expected.txt: Added.
+        * js/dom/Promise-then-callback-receiver.html: Added.
+        * js/dom/Promise-then-expected.txt:
+        * js/dom/Promise-then-in-workers-expected.txt:
+        * js/dom/Promise-then-without-callbacks.html:
+        * js/dom/Promise-then.html:
+        * js/dom/Promise-types-expected.txt:
+        * js/dom/Promise-types.html:
+        * js/dom/Promise.html:
+        * js/resources/Promise-catch-in-workers.js:
+        * js/resources/Promise-fulfill-in-workers.js: Removed.
+        * js/resources/Promise-init-in-workers.js:
+        * js/resources/Promise-reject-in-workers.js:
+        * js/resources/Promise-resolve-in-workers.js:
+        * js/resources/Promise-resolve-state-in-workers.js: Added.
+        * js/resources/Promise-simple-in-workers.js:
+        * js/resources/Promise-then-in-workers.js:
+        * js/resources/Promise-then-without-callbacks-in-workers.js:
+
</ins><span class="cx"> 2014-01-02  Myles C. Maxfield  &lt;mmaxfield@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Allow ImageBuffer to re-use IOSurfaces
</span></span></pre></div>
<a id="trunkLayoutTestscryptosubtleargumentconversionhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/crypto/subtle/argument-conversion.html (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/crypto/subtle/argument-conversion.html        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/crypto/subtle/argument-conversion.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -13,7 +13,7 @@
</span><span class="cx"> 
</span><span class="cx"> jsTestIsAsync = true;
</span><span class="cx"> 
</span><del>-Promise.fulfill(null).then(function() {
</del><ins>+Promise.resolve(null).then(function() {
</ins><span class="cx">     debug(&quot;\nPassing algorithm name as a string object...&quot;);
</span><span class="cx">     return crypto.subtle.digest(new String('sha-1'), new Uint8Array([]));
</span><span class="cx"> }).then(function(result) {
</span></span></pre></div>
<a id="trunkLayoutTestscryptosubtleresourcescommonjs"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/crypto/subtle/resources/common.js (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/crypto/subtle/resources/common.js        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/crypto/subtle/resources/common.js        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -107,15 +107,16 @@
</span><span class="cx">         var results = [];
</span><span class="cx">         var resultCount = 0;
</span><span class="cx">         var resolver;
</span><ins>+        var rejector;
</ins><span class="cx">         function next(result) {
</span><span class="cx">             results[resultCount++] = result;
</span><span class="cx">             if (resultCount &lt; promises.length)
</span><span class="cx">                 promises[resultCount].then(next);
</span><span class="cx">             else
</span><del>-                resolver.fulfill(results);
</del><ins>+                resolver(results);
</ins><span class="cx">         }
</span><del>-        promises[0].then(next, function() { resolver.reject(null) });
-        return new Promise(function(r) { resolver = r; });
</del><ins>+        promises[0].then(next, function() { rejector(null) });
+        return new Promise(function(resolve, reject) { resolver = resolve; rejector = reject; });
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestscryptosubtlesha1html"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/crypto/subtle/sha-1.html (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/crypto/subtle/sha-1.html        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/crypto/subtle/sha-1.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -13,7 +13,7 @@
</span><span class="cx"> 
</span><span class="cx"> jsTestIsAsync = true;
</span><span class="cx"> 
</span><del>-Promise.fulfill(null).then(function() {
</del><ins>+Promise.resolve(null).then(function() {
</ins><span class="cx">     debug(&quot;SHA1 of []&quot;);
</span><span class="cx">     return crypto.subtle.digest('sha-1', new Uint8Array([]));
</span><span class="cx"> }).then(function(result) {
</span></span></pre></div>
<a id="trunkLayoutTestscryptosubtlesha224html"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/crypto/subtle/sha-224.html (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/crypto/subtle/sha-224.html        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/crypto/subtle/sha-224.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -13,7 +13,7 @@
</span><span class="cx"> 
</span><span class="cx"> jsTestIsAsync = true;
</span><span class="cx"> 
</span><del>-Promise.fulfill(null).then(function() {
</del><ins>+Promise.resolve(null).then(function() {
</ins><span class="cx">     debug(&quot;SHA224 of []&quot;);
</span><span class="cx">     return crypto.subtle.digest('sha-224', new Uint8Array([]));
</span><span class="cx"> }).then(function(result) {
</span></span></pre></div>
<a id="trunkLayoutTestscryptosubtlesha256html"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/crypto/subtle/sha-256.html (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/crypto/subtle/sha-256.html        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/crypto/subtle/sha-256.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -13,7 +13,7 @@
</span><span class="cx"> 
</span><span class="cx"> jsTestIsAsync = true;
</span><span class="cx"> 
</span><del>-Promise.fulfill(null).then(function() {
</del><ins>+Promise.resolve(null).then(function() {
</ins><span class="cx">     debug(&quot;SHA256 of []&quot;);
</span><span class="cx">     return crypto.subtle.digest('sha-256', new Uint8Array([]));
</span><span class="cx"> }).then(function(result) {
</span></span></pre></div>
<a id="trunkLayoutTestscryptosubtlesha384html"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/crypto/subtle/sha-384.html (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/crypto/subtle/sha-384.html        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/crypto/subtle/sha-384.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -13,7 +13,7 @@
</span><span class="cx"> 
</span><span class="cx"> jsTestIsAsync = true;
</span><span class="cx"> 
</span><del>-Promise.fulfill(null).then(function() {
</del><ins>+Promise.resolve(null).then(function() {
</ins><span class="cx">     debug(&quot;SHA384 of []&quot;);
</span><span class="cx">     return crypto.subtle.digest('sha-384', new Uint8Array([]));
</span><span class="cx"> }).then(function(result) {
</span></span></pre></div>
<a id="trunkLayoutTestscryptosubtlesha512html"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/crypto/subtle/sha-512.html (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/crypto/subtle/sha-512.html        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/crypto/subtle/sha-512.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -13,7 +13,7 @@
</span><span class="cx"> 
</span><span class="cx"> jsTestIsAsync = true;
</span><span class="cx"> 
</span><del>-Promise.fulfill(null).then(function() {
</del><ins>+Promise.resolve(null).then(function() {
</ins><span class="cx">     debug(&quot;SHA512 of []&quot;);
</span><span class="cx">     return crypto.subtle.digest('sha-512', new Uint8Array([]));
</span><span class="cx"> }).then(function(result) {
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisealreadyfulfilledexpectedtxt"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/js/dom/Promise-already-fulfilled-expected.txt (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-already-fulfilled-expected.txt        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-already-fulfilled-expected.txt        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -1,9 +0,0 @@
</span><del>-Test Promise.
-
-On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
-
-PASS result is &quot;foo&quot;
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
</del></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisealreadyfulfilledhtml"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/js/dom/Promise-already-fulfilled.html (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-already-fulfilled.html        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-already-fulfilled.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -1,31 +0,0 @@
</span><del>-&lt;!DOCTYPE html&gt;
-&lt;html&gt;
-&lt;head&gt;
-&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
-&lt;/head&gt;
-&lt;body&gt;
-&lt;div id=&quot;description&quot;&gt;&lt;/div&gt;
-&lt;div id=&quot;console&quot;&gt;&lt;/div&gt;
-&lt;script&gt;
-description('Test Promise.');
-
-window.jsTestIsAsync = true;
-
-new Promise(function(resolver) {
-  resolver.fulfill('foo');
-  resolver.fulfill('fulfill');
-  resolver.resolve('resolve');
-  resolver.reject('reject');
-}).then(function(result) {
-  window.result = result;
-  shouldBeEqualToString('result', 'foo');
-  finishJSTest();
-}, function() {
-  testFailed('rejected');
-  finishJSTest();
-});
-
-&lt;/script&gt;
-&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
-&lt;/body&gt;
-&lt;/html&gt;
</del></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisealreadyrejectedhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/Promise-already-rejected.html (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-already-rejected.html        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-already-rejected.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -11,11 +11,10 @@
</span><span class="cx"> 
</span><span class="cx"> window.jsTestIsAsync = true;
</span><span class="cx"> 
</span><del>-new Promise(function(resolver) {
-  resolver.reject('foo');
-  resolver.fulfill('fulfill');
-  resolver.resolve('resolve');
-  resolver.reject('reject');
</del><ins>+new Promise(function(resolve, reject) {
+  reject('foo');
+  resolve('resolve');
+  reject('reject');
</ins><span class="cx"> }).then(function() {
</span><span class="cx">   testFailed('fulfilled');
</span><span class="cx">   finishJSTest();
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisealreadyresolvedhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/Promise-already-resolved.html (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-already-resolved.html        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-already-resolved.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -11,14 +11,13 @@
</span><span class="cx"> 
</span><span class="cx"> window.jsTestIsAsync = true;
</span><span class="cx"> 
</span><del>-new Promise(function(resolver) {
-  var anotherResolver;
-  resolver.resolve(new Promise(function(r) { anotherResolver = r; }));
-  resolver.fulfill('fulfill');
-  resolver.resolve('resolve');
-  resolver.reject('reject');
</del><ins>+new Promise(function(resolve, reject) {
+  var anotherResolve;
+  resolve(new Promise(function(r) { anotherResolve = r; }));
+  resolve('resolve');
+  reject('reject');
</ins><span class="cx"> 
</span><del>-  anotherResolver.fulfill('foo');
</del><ins>+  anotherResolve('foo');
</ins><span class="cx"> }).then(function(result) {
</span><span class="cx">   window.result = result;
</span><span class="cx">   shouldBeEqualToString('result', 'foo');
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisecatchexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/Promise-catch-expected.txt (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-catch-expected.txt        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-catch-expected.txt        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -2,13 +2,13 @@
</span><span class="cx"> 
</span><span class="cx"> On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
</span><span class="cx"> 
</span><del>-PASS thisInInit === firstPromise is true
</del><ins>+PASS thisInInit === firstPromise is false
+PASS thisInInit === window is true
</ins><span class="cx"> PASS firstPromise instanceof Promise is true
</span><span class="cx"> PASS secondPromise instanceof Promise is true
</span><del>-PASS firstPromise.catch(null) threw exception TypeError: Expected function or undefined as as first argument.
-PASS firstPromise.catch(37) threw exception TypeError: Expected function or undefined as as first argument.
</del><span class="cx"> PASS thisInFulfillCallback === firstPromise is false
</span><del>-PASS thisInFulfillCallback === secondPromise is true
</del><ins>+PASS thisInFulfillCallback === secondPromise is false
+PASS thisInFulfillCallback === window is true
</ins><span class="cx"> PASS result is &quot;hello&quot;
</span><span class="cx"> PASS result is &quot;bye&quot;
</span><span class="cx"> PASS fulfilled
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisecatchinworkersexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/Promise-catch-in-workers-expected.txt (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-catch-in-workers-expected.txt        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-catch-in-workers-expected.txt        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -3,13 +3,13 @@
</span><span class="cx"> On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
</span><span class="cx"> 
</span><span class="cx"> Starting worker: ../resources/Promise-catch-in-workers.js
</span><del>-PASS [Worker] thisInInit === firstPromise is true
</del><ins>+PASS [Worker] thisInInit === firstPromise is false
+PASS [Worker] thisInInit === global is true
</ins><span class="cx"> PASS [Worker] firstPromise instanceof Promise is true
</span><span class="cx"> PASS [Worker] secondPromise instanceof Promise is true
</span><del>-PASS [Worker] firstPromise.catch(null) threw exception TypeError: Expected function or undefined as as first argument.
-PASS [Worker] firstPromise.catch(37) threw exception TypeError: Expected function or undefined as as first argument.
</del><span class="cx"> PASS [Worker] thisInFulfillCallback === firstPromise is false
</span><del>-PASS [Worker] thisInFulfillCallback === secondPromise is true
</del><ins>+PASS [Worker] thisInFulfillCallback === secondPromise is false
+PASS [Worker] thisInFulfillCallback === global is true
</ins><span class="cx"> PASS [Worker] result is &quot;hello&quot;
</span><span class="cx"> PASS [Worker] result is &quot;bye&quot;
</span><span class="cx"> PASS [Worker] fulfilled
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisecatchhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/Promise-catch.html (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-catch.html        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-catch.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -10,17 +10,18 @@
</span><span class="cx"> description('Test Promise.');
</span><span class="cx"> 
</span><span class="cx"> window.jsTestIsAsync = true;
</span><del>-var resolver;
</del><ins>+var reject;
</ins><span class="cx"> 
</span><del>-var firstPromise = new Promise(function(newResolver) {
</del><ins>+var firstPromise = new Promise(function(_, newReject) {
</ins><span class="cx">   window.thisInInit = this;
</span><del>-  resolver = newResolver;
</del><ins>+  reject = newReject;
</ins><span class="cx"> });
</span><span class="cx"> 
</span><span class="cx"> var secondPromise = firstPromise.catch(function(result) {
</span><span class="cx">   window.thisInFulfillCallback = this;
</span><span class="cx">   shouldBeFalse('thisInFulfillCallback === firstPromise');
</span><del>-  shouldBeTrue('thisInFulfillCallback === secondPromise');
</del><ins>+  shouldBeFalse('thisInFulfillCallback === secondPromise');
+  shouldBeTrue('thisInFulfillCallback === window');
</ins><span class="cx">   window.result = result;
</span><span class="cx">   shouldBeEqualToString('result', 'hello');
</span><span class="cx">   return 'bye';
</span><span class="lines">@@ -37,14 +38,12 @@
</span><span class="cx"> }, function() {
</span><span class="cx"> });
</span><span class="cx"> 
</span><del>-shouldBeTrue('thisInInit === firstPromise');
</del><ins>+shouldBeFalse('thisInInit === firstPromise');
+shouldBeTrue('thisInInit === window');
</ins><span class="cx"> shouldBeTrue('firstPromise instanceof Promise');
</span><span class="cx"> shouldBeTrue('secondPromise instanceof Promise');
</span><span class="cx"> 
</span><del>-shouldThrow('firstPromise.catch(null)', '&quot;TypeError: Expected function or undefined as as first argument&quot;');
-shouldThrow('firstPromise.catch(37)', '&quot;TypeError: Expected function or undefined as as first argument&quot;');
-
-resolver.reject('hello');
</del><ins>+reject('hello');
</ins><span class="cx"> &lt;/script&gt;
</span><span class="cx"> &lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
</span><span class="cx"> &lt;/body&gt;
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisechainhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/Promise-chain.html (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-chain.html        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-chain.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -11,8 +11,8 @@
</span><span class="cx"> 
</span><span class="cx"> window.jsTestIsAsync = true;
</span><span class="cx"> 
</span><del>-var resolver;
-var promise = new Promise(function (r) {resolver = r;});
</del><ins>+var resolve;
+var promise = new Promise(function (r) {resolve = r;});
</ins><span class="cx"> var operation;
</span><span class="cx"> 
</span><span class="cx"> promise.then(function(result) {  // fulfilled - continue
</span><span class="lines">@@ -57,7 +57,7 @@
</span><span class="cx"> });
</span><span class="cx"> 
</span><span class="cx"> operation = 'synchronous';
</span><del>-resolver.fulfill('hello');
</del><ins>+resolve('hello');
</ins><span class="cx"> 
</span><span class="cx"> // The chain should be executed asynchronously.
</span><span class="cx"> operation = 'asynchronous';
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomPromiseexceptionexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/Promise-exception-expected.txt (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-exception-expected.txt        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-exception-expected.txt        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -2,7 +2,8 @@
</span><span class="cx"> 
</span><span class="cx"> On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
</span><span class="cx"> 
</span><del>-PASS thisInThenCallback === thirdPromise is true
</del><ins>+PASS thisInThenCallback === thirdPromise is false
+PASS thisInThenCallback === window is true
</ins><span class="cx"> PASS result is &quot;foobar&quot;
</span><span class="cx"> PASS successfullyParsed is true
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomPromiseexceptionhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/Promise-exception.html (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-exception.html        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-exception.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -11,9 +11,9 @@
</span><span class="cx"> 
</span><span class="cx"> window.jsTestIsAsync = true;
</span><span class="cx"> 
</span><del>-var firstPromise = new Promise(function(resolver) {
</del><ins>+var firstPromise = new Promise(function(resolve) {
</ins><span class="cx">   window.thisInInit = this;
</span><del>-  resolver.fulfill('hello');
</del><ins>+  resolve('hello');
</ins><span class="cx"> });
</span><span class="cx"> 
</span><span class="cx"> var secondPromise = firstPromise.then(function(result) {
</span><span class="lines">@@ -24,7 +24,8 @@
</span><span class="cx">   fail('Unexpected invocation of fulfillCallback');
</span><span class="cx"> }, function(result) {
</span><span class="cx">   window.thisInThenCallback = this;
</span><del>-  shouldBeTrue('thisInThenCallback === thirdPromise');
</del><ins>+  shouldBeFalse('thisInThenCallback === thirdPromise');
+  shouldBeTrue('thisInThenCallback === window');
</ins><span class="cx">   window.result = result;
</span><span class="cx">   shouldBeEqualToString('result', 'foobar');
</span><span class="cx">   finishJSTest();
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomPromiseexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/Promise-expected.txt (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-expected.txt        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-expected.txt        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -4,43 +4,43 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-Test Promise resolve.
-PASS Then.resolve has been called
</del><ins>+About to run test - promiseResolve
+PASS Promise object should exist
+PASS Promise.resolve exists
+PASS Promise.reject exists
+PASS Then - resolveCb has been called
</ins><span class="cx"> PASS 42 is 42
</span><span class="cx"> 
</span><del>-Test Promise reject.
-PASS Then.reject has been called
</del><ins>+About to run test - promiseReject
+PASS Then - rejectCb has been called
</ins><span class="cx"> PASS 42 is 42
</span><span class="cx"> 
</span><del>-Test Promise reject.
-PASS Then.reject has been called
</del><ins>+About to run test - promiseException
+PASS Then - rejectCb has been called
</ins><span class="cx"> PASS 42 is 42
</span><span class="cx"> 
</span><del>-Test Promise gc.
</del><ins>+About to run test - promiseGC
</ins><span class="cx"> PASS Then - promise is still alive
</span><span class="cx"> 
</span><del>-Test Promise async.
-Global should be foo
</del><ins>+About to run test - promiseAsync
</ins><span class="cx"> PASS foo is foo
</span><del>-Global should still be foo
</del><span class="cx"> PASS foo is foo
</span><del>-Global should still be foo (2)
</del><span class="cx"> PASS foo is foo
</span><del>-Global should be bar
</del><span class="cx"> PASS bar is bar
</span><span class="cx"> 
</span><del>-Test Promise double then.
</del><ins>+About to run test - promiseDoubleThen
</ins><span class="cx"> PASS Then.resolve has been called
</span><span class="cx"> PASS 42 is 42
</span><span class="cx"> PASS Then.resolve has been called
</span><span class="cx"> PASS 1 is 1
</span><span class="cx"> PASS 42 is 42
</span><span class="cx"> 
</span><del>-Test Promise - then / exception.
</del><ins>+About to run test - promiseThenException
</ins><span class="cx"> PASS Then.resolve has been called
</span><del>-PASS Catch handler (e.g. the reject handler) called.
</del><ins>+PASS window.onerror has been called!
</ins><span class="cx"> 
</span><del>-Test Promise - then / catch / then.
</del><ins>+About to run test - promiseThenCatchThen
+PASS [object Promise] should not be [object Promise]
</ins><span class="cx"> PASS Then.resolve has been called
</span><span class="cx"> PASS 42 is 42
</span><span class="cx"> PASS Then.resolve has been called
</span><span class="lines">@@ -48,7 +48,8 @@
</span><span class="cx"> PASS Then.resolve has been called
</span><span class="cx"> PASS 44 is 44
</span><span class="cx"> 
</span><del>-Test Promise - reject / then / catch / then.
</del><ins>+About to run test - promiseRejectThenCatchThen
+PASS [object Promise] should not be [object Promise]
</ins><span class="cx"> PASS Then.reject has been called
</span><span class="cx"> PASS 42 is 42
</span><span class="cx"> PASS Then.resolve has been called
</span><span class="lines">@@ -56,13 +57,13 @@
</span><span class="cx"> PASS Then.resolve has been called
</span><span class="cx"> PASS 44 is 44
</span><span class="cx"> 
</span><del>-Test Promise - reject / then / catch / then (2).
</del><ins>+About to run test - promiseRejectThenCatchThen2
+PASS 42 is 42
</ins><span class="cx"> PASS Catch has been called
</span><del>-PASS 42 is 42
</del><span class="cx"> PASS Then.resolve has been called
</span><span class="cx"> PASS 43 is 43
</span><span class="cx"> 
</span><del>-Test Promise - reject / then / catch exception / then.
</del><ins>+About to run test - promiseRejectThenCatchExceptionThen
</ins><span class="cx"> PASS Then.reject has been called
</span><span class="cx"> PASS 42 is 42
</span><span class="cx"> PASS Catch has been called
</span><span class="lines">@@ -70,47 +71,64 @@
</span><span class="cx"> PASS Then.resolve has been called
</span><span class="cx"> PASS 44 is 44
</span><span class="cx"> 
</span><del>-Test Promise - then / catch ordering (resolve).
-Many steps... should return 2
</del><ins>+About to run test - promiseThenCatchOrderingResolve
</ins><span class="cx"> PASS 2 is 2
</span><span class="cx"> 
</span><del>-Test Promise - then / catch ordering (reject).
-Many steps... should return 2
</del><ins>+About to run test - promiseThenCatchOrderingReject
</ins><span class="cx"> PASS 2 is 2
</span><span class="cx"> 
</span><del>-Test Promise - nested promise
</del><ins>+About to run test - promiseNestedPromise
</ins><span class="cx"> PASS Nested promise is executed
</span><del>-PASS Then.resolve has been called
</del><span class="cx"> PASS 42 is 42
</span><span class="cx"> 
</span><del>-Test Promise - nested-nested promise.
</del><ins>+About to run test - promiseNestedNestedPromise
</ins><span class="cx"> PASS Nested promise is executed
</span><del>-PASS Then.resolve has been called
</del><span class="cx"> PASS 43 is 43
</span><span class="cx"> 
</span><del>-Test Promise - wrong nested promise.
</del><ins>+About to run test - promiseWrongNestedPromise
</ins><span class="cx"> PASS Nested promise is executed
</span><del>-PASS Then.resolve has been called
</del><span class="cx"> PASS 42 is 42
</span><span class="cx"> 
</span><del>-Test Promise - promise loop.
</del><ins>+About to run test - promiseLoop
</ins><span class="cx"> PASS Nested promise is executed
</span><del>-PASS Nested-nested promise is executed
-PASS Then.resolve has been called
</del><ins>+PASS Nested nested promise is executed
</ins><span class="cx"> PASS 42 is 42
</span><span class="cx"> 
</span><del>-Test Promise - Promise.reject().
-PASS Then.reject has been called
</del><ins>+About to run test - promiseStaticReject
</ins><span class="cx"> PASS 42 is 42
</span><span class="cx"> 
</span><del>-Test Promise - Promise.resolve().
-PASS Then.resolve has been called
</del><ins>+About to run test - promiseStaticResolve
</ins><span class="cx"> PASS 42 is 42
</span><span class="cx"> 
</span><del>-Test Promise - Promise.resolve() with  nested promise.
</del><ins>+About to run test - promiseResolveNestedPromise
</ins><span class="cx"> PASS Nested promise is executed
</span><del>-PASS Then.resolve has been called
</del><span class="cx"> PASS 42 is 42
</span><ins>+
+About to run test - promiseResolveNoArg
+PASS Promise.resolve exists
+PASS Promise.reject exists
+PASS Then - resolveCb has been called
+PASS undefined is undefined
+
+About to run test - promiseRejectNoArg
+PASS Then - rejectCb has been called
+PASS undefined is undefined
+
+About to run test - promiseThenNoArg
+PASS [object Promise] should not be [object Promise]
+PASS 42 is 42
+
+About to run test - promiseThenUndefinedResolveFunction
+PASS 42 is 42
+
+About to run test - promiseThenNullResolveFunction
+PASS 42 is 42
+
+About to run test - promiseCatchNoArg
+PASS [object Promise] should not be [object Promise]
+PASS 42 is 42
+
+About to run test - promiseRejectNoHandler
</ins><span class="cx"> PASS successfullyParsed is true
</span><span class="cx"> 
</span><span class="cx"> TEST COMPLETE
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisefulfillexpectedtxt"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/js/dom/Promise-fulfill-expected.txt (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-fulfill-expected.txt        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-fulfill-expected.txt        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -1,12 +0,0 @@
</span><del>-Test Promise.
-
-On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
-
-PASS promiseState is &quot;pending&quot;
-PASS promiseState is &quot;pending&quot;
-PASS promiseState is &quot;fulfilled&quot;
-PASS promiseResult is &quot;hello&quot;
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
</del></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisefulfillinworkersexpectedtxt"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/js/dom/Promise-fulfill-in-workers-expected.txt (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-fulfill-in-workers-expected.txt        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-fulfill-in-workers-expected.txt        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -1,13 +0,0 @@
</span><del>-[Worker] Test Promise.
-
-On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
-
-Starting worker: ../resources/Promise-fulfill-in-workers.js
-PASS [Worker] promiseState is &quot;pending&quot;
-PASS [Worker] promiseState is &quot;pending&quot;
-PASS [Worker] promiseState is &quot;fulfilled&quot;
-PASS [Worker] promiseResult is &quot;hello&quot;
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
</del></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisefulfillinworkershtml"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/js/dom/Promise-fulfill-in-workers.html (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-fulfill-in-workers.html        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-fulfill-in-workers.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -1,14 +0,0 @@
</span><del>-&lt;!DOCTYPE html&gt;
-&lt;html&gt;
-&lt;head&gt;
-&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
-&lt;/head&gt;
-&lt;body&gt;
-&lt;div id=&quot;description&quot;&gt;&lt;/div&gt;
-&lt;div id=&quot;console&quot;&gt;&lt;/div&gt;
-&lt;script&gt;
-worker = startWorker('../resources/Promise-fulfill-in-workers.js');
-&lt;/script&gt;
-&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
-&lt;/body&gt;
-&lt;/html&gt;
</del></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisefulfillhtml"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/js/dom/Promise-fulfill.html (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-fulfill.html        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-fulfill.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -1,44 +0,0 @@
</span><del>-&lt;!DOCTYPE html&gt;
-&lt;html&gt;
-&lt;head&gt;
-&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
-&lt;/head&gt;
-&lt;body&gt;
-&lt;div id=&quot;description&quot;&gt;&lt;/div&gt;
-&lt;div id=&quot;console&quot;&gt;&lt;/div&gt;
-&lt;script&gt;
-description('Test Promise.');
-
-window.jsTestIsAsync = true;
-
-var resolver;
-var promise = new Promise(function(r) { resolver = r; });
-var promiseState = 'pending';
-var promiseResult = undefined;
-promise.then(function(result) {
-  promiseState = 'fulfilled';
-  promiseResult = result;
-}, function(result) {
-  promiseState = 'rejected';
-  promiseResult = result;
-});
-
-shouldBeEqualToString('promiseState', 'pending');
-
-resolver.fulfill('hello');
-
-shouldBeEqualToString('promiseState', 'pending');
-
-promise.then(function() {
-  shouldBeEqualToString('promiseState', 'fulfilled');
-  shouldBeEqualToString('promiseResult', 'hello');
-  finishJSTest();
-}, function() {
-  testFailed('promise is rejected.');
-  finishJSTest();
-});
-
-&lt;/script&gt;
-&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
-&lt;/body&gt;
-&lt;/html&gt;
</del></span></pre></div>
<a id="trunkLayoutTestsjsdomPromiseinitcallbackreceiverexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/js/dom/Promise-init-callback-receiver-expected.txt (0 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-init-callback-receiver-expected.txt                                (rev 0)
+++ trunk/LayoutTests/js/dom/Promise-init-callback-receiver-expected.txt        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -0,0 +1,10 @@
</span><ins>+Test Promise.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+PASS receiverInSloppy is window
+PASS receiverInStrict is undefined
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsjsdomPromiseinitcallbackreceiverhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/js/dom/Promise-init-callback-receiver.html (0 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-init-callback-receiver.html                                (rev 0)
+++ trunk/LayoutTests/js/dom/Promise-init-callback-receiver.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -0,0 +1,28 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;div id=&quot;description&quot;&gt;&lt;/div&gt;
+&lt;div id=&quot;console&quot;&gt;&lt;/div&gt;
+&lt;script&gt;
+description('Test Promise.');
+
+var receiverInSloppy;
+new Promise(function () {
+    window.receiverInSloppy = this;
+    shouldBe('receiverInSloppy', 'window');
+});
+
+var receiverInStrict;
+new Promise(function () {
+    'use strict';
+    window.receiverInStrict = this;
+    shouldBe('receiverInStrict', 'undefined');
+});
+
+&lt;/script&gt;
+&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsjsdomPromiseinitexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/Promise-init-expected.txt (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-init-expected.txt        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-init-expected.txt        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -4,11 +4,12 @@
</span><span class="cx"> 
</span><span class="cx"> PASS promise instanceof Promise is true
</span><span class="cx"> PASS promise.constructor is Promise
</span><del>-PASS thisInInit is promise
-PASS resolver instanceof PromiseResolver is true
-PASS resolver.constructor is PromiseResolver
-PASS new Promise() threw exception TypeError: Expected at least one argument.
-PASS new Promise(37) threw exception TypeError: Expected function as as first argument.
</del><ins>+PASS thisInInit === promise is false
+PASS thisInInit === window is true
+PASS resolve instanceof Function is true
+PASS reject instanceof Function is true
+PASS new Promise() threw exception TypeError: Promise constructor takes a function argument.
+PASS new Promise(37) threw exception TypeError: Promise constructor takes a function argument.
</ins><span class="cx"> PASS promise = new Promise(function() { throw Error(&quot;foo&quot;); }) did not throw exception.
</span><span class="cx"> PASS result.message is &quot;foo&quot;
</span><span class="cx"> PASS fulfilled
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomPromiseinitinworkersexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/Promise-init-in-workers-expected.txt (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-init-in-workers-expected.txt        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-init-in-workers-expected.txt        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -5,11 +5,12 @@
</span><span class="cx"> Starting worker: ../resources/Promise-init-in-workers.js
</span><span class="cx"> PASS [Worker] promise instanceof Promise is true
</span><span class="cx"> PASS [Worker] promise.constructor is Promise
</span><del>-PASS [Worker] thisInInit is promise
-PASS [Worker] resolver instanceof PromiseResolver is true
-PASS [Worker] resolver.constructor is PromiseResolver
-PASS [Worker] new Promise() threw exception TypeError: Expected at least one argument.
-PASS [Worker] new Promise(37) threw exception TypeError: Expected function as as first argument.
</del><ins>+PASS [Worker] thisInInit === promise is false
+PASS [Worker] thisInInit === global is true
+PASS [Worker] resolve instanceof Function is true
+PASS [Worker] reject instanceof Function is true
+PASS [Worker] new Promise() threw exception TypeError: Promise constructor takes a function argument.
+PASS [Worker] new Promise(37) threw exception TypeError: Promise constructor takes a function argument.
</ins><span class="cx"> PASS [Worker] promise = new Promise(function() { throw Error(&quot;foo&quot;); }) did not throw exception.
</span><span class="cx"> PASS [Worker] result.message is &quot;foo&quot;
</span><span class="cx"> PASS [Worker] fulfilled
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomPromiseinithtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/Promise-init.html (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-init.html        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-init.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -12,20 +12,22 @@
</span><span class="cx"> description('Test Promise.');
</span><span class="cx"> 
</span><span class="cx"> var thisInInit;
</span><del>-var resolver;
-var promise = new Promise(function(r) {
</del><ins>+var resolve, reject;
+var promise = new Promise(function(newResolve, newReject) {
</ins><span class="cx">   thisInInit = this;
</span><del>-  resolver = r;
</del><ins>+  resolve = newResolve;
+  reject = newReject;
</ins><span class="cx"> });
</span><span class="cx"> 
</span><span class="cx"> shouldBeTrue('promise instanceof Promise');
</span><span class="cx"> shouldBe('promise.constructor', 'Promise');
</span><del>-shouldBe('thisInInit', 'promise');
-shouldBeTrue('resolver instanceof PromiseResolver');
-shouldBe('resolver.constructor', 'PromiseResolver');
</del><ins>+shouldBeFalse('thisInInit === promise');
+shouldBeTrue('thisInInit === window');
+shouldBeTrue('resolve instanceof Function');
+shouldBeTrue('reject instanceof Function');
</ins><span class="cx"> 
</span><del>-shouldThrow('new Promise()', '&quot;TypeError: Expected at least one argument&quot;');
-shouldThrow('new Promise(37)', '&quot;TypeError: Expected function as as first argument&quot;');
</del><ins>+shouldThrow('new Promise()', '&quot;TypeError: Promise constructor takes a function argument&quot;');
+shouldThrow('new Promise(37)', '&quot;TypeError: Promise constructor takes a function argument&quot;');
</ins><span class="cx"> 
</span><span class="cx"> shouldNotThrow('promise = new Promise(function() { throw Error(&quot;foo&quot;); })');
</span><span class="cx"> promise.then(undefined, function(result) {
</span><span class="lines">@@ -33,8 +35,8 @@
</span><span class="cx">   shouldBeEqualToString('result.message', 'foo');
</span><span class="cx"> });
</span><span class="cx"> 
</span><del>-new Promise(function(resolver) {
-  resolver.fulfill(&quot;hello&quot;);
</del><ins>+new Promise(function(resolve) {
+  resolve(&quot;hello&quot;);
</ins><span class="cx">   throw Error(&quot;foo&quot;);
</span><span class="cx"> }).then(function(result) {
</span><span class="cx">   window.result = result;
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomPromiseonFulfilleddeepexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/js/dom/Promise-onFulfilled-deep-expected.txt (0 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-onFulfilled-deep-expected.txt                                (rev 0)
+++ trunk/LayoutTests/js/dom/Promise-onFulfilled-deep-expected.txt        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -0,0 +1,10 @@
</span><ins>+Test Promise.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+PASS result is undefined
+PASS result is 42
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsjsdomPromiseonFulfilleddeephtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/js/dom/Promise-onFulfilled-deep.html (0 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-onFulfilled-deep.html                                (rev 0)
+++ trunk/LayoutTests/js/dom/Promise-onFulfilled-deep.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -0,0 +1,32 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;div id=&quot;description&quot;&gt;&lt;/div&gt;
+&lt;div id=&quot;console&quot;&gt;&lt;/div&gt;
+&lt;script&gt;
+description('Test Promise.');
+
+window.jsTestIsAsync = true;
+
+var result;
+var resolve;
+var promise = new Promise(function (r) { resolve = r; });
+
+for (var i = 0; i &lt; 5000; ++i)
+  promise = promise.then(function (value) { return value; }, function () { testFailed('rejected'); });
+
+promise.then(function (value) {
+    window.result = value;
+    shouldBe('result', '42');
+}).then(finishJSTest, finishJSTest);
+
+shouldBe('result', 'undefined');
+resolve(42);
+
+&lt;/script&gt;
+&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsjsdomPromiseonRejecteddeepexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/js/dom/Promise-onRejected-deep-expected.txt (0 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-onRejected-deep-expected.txt                                (rev 0)
+++ trunk/LayoutTests/js/dom/Promise-onRejected-deep-expected.txt        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -0,0 +1,10 @@
</span><ins>+Test Promise.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+PASS result is undefined
+PASS result is 42
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsjsdomPromiseonRejecteddeephtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/js/dom/Promise-onRejected-deep.html (0 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-onRejected-deep.html                                (rev 0)
+++ trunk/LayoutTests/js/dom/Promise-onRejected-deep.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -0,0 +1,32 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;div id=&quot;description&quot;&gt;&lt;/div&gt;
+&lt;div id=&quot;console&quot;&gt;&lt;/div&gt;
+&lt;script&gt;
+description('Test Promise.');
+
+window.jsTestIsAsync = true;
+
+var result;
+var reject;
+var promise = new Promise(function (_, r) { reject = r; });
+
+for (var i = 0; i &lt; 5000; ++i)
+  promise = promise.then(function (value) { testFailed('fulfilled'); throw value; }, function (value) { throw value; });
+
+promise.catch(function (value) {
+    window.result = value;
+    shouldBe('result', '42');
+}).then(finishJSTest, finishJSTest);
+
+shouldBe('result', 'undefined');
+reject(42);
+
+&lt;/script&gt;
+&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsjsdomPromiserejecthtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/Promise-reject.html (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-reject.html        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-reject.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -11,8 +11,8 @@
</span><span class="cx"> 
</span><span class="cx"> window.jsTestIsAsync = true;
</span><span class="cx"> 
</span><del>-var resolver;
-var promise = new Promise(function(r) { resolver = r; });
</del><ins>+var reject;
+var promise = new Promise(function(_, r) { reject = r; });
</ins><span class="cx"> var promiseState = 'pending';
</span><span class="cx"> var promiseResult = undefined;
</span><span class="cx"> promise.then(function(result) {
</span><span class="lines">@@ -25,7 +25,7 @@
</span><span class="cx"> 
</span><span class="cx"> shouldBeEqualToString('promiseState', 'pending');
</span><span class="cx"> 
</span><del>-resolver.reject('hello');
</del><ins>+reject('hello');
</ins><span class="cx"> 
</span><span class="cx"> shouldBeEqualToString('promiseState', 'pending');
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomPromiseresolvechainhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/Promise-resolve-chain.html (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-resolve-chain.html        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-resolve-chain.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -11,19 +11,19 @@
</span><span class="cx"> 
</span><span class="cx"> window.jsTestIsAsync = true;
</span><span class="cx"> 
</span><del>-var resolver1, resolver2, resolver3;
-var resolver4, resolver5, resolver6;
-var promise1 = new Promise(function(r) { resolver1 = r; });
-var promise2 = new Promise(function(r) { resolver2 = r; });
-var promise3 = new Promise(function(r) { resolver3 = r; });
-var promise4 = new Promise(function(r) { resolver4 = r; });
-var promise5 = new Promise(function(r) { resolver5 = r; });
-var promise6 = new Promise(function(r) { resolver6 = r; });
</del><ins>+var resolve1, resolve2, resolve3;
+var reject4, resolve5, resolve6;
+var promise1 = new Promise(function(r) { resolve1 = r; });
+var promise2 = new Promise(function(r) { resolve2 = r; });
+var promise3 = new Promise(function(r) { resolve3 = r; });
+var promise4 = new Promise(function(_, r) { reject4 = r; });
+var promise5 = new Promise(function(r) { resolve5 = r; });
+var promise6 = new Promise(function(r) { resolve6 = r; });
</ins><span class="cx"> 
</span><del>-resolver3.resolve(promise2);
-resolver2.resolve(promise1);
-resolver6.resolve(promise5);
-resolver5.resolve(promise4);
</del><ins>+resolve3(promise2);
+resolve2(promise1);
+resolve6(promise5);
+resolve5(promise4);
</ins><span class="cx"> 
</span><span class="cx"> promise3.then(function(result) {
</span><span class="cx">   window.result = result;
</span><span class="lines">@@ -41,8 +41,8 @@
</span><span class="cx">   finishJSTest();
</span><span class="cx"> });
</span><span class="cx"> 
</span><del>-resolver1.resolve('hello');
-resolver4.reject('bye');
</del><ins>+resolve1('hello');
+reject4('bye');
</ins><span class="cx"> 
</span><span class="cx"> &lt;/script&gt;
</span><span class="cx"> &lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomPromiseresolveexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/Promise-resolve-expected.txt (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-resolve-expected.txt        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-resolve-expected.txt        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -2,7 +2,8 @@
</span><span class="cx"> 
</span><span class="cx"> On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
</span><span class="cx"> 
</span><del>-PASS thisInFulfillCallback === secondPromise is true
</del><ins>+PASS thisInFulfillCallback === secondPromise is false
+PASS thisInFulfillCallback === window is true
</ins><span class="cx"> PASS result is &quot;hello&quot;
</span><span class="cx"> PASS successfullyParsed is true
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomPromiseresolveinworkersexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/Promise-resolve-in-workers-expected.txt (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-resolve-in-workers-expected.txt        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-resolve-in-workers-expected.txt        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -3,7 +3,8 @@
</span><span class="cx"> On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
</span><span class="cx"> 
</span><span class="cx"> Starting worker: ../resources/Promise-resolve-in-workers.js
</span><del>-PASS [Worker] thisInFulfillCallback === secondPromise is true
</del><ins>+PASS [Worker] thisInFulfillCallback === secondPromise is false
+PASS [Worker] thisInFulfillCallback === global is true
</ins><span class="cx"> PASS [Worker] result is &quot;hello&quot;
</span><span class="cx"> PASS successfullyParsed is true
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomPromiseresolvestateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/js/dom/Promise-resolve-state-expected.txt (0 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-resolve-state-expected.txt                                (rev 0)
+++ trunk/LayoutTests/js/dom/Promise-resolve-state-expected.txt        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -0,0 +1,12 @@
</span><ins>+Test Promise.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+PASS promiseState is &quot;pending&quot;
+PASS promiseState is &quot;pending&quot;
+PASS promiseState is &quot;fulfilled&quot;
+PASS promiseResult is &quot;hello&quot;
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsjsdomPromiseresolvestateinworkersexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/js/dom/Promise-resolve-state-in-workers-expected.txt (0 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-resolve-state-in-workers-expected.txt                                (rev 0)
+++ trunk/LayoutTests/js/dom/Promise-resolve-state-in-workers-expected.txt        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -0,0 +1,13 @@
</span><ins>+[Worker] Test Promise.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+Starting worker: ../resources/Promise-resolve-state-in-workers.js
+PASS [Worker] promiseState is &quot;pending&quot;
+PASS [Worker] promiseState is &quot;pending&quot;
+PASS [Worker] promiseState is &quot;fulfilled&quot;
+PASS [Worker] promiseResult is &quot;hello&quot;
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsjsdomPromiseresolvestateinworkershtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/js/dom/Promise-resolve-state-in-workers.html (0 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-resolve-state-in-workers.html                                (rev 0)
+++ trunk/LayoutTests/js/dom/Promise-resolve-state-in-workers.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -0,0 +1,14 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;div id=&quot;description&quot;&gt;&lt;/div&gt;
+&lt;div id=&quot;console&quot;&gt;&lt;/div&gt;
+&lt;script&gt;
+worker = startWorker('../resources/Promise-resolve-state-in-workers.js');
+&lt;/script&gt;
+&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsjsdomPromiseresolvestatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/js/dom/Promise-resolve-state.html (0 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-resolve-state.html                                (rev 0)
+++ trunk/LayoutTests/js/dom/Promise-resolve-state.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -0,0 +1,44 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;div id=&quot;description&quot;&gt;&lt;/div&gt;
+&lt;div id=&quot;console&quot;&gt;&lt;/div&gt;
+&lt;script&gt;
+description('Test Promise.');
+
+window.jsTestIsAsync = true;
+
+var resolve;
+var promise = new Promise(function(r) { resolve = r; });
+var promiseState = 'pending';
+var promiseResult = undefined;
+promise.then(function(result) {
+  promiseState = 'fulfilled';
+  promiseResult = result;
+}, function(result) {
+  promiseState = 'rejected';
+  promiseResult = result;
+});
+
+shouldBeEqualToString('promiseState', 'pending');
+
+resolve('hello');
+
+shouldBeEqualToString('promiseState', 'pending');
+
+promise.then(function() {
+  shouldBeEqualToString('promiseState', 'fulfilled');
+  shouldBeEqualToString('promiseResult', 'hello');
+  finishJSTest();
+}, function() {
+  testFailed('promise is rejected.');
+  finishJSTest();
+});
+
+&lt;/script&gt;
+&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsjsdomPromiseresolvewithitselfexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/js/dom/Promise-resolve-with-itself-expected.txt (0 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-resolve-with-itself-expected.txt                                (rev 0)
+++ trunk/LayoutTests/js/dom/Promise-resolve-with-itself-expected.txt        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -0,0 +1,10 @@
</span><ins>+Test Promise.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+PASS rejected
+PASS result is &quot;TypeError: Resolve a promise with itself&quot;
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsjsdomPromiseresolvewithitselfhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/js/dom/Promise-resolve-with-itself.html (0 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-resolve-with-itself.html                                (rev 0)
+++ trunk/LayoutTests/js/dom/Promise-resolve-with-itself.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -0,0 +1,30 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;div id=&quot;description&quot;&gt;&lt;/div&gt;
+&lt;div id=&quot;console&quot;&gt;&lt;/div&gt;
+&lt;script&gt;
+description('Test Promise.');
+
+window.jsTestIsAsync = true;
+
+var resolve;
+var promise = new Promise(function(r) { resolve = r; });
+
+promise.then(function () {
+  testFailed('fulfilled');
+}, function (error) {
+  testPassed('rejected');
+  window.result = error.toString();
+  shouldBeEqualToString('result', 'TypeError: Resolve a promise with itself');
+}).then(finishJSTest, finishJSTest);
+
+resolve(promise);
+
+&lt;/script&gt;
+&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsjsdomPromiseresolvewiththenexceptionhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/Promise-resolve-with-then-exception.html (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-resolve-with-then-exception.html        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-resolve-with-then-exception.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -11,8 +11,8 @@
</span><span class="cx"> 
</span><span class="cx"> window.jsTestIsAsync = true;
</span><span class="cx"> var callback;
</span><del>-var promise = new Promise(function(resolver) {
-  resolver.resolve({then: function(fulfillCallback, rejectCallback) {
</del><ins>+var promise = new Promise(function(resolve) {
+  resolve({then: function(fulfillCallback, rejectCallback) {
</ins><span class="cx">     throw 'hello';
</span><span class="cx">   }}, true);
</span><span class="cx"> });
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomPromiseresolvewiththenfulfillexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/Promise-resolve-with-then-fulfill-expected.txt (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-resolve-with-then-fulfill-expected.txt        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-resolve-with-then-fulfill-expected.txt        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -2,9 +2,9 @@
</span><span class="cx"> 
</span><span class="cx"> On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
</span><span class="cx"> 
</span><ins>+The promise is not fulfilled now.
</ins><span class="cx"> PASS value.then is called.
</span><span class="cx"> PASS thisValue is value
</span><del>-The promise is not fulfilled now.
</del><span class="cx"> PASS fulfilled
</span><span class="cx"> PASS result is &quot;hello&quot;
</span><span class="cx"> PASS successfullyParsed is true
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomPromiseresolvewiththenfulfillhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/Promise-resolve-with-then-fulfill.html (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-resolve-with-then-fulfill.html        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-resolve-with-then-fulfill.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -10,17 +10,15 @@
</span><span class="cx"> description('Test Promise.');
</span><span class="cx"> 
</span><span class="cx"> window.jsTestIsAsync = true;
</span><del>-var callback;
</del><span class="cx"> var value = {
</span><span class="cx">   then: function(fulfillCallback, rejectCallback) {
</span><span class="cx">     testPassed('value.then is called.');
</span><span class="cx">     window.thisValue = this;
</span><span class="cx">     shouldBe('thisValue', 'value');
</span><del>-    callback = fulfillCallback;
</del><ins>+    fulfillCallback('hello');
</ins><span class="cx">   }
</span><span class="cx"> };
</span><del>-finishJSTest();
-var promise = new Promise(function(r) { r.resolve(value); });
</del><ins>+var promise = new Promise(function(resolve) { resolve(value); });
</ins><span class="cx"> 
</span><span class="cx"> promise.then(function(result) {
</span><span class="cx">   testPassed('fulfilled');
</span><span class="lines">@@ -34,7 +32,6 @@
</span><span class="cx"> 
</span><span class="cx"> debug('The promise is not fulfilled now.');
</span><span class="cx"> 
</span><del>-callback('hello');
</del><span class="cx"> &lt;/script&gt;
</span><span class="cx"> &lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
</span><span class="cx"> &lt;/body&gt;
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomPromiseresolvewiththenrejectexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/Promise-resolve-with-then-reject-expected.txt (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-resolve-with-then-reject-expected.txt        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-resolve-with-then-reject-expected.txt        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -2,9 +2,9 @@
</span><span class="cx"> 
</span><span class="cx"> On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
</span><span class="cx"> 
</span><ins>+The promise is not rejected now.
</ins><span class="cx"> PASS value.then is called.
</span><span class="cx"> PASS thisValue is value
</span><del>-The promise is not rejected now.
</del><span class="cx"> PASS rejected
</span><span class="cx"> PASS result is &quot;hello&quot;
</span><span class="cx"> PASS successfullyParsed is true
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomPromiseresolvewiththenrejecthtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/Promise-resolve-with-then-reject.html (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-resolve-with-then-reject.html        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-resolve-with-then-reject.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -10,16 +10,15 @@
</span><span class="cx"> description('Test Promise.');
</span><span class="cx"> 
</span><span class="cx"> window.jsTestIsAsync = true;
</span><del>-var callback;
</del><span class="cx"> var value = {
</span><span class="cx">   then: function(fulfillCallback, rejectCallback) {
</span><span class="cx">     testPassed('value.then is called.');
</span><span class="cx">     window.thisValue = this;
</span><span class="cx">     shouldBe('thisValue', 'value');
</span><del>-    callback = rejectCallback;
</del><ins>+    rejectCallback('hello');
</ins><span class="cx">   }
</span><span class="cx"> };
</span><del>-var promise = new Promise(function(r) { r.resolve(value); });
</del><ins>+var promise = new Promise(function(resolve) { resolve(value); });
</ins><span class="cx"> 
</span><span class="cx"> promise.then(function(result) {
</span><span class="cx">   testFailed('fulfilled');
</span><span class="lines">@@ -33,7 +32,6 @@
</span><span class="cx"> 
</span><span class="cx"> debug('The promise is not rejected now.');
</span><span class="cx"> 
</span><del>-callback('hello');
</del><span class="cx"> &lt;/script&gt;
</span><span class="cx"> &lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
</span><span class="cx"> &lt;/body&gt;
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomPromiseresolvehtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/Promise-resolve.html (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-resolve.html        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-resolve.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -11,13 +11,14 @@
</span><span class="cx"> 
</span><span class="cx"> window.jsTestIsAsync = true;
</span><span class="cx"> 
</span><del>-var firstPromise = new Promise(function(resolver) {
-  resolver.resolve('hello');
</del><ins>+var firstPromise = new Promise(function(resolve) {
+  resolve('hello');
</ins><span class="cx"> });
</span><span class="cx"> 
</span><span class="cx"> var secondPromise = firstPromise.then(function(result) {
</span><span class="cx">   window.thisInFulfillCallback = this;
</span><del>-  shouldBeTrue('thisInFulfillCallback === secondPromise');
</del><ins>+  shouldBeFalse('thisInFulfillCallback === secondPromise');
+  shouldBeTrue('thisInFulfillCallback === window');
</ins><span class="cx">   window.result = result;
</span><span class="cx">   shouldBeEqualToString('result', 'hello');
</span><span class="cx">   finishJSTest();
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisesimpleexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/Promise-simple-expected.txt (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-simple-expected.txt        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-simple-expected.txt        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -2,8 +2,10 @@
</span><span class="cx"> 
</span><span class="cx"> On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
</span><span class="cx"> 
</span><del>-PASS thisInInit === firstPromise is true
-PASS thisInFulfillCallback === secondPromise is true
</del><ins>+PASS thisInInit === firstPromise is false
+PASS thisInInit === window is true
+PASS thisInFulfillCallback === secondPromise is false
+PASS thisInFulfillCallback === window is true
</ins><span class="cx"> PASS result is &quot;hello&quot;
</span><span class="cx"> PASS successfullyParsed is true
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisesimplefulfillexpectedtxt"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/js/dom/Promise-simple-fulfill-expected.txt (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-simple-fulfill-expected.txt        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-simple-fulfill-expected.txt        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -1,9 +0,0 @@
</span><del>-Test Promise.
-
-On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
-
-PASS result is &quot;hello&quot;
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
</del></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisesimplefulfillinsidecallbackexpectedtxt"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/js/dom/Promise-simple-fulfill-inside-callback-expected.txt (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-simple-fulfill-inside-callback-expected.txt        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-simple-fulfill-inside-callback-expected.txt        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -1,9 +0,0 @@
</span><del>-Test Promise.
-
-On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
-
-PASS result is &quot;hello&quot;
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
</del></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisesimplefulfillinsidecallbackhtml"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/js/dom/Promise-simple-fulfill-inside-callback.html (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-simple-fulfill-inside-callback.html        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-simple-fulfill-inside-callback.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -1,25 +0,0 @@
</span><del>-&lt;!DOCTYPE html&gt;
-&lt;html&gt;
-&lt;head&gt;
-&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
-&lt;/head&gt;
-&lt;body&gt;
-&lt;div id=&quot;description&quot;&gt;&lt;/div&gt;
-&lt;div id=&quot;console&quot;&gt;&lt;/div&gt;
-&lt;script&gt;
-description('Test Promise.');
-
-window.jsTestIsAsync = true;
-
-var future = new Promise(function(resolver) {
-  resolver.fulfill('hello');
-}).then(function(result) {
-  window.result = result;
-  shouldBeEqualToString('result', 'hello');
-  finishJSTest();
-});
-
-&lt;/script&gt;
-&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
-&lt;/body&gt;
-&lt;/html&gt;
</del></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisesimplefulfillhtml"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/js/dom/Promise-simple-fulfill.html (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-simple-fulfill.html        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-simple-fulfill.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -1,27 +0,0 @@
</span><del>-&lt;!DOCTYPE html&gt;
-&lt;html&gt;
-&lt;head&gt;
-&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
-&lt;/head&gt;
-&lt;body&gt;
-&lt;div id=&quot;description&quot;&gt;&lt;/div&gt;
-&lt;div id=&quot;console&quot;&gt;&lt;/div&gt;
-&lt;script&gt;
-description('Test Promise.');
-
-window.jsTestIsAsync = true;
-
-var future = new Promise(function(resolver) {
-  setTimeout(function() {
-    resolver.fulfill('hello');
-  }, 0);
-}).then(function(result) {
-  window.result = result;
-  shouldBeEqualToString('result', 'hello');
-  finishJSTest();
-});
-
-&lt;/script&gt;
-&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
-&lt;/body&gt;
-&lt;/html&gt;
</del></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisesimpleinworkersexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/Promise-simple-in-workers-expected.txt (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-simple-in-workers-expected.txt        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-simple-in-workers-expected.txt        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -3,8 +3,10 @@
</span><span class="cx"> On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
</span><span class="cx"> 
</span><span class="cx"> Starting worker: ../resources/Promise-simple-in-workers.js
</span><del>-PASS [Worker] thisInInit === firstPromise is true
-PASS [Worker] thisInFulfillCallback === secondPromise is true
</del><ins>+PASS [Worker] thisInInit === firstPromise is false
+PASS [Worker] thisInInit === global is true
+PASS [Worker] thisInFulfillCallback === secondPromise is false
+PASS [Worker] thisInFulfillCallback === global is true
</ins><span class="cx"> PASS [Worker] result is &quot;hello&quot;
</span><span class="cx"> PASS successfullyParsed is true
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisesimpleresolveexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/js/dom/Promise-simple-resolve-expected.txt (0 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-simple-resolve-expected.txt                                (rev 0)
+++ trunk/LayoutTests/js/dom/Promise-simple-resolve-expected.txt        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+Test Promise.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+PASS result is &quot;hello&quot;
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisesimpleresolvehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/js/dom/Promise-simple-resolve.html (0 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-simple-resolve.html                                (rev 0)
+++ trunk/LayoutTests/js/dom/Promise-simple-resolve.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -0,0 +1,27 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;div id=&quot;description&quot;&gt;&lt;/div&gt;
+&lt;div id=&quot;console&quot;&gt;&lt;/div&gt;
+&lt;script&gt;
+description('Test Promise.');
+
+window.jsTestIsAsync = true;
+
+var future = new Promise(function(resolve) {
+  setTimeout(function() {
+    resolve('hello');
+  }, 0);
+}).then(function(result) {
+  window.result = result;
+  shouldBeEqualToString('result', 'hello');
+  finishJSTest();
+});
+
+&lt;/script&gt;
+&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisesimplehtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/Promise-simple.html (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-simple.html        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-simple.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -11,24 +11,26 @@
</span><span class="cx"> 
</span><span class="cx"> window.jsTestIsAsync = true;
</span><span class="cx"> 
</span><del>-var resolver;
</del><ins>+var resolve;
</ins><span class="cx"> 
</span><del>-var firstPromise = new Promise(function(newResolver) {
</del><ins>+var firstPromise = new Promise(function(newResolve) {
</ins><span class="cx">   window.thisInInit = this;
</span><del>-  resolver = newResolver;
</del><ins>+  resolve = newResolve;
</ins><span class="cx"> });
</span><span class="cx"> 
</span><span class="cx"> var secondPromise = firstPromise.then(function(result) {
</span><span class="cx">   window.thisInFulfillCallback = this;
</span><del>-  shouldBeTrue('thisInFulfillCallback === secondPromise');
</del><ins>+  shouldBeFalse('thisInFulfillCallback === secondPromise');
+  shouldBeTrue('thisInFulfillCallback === window');
</ins><span class="cx">   window.result = result;
</span><span class="cx">   shouldBeEqualToString('result', 'hello');
</span><span class="cx">   finishJSTest();
</span><span class="cx"> });
</span><span class="cx"> 
</span><del>-shouldBeTrue('thisInInit === firstPromise');
</del><ins>+shouldBeFalse('thisInInit === firstPromise');
+shouldBeTrue('thisInInit === window');
</ins><span class="cx"> 
</span><del>-resolver.fulfill('hello');
</del><ins>+resolve('hello');
</ins><span class="cx"> 
</span><span class="cx"> &lt;/script&gt;
</span><span class="cx"> &lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisestaticallexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/js/dom/Promise-static-all-expected.txt (0 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-static-all-expected.txt                                (rev 0)
+++ trunk/LayoutTests/js/dom/Promise-static-all-expected.txt        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -0,0 +1,8 @@
</span><ins>+Test Promise.all
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisestaticallhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/js/dom/Promise-static-all.html (0 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-static-all.html                                (rev 0)
+++ trunk/LayoutTests/js/dom/Promise-static-all.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -0,0 +1,107 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;div id=&quot;description&quot;&gt;&lt;/div&gt;
+&lt;div id=&quot;console&quot;&gt;&lt;/div&gt;
+&lt;script&gt;
+description('Test Promise.all');
+
+/*
+window.jsTestIsAsync = true;
+result = undefined;
+
+var p1 = new Promise(function(resolve) { resolve('p1'); });
+var p2 = new Promise(function(resolve) { resolve('p2'); });
+var p3 = new Promise(function(resolve) { resolve('p3'); });
+var p4 = new Promise(function() {});
+var p5 = new Promise(function() {});
+var p6 = new Promise(function(_, reject) { reject('p6'); });
+var p7 = new Promise(function(_, reject) { reject('p7'); });
+var p8 = new Promise(function(_, reject) { reject('p8'); });
+var p9 = new Promise(function(resolve) { resolve(p2); });
+
+Promise.all([p1, p2, p5]).then(function(result) {
+  testFailed('Promise.all([p1, p2, p5]) is fulfilled.');
+}, function() {
+  testFailed('Promise.all([p1, p2, p5]) is rejected.');
+});
+
+Promise.all().then(function(result) {
+  testPassed('Promise.all() is fulfilled.');
+  window.result = result;
+  shouldBe('result.length', '0');
+}, function() {
+  testFailed('Promise.all() is rejected.');
+}).then(function() {
+  return Promise.all([p1, p2, p3]).then(function(result) {
+    testPassed('Promise.all([p1, p2, p3]) is fulfilled.');
+    window.result = result;
+    shouldBe('result.length', '3');
+    shouldBeEqualToString('result[0]', 'p1');
+    shouldBeEqualToString('result[1]', 'p2');
+    shouldBeEqualToString('result[2]', 'p3');
+  }, function() {
+    testFailed('Promise.all([p1, p2, p3]) is rejected.');
+  });
+}).then(function() {
+  return Promise.all([p1, p6, p5]).then(function(result) {
+    testFailed('Promise.all([p1, p6, p5]) is fulfilled.');
+  }, function(result) {
+    testPassed('Promise.all([p1, p6, p5]) is rejected.');
+    window.result = result;
+    shouldBeEqualToString('result', 'p6');
+  });
+}).then(function() {
+  return Promise.all([p9]).then(function(result) {
+    testPassed('Promise.all([p9]) is fulfilled.');
+    window.result = result;
+    shouldBe('result.length', '1');
+    shouldBeEqualToString('result[0]', 'p2');
+  }, function(result) {
+    testFailed('Promise.all([p9]) is rejected.');
+  });
+}).then(function() {
+  // Array hole should not be skipped.
+  return Promise.all([p9,,,]).then(function(result) {
+    testPassed('Promise.all([p9,,,]) is fulfilled.');
+    window.result = result;
+    shouldBe('result.length', '3');
+    shouldBeEqualToString('result[0]', 'p2');
+    shouldBe('result[1]', 'undefined');
+    shouldBe('result[2]', 'undefined');
+  }, function(result) {
+    testFailed('Promise.all([p9,,,]) is rejected.');
+  });
+}).then(function() {
+  // Immediate value should be converted to a promise object by the
+  // ToPromise operation.
+  return Promise.all([p9,42]).then(function(result) {
+    testPassed('Promise.all([p9,42]) is fulfilled.');
+    window.result = result;
+    shouldBe('result.length', '2');
+    shouldBeEqualToString('result[0]', 'p2');
+    shouldBe('result[1]', '42');
+  }, function(result) {
+    testFailed('Promise.all([p9,42]) is rejected.');
+  });
+}).then(function() {
+  // Not iterable object case.
+  return Promise.all({}).then(function(result) {
+    testPassed('Promise.all({}) is fulfilled.');
+    window.result = result;
+    shouldBe('result.length', '0');
+  }, function(result) {
+    testFailed('Promise.all({}) is rejected.');
+  });
+}).then(finishJSTest, finishJSTest);
+
+shouldBe('result', 'undefined');
+*/
+
+&lt;/script&gt;
+&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisestaticcastexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/js/dom/Promise-static-cast-expected.txt (0 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-static-cast-expected.txt                                (rev 0)
+++ trunk/LayoutTests/js/dom/Promise-static-cast-expected.txt        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -0,0 +1,14 @@
</span><ins>+Test Promise.cast
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+PASS promise === value is true
+PASS result is undefined
+PASS result2 is undefined
+PASS result is &quot;hello&quot;
+PASS result2 is 42
+PASS fulfilled
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisestaticcasthtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/js/dom/Promise-static-cast.html (0 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-static-cast.html                                (rev 0)
+++ trunk/LayoutTests/js/dom/Promise-static-cast.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -0,0 +1,45 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;div id=&quot;description&quot;&gt;&lt;/div&gt;
+&lt;div id=&quot;console&quot;&gt;&lt;/div&gt;
+&lt;script&gt;
+description('Test Promise.cast');
+
+window.jsTestIsAsync = true;
+result = undefined;
+result2 = undefined;
+
+var resolve;
+var value = new Promise(function (r) { resolve = r;} );
+var promise = Promise.cast(value);
+
+// If [[IsPromise]] is true, Promise.cast simply returns argument.
+shouldBeTrue('promise === value');
+
+promise.then(function(res) {
+  result = res;
+  shouldBeEqualToString('result', 'hello');
+
+  return Promise.cast(42).then(function (res) {
+      result2 = res;
+      shouldBe('result2', '42');
+  });
+}).then(function () {
+  testPassed('fulfilled');
+  finishJSTest();
+}, function() {
+  testFailed('rejected');
+  finishJSTest();
+});
+
+resolve('hello');
+shouldBe('result', 'undefined');
+shouldBe('result2', 'undefined');
+&lt;/script&gt;
+&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisestaticfulfillexpectedtxt"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/js/dom/Promise-static-fulfill-expected.txt (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-static-fulfill-expected.txt        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-static-fulfill-expected.txt        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -1,10 +0,0 @@
</span><del>-Test Promise.
-
-On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
-
-PASS result is undefined
-PASS result is &quot;hello&quot;
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
</del></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisestaticfulfillhtml"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/js/dom/Promise-static-fulfill.html (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-static-fulfill.html        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-static-fulfill.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -1,27 +0,0 @@
</span><del>-&lt;!DOCTYPE html&gt;
-&lt;html&gt;
-&lt;head&gt;
-&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
-&lt;/head&gt;
-&lt;body&gt;
-&lt;div id=&quot;description&quot;&gt;&lt;/div&gt;
-&lt;div id=&quot;console&quot;&gt;&lt;/div&gt;
-&lt;script&gt;
-description('Test Promise.');
-
-window.jsTestIsAsync = true;
-result = undefined;
-
-Promise.fulfill('hello').then(function(result) {
-  window.result = result;
-  shouldBeEqualToString('result', 'hello');
-  finishJSTest();
-}, function(result) {
-  testFailed('rejected');
-  finishJSTest();
-});
-shouldBe('result', 'undefined');
-&lt;/script&gt;
-&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
-&lt;/body&gt;
-&lt;/html&gt;
</del></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisestaticraceexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/js/dom/Promise-static-race-expected.txt (0 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-static-race-expected.txt                                (rev 0)
+++ trunk/LayoutTests/js/dom/Promise-static-race-expected.txt        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -0,0 +1,8 @@
</span><ins>+Test Promise.race
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisestaticracehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/js/dom/Promise-static-race.html (0 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-static-race.html                                (rev 0)
+++ trunk/LayoutTests/js/dom/Promise-static-race.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -0,0 +1,99 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;div id=&quot;description&quot;&gt;&lt;/div&gt;
+&lt;div id=&quot;console&quot;&gt;&lt;/div&gt;
+&lt;script&gt;
+description('Test Promise.race');
+
+/*
+window.jsTestIsAsync = true;
+result = undefined;
+
+var p1 = new Promise(function(resolve) { resolve('p1'); });
+var p2 = new Promise(function(resolve) { resolve('p2'); });
+var p3 = new Promise(function(resolve) { resolve('p3'); });
+var p4 = new Promise(function() {});
+var p5 = new Promise(function() {});
+var p6 = new Promise(function(_, reject) { reject('p6'); });
+var p7 = new Promise(function(_, reject) { reject('p7'); });
+var p8 = new Promise(function(_, reject) { reject('p8'); });
+var p9 = new Promise(function(resolve) { resolve(p2); });
+
+Promise.race([p4, p5]).then(function(result) {
+  testFailed('Promise.race([p4, p5]) is fulfilled.');
+}, function() {
+  testFailed('Promise.race([p4, p5]) is rejected.');
+});
+
+Promise.race().then(function(result) {
+  testFailed('Promise.race() is fulfilled.');
+}, function() {
+  testFailed('Promise.race() is rejected.');
+});
+
+Promise.race({}).then(function(result) {
+  testFailed('Promise.race({}) is fulfilled.');
+}, function() {
+  testFailed('Promise.race({}) is rejected.');
+});
+
+// If the argument is an empty array, the result promise won't be fulfilled.
+Promise.race([]).then(function(result) {
+  testFailed('Promise.race([]) is fulfilled.');
+}, function() {
+  testFailed('Promise.race([]) is rejected.');
+});
+
+Promise.race([p4, p1, p6]).then(function(result) {
+  testPassed('Promise.race([p4, p1, p6]) is fulfilled.');
+  window.result = result;
+  shouldBeEqualToString('result', 'p1');
+}, function() {
+  testFailed('Promise.race([p4, p1, p6]) is rejected.');
+}).then(function() {
+  return Promise.race([p4, p6, p1]).then(function(result) {
+    testFailed('Promise.race([p4, p6, p1]) is fulfilled.');
+  }, function(result) {
+    testPassed('Promise.race([p4, p6, p1]) is rejected.');
+    window.result = result;
+    shouldBeEqualToString('result', 'p6');
+  });
+}).then(function() {
+  return Promise.race([p9]).then(function(result) {
+    testPassed('Promise.race([p9]) is fulfilled.');
+    window.result = result;
+    shouldBeEqualToString('result', 'p2');
+  }, function() {
+    testFailed('Promise.race([p9]) is rejected.');
+  });
+}).then(function() {
+  // Array hole should not be skipped.
+  return Promise.race([p4,,]).then(function(result) {
+    testPassed('Promise.race([p4,,]) is fulfilled.');
+    window.result = result;
+    shouldBe('result', 'undefined');
+  }, function() {
+    testFailed('Promise.race([p4,,]) is rejected.');
+  });
+}).then(function() {
+  // Immediate value should be converted to a promise object by the
+  // ToPromise operation.
+  return Promise.race([p4,42]).then(function(result) {
+    testPassed('Promise.race([p4,42]) is fulfilled.');
+    window.result = result;
+    shouldBe('result', '42');
+  }, function() {
+    testFailed('Promise.race([p4,42]) is rejected.');
+  });
+}).then(finishJSTest, finishJSTest);
+
+shouldBe('result', 'undefined');
+*/
+&lt;/script&gt;
+&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisestaticresolvehtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/Promise-static-resolve.html (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-static-resolve.html        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-static-resolve.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -12,8 +12,8 @@
</span><span class="cx"> window.jsTestIsAsync = true;
</span><span class="cx"> result = undefined;
</span><span class="cx"> 
</span><del>-var resolver;
-var promise = Promise.resolve(new Promise(function (r) { resolver = r;} ));
</del><ins>+var resolve;
+var promise = Promise.resolve(new Promise(function (r) { resolve = r;} ));
</ins><span class="cx"> 
</span><span class="cx"> promise.then(function(result) {
</span><span class="cx">   window.result = result;
</span><span class="lines">@@ -24,7 +24,7 @@
</span><span class="cx">   finishJSTest();
</span><span class="cx"> });
</span><span class="cx"> 
</span><del>-resolver.resolve('hello');
</del><ins>+resolve('hello');
</ins><span class="cx"> shouldBe('result', 'undefined');
</span><span class="cx"> &lt;/script&gt;
</span><span class="cx"> &lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisethencallbackreceiverexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/js/dom/Promise-then-callback-receiver-expected.txt (0 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-then-callback-receiver-expected.txt                                (rev 0)
+++ trunk/LayoutTests/js/dom/Promise-then-callback-receiver-expected.txt        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -0,0 +1,16 @@
</span><ins>+Test Promise.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+PASS fulfilled
+PASS thisInOnFulfilledSloppy is window
+PASS rejected
+PASS thisInOnRejectedSloppy is window
+PASS fulfilled
+PASS thisInOnFulfilledStrict is undefined
+PASS rejected
+PASS thisInOnRejectedStrict is undefined
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisethencallbackreceiverhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/js/dom/Promise-then-callback-receiver.html (0 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-then-callback-receiver.html                                (rev 0)
+++ trunk/LayoutTests/js/dom/Promise-then-callback-receiver.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -0,0 +1,61 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;div id=&quot;description&quot;&gt;&lt;/div&gt;
+&lt;div id=&quot;console&quot;&gt;&lt;/div&gt;
+&lt;script&gt;
+window.jsTestIsAsync = true;
+
+description('Test Promise.');
+
+var thisInOnFulfilledSloppy;
+var thisInOnRejectedSloppy;
+
+var thisInOnFulfilledStrict;
+var thisInOnRejectedStrict;
+
+Promise.resolve().then(function () {
+  return Promise.resolve(42).then(function () {
+    testPassed('fulfilled');
+    window.thisInOnFulfilledSloppy = this;
+    shouldBe('thisInOnFulfilledSloppy', 'window');
+  }, function () {
+    testFailed('rejected');
+  });
+}).then(function () {
+  return Promise.reject(42).then(function () {
+    testFailed('fulfilled');
+  }, function () {
+    testPassed('rejected');
+    window.thisInOnRejectedSloppy = this;
+    shouldBe('thisInOnRejectedSloppy', 'window');
+  });
+}).then(function () {
+  return Promise.resolve(42).then(function () {
+    'use strict';
+    testPassed('fulfilled');
+    window.thisInOnFulfilledStrict = this;
+    shouldBe('thisInOnFulfilledStrict', 'undefined');
+  }, function () {
+    'use strict';
+    testFailed('rejected');
+  });
+}).then(function () {
+  return Promise.reject(42).then(function () {
+    'use strict';
+    testFailed('fulfilled');
+  }, function () {
+    'use strict';
+    testPassed('rejected');
+    window.thisInOnRejectedStrict = this;
+    shouldBe('thisInOnRejectedStrict', 'undefined');
+  });
+}).then(finishJSTest, finishJSTest);
+
+&lt;/script&gt;
+&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisethenexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/Promise-then-expected.txt (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-then-expected.txt        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-then-expected.txt        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -2,15 +2,18 @@
</span><span class="cx"> 
</span><span class="cx"> On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
</span><span class="cx"> 
</span><del>-PASS thisInInit === firstPromise is true
</del><ins>+PASS thisInInit === firstPromise is false
+PASS thisInInit === window is true
</ins><span class="cx"> PASS firstPromise instanceof Promise is true
</span><span class="cx"> PASS secondPromise instanceof Promise is true
</span><del>-PASS firstPromise.then(null) threw exception TypeError: Expected function or undefined as as first argument.
-PASS firstPromise.then(undefined, null) threw exception TypeError: Expected function or undefined as as second argument.
-PASS firstPromise.then(37) threw exception TypeError: Expected function or undefined as as first argument.
</del><span class="cx"> PASS thisInFulfillCallback === firstPromise is false
</span><del>-PASS thisInFulfillCallback === secondPromise is true
</del><ins>+PASS thisInFulfillCallback === secondPromise is false
+PASS thisInFulfillCallback === window is true
</ins><span class="cx"> PASS result is &quot;hello&quot;
</span><ins>+PASS result is &quot;world&quot;
+PASS rejected
+PASS result is &quot;exception&quot;
+PASS resolved
</ins><span class="cx"> PASS successfullyParsed is true
</span><span class="cx"> 
</span><span class="cx"> TEST COMPLETE
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisetheninworkersexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/Promise-then-in-workers-expected.txt (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-then-in-workers-expected.txt        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-then-in-workers-expected.txt        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -3,15 +3,18 @@
</span><span class="cx"> On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
</span><span class="cx"> 
</span><span class="cx"> Starting worker: ../resources/Promise-then-in-workers.js
</span><del>-PASS [Worker] thisInInit === firstPromise is true
</del><ins>+PASS [Worker] thisInInit === firstPromise is false
+PASS [Worker] thisInInit === global is true
</ins><span class="cx"> PASS [Worker] firstPromise instanceof Promise is true
</span><span class="cx"> PASS [Worker] secondPromise instanceof Promise is true
</span><del>-PASS [Worker] firstPromise.then(null) threw exception TypeError: Expected function or undefined as as first argument.
-PASS [Worker] firstPromise.then(undefined, null) threw exception TypeError: Expected function or undefined as as second argument.
-PASS [Worker] firstPromise.then(37) threw exception TypeError: Expected function or undefined as as first argument.
</del><span class="cx"> PASS [Worker] thisInFulfillCallback === firstPromise is false
</span><del>-PASS [Worker] thisInFulfillCallback === secondPromise is true
</del><ins>+PASS [Worker] thisInFulfillCallback === secondPromise is false
+PASS [Worker] thisInFulfillCallback === global is true
</ins><span class="cx"> PASS [Worker] result is &quot;hello&quot;
</span><ins>+PASS [Worker] result is &quot;world&quot;
+PASS [Worker] rejected
+PASS [Worker] result is &quot;exception&quot;
+PASS [Worker] resolved
</ins><span class="cx"> PASS successfullyParsed is true
</span><span class="cx"> 
</span><span class="cx"> TEST COMPLETE
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisethenwithoutcallbackshtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/Promise-then-without-callbacks.html (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-then-without-callbacks.html        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-then-without-callbacks.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -11,7 +11,7 @@
</span><span class="cx"> 
</span><span class="cx"> window.jsTestIsAsync = true;
</span><span class="cx"> 
</span><del>-new Promise(function(r) { r.fulfill('hello'); })
</del><ins>+new Promise(function(resolve) { resolve('hello'); })
</ins><span class="cx">   .then()
</span><span class="cx">   .then(function(result) {
</span><span class="cx">     window.result = result;
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisethenhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/Promise-then.html (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-then.html        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-then.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -11,31 +11,47 @@
</span><span class="cx"> 
</span><span class="cx"> window.jsTestIsAsync = true;
</span><span class="cx"> 
</span><del>-var resolver;
</del><ins>+var resolve;
</ins><span class="cx"> 
</span><del>-var firstPromise = new Promise(function(newResolver) {
</del><ins>+var firstPromise = new Promise(function(newResolve) {
</ins><span class="cx">   window.thisInInit = this;
</span><del>-  resolver = newResolver;
</del><ins>+  resolve = newResolve;
</ins><span class="cx"> });
</span><span class="cx"> 
</span><span class="cx"> var secondPromise = firstPromise.then(function(result) {
</span><span class="cx">   window.thisInFulfillCallback = this;
</span><span class="cx">   shouldBeFalse('thisInFulfillCallback === firstPromise');
</span><del>-  shouldBeTrue('thisInFulfillCallback === secondPromise');
</del><ins>+  shouldBeFalse('thisInFulfillCallback === secondPromise');
+  shouldBeTrue('thisInFulfillCallback === window');
</ins><span class="cx">   window.result = result;
</span><span class="cx">   shouldBeEqualToString('result', 'hello');
</span><del>-  finishJSTest();
</del><ins>+  return 'world';
</ins><span class="cx"> });
</span><span class="cx"> 
</span><del>-shouldBeTrue('thisInInit === firstPromise');
</del><ins>+shouldBeFalse('thisInInit === firstPromise');
+shouldBeTrue('thisInInit === window');
</ins><span class="cx"> shouldBeTrue('firstPromise instanceof Promise');
</span><span class="cx"> shouldBeTrue('secondPromise instanceof Promise');
</span><span class="cx"> 
</span><del>-shouldThrow('firstPromise.then(null)', '&quot;TypeError: Expected function or undefined as as first argument&quot;');
-shouldThrow('firstPromise.then(undefined, null)', '&quot;TypeError: Expected function or undefined as as second argument&quot;');
-shouldThrow('firstPromise.then(37)', '&quot;TypeError: Expected function or undefined as as first argument&quot;');
</del><ins>+secondPromise.then(null, 37).then(function(result) {
+  window.result = result;
+  shouldBeEqualToString('result', 'world');
+  throw 'exception'
+}).then(1, 2).then(function() {
+  testFailed('resolved');
+}, function(result) {
+  testPassed('rejected');
+  window.result = result;
+  shouldBeEqualToString('result', 'exception');
+}).then(function() {
+  testPassed('resolved');
+  finishJSTest();
+}, function() {
+  testFailed('rejected');
+  finishJSTest();
+});
</ins><span class="cx"> 
</span><del>-resolver.fulfill('hello');
</del><ins>+resolve('hello');
</ins><span class="cx"> 
</span><span class="cx"> &lt;/script&gt;
</span><span class="cx"> &lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisetypesexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/Promise-types-expected.txt (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-types-expected.txt        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-types-expected.txt        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -11,61 +11,36 @@
</span><span class="cx"> PASS String(aPromise) is '[object Promise]'
</span><span class="cx"> PASS aPromise.then is defined.
</span><span class="cx"> PASS aPromise.then is an instance of Function
</span><del>-PASS aPromise.then.length is 0
</del><ins>+PASS aPromise.then.length is 2
</ins><span class="cx"> PASS aPromise.catch is defined.
</span><span class="cx"> PASS aPromise.catch is an instance of Function
</span><del>-PASS aPromise.catch.length is 0
</del><ins>+PASS aPromise.catch.length is 1
</ins><span class="cx"> 
</span><span class="cx"> Promise constructor
</span><span class="cx"> 
</span><span class="cx"> PASS Promise.length is 1
</span><del>-PASS new Promise() threw exception TypeError: Expected at least one argument.
-PASS new Promise(1) threw exception TypeError: Expected function as as first argument.
-PASS new Promise('hello') threw exception TypeError: Expected function as as first argument.
-PASS new Promise([]) threw exception TypeError: Expected function as as first argument.
-PASS new Promise({}) threw exception TypeError: Expected function as as first argument.
-PASS new Promise(null) threw exception TypeError: Expected function as as first argument.
-PASS new Promise(undefined) threw exception TypeError: Expected function as as first argument.
-PASS new Promise(function(resolver) { resolver.resolve(1); }) did not throw exception.
-PASS Promise() threw exception TypeError: Function is not a function (evaluating 'Promise()').
</del><ins>+PASS new Promise() threw exception TypeError: Promise constructor takes a function argument.
+PASS new Promise(1) threw exception TypeError: Promise constructor takes a function argument.
+PASS new Promise('hello') threw exception TypeError: Promise constructor takes a function argument.
+PASS new Promise([]) threw exception TypeError: Promise constructor takes a function argument.
+PASS new Promise({}) threw exception TypeError: Promise constructor takes a function argument.
+PASS new Promise(null) threw exception TypeError: Promise constructor takes a function argument.
+PASS new Promise(undefined) threw exception TypeError: Promise constructor takes a function argument.
</ins><span class="cx"> 
</span><span class="cx"> Promise statics
</span><span class="cx"> 
</span><del>-PASS Promise.fulfill is an instance of Function
-PASS Promise.fulfill.length is 1
-PASS Promise.fulfill() threw exception TypeError: Expected at least one argument.
-PASS Promise.fulfill(1) did not throw exception.
</del><span class="cx"> PASS Promise.resolve is an instance of Function
</span><span class="cx"> PASS Promise.resolve.length is 1
</span><del>-PASS Promise.resolve() threw exception TypeError: Expected at least one argument.
</del><span class="cx"> PASS Promise.resolve(1) did not throw exception.
</span><span class="cx"> PASS Promise.reject is an instance of Function
</span><span class="cx"> PASS Promise.reject.length is 1
</span><del>-PASS Promise.reject() threw exception TypeError: Expected at least one argument.
</del><span class="cx"> PASS Promise.reject(1) did not throw exception.
</span><del>-PASS Promise.fulfill(1) is an instance of Promise
</del><ins>+PASS Promise.cast is an instance of Function
+PASS Promise.cast.length is 1
+PASS Promise.cast(1) did not throw exception.
</ins><span class="cx"> PASS Promise.resolve(1) is an instance of Promise
</span><span class="cx"> PASS Promise.reject(1) is an instance of Promise
</span><del>-
-PromiseResolver
-
-aResolver is from new Promise(function(aResolver) { ... })
-PASS aResolver is an instance of PromiseResolver
-PASS String(aResolver) is '[object PromiseResolver]'
-PASS aResolver.fulfill is an instance of Function
-PASS aResolver.fulfill.length is 1
-PASS aResolver.resolve is an instance of Function
-PASS aResolver.resolve.length is 1
-PASS aResolver.reject is an instance of Function
-PASS aResolver.reject.length is 1
-PASS resolverFulfill() threw exception TypeError: Receiver of fulfill must be a PromiseResolver.
-PASS resolverResolve() threw exception TypeError: Receiver of resolve must be a PromiseResolver.
-PASS resolverReject() threw exception TypeError: Receiver of reject must be a PromiseResolver.
-
-PromiseResolver constructor
-
-PASS new PromiseResolver() threw exception TypeError: Function is not a constructor (evaluating 'new PromiseResolver()').
-
</del><ins>+PASS Promise.cast(1) is an instance of Promise
</ins><span class="cx"> PASS successfullyParsed is true
</span><span class="cx"> 
</span><span class="cx"> TEST COMPLETE
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisetypeshtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/Promise-types.html (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise-types.html        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise-types.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -27,10 +27,10 @@
</span><span class="cx"> 
</span><span class="cx"> shouldBeDefined(&quot;aPromise.then&quot;);
</span><span class="cx"> shouldBeType(&quot;aPromise.then&quot;, &quot;Function&quot;);
</span><del>-shouldBe(&quot;aPromise.then.length&quot;, &quot;0&quot;);
</del><ins>+shouldBe(&quot;aPromise.then.length&quot;, &quot;2&quot;);
</ins><span class="cx"> shouldBeDefined(&quot;aPromise.catch&quot;);
</span><span class="cx"> shouldBeType(&quot;aPromise.catch&quot;, &quot;Function&quot;);
</span><del>-shouldBe(&quot;aPromise.catch.length&quot;, &quot;0&quot;);
</del><ins>+shouldBe(&quot;aPromise.catch.length&quot;, &quot;1&quot;);
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> // Promise constructor
</span><span class="lines">@@ -43,18 +43,13 @@
</span><span class="cx"> shouldThrow(&quot;new Promise()&quot;);
</span><span class="cx"> 
</span><span class="cx"> // Parameter must be a function.
</span><del>-shouldThrow(&quot;new Promise(1)&quot;, &quot;'TypeError: Expected function as as first argument'&quot;);
-shouldThrow(&quot;new Promise('hello')&quot;, &quot;'TypeError: Expected function as as first argument'&quot;);
-shouldThrow(&quot;new Promise([])&quot;, &quot;'TypeError: Expected function as as first argument'&quot;);
-shouldThrow(&quot;new Promise({})&quot;, &quot;'TypeError: Expected function as as first argument'&quot;);
-shouldThrow(&quot;new Promise(null)&quot;, &quot;'TypeError: Expected function as as first argument'&quot;);
-shouldThrow(&quot;new Promise(undefined)&quot;, &quot;'TypeError: Expected function as as first argument'&quot;);
-shouldNotThrow(&quot;new Promise(function(resolver) { resolver.resolve(1); })&quot;);
</del><ins>+shouldThrow(&quot;new Promise(1)&quot;, &quot;'TypeError: Promise constructor takes a function argument'&quot;);
+shouldThrow(&quot;new Promise('hello')&quot;, &quot;'TypeError: Promise constructor takes a function argument'&quot;);
+shouldThrow(&quot;new Promise([])&quot;, &quot;'TypeError: Promise constructor takes a function argument'&quot;);
+shouldThrow(&quot;new Promise({})&quot;, &quot;'TypeError: Promise constructor takes a function argument'&quot;);
+shouldThrow(&quot;new Promise(null)&quot;, &quot;'TypeError: Promise constructor takes a function argument'&quot;);
+shouldThrow(&quot;new Promise(undefined)&quot;, &quot;'TypeError: Promise constructor takes a function argument'&quot;);
</ins><span class="cx"> 
</span><del>-// Can't be called as a function
-shouldThrow(&quot;Promise()&quot;);
-
-
</del><span class="cx"> // Promise statics
</span><span class="cx"> debug(&quot;&quot;);
</span><span class="cx"> debug(&quot;Promise statics&quot;);
</span><span class="lines">@@ -62,68 +57,23 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> // Need at least one parameter.
</span><del>-shouldBeType(&quot;Promise.fulfill&quot;, &quot;Function&quot;);
-shouldBe(&quot;Promise.fulfill.length&quot;, &quot;1&quot;);
-shouldThrow(&quot;Promise.fulfill()&quot;, &quot;'TypeError: Expected at least one argument'&quot;);
-shouldNotThrow(&quot;Promise.fulfill(1)&quot;);
-
</del><span class="cx"> shouldBeType(&quot;Promise.resolve&quot;, &quot;Function&quot;);
</span><span class="cx"> shouldBe(&quot;Promise.resolve.length&quot;, &quot;1&quot;);
</span><del>-shouldThrow(&quot;Promise.resolve()&quot;, &quot;'TypeError: Expected at least one argument'&quot;);
</del><span class="cx"> shouldNotThrow(&quot;Promise.resolve(1)&quot;);
</span><span class="cx"> 
</span><span class="cx"> shouldBeType(&quot;Promise.reject&quot;, &quot;Function&quot;);
</span><span class="cx"> shouldBe(&quot;Promise.reject.length&quot;, &quot;1&quot;);
</span><del>-shouldThrow(&quot;Promise.reject()&quot;, &quot;'TypeError: Expected at least one argument'&quot;);
</del><span class="cx"> shouldNotThrow(&quot;Promise.reject(1)&quot;);
</span><span class="cx"> 
</span><ins>+shouldBeType(&quot;Promise.cast&quot;, &quot;Function&quot;);
+shouldBe(&quot;Promise.cast.length&quot;, &quot;1&quot;);
+shouldNotThrow(&quot;Promise.cast(1)&quot;);
+
</ins><span class="cx"> // Should return Promise objects.
</span><del>-shouldBeType(&quot;Promise.fulfill(1)&quot;, &quot;Promise&quot;);
</del><span class="cx"> shouldBeType(&quot;Promise.resolve(1)&quot;, &quot;Promise&quot;);
</span><span class="cx"> shouldBeType(&quot;Promise.reject(1)&quot;, &quot;Promise&quot;);
</span><ins>+shouldBeType(&quot;Promise.cast(1)&quot;, &quot;Promise&quot;);
</ins><span class="cx"> 
</span><del>-
-
-// PromiseResolver
-debug(&quot;&quot;);
-debug(&quot;PromiseResolver&quot;);
-debug(&quot;&quot;);
-
-var aResolver;
-var resolverFulfill;
-var resolverResolve;
-var resolverReject;
-
-new Promise(function(r) {
-    aResolver = r;
-
-    // The resolver should be of type PromiseResolver.
-    debug(&quot;aResolver is from new Promise(function(aResolver) { ... })&quot;)
-    shouldBeType(&quot;aResolver&quot;, &quot;PromiseResolver&quot;);
-    shouldBe(&quot;String(aResolver)&quot;, &quot;'[object PromiseResolver]'&quot;);
-    shouldBeType(&quot;aResolver.fulfill&quot;, &quot;Function&quot;);
-    shouldBe(&quot;aResolver.fulfill.length&quot;, &quot;1&quot;);
-    shouldBeType(&quot;aResolver.resolve&quot;, &quot;Function&quot;);
-    shouldBe(&quot;aResolver.resolve.length&quot;, &quot;1&quot;);
-    shouldBeType(&quot;aResolver.reject&quot;, &quot;Function&quot;);
-    shouldBe(&quot;aResolver.reject.length&quot;, &quot;1&quot;);
-
-    // Resolvers functions must be called on the resolver.
-    resolverFulfill = aResolver.fulfill;
-    shouldThrow(&quot;resolverFulfill()&quot;, &quot;'TypeError: Receiver of fulfill must be a PromiseResolver'&quot;);
-    resolverResolve = aResolver.resolve;
-    shouldThrow(&quot;resolverResolve()&quot;, &quot;'TypeError: Receiver of resolve must be a PromiseResolver'&quot;);
-    resolverReject = aResolver.reject;
-    shouldThrow(&quot;resolverReject()&quot;, &quot;'TypeError: Receiver of reject must be a PromiseResolver'&quot;);
-});
-
-debug(&quot;&quot;);
-debug(&quot;PromiseResolver constructor&quot;);
-debug(&quot;&quot;);
-
-shouldThrow(&quot;new PromiseResolver()&quot;);
-
-debug(&quot;&quot;);
</del><span class="cx"> &lt;/script&gt;
</span><span class="cx"> &lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
</span><span class="cx"> &lt;/body&gt;
</span></span></pre></div>
<a id="trunkLayoutTestsjsdomPromisehtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/dom/Promise.html (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/dom/Promise.html        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/dom/Promise.html        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -15,67 +15,115 @@
</span><span class="cx"> 
</span><span class="cx"> window.jsTestIsAsync = true;
</span><span class="cx"> 
</span><del>-function test(_a, _b)
-{
-    if (isResultCorrect(_a, _b))
-        testPassed(stringify(_a) + &quot; is &quot; + stringify(_b));
-    else
-        testFailed(stringify(_a) + &quot; should be &quot; + stringify(_b));
</del><ins>+function ok(_a, _msg) {
+  if (_a)
+    testPassed(_msg);
+  else
+    testFailed(_msg);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+function is(_a, _b, _msg) {
+  if (isResultCorrect(_a, _b))
+    testPassed(stringify(_a) + &quot; is &quot; + stringify(_b));
+  else
+    testFailed(stringify(_a) + &quot; should be &quot; + stringify(_b));
+}
+
+function isnot(_a, _b, _msg) {
+  if (!isResultCorrect(_a, _b))
+    testPassed(stringify(_a) + &quot; should not be &quot; + stringify(_b));
+  else
+    testFailed(stringify(_a) + &quot; is &quot; + stringify(_b));
+}
+
</ins><span class="cx"> function promiseResolve() {
</span><del>-  debug(&quot;Test Promise resolve.&quot;)
-  
-  var promise = new Promise(function(resolver) {
-    resolver.resolve(42);
</del><ins>+  ok(Promise, &quot;Promise object should exist&quot;);
+
+  var promise = new Promise(function(resolve, reject) {
+    ok(resolve, &quot;Promise.resolve exists&quot;);
+    ok(reject, &quot;Promise.reject exists&quot;);
+
+    resolve(42);
</ins><span class="cx">   }).then(function(what) {
</span><del>-    testPassed(&quot;Then.resolve has been called&quot;);
-    test(what, 42);
</del><ins>+    ok(true, &quot;Then - resolveCb has been called&quot;);
+    is(what, 42, &quot;ResolveCb received 42&quot;);
</ins><span class="cx">     runTest();
</span><span class="cx">   }, function() {
</span><del>-    testFailed(&quot;Then.reject has been called&quot;);
</del><ins>+    ok(false, &quot;Then - rejectCb has been called&quot;);
</ins><span class="cx">     runTest();
</span><span class="cx">   });
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+function promiseResolveNoArg() {
+  var promise = new Promise(function(resolve, reject) {
+    ok(resolve, &quot;Promise.resolve exists&quot;);
+    ok(reject, &quot;Promise.reject exists&quot;);
+
+    resolve();
+  }).then(function(what) {
+    ok(true, &quot;Then - resolveCb has been called&quot;);
+    is(what, undefined, &quot;ResolveCb received undefined&quot;);
+    runTest();
+  }, function() {
+    ok(false, &quot;Then - rejectCb has been called&quot;);
+    runTest();
+  });
+}
+
</ins><span class="cx"> function promiseReject() {
</span><del>-  debug(&quot;Test Promise reject.&quot;);
-  
-  var promise = new Promise(function(resolver) {
-    resolver.reject(42);
</del><ins>+  var promise = new Promise(function(resolve, reject) {
+    reject(42);
</ins><span class="cx">   }).then(function(what) {
</span><del>-    testFailed(&quot;Then.resolve has been called&quot;);
</del><ins>+    ok(false, &quot;Then - resolveCb has been called&quot;);
</ins><span class="cx">     runTest();
</span><span class="cx">   }, function(what) {
</span><del>-    testPassed(&quot;Then.reject has been called&quot;);
-    test(what, 42);
</del><ins>+    ok(true, &quot;Then - rejectCb has been called&quot;);
+    is(what, 42, &quot;RejectCb received 42&quot;);
</ins><span class="cx">     runTest();
</span><span class="cx">   });
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+function promiseRejectNoHandler() {
+  // This test only checks that the code that reports unhandled errors in the
+  // Promises implementation does not crash or leak.
+  var promise = new Promise(function(res, rej) {
+    noSuchMethod();
+  });
+  runTest();
+}
+
+function promiseRejectNoArg() {
+  var promise = new Promise(function(resolve, reject) {
+    reject();
+  }).then(function(what) {
+    ok(false, &quot;Then - resolveCb has been called&quot;);
+    runTest();
+  }, function(what) {
+    ok(true, &quot;Then - rejectCb has been called&quot;);
+    is(what, undefined, &quot;RejectCb received undefined&quot;);
+    runTest();
+  });
+}
+
</ins><span class="cx"> function promiseException() {
</span><del>-  debug(&quot;Test Promise reject.&quot;);
-
-  var promise = new Promise(function(resolver) {
</del><ins>+  var promise = new Promise(function(resolve, reject) {
</ins><span class="cx">     throw 42;
</span><span class="cx">   }).then(function(what) {
</span><del>-    testFailed(&quot;Then.resolve has been called&quot;);
</del><ins>+    ok(false, &quot;Then - resolveCb has been called&quot;);
</ins><span class="cx">     runTest();
</span><span class="cx">   }, function(what) {
</span><del>-    testPassed(&quot;Then.reject has been called&quot;);
-    test(what, 42);
</del><ins>+    ok(true, &quot;Then - rejectCb has been called&quot;);
+    is(what, 42, &quot;RejectCb received 42&quot;);
</ins><span class="cx">     runTest();
</span><span class="cx">   });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> function promiseGC() {
</span><del>-  debug(&quot;Test Promise gc.&quot;);
-  
-  var resolver;
-  var promise = new Promise(function(r) {
-    resolver = r;
</del><ins>+  var resolve;
+  var promise = new Promise(function(r1, r2) {
+    resolve = r1;
</ins><span class="cx">   }).then(function(what) {
</span><del>-    testPassed(&quot;Then - promise is still alive&quot;);
</del><ins>+    ok(true, &quot;Then - promise is still alive&quot;);
</ins><span class="cx">     runTest();
</span><span class="cx">   });
</span><span class="cx"> 
</span><span class="lines">@@ -83,189 +131,214 @@
</span><span class="cx"> 
</span><span class="cx">   gc();
</span><span class="cx"> 
</span><del>-  resolver.resolve(42);
</del><ins>+  resolve(42);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> function promiseAsync() {
</span><del>-  debug(&quot;Test Promise async.&quot;);
-
</del><span class="cx">   var global = &quot;foo&quot;;
</span><del>-  var f = new Promise(function(r) {
-    debug(&quot;Global should be foo&quot;);
-    test(global, 'foo');
-
-    r.resolve(42);
-
-    debug(&quot;Global should still be foo&quot;);
-    test(global, 'foo');
-
</del><ins>+  var f = new Promise(function(r1, r2) {
+    is(global, &quot;foo&quot;, &quot;Global should be foo&quot;);
+    r1(42);
+    is(global, &quot;foo&quot;, &quot;Global should still be foo&quot;);
</ins><span class="cx">     setTimeout(function() {
</span><del>-      debug(&quot;Global should be bar&quot;);
-      test(global, 'bar');
</del><ins>+      is(global, &quot;bar&quot;, &quot;Global should still be bar!&quot;);
</ins><span class="cx">       runTest();
</span><span class="cx">     }, 0);
</span><span class="cx">   }).then(function() {
</span><span class="cx">     global = &quot;bar&quot;;
</span><span class="cx">   });
</span><del>-
-  debug(&quot;Global should still be foo (2)&quot;);
-  test(global, 'foo');
</del><ins>+  is(global, &quot;foo&quot;, &quot;Global should still be foo (2)&quot;);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> function promiseDoubleThen() {
</span><del>-  debug(&quot;Test Promise double then.&quot;);
-
</del><span class="cx">   var steps = 0;
</span><del>-  var promise = new Promise(function(resolver) {
-    resolver.resolve(42);
</del><ins>+  var promise = new Promise(function(r1, r2) {
+    r1(42);
</ins><span class="cx">   });
</span><span class="cx"> 
</span><span class="cx">   promise.then(function(what) {
</span><del>-    testPassed(&quot;Then.resolve has been called&quot;);
-    test(what, 42);
</del><ins>+    ok(true, &quot;Then.resolve has been called&quot;);
+    is(what, 42, &quot;Value == 42&quot;);
</ins><span class="cx">     steps++;
</span><span class="cx">   }, function(what) {
</span><del>-    testFailed(&quot;Then.reject has been called&quot;);
</del><ins>+    ok(false, &quot;Then.reject has been called&quot;);
</ins><span class="cx">   });
</span><span class="cx"> 
</span><span class="cx">   promise.then(function(what) {
</span><del>-    testPassed(&quot;Then.resolve has been called&quot;);
-    test(steps, 1);
-    test(what, 42);
</del><ins>+    ok(true, &quot;Then.resolve has been called&quot;);
+    is(steps, 1, &quot;Then.resolve - step == 1&quot;);
+    is(what, 42, &quot;Value == 42&quot;);
</ins><span class="cx">     runTest();
</span><span class="cx">   }, function(what) {
</span><del>-    testFailed(&quot;Then.reject has been called&quot;);
</del><ins>+    ok(false, &quot;Then.reject has been called&quot;);
</ins><span class="cx">   });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> function promiseThenException() {
</span><del>-  debug(&quot;Test Promise - then / exception.&quot;);
-
-  var promise = new Promise(function(resolver) {
-    resolver.resolve(42);
</del><ins>+  var promise = new Promise(function(resolve, reject) {
+    resolve(42);
</ins><span class="cx">   });
</span><span class="cx"> 
</span><span class="cx">   promise.then(function(what) {
</span><del>-    testPassed(&quot;Then.resolve has been called&quot;);
</del><ins>+    ok(true, &quot;Then.resolve has been called&quot;);
</ins><span class="cx">     throw &quot;booh&quot;;
</span><span class="cx">   }).catch(function(e) {
</span><del>-    testPassed(&quot;Catch handler (e.g. the reject handler) called.&quot;);
</del><ins>+    ok(true, &quot;window.onerror has been called!&quot;);
</ins><span class="cx">     runTest();
</span><span class="cx">   });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> function promiseThenCatchThen() {
</span><del>-  debug(&quot;Test Promise - then / catch / then.&quot;);
-
-  var promise = new Promise(function(resolver) {
-    resolver.resolve(42);
</del><ins>+  var promise = new Promise(function(resolve, reject) {
+    resolve(42);
</ins><span class="cx">   });
</span><span class="cx"> 
</span><span class="cx">   var promise2 = promise.then(function(what) {
</span><del>-    testPassed(&quot;Then.resolve has been called&quot;);
-    test(what, 42);
</del><ins>+    ok(true, &quot;Then.resolve has been called&quot;);
+    is(what, 42, &quot;Value == 42&quot;);
</ins><span class="cx">     return what + 1;
</span><span class="cx">   }, function(what) {
</span><del>-    testFailed(&quot;Then.reject has been called&quot;);
</del><ins>+    ok(false, &quot;Then.reject has been called&quot;);
</ins><span class="cx">   });
</span><span class="cx"> 
</span><ins>+  isnot(promise, promise2, &quot;These 2 promise objs are different&quot;);
+
</ins><span class="cx">   promise2.then(function(what) {
</span><del>-    testPassed(&quot;Then.resolve has been called&quot;);
-    test(what, 43);
</del><ins>+    ok(true, &quot;Then.resolve has been called&quot;);
+    is(what, 43, &quot;Value == 43&quot;);
</ins><span class="cx">     return what + 1;
</span><span class="cx">   }, function(what) {
</span><del>-    testFailed(&quot;Then.reject has been called&quot;);
</del><ins>+    ok(false, &quot;Then.reject has been called&quot;);
</ins><span class="cx">   }).catch(function() {
</span><del>-    testFailed(&quot;Catch has been called&quot;);
</del><ins>+    ok(false, &quot;Catch has been called&quot;);
</ins><span class="cx">   }).then(function(what) {
</span><del>-    testPassed(&quot;Then.resolve has been called&quot;);
-    test(what, 44);
</del><ins>+    ok(true, &quot;Then.resolve has been called&quot;);
+    is(what, 44, &quot;Value == 44&quot;);
</ins><span class="cx">     runTest();
</span><span class="cx">   }, function(what) {
</span><del>-    testFailed(&quot;Then.reject has been called&quot;);
</del><ins>+    ok(false, &quot;Then.reject has been called&quot;);
</ins><span class="cx">   });
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-function promiseRejectThenCatchThen() {
-  debug(&quot;Test Promise - reject / then / catch / then.&quot;);
</del><ins>+function promiseThenNoArg() {
+  var promise = new Promise(function(resolve, reject) {
+    resolve(42);
+  });
</ins><span class="cx"> 
</span><del>-  var promise = new Promise(function(resolver) {
-    resolver.reject(42);
</del><ins>+  var clone = promise.then();
+  isnot(promise, clone, &quot;These 2 promise objs are different&quot;);
+  promise.then(function(v) {
+    clone.then(function(cv) {
+      is(v, cv, &quot;Both resolve to the same value&quot;);
+      runTest();
+    });
</ins><span class="cx">   });
</span><ins>+}
</ins><span class="cx"> 
</span><ins>+function promiseThenUndefinedResolveFunction() {
+  var promise = new Promise(function(resolve, reject) {
+    reject(42);
+  });
+
+  try {
+    promise.then(undefined, function(v) {
+      is(v, 42, &quot;Promise rejected with 42&quot;);
+      runTest();
+    });
+  } catch (e) {
+    ok(false, &quot;then should not throw on undefined resolve function&quot;);
+  }
+}
+
+function promiseThenNullResolveFunction() {
+  var promise = new Promise(function(resolve, reject) {
+    reject(42);
+  });
+
+  try {
+    promise.then(null, function(v) {
+      is(v, 42, &quot;Promise rejected with 42&quot;);
+      runTest();
+    });
+  } catch (e) {
+    ok(false, &quot;then should not throw on null resolve function&quot;);
+  }
+}
+
+function promiseRejectThenCatchThen() {
+  var promise = new Promise(function(resolve, reject) {
+    reject(42);
+  });
+
</ins><span class="cx">   var promise2 = promise.then(function(what) {
</span><del>-    testFailed(&quot;Then.resolve has been called&quot;);
</del><ins>+    ok(false, &quot;Then.resolve has been called&quot;);
</ins><span class="cx">   }, function(what) {
</span><del>-    testPassed(&quot;Then.reject has been called&quot;);
-    test(what, 42);
</del><ins>+    ok(true, &quot;Then.reject has been called&quot;);
+    is(what, 42, &quot;Value == 42&quot;);
</ins><span class="cx">     return what + 1;
</span><span class="cx">   });
</span><span class="cx"> 
</span><ins>+  isnot(promise, promise2, &quot;These 2 promise objs are different&quot;);
+
</ins><span class="cx">   promise2.then(function(what) {
</span><del>-    testPassed(&quot;Then.resolve has been called&quot;);
-    test(what, 43);
-    return what + 1;
</del><ins>+    ok(true, &quot;Then.resolve has been called&quot;);
+    is(what, 43, &quot;Value == 43&quot;);
+    return what+1;
</ins><span class="cx">   }).catch(function(what) {
</span><del>-    testFailed(&quot;Catch has been called&quot;);
</del><ins>+    ok(false, &quot;Catch has been called&quot;);
</ins><span class="cx">   }).then(function(what) {
</span><del>-    testPassed(&quot;Then.resolve has been called&quot;);
-    test(what, 44);
</del><ins>+    ok(true, &quot;Then.resolve has been called&quot;);
+    is(what, 44, &quot;Value == 44&quot;);
</ins><span class="cx">     runTest();
</span><span class="cx">   });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> function promiseRejectThenCatchThen2() {
</span><del>-  debug(&quot;Test Promise - reject / then / catch / then (2).&quot;);
-
-  var promise = new Promise(function(resolver) {
-    resolver.reject(42);
</del><ins>+  var promise = new Promise(function(resolve, reject) {
+    reject(42);
</ins><span class="cx">   });
</span><span class="cx"> 
</span><span class="cx">   promise.then(function(what) {
</span><del>-    testPassed(&quot;Then.resolve has been called&quot;);
-    test(what, 42);
-    return what + 1;
</del><ins>+    ok(true, &quot;Then.resolve has been called&quot;);
+    is(what, 42, &quot;Value == 42&quot;);
+    return what+1;
</ins><span class="cx">   }).catch(function(what) {
</span><del>-    testPassed(&quot;Catch has been called&quot;);
-    test(what, 42);
-    return what + 1;
</del><ins>+    is(what, 42, &quot;Value == 42&quot;);
+    ok(true, &quot;Catch has been called&quot;);
+    return what+1;
</ins><span class="cx">   }).then(function(what) {
</span><del>-    testPassed(&quot;Then.resolve has been called&quot;);
-    test(what, 43);
</del><ins>+    ok(true, &quot;Then.resolve has been called&quot;);
+    is(what, 43, &quot;Value == 43&quot;);
</ins><span class="cx">     runTest();
</span><span class="cx">   });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> function promiseRejectThenCatchExceptionThen() {
</span><del>-  debug(&quot;Test Promise - reject / then / catch exception / then.&quot;);
-
-  var promise = new Promise(function(resolver) {
-    resolver.reject(42);
</del><ins>+  var promise = new Promise(function(resolve, reject) {
+    reject(42);
</ins><span class="cx">   });
</span><span class="cx"> 
</span><span class="cx">   promise.then(function(what) {
</span><del>-    testFailed(&quot;Then.resolve has been called&quot;);
</del><ins>+    ok(false, &quot;Then.resolve has been called&quot;);
</ins><span class="cx">   }, function(what) {
</span><del>-    testPassed(&quot;Then.reject has been called&quot;);
-    test(what, 42);
</del><ins>+    ok(true, &quot;Then.reject has been called&quot;);
+    is(what, 42, &quot;Value == 42&quot;);
</ins><span class="cx">     throw(what + 1);
</span><span class="cx">   }).catch(function(what) {
</span><del>-    testPassed(&quot;Catch has been called&quot;);
-    test(what, 43);
</del><ins>+    ok(true, &quot;Catch has been called&quot;);
+    is(what, 43, &quot;Value == 43&quot;);
</ins><span class="cx">     return what + 1;
</span><span class="cx">   }).then(function(what) {
</span><del>-    testPassed(&quot;Then.resolve has been called&quot;);
-    test(what, 44);
</del><ins>+    ok(true, &quot;Then.resolve has been called&quot;);
+    is(what, 44, &quot;Value == 44&quot;);
</ins><span class="cx">     runTest();
</span><span class="cx">   });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> function promiseThenCatchOrderingResolve() {
</span><del>-  debug(&quot;Test Promise - then / catch ordering (resolve).&quot;);
-
</del><span class="cx">   var global = 0;
</span><del>-  var f = new Promise(function(r) {
-    r.resolve(42);
</del><ins>+  var f = new Promise(function(r1, r2) {
+    r1(42);
</ins><span class="cx">   });
</span><span class="cx"> 
</span><span class="cx">   f.then(function() {
</span><span class="lines">@@ -279,19 +352,16 @@
</span><span class="cx">       global++;
</span><span class="cx">     });
</span><span class="cx">     setTimeout(function() {
</span><del>-      debug(&quot;Many steps... should return 2&quot;);
-      test(global, 2);
</del><ins>+      is(global, 2, &quot;Many steps... should return 2&quot;);
</ins><span class="cx">       runTest();
</span><span class="cx">     }, 0);
</span><span class="cx">   });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> function promiseThenCatchOrderingReject() {
</span><del>-  debug(&quot;Test Promise - then / catch ordering (reject).&quot;);
-
</del><span class="cx">   var global = 0;
</span><del>-  var f = new Promise(function(r) {
-    r.reject(42);
</del><ins>+  var f = new Promise(function(r1, r2) {
+    r2(42);
</ins><span class="cx">   })
</span><span class="cx"> 
</span><span class="cx">   f.then(function() {}, function() {
</span><span class="lines">@@ -305,143 +375,143 @@
</span><span class="cx">       global++;
</span><span class="cx">     });
</span><span class="cx">     setTimeout(function() {
</span><del>-      debug(&quot;Many steps... should return 2&quot;);
-      test(global, 2);
</del><ins>+      is(global, 2, &quot;Many steps... should return 2&quot;);
</ins><span class="cx">       runTest();
</span><span class="cx">     }, 0);
</span><span class="cx">   });
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+function promiseCatchNoArg() {
+  var promise = new Promise(function(resolve, reject) {
+    reject(42);
+  });
+
+  var clone = promise.catch();
+  isnot(promise, clone, &quot;These 2 promise objs are different&quot;);
+  promise.catch(function(v) {
+    clone.catch(function(cv) {
+      is(v, cv, &quot;Both reject to the same value&quot;);
+      runTest();
+    });
+  });
+}
+
</ins><span class="cx"> function promiseNestedPromise() {
</span><del>-  debug(&quot;Test Promise - nested promise&quot;);
-
-  new Promise(function(resolver) {
-    resolver.resolve(new Promise(function(r) {
-      testPassed(&quot;Nested promise is executed&quot;);
-      r.resolve(42);
</del><ins>+  new Promise(function(resolve, reject) {
+    resolve(new Promise(function(resolve, reject) {
+      ok(true, &quot;Nested promise is executed&quot;);
+      resolve(42);
</ins><span class="cx">     }));
</span><span class="cx">   }).then(function(value) {
</span><del>-    testPassed(&quot;Then.resolve has been called&quot;);
-    test(value, 42);
</del><ins>+    is(value, 42, &quot;Nested promise is executed and then == 42&quot;);
</ins><span class="cx">     runTest();
</span><span class="cx">   });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> function promiseNestedNestedPromise() {
</span><del>-  debug(&quot;Test Promise - nested-nested promise.&quot;);
-
-  new Promise(function(resolver) {
-    resolver.resolve(new Promise(function(r) {
-      testPassed(&quot;Nested promise is executed&quot;);
-      r.resolve(42);
-    }).then(function(what) { return what + 1; }));
</del><ins>+  new Promise(function(resolve, reject) {
+    resolve(new Promise(function(resolve, reject) {
+      ok(true, &quot;Nested promise is executed&quot;);
+      resolve(42);
+    }).then(function(what) { return what+1; }));
</ins><span class="cx">   }).then(function(value) {
</span><del>-    testPassed(&quot;Then.resolve has been called&quot;);
-    test(value, 43);
</del><ins>+    is(value, 43, &quot;Nested promise is executed and then == 43&quot;);
</ins><span class="cx">     runTest();
</span><span class="cx">   });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> function promiseWrongNestedPromise() {
</span><del>-  debug(&quot;Test Promise - wrong nested promise.&quot;);
-
-  new Promise(function(resolver) {
-    resolver.resolve(new Promise(function(r) {
-      testPassed(&quot;Nested promise is executed&quot;);
-      r.resolve(42);
</del><ins>+  new Promise(function(resolve, reject) {
+    resolve(new Promise(function(r, r2) {
+      ok(true, &quot;Nested promise is executed&quot;);
+      r(42);
</ins><span class="cx">     }));
</span><del>-    resolver.reject(42);
</del><ins>+    reject(42);
</ins><span class="cx">   }).then(function(value) {
</span><del>-    testPassed(&quot;Then.resolve has been called&quot;);
-    test(value, 42);
</del><ins>+    is(value, 42, &quot;Nested promise is executed and then == 42&quot;);
</ins><span class="cx">     runTest();
</span><span class="cx">   }, function(value) {
</span><del>-    testFailed(&quot;Then.reject has been called&quot;);
</del><ins>+     ok(false, &quot;This is wrong&quot;);
</ins><span class="cx">   });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> function promiseLoop() {
</span><del>-  debug(&quot;Test Promise - promise loop.&quot;);
-
-  new Promise(function(resolver) {
-    resolver.resolve(new Promise(function(r) {
-      testPassed(&quot;Nested promise is executed&quot;);
-      r.resolve(new Promise(function(r) {
-        testPassed(&quot;Nested-nested promise is executed&quot;);
-        r.resolve(42);
</del><ins>+  new Promise(function(resolve, reject) {
+    resolve(new Promise(function(r1, r2) {
+      ok(true, &quot;Nested promise is executed&quot;);
+      r1(new Promise(function(r1, r2) {
+        ok(true, &quot;Nested nested promise is executed&quot;);
+        r1(42);
</ins><span class="cx">       }));
</span><span class="cx">     }));
</span><span class="cx">   }).then(function(value) {
</span><del>-    testPassed(&quot;Then.resolve has been called&quot;);
-    test(value, 42);
</del><ins>+    is(value, 42, &quot;Nested nested promise is executed and then == 42&quot;);
</ins><span class="cx">     runTest();
</span><span class="cx">   }, function(value) {
</span><del>-    testFailed(&quot;Then.reject has been called&quot;);
</del><ins>+     ok(false, &quot;This is wrong&quot;);
</ins><span class="cx">   });
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-function promiseRejectConstructor() {
-  debug(&quot;Test Promise - Promise.reject().&quot;);
-
</del><ins>+function promiseStaticReject() {
</ins><span class="cx">   var promise = Promise.reject(42).then(function(what) {
</span><del>-    testFailed(&quot;Then.resolve has been called&quot;);
</del><ins>+    ok(false, &quot;This should not be called&quot;);
</ins><span class="cx">   }, function(what) {
</span><del>-    testPassed(&quot;Then.reject has been called&quot;);
-    test(what, 42);
</del><ins>+    is(what, 42, &quot;Value == 42&quot;);
</ins><span class="cx">     runTest();
</span><span class="cx">   });
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-function promiseResolveConstructor() {
-  debug(&quot;Test Promise - Promise.resolve().&quot;);
-
</del><ins>+function promiseStaticResolve() {
</ins><span class="cx">   var promise = Promise.resolve(42).then(function(what) {
</span><del>-    testPassed(&quot;Then.resolve has been called&quot;);
-    test(what, 42);
</del><ins>+    is(what, 42, &quot;Value == 42&quot;);
</ins><span class="cx">     runTest();
</span><span class="cx">   }, function() {
</span><del>-    testFailed(&quot;Then.reject has been called&quot;);
</del><ins>+    ok(false, &quot;This should not be called&quot;);
</ins><span class="cx">   });
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-function promiseResolveConstructorNestedPromise() {
-  debug(&quot;Test Promise - Promise.resolve() with  nested promise.&quot;);
-
-  var promise = Promise.resolve(new Promise(function(r) {
-    testPassed(&quot;Nested promise is executed&quot;);
-    r.resolve(42);
</del><ins>+function promiseResolveNestedPromise() {
+  var promise = Promise.resolve(new Promise(function(r, r2) {
+    ok(true, &quot;Nested promise is executed&quot;);
+    r(42);
</ins><span class="cx">   }, function() {
</span><del>-    testFailed(&quot;Second argument to Promise constructor called.&quot;);
</del><ins>+    ok(false, &quot;This should not be called&quot;);
</ins><span class="cx">   })).then(function(what) {
</span><del>-    testPassed(&quot;Then.resolve has been called&quot;);
-    test(what, 42);
</del><ins>+    is(what, 42, &quot;Value == 42&quot;);
</ins><span class="cx">     runTest();
</span><span class="cx">   }, function() {
</span><del>-    testFailed(&quot;Then.reject has been called&quot;);
</del><ins>+    ok(false, &quot;This should not be called&quot;);
</ins><span class="cx">   });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> var tests = [
</span><del>-    promiseResolve,
-    promiseReject,
-    promiseException,
-    promiseGC,
-    promiseAsync,
-    promiseDoubleThen,
-    promiseThenException,
-    promiseThenCatchThen,
-    promiseRejectThenCatchThen,
-    promiseRejectThenCatchThen2,
-    promiseRejectThenCatchExceptionThen,
-    promiseThenCatchOrderingResolve,
-    promiseThenCatchOrderingReject,
-    promiseNestedPromise,
-    promiseNestedNestedPromise,
-    promiseWrongNestedPromise,
-    promiseLoop,
-    promiseRejectConstructor, 
-    promiseResolveConstructor,
-    promiseResolveConstructorNestedPromise,
</del><ins>+  promiseResolve, 
+  promiseReject,
+  promiseException,
+  promiseGC,
+  promiseAsync,
+  promiseDoubleThen, 
+  promiseThenException,
+  promiseThenCatchThen,
+  promiseRejectThenCatchThen,
+  promiseRejectThenCatchThen2,
+  promiseRejectThenCatchExceptionThen,
+  promiseThenCatchOrderingResolve,
+  promiseThenCatchOrderingReject,
+  promiseNestedPromise,
+  promiseNestedNestedPromise,
+  promiseWrongNestedPromise,
+  promiseLoop,
+  promiseStaticReject, 
+  promiseStaticResolve,
+  promiseResolveNestedPromise,
+  promiseResolveNoArg,
+  promiseRejectNoArg,
+  promiseThenNoArg,
+  promiseThenUndefinedResolveFunction,
+  promiseThenNullResolveFunction,
+  promiseCatchNoArg,
+  promiseRejectNoHandler,
</ins><span class="cx"> ];
</span><span class="cx"> 
</span><span class="cx"> function runTest() {
</span><span class="lines">@@ -450,8 +520,8 @@
</span><span class="cx">     return;
</span><span class="cx">   }
</span><span class="cx"> 
</span><del>-  debug(&quot;&quot;);
</del><span class="cx">   var test = tests.shift();
</span><ins>+  debug(&quot;\nAbout to run test - &quot; + test.name);
</ins><span class="cx">   test();
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsjsresourcesPromisecatchinworkersjs"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/resources/Promise-catch-in-workers.js (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/resources/Promise-catch-in-workers.js        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/resources/Promise-catch-in-workers.js        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -5,17 +5,18 @@
</span><span class="cx"> var global = this;
</span><span class="cx"> 
</span><span class="cx"> global.jsTestIsAsync = true;
</span><del>-var resolver;
</del><ins>+var reject;
</ins><span class="cx"> 
</span><del>-var firstPromise = new Promise(function(newResolver) {
</del><ins>+var firstPromise = new Promise(function(newResolve, newReject) {
</ins><span class="cx">   global.thisInInit = this;
</span><del>-  resolver = newResolver;
</del><ins>+  reject = newReject;
</ins><span class="cx"> });
</span><span class="cx"> 
</span><span class="cx"> var secondPromise = firstPromise.catch(function(result) {
</span><span class="cx">   global.thisInFulfillCallback = this;
</span><span class="cx">   shouldBeFalse('thisInFulfillCallback === firstPromise');
</span><del>-  shouldBeTrue('thisInFulfillCallback === secondPromise');
</del><ins>+  shouldBeFalse('thisInFulfillCallback === secondPromise');
+  shouldBeTrue('thisInFulfillCallback === global');
</ins><span class="cx">   global.result = result;
</span><span class="cx">   shouldBeEqualToString('result', 'hello');
</span><span class="cx">   return 'bye';
</span><span class="lines">@@ -32,12 +33,10 @@
</span><span class="cx"> }, function() {
</span><span class="cx"> });
</span><span class="cx"> 
</span><del>-shouldBeTrue('thisInInit === firstPromise');
</del><ins>+shouldBeFalse('thisInInit === firstPromise');
+shouldBeTrue('thisInInit === global');
</ins><span class="cx"> shouldBeTrue('firstPromise instanceof Promise');
</span><span class="cx"> shouldBeTrue('secondPromise instanceof Promise');
</span><span class="cx"> 
</span><del>-shouldThrow('firstPromise.catch(null)', '&quot;TypeError: Expected function or undefined as as first argument&quot;');
-shouldThrow('firstPromise.catch(37)', '&quot;TypeError: Expected function or undefined as as first argument&quot;');
</del><ins>+reject('hello');
</ins><span class="cx"> 
</span><del>-resolver.reject('hello');
-
</del></span></pre></div>
<a id="trunkLayoutTestsjsresourcesPromisefulfillinworkersjs"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/js/resources/Promise-fulfill-in-workers.js (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/resources/Promise-fulfill-in-workers.js        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/resources/Promise-fulfill-in-workers.js        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -1,32 +0,0 @@
</span><del>-importScripts('../../resources/js-test-pre.js');
-
-description('Test Promise.');
-
-jsTestIsAsync = true;
-
-var resolver;
-var promise = new Promise(function(r) { resolver = r; });
-var promiseState = 'pending';
-var promiseResult = undefined;
-promise.then(function(result) {
-  promiseState = 'fulfilled';
-  promiseResult = result;
-}, function(result) {
-  promiseState = 'rejected';
-  promiseResult = result;
-});
-
-shouldBeEqualToString('promiseState', 'pending');
-
-resolver.fulfill('hello');
-
-shouldBeEqualToString('promiseState', 'pending');
-
-promise.then(function() {
-  shouldBeEqualToString('promiseState', 'fulfilled');
-  shouldBeEqualToString('promiseResult', 'hello');
-  finishJSTest();
-}, function() {
-  testFailed('promise is rejected.');
-  finishJSTest();
-});
</del></span></pre></div>
<a id="trunkLayoutTestsjsresourcesPromiseinitinworkersjs"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/resources/Promise-init-in-workers.js (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/resources/Promise-init-in-workers.js        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/resources/Promise-init-in-workers.js        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -6,20 +6,22 @@
</span><span class="cx"> description('Test Promise.');
</span><span class="cx"> 
</span><span class="cx"> var thisInInit;
</span><del>-var resolver;
-var promise = new Promise(function(r) {
</del><ins>+var resolve, reject;
+var promise = new Promise(function(newResolve, newReject) {
</ins><span class="cx">   thisInInit = this;
</span><del>-  resolver = r;
</del><ins>+  resolve = newResolve;
+  reject = newReject;
</ins><span class="cx"> });
</span><span class="cx"> 
</span><span class="cx"> shouldBeTrue('promise instanceof Promise');
</span><span class="cx"> shouldBe('promise.constructor', 'Promise');
</span><del>-shouldBe('thisInInit', 'promise');
-shouldBeTrue('resolver instanceof PromiseResolver');
-shouldBe('resolver.constructor', 'PromiseResolver');
</del><ins>+shouldBeFalse('thisInInit === promise');
+shouldBeTrue('thisInInit === global');
+shouldBeTrue('resolve instanceof Function');
+shouldBeTrue('reject instanceof Function');
</ins><span class="cx"> 
</span><del>-shouldThrow('new Promise()', '&quot;TypeError: Expected at least one argument&quot;');
-shouldThrow('new Promise(37)', '&quot;TypeError: Expected function as as first argument&quot;');
</del><ins>+shouldThrow('new Promise()', '&quot;TypeError: Promise constructor takes a function argument&quot;');
+shouldThrow('new Promise(37)', '&quot;TypeError: Promise constructor takes a function argument&quot;');
</ins><span class="cx"> 
</span><span class="cx"> shouldNotThrow('promise = new Promise(function() { throw Error(&quot;foo&quot;); })');
</span><span class="cx"> promise.then(undefined, function(result) {
</span><span class="lines">@@ -27,8 +29,8 @@
</span><span class="cx">   shouldBeEqualToString('result.message', 'foo');
</span><span class="cx"> });
</span><span class="cx"> 
</span><del>-new Promise(function(resolver) {
-  resolver.fulfill(&quot;hello&quot;);
</del><ins>+new Promise(function(resolve) {
+  resolve(&quot;hello&quot;);
</ins><span class="cx">   throw Error(&quot;foo&quot;);
</span><span class="cx"> }).then(function(result) {
</span><span class="cx">   global.result = result;
</span></span></pre></div>
<a id="trunkLayoutTestsjsresourcesPromiserejectinworkersjs"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/resources/Promise-reject-in-workers.js (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/resources/Promise-reject-in-workers.js        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/resources/Promise-reject-in-workers.js        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -4,8 +4,8 @@
</span><span class="cx"> 
</span><span class="cx"> jsTestIsAsync = true;
</span><span class="cx"> 
</span><del>-var resolver;
-var promise = new Promise(function(r) { resolver = r; });
</del><ins>+var reject;
+var promise = new Promise(function(_, r) { reject = r; });
</ins><span class="cx"> var promiseState = 'pending';
</span><span class="cx"> var promiseResult = undefined;
</span><span class="cx"> promise.then(function(result) {
</span><span class="lines">@@ -18,7 +18,7 @@
</span><span class="cx"> 
</span><span class="cx"> shouldBeEqualToString('promiseState', 'pending');
</span><span class="cx"> 
</span><del>-resolver.reject('hello');
</del><ins>+reject('hello');
</ins><span class="cx"> 
</span><span class="cx"> shouldBeEqualToString('promiseState', 'pending');
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsjsresourcesPromiseresolveinworkersjs"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/resources/Promise-resolve-in-workers.js (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/resources/Promise-resolve-in-workers.js        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/resources/Promise-resolve-in-workers.js        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -5,13 +5,14 @@
</span><span class="cx"> var global = this;
</span><span class="cx"> global.jsTestIsAsync = true;
</span><span class="cx"> 
</span><del>-var firstPromise = new Promise(function(resolver) {
-  resolver.resolve('hello');
</del><ins>+var firstPromise = new Promise(function(resolve) {
+  resolve('hello');
</ins><span class="cx"> });
</span><span class="cx"> 
</span><span class="cx"> var secondPromise = firstPromise.then(function(result) {
</span><span class="cx">   global.thisInFulfillCallback = this;
</span><del>-  shouldBeTrue('thisInFulfillCallback === secondPromise');
</del><ins>+  shouldBeFalse('thisInFulfillCallback === secondPromise');
+  shouldBeTrue('thisInFulfillCallback === global');
</ins><span class="cx">   global.result = result;
</span><span class="cx">   shouldBeEqualToString('result', 'hello');
</span><span class="cx">   finishJSTest();
</span></span></pre></div>
<a id="trunkLayoutTestsjsresourcesPromiseresolvestateinworkersjs"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/js/resources/Promise-resolve-state-in-workers.js (0 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/resources/Promise-resolve-state-in-workers.js                                (rev 0)
+++ trunk/LayoutTests/js/resources/Promise-resolve-state-in-workers.js        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -0,0 +1,32 @@
</span><ins>+importScripts('../../resources/js-test-pre.js');
+
+description('Test Promise.');
+
+jsTestIsAsync = true;
+
+var resolve;
+var promise = new Promise(function(r) { resolve = r; });
+var promiseState = 'pending';
+var promiseResult = undefined;
+promise.then(function(result) {
+  promiseState = 'fulfilled';
+  promiseResult = result;
+}, function(result) {
+  promiseState = 'rejected';
+  promiseResult = result;
+});
+
+shouldBeEqualToString('promiseState', 'pending');
+
+resolve('hello');
+
+shouldBeEqualToString('promiseState', 'pending');
+
+promise.then(function() {
+  shouldBeEqualToString('promiseState', 'fulfilled');
+  shouldBeEqualToString('promiseResult', 'hello');
+  finishJSTest();
+}, function() {
+  testFailed('promise is rejected.');
+  finishJSTest();
+});
</ins></span></pre></div>
<a id="trunkLayoutTestsjsresourcesPromisesimpleinworkersjs"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/resources/Promise-simple-in-workers.js (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/resources/Promise-simple-in-workers.js        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/resources/Promise-simple-in-workers.js        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -6,21 +6,23 @@
</span><span class="cx"> 
</span><span class="cx"> global.jsTestIsAsync = true;
</span><span class="cx"> 
</span><del>-var resolver;
</del><ins>+var resolve;
</ins><span class="cx"> 
</span><del>-var firstPromise = new Promise(function(newResolver) {
</del><ins>+var firstPromise = new Promise(function(newResolve) {
</ins><span class="cx">   global.thisInInit = this;
</span><del>-  resolver = newResolver;
</del><ins>+  resolve = newResolve;
</ins><span class="cx"> });
</span><span class="cx"> 
</span><span class="cx"> var secondPromise = firstPromise.then(function(result) {
</span><span class="cx">   global.thisInFulfillCallback = this;
</span><del>-  shouldBeTrue('thisInFulfillCallback === secondPromise');
</del><ins>+  shouldBeFalse('thisInFulfillCallback === secondPromise');
+  shouldBeTrue('thisInFulfillCallback === global');
</ins><span class="cx">   global.result = result;
</span><span class="cx">   shouldBeEqualToString('result', 'hello');
</span><span class="cx">   finishJSTest();
</span><span class="cx"> });
</span><span class="cx"> 
</span><del>-shouldBeTrue('thisInInit === firstPromise');
</del><ins>+shouldBeFalse('thisInInit === firstPromise');
+shouldBeTrue('thisInInit === global');
</ins><span class="cx"> 
</span><del>-resolver.fulfill('hello');
</del><ins>+resolve('hello');
</ins></span></pre></div>
<a id="trunkLayoutTestsjsresourcesPromisetheninworkersjs"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/resources/Promise-then-in-workers.js (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/resources/Promise-then-in-workers.js        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/resources/Promise-then-in-workers.js        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -6,30 +6,46 @@
</span><span class="cx"> 
</span><span class="cx"> global.jsTestIsAsync = true;
</span><span class="cx"> 
</span><del>-var resolver;
</del><ins>+var resolve;
</ins><span class="cx"> 
</span><del>-var firstPromise = new Promise(function(newResolver) {
</del><ins>+var firstPromise = new Promise(function(newResolve) {
</ins><span class="cx">   global.thisInInit = this;
</span><del>-  resolver = newResolver;
</del><ins>+  resolve = newResolve;
</ins><span class="cx"> });
</span><span class="cx"> 
</span><span class="cx"> var secondPromise = firstPromise.then(function(result) {
</span><span class="cx">   global.thisInFulfillCallback = this;
</span><span class="cx">   shouldBeFalse('thisInFulfillCallback === firstPromise');
</span><del>-  shouldBeTrue('thisInFulfillCallback === secondPromise');
</del><ins>+  shouldBeFalse('thisInFulfillCallback === secondPromise');
+  shouldBeTrue('thisInFulfillCallback === global');
</ins><span class="cx">   global.result = result;
</span><span class="cx">   shouldBeEqualToString('result', 'hello');
</span><del>-  finishJSTest();
</del><ins>+  return 'world';
</ins><span class="cx"> });
</span><span class="cx"> 
</span><del>-shouldBeTrue('thisInInit === firstPromise');
</del><ins>+shouldBeFalse('thisInInit === firstPromise');
+shouldBeTrue('thisInInit === global');
</ins><span class="cx"> shouldBeTrue('firstPromise instanceof Promise');
</span><span class="cx"> shouldBeTrue('secondPromise instanceof Promise');
</span><span class="cx"> 
</span><del>-shouldThrow('firstPromise.then(null)', '&quot;TypeError: Expected function or undefined as as first argument&quot;');
-shouldThrow('firstPromise.then(undefined, null)', '&quot;TypeError: Expected function or undefined as as second argument&quot;');
-shouldThrow('firstPromise.then(37)', '&quot;TypeError: Expected function or undefined as as first argument&quot;');
</del><ins>+secondPromise.then(null, 37).then(function(result) {
+  global.result = result;
+  shouldBeEqualToString('result', 'world');
+  throw 'exception'
+}).then(1, 2).then(function() {
+  testFailed('resolved');
+}, function(result) {
+  testPassed('rejected');
+  global.result = result;
+  shouldBeEqualToString('result', 'exception');
+}).then(function() {
+  testPassed('resolved');
+  finishJSTest();
+}, function() {
+  testFailed('rejected');
+  finishJSTest();
+});
</ins><span class="cx"> 
</span><del>-resolver.fulfill('hello');
</del><ins>+resolve('hello');
</ins><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsjsresourcesPromisethenwithoutcallbacksinworkersjs"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/js/resources/Promise-then-without-callbacks-in-workers.js (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/js/resources/Promise-then-without-callbacks-in-workers.js        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/LayoutTests/js/resources/Promise-then-without-callbacks-in-workers.js        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -6,7 +6,7 @@
</span><span class="cx"> 
</span><span class="cx"> global.jsTestIsAsync = true;
</span><span class="cx"> 
</span><del>-new Promise(function(r) { r.fulfill('hello'); })
</del><ins>+new Promise(function(resolve) { resolve('hello'); })
</ins><span class="cx">   .then()
</span><span class="cx">   .then(function(result) {
</span><span class="cx">     global.result = result;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreCMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/CMakeLists.txt (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/CMakeLists.txt        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/JavaScriptCore/CMakeLists.txt        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -361,12 +361,11 @@
</span><span class="cx">     runtime/JSONObject.cpp
</span><span class="cx">     runtime/JSObject.cpp
</span><span class="cx">     runtime/JSPromise.cpp
</span><del>-    runtime/JSPromiseCallback.cpp
</del><span class="cx">     runtime/JSPromiseConstructor.cpp
</span><ins>+    runtime/JSPromiseDeferred.cpp
+    runtime/JSPromiseFunctions.cpp
+    runtime/JSPromiseReaction.cpp
</ins><span class="cx">     runtime/JSPromisePrototype.cpp
</span><del>-    runtime/JSPromiseResolver.cpp
-    runtime/JSPromiseResolverConstructor.cpp
-    runtime/JSPromiseResolverPrototype.cpp
</del><span class="cx">     runtime/JSPropertyNameIterator.cpp
</span><span class="cx">     runtime/JSProxy.cpp
</span><span class="cx">     runtime/JSScope.cpp
</span><span class="lines">@@ -467,7 +466,6 @@
</span><span class="cx">     runtime/JSONObject.cpp
</span><span class="cx">     runtime/JSPromiseConstructor.cpp
</span><span class="cx">     runtime/JSPromisePrototype.cpp
</span><del>-    runtime/JSPromiseResolverPrototype.cpp
</del><span class="cx">     runtime/NamePrototype.cpp
</span><span class="cx">     runtime/NumberConstructor.cpp
</span><span class="cx">     runtime/NumberPrototype.cpp
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/JavaScriptCore/ChangeLog        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -1,3 +1,112 @@
</span><ins>+2014-01-02  Sam Weinig  &lt;sam@webkit.org&gt;
+
+        Update Promises to the https://github.com/domenic/promises-unwrapping spec
+        https://bugs.webkit.org/show_bug.cgi?id=120954
+
+        Reviewed by Filip Pizlo.
+
+        Update Promises to the revised spec. Notable changes:
+        - JSPromiseResolver is gone.
+        - TaskContext has been renamed Microtask and now has a virtual run() function.
+        - Instead of using custom InternalFunction subclasses, JSFunctions are used
+          with PrivateName properties for internal slots.
+
+        * CMakeLists.txt:
+        * DerivedSources.make:
+        * GNUmakefile.list.am:
+        * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
+        * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:
+        * JavaScriptCore.xcodeproj/project.pbxproj:
+        * interpreter/CallFrame.h:
+        (JSC::ExecState::promiseConstructorTable):
+        * runtime/CommonIdentifiers.cpp:
+        (JSC::CommonIdentifiers::CommonIdentifiers):
+        * runtime/CommonIdentifiers.h:
+        * runtime/JSGlobalObject.cpp:
+        (JSC::JSGlobalObject::reset):
+        (JSC::JSGlobalObject::visitChildren):
+        (JSC::JSGlobalObject::queueMicrotask):
+        * runtime/JSGlobalObject.h:
+        (JSC::JSGlobalObject::promiseConstructor):
+        (JSC::JSGlobalObject::promisePrototype):
+        (JSC::JSGlobalObject::promiseStructure):
+        * runtime/JSPromise.cpp:
+        (JSC::JSPromise::create):
+        (JSC::JSPromise::JSPromise):
+        (JSC::JSPromise::finishCreation):
+        (JSC::JSPromise::visitChildren):
+        (JSC::JSPromise::reject):
+        (JSC::JSPromise::resolve):
+        (JSC::JSPromise::appendResolveReaction):
+        (JSC::JSPromise::appendRejectReaction):
+        (JSC::triggerPromiseReactions):
+        * runtime/JSPromise.h:
+        (JSC::JSPromise::status):
+        (JSC::JSPromise::result):
+        (JSC::JSPromise::constructor):
+        * runtime/JSPromiseCallback.cpp: Removed.
+        * runtime/JSPromiseCallback.h: Removed.
+        * runtime/JSPromiseConstructor.cpp:
+        (JSC::constructPromise):
+        (JSC::JSPromiseConstructor::getCallData):
+        (JSC::JSPromiseConstructorFuncCast):
+        (JSC::JSPromiseConstructorFuncResolve):
+        (JSC::JSPromiseConstructorFuncReject):
+        * runtime/JSPromiseConstructor.h:
+        * runtime/JSPromiseDeferred.cpp: Added.
+        (JSC::JSPromiseDeferred::create):
+        (JSC::JSPromiseDeferred::JSPromiseDeferred):
+        (JSC::JSPromiseDeferred::finishCreation):
+        (JSC::JSPromiseDeferred::visitChildren):
+        (JSC::createJSPromiseDeferredFromConstructor):
+        (JSC::updateDeferredFromPotentialThenable):
+        * runtime/JSPromiseDeferred.h: Added.
+        (JSC::JSPromiseDeferred::createStructure):
+        (JSC::JSPromiseDeferred::promise):
+        (JSC::JSPromiseDeferred::resolve):
+        (JSC::JSPromiseDeferred::reject):
+        * runtime/JSPromiseFunctions.cpp: Added.
+        (JSC::deferredConstructionFunction):
+        (JSC::createDeferredConstructionFunction):
+        (JSC::identifyFunction):
+        (JSC::createIdentifyFunction):
+        (JSC::promiseAllCountdownFunction):
+        (JSC::createPromiseAllCountdownFunction):
+        (JSC::promiseResolutionHandlerFunction):
+        (JSC::createPromiseResolutionHandlerFunction):
+        (JSC::rejectPromiseFunction):
+        (JSC::createRejectPromiseFunction):
+        (JSC::resolvePromiseFunction):
+        (JSC::createResolvePromiseFunction):
+        (JSC::throwerFunction):
+        (JSC::createThrowerFunction):
+        * runtime/JSPromiseFunctions.h: Added.
+        * runtime/JSPromisePrototype.cpp:
+        (JSC::JSPromisePrototypeFuncThen):
+        (JSC::JSPromisePrototypeFuncCatch):
+        * runtime/JSPromiseReaction.cpp: Added.
+        (JSC::createExecutePromiseReactionMicroTask):
+        (JSC::ExecutePromiseReactionMicroTask::run):
+        (JSC::JSPromiseReaction::create):
+        (JSC::JSPromiseReaction::JSPromiseReaction):
+        (JSC::JSPromiseReaction::finishCreation):
+        (JSC::JSPromiseReaction::visitChildren):
+        * runtime/JSPromiseReaction.h: Added.
+        (JSC::JSPromiseReaction::createStructure):
+        (JSC::JSPromiseReaction::deferred):
+        (JSC::JSPromiseReaction::handler):
+        * runtime/JSPromiseResolver.cpp: Removed.
+        * runtime/JSPromiseResolver.h: Removed.
+        * runtime/JSPromiseResolverConstructor.cpp: Removed.
+        * runtime/JSPromiseResolverConstructor.h: Removed.
+        * runtime/JSPromiseResolverPrototype.cpp: Removed.
+        * runtime/JSPromiseResolverPrototype.h: Removed.
+        * runtime/Microtask.h: Added.
+        * runtime/VM.cpp:
+        (JSC::VM::VM):
+        (JSC::VM::~VM):
+        * runtime/VM.h:
+
</ins><span class="cx"> 2014-01-02  Mark Hahnenberg  &lt;mhahnenberg@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Add support for StoreBarrier and friends to the FTL
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreDerivedSourcesmake"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/DerivedSources.make (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/DerivedSources.make        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/JavaScriptCore/DerivedSources.make        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -45,7 +45,6 @@
</span><span class="cx">     JSGlobalObject.lut.h \
</span><span class="cx">     JSPromisePrototype.lut.h \
</span><span class="cx">     JSPromiseConstructor.lut.h \
</span><del>-    JSPromiseResolverPrototype.lut.h \
</del><span class="cx">     KeywordLookup.h \
</span><span class="cx">     Lexer.lut.h \
</span><span class="cx">     NamePrototype.lut.h \
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreGNUmakefilelistam"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/GNUmakefile.list.am (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/GNUmakefile.list.am        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/JavaScriptCore/GNUmakefile.list.am        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -22,7 +22,6 @@
</span><span class="cx">         DerivedSources/JavaScriptCore/JSONObject.lut.h \
</span><span class="cx">         DerivedSources/JavaScriptCore/JSPromiseConstructor.lut.h \
</span><span class="cx">         DerivedSources/JavaScriptCore/JSPromisePrototype.lut.h \
</span><del>-        DerivedSources/JavaScriptCore/JSPromiseResolverPrototype.lut.h \
</del><span class="cx">         DerivedSources/JavaScriptCore/MathObject.lut.h \
</span><span class="cx">         DerivedSources/JavaScriptCore/NamePrototype.lut.h \
</span><span class="cx">         DerivedSources/JavaScriptCore/NumberConstructor.lut.h \
</span><span class="lines">@@ -977,18 +976,16 @@
</span><span class="cx">         Source/JavaScriptCore/runtime/JSONObject.h \
</span><span class="cx">         Source/JavaScriptCore/runtime/JSPromise.cpp \
</span><span class="cx">         Source/JavaScriptCore/runtime/JSPromise.h \
</span><del>-        Source/JavaScriptCore/runtime/JSPromiseCallback.cpp \
-        Source/JavaScriptCore/runtime/JSPromiseCallback.h \
</del><span class="cx">         Source/JavaScriptCore/runtime/JSPromiseConstructor.cpp \
</span><span class="cx">         Source/JavaScriptCore/runtime/JSPromiseConstructor.h \
</span><ins>+        Source/JavaScriptCore/runtime/JSPromiseDeferred.cpp \
+        Source/JavaScriptCore/runtime/JSPromiseDeferred.h \
+        Source/JavaScriptCore/runtime/JSPromiseFunctions.cpp \
+        Source/JavaScriptCore/runtime/JSPromiseFunctions.h \
+        Source/JavaScriptCore/runtime/JSPromiseReaction.cpp \
+        Source/JavaScriptCore/runtime/JSPromiseReaction.h \
</ins><span class="cx">         Source/JavaScriptCore/runtime/JSPromisePrototype.cpp \
</span><span class="cx">         Source/JavaScriptCore/runtime/JSPromisePrototype.h \
</span><del>-        Source/JavaScriptCore/runtime/JSPromiseResolver.cpp \
-        Source/JavaScriptCore/runtime/JSPromiseResolver.h \
-        Source/JavaScriptCore/runtime/JSPromiseResolverConstructor.cpp \
-        Source/JavaScriptCore/runtime/JSPromiseResolverConstructor.h \
-        Source/JavaScriptCore/runtime/JSPromiseResolverPrototype.cpp \
-        Source/JavaScriptCore/runtime/JSPromiseResolverPrototype.h \
</del><span class="cx">         Source/JavaScriptCore/runtime/JSPropertyNameIterator.cpp \
</span><span class="cx">         Source/JavaScriptCore/runtime/JSPropertyNameIterator.h \
</span><span class="cx">         Source/JavaScriptCore/runtime/JSSegmentedVariableObject.cpp \
</span><span class="lines">@@ -1049,6 +1046,7 @@
</span><span class="cx">         Source/JavaScriptCore/runtime/MathObject.cpp \
</span><span class="cx">         Source/JavaScriptCore/runtime/MathObject.h \
</span><span class="cx">         Source/JavaScriptCore/runtime/MemoryStatistics.h \
</span><ins>+        Source/JavaScriptCore/runtime/Microtask.h \
</ins><span class="cx">         Source/JavaScriptCore/runtime/NameConstructor.cpp \
</span><span class="cx">         Source/JavaScriptCore/runtime/NameConstructor.h \
</span><span class="cx">         Source/JavaScriptCore/runtime/NameInstance.cpp \
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreJavaScriptCorevcxprojJavaScriptCorevcxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -612,12 +612,11 @@
</span><span class="cx">     &lt;ClCompile Include=&quot;..\runtime\JSONObject.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\runtime\JSObject.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\runtime\JSPromise.cpp&quot; /&gt;
</span><del>-    &lt;ClCompile Include=&quot;..\runtime\JSPromiseCallback.cpp&quot; /&gt;
</del><span class="cx">     &lt;ClCompile Include=&quot;..\runtime\JSPromiseConstructor.cpp&quot; /&gt;
</span><ins>+    &lt;ClCompile Include=&quot;..\runtime\JSPromiseDeferred.cpp&quot; /&gt;
+    &lt;ClCompile Include=&quot;..\runtime\JSPromiseFunctions.cpp&quot; /&gt;
+    &lt;ClCompile Include=&quot;..\runtime\JSPromiseReaction.cpp&quot; /&gt;
</ins><span class="cx">     &lt;ClCompile Include=&quot;..\runtime\JSPromisePrototype.cpp&quot; /&gt;
</span><del>-    &lt;ClCompile Include=&quot;..\runtime\JSPromiseResolver.cpp&quot; /&gt;
-    &lt;ClCompile Include=&quot;..\runtime\JSPromiseResolverConstructor.cpp&quot; /&gt;
-    &lt;ClCompile Include=&quot;..\runtime\JSPromiseResolverPrototype.cpp&quot; /&gt;
</del><span class="cx">     &lt;ClCompile Include=&quot;..\runtime\JSPropertyNameIterator.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\runtime\JSProxy.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\runtime\JSScope.cpp&quot; /&gt;
</span><span class="lines">@@ -720,7 +719,6 @@
</span><span class="cx">     &lt;ClInclude Include=&quot;$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\$(ProjectName)\DerivedSources\JSONObject.lut.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\$(ProjectName)\DerivedSources\JSPromiseConstructor.lut.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\$(ProjectName)\DerivedSources\JSPromisePrototype.lut.h&quot; /&gt;
</span><del>-    &lt;ClInclude Include=&quot;$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\$(ProjectName)\DerivedSources\JSPromiseResolverPrototype.lut.h&quot; /&gt;
</del><span class="cx">     &lt;ClInclude Include=&quot;$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\$(ProjectName)\DerivedSources\KeywordLookup.lut.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\$(ProjectName)\DerivedSources\Lexer.lut.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\$(ProjectName)\DerivedSources\NamePrototype.lut.h&quot; /&gt;
</span><span class="lines">@@ -1233,12 +1231,11 @@
</span><span class="cx">     &lt;ClInclude Include=&quot;..\runtime\JSONObject.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\runtime\JSObject.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\runtime\JSPromise.h&quot; /&gt;
</span><del>-    &lt;ClInclude Include=&quot;..\runtime\JSPromiseCallback.h&quot; /&gt;
</del><span class="cx">     &lt;ClInclude Include=&quot;..\runtime\JSPromiseConstructor.h&quot; /&gt;
</span><ins>+    &lt;ClInclude Include=&quot;..\runtime\JSPromiseDeferred.h&quot; /&gt;
+    &lt;ClInclude Include=&quot;..\runtime\JSPromiseFunctions.h&quot; /&gt;
+    &lt;ClInclude Include=&quot;..\runtime\JSPromiseReaction.h&quot; /&gt;
</ins><span class="cx">     &lt;ClInclude Include=&quot;..\runtime\JSPromisePrototype.h&quot; /&gt;
</span><del>-    &lt;ClInclude Include=&quot;..\runtime\JSPromiseResolver.h&quot; /&gt;
-    &lt;ClInclude Include=&quot;..\runtime\JSPromiseResolverConstructor.h&quot; /&gt;
-    &lt;ClInclude Include=&quot;..\runtime\JSPromiseResolverPrototype.h&quot; /&gt;
</del><span class="cx">     &lt;ClInclude Include=&quot;..\runtime\JSPropertyNameIterator.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\runtime\JSProxy.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\runtime\JSScope.h&quot; /&gt;
</span><span class="lines">@@ -1271,6 +1268,7 @@
</span><span class="cx">     &lt;ClInclude Include=&quot;..\runtime\MapPrototype.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\runtime\MatchResult.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\runtime\MathObject.h&quot; /&gt;
</span><ins>+    &lt;ClInclude Include=&quot;..\runtime\Microtask.h&quot; /&gt;
</ins><span class="cx">     &lt;ClInclude Include=&quot;..\runtime\NameConstructor.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\runtime\NameInstance.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\runtime\NamePrototype.h&quot; /&gt;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreJavaScriptCorevcxprojJavaScriptCorevcxprojfilters"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -876,27 +876,24 @@
</span><span class="cx">     &lt;ClCompile Include=&quot;..\runtime\SimpleTypedArrayController.cpp&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;runtime&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClCompile&gt;
</span><del>-    &lt;ClCompile Include=&quot;..\runtime\JSPromiseResolverPrototype.cpp&quot;&gt;
</del><ins>+    &lt;ClCompile Include=&quot;..\runtime\JSPromise.cpp&quot;&gt;
</ins><span class="cx">       &lt;Filter&gt;runtime&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClCompile&gt;
</span><del>-    &lt;ClCompile Include=&quot;..\runtime\JSPromiseResolverConstructor.cpp&quot;&gt;
</del><ins>+    &lt;ClCompile Include=&quot;..\runtime\JSPromiseConstructor.cpp&quot;&gt;
</ins><span class="cx">       &lt;Filter&gt;runtime&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClCompile&gt;
</span><del>-    &lt;ClCompile Include=&quot;..\runtime\JSPromiseResolver.cpp&quot;&gt;
</del><ins>+    &lt;ClCompile Include=&quot;..\runtime\JSPromiseDeferred.cpp&quot;&gt;
</ins><span class="cx">       &lt;Filter&gt;runtime&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClCompile&gt;
</span><del>-    &lt;ClCompile Include=&quot;..\runtime\JSPromisePrototype.cpp&quot;&gt;
</del><ins>+    &lt;ClCompile Include=&quot;..\runtime\JSPromiseFunctions.cpp&quot;&gt;
</ins><span class="cx">       &lt;Filter&gt;runtime&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClCompile&gt;
</span><del>-    &lt;ClCompile Include=&quot;..\runtime\JSPromiseConstructor.cpp&quot;&gt;
</del><ins>+    &lt;ClCompile Include=&quot;..\runtime\JSPromiseReaction.cpp&quot;&gt;
</ins><span class="cx">       &lt;Filter&gt;runtime&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClCompile&gt;
</span><del>-    &lt;ClCompile Include=&quot;..\runtime\JSPromiseCallback.cpp&quot;&gt;
</del><ins>+    &lt;ClCompile Include=&quot;..\runtime\JSPromisePrototype.cpp&quot;&gt;
</ins><span class="cx">       &lt;Filter&gt;runtime&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClCompile&gt;
</span><del>-    &lt;ClCompile Include=&quot;..\runtime\JSPromise.cpp&quot;&gt;
-      &lt;Filter&gt;runtime&lt;/Filter&gt;
-    &lt;/ClCompile&gt;
</del><span class="cx">     &lt;ClCompile Include=&quot;..\runtime\WeakMapConstructor.cpp&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;runtime&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClCompile&gt;
</span><span class="lines">@@ -2571,25 +2568,22 @@
</span><span class="cx">     &lt;ClInclude Include=&quot;..\runtime\JSGenericTypedArrayViewPrototype.h&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;runtime&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClInclude&gt;
</span><del>-    &lt;ClInclude Include=&quot;..\runtime\JSPromiseResolverPrototype.h&quot;&gt;
-      &lt;Filter&gt;runtime&lt;/Filter&gt;
-    &lt;/ClInclude&gt;
</del><span class="cx">     &lt;ClInclude Include=&quot;..\runtime\JSPromise.h&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;runtime&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClInclude&gt;
</span><del>-    &lt;ClInclude Include=&quot;..\runtime\JSPromiseCallback.h&quot;&gt;
</del><ins>+    &lt;ClInclude Include=&quot;..\runtime\JSPromiseConstructor.h&quot;&gt;
</ins><span class="cx">       &lt;Filter&gt;runtime&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClInclude&gt;
</span><del>-    &lt;ClInclude Include=&quot;..\runtime\JSPromiseConstructor.h&quot;&gt;
</del><ins>+    &lt;ClInclude Include=&quot;..\runtime\JSPromiseDeferred.h&quot;&gt;
</ins><span class="cx">       &lt;Filter&gt;runtime&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClInclude&gt;
</span><del>-    &lt;ClInclude Include=&quot;..\runtime\JSPromisePrototype.h&quot;&gt;
</del><ins>+    &lt;ClInclude Include=&quot;..\runtime\JSPromiseFunctions.h&quot;&gt;
</ins><span class="cx">       &lt;Filter&gt;runtime&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClInclude&gt;
</span><del>-    &lt;ClInclude Include=&quot;..\runtime\JSPromiseResolver.h&quot;&gt;
</del><ins>+    &lt;ClInclude Include=&quot;..\runtime\JSPromiseReaction.h&quot;&gt;
</ins><span class="cx">       &lt;Filter&gt;runtime&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClInclude&gt;
</span><del>-    &lt;ClInclude Include=&quot;..\runtime\JSPromiseResolverConstructor.h&quot;&gt;
</del><ins>+    &lt;ClInclude Include=&quot;..\runtime\JSPromisePrototype.h&quot;&gt;
</ins><span class="cx">       &lt;Filter&gt;runtime&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClInclude&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\runtime\JSInt8Array.h&quot;&gt;
</span><span class="lines">@@ -2703,9 +2697,6 @@
</span><span class="cx">     &lt;ClInclude Include=&quot;$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\$(ProjectName)\DerivedSources\JSPromisePrototype.lut.h&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;Derived Sources&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClInclude&gt;
</span><del>-    &lt;ClInclude Include=&quot;$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\$(ProjectName)\DerivedSources\JSPromiseResolverPrototype.lut.h&quot;&gt;
-      &lt;Filter&gt;Derived Sources&lt;/Filter&gt;
-    &lt;/ClInclude&gt;
</del><span class="cx">     &lt;ClInclude Include=&quot;$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\$(ProjectName)\DerivedSources\KeywordLookup.lut.h&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;Derived Sources&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClInclude&gt;
</span><span class="lines">@@ -3156,6 +3147,9 @@
</span><span class="cx">     &lt;ClInclude Include=&quot;..\runtime\MapIteratorConstructor.h&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;runtime&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClInclude&gt;
</span><ins>+    &lt;ClInclude Include=&quot;..\runtime\Microtask.h&quot;&gt;
+      &lt;Filter&gt;runtime&lt;/Filter&gt;
+    &lt;/ClInclude&gt;
</ins><span class="cx">     &lt;ClInclude Include=&quot;..\jit\AssemblyHelpers.h&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;jit&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClInclude&gt;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -748,20 +748,19 @@
</span><span class="cx">                 65C0285C1717966800351E35 /* ARMv7DOpcode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 65C0285A1717966800351E35 /* ARMv7DOpcode.cpp */; };
</span><span class="cx">                 65C0285D1717966800351E35 /* ARMv7DOpcode.h in Headers */ = {isa = PBXBuildFile; fileRef = 65C0285B1717966800351E35 /* ARMv7DOpcode.h */; };
</span><span class="cx">                 65FB5117184EEE7000C12B70 /* ProtoCallFrame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 65FB5116184EE9BC00C12B70 /* ProtoCallFrame.cpp */; };
</span><del>-                7C15F65D17C199CE00794D40 /* JSPromiseCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C15F65B17C199CE00794D40 /* JSPromiseCallback.cpp */; };
-                7C15F65E17C199CE00794D40 /* JSPromiseCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C15F65C17C199CE00794D40 /* JSPromiseCallback.h */; };
</del><ins>+                7C008CD2186F8A9300955C24 /* JSPromiseFunctions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C008CD0186F8A9300955C24 /* JSPromiseFunctions.cpp */; };
+                7C008CD3186F8A9300955C24 /* JSPromiseFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C008CD1186F8A9300955C24 /* JSPromiseFunctions.h */; settings = {ATTRIBUTES = (Private, ); }; };
+                7C008CDA187124BB00955C24 /* JSPromiseDeferred.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C008CD8187124BB00955C24 /* JSPromiseDeferred.cpp */; };
+                7C008CDB187124BB00955C24 /* JSPromiseDeferred.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C008CD9187124BB00955C24 /* JSPromiseDeferred.h */; settings = {ATTRIBUTES = (Private, ); }; };
+                7C008CDE1871258D00955C24 /* JSPromiseReaction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C008CDC1871258D00955C24 /* JSPromiseReaction.cpp */; };
+                7C008CDF1871258D00955C24 /* JSPromiseReaction.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C008CDD1871258D00955C24 /* JSPromiseReaction.h */; };
+                7C008CE7187631B600955C24 /* Microtask.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C008CE5187631B600955C24 /* Microtask.h */; settings = {ATTRIBUTES = (Private, ); }; };
</ins><span class="cx">                 7C184E1A17BEDBD3007CB63A /* JSPromise.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C184E1817BEDBD3007CB63A /* JSPromise.cpp */; };
</span><span class="cx">                 7C184E1B17BEDBD3007CB63A /* JSPromise.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C184E1917BEDBD3007CB63A /* JSPromise.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 7C184E1E17BEE22E007CB63A /* JSPromisePrototype.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C184E1C17BEE22E007CB63A /* JSPromisePrototype.cpp */; };
</span><span class="cx">                 7C184E1F17BEE22E007CB63A /* JSPromisePrototype.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C184E1D17BEE22E007CB63A /* JSPromisePrototype.h */; };
</span><span class="cx">                 7C184E2217BEE240007CB63A /* JSPromiseConstructor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C184E2017BEE240007CB63A /* JSPromiseConstructor.cpp */; };
</span><span class="cx">                 7C184E2317BEE240007CB63A /* JSPromiseConstructor.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C184E2117BEE240007CB63A /* JSPromiseConstructor.h */; };
</span><del>-                7C3BA29417C039560072DDC9 /* JSPromiseResolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C3BA28E17C039560072DDC9 /* JSPromiseResolver.cpp */; };
-                7C3BA29517C039560072DDC9 /* JSPromiseResolver.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C3BA28F17C039560072DDC9 /* JSPromiseResolver.h */; settings = {ATTRIBUTES = (Private, ); }; };
-                7C3BA29617C039560072DDC9 /* JSPromiseResolverConstructor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C3BA29017C039560072DDC9 /* JSPromiseResolverConstructor.cpp */; };
-                7C3BA29717C039560072DDC9 /* JSPromiseResolverConstructor.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C3BA29117C039560072DDC9 /* JSPromiseResolverConstructor.h */; };
-                7C3BA29817C039560072DDC9 /* JSPromiseResolverPrototype.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C3BA29217C039560072DDC9 /* JSPromiseResolverPrototype.cpp */; };
-                7C3BA29917C039560072DDC9 /* JSPromiseResolverPrototype.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C3BA29317C039560072DDC9 /* JSPromiseResolverPrototype.h */; };
</del><span class="cx">                 7E4EE7090EBB7963005934AA /* StructureChain.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E4EE7080EBB7963005934AA /* StructureChain.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 7E4EE70F0EBB7A5B005934AA /* StructureChain.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7E4EE70E0EBB7A5B005934AA /* StructureChain.cpp */; };
</span><span class="cx">                 7EFF00640EC05A9A00AA7C93 /* NodeInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 7EFF00630EC05A9A00AA7C93 /* NodeInfo.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="lines">@@ -2080,8 +2079,13 @@
</span><span class="cx">                 65FB5115184EE8F800C12B70 /* ProtoCallFrame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProtoCallFrame.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 65FB5116184EE9BC00C12B70 /* ProtoCallFrame.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ProtoCallFrame.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 704FD35305697E6D003DBED9 /* BooleanObject.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = BooleanObject.h; sourceTree = &quot;&lt;group&gt;&quot;; tabWidth = 8; };
</span><del>-                7C15F65B17C199CE00794D40 /* JSPromiseCallback.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSPromiseCallback.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
-                7C15F65C17C199CE00794D40 /* JSPromiseCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSPromiseCallback.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</del><ins>+                7C008CD0186F8A9300955C24 /* JSPromiseFunctions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSPromiseFunctions.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                7C008CD1186F8A9300955C24 /* JSPromiseFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSPromiseFunctions.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                7C008CD8187124BB00955C24 /* JSPromiseDeferred.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSPromiseDeferred.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                7C008CD9187124BB00955C24 /* JSPromiseDeferred.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSPromiseDeferred.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                7C008CDC1871258D00955C24 /* JSPromiseReaction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSPromiseReaction.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                7C008CDD1871258D00955C24 /* JSPromiseReaction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSPromiseReaction.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                7C008CE5187631B600955C24 /* Microtask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Microtask.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 7C184E1817BEDBD3007CB63A /* JSPromise.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSPromise.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 7C184E1917BEDBD3007CB63A /* JSPromise.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSPromise.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 7C184E1C17BEE22E007CB63A /* JSPromisePrototype.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSPromisePrototype.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -2090,13 +2094,6 @@
</span><span class="cx">                 7C184E2117BEE240007CB63A /* JSPromiseConstructor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSPromiseConstructor.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 7C184E2417BFFA36007CB63A /* JSPromiseConstructor.lut.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JSPromiseConstructor.lut.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 7C184E2517BFFA36007CB63A /* JSPromisePrototype.lut.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JSPromisePrototype.lut.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><del>-                7C3BA28E17C039560072DDC9 /* JSPromiseResolver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSPromiseResolver.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
-                7C3BA28F17C039560072DDC9 /* JSPromiseResolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSPromiseResolver.h; sourceTree = &quot;&lt;group&gt;&quot;; };
-                7C3BA29017C039560072DDC9 /* JSPromiseResolverConstructor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSPromiseResolverConstructor.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
-                7C3BA29117C039560072DDC9 /* JSPromiseResolverConstructor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSPromiseResolverConstructor.h; sourceTree = &quot;&lt;group&gt;&quot;; };
-                7C3BA29217C039560072DDC9 /* JSPromiseResolverPrototype.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSPromiseResolverPrototype.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
-                7C3BA29317C039560072DDC9 /* JSPromiseResolverPrototype.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSPromiseResolverPrototype.h; sourceTree = &quot;&lt;group&gt;&quot;; };
-                7C3BA29A17C03BE10072DDC9 /* JSPromiseResolverPrototype.lut.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JSPromiseResolverPrototype.lut.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</del><span class="cx">                 7E4EE7080EBB7963005934AA /* StructureChain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StructureChain.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 7E4EE70E0EBB7A5B005934AA /* StructureChain.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StructureChain.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 7EFF00630EC05A9A00AA7C93 /* NodeInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NodeInfo.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -3359,7 +3356,6 @@
</span><span class="cx">                                 BC87CDB810712ACA000614CF /* JSONObject.lut.h */,
</span><span class="cx">                                 7C184E2417BFFA36007CB63A /* JSPromiseConstructor.lut.h */,
</span><span class="cx">                                 7C184E2517BFFA36007CB63A /* JSPromisePrototype.lut.h */,
</span><del>-                                7C3BA29A17C03BE10072DDC9 /* JSPromiseResolverPrototype.lut.h */,
</del><span class="cx">                                 A7C225CD1399849C00FF1662 /* KeywordLookup.h */,
</span><span class="cx">                                 BC18C52D0E16FCE100B34460 /* Lexer.lut.h */,
</span><span class="cx">                                 BC2680E60E16D52300A06E92 /* NumberConstructor.lut.h */,
</span><span class="lines">@@ -3621,18 +3617,16 @@
</span><span class="cx">                                 A7F9935D0FD7325100A0B2D0 /* JSONObject.h */,
</span><span class="cx">                                 7C184E1817BEDBD3007CB63A /* JSPromise.cpp */,
</span><span class="cx">                                 7C184E1917BEDBD3007CB63A /* JSPromise.h */,
</span><del>-                                7C15F65B17C199CE00794D40 /* JSPromiseCallback.cpp */,
-                                7C15F65C17C199CE00794D40 /* JSPromiseCallback.h */,
</del><ins>+                                7C008CD0186F8A9300955C24 /* JSPromiseFunctions.cpp */,
+                                7C008CD1186F8A9300955C24 /* JSPromiseFunctions.h */,
</ins><span class="cx">                                 7C184E2017BEE240007CB63A /* JSPromiseConstructor.cpp */,
</span><span class="cx">                                 7C184E2117BEE240007CB63A /* JSPromiseConstructor.h */,
</span><span class="cx">                                 7C184E1C17BEE22E007CB63A /* JSPromisePrototype.cpp */,
</span><span class="cx">                                 7C184E1D17BEE22E007CB63A /* JSPromisePrototype.h */,
</span><del>-                                7C3BA28E17C039560072DDC9 /* JSPromiseResolver.cpp */,
-                                7C3BA28F17C039560072DDC9 /* JSPromiseResolver.h */,
-                                7C3BA29017C039560072DDC9 /* JSPromiseResolverConstructor.cpp */,
-                                7C3BA29117C039560072DDC9 /* JSPromiseResolverConstructor.h */,
-                                7C3BA29217C039560072DDC9 /* JSPromiseResolverPrototype.cpp */,
-                                7C3BA29317C039560072DDC9 /* JSPromiseResolverPrototype.h */,
</del><ins>+                                7C008CD8187124BB00955C24 /* JSPromiseDeferred.cpp */,
+                                7C008CD9187124BB00955C24 /* JSPromiseDeferred.h */,
+                                7C008CDC1871258D00955C24 /* JSPromiseReaction.cpp */,
+                                7C008CDD1871258D00955C24 /* JSPromiseReaction.h */,
</ins><span class="cx">                                 A727FF660DA3053B00E548D7 /* JSPropertyNameIterator.cpp */,
</span><span class="cx">                                 A727FF650DA3053B00E548D7 /* JSPropertyNameIterator.h */,
</span><span class="cx">                                 862553CE16136AA5009F17D0 /* JSProxy.cpp */,
</span><span class="lines">@@ -3691,6 +3685,7 @@
</span><span class="cx">                                 F692A86B0255597D01FF60F7 /* MathObject.h */,
</span><span class="cx">                                 90213E3B123A40C200D422F3 /* MemoryStatistics.cpp */,
</span><span class="cx">                                 90213E3C123A40C200D422F3 /* MemoryStatistics.h */,
</span><ins>+                                7C008CE5187631B600955C24 /* Microtask.h */,
</ins><span class="cx">                                 86EBF2F91560F036008E9222 /* NameConstructor.cpp */,
</span><span class="cx">                                 86EBF2FA1560F036008E9222 /* NameConstructor.h */,
</span><span class="cx">                                 86EBF2FB1560F036008E9222 /* NameInstance.cpp */,
</span><span class="lines">@@ -4795,13 +4790,9 @@
</span><span class="cx">                                 BC87CDB910712AD4000614CF /* JSONObject.lut.h in Headers */,
</span><span class="cx">                                 9534AAFB0E5B7A9600B8A45B /* JSProfilerPrivate.h in Headers */,
</span><span class="cx">                                 7C184E1B17BEDBD3007CB63A /* JSPromise.h in Headers */,
</span><del>-                                7C15F65E17C199CE00794D40 /* JSPromiseCallback.h in Headers */,
</del><span class="cx">                                 7C184E2317BEE240007CB63A /* JSPromiseConstructor.h in Headers */,
</span><span class="cx">                                 7C184E1F17BEE22E007CB63A /* JSPromisePrototype.h in Headers */,
</span><del>-                                7C3BA29517C039560072DDC9 /* JSPromiseResolver.h in Headers */,
</del><span class="cx">                                 A74DEF96182D991400522C22 /* JSMapIterator.h in Headers */,
</span><del>-                                7C3BA29717C039560072DDC9 /* JSPromiseResolverConstructor.h in Headers */,
-                                7C3BA29917C039560072DDC9 /* JSPromiseResolverPrototype.h in Headers */,
</del><span class="cx">                                 862553D216136E1A009F17D0 /* JSProxy.h in Headers */,
</span><span class="cx">                                 BC18C4260E16F5CD00B34460 /* JSRetainPtr.h in Headers */,
</span><span class="cx">                                 14874AE615EBDE4A002E3587 /* JSScope.h in Headers */,
</span><span class="lines">@@ -4859,6 +4850,7 @@
</span><span class="cx">                                 0F4680A314BA7F8D00BFE272 /* LLIntExceptions.h in Headers */,
</span><span class="cx">                                 0F4680CB14BBB17200BFE272 /* LLIntOfflineAsmConfig.h in Headers */,
</span><span class="cx">                                 FED287B215EC9A5700DA8161 /* LLIntOpcode.h in Headers */,
</span><ins>+                                7C008CDB187124BB00955C24 /* JSPromiseDeferred.h in Headers */,
</ins><span class="cx">                                 0F4680A514BA7F8D00BFE272 /* LLIntSlowPaths.h in Headers */,
</span><span class="cx">                                 0F0B839D14BCF46600885B4F /* LLIntThunks.h in Headers */,
</span><span class="cx">                                 0FCEFACE1805E75500472CE4 /* LLVMAPI.h in Headers */,
</span><span class="lines">@@ -4960,6 +4952,7 @@
</span><span class="cx">                                 1474C33B16AA2D950062F01D /* PrototypeMap.h in Headers */,
</span><span class="cx">                                 0F9332A414CA7DD90085F3C6 /* PutByIdStatus.h in Headers */,
</span><span class="cx">                                 0F0CD4C215F1A6070032F1C0 /* PutDirectIndexMode.h in Headers */,
</span><ins>+                                7C008CE7187631B600955C24 /* Microtask.h in Headers */,
</ins><span class="cx">                                 0F9FC8C514E1B60400D52AE0 /* PutKind.h in Headers */,
</span><span class="cx">                                 147B84630E6DE6B1004775A4 /* PutPropertySlot.h in Headers */,
</span><span class="cx">                                 A593CF7D1840360300BFCE27 /* InspectorBackendDispatcher.h in Headers */,
</span><span class="lines">@@ -4967,6 +4960,7 @@
</span><span class="cx">                                 BC18C45A0E16F5CD00B34460 /* RegExp.h in Headers */,
</span><span class="cx">                                 A1712B3F11C7B228007A5315 /* RegExpCache.h in Headers */,
</span><span class="cx">                                 BCD202C20E1706A7002C7E82 /* RegExpConstructor.h in Headers */,
</span><ins>+                                7C008CDF1871258D00955C24 /* JSPromiseReaction.h in Headers */,
</ins><span class="cx">                                 BCD202D60E170708002C7E82 /* RegExpConstructor.lut.h in Headers */,
</span><span class="cx">                                 A1712B4111C7B235007A5315 /* RegExpKey.h in Headers */,
</span><span class="cx">                                 0F3AC752183EA1040032029F /* StackAlignment.h in Headers */,
</span><span class="lines">@@ -4989,6 +4983,7 @@
</span><span class="cx">                                 A7299DA217D12848005F5FF9 /* SetPrototype.h in Headers */,
</span><span class="cx">                                 86AE64AA135E5E1C00963012 /* SH4Assembler.h in Headers */,
</span><span class="cx">                                 0F2B670517B6B5AB00A7AE3F /* SimpleTypedArrayController.h in Headers */,
</span><ins>+                                7C008CD3186F8A9300955C24 /* JSPromiseFunctions.h in Headers */,
</ins><span class="cx">                                 A790DD6C182F499700588807 /* SetIteratorConstructor.h in Headers */,
</span><span class="cx">                                 14BA78F113AAB88F005B7C2C /* SlotVisitor.h in Headers */,
</span><span class="cx">                                 C2160FE715F7E95E00942DFC /* SlotVisitorInlines.h in Headers */,
</span><span class="lines">@@ -5670,6 +5665,7 @@
</span><span class="cx">                                 0FEA0A1E1708B00700BB722C /* FTLAbstractHeapRepository.cpp in Sources */,
</span><span class="cx">                                 0FEA0A09170513DB00BB722C /* FTLCapabilities.cpp in Sources */,
</span><span class="cx">                                 0FEA0A271709623B00BB722C /* FTLCommonValues.cpp in Sources */,
</span><ins>+                                7C008CDA187124BB00955C24 /* JSPromiseDeferred.cpp in Sources */,
</ins><span class="cx">                                 A532438918568335002ED692 /* InspectorJSFrontendDispatchers.cpp in Sources */,
</span><span class="cx">                                 0FEA0A0B170513DB00BB722C /* FTLCompile.cpp in Sources */,
</span><span class="cx">                                 0F235BD317178E1C00690C7F /* FTLExitArgument.cpp in Sources */,
</span><span class="lines">@@ -5695,6 +5691,7 @@
</span><span class="cx">                                 0F25F1B3181635F300522F39 /* FTLSlowPathCallKey.cpp in Sources */,
</span><span class="cx">                                 0F9D339A1803ADB70073C2BC /* FTLStackMaps.cpp in Sources */,
</span><span class="cx">                                 0FEA0A161706BB9000BB722C /* FTLState.cpp in Sources */,
</span><ins>+                                7C008CD2186F8A9300955C24 /* JSPromiseFunctions.cpp in Sources */,
</ins><span class="cx">                                 0F235BE117178E1C00690C7F /* FTLThunks.cpp in Sources */,
</span><span class="cx">                                 A593CF7C1840360300BFCE27 /* InspectorBackendDispatcher.cpp in Sources */,
</span><span class="cx">                                 0F235BE317178E1C00690C7F /* FTLValueFormat.cpp in Sources */,
</span><span class="lines">@@ -5706,6 +5703,7 @@
</span><span class="cx">                                 C2239D1A16262BDD005AC5FD /* GCThread.cpp in Sources */,
</span><span class="cx">                                 C21122E115DD9AB300790E3A /* GCThreadSharedData.cpp in Sources */,
</span><span class="cx">                                 0F93329F14CA7DCA0085F3C6 /* GetByIdStatus.cpp in Sources */,
</span><ins>+                                7C008CDE1871258D00955C24 /* JSPromiseReaction.cpp in Sources */,
</ins><span class="cx">                                 14280855107EC0E70013E7B2 /* GetterSetter.cpp in Sources */,
</span><span class="cx">                                 142E3135134FF0A600AFADB5 /* HandleSet.cpp in Sources */,
</span><span class="cx">                                 142E3137134FF0A600AFADB5 /* HandleStack.cpp in Sources */,
</span><span class="lines">@@ -5782,12 +5780,8 @@
</span><span class="cx">                                 A7F993600FD7325100A0B2D0 /* JSONObject.cpp in Sources */,
</span><span class="cx">                                 95F6E6950E5B5F970091E860 /* JSProfilerPrivate.cpp in Sources */,
</span><span class="cx">                                 7C184E1A17BEDBD3007CB63A /* JSPromise.cpp in Sources */,
</span><del>-                                7C15F65D17C199CE00794D40 /* JSPromiseCallback.cpp in Sources */,
</del><span class="cx">                                 7C184E2217BEE240007CB63A /* JSPromiseConstructor.cpp in Sources */,
</span><span class="cx">                                 7C184E1E17BEE22E007CB63A /* JSPromisePrototype.cpp in Sources */,
</span><del>-                                7C3BA29417C039560072DDC9 /* JSPromiseResolver.cpp in Sources */,
-                                7C3BA29617C039560072DDC9 /* JSPromiseResolverConstructor.cpp in Sources */,
-                                7C3BA29817C039560072DDC9 /* JSPromiseResolverPrototype.cpp in Sources */,
</del><span class="cx">                                 A727FF6B0DA3092200E548D7 /* JSPropertyNameIterator.cpp in Sources */,
</span><span class="cx">                                 862553D116136DA9009F17D0 /* JSProxy.cpp in Sources */,
</span><span class="cx">                                 14874AE515EBDE4A002E3587 /* JSScope.cpp in Sources */,
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapSlotVisitorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/SlotVisitor.h (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/SlotVisitor.h        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/JavaScriptCore/heap/SlotVisitor.h        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -53,6 +53,7 @@
</span><span class="cx">     
</span><span class="cx">     template&lt;typename T&gt; void append(JITWriteBarrier&lt;T&gt;*);
</span><span class="cx">     template&lt;typename T&gt; void append(WriteBarrierBase&lt;T&gt;*);
</span><ins>+    template&lt;typename Iterator&gt; void append(Iterator begin , Iterator end);
</ins><span class="cx">     void appendValues(WriteBarrierBase&lt;Unknown&gt;*, size_t count);
</span><span class="cx">     
</span><span class="cx">     template&lt;typename T&gt;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapSlotVisitorInlinesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/SlotVisitorInlines.h (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/SlotVisitorInlines.h        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/JavaScriptCore/heap/SlotVisitorInlines.h        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -116,6 +116,12 @@
</span><span class="cx">     internalAppend(slot, *slot-&gt;slot());
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+template&lt;typename Iterator&gt; inline void SlotVisitor::append(Iterator begin, Iterator end)
+{
+    for (auto it = begin; it != end; ++it)
+        append(&amp;*it);
+}
+
</ins><span class="cx"> ALWAYS_INLINE void SlotVisitor::appendValues(WriteBarrierBase&lt;Unknown&gt;* barriers, size_t count)
</span><span class="cx"> {
</span><span class="cx">     append(barriers-&gt;slot(), count);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinterpreterCallFrameh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/interpreter/CallFrame.h (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/interpreter/CallFrame.h        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/JavaScriptCore/interpreter/CallFrame.h        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -104,7 +104,6 @@
</span><span class="cx"> #if ENABLE(PROMISES)
</span><span class="cx">         static const HashTable&amp; promisePrototypeTable(CallFrame* callFrame) { return *callFrame-&gt;vm().promisePrototypeTable; }
</span><span class="cx">         static const HashTable&amp; promiseConstructorTable(CallFrame* callFrame) { return *callFrame-&gt;vm().promiseConstructorTable; }
</span><del>-        static const HashTable&amp; promiseResolverPrototypeTable(CallFrame* callFrame) { return *callFrame-&gt;vm().promiseResolverPrototypeTable; }
</del><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">         static CallFrame* create(Register* callFrameBase) { return static_cast&lt;CallFrame*&gt;(callFrameBase); }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeCommonIdentifierscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/CommonIdentifiers.cpp (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/CommonIdentifiers.cpp        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/JavaScriptCore/runtime/CommonIdentifiers.cpp        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -27,6 +27,7 @@
</span><span class="cx"> 
</span><span class="cx"> #define INITIALIZE_PROPERTY_NAME(name) , name(vm, #name)
</span><span class="cx"> #define INITIALIZE_KEYWORD(name) , name##Keyword(vm, #name)
</span><ins>+#define INITIALIZE_PRIVATE_NAME(name) , name##PrivateName(Identifier::from(PrivateName()))
</ins><span class="cx"> 
</span><span class="cx"> CommonIdentifiers::CommonIdentifiers(VM* vm)
</span><span class="cx">     : nullIdentifier()
</span><span class="lines">@@ -34,11 +35,10 @@
</span><span class="cx">     , underscoreProto(vm, &quot;__proto__&quot;)
</span><span class="cx">     , thisIdentifier(vm, &quot;this&quot;)
</span><span class="cx">     , useStrictIdentifier(vm, &quot;use strict&quot;)
</span><del>-    , iteratorPrivateName(Identifier::from(PrivateName()))
-    , iteratorNextPrivateName(Identifier::from(PrivateName()))
</del><span class="cx">     , hasNextIdentifier(vm, &quot;hasNext&quot;)
</span><span class="cx">     JSC_COMMON_IDENTIFIERS_EACH_KEYWORD(INITIALIZE_KEYWORD)
</span><span class="cx">     JSC_COMMON_IDENTIFIERS_EACH_PROPERTY_NAME(INITIALIZE_PROPERTY_NAME)
</span><ins>+    JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_PROPERTY_NAME(INITIALIZE_PRIVATE_NAME)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeCommonIdentifiersh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/CommonIdentifiers.h (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/CommonIdentifiers.h        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/JavaScriptCore/runtime/CommonIdentifiers.h        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -46,7 +46,6 @@
</span><span class="cx">     macro(Number) \
</span><span class="cx">     macro(Object) \
</span><span class="cx">     macro(Promise) \
</span><del>-    macro(PromiseResolver) \
</del><span class="cx">     macro(RangeError) \
</span><span class="cx">     macro(ReferenceError) \
</span><span class="cx">     macro(RegExp) \
</span><span class="lines">@@ -205,6 +204,15 @@
</span><span class="cx">     macro(with) \
</span><span class="cx">     macro(yield)
</span><span class="cx"> 
</span><ins>+#define JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_PROPERTY_NAME(macro) \
+    macro(iterator) \
+    macro(iteratorNext) \
+    macro(resolve) \
+    macro(reject) \
+    macro(promise) \
+    macro(fulfillmentHandler) \
+    macro(rejectionHandler)
+
</ins><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><span class="cx">     class CommonIdentifiers {
</span><span class="lines">@@ -219,10 +227,7 @@
</span><span class="cx">         const Identifier underscoreProto;
</span><span class="cx">         const Identifier thisIdentifier;
</span><span class="cx">         const Identifier useStrictIdentifier;
</span><del>-        const Identifier iteratorPrivateName;
-        const Identifier iteratorNextPrivateName;
</del><span class="cx">         const Identifier hasNextIdentifier;
</span><del>-
</del><span class="cx">         
</span><span class="cx"> #define JSC_IDENTIFIER_DECLARE_KEYWORD_NAME_GLOBAL(name) const Identifier name##Keyword;
</span><span class="cx">         JSC_COMMON_IDENTIFIERS_EACH_KEYWORD(JSC_IDENTIFIER_DECLARE_KEYWORD_NAME_GLOBAL)
</span><span class="lines">@@ -231,6 +236,10 @@
</span><span class="cx"> #define JSC_IDENTIFIER_DECLARE_PROPERTY_NAME_GLOBAL(name) const Identifier name;
</span><span class="cx">         JSC_COMMON_IDENTIFIERS_EACH_PROPERTY_NAME(JSC_IDENTIFIER_DECLARE_PROPERTY_NAME_GLOBAL)
</span><span class="cx"> #undef JSC_IDENTIFIER_DECLARE_PROPERTY_NAME_GLOBAL
</span><ins>+
+#define JSC_IDENTIFIER_DECLARE_PRIVATE_PROPERTY_NAME_GLOBAL(name) const Identifier name##PrivateName;
+        JSC_COMMON_PRIVATE_IDENTIFIERS_EACH_PROPERTY_NAME(JSC_IDENTIFIER_DECLARE_PRIVATE_PROPERTY_NAME_GLOBAL)
+#undef JSC_IDENTIFIER_DECLARE_PRIVATE_PROPERTY_NAME_GLOBAL
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx"> } // namespace JSC
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSGlobalObjectcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSGlobalObject.cpp (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSGlobalObject.cpp        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/JavaScriptCore/runtime/JSGlobalObject.cpp        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -89,6 +89,7 @@
</span><span class="cx"> #include &quot;MapIteratorPrototype.h&quot;
</span><span class="cx"> #include &quot;MapPrototype.h&quot;
</span><span class="cx"> #include &quot;MathObject.h&quot;
</span><ins>+#include &quot;Microtask.h&quot;
</ins><span class="cx"> #include &quot;NameConstructor.h&quot;
</span><span class="cx"> #include &quot;NameInstance.h&quot;
</span><span class="cx"> #include &quot;NamePrototype.h&quot;
</span><span class="lines">@@ -117,12 +118,8 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(PROMISES)
</span><span class="cx"> #include &quot;JSPromise.h&quot;
</span><del>-#include &quot;JSPromiseCallback.h&quot;
</del><span class="cx"> #include &quot;JSPromiseConstructor.h&quot;
</span><span class="cx"> #include &quot;JSPromisePrototype.h&quot;
</span><del>-#include &quot;JSPromiseResolver.h&quot;
-#include &quot;JSPromiseResolverConstructor.h&quot;
-#include &quot;JSPromiseResolverPrototype.h&quot;
</del><span class="cx"> #endif // ENABLE(PROMISES)
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(REMOTE_INSPECTOR)
</span><span class="lines">@@ -337,11 +334,6 @@
</span><span class="cx"> #if ENABLE(PROMISES)
</span><span class="cx">     m_promisePrototype.set(vm, this, JSPromisePrototype::create(exec, this, JSPromisePrototype::createStructure(vm, this, m_objectPrototype.get())));
</span><span class="cx">     m_promiseStructure.set(vm, this, JSPromise::createStructure(vm, this, m_promisePrototype.get()));
</span><del>-
-    m_promiseResolverPrototype.set(vm, this, JSPromiseResolverPrototype::create(exec, this, JSPromiseResolverPrototype::createStructure(vm, this, m_objectPrototype.get())));
-    m_promiseResolverStructure.set(vm, this, JSPromiseResolver::createStructure(vm, this, m_promiseResolverPrototype.get()));
-    m_promiseCallbackStructure.set(vm, this, JSPromiseCallback::createStructure(vm, this, m_functionPrototype.get()));
-    m_promiseWrapperCallbackStructure.set(vm, this, JSPromiseWrapperCallback::createStructure(vm, this, m_functionPrototype.get()));
</del><span class="cx"> #endif // ENABLE(PROMISES)
</span><span class="cx"> 
</span><span class="cx"> #define CREATE_PROTOTYPE_FOR_SIMPLE_TYPE(capitalName, lowerName, properName, instanceType, jsName) \
</span><span class="lines">@@ -358,11 +350,6 @@
</span><span class="cx">     JSCell* functionConstructor = FunctionConstructor::create(vm, FunctionConstructor::createStructure(vm, this, m_functionPrototype.get()), m_functionPrototype.get());
</span><span class="cx">     JSCell* arrayConstructor = ArrayConstructor::create(vm, ArrayConstructor::createStructure(vm, this, m_functionPrototype.get()), m_arrayPrototype.get());
</span><span class="cx"> 
</span><del>-#if ENABLE(PROMISES)
-    JSCell* promiseConstructor = JSPromiseConstructor::create(vm, JSPromiseConstructor::createStructure(vm, this, m_functionPrototype.get()), m_promisePrototype.get());
-    JSCell* promiseResolverConstructor = JSPromiseResolverConstructor::create(vm, JSPromiseResolverConstructor::createStructure(vm, this, m_functionPrototype.get()), m_promiseResolverPrototype.get());
-#endif // ENABLE(PROMISES)
-
</del><span class="cx">     m_regExpConstructor.set(vm, this, RegExpConstructor::create(vm, RegExpConstructor::createStructure(vm, this, m_functionPrototype.get()), m_regExpPrototype.get()));
</span><span class="cx"> 
</span><span class="cx"> #define CREATE_CONSTRUCTOR_FOR_SIMPLE_TYPE(capitalName, lowerName, properName, instanceType, jsName) \
</span><span class="lines">@@ -383,14 +370,14 @@
</span><span class="cx">     m_syntaxErrorConstructor.set(vm, this, NativeErrorConstructor::create(vm, this, nativeErrorStructure, nativeErrorPrototypeStructure, ASCIILiteral(&quot;SyntaxError&quot;)));
</span><span class="cx">     m_typeErrorConstructor.set(vm, this, NativeErrorConstructor::create(vm, this, nativeErrorStructure, nativeErrorPrototypeStructure, ASCIILiteral(&quot;TypeError&quot;)));
</span><span class="cx">     m_URIErrorConstructor.set(vm, this, NativeErrorConstructor::create(vm, this, nativeErrorStructure, nativeErrorPrototypeStructure, ASCIILiteral(&quot;URIError&quot;)));
</span><ins>+    m_promiseConstructor.set(vm, this, JSPromiseConstructor::create(vm, JSPromiseConstructor::createStructure(vm, this, m_functionPrototype.get()), m_promisePrototype.get()));
</ins><span class="cx"> 
</span><span class="cx">     m_objectPrototype-&gt;putDirectWithoutTransition(vm, vm.propertyNames-&gt;constructor, objectConstructor, DontEnum);
</span><span class="cx">     m_functionPrototype-&gt;putDirectWithoutTransition(vm, vm.propertyNames-&gt;constructor, functionConstructor, DontEnum);
</span><span class="cx">     m_arrayPrototype-&gt;putDirectWithoutTransition(vm, vm.propertyNames-&gt;constructor, arrayConstructor, DontEnum);
</span><span class="cx">     m_regExpPrototype-&gt;putDirectWithoutTransition(vm, vm.propertyNames-&gt;constructor, m_regExpConstructor.get(), DontEnum);
</span><span class="cx"> #if ENABLE(PROMISES)
</span><del>-    m_promisePrototype-&gt;putDirectWithoutTransition(vm, vm.propertyNames-&gt;constructor, promiseConstructor, DontEnum);
-    m_promiseResolverPrototype-&gt;putDirectWithoutTransition(vm, vm.propertyNames-&gt;constructor, promiseResolverConstructor, DontEnum);
</del><ins>+    m_promisePrototype-&gt;putDirectWithoutTransition(vm, vm.propertyNames-&gt;constructor, m_promiseConstructor.get(), DontEnum);
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     putDirectWithoutTransition(vm, vm.propertyNames-&gt;Object, objectConstructor, DontEnum);
</span><span class="lines">@@ -403,10 +390,7 @@
</span><span class="cx">     putDirectWithoutTransition(vm, vm.propertyNames-&gt;SyntaxError, m_syntaxErrorConstructor.get(), DontEnum);
</span><span class="cx">     putDirectWithoutTransition(vm, vm.propertyNames-&gt;TypeError, m_typeErrorConstructor.get(), DontEnum);
</span><span class="cx">     putDirectWithoutTransition(vm, vm.propertyNames-&gt;URIError, m_URIErrorConstructor.get(), DontEnum);
</span><del>-#if ENABLE(PROMISES)
-    putDirectWithoutTransition(vm, vm.propertyNames-&gt;Promise, promiseConstructor, DontEnum);
-    putDirectWithoutTransition(vm, vm.propertyNames-&gt;PromiseResolver, promiseResolverConstructor, DontEnum);
-#endif
</del><ins>+    putDirectWithoutTransition(vm, vm.propertyNames-&gt;Promise, m_promiseConstructor.get(), DontEnum);
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> #define PUT_CONSTRUCTOR_FOR_SIMPLE_TYPE(capitalName, lowerName, properName, instanceType, jsName) \
</span><span class="lines">@@ -624,6 +608,7 @@
</span><span class="cx">     visitor.append(&amp;thisObject-&gt;m_syntaxErrorConstructor);
</span><span class="cx">     visitor.append(&amp;thisObject-&gt;m_typeErrorConstructor);
</span><span class="cx">     visitor.append(&amp;thisObject-&gt;m_URIErrorConstructor);
</span><ins>+    visitor.append(&amp;thisObject-&gt;m_promiseConstructor);
</ins><span class="cx"> 
</span><span class="cx">     visitor.append(&amp;thisObject-&gt;m_evalFunction);
</span><span class="cx">     visitor.append(&amp;thisObject-&gt;m_callFunction);
</span><span class="lines">@@ -636,7 +621,6 @@
</span><span class="cx">     visitor.append(&amp;thisObject-&gt;m_errorPrototype);
</span><span class="cx"> #if ENABLE(PROMISES)
</span><span class="cx">     visitor.append(&amp;thisObject-&gt;m_promisePrototype);
</span><del>-    visitor.append(&amp;thisObject-&gt;m_promiseResolverPrototype);
</del><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     visitor.append(&amp;thisObject-&gt;m_withScopeStructure);
</span><span class="lines">@@ -668,9 +652,6 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(PROMISES)
</span><span class="cx">     visitor.append(&amp;thisObject-&gt;m_promiseStructure);
</span><del>-    visitor.append(&amp;thisObject-&gt;m_promiseResolverStructure);
-    visitor.append(&amp;thisObject-&gt;m_promiseCallbackStructure);
-    visitor.append(&amp;thisObject-&gt;m_promiseWrapperCallbackStructure);
</del><span class="cx"> #endif // ENABLE(PROMISES)
</span><span class="cx"> 
</span><span class="cx"> #define VISIT_SIMPLE_TYPE(CapitalName, lowerName, properName, instanceType, jsName) \
</span><span class="lines">@@ -798,4 +779,12 @@
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void JSGlobalObject::queueMicrotask(PassRefPtr&lt;Microtask&gt; task)
+{
+    if (globalObjectMethodTable()-&gt;queueTaskToEventLoop)
+        globalObjectMethodTable()-&gt;queueTaskToEventLoop(this, task);
+    else
+        WTFLogAlways(&quot;ERROR: Event loop not supported.&quot;);
+}
+
</ins><span class="cx"> } // namespace JSC
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSGlobalObjecth"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSGlobalObject.h (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSGlobalObject.h        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/JavaScriptCore/runtime/JSGlobalObject.h        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -61,10 +61,11 @@
</span><span class="cx"> class GetterSetter;
</span><span class="cx"> class GlobalCodeBlock;
</span><span class="cx"> class JSGlobalObjectDebuggable;
</span><ins>+class JSPromiseConstructor;
</ins><span class="cx"> class JSPromisePrototype;
</span><del>-class JSPromiseResolverPrototype;
</del><span class="cx"> class JSStack;
</span><span class="cx"> class LLIntOffsetsExtractor;
</span><ins>+class Microtask;
</ins><span class="cx"> class NativeErrorConstructor;
</span><span class="cx"> class ProgramCodeBlock;
</span><span class="cx"> class ProgramExecutable;
</span><span class="lines">@@ -103,13 +104,6 @@
</span><span class="cx"> 
</span><span class="cx"> typedef Vector&lt;ExecState*, 16&gt; ExecStateStack;
</span><span class="cx"> 
</span><del>-class TaskContext : public RefCounted&lt;TaskContext&gt; {
-public:
-    virtual ~TaskContext()
-    {
-    }
-};
-
</del><span class="cx"> struct GlobalObjectMethodTable {
</span><span class="cx">     typedef bool (*AllowsAccessFromFunctionPtr)(const JSGlobalObject*, ExecState*);
</span><span class="cx">     AllowsAccessFromFunctionPtr allowsAccessFrom;
</span><span class="lines">@@ -126,8 +120,7 @@
</span><span class="cx">     typedef bool (*JavaScriptExperimentsEnabledFunctionPtr)(const JSGlobalObject*);
</span><span class="cx">     JavaScriptExperimentsEnabledFunctionPtr javaScriptExperimentsEnabled;
</span><span class="cx"> 
</span><del>-    typedef void (*QueueTaskToEventLoopCallbackFunctionPtr)(ExecState*, TaskContext*);
-    typedef void (*QueueTaskToEventLoopFunctionPtr)(const JSGlobalObject*, QueueTaskToEventLoopCallbackFunctionPtr, PassRefPtr&lt;TaskContext&gt;);
</del><ins>+    typedef void (*QueueTaskToEventLoopFunctionPtr)(const JSGlobalObject*, PassRefPtr&lt;Microtask&gt;);
</ins><span class="cx">     QueueTaskToEventLoopFunctionPtr queueTaskToEventLoop;
</span><span class="cx"> 
</span><span class="cx">     typedef bool (*ShouldInterruptScriptBeforeTimeoutPtr)(const JSGlobalObject*);
</span><span class="lines">@@ -152,7 +145,6 @@
</span><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-
</del><span class="cx">     Register m_globalCallFrame[JSStack::CallFrameHeaderSize];
</span><span class="cx"> 
</span><span class="cx">     WriteBarrier&lt;JSObject&gt; m_globalThis;
</span><span class="lines">@@ -165,6 +157,7 @@
</span><span class="cx">     WriteBarrier&lt;NativeErrorConstructor&gt; m_syntaxErrorConstructor;
</span><span class="cx">     WriteBarrier&lt;NativeErrorConstructor&gt; m_typeErrorConstructor;
</span><span class="cx">     WriteBarrier&lt;NativeErrorConstructor&gt; m_URIErrorConstructor;
</span><ins>+    WriteBarrier&lt;JSPromiseConstructor&gt; m_promiseConstructor;
</ins><span class="cx"> 
</span><span class="cx">     WriteBarrier&lt;JSFunction&gt; m_evalFunction;
</span><span class="cx">     WriteBarrier&lt;JSFunction&gt; m_callFunction;
</span><span class="lines">@@ -176,7 +169,6 @@
</span><span class="cx">     WriteBarrier&lt;ArrayPrototype&gt; m_arrayPrototype;
</span><span class="cx">     WriteBarrier&lt;RegExpPrototype&gt; m_regExpPrototype;
</span><span class="cx">     WriteBarrier&lt;JSPromisePrototype&gt; m_promisePrototype;
</span><del>-    WriteBarrier&lt;JSPromiseResolverPrototype&gt; m_promiseResolverPrototype;
</del><span class="cx"> 
</span><span class="cx">     WriteBarrier&lt;Structure&gt; m_withScopeStructure;
</span><span class="cx">     WriteBarrier&lt;Structure&gt; m_strictEvalActivationStructure;
</span><span class="lines">@@ -210,9 +202,6 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(PROMISES)
</span><span class="cx">     WriteBarrier&lt;Structure&gt; m_promiseStructure;
</span><del>-    WriteBarrier&lt;Structure&gt; m_promiseResolverStructure;
-    WriteBarrier&lt;Structure&gt; m_promiseCallbackStructure;
-    WriteBarrier&lt;Structure&gt; m_promiseWrapperCallbackStructure;
</del><span class="cx"> #endif // ENABLE(PROMISES)
</span><span class="cx"> 
</span><span class="cx"> #define DEFINE_STORAGE_FOR_SIMPLE_TYPE(capitalName, lowerName, properName, instanceType, jsName) \
</span><span class="lines">@@ -347,6 +336,7 @@
</span><span class="cx">     NativeErrorConstructor* syntaxErrorConstructor() const { return m_syntaxErrorConstructor.get(); }
</span><span class="cx">     NativeErrorConstructor* typeErrorConstructor() const { return m_typeErrorConstructor.get(); }
</span><span class="cx">     NativeErrorConstructor* URIErrorConstructor() const { return m_URIErrorConstructor.get(); }
</span><ins>+    JSPromiseConstructor* promiseConstructor() const { return m_promiseConstructor.get(); }
</ins><span class="cx"> 
</span><span class="cx">     JSFunction* evalFunction() const { return m_evalFunction.get(); }
</span><span class="cx">     JSFunction* callFunction() const { return m_callFunction.get(); }
</span><span class="lines">@@ -368,7 +358,6 @@
</span><span class="cx">     RegExpPrototype* regExpPrototype() const { return m_regExpPrototype.get(); }
</span><span class="cx">     ErrorPrototype* errorPrototype() const { return m_errorPrototype.get(); }
</span><span class="cx">     JSPromisePrototype* promisePrototype() const { return m_promisePrototype.get(); }
</span><del>-    JSPromiseResolverPrototype* promiseResolverPrototype() const { return m_promiseResolverPrototype.get(); }
</del><span class="cx"> 
</span><span class="cx">     Structure* withScopeStructure() const { return m_withScopeStructure.get(); }
</span><span class="cx">     Structure* strictEvalActivationStructure() const { return m_strictEvalActivationStructure.get(); }
</span><span class="lines">@@ -423,9 +412,6 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(PROMISES)
</span><span class="cx">     Structure* promiseStructure() const { return m_promiseStructure.get(); }
</span><del>-    Structure* promiseResolverStructure() const { return m_promiseResolverStructure.get(); }
-    Structure* promiseCallbackStructure() const { return m_promiseCallbackStructure.get(); }
-    Structure* promiseWrapperCallbackStructure() const { return m_promiseWrapperCallbackStructure.get(); }
</del><span class="cx"> #endif // ENABLE(PROMISES)
</span><span class="cx"> 
</span><span class="cx">     JS_EXPORT_PRIVATE void setRemoteDebuggingEnabled(bool);
</span><span class="lines">@@ -500,6 +486,8 @@
</span><span class="cx">     static bool shouldInterruptScriptBeforeTimeout(const JSGlobalObject*) { return false; }
</span><span class="cx">     static bool javaScriptExperimentsEnabled(const JSGlobalObject*) { return false; }
</span><span class="cx"> 
</span><ins>+    void queueMicrotask(PassRefPtr&lt;Microtask&gt;);
+
</ins><span class="cx">     bool evalEnabled() const { return m_evalEnabled; }
</span><span class="cx">     const String&amp; evalDisabledErrorMessage() const { return m_evalDisabledErrorMessage; }
</span><span class="cx">     void setEvalEnabled(bool enabled, const String&amp; errorMessage = String())
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSPromisecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSPromise.cpp (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSPromise.cpp        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/JavaScriptCore/runtime/JSPromise.cpp        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -31,48 +31,22 @@
</span><span class="cx"> #include &quot;Error.h&quot;
</span><span class="cx"> #include &quot;JSCJSValueInlines.h&quot;
</span><span class="cx"> #include &quot;JSCellInlines.h&quot;
</span><del>-#include &quot;JSPromiseResolver.h&quot;
</del><ins>+#include &quot;JSPromiseConstructor.h&quot;
+#include &quot;JSPromiseReaction.h&quot;
+#include &quot;Microtask.h&quot;
</ins><span class="cx"> #include &quot;SlotVisitorInlines.h&quot;
</span><del>-#include &quot;StrongInlines.h&quot;
</del><span class="cx"> #include &quot;StructureInlines.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><del>-class JSPromiseTaskContext : public TaskContext {
-public:
-    static PassRefPtr&lt;JSPromiseTaskContext&gt; create(VM&amp; vm, JSPromise* promise)
-    {
-        return adoptRef(new JSPromiseTaskContext(vm, promise));
-    }
</del><ins>+static void triggerPromiseReactions(VM&amp;, JSGlobalObject*, Vector&lt;WriteBarrier&lt;JSPromiseReaction&gt;&gt;&amp;, JSValue);
</ins><span class="cx"> 
</span><del>-    JSPromise&amp; promise() const { return *m_promise.get(); }
-
-private:
-    JSPromiseTaskContext(VM&amp; vm, JSPromise* promise)
-    {
-        m_promise.set(vm, promise);
-    }
-
-    Strong&lt;JSPromise&gt; m_promise;
-};
-
</del><span class="cx"> const ClassInfo JSPromise::s_info = { &quot;Promise&quot;, &amp;Base::s_info, 0, 0, CREATE_METHOD_TABLE(JSPromise) };
</span><span class="cx"> 
</span><del>-JSPromise* JSPromise::create(VM&amp; vm, Structure* structure)
</del><ins>+JSPromise* JSPromise::create(VM&amp; vm, JSGlobalObject* globalObject, JSPromiseConstructor* constructor)
</ins><span class="cx"> {
</span><del>-    JSPromise* promise = new (NotNull, allocateCell&lt;JSPromise&gt;(vm.heap)) JSPromise(vm, structure);
-    promise-&gt;finishCreation(vm);
-    return promise;
-}
-
-JSPromise* JSPromise::createWithResolver(VM&amp; vm, JSGlobalObject* globalObject)
-{
</del><span class="cx">     JSPromise* promise = new (NotNull, allocateCell&lt;JSPromise&gt;(vm.heap)) JSPromise(vm, globalObject-&gt;promiseStructure());
</span><del>-    promise-&gt;finishCreation(vm);
-
-    JSPromiseResolver* resolver = JSPromiseResolver::create(vm, globalObject-&gt;promiseResolverStructure(), promise);
-    promise-&gt;setResolver(vm, resolver);
-
</del><ins>+    promise-&gt;finishCreation(vm, constructor);
</ins><span class="cx">     return promise;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -83,14 +57,16 @@
</span><span class="cx"> 
</span><span class="cx"> JSPromise::JSPromise(VM&amp; vm, Structure* structure)
</span><span class="cx">     : JSDestructibleObject(vm, structure)
</span><del>-    , m_state(Pending)
</del><ins>+    , m_status(Status::Unresolved)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void JSPromise::finishCreation(VM&amp; vm)
</del><ins>+void JSPromise::finishCreation(VM&amp; vm, JSPromiseConstructor* constructor)
</ins><span class="cx"> {
</span><span class="cx">     Base::finishCreation(vm);
</span><span class="cx">     ASSERT(inherits(info()));
</span><ins>+    
+    m_constructor.set(vm, this, constructor);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void JSPromise::destroy(JSCell* cell)
</span><span class="lines">@@ -107,137 +83,87 @@
</span><span class="cx"> 
</span><span class="cx">     Base::visitChildren(thisObject, visitor);
</span><span class="cx"> 
</span><del>-    visitor.append(&amp;thisObject-&gt;m_resolver);
</del><span class="cx">     visitor.append(&amp;thisObject-&gt;m_result);
</span><del>-
-    for (size_t i = 0; i &lt; thisObject-&gt;m_fulfillCallbacks.size(); ++i)
-        visitor.append(&amp;thisObject-&gt;m_fulfillCallbacks[i]);
-    for (size_t i = 0; i &lt; thisObject-&gt;m_rejectCallbacks.size(); ++i)
-        visitor.append(&amp;thisObject-&gt;m_rejectCallbacks[i]);
</del><ins>+    visitor.append(&amp;thisObject-&gt;m_constructor);
+    visitor.append(thisObject-&gt;m_resolveReactions.begin(), thisObject-&gt;m_resolveReactions.end());
+    visitor.append(thisObject-&gt;m_rejectReactions.begin(), thisObject-&gt;m_rejectReactions.end());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void JSPromise::setResolver(VM&amp; vm, JSPromiseResolver* resolver)
</del><ins>+void JSPromise::reject(VM&amp; vm, JSValue reason)
</ins><span class="cx"> {
</span><del>-    m_resolver.set(vm, this, resolver);
-}
</del><ins>+    // 1. If the value of promise's internal slot [[PromiseStatus]] is not &quot;unresolved&quot;, return.
+    if (m_status != Status::Unresolved)
+        return;
</ins><span class="cx"> 
</span><del>-JSPromiseResolver* JSPromise::resolver() const
-{
-    return m_resolver.get();
-}
</del><ins>+    DeferGC deferGC(vm.heap);
</ins><span class="cx"> 
</span><del>-void JSPromise::setResult(VM&amp; vm, JSValue result)
-{
-    m_result.set(vm, this, result);
-}
</del><ins>+    // 2. Let 'reactions' be the value of promise's [[RejectReactions]] internal slot.
+    Vector&lt;WriteBarrier&lt;JSPromiseReaction&gt;&gt; reactions;
+    reactions.swap(m_rejectReactions);
</ins><span class="cx"> 
</span><del>-JSValue JSPromise::result() const
-{
-    return m_result.get();
-}
</del><ins>+    // 3. Set the value of promise's [[Result]] internal slot to reason.
+    m_result.set(vm, this, reason);
</ins><span class="cx"> 
</span><del>-void JSPromise::setState(JSPromise::State state)
-{
-    ASSERT(m_state == Pending);
-    m_state = state;
-}
</del><ins>+    // 4. Set the value of promise's [[ResolveReactions]] internal slot to undefined.
+    m_resolveReactions.clear();
</ins><span class="cx"> 
</span><del>-JSPromise::State JSPromise::state() const
-{
-    return m_state;
</del><ins>+    // 5. Set the value of promise's [[RejectReactions]] internal slot to undefined.
+    // NOTE: Handled by the swap above.
+
+    // 6. Set the value of promise's [[PromiseStatus]] internal slot to &quot;has-rejection&quot;.
+    m_status = Status::HasRejection;
+
+    // 7. Return the result of calling TriggerPromiseReactions(reactions, reason).
+    triggerPromiseReactions(vm, globalObject(), reactions, reason);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void JSPromise::appendCallbacks(ExecState* exec, InternalFunction* fulfillCallback, InternalFunction* rejectCallback)
</del><ins>+void JSPromise::resolve(VM&amp; vm, JSValue resolution)
</ins><span class="cx"> {
</span><del>-    // 1. Append fulfillCallback to promise's fulfill callbacks.
-    m_fulfillCallbacks.append(WriteBarrier&lt;InternalFunction&gt;(exec-&gt;vm(), this, fulfillCallback));
-    
-    // 2. Append rejectCallback to promise' reject callbacks.
-    m_rejectCallbacks.append(WriteBarrier&lt;InternalFunction&gt;(exec-&gt;vm(), this, rejectCallback));
-
-    // 3. If promise's state is fulfilled, queue a task to process promise's fulfill callbacks with promise's result.
-    if (m_state == Fulfilled) {
-        queueTaskToProcessFulfillCallbacks(exec);
</del><ins>+    // 1. If the value of promise's internal slot [[PromiseStatus]] is not &quot;unresolved&quot;, return.
+    if (m_status != Status::Unresolved)
</ins><span class="cx">         return;
</span><del>-    }
</del><span class="cx"> 
</span><del>-    // 4. If promise's state is rejected, queue a task to process promise's reject callbacks with promise's result.
-    if (m_state == Rejected) {
-        queueTaskToProcessRejectCallbacks(exec);
-        return;
-    }
-}
</del><ins>+    DeferGC deferGC(vm.heap);
</ins><span class="cx"> 
</span><del>-void JSPromise::queueTaskToProcessFulfillCallbacks(ExecState* exec)
-{
-    JSGlobalObject* globalObject = this-&gt;globalObject();
-    if (globalObject-&gt;globalObjectMethodTable()-&gt;queueTaskToEventLoop)
-        globalObject-&gt;globalObjectMethodTable()-&gt;queueTaskToEventLoop(globalObject, processFulfillCallbacksForTask, JSPromiseTaskContext::create(exec-&gt;vm(), this));
-    else
-        WTFLogAlways(&quot;ERROR: Event loop not supported.&quot;);
-}
</del><ins>+    // 2. Let 'reactions' be the value of promise's [[ResolveReactions]] internal slot.
+    Vector&lt;WriteBarrier&lt;JSPromiseReaction&gt;&gt; reactions;
+    reactions.swap(m_resolveReactions);
+    
+    // 3. Set the value of promise's [[Result]] internal slot to resolution.
+    m_result.set(vm, this, resolution);
</ins><span class="cx"> 
</span><del>-void JSPromise::queueTaskToProcessRejectCallbacks(ExecState* exec)
-{
-    JSGlobalObject* globalObject = this-&gt;globalObject();
-    if (globalObject-&gt;globalObjectMethodTable()-&gt;queueTaskToEventLoop)
-        globalObject-&gt;globalObjectMethodTable()-&gt;queueTaskToEventLoop(globalObject, processRejectCallbacksForTask, JSPromiseTaskContext::create(exec-&gt;vm(), this));
-    else
-        WTFLogAlways(&quot;ERROR: Event loop not supported.&quot;);
-}
</del><ins>+    // 4. Set the value of promise's [[ResolveReactions]] internal slot to undefined.
+    // NOTE: Handled by the swap above.
</ins><span class="cx"> 
</span><del>-void JSPromise::processFulfillCallbacksForTask(ExecState* exec, TaskContext* taskContext)
-{
-    JSPromiseTaskContext* promiseTaskContext = static_cast&lt;JSPromiseTaskContext*&gt;(taskContext);
-    JSPromise&amp; promise = promiseTaskContext-&gt;promise();
</del><ins>+    // 5. Set the value of promise's [[RejectReactions]] internal slot to undefined.
+    m_rejectReactions.clear();
</ins><span class="cx"> 
</span><del>-    promise.processFulfillCallbacksWithValue(exec, promise.result());
</del><ins>+    // 6. Set the value of promise's [[PromiseStatus]] internal slot to &quot;has-resolution&quot;.
+    m_status = Status::HasResolution;
+
+    // 7. Return the result of calling TriggerPromiseReactions(reactions, resolution).
+    triggerPromiseReactions(vm, globalObject(), reactions, resolution);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void JSPromise::processRejectCallbacksForTask(ExecState* exec, TaskContext* taskContext)
</del><ins>+void JSPromise::appendResolveReaction(VM&amp; vm, JSPromiseReaction* reaction)
</ins><span class="cx"> {
</span><del>-    JSPromiseTaskContext* promiseTaskContext = static_cast&lt;JSPromiseTaskContext*&gt;(taskContext);
-    JSPromise&amp; promise = promiseTaskContext-&gt;promise();
-
-    promise.processRejectCallbacksWithValue(exec, promise.result());
</del><ins>+    m_resolveReactions.append(WriteBarrier&lt;JSPromiseReaction&gt;(vm, this, reaction));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void JSPromise::processFulfillCallbacksWithValue(ExecState* exec, JSValue value)
</del><ins>+void JSPromise::appendRejectReaction(VM&amp; vm, JSPromiseReaction* reaction)
</ins><span class="cx"> {
</span><del>-    ASSERT(m_state == Fulfilled);
-
-    for (size_t i = 0; i &lt; m_fulfillCallbacks.size(); ++i) {
-        JSValue callback = m_fulfillCallbacks[i].get();
-
-        CallData callData;
-        CallType callType = JSC::getCallData(callback, callData);
-        ASSERT(callType != CallTypeNone);
-
-        MarkedArgumentBuffer arguments;
-        arguments.append(value);
-        call(exec, callback, callType, callData, this, arguments);
-    }
-    
-    m_fulfillCallbacks.clear();
</del><ins>+    m_rejectReactions.append(WriteBarrier&lt;JSPromiseReaction&gt;(vm, this, reaction));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void JSPromise::processRejectCallbacksWithValue(ExecState* exec, JSValue value)
</del><ins>+void triggerPromiseReactions(VM&amp; vm, JSGlobalObject* globalObject, Vector&lt;WriteBarrier&lt;JSPromiseReaction&gt;&gt;&amp; reactions, JSValue argument)
</ins><span class="cx"> {
</span><del>-    ASSERT(m_state == Rejected);
-
-    for (size_t i = 0; i &lt; m_rejectCallbacks.size(); ++i) {
-        JSValue callback = m_rejectCallbacks[i].get();
-
-        CallData callData;
-        CallType callType = JSC::getCallData(callback, callData);
-        ASSERT(callType != CallTypeNone);
-
-        MarkedArgumentBuffer arguments;
-        arguments.append(value);
-        call(exec, callback, callType, callData, this, arguments);
</del><ins>+    // 1. Repeat for each reaction in reactions, in original insertion order
+    for (auto&amp; reaction : reactions) {
+        // i. Call QueueMicrotask(ExecutePromiseReaction, (reaction, argument)).
+        globalObject-&gt;queueMicrotask(createExecutePromiseReactionMicrotask(vm, reaction.get(), argument));
</ins><span class="cx">     }
</span><span class="cx">     
</span><del>-    m_rejectCallbacks.clear();
</del><ins>+    // 2. Return.
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace JSC
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSPromiseh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSPromise.h (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSPromise.h        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/JavaScriptCore/runtime/JSPromise.h        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -32,61 +32,58 @@
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><del>-class JSPromiseResolver;
-class InternalFunction;
-class TaskContext;
</del><ins>+class JSPromiseReaction;
+class JSPromiseConstructor;
</ins><span class="cx"> 
</span><span class="cx"> class JSPromise : public JSDestructibleObject {
</span><span class="cx"> public:
</span><span class="cx">     typedef JSDestructibleObject Base;
</span><span class="cx"> 
</span><del>-    static JSPromise* create(VM&amp;, Structure*);
</del><ins>+    static JSPromise* create(VM&amp;, JSGlobalObject*, JSPromiseConstructor*);
</ins><span class="cx">     static Structure* createStructure(VM&amp;, JSGlobalObject*, JSValue);
</span><span class="cx"> 
</span><del>-    JS_EXPORT_PRIVATE static JSPromise* createWithResolver(VM&amp;, JSGlobalObject*);
-
</del><span class="cx">     DECLARE_INFO;
</span><span class="cx"> 
</span><del>-    void setResolver(VM&amp;, JSPromiseResolver*);
-    JS_EXPORT_PRIVATE JSPromiseResolver* resolver() const;
-
-    enum State {
-        Pending,
-        Fulfilled,
-        Rejected,
</del><ins>+    enum class Status {
+        Unresolved,
+        HasResolution,
+        HasRejection
</ins><span class="cx">     };
</span><span class="cx"> 
</span><del>-    void setState(State);
-    State state() const;
</del><ins>+    Status status() const
+    {
+        return m_status;
+    }
</ins><span class="cx"> 
</span><del>-    void setResult(VM&amp;, JSValue);
-    JSValue result() const;
</del><ins>+    JSValue result() const
+    {
+        ASSERT(m_status != Status::Unresolved);
+        return m_result.get();
+    }
</ins><span class="cx"> 
</span><del>-    void appendCallbacks(ExecState*, InternalFunction* fulfillCallback, InternalFunction* rejectCallback);
</del><ins>+    JSPromiseConstructor* constructor() const
+    {
+        return m_constructor.get();
+    }
</ins><span class="cx"> 
</span><del>-    void queueTaskToProcessFulfillCallbacks(ExecState*);
-    void queueTaskToProcessRejectCallbacks(ExecState*);
-    void processFulfillCallbacksWithValue(ExecState*, JSValue);
-    void processRejectCallbacksWithValue(ExecState*, JSValue);
</del><ins>+    void reject(VM&amp;, JSValue);
+    void resolve(VM&amp;, JSValue);
</ins><span class="cx"> 
</span><del>-protected:
-    void finishCreation(VM&amp;);
-    static const unsigned StructureFlags = OverridesVisitChildren | JSObject::StructureFlags;
</del><ins>+    void appendResolveReaction(VM&amp;, JSPromiseReaction*);
+    void appendRejectReaction(VM&amp;, JSPromiseReaction*);
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     JSPromise(VM&amp;, Structure*);
</span><del>-
-    static void processFulfillCallbacksForTask(ExecState*, TaskContext*);
-    static void processRejectCallbacksForTask(ExecState*, TaskContext*);
-
</del><ins>+    void finishCreation(VM&amp;, JSPromiseConstructor*);
+    static const unsigned StructureFlags = OverridesVisitChildren | JSObject::StructureFlags;
</ins><span class="cx">     static void destroy(JSCell*);
</span><span class="cx">     static void visitChildren(JSCell*, SlotVisitor&amp;);
</span><span class="cx"> 
</span><del>-    WriteBarrier&lt;JSPromiseResolver&gt; m_resolver;
</del><ins>+    Status m_status;
</ins><span class="cx">     WriteBarrier&lt;Unknown&gt; m_result;
</span><del>-    Vector&lt;WriteBarrier&lt;InternalFunction&gt;&gt; m_fulfillCallbacks;
-    Vector&lt;WriteBarrier&lt;InternalFunction&gt;&gt; m_rejectCallbacks;
-    State m_state;
</del><ins>+    WriteBarrier&lt;JSPromiseConstructor&gt; m_constructor;
+    Vector&lt;WriteBarrier&lt;JSPromiseReaction&gt;&gt; m_resolveReactions;
+    Vector&lt;WriteBarrier&lt;JSPromiseReaction&gt;&gt; m_rejectReactions;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace JSC
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSPromiseCallbackcpp"></a>
<div class="delfile"><h4>Deleted: trunk/Source/JavaScriptCore/runtime/JSPromiseCallback.cpp (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSPromiseCallback.cpp        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/JavaScriptCore/runtime/JSPromiseCallback.cpp        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -1,196 +0,0 @@
</span><del>-/*
- * Copyright (C) 2013 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include &quot;config.h&quot;
-#include &quot;JSPromiseCallback.h&quot;
-
-#if ENABLE(PROMISES)
-
-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
-#include &quot;JSPromise.h&quot;
-#include &quot;JSPromiseResolver.h&quot;
-#include &quot;SlotVisitorInlines.h&quot;
-#include &quot;StructureInlines.h&quot;
-
-namespace JSC {
-
-const ClassInfo JSPromiseCallback::s_info = { &quot;Function&quot;, &amp;Base::s_info, 0, 0, CREATE_METHOD_TABLE(JSPromiseCallback) };
-
-JSPromiseCallback* JSPromiseCallback::create(VM&amp; vm, Structure* structure, JSPromiseResolver* resolver, Algorithm algorithm)
-{
-    JSPromiseCallback* constructor = new (NotNull, allocateCell&lt;JSPromiseCallback&gt;(vm.heap)) JSPromiseCallback(vm, structure, algorithm);
-    constructor-&gt;finishCreation(vm, resolver);
-    return constructor;
-}
-
-Structure* JSPromiseCallback::createStructure(VM&amp; vm, JSGlobalObject* globalObject, JSValue prototype)
-{
-    return Structure::create(vm, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), info());
-}
-
-JSPromiseCallback::JSPromiseCallback(VM&amp; vm, Structure* structure, Algorithm algorithm)
-    : InternalFunction(vm, structure)
-    , m_algorithm(algorithm)
-{
-}
-
-void JSPromiseCallback::finishCreation(VM&amp; vm, JSPromiseResolver* resolver)
-{
-    Base::finishCreation(vm, &quot;PromiseCallback&quot;);
-    m_resolver.set(vm, this, resolver);
-}
-
-void JSPromiseCallback::visitChildren(JSCell* cell, SlotVisitor&amp; visitor)
-{
-    JSPromiseCallback* thisObject = jsCast&lt;JSPromiseCallback*&gt;(cell);
-    ASSERT_GC_OBJECT_INHERITS(thisObject, info());
-    COMPILE_ASSERT(StructureFlags &amp; OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag);
-    ASSERT(thisObject-&gt;structure()-&gt;typeInfo().overridesVisitChildren());
-
-    Base::visitChildren(thisObject, visitor);
-
-    visitor.append(&amp;thisObject-&gt;m_resolver);
-}
-
-EncodedJSValue JSC_HOST_CALL JSPromiseCallback::callPromiseCallback(ExecState* exec)
-{
-    JSPromiseCallback* promiseCallback = jsCast&lt;JSPromiseCallback*&gt;(exec-&gt;callee());
-    JSPromiseResolver* resolver = promiseCallback-&gt;m_resolver.get();
-
-    // 1. Let value be the first argument that is passed, and undefined otherwise.
-    JSValue value = exec-&gt;argument(0);
-
-    // 2. Run resolver's algorithm with value and the synchronous flag set.
-    switch (promiseCallback-&gt;m_algorithm) {
-    case JSPromiseCallback::Fulfill:
-        resolver-&gt;fulfill(exec, value, JSPromiseResolver::ResolveSynchronously);
-        break;
-
-    case JSPromiseCallback::Resolve:
-        resolver-&gt;resolve(exec, value, JSPromiseResolver::ResolveSynchronously);
-        break;
-
-    case JSPromiseCallback::Reject:
-        resolver-&gt;reject(exec, value, JSPromiseResolver::ResolveSynchronously);
-        break;
-    }
-
-    return JSValue::encode(jsUndefined());
-}
-
-CallType JSPromiseCallback::getCallData(JSCell*, CallData&amp; callData)
-{
-    callData.native.function = callPromiseCallback;
-    return CallTypeHost;
-}
-
-
-
-
-const ClassInfo JSPromiseWrapperCallback::s_info = { &quot;Function&quot;, &amp;Base::s_info, 0, 0, CREATE_METHOD_TABLE(JSPromiseWrapperCallback) };
-
-JSPromiseWrapperCallback* JSPromiseWrapperCallback::create(VM&amp; vm, Structure* structure, JSPromiseResolver* resolver, JSValue callback)
-{
-    JSPromiseWrapperCallback* constructor = new (NotNull, allocateCell&lt;JSPromiseWrapperCallback&gt;(vm.heap)) JSPromiseWrapperCallback(vm, structure);
-    constructor-&gt;finishCreation(vm, resolver, callback);
-    return constructor;
-}
-
-Structure* JSPromiseWrapperCallback::createStructure(VM&amp; vm, JSGlobalObject* globalObject, JSValue prototype)
-{
-    return Structure::create(vm, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), info());
-}
-
-JSPromiseWrapperCallback::JSPromiseWrapperCallback(VM&amp; vm, Structure* structure)
-    : InternalFunction(vm, structure)
-{
-}
-
-void JSPromiseWrapperCallback::finishCreation(VM&amp; vm, JSPromiseResolver* resolver, JSValue callback)
-{
-    Base::finishCreation(vm, &quot;PromiseWrapperCallback&quot;);
-    m_resolver.set(vm, this, resolver);
-    m_callback.set(vm, this, callback);
-}
-
-void JSPromiseWrapperCallback::visitChildren(JSCell* cell, SlotVisitor&amp; visitor)
-{
-    JSPromiseWrapperCallback* thisObject = jsCast&lt;JSPromiseWrapperCallback*&gt;(cell);
-    ASSERT_GC_OBJECT_INHERITS(thisObject, info());
-    COMPILE_ASSERT(StructureFlags &amp; OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag);
-    ASSERT(thisObject-&gt;structure()-&gt;typeInfo().overridesVisitChildren());
-
-    Base::visitChildren(thisObject, visitor);
-
-    visitor.append(&amp;thisObject-&gt;m_resolver);
-    visitor.append(&amp;thisObject-&gt;m_callback);
-}
-
-EncodedJSValue JSC_HOST_CALL JSPromiseWrapperCallback::callPromiseWrapperCallback(ExecState* exec)
-{
-    JSPromiseWrapperCallback* promiseWrapperCallback = jsCast&lt;JSPromiseWrapperCallback*&gt;(exec-&gt;callee());
-
-    JSPromiseResolver* resolver = promiseWrapperCallback-&gt;m_resolver.get();
-    JSValue callback = promiseWrapperCallback-&gt;m_callback.get();
-
-    // 1. Let argument be the first argument that is passed, and undefined otherwise.
-    JSValue argument = exec-&gt;argument(0);
-
-    // 2. Set callback's callback this value to resolver's associated promise.
-    // 3. Let value be the result of invoking callback with argument as argument.
-    CallData callData;
-    CallType callType = JSC::getCallData(callback, callData);
-    ASSERT(callType != CallTypeNone);
-
-    MarkedArgumentBuffer callbackArguments;
-    callbackArguments.append(argument);
-    JSValue value = JSC::call(exec, callback, callType, callData, resolver-&gt;promise(), callbackArguments);
-
-    // 4. If invoking callback threw an exception, catch it and run resolver's reject
-    //    with the thrown exception as argument and the synchronous flag set.
-    if (exec-&gt;hadException()) {
-        JSValue exception = exec-&gt;exception();
-        exec-&gt;clearException();
-
-        resolver-&gt;reject(exec, exception, JSPromiseResolver::ResolveSynchronously);
-        return JSValue::encode(jsUndefined());
-    }
-
-    // 5. Otherwise, run resolver's resolve with value and the synchronous flag set.
-    resolver-&gt;resolve(exec, value, JSPromiseResolver::ResolveSynchronously);
-
-    return JSValue::encode(jsUndefined());
-}
-
-CallType JSPromiseWrapperCallback::getCallData(JSCell*, CallData&amp; callData)
-{
-    callData.native.function = callPromiseWrapperCallback;
-    return CallTypeHost;
-}
-
-} // namespace JSC
-
-#endif // ENABLE(PROMISES)
</del></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSPromiseCallbackh"></a>
<div class="delfile"><h4>Deleted: trunk/Source/JavaScriptCore/runtime/JSPromiseCallback.h (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSPromiseCallback.h        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/JavaScriptCore/runtime/JSPromiseCallback.h        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -1,93 +0,0 @@
</span><del>-/*
- * Copyright (C) 2013 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef JSPromiseCallback_h
-#define JSPromiseCallback_h
-
-#if ENABLE(PROMISES)
-
-#include &quot;InternalFunction.h&quot;
-
-namespace JSC {
-
-class JSPromiseResolver;
-
-class JSPromiseCallback : public InternalFunction {
-public:
-    typedef InternalFunction Base;
-
-    enum Algorithm {
-        Fulfill,
-        Resolve,
-        Reject,
-    };
-
-    static JSPromiseCallback* create(VM&amp;, Structure*, JSPromiseResolver*, Algorithm);
-    static Structure* createStructure(VM&amp;, JSGlobalObject*, JSValue);
-
-    DECLARE_INFO;
-
-private:
-    JSPromiseCallback(VM&amp;, Structure*, Algorithm);
-    void finishCreation(VM&amp;, JSPromiseResolver*);
-    static const unsigned StructureFlags = OverridesVisitChildren | JSObject::StructureFlags;
-
-    static EncodedJSValue JSC_HOST_CALL callPromiseCallback(ExecState*);
-    static CallType getCallData(JSCell*, CallData&amp;);
-
-    static void visitChildren(JSCell*, SlotVisitor&amp;);
-
-    WriteBarrier&lt;JSPromiseResolver&gt; m_resolver;
-    Algorithm m_algorithm;
-};
-
-class JSPromiseWrapperCallback : public InternalFunction {
-public:
-    typedef InternalFunction Base;
-
-    static JSPromiseWrapperCallback* create(VM&amp;, Structure*, JSPromiseResolver*, JSValue callback);
-    static Structure* createStructure(VM&amp;, JSGlobalObject*, JSValue);
-
-    DECLARE_INFO;
-
-private:
-    JSPromiseWrapperCallback(VM&amp;, Structure*);
-    void finishCreation(VM&amp;, JSPromiseResolver*, JSValue callback);
-    static const unsigned StructureFlags = OverridesVisitChildren | JSObject::StructureFlags;
-
-    static EncodedJSValue JSC_HOST_CALL callPromiseWrapperCallback(ExecState*);
-    static CallType getCallData(JSCell*, CallData&amp;);
-
-    static void visitChildren(JSCell*, SlotVisitor&amp;);
-
-    WriteBarrier&lt;JSPromiseResolver&gt; m_resolver;
-    WriteBarrier&lt;Unknown&gt; m_callback;
-};
-
-} // namespace JSC
-
-#endif // ENABLE(PROMISES)
-
-#endif // JSPromiseCallback_h
</del></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSPromiseConstructorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSPromiseConstructor.cpp (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSPromiseConstructor.cpp        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/JavaScriptCore/runtime/JSPromiseConstructor.cpp        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -32,9 +32,9 @@
</span><span class="cx"> #include &quot;JSCJSValueInlines.h&quot;
</span><span class="cx"> #include &quot;JSCellInlines.h&quot;
</span><span class="cx"> #include &quot;JSPromise.h&quot;
</span><del>-#include &quot;JSPromiseCallback.h&quot;
</del><ins>+#include &quot;JSPromiseDeferred.h&quot;
+#include &quot;JSPromiseFunctions.h&quot;
</ins><span class="cx"> #include &quot;JSPromisePrototype.h&quot;
</span><del>-#include &quot;JSPromiseResolver.h&quot;
</del><span class="cx"> #include &quot;Lookup.h&quot;
</span><span class="cx"> #include &quot;StructureInlines.h&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -42,13 +42,9 @@
</span><span class="cx"> 
</span><span class="cx"> STATIC_ASSERT_IS_TRIVIALLY_DESTRUCTIBLE(JSPromiseConstructor);
</span><span class="cx"> 
</span><del>-// static Promise fulfill(any value);
-static EncodedJSValue JSC_HOST_CALL JSPromiseConstructorFuncFulfill(ExecState*);
-// static Promise resolve(any value); // same as any(value)
</del><ins>+static EncodedJSValue JSC_HOST_CALL JSPromiseConstructorFuncCast(ExecState*);
</ins><span class="cx"> static EncodedJSValue JSC_HOST_CALL JSPromiseConstructorFuncResolve(ExecState*);
</span><del>-// static Promise reject(any value);
</del><span class="cx"> static EncodedJSValue JSC_HOST_CALL JSPromiseConstructorFuncReject(ExecState*);
</span><del>-
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #include &quot;JSPromiseConstructor.lut.h&quot;
</span><span class="lines">@@ -59,7 +55,7 @@
</span><span class="cx"> 
</span><span class="cx"> /* Source for JSPromiseConstructor.lut.h
</span><span class="cx"> @begin promiseConstructorTable
</span><del>-  fulfill         JSPromiseConstructorFuncFulfill             DontEnum|Function 1
</del><ins>+  cast            JSPromiseConstructorFuncCast                DontEnum|Function 1
</ins><span class="cx">   resolve         JSPromiseConstructorFuncResolve             DontEnum|Function 1
</span><span class="cx">   reject          JSPromiseConstructorFuncReject              DontEnum|Function 1
</span><span class="cx"> @end
</span><span class="lines">@@ -91,39 +87,58 @@
</span><span class="cx"> 
</span><span class="cx"> static EncodedJSValue JSC_HOST_CALL constructPromise(ExecState* exec)
</span><span class="cx"> {
</span><del>-    if (!exec-&gt;argumentCount())
-        return throwVMError(exec, createTypeError(exec, &quot;Expected at least one argument&quot;));
</del><ins>+    // NOTE: We ignore steps 1-4 as they only matter if you support subclassing, which we do not yet.
+    // 1. Let promise be the this value.
+    // 2. If Type(promise) is not Object, then throw a TypeError exception.
+    // 3. If promise does not have a [[PromiseStatus]] internal slot, then throw a TypeError exception.
+    // 4. If promise's [[PromiseStatus]] internal slot is not undefined, then throw a TypeError exception.
</ins><span class="cx"> 
</span><del>-    JSValue function = exec-&gt;uncheckedArgument(0);
</del><ins>+    JSValue resolver = exec-&gt;argument(0);
</ins><span class="cx"> 
</span><ins>+    // 5. IsCallable(resolver) is false, then throw a TypeError exception
</ins><span class="cx">     CallData callData;
</span><del>-    CallType callType = getCallData(function, callData);
</del><ins>+    CallType callType = getCallData(resolver, callData);
</ins><span class="cx">     if (callType == CallTypeNone)
</span><del>-        return throwVMError(exec, createTypeError(exec, &quot;Expected function as as first argument&quot;));
</del><ins>+        return JSValue::encode(throwTypeError(exec, ASCIILiteral(&quot;Promise constructor takes a function argument&quot;)));
</ins><span class="cx"> 
</span><del>-    JSGlobalObject* globalObject = asInternalFunction(exec-&gt;callee())-&gt;globalObject();
</del><ins>+    VM&amp; vm = exec-&gt;vm();
+    JSGlobalObject* globalObject = exec-&gt;callee()-&gt;globalObject();
+
+    JSPromise* promise = JSPromise::create(vm, globalObject, jsCast&lt;JSPromiseConstructor*&gt;(exec-&gt;callee()));
+
+    // NOTE: Steps 6-8 are handled by JSPromise::create().
+    // 6. Set promise's [[PromiseStatus]] internal slot to &quot;unresolved&quot;.
+    // 7. Set promise's [[ResolveReactions]] internal slot to a new empty List.
+    // 8. Set promise's [[RejectReactions]] internal slot to a new empty List.
</ins><span class="cx">     
</span><del>-    // 1. Let promise be a new promise.
-    JSPromise* promise = JSPromise::createWithResolver(exec-&gt;vm(), globalObject);
</del><ins>+    // 9. Let 'resolve' be a new built-in function object as defined in Resolve Promise Functions.
+    JSFunction* resolve = createResolvePromiseFunction(vm, globalObject);
</ins><span class="cx"> 
</span><del>-    // 2. Let resolver be promise's associated resolver.
-    JSPromiseResolver* resolver = promise-&gt;resolver();
</del><ins>+    // 10. Set the [[Promise]] internal slot of 'resolve' to 'promise'.
+    resolve-&gt;putDirect(vm, vm.propertyNames-&gt;promisePrivateName, promise);
+    
+    // 11. Let 'reject' be a new built-in function object as defined in Reject Promise Functions
+    JSFunction* reject = createRejectPromiseFunction(vm, globalObject);
</ins><span class="cx"> 
</span><del>-    // 3. Set init's callback this value to promise.
-    // 4. Invoke init with resolver passed as parameter.
-    MarkedArgumentBuffer initArguments;
-    initArguments.append(resolver);
-    call(exec, function, callType, callData, promise, initArguments);
</del><ins>+    // 12. Set the [[Promise]] internal slot of 'reject' to 'promise'.
+    reject-&gt;putDirect(vm, vm.propertyNames-&gt;promisePrivateName, promise);
</ins><span class="cx"> 
</span><del>-    // 5. If init threw an exception, catch it, and then, if resolver's resolved flag
-    //    is unset, run resolver's reject with the thrown exception as argument.
</del><ins>+    // 13. Let 'result' be the result of calling the [[Call]] internal method of resolver with
+    //     undefined as thisArgument and a List containing resolve and reject as argumentsList.
+    MarkedArgumentBuffer arguments;
+    arguments.append(resolve);
+    arguments.append(reject);
+    call(exec, resolver, callType, callData, jsUndefined(), arguments);
+
+    // 14. If result is an abrupt completion, call PromiseReject(promise, result.[[value]]).
</ins><span class="cx">     if (exec-&gt;hadException()) {
</span><span class="cx">         JSValue exception = exec-&gt;exception();
</span><span class="cx">         exec-&gt;clearException();
</span><span class="cx"> 
</span><del>-        resolver-&gt;rejectIfNotResolved(exec, exception);
</del><ins>+        promise-&gt;reject(vm, exception);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    // 15. Return promise.
</ins><span class="cx">     return JSValue::encode(promise);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -135,6 +150,7 @@
</span><span class="cx"> 
</span><span class="cx"> CallType JSPromiseConstructor::getCallData(JSCell*, CallData&amp;)
</span><span class="cx"> {
</span><ins>+    // FIXME: Implement
</ins><span class="cx">     return CallTypeNone;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -143,45 +159,150 @@
</span><span class="cx">     return getStaticFunctionSlot&lt;InternalFunction&gt;(exec, ExecState::promiseConstructorTable(exec), jsCast&lt;JSPromiseConstructor*&gt;(object), propertyName, slot);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-EncodedJSValue JSC_HOST_CALL JSPromiseConstructorFuncFulfill(ExecState* exec)
</del><ins>+EncodedJSValue JSC_HOST_CALL JSPromiseConstructorFuncCast(ExecState* exec)
</ins><span class="cx"> {
</span><del>-    if (!exec-&gt;argumentCount())
-        return throwVMError(exec, createTypeError(exec, &quot;Expected at least one argument&quot;));
</del><ins>+    // -- Promise.cast(x) --
+    JSValue x = exec-&gt;argument(0);
</ins><span class="cx"> 
</span><del>-    JSGlobalObject* globalObject = exec-&gt;callee()-&gt;globalObject();
</del><ins>+    // 1. Let 'C' be the this value.
+    JSValue C = exec-&gt;thisValue();
</ins><span class="cx"> 
</span><del>-    JSPromise* promise = JSPromise::createWithResolver(exec-&gt;vm(), globalObject);
-    promise-&gt;resolver()-&gt;fulfill(exec, exec-&gt;uncheckedArgument(0));
</del><ins>+    // 2. If IsPromise(x) is true,
+    JSPromise* promise = jsDynamicCast&lt;JSPromise*&gt;(x);
+    if (promise) {
+        // i. Let 'constructor' be the value of x's [[PromiseConstructor]] internal slot.
+        JSValue constructor = promise-&gt;constructor();
+        // ii. If SameValue(constructor, C) is true, return x.
+        if (sameValue(exec, constructor, C))
+            return JSValue::encode(x);
+    }
</ins><span class="cx"> 
</span><del>-    return JSValue::encode(promise);
</del><ins>+    // 3. Let 'deferred' be the result of calling GetDeferred(C).
+    JSValue deferredValue = createJSPromiseDeferredFromConstructor(exec, C);
+    
+    // 4. ReturnIfAbrupt(deferred).
+    if (exec-&gt;hadException())
+        return JSValue::encode(jsUndefined());
+
+    JSPromiseDeferred* deferred = jsCast&lt;JSPromiseDeferred*&gt;(deferredValue);
+
+    // 5. Let 'resolveResult' be the result of calling the [[Call]] internal method
+    //    of deferred.[[Resolve]] with undefined as thisArgument and a List containing x
+    //    as argumentsList.
+    
+    JSValue deferredResolve = deferred-&gt;resolve();
+
+    CallData resolveCallData;
+    CallType resolveCallType = getCallData(deferredResolve, resolveCallData);
+    ASSERT(resolveCallType != CallTypeNone);
+
+    MarkedArgumentBuffer arguments;
+    arguments.append(x);
+
+    call(exec, deferredResolve, resolveCallType, resolveCallData, jsUndefined(), arguments);
+
+    // 6. ReturnIfAbrupt(resolveResult).
+    if (exec-&gt;hadException())
+        return JSValue::encode(jsUndefined());
+
+    // 7. Return deferred.[[Promise]].
+    return JSValue::encode(deferred-&gt;promise());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> EncodedJSValue JSC_HOST_CALL JSPromiseConstructorFuncResolve(ExecState* exec)
</span><span class="cx"> {
</span><del>-    if (!exec-&gt;argumentCount())
-        return throwVMError(exec, createTypeError(exec, &quot;Expected at least one argument&quot;));
</del><ins>+    // -- Promise.resolve(x) --
+    JSValue x = exec-&gt;argument(0);
</ins><span class="cx"> 
</span><del>-    JSGlobalObject* globalObject = exec-&gt;callee()-&gt;globalObject();
</del><ins>+    // 1. Let 'C' be the this value.
+    JSValue C = exec-&gt;thisValue();
</ins><span class="cx"> 
</span><del>-    JSPromise* promise = JSPromise::createWithResolver(exec-&gt;vm(), globalObject);
-    promise-&gt;resolver()-&gt;resolve(exec, exec-&gt;uncheckedArgument(0));
</del><ins>+    // 2. Let 'deferred' be the result of calling GetDeferred(C).
+    JSValue deferredValue = createJSPromiseDeferredFromConstructor(exec, C);
</ins><span class="cx"> 
</span><del>-    return JSValue::encode(promise);
</del><ins>+    // 3. ReturnIfAbrupt(deferred).
+    if (exec-&gt;hadException())
+        return JSValue::encode(jsUndefined());
+
+    JSPromiseDeferred* deferred = jsCast&lt;JSPromiseDeferred*&gt;(deferredValue);
+
+    // 4. Let 'resolveResult' be the result of calling the [[Call]] internal method
+    //    of deferred.[[Resolve]] with undefined as thisArgument and a List containing x
+    //    as argumentsList.
+
+    JSValue deferredResolve = deferred-&gt;resolve();
+
+    CallData resolveCallData;
+    CallType resolveCallType = getCallData(deferredResolve, resolveCallData);
+    ASSERT(resolveCallType != CallTypeNone);
+
+    MarkedArgumentBuffer arguments;
+    arguments.append(x);
+
+    call(exec, deferredResolve, resolveCallType, resolveCallData, jsUndefined(), arguments);
+    
+    // 5. ReturnIfAbrupt(resolveResult).
+    if (exec-&gt;hadException())
+        return JSValue::encode(jsUndefined());
+
+    // 6. Return deferred.[[Promise]].
+    return JSValue::encode(deferred-&gt;promise());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> EncodedJSValue JSC_HOST_CALL JSPromiseConstructorFuncReject(ExecState* exec)
</span><span class="cx"> {
</span><del>-    if (!exec-&gt;argumentCount())
-        return throwVMError(exec, createTypeError(exec, &quot;Expected at least one argument&quot;));
</del><ins>+    // -- Promise.reject(x) --
+    JSValue r = exec-&gt;argument(0);
</ins><span class="cx"> 
</span><del>-    JSGlobalObject* globalObject = exec-&gt;callee()-&gt;globalObject();
</del><ins>+    // 1. Let 'C' be the this value.
+    JSValue C = exec-&gt;thisValue();
</ins><span class="cx"> 
</span><del>-    JSPromise* promise = JSPromise::createWithResolver(exec-&gt;vm(), globalObject);
-    promise-&gt;resolver()-&gt;reject(exec, exec-&gt;uncheckedArgument(0));
</del><ins>+    // 2. Let 'deferred' be the result of calling GetDeferred(C).
+    JSValue deferredValue = createJSPromiseDeferredFromConstructor(exec, C);
</ins><span class="cx"> 
</span><del>-    return JSValue::encode(promise);
</del><ins>+    // 3. ReturnIfAbrupt(deferred).
+    if (exec-&gt;hadException())
+        return JSValue::encode(jsUndefined());
+
+    JSPromiseDeferred* deferred = jsCast&lt;JSPromiseDeferred*&gt;(deferredValue);
+
+    // 4. Let 'rejectResult' be the result of calling the [[Call]] internal method
+    //    of deferred.[[Reject]] with undefined as thisArgument and a List containing r
+    //    as argumentsList.
+
+    JSValue deferredReject = deferred-&gt;reject();
+
+    CallData rejectCallData;
+    CallType rejectCallType = getCallData(deferredReject, rejectCallData);
+    ASSERT(rejectCallType != CallTypeNone);
+
+    MarkedArgumentBuffer arguments;
+    arguments.append(r);
+
+    call(exec, deferredReject, rejectCallType, rejectCallData, jsUndefined(), arguments);
+
+    // 5. ReturnIfAbrupt(resolveResult).
+    if (exec-&gt;hadException())
+        return JSValue::encode(jsUndefined());
+
+    // 6. Return deferred.[[Promise]].
+    return JSValue::encode(deferred-&gt;promise());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+JSPromise* constructPromise(ExecState* exec, JSGlobalObject* globalObject, JSFunction* resolver)
+{
+    JSPromiseConstructor* promiseConstructor = globalObject-&gt;promiseConstructor();
+
+    ConstructData constructData;
+    ConstructType constructType = getConstructData(promiseConstructor, constructData);
+    ASSERT(constructType != ConstructTypeNone);
+
+    MarkedArgumentBuffer arguments;
+    arguments.append(resolver);
+
+    return jsCast&lt;JSPromise*&gt;(construct(exec, promiseConstructor, constructType, constructData, arguments));
+}
+
</ins><span class="cx"> } // namespace JSC
</span><span class="cx"> 
</span><span class="cx"> #endif // ENABLE(PROMISES)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSPromiseConstructorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSPromiseConstructor.h (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSPromiseConstructor.h        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/JavaScriptCore/runtime/JSPromiseConstructor.h        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -32,6 +32,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><ins>+class JSPromise;
</ins><span class="cx"> class JSPromisePrototype;
</span><span class="cx"> 
</span><span class="cx"> class JSPromiseConstructor : public InternalFunction {
</span><span class="lines">@@ -54,6 +55,8 @@
</span><span class="cx">     static bool getOwnPropertySlot(JSObject*, ExecState*, PropertyName, PropertySlot&amp;);
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+JSPromise* constructPromise(ExecState*, JSGlobalObject*, JSFunction*);
+
</ins><span class="cx"> } // namespace JSC
</span><span class="cx"> 
</span><span class="cx"> #endif // ENABLE(PROMISES)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSPromiseDeferredcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/runtime/JSPromiseDeferred.cpp (0 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSPromiseDeferred.cpp                                (rev 0)
+++ trunk/Source/JavaScriptCore/runtime/JSPromiseDeferred.cpp        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -0,0 +1,217 @@
</span><ins>+/*
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;JSPromiseDeferred.h&quot;
+
+#include &quot;Error.h&quot;
+#include &quot;JSCJSValueInlines.h&quot;
+#include &quot;JSCellInlines.h&quot;
+#include &quot;JSPromise.h&quot;
+#include &quot;JSPromiseConstructor.h&quot;
+#include &quot;JSPromiseFunctions.h&quot;
+#include &quot;SlotVisitorInlines.h&quot;
+
+namespace JSC {
+
+const ClassInfo JSPromiseDeferred::s_info = { &quot;JSPromiseDeferred&quot;, 0, 0, 0, CREATE_METHOD_TABLE(JSPromiseDeferred) };
+
+JSPromiseDeferred* JSPromiseDeferred::create(ExecState* exec, JSGlobalObject* globalObject)
+{
+    VM&amp; vm = exec-&gt;vm();
+    
+    JSFunction* resolver = createDeferredConstructionFunction(vm, globalObject);
+
+    JSPromise* promise = constructPromise(exec, globalObject, resolver);
+    JSValue resolve = resolver-&gt;get(exec, vm.propertyNames-&gt;resolvePrivateName);
+    JSValue reject = resolver-&gt;get(exec, vm.propertyNames-&gt;rejectPrivateName);
+
+    return JSPromiseDeferred::create(vm, promise, resolve, reject);
+}
+
+JSPromiseDeferred* JSPromiseDeferred::create(VM&amp; vm, JSObject* promise, JSValue resolve, JSValue reject)
+{
+    JSPromiseDeferred* deferred = new (NotNull, allocateCell&lt;JSPromiseDeferred&gt;(vm.heap)) JSPromiseDeferred(vm);
+    deferred-&gt;finishCreation(vm, promise, resolve, reject);
+    return deferred;
+}
+
+JSPromiseDeferred::JSPromiseDeferred(VM&amp; vm)
+    : Base(vm, vm.promiseDeferredStructure.get())
+{
+}
+
+void JSPromiseDeferred::finishCreation(VM&amp; vm, JSObject* promise, JSValue resolve, JSValue reject)
+{
+    Base::finishCreation(vm);
+    m_promise.set(vm, this, promise);
+    m_resolve.set(vm, this, resolve);
+    m_reject.set(vm, this, reject);
+}
+
+void JSPromiseDeferred::visitChildren(JSCell* cell, SlotVisitor&amp; visitor)
+{
+    JSPromiseDeferred* thisObject = jsCast&lt;JSPromiseDeferred*&gt;(cell);
+    ASSERT_GC_OBJECT_INHERITS(thisObject, info());
+    COMPILE_ASSERT(StructureFlags &amp; OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag);
+    ASSERT(thisObject-&gt;structure()-&gt;typeInfo().overridesVisitChildren());
+
+    Base::visitChildren(thisObject, visitor);
+
+    visitor.append(&amp;thisObject-&gt;m_promise);
+    visitor.append(&amp;thisObject-&gt;m_resolve);
+    visitor.append(&amp;thisObject-&gt;m_reject);
+}
+
+JSValue createJSPromiseDeferredFromConstructor(ExecState* exec, JSValue C)
+{
+    // -- This implements the GetDeferred(C) abstract operation --
+
+    // 1. If IsConstructor(C) is false, throw a TypeError.
+    if (!C.isObject())
+        return throwTypeError(exec);
+
+    ConstructData constructData;
+    ConstructType constructType = getConstructData(C, constructData);
+    if (constructType == ConstructTypeNone)
+        return throwTypeError(exec);
+
+    VM&amp; vm = exec-&gt;vm();
+
+    // 2. Let 'resolver' be a new built-in function object as defined in Deferred Construction Functions.
+    JSFunction* resolver = createDeferredConstructionFunction(vm, asObject(C)-&gt;globalObject());
+
+    // 3. Let 'promise' be the result of calling the [[Construct]] internal method of 'C' with
+    //    an argument list containing the single item resolver.
+    MarkedArgumentBuffer constructArguments;
+    constructArguments.append(resolver);
+    JSObject* promise = construct(exec, C, constructType, constructData, constructArguments);
+
+    // 4. ReturnIfAbrupt(promise).
+    if (exec-&gt;hadException())
+        return jsUndefined();
+
+    // 5. Let 'resolve' be the value of resolver's [[Resolve]] internal slot.
+    JSValue resolve = resolver-&gt;get(exec, vm.propertyNames-&gt;resolvePrivateName);
+
+    // 6. If IsCallable(resolve) is false, throw a TypeError.
+    CallData resolveCallData;
+    CallType resolveCallType = getCallData(resolve, resolveCallData);
+    if (resolveCallType == CallTypeNone)
+        return throwTypeError(exec);
+
+    // 7. Let 'reject' be the value of resolver's [[Reject]] internal slot.
+    JSValue reject = resolver-&gt;get(exec, vm.propertyNames-&gt;rejectPrivateName);
+
+    // 8. If IsCallable(reject) is false, throw a TypeError.
+    CallData rejectCallData;
+    CallType rejectCallType = getCallData(reject, rejectCallData);
+    if (rejectCallType == CallTypeNone)
+        return throwTypeError(exec);
+
+    // 9. Return the Deferred { [[Promise]]: promise, [[Resolve]]: resolve, [[Reject]]: reject }.
+    return JSPromiseDeferred::create(exec-&gt;vm(), promise, resolve, reject);
+}
+
+ThenableStatus updateDeferredFromPotentialThenable(ExecState* exec, JSValue x, JSPromiseDeferred* deferred)
+{
+    // 1. If Type(x) is not Object, return &quot;not a thenable&quot;.
+    if (!x.isObject())
+        return NotAThenable;
+    
+    // 2. Let 'then' be the result of calling Get(x, &quot;then&quot;).
+    JSValue thenValue = x.get(exec, exec-&gt;vm().propertyNames-&gt;then);
+    
+    // 3. If then is an abrupt completion,
+    if (exec-&gt;hadException()) {
+        // i. Let 'rejectResult' be the result of calling the [[Call]] internal method of
+        //    deferred.[[Reject]] with undefined as thisArgument and a List containing
+        //    then.[[value]] as argumentsList.
+        JSValue exception = exec-&gt;exception();
+        exec-&gt;clearException();
+
+        JSValue deferredReject = deferred-&gt;reject();
+
+        CallData rejectCallData;
+        CallType rejectCallType = getCallData(deferredReject, rejectCallData);
+        ASSERT(rejectCallType != CallTypeNone);
+
+        MarkedArgumentBuffer rejectArguments;
+        rejectArguments.append(exception);
+
+        call(exec, deferredReject, rejectCallType, rejectCallData, jsUndefined(), rejectArguments);
+
+        // ii. ReturnIfAbrupt(rejectResult).
+        // NOTE: Nothing to do.
+
+        // iii. Return.
+        return WasAThenable;
+    }
+
+    // 4. Let 'then' be then.[[value]].
+    // Note: Nothing to do.
+
+    // 5. If IsCallable(then) is false, return &quot;not a thenable&quot;.
+    CallData thenCallData;
+    CallType thenCallType = getCallData(thenValue, thenCallData);
+    if (thenCallType == CallTypeNone)
+        return NotAThenable;
+
+    // 6. Let 'thenCallResult' be the result of calling the [[Call]] internal method of
+    //    'then' passing x as thisArgument and a List containing deferred.[[Resolve]] and
+    //    deferred.[[Reject]] as argumentsList.
+    MarkedArgumentBuffer thenArguments;
+    thenArguments.append(deferred-&gt;resolve());
+    thenArguments.append(deferred-&gt;reject());
+    
+    call(exec, thenValue, thenCallType, thenCallData, x, thenArguments);
+
+    // 7. If 'thenCallResult' is an abrupt completion,
+    if (exec-&gt;hadException()) {
+        // i. Let 'rejectResult' be the result of calling the [[Call]] internal method of
+        //    deferred.[[Reject]] with undefined as thisArgument and a List containing
+        //    thenCallResult.[[value]] as argumentsList.
+        JSValue exception = exec-&gt;exception();
+        exec-&gt;clearException();
+
+        JSValue deferredReject = deferred-&gt;reject();
+
+        CallData rejectCallData;
+        CallType rejectCallType = getCallData(deferredReject, rejectCallData);
+        ASSERT(rejectCallType != CallTypeNone);
+
+        MarkedArgumentBuffer rejectArguments;
+        rejectArguments.append(exception);
+
+        call(exec, deferredReject, rejectCallType, rejectCallData, jsUndefined(), rejectArguments);
+
+        // ii. ReturnIfAbrupt(rejectResult).
+        // NOTE: Nothing to do.
+    }
+
+    return WasAThenable;
+}
+
+} // namespace JSC
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSPromiseDeferredh"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/runtime/JSPromiseDeferred.h (0 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSPromiseDeferred.h                                (rev 0)
+++ trunk/Source/JavaScriptCore/runtime/JSPromiseDeferred.h        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -0,0 +1,75 @@
</span><ins>+/*
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef JSPromiseDeferred_h
+#define JSPromiseDeferred_h
+
+#include &quot;JSCell.h&quot;
+#include &quot;Structure.h&quot;
+
+namespace JSC {
+
+class JSPromiseDeferred : public JSCell {
+public:
+    typedef JSCell Base;
+
+    JS_EXPORT_PRIVATE static JSPromiseDeferred* create(ExecState*, JSGlobalObject*);
+    JS_EXPORT_PRIVATE static JSPromiseDeferred* create(VM&amp;, JSObject* promise, JSValue resolve, JSValue reject);
+
+    static Structure* createStructure(VM&amp; vm, JSGlobalObject* globalObject, JSValue prototype)
+    {
+        return Structure::create(vm, globalObject, prototype, TypeInfo(CompoundType, StructureFlags), info());
+    }
+
+    static const bool hasImmortalStructure = true;
+
+    DECLARE_EXPORT_INFO;
+
+    JSObject* promise() const { return m_promise.get(); }
+    JSValue resolve() const { return m_resolve.get(); }
+    JSValue reject() const { return m_reject.get(); }
+
+private:
+    JSPromiseDeferred(VM&amp;);
+    void finishCreation(VM&amp;, JSObject*, JSValue, JSValue);
+    static const unsigned StructureFlags = OverridesVisitChildren | Base::StructureFlags;
+    static void visitChildren(JSCell*, SlotVisitor&amp;);
+
+    WriteBarrier&lt;JSObject&gt; m_promise;
+    WriteBarrier&lt;Unknown&gt; m_resolve;
+    WriteBarrier&lt;Unknown&gt; m_reject;
+};
+
+enum ThenableStatus {
+    WasAThenable,
+    NotAThenable
+};
+
+JSValue createJSPromiseDeferredFromConstructor(ExecState*, JSValue constructor);
+ThenableStatus updateDeferredFromPotentialThenable(ExecState*, JSValue, JSPromiseDeferred*);
+
+} // namespace JSC
+
+#endif // JSPromiseDeferred_h
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSPromiseFunctionscpp"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/runtime/JSPromiseFunctions.cpp (0 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSPromiseFunctions.cpp                                (rev 0)
+++ trunk/Source/JavaScriptCore/runtime/JSPromiseFunctions.cpp        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -0,0 +1,224 @@
</span><ins>+/*
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;JSPromiseFunctions.h&quot;
+
+#if ENABLE(PROMISES)
+
+#include &quot;Error.h&quot;
+#include &quot;JSCJSValueInlines.h&quot;
+#include &quot;JSCellInlines.h&quot;
+#include &quot;JSPromise.h&quot;
+#include &quot;JSPromiseConstructor.h&quot;
+#include &quot;JSPromiseDeferred.h&quot;
+
+namespace JSC {
+
+// Deferred Construction Functions
+static EncodedJSValue JSC_HOST_CALL deferredConstructionFunction(ExecState* exec)
+{
+    JSObject* F = exec-&gt;callee();
+
+    VM&amp; vm = exec-&gt;vm();
+
+    // 1. Set F's [[Resolve]] internal slot to resolve.
+    F-&gt;putDirect(vm, vm.propertyNames-&gt;resolvePrivateName, exec-&gt;argument(0));
+
+    // 2. Set F's [[Reject]] internal slot to reject.
+    F-&gt;putDirect(vm, vm.propertyNames-&gt;rejectPrivateName, exec-&gt;argument(1));
+
+    // 3. Return.
+    return JSValue::encode(jsUndefined());
+}
+
+JSFunction* createDeferredConstructionFunction(VM&amp; vm, JSGlobalObject* globalObject)
+{
+    return JSFunction::create(vm, globalObject, 2, ASCIILiteral(&quot;DeferredConstructionFunction&quot;), deferredConstructionFunction);
+}
+
+// Identity Functions
+
+static EncodedJSValue JSC_HOST_CALL identifyFunction(ExecState* exec)
+{
+    return JSValue::encode(exec-&gt;argument(0));
+}
+
+JSFunction* createIdentifyFunction(VM&amp; vm, JSGlobalObject* globalObject)
+{
+    return JSFunction::create(vm, globalObject, 1, ASCIILiteral(&quot;IdentityFunction&quot;), identifyFunction);
+}
+
+// Promise Resolution Handler Functions
+
+static EncodedJSValue JSC_HOST_CALL promiseResolutionHandlerFunction(ExecState* exec)
+{
+    JSValue x = exec-&gt;argument(0);
+    VM&amp; vm = exec-&gt;vm();
+    JSObject* F = exec-&gt;callee();
+
+    // 1. Let 'promise' be the value of F's [[Promise]] internal slot
+    JSPromise* promise = jsCast&lt;JSPromise*&gt;(F-&gt;get(exec, vm.propertyNames-&gt;promisePrivateName));
+
+    // 2. Let 'fulfillmentHandler' be the value of F's [[FulfillmentHandler]] internal slot.
+    JSValue fulfillmentHandler = F-&gt;get(exec, vm.propertyNames-&gt;fulfillmentHandlerPrivateName);
+    
+    // 3. Let 'rejectionHandler' be the value of F's [[RejectionHandler]] internal slot.
+    JSValue rejectionHandler = F-&gt;get(exec, vm.propertyNames-&gt;rejectionHandlerPrivateName);
+    
+    // 4. If SameValue(x, promise) is true,
+    if (sameValue(exec, x, promise)) {
+        // i. Let 'selfResolutionError' be a newly-created TypeError object.
+        JSObject* selfResolutionError = createTypeError(exec, ASCIILiteral(&quot;Resolve a promise with itself&quot;));
+        // ii. Return the result of calling the [[Call]] internal method of rejectionHandler with
+        //     undefined as thisArgument and a List containing selfResolutionError as argumentsList.
+        CallData rejectCallData;
+        CallType rejectCallType = getCallData(rejectionHandler, rejectCallData);
+        ASSERT(rejectCallType != CallTypeNone);
+
+        MarkedArgumentBuffer rejectArguments;
+        rejectArguments.append(selfResolutionError);
+
+        return JSValue::encode(call(exec, rejectionHandler, rejectCallType, rejectCallData, jsUndefined(), rejectArguments));
+    }
+
+    // 5. Let 'C' be the value of promise's [[PromiseConstructor]] internal slot.
+    JSValue C = promise-&gt;constructor();
+
+    // 6. Let 'deferred' be the result of calling GetDeferred(C)
+    JSValue deferredValue = createJSPromiseDeferredFromConstructor(exec, C);
+
+    // 7. ReturnIfAbrupt(deferred).
+    if (exec-&gt;hadException())
+        return JSValue::encode(jsUndefined());
+
+    JSPromiseDeferred* deferred = jsCast&lt;JSPromiseDeferred*&gt;(deferredValue);
+
+    // 8. Let 'updateResult' be the result of calling UpdateDeferredFromPotentialThenable(x, deferred).
+    ThenableStatus updateResult = updateDeferredFromPotentialThenable(exec, x, deferred);
+
+    // 9. ReturnIfAbrupt(updateResult).
+    if (exec-&gt;hadException())
+        return JSValue::encode(jsUndefined());
+
+    // 10. If 'updateResult' is not &quot;not a thenable&quot;, return the result of calling
+    //     Invoke(deferred.[[Promise]], &quot;then&quot;, (fulfillmentHandler, rejectionHandler)).
+    // NOTE: Invoke does not seem to be defined anywhere, so I am guessing here.
+    if (updateResult != NotAThenable) {
+        JSObject* deferredPromise = deferred-&gt;promise();
+    
+        JSValue thenValue = deferredPromise-&gt;get(exec, exec-&gt;vm().propertyNames-&gt;then);
+        if (exec-&gt;hadException())
+            return JSValue::encode(jsUndefined());
+
+        CallData thenCallData;
+        CallType thenCallType = getCallData(thenValue, thenCallData);
+        if (thenCallType == CallTypeNone)
+            return JSValue::encode(throwTypeError(exec));
+
+        MarkedArgumentBuffer arguments;
+        arguments.append(fulfillmentHandler);
+        arguments.append(rejectionHandler);
+
+        return JSValue::encode(call(exec, thenValue, thenCallType, thenCallData, deferredPromise, arguments));
+    }
+    
+    // 11. Return the result of calling the [[Call]] internal method of fulfillmentHandler
+    //     with undefined as thisArgument and a List containing x as argumentsList.
+    CallData fulfillmentHandlerCallData;
+    CallType fulfillmentHandlerCallType = getCallData(fulfillmentHandler, fulfillmentHandlerCallData);
+    ASSERT(fulfillmentHandlerCallType != CallTypeNone);
+    
+    MarkedArgumentBuffer fulfillmentHandlerArguments;
+    fulfillmentHandlerArguments.append(x);
+
+    return JSValue::encode(call(exec, fulfillmentHandler, fulfillmentHandlerCallType, fulfillmentHandlerCallData, jsUndefined(), fulfillmentHandlerArguments));
+}
+
+JSFunction* createPromiseResolutionHandlerFunction(VM&amp; vm, JSGlobalObject* globalObject)
+{
+    return JSFunction::create(vm, globalObject, 1, ASCIILiteral(&quot;PromiseResolutionHandlerFunction&quot;), promiseResolutionHandlerFunction);
+}
+
+// Reject Promise Functions
+
+static EncodedJSValue JSC_HOST_CALL rejectPromiseFunction(ExecState* exec)
+{
+    JSValue reason = exec-&gt;argument(0);
+    JSObject* F = exec-&gt;callee();
+    VM&amp; vm = exec-&gt;vm();
+
+    // 1. Let 'promise' be the value of F's [[Promise]] internal slot.
+    JSPromise* promise = jsCast&lt;JSPromise*&gt;(F-&gt;get(exec, exec-&gt;vm().propertyNames-&gt;promisePrivateName));
+
+    // 2. Return the result of calling PromiseReject(promise, reason);
+    promise-&gt;reject(vm, reason);
+
+    return JSValue::encode(jsUndefined());
+}
+
+JSFunction* createRejectPromiseFunction(VM&amp; vm, JSGlobalObject* globalObject)
+{
+    return JSFunction::create(vm, globalObject, 1, ASCIILiteral(&quot;RejectPromiseFunction&quot;), rejectPromiseFunction);
+}
+
+// Resolve Promise Functions
+
+static EncodedJSValue JSC_HOST_CALL resolvePromiseFunction(ExecState* exec)
+{
+    JSValue resolution = exec-&gt;argument(0);
+    JSObject* F = exec-&gt;callee();
+    VM&amp; vm = exec-&gt;vm();
+
+    // 1. Let 'promise' be the value of F's [[Promise]] internal slot.
+    JSPromise* promise = jsCast&lt;JSPromise*&gt;(F-&gt;get(exec, vm.propertyNames-&gt;promisePrivateName));
+
+    // 2. Return the result of calling PromiseResolve(promise, resolution);
+    promise-&gt;resolve(vm, resolution);
+
+    return JSValue::encode(jsUndefined());
+}
+
+JSFunction* createResolvePromiseFunction(VM&amp; vm, JSGlobalObject* globalObject)
+{
+    return JSFunction::create(vm, globalObject, 1, ASCIILiteral(&quot;ResolvePromiseFunction&quot;), resolvePromiseFunction);
+}
+
+// Thrower Functions
+
+static EncodedJSValue JSC_HOST_CALL throwerFunction(ExecState* exec)
+{
+    return JSValue::encode(exec-&gt;vm().throwException(exec, exec-&gt;argument(0)));
+}
+
+JSFunction* createThrowerFunction(VM&amp; vm, JSGlobalObject* globalObject)
+{
+    return JSFunction::create(vm, globalObject, 1, ASCIILiteral(&quot;ThrowerFunction&quot;), throwerFunction);
+}
+
+
+} // namespace JSC
+
+#endif // ENABLE(PROMISES)
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSPromiseFunctionsh"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/runtime/JSPromiseFunctions.h (0 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSPromiseFunctions.h                                (rev 0)
+++ trunk/Source/JavaScriptCore/runtime/JSPromiseFunctions.h        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -0,0 +1,46 @@
</span><ins>+/*
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef JSPromiseFunctions_h
+#define JSPromiseFunctions_h
+
+#if ENABLE(PROMISES)
+
+#include &quot;JSFunction.h&quot;
+
+namespace JSC {
+
+JSFunction* createDeferredConstructionFunction(VM&amp;, JSGlobalObject*);
+JSFunction* createIdentifyFunction(VM&amp;, JSGlobalObject*);
+JSFunction* createPromiseResolutionHandlerFunction(VM&amp;, JSGlobalObject*);
+JSFunction* createRejectPromiseFunction(VM&amp;, JSGlobalObject*);
+JSFunction* createResolvePromiseFunction(VM&amp;, JSGlobalObject*);
+JSFunction* createThrowerFunction(VM&amp;, JSGlobalObject*);
+
+} // namespace JSC
+
+#endif // ENABLE(PROMISES)
+
+#endif // JSPromiseFunctions_h
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSPromisePrototypecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/JSPromisePrototype.cpp (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSPromisePrototype.cpp        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/JavaScriptCore/runtime/JSPromisePrototype.cpp        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -33,17 +33,17 @@
</span><span class="cx"> #include &quot;JSCellInlines.h&quot;
</span><span class="cx"> #include &quot;JSGlobalObject.h&quot;
</span><span class="cx"> #include &quot;JSPromise.h&quot;
</span><del>-#include &quot;JSPromiseCallback.h&quot;
-#include &quot;JSPromiseResolver.h&quot;
</del><ins>+#include &quot;JSPromiseDeferred.h&quot;
+#include &quot;JSPromiseFunctions.h&quot;
+#include &quot;JSPromiseReaction.h&quot;
+#include &quot;Microtask.h&quot;
</ins><span class="cx"> #include &quot;StructureInlines.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><span class="cx"> STATIC_ASSERT_IS_TRIVIALLY_DESTRUCTIBLE(JSPromisePrototype);
</span><span class="cx"> 
</span><del>-// Promise then([TreatUndefinedAs=Missing] optional AnyCallback fulfillCallback, [TreatUndefinedAs=Missing] optional AnyCallback rejectCallback);
</del><span class="cx"> static EncodedJSValue JSC_HOST_CALL JSPromisePrototypeFuncThen(ExecState*);
</span><del>-// Promise catch([TreatUndefinedAs=Missing] optional AnyCallback rejectCallback);
</del><span class="cx"> static EncodedJSValue JSC_HOST_CALL JSPromisePrototypeFuncCatch(ExecState*);
</span><span class="cx"> 
</span><span class="cx"> }
</span><span class="lines">@@ -56,8 +56,8 @@
</span><span class="cx"> 
</span><span class="cx"> /* Source for JSPromisePrototype.lut.h
</span><span class="cx"> @begin promisePrototypeTable
</span><del>-  then         JSPromisePrototypeFuncThen             DontEnum|Function 0
-  catch        JSPromisePrototypeFuncCatch            DontEnum|Function 0
</del><ins>+  then         JSPromisePrototypeFuncThen             DontEnum|Function 2
+  catch        JSPromisePrototypeFuncCatch            DontEnum|Function 1
</ins><span class="cx"> @end
</span><span class="cx"> */
</span><span class="cx"> 
</span><span class="lines">@@ -89,97 +89,129 @@
</span><span class="cx">     return getStaticFunctionSlot&lt;JSObject&gt;(exec, ExecState::promisePrototypeTable(exec), jsCast&lt;JSPromisePrototype*&gt;(object), propertyName, slot);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static InternalFunction* wrapCallback(ExecState* exec, JSGlobalObject* globalObject, JSValue callback, JSPromiseResolver* resolver, JSPromiseCallback::Algorithm algorithm)
-{
-    if (!callback.isUndefined())
-        return JSPromiseWrapperCallback::create(exec-&gt;vm(), globalObject-&gt;promiseWrapperCallbackStructure(), resolver, callback);
-    return JSPromiseCallback::create(exec-&gt;vm(), globalObject-&gt;promiseCallbackStructure(), resolver, algorithm);
-}
-
</del><span class="cx"> EncodedJSValue JSC_HOST_CALL JSPromisePrototypeFuncThen(ExecState* exec)
</span><span class="cx"> {
</span><del>-    JSPromise* thisObject = jsDynamicCast&lt;JSPromise*&gt;(exec-&gt;thisValue());
-    if (!thisObject)
-        return throwVMError(exec, createTypeError(exec, &quot;Receiver of then must be a Promise&quot;));
</del><ins>+    // -- Promise.prototype.then(onFulfilled, onRejected) --
</ins><span class="cx"> 
</span><del>-    JSValue fulfillCallback = exec-&gt;argument(0);
-    if (!fulfillCallback.isUndefined()) {
-        CallData callData;
-        CallType callType = getCallData(fulfillCallback, callData);
-        if (callType == CallTypeNone)
-            return throwVMError(exec, createTypeError(exec, &quot;Expected function or undefined as as first argument&quot;));
-    }
</del><ins>+    // 1. Let promise be the this value.
+    // 2. If IsPromise(promise) is false, throw a TypeError exception.
+    JSPromise* promise = jsDynamicCast&lt;JSPromise*&gt;(exec-&gt;thisValue());
+    if (!promise)
+        return JSValue::encode(throwTypeError(exec));
+
+    // 3. Let 'C' be the result of calling Get(promise, &quot;constructor&quot;).
+    JSValue C = promise-&gt;get(exec, exec-&gt;propertyNames().constructor);
</ins><span class="cx">     
</span><del>-    JSValue rejectCallback = exec-&gt;argument(1);
-    if (!rejectCallback.isUndefined()) {
-        CallData callData;
-        CallType callType = getCallData(rejectCallback, callData);
-        if (callType == CallTypeNone)
-            return throwVMError(exec, createTypeError(exec, &quot;Expected function or undefined as as second argument&quot;));
-    }
</del><ins>+    // 4. ReturnIfAbrupt(C).
+    if (exec-&gt;hadException())
+        return JSValue::encode(jsUndefined());
+    
+    // 5. Let 'deferred' be the result of calling GetDeferred(C).
+    JSValue deferred = createJSPromiseDeferredFromConstructor(exec, C);
</ins><span class="cx"> 
</span><del>-    JSFunction* callee = jsCast&lt;JSFunction*&gt;(exec-&gt;callee());
-    JSGlobalObject* globalObject = callee-&gt;globalObject();
</del><ins>+    // 6. ReturnIfAbrupt(deferred).
+    if (exec-&gt;hadException())
+        return JSValue::encode(jsUndefined());
</ins><span class="cx"> 
</span><del>-    // 1. Let promise be a new promise.
-    JSPromise* promise = JSPromise::createWithResolver(exec-&gt;vm(), globalObject);
</del><ins>+    VM&amp; vm = exec-&gt;vm();
+    JSGlobalObject* globalObject = promise-&gt;globalObject();
</ins><span class="cx"> 
</span><del>-    // 2. Let resolver be promise's associated resolver.
-    JSPromiseResolver* resolver = promise-&gt;resolver();
</del><ins>+    // 7. Let 'rejectionHandler' be a new built-in function object as defined in Thrower Functions
+    // 8. If IsCallable(onRejected), set rejectionHandler to onRejected.
+    JSValue onRejected = exec-&gt;argument(1);
+    CallData onRejectedCallData;
+    CallType onRejectedCallType = getCallData(onRejected, onRejectedCallData);
+    JSObject* rejectionHandler = (onRejectedCallType == CallTypeNone) ? createThrowerFunction(vm, globalObject) : asObject(onRejected);
+    
+    // 9. Let 'fulfillmentHandler' be a new built-in function object as defined in Identity Functions
+    // 10. If IsCallable(onFulfilled), set fulfillmentHandler to onFulfilled
+    JSValue onFulfilled = exec-&gt;argument(0);
+    CallData onFulfilledCallData;
+    CallType onFulfilledCallType = getCallData(onFulfilled, onFulfilledCallData);
+    JSObject* fulfillmentHandler = (onFulfilledCallType == CallTypeNone) ? createIdentifyFunction(vm, globalObject) : asObject(onFulfilled);
</ins><span class="cx"> 
</span><del>-    // 3. Let fulfillWrapper be a promise wrapper callback for resolver and fulfillCallback if fulfillCallback is
-    //    not omitted and a promise callback for resolver and its fulfill algorithm otherwise.
-    InternalFunction* fulfillWrapper = wrapCallback(exec, globalObject, fulfillCallback, resolver, JSPromiseCallback::Fulfill);
</del><ins>+    // 11. Let 'resolutionHandler' be a new built-in function object as defined in Promise Resolution Handler Functions
+    JSObject* resolutionHandler = createPromiseResolutionHandlerFunction(vm, globalObject);
</ins><span class="cx"> 
</span><del>-    // 4. Let rejectWrapper be a promise wrapper callback for resolver and rejectCallback if rejectCallback is
-    //    not omitted and a promise callback for resolver and its reject algorithm otherwise.
-    InternalFunction* rejectWrapper = wrapCallback(exec, globalObject, rejectCallback, resolver, JSPromiseCallback::Reject);
</del><ins>+    // 12. Set the [[Promise]] internal slot of resolutionHandler to promise.
+    resolutionHandler-&gt;putDirect(vm, vm.propertyNames-&gt;promisePrivateName, promise);
</ins><span class="cx"> 
</span><del>-    // 5. Append fulfillWrapper and rejectWrapper to the context object.
-    thisObject-&gt;appendCallbacks(exec, fulfillWrapper, rejectWrapper);
</del><ins>+    // 13. Set the [[FulfillmentHandler]] internal slot of resolutionHandler to fulfillmentHandler.
+    resolutionHandler-&gt;putDirect(vm, vm.propertyNames-&gt;fulfillmentHandlerPrivateName, fulfillmentHandler);
</ins><span class="cx"> 
</span><del>-    // 6. Return promise.
-    return JSValue::encode(promise);
-}
</del><ins>+    // 14. Set the [[RejectionHandler]] internal slot of resolutionHandler to rejectionHandler.
+    resolutionHandler-&gt;putDirect(vm, vm.propertyNames-&gt;rejectionHandlerPrivateName, rejectionHandler);
</ins><span class="cx"> 
</span><del>-EncodedJSValue JSC_HOST_CALL JSPromisePrototypeFuncCatch(ExecState* exec)
-{
-    JSPromise* thisObject = jsDynamicCast&lt;JSPromise*&gt;(exec-&gt;thisValue());
-    if (!thisObject)
-        return throwVMError(exec, createTypeError(exec, &quot;Receiver of catch must be a Promise&quot;));
-    
-    JSValue rejectCallback = exec-&gt;argument(0);
-    if (!rejectCallback.isUndefined()) {
-        CallData callData;
-        CallType callType = getCallData(rejectCallback, callData);
-        if (callType == CallTypeNone)
-            return throwVMError(exec, createTypeError(exec, &quot;Expected function or undefined as as first argument&quot;));
</del><ins>+    // 15. Let 'resolveReaction' be the PromiseReaction { [[Deferred]]: deferred, [[Handler]]: resolutionHandler }.
+    JSPromiseReaction* resolveReaction = JSPromiseReaction::create(vm, jsCast&lt;JSPromiseDeferred*&gt;(deferred), resolutionHandler);
+
+    // 16. Let 'rejectReaction' be the PromiseReaction { [[Deferred]]: deferred, [[Handler]]: rejectionHandler }.
+    JSPromiseReaction* rejectReaction = JSPromiseReaction::create(vm, jsCast&lt;JSPromiseDeferred*&gt;(deferred), rejectionHandler);
+
+    switch (promise-&gt;status()) {
+    case JSPromise::Status::Unresolved: {
+        // 17. If the value of promise's [[PromiseStatus]] internal slot is &quot;unresolved&quot;,
+
+        // i. Append resolveReaction as the last element of promise's [[ResolveReactions]] internal slot.
+        promise-&gt;appendResolveReaction(vm, resolveReaction);
+
+        // ii. Append rejectReaction as the last element of promise's [[RejectReactions]] internal slot.
+        promise-&gt;appendRejectReaction(vm, rejectReaction);
+        break;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    JSFunction* callee = jsCast&lt;JSFunction*&gt;(exec-&gt;callee());
-    JSGlobalObject* globalObject = callee-&gt;globalObject();
-    VM&amp; vm = exec-&gt;vm();
</del><ins>+    case JSPromise::Status::HasResolution: {
+        // 18. If the value of promise's [[PromiseStatus]] internal slot is &quot;has-resolution&quot;,
</ins><span class="cx"> 
</span><del>-    // 1. Let promise be a new promise.
-    JSPromise* promise = JSPromise::createWithResolver(vm, globalObject);
</del><ins>+        // i. Let 'resolution' be the value of promise's [[Result]] internal slot.
+        JSValue resolution = promise-&gt;result();
</ins><span class="cx"> 
</span><del>-    // 2. Let resolver be promise's associated resolver.
-    JSPromiseResolver* resolver = promise-&gt;resolver();
</del><ins>+        // ii. Call QueueMicrotask(ExecutePromiseReaction, (resolveReaction, resolution)).
+        globalObject-&gt;queueMicrotask(createExecutePromiseReactionMicrotask(vm, resolveReaction, resolution));
+        break;
+    }
</ins><span class="cx"> 
</span><del>-    // 3. Let fulfillCallback be a new promise callback for resolver and its fulfill algorithm.
-    InternalFunction* fulfillWrapper = JSPromiseCallback::create(vm, globalObject-&gt;promiseCallbackStructure(), resolver, JSPromiseCallback::Fulfill);
</del><ins>+    case JSPromise::Status::HasRejection: {
+        // 19. If the value of promise's [[PromiseStatus]] internal slot is &quot;has-rejection&quot;,
</ins><span class="cx"> 
</span><del>-    // 4. Let rejectWrapper be a promise wrapper callback for resolver and rejectCallback if rejectCallback is
-    //    not omitted and a promise callback for resolver and its reject algorithm otherwise.
-    InternalFunction* rejectWrapper = wrapCallback(exec, globalObject, rejectCallback, resolver, JSPromiseCallback::Reject);
</del><ins>+        // i. Let reason be the value of promise's [[Result]] internal slot.
+        JSValue reason = promise-&gt;result();
</ins><span class="cx"> 
</span><del>-    // 5. Append fulfillWrapper and rejectWrapper to the context object.
-    thisObject-&gt;appendCallbacks(exec, fulfillWrapper, rejectWrapper);
</del><ins>+        // ii. Call QueueMicrotask(ExecutePromiseReaction, (rejectReaction, reason)).
+        globalObject-&gt;queueMicrotask(createExecutePromiseReactionMicrotask(vm, rejectReaction, reason));
+        break;
+    }
+    }
</ins><span class="cx"> 
</span><del>-    // 6. Return promise.
-    return JSValue::encode(promise);
</del><ins>+    // 20. Return deferred.[[Promise]].
+    return JSValue::encode(jsCast&lt;JSPromiseDeferred*&gt;(deferred)-&gt;promise());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+EncodedJSValue JSC_HOST_CALL JSPromisePrototypeFuncCatch(ExecState* exec)
+{
+    // -- Promise.prototype.catch(onRejected) --
+
+    // 1. Let 'promise' be the this value.
+    JSValue promise = exec-&gt;thisValue();
+    
+    // 2. Return the result of calling Invoke(promise, &quot;then&quot;, (undefined, onRejected)).
+    // NOTE: Invoke does not seem to be defined anywhere, so I am guessing here.
+    JSValue thenValue = promise.get(exec, exec-&gt;vm().propertyNames-&gt;then);
+    if (exec-&gt;hadException())
+        return JSValue::encode(jsUndefined());
+
+    CallData thenCallData;
+    CallType thenCallType = getCallData(thenValue, thenCallData);
+    if (thenCallType == CallTypeNone)
+        return JSValue::encode(throwTypeError(exec));
+
+    MarkedArgumentBuffer arguments;
+    arguments.append(jsUndefined());
+    arguments.append(exec-&gt;argument(0));
+
+    return JSValue::encode(call(exec, thenValue, thenCallType, thenCallData, promise, arguments));
+}
+
</ins><span class="cx"> } // namespace JSC
</span><span class="cx"> 
</span><span class="cx"> #endif // ENABLE(PROMISES)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSPromiseReactioncpp"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/runtime/JSPromiseReaction.cpp (0 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSPromiseReaction.cpp                                (rev 0)
+++ trunk/Source/JavaScriptCore/runtime/JSPromiseReaction.cpp        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -0,0 +1,188 @@
</span><ins>+/*
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;JSPromiseReaction.h&quot;
+
+#include &quot;Error.h&quot;
+#include &quot;JSCJSValueInlines.h&quot;
+#include &quot;JSCellInlines.h&quot;
+#include &quot;JSGlobalObject.h&quot;
+#include &quot;JSPromiseDeferred.h&quot;
+#include &quot;Microtask.h&quot;
+#include &quot;SlotVisitorInlines.h&quot;
+#include &quot;StrongInlines.h&quot;
+
+namespace JSC {
+
+class ExecutePromiseReactionMicrotask final : public Microtask {
+public:
+    ExecutePromiseReactionMicrotask(VM&amp; vm, JSPromiseReaction* reaction, JSValue argument)
+    {
+        m_reaction.set(vm, reaction);
+        m_argument.set(vm, argument);
+    }
+
+    virtual ~ExecutePromiseReactionMicrotask()
+    {
+    }
+
+private:
+    virtual void run(ExecState*) override;
+
+    Strong&lt;JSPromiseReaction&gt; m_reaction;
+    Strong&lt;Unknown&gt; m_argument;
+};
+
+PassRefPtr&lt;Microtask&gt; createExecutePromiseReactionMicrotask(VM&amp; vm, JSPromiseReaction* reaction, JSValue argument)
+{
+    return adoptRef(new ExecutePromiseReactionMicrotask(vm, reaction, argument));
+}
+
+void ExecutePromiseReactionMicrotask::run(ExecState* exec)
+{
+    // 1. Let 'deferred' be reaction.[[Deferred]].
+    JSPromiseDeferred* deferred = m_reaction-&gt;deferred();
+    
+    // 2. Let 'handler' be reaction.[[Handler]].
+    JSValue handler = m_reaction-&gt;handler();
+
+    // 3. Let 'handlerResult' be the result of calling the [[Call]] internal method of
+    //    handler passing undefined as thisArgument and a List containing argument as
+    //    argumentsList.
+
+    CallData handlerCallData;
+    CallType handlerCallType = getCallData(handler, handlerCallData);
+    ASSERT(handlerCallType != CallTypeNone);
+
+    MarkedArgumentBuffer handlerArguments;
+    handlerArguments.append(m_argument.get());
+
+    JSValue handlerResult = call(exec, handler, handlerCallType, handlerCallData, jsUndefined(), handlerArguments);
+
+    // 4. If handlerResult is an abrupt completion, return the result of calling the
+    //    [[Call]] internal method of deferred.[[Reject]] passing undefined as thisArgument
+    //    and a List containing handlerResult.[[value]] as argumentsList.
+    if (exec-&gt;hadException()) {
+        JSValue exception = exec-&gt;exception();
+        exec-&gt;clearException();
+
+        JSValue deferredReject = deferred-&gt;reject();
+
+        CallData rejectCallData;
+        CallType rejectCallType = getCallData(deferredReject, rejectCallData);
+        ASSERT(rejectCallType != CallTypeNone);
+
+        MarkedArgumentBuffer rejectArguments;
+        rejectArguments.append(exception);
+
+        call(exec, deferredReject, rejectCallType, rejectCallData, jsUndefined(), rejectArguments);
+        // FIXME: Should we return the result somewhere?
+    }
+    
+    // 5. Let 'handlerResult' be handlerResult.[[value]].
+    // Note: Nothing to do.
+
+    // 6. If SameValue(handlerResult, deferred.[[Promise]]) is true,
+    if (sameValue(exec, handlerResult, deferred-&gt;promise())) {
+        // i. Let 'selfResolutionError' be a newly-created TypeError object.
+        JSObject* selfResolutionError = createTypeError(exec, ASCIILiteral(&quot;Resolve a promise with itself&quot;));
+        // ii. Return the result of calling the [[Call]] internal method of deferred.[[Reject]] passing
+        //     undefined as thisArgument and a List containing selfResolutionError as argumentsList.
+        JSValue deferredReject = deferred-&gt;reject();
+
+        CallData rejectCallData;
+        CallType rejectCallType = getCallData(deferredReject, rejectCallData);
+        ASSERT(rejectCallType != CallTypeNone);
+
+        MarkedArgumentBuffer rejectArguments;
+        rejectArguments.append(selfResolutionError);
+
+        call(exec, deferredReject, rejectCallType, rejectCallData, jsUndefined(), rejectArguments);
+        // FIXME: Should we return the result somewhere?
+    }
+
+    // 7. Let 'updateResult' be the result of calling UpdateDeferredFromPotentialThenable(handlerResult, deferred).
+    ThenableStatus updateResult = updateDeferredFromPotentialThenable(exec, handlerResult, deferred);
+    
+    // 8. ReturnIfAbrupt(updateResult).
+    if (exec-&gt;hadException())
+        return;
+
+    // 9. If 'updateResult' is &quot;not a thenable&quot;,
+    if (updateResult == NotAThenable) {
+        // i. Return the result of calling the [[Call]] internal method of deferred.[[Resolve]]
+        //    passing undefined as thisArgument and a List containing handlerResult as argumentsList.
+
+        JSValue deferredResolve = deferred-&gt;resolve();
+
+        CallData resolveCallData;
+        CallType resolveCallType = getCallData(deferredResolve, resolveCallData);
+        ASSERT(resolveCallType != CallTypeNone);
+
+        MarkedArgumentBuffer arguments;
+        arguments.append(handlerResult);
+
+        call(exec, deferredResolve, resolveCallType, resolveCallData, jsUndefined(), arguments);
+        // FIXME: Should we return the result somewhere?
+    }
+}
+
+
+const ClassInfo JSPromiseReaction::s_info = { &quot;JSPromiseReaction&quot;, 0, 0, 0, CREATE_METHOD_TABLE(JSPromiseReaction) };
+
+JSPromiseReaction* JSPromiseReaction::create(VM&amp; vm, JSPromiseDeferred* deferred, JSValue handler)
+{
+    JSPromiseReaction* promiseReaction = new (NotNull, allocateCell&lt;JSPromiseReaction&gt;(vm.heap)) JSPromiseReaction(vm);
+    promiseReaction-&gt;finishCreation(vm, deferred, handler);
+    return promiseReaction;
+}
+
+JSPromiseReaction::JSPromiseReaction(VM&amp; vm)
+    : Base(vm, vm.promiseReactionStructure.get())
+{
+}
+
+void JSPromiseReaction::finishCreation(VM&amp; vm, JSPromiseDeferred* deferred, JSValue handler)
+{
+    Base::finishCreation(vm);
+    m_deferred.set(vm, this, deferred);
+    m_handler.set(vm, this, handler);
+}
+
+void JSPromiseReaction::visitChildren(JSCell* cell, SlotVisitor&amp; visitor)
+{
+    JSPromiseReaction* thisObject = jsCast&lt;JSPromiseReaction*&gt;(cell);
+    ASSERT_GC_OBJECT_INHERITS(thisObject, info());
+    COMPILE_ASSERT(StructureFlags &amp; OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag);
+    ASSERT(thisObject-&gt;structure()-&gt;typeInfo().overridesVisitChildren());
+
+    Base::visitChildren(thisObject, visitor);
+
+    visitor.append(&amp;thisObject-&gt;m_deferred);
+    visitor.append(&amp;thisObject-&gt;m_handler);
+}
+
+} // namespace JSC
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSPromiseReactionh"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/runtime/JSPromiseReaction.h (0 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSPromiseReaction.h                                (rev 0)
+++ trunk/Source/JavaScriptCore/runtime/JSPromiseReaction.h        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -0,0 +1,68 @@
</span><ins>+/*
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef JSPromiseReaction_h
+#define JSPromiseReaction_h
+
+#include &quot;JSCell.h&quot;
+#include &quot;Structure.h&quot;
+
+namespace JSC {
+
+class JSPromiseDeferred;
+class Microtask;
+
+class JSPromiseReaction : public JSCell {
+public:
+    typedef JSCell Base;
+
+    static JSPromiseReaction* create(VM&amp;, JSPromiseDeferred*, JSValue);
+    static Structure* createStructure(VM&amp; vm, JSGlobalObject* globalObject, JSValue prototype)
+    {
+        return Structure::create(vm, globalObject, prototype, TypeInfo(CompoundType, StructureFlags), info());
+    }
+
+    static const bool hasImmortalStructure = true;
+
+    DECLARE_INFO;
+
+    JSPromiseDeferred* deferred() const { return m_deferred.get(); }
+    JSValue handler() const { return m_handler.get(); }
+
+private:
+    JSPromiseReaction(VM&amp;);
+    void finishCreation(VM&amp;, JSPromiseDeferred*, JSValue);
+    static const unsigned StructureFlags = OverridesVisitChildren | Base::StructureFlags;
+    static void visitChildren(JSCell*, SlotVisitor&amp;);
+
+    WriteBarrier&lt;JSPromiseDeferred&gt; m_deferred;
+    WriteBarrier&lt;Unknown&gt; m_handler;
+};
+
+PassRefPtr&lt;Microtask&gt; createExecutePromiseReactionMicrotask(VM&amp;, JSPromiseReaction*, JSValue);
+
+} // namespace JSC
+
+#endif // JSPromiseReaction_h
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSPromiseResolvercpp"></a>
<div class="delfile"><h4>Deleted: trunk/Source/JavaScriptCore/runtime/JSPromiseResolver.cpp (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSPromiseResolver.cpp        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/JavaScriptCore/runtime/JSPromiseResolver.cpp        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -1,203 +0,0 @@
</span><del>-/*
- * Copyright (C) 2013 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include &quot;config.h&quot;
-#include &quot;JSPromiseResolver.h&quot;
-
-#if ENABLE(PROMISES)
-
-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
-#include &quot;JSGlobalObject.h&quot;
-#include &quot;JSPromise.h&quot;
-#include &quot;JSPromiseCallback.h&quot;
-#include &quot;SlotVisitorInlines.h&quot;
-#include &quot;StructureInlines.h&quot;
-
-namespace JSC {
-
-const ClassInfo JSPromiseResolver::s_info = { &quot;PromiseResolver&quot;, &amp;Base::s_info, 0, 0, CREATE_METHOD_TABLE(JSPromiseResolver) };
-
-JSPromiseResolver* JSPromiseResolver::create(VM&amp; vm, Structure* structure, JSPromise* promise)
-{
-    JSPromiseResolver* object = new (NotNull, allocateCell&lt;JSPromiseResolver&gt;(vm.heap)) JSPromiseResolver(vm, structure);
-    object-&gt;finishCreation(vm, promise);
-    return object;
-}
-
-Structure* JSPromiseResolver::createStructure(VM&amp; vm, JSGlobalObject* globalObject, JSValue prototype)
-{
-    return Structure::create(vm, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), info());
-}
-
-JSPromiseResolver::JSPromiseResolver(VM&amp; vm, Structure* structure)
-    : JSNonFinalObject(vm, structure)
-    , m_isResolved(false)
-{
-}
-
-void JSPromiseResolver::finishCreation(VM&amp; vm, JSPromise* promise)
-{
-    Base::finishCreation(vm);
-    ASSERT(inherits(info()));
-    m_promise.set(vm, this, promise);
-}
-
-void JSPromiseResolver::visitChildren(JSCell* cell, SlotVisitor&amp; visitor)
-{
-    JSPromiseResolver* thisObject = jsCast&lt;JSPromiseResolver*&gt;(cell);
-    ASSERT_GC_OBJECT_INHERITS(thisObject, info());
-    COMPILE_ASSERT(StructureFlags &amp; OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag);
-    ASSERT(thisObject-&gt;structure()-&gt;typeInfo().overridesVisitChildren());
-
-    Base::visitChildren(thisObject, visitor);
-    visitor.append(&amp;thisObject-&gt;m_promise);
-}
-
-JSPromise* JSPromiseResolver::promise() const
-{
-    return m_promise.get();
-}
-
-void JSPromiseResolver::fulfillIfNotResolved(ExecState* exec, JSValue value)
-{
-    if (!m_isResolved) {
-        m_isResolved = true;
-        fulfill(exec, value);
-    }
-}
-
-void JSPromiseResolver::resolveIfNotResolved(ExecState* exec, JSValue value)
-{
-    if (!m_isResolved) {
-        m_isResolved = true;
-        resolve(exec, value);
-    }
-}
-
-void JSPromiseResolver::rejectIfNotResolved(ExecState* exec, JSValue value)
-{
-    if (!m_isResolved) {
-        m_isResolved = true;
-        reject(exec, value);
-    }
-}
-
-void JSPromiseResolver::fulfill(ExecState* exec, JSValue value, ResolverMode mode)
-{
-    // 1. Let promise be the context object's associated promise.
-    // 2. Set promise's state to fulfilled.
-    m_promise-&gt;setState(JSPromise::Fulfilled);
-
-    // 3. Set promise's result to value.
-    m_promise-&gt;setResult(exec-&gt;vm(), value);
-
-    // 4. If the synchronous flag is set, process promise's fulfill callbacks with value.
-    if (mode == ResolveSynchronously) {
-        m_promise-&gt;processFulfillCallbacksWithValue(exec, value);
-        return;
-    }
-    
-    // 5. Otherwise, the synchronous flag is unset, queue a task to process promise's fulfill callbacks with value.
-    m_promise-&gt;queueTaskToProcessFulfillCallbacks(exec);
-}
-
-void JSPromiseResolver::resolve(ExecState* exec, JSValue value, ResolverMode mode)
-{
-    // 1. Let then be null.
-    JSValue then = jsNull();
-    
-    // 2. If value is a JavaScript Object, set then to the result of calling the JavaScript [[Get]] internal
-    //    method of value with property name then.
-    if (value.isObject()) {
-        then = value.get(exec, exec-&gt;propertyNames().then);
-
-        // 3. If calling the [[Get]] internal method threw an exception, catch it and run reject with the thrown
-        //    exception and the synchronous flag if set, and then terminate these steps.
-        if (exec-&gt;hadException()) {
-            JSValue exception = exec-&gt;exception();
-            exec-&gt;clearException();
-
-            reject(exec, exception, mode);
-            return;
-        }
-
-        // 4. If JavaScript IsCallable(then) is true, run these substeps and then terminate these steps:
-        CallData callData;
-        CallType callType = JSC::getCallData(then, callData);
-        if (callType != CallTypeNone) {
-            VM&amp; vm = exec-&gt;vm();
-            // 4.1. Let fulfillCallback be a promise callback for the context object and its resolve algorithm.
-            JSPromiseCallback* fulfillCallback = JSPromiseCallback::create(vm, globalObject()-&gt;promiseCallbackStructure(), this, JSPromiseCallback::Resolve);
-
-            // 4.2. Let rejectCallback be a promise callback for the context object and its reject algorithm.
-            JSPromiseCallback* rejectCallback = JSPromiseCallback::create(vm, globalObject()-&gt;promiseCallbackStructure(), this, JSPromiseCallback::Reject);
-            
-            // 4.3. Call the JavaScript [[Call]] internal method of then with this value value and fulfillCallback
-            //      and rejectCallback as arguments.
-            MarkedArgumentBuffer thenArguments;
-            thenArguments.append(fulfillCallback);
-            thenArguments.append(rejectCallback);
-            call(exec, then, callType, callData, value, thenArguments);
-
-            // 4.4 If calling the [[Call]] internal method threw an exception, catch it and run context object's
-            //     reject with the thrown exception and the synchronous flag if set.
-            if (exec-&gt;hadException()) {
-                JSValue exception = exec-&gt;exception();
-                exec-&gt;clearException();
-
-                reject(exec, exception, mode);
-                return;
-            }
-            return;
-        }
-    }
-
-    // 5. Run context object's fulfill with value and the synchronous flag if set.
-    fulfill(exec, value, mode);
-}
-
-void JSPromiseResolver::reject(ExecState* exec, JSValue value, ResolverMode mode)
-{
-    // 1. Let promise be the context object's associated promise.
-    // 2. Set promise's state to rejected.
-    m_promise-&gt;setState(JSPromise::Rejected);
-
-    // 3. Set promise's result to value.
-    m_promise-&gt;setResult(exec-&gt;vm(), value);
-
-    // 4. If the synchronous flag is set, process promise's reject callbacks with value.
-    if (mode == ResolveSynchronously) {
-        m_promise-&gt;processRejectCallbacksWithValue(exec, value);
-        return;
-    }
-    
-    // 5. Otherwise, the synchronous flag is unset, queue a task to process promise's reject callbacks with value.
-    m_promise-&gt;queueTaskToProcessRejectCallbacks(exec);
-}
-
-} // namespace JSC
-
-#endif // ENABLE(PROMISES)
</del></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSPromiseResolverh"></a>
<div class="delfile"><h4>Deleted: trunk/Source/JavaScriptCore/runtime/JSPromiseResolver.h (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSPromiseResolver.h        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/JavaScriptCore/runtime/JSPromiseResolver.h        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -1,78 +0,0 @@
</span><del>-/*
- * Copyright (C) 2013 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef JSPromiseResolver_h
-#define JSPromiseResolver_h
-
-#if ENABLE(PROMISES)
-
-#include &quot;JSObject.h&quot;
-
-namespace JSC {
-
-class JSPromise;
-
-class JSPromiseResolver : public JSNonFinalObject {
-public:
-    typedef JSNonFinalObject Base;
-
-    static JSPromiseResolver* create(VM&amp;, Structure*, JSPromise*);
-    static Structure* createStructure(VM&amp;, JSGlobalObject*, JSValue);
-
-    DECLARE_INFO;
-
-    JSPromise* promise() const;
-
-    JS_EXPORT_PRIVATE void fulfillIfNotResolved(ExecState*, JSValue);
-    void resolveIfNotResolved(ExecState*, JSValue);
-    JS_EXPORT_PRIVATE void rejectIfNotResolved(ExecState*, JSValue);
-
-    enum ResolverMode {
-        ResolveSynchronously,
-        ResolveAsynchronously,
-    };
-
-    void fulfill(ExecState*, JSValue, ResolverMode = ResolveAsynchronously);
-    void resolve(ExecState*, JSValue, ResolverMode = ResolveAsynchronously);
-    void reject(ExecState*, JSValue, ResolverMode = ResolveAsynchronously);
-
-protected:
-    void finishCreation(VM&amp;, JSPromise*);
-    static const unsigned StructureFlags = OverridesVisitChildren | JSObject::StructureFlags;
-
-private:
-    JSPromiseResolver(VM&amp;, Structure*);
-
-    static void visitChildren(JSCell*, SlotVisitor&amp;);
-
-    WriteBarrier&lt;JSPromise&gt; m_promise;
-    bool m_isResolved;
-};
-
-} // namespace JSC
-
-#endif // ENABLE(PROMISES)
-
-#endif // JSPromiseResolver_h
</del></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSPromiseResolverConstructorcpp"></a>
<div class="delfile"><h4>Deleted: trunk/Source/JavaScriptCore/runtime/JSPromiseResolverConstructor.cpp (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSPromiseResolverConstructor.cpp        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/JavaScriptCore/runtime/JSPromiseResolverConstructor.cpp        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -1,78 +0,0 @@
</span><del>-/*
- * Copyright (C) 2013 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include &quot;config.h&quot;
-#include &quot;JSPromiseResolverConstructor.h&quot;
-
-#if ENABLE(PROMISES)
-
-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
-#include &quot;JSPromiseResolverPrototype.h&quot;
-#include &quot;Lookup.h&quot;
-#include &quot;StructureInlines.h&quot;
-
-namespace JSC {
-
-STATIC_ASSERT_IS_TRIVIALLY_DESTRUCTIBLE(JSPromiseResolverConstructor);
-
-const ClassInfo JSPromiseResolverConstructor::s_info = { &quot;Function&quot;, &amp;Base::s_info, 0, 0, CREATE_METHOD_TABLE(JSPromiseResolverConstructor) };
-
-JSPromiseResolverConstructor* JSPromiseResolverConstructor::create(VM&amp; vm, Structure* structure, JSPromiseResolverPrototype* promisePrototype)
-{
-    JSPromiseResolverConstructor* constructor = new (NotNull, allocateCell&lt;JSPromiseResolverConstructor&gt;(vm.heap)) JSPromiseResolverConstructor(vm, structure);
-    constructor-&gt;finishCreation(vm, promisePrototype);
-    return constructor;
-}
-
-Structure* JSPromiseResolverConstructor::createStructure(VM&amp; vm, JSGlobalObject* globalObject, JSValue prototype)
-{
-    return Structure::create(vm, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), info());
-}
-
-JSPromiseResolverConstructor::JSPromiseResolverConstructor(VM&amp; vm, Structure* structure)
-    : InternalFunction(vm, structure)
-{
-}
-
-void JSPromiseResolverConstructor::finishCreation(VM&amp; vm, JSPromiseResolverPrototype* promiseResolverPrototype)
-{
-    Base::finishCreation(vm, &quot;PromiseResolver&quot;);
-    putDirectWithoutTransition(vm, vm.propertyNames-&gt;prototype, promiseResolverPrototype, DontEnum | DontDelete | ReadOnly);
-}
-
-ConstructType JSPromiseResolverConstructor::getConstructData(JSCell*, ConstructData&amp;)
-{
-    return ConstructTypeNone;
-}
-
-CallType JSPromiseResolverConstructor::getCallData(JSCell*, CallData&amp;)
-{
-    return CallTypeNone;
-}
-
-} // namespace JSC
-
-#endif // ENABLE(PROMISES)
</del></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSPromiseResolverConstructorh"></a>
<div class="delfile"><h4>Deleted: trunk/Source/JavaScriptCore/runtime/JSPromiseResolverConstructor.h (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSPromiseResolverConstructor.h        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/JavaScriptCore/runtime/JSPromiseResolverConstructor.h        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -1,60 +0,0 @@
</span><del>-/*
- * Copyright (C) 2013 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef JSPromiseResolverConstructor_h
-#define JSPromiseResolverConstructor_h
-
-#if ENABLE(PROMISES)
-
-#include &quot;InternalFunction.h&quot;
-
-namespace JSC {
-
-class JSPromiseResolverPrototype;
-
-class JSPromiseResolverConstructor : public InternalFunction {
-public:
-    typedef InternalFunction Base;
-
-    static JSPromiseResolverConstructor* create(VM&amp;, Structure*, JSPromiseResolverPrototype*);
-    static Structure* createStructure(VM&amp;, JSGlobalObject*, JSValue);
-
-    DECLARE_INFO;
-
-protected:
-    void finishCreation(VM&amp;, JSPromiseResolverPrototype*);
-    static const unsigned StructureFlags = InternalFunction::StructureFlags;
-
-private:
-    JSPromiseResolverConstructor(VM&amp;, Structure*);
-    static ConstructType getConstructData(JSCell*, ConstructData&amp;);
-    static CallType getCallData(JSCell*, CallData&amp;);
-};
-
-} // namespace JSC
-
-#endif // ENABLE(PROMISES)
-
-#endif // JSPromiseResolverConstructor_h
</del></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSPromiseResolverPrototypecpp"></a>
<div class="delfile"><h4>Deleted: trunk/Source/JavaScriptCore/runtime/JSPromiseResolverPrototype.cpp (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSPromiseResolverPrototype.cpp        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/JavaScriptCore/runtime/JSPromiseResolverPrototype.cpp        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -1,124 +0,0 @@
</span><del>-/*
- * Copyright (C) 2013 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include &quot;config.h&quot;
-#include &quot;JSPromiseResolverPrototype.h&quot;
-
-#if ENABLE(PROMISES)
-
-#include &quot;Error.h&quot;
-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
-#include &quot;JSPromiseResolver.h&quot;
-#include &quot;StructureInlines.h&quot;
-
-namespace JSC {
-
-STATIC_ASSERT_IS_TRIVIALLY_DESTRUCTIBLE(JSPromiseResolverPrototype);
-
-// void fulfill(optional any value);
-static EncodedJSValue JSC_HOST_CALL JSPromiseResolverPrototypeFuncFulfill(ExecState*);
-// void resolve(optional any value);
-static EncodedJSValue JSC_HOST_CALL JSPromiseResolverPrototypeFuncResolve(ExecState*);
-// void reject(optional any value);
-static EncodedJSValue JSC_HOST_CALL JSPromiseResolverPrototypeFuncReject(ExecState*);
-
-}
-
-#include &quot;JSPromiseResolverPrototype.lut.h&quot;
-
-namespace JSC {
-
-const ClassInfo JSPromiseResolverPrototype::s_info = { &quot;PromiseResolverPrototype&quot;, &amp;Base::s_info, 0, ExecState::promiseResolverPrototypeTable, CREATE_METHOD_TABLE(JSPromiseResolverPrototype) };
-
-/* Source for JSPromiseResolverPrototype.lut.h
-@begin promiseResolverPrototypeTable
-  fulfill         JSPromiseResolverPrototypeFuncFulfill             DontEnum|Function 1
-  resolve         JSPromiseResolverPrototypeFuncResolve             DontEnum|Function 1
-  reject          JSPromiseResolverPrototypeFuncReject              DontEnum|Function 1
-@end
-*/
-
-JSPromiseResolverPrototype* JSPromiseResolverPrototype::create(ExecState* exec, JSGlobalObject*, Structure* structure)
-{
-    VM&amp; vm = exec-&gt;vm();
-    JSPromiseResolverPrototype* object = new (NotNull, allocateCell&lt;JSPromiseResolverPrototype&gt;(vm.heap)) JSPromiseResolverPrototype(exec, structure);
-    object-&gt;finishCreation(vm, structure);
-    return object;
-}
-
-Structure* JSPromiseResolverPrototype::createStructure(VM&amp; vm, JSGlobalObject* globalObject, JSValue prototype)
-{
-    return Structure::create(vm, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), info());
-}
-
-JSPromiseResolverPrototype::JSPromiseResolverPrototype(ExecState* exec, Structure* structure)
-    : JSNonFinalObject(exec-&gt;vm(), structure)
-{
-}
-
-void JSPromiseResolverPrototype::finishCreation(VM&amp; vm, Structure*)
-{
-    Base::finishCreation(vm);
-}
-
-bool JSPromiseResolverPrototype::getOwnPropertySlot(JSObject* object, ExecState* exec, PropertyName propertyName, PropertySlot&amp; slot)
-{
-    return getStaticFunctionSlot&lt;JSObject&gt;(exec, ExecState::promiseResolverPrototypeTable(exec), jsCast&lt;JSPromiseResolverPrototype*&gt;(object), propertyName, slot);
-}
-
-EncodedJSValue JSC_HOST_CALL JSPromiseResolverPrototypeFuncFulfill(ExecState* exec)
-{
-    JSPromiseResolver* thisObject = jsDynamicCast&lt;JSPromiseResolver*&gt;(exec-&gt;thisValue());
-    if (!thisObject)
-        return throwVMError(exec, createTypeError(exec, &quot;Receiver of fulfill must be a PromiseResolver&quot;));
-
-    thisObject-&gt;fulfillIfNotResolved(exec, exec-&gt;argument(0));
-    return JSValue::encode(jsUndefined());
-}
-
-EncodedJSValue JSC_HOST_CALL JSPromiseResolverPrototypeFuncResolve(ExecState* exec)
-{
-    JSPromiseResolver* thisObject = jsDynamicCast&lt;JSPromiseResolver*&gt;(exec-&gt;thisValue());
-    if (!thisObject)
-        return throwVMError(exec, createTypeError(exec, &quot;Receiver of resolve must be a PromiseResolver&quot;));
-
-    thisObject-&gt;resolveIfNotResolved(exec, exec-&gt;argument(0));
-    return JSValue::encode(jsUndefined());
-}
-
-EncodedJSValue JSC_HOST_CALL JSPromiseResolverPrototypeFuncReject(ExecState* exec)
-{
-    JSPromiseResolver* thisObject = jsDynamicCast&lt;JSPromiseResolver*&gt;(exec-&gt;thisValue());
-    if (!thisObject)
-        return throwVMError(exec, createTypeError(exec, &quot;Receiver of reject must be a PromiseResolver&quot;));
-
-    thisObject-&gt;rejectIfNotResolved(exec, exec-&gt;argument(0));
-    return JSValue::encode(jsUndefined());
-}
-
-} // namespace JSC
-
-#endif // ENABLE(PROMISES)
</del></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeJSPromiseResolverPrototypeh"></a>
<div class="delfile"><h4>Deleted: trunk/Source/JavaScriptCore/runtime/JSPromiseResolverPrototype.h (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/JSPromiseResolverPrototype.h        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/JavaScriptCore/runtime/JSPromiseResolverPrototype.h        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -1,57 +0,0 @@
</span><del>-/*
- * Copyright (C) 2013 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef JSPromiseResolverPrototype_h
-#define JSPromiseResolverPrototype_h
-
-#if ENABLE(PROMISES)
-
-#include &quot;JSObject.h&quot;
-
-namespace JSC {
-
-class JSPromiseResolverPrototype : public JSNonFinalObject {
-public:
-    typedef JSNonFinalObject Base;
-
-    static JSPromiseResolverPrototype* create(ExecState*, JSGlobalObject*, Structure*);
-    static Structure* createStructure(VM&amp;, JSGlobalObject*, JSValue);
-
-    DECLARE_INFO;
-
-protected:
-    void finishCreation(VM&amp;, Structure*);
-    static const unsigned StructureFlags = OverridesGetOwnPropertySlot | JSObject::StructureFlags;
-
-private:
-    JSPromiseResolverPrototype(ExecState*, Structure*);
-    static bool getOwnPropertySlot(JSObject*, ExecState*, PropertyName, PropertySlot&amp;);
-};
-
-} // namespace JSC
-
-#endif // ENABLE(PROMISES)
-
-#endif // JSPromiseResolverPrototype_h
</del></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeMicrotaskh"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/runtime/Microtask.h (0 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/Microtask.h                                (rev 0)
+++ trunk/Source/JavaScriptCore/runtime/Microtask.h        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -0,0 +1,46 @@
</span><ins>+/*
+ * Copyright (C) 2014 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef Microtask_h
+#define Microtask_h
+
+#include &lt;wtf/RefCounted.h&gt;
+
+namespace JSC {
+
+class ExecState;
+
+class Microtask : public RefCounted&lt;Microtask&gt; {
+public:
+    virtual ~Microtask()
+    {
+    }
+
+    virtual void run(ExecState*) = 0;
+};
+
+} // namespace JSC
+
+#endif // Microtask_h
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeVMcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/VM.cpp (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/VM.cpp        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/JavaScriptCore/runtime/VM.cpp        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -57,6 +57,8 @@
</span><span class="cx"> #include &quot;JSLock.h&quot;
</span><span class="cx"> #include &quot;JSNameScope.h&quot;
</span><span class="cx"> #include &quot;JSNotAnObject.h&quot;
</span><ins>+#include &quot;JSPromiseDeferred.h&quot;
+#include &quot;JSPromiseReaction.h&quot;
</ins><span class="cx"> #include &quot;JSPropertyNameIterator.h&quot;
</span><span class="cx"> #include &quot;JSWithScope.h&quot;
</span><span class="cx"> #include &quot;Lexer.h&quot;
</span><span class="lines">@@ -114,7 +116,6 @@
</span><span class="cx"> #if ENABLE(PROMISES)
</span><span class="cx"> extern const HashTable promisePrototypeTable;
</span><span class="cx"> extern const HashTable promiseConstructorTable;
</span><del>-extern const HashTable promiseResolverPrototypeTable;
</del><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> // Note: Platform.h will enforce that ENABLE(ASSEMBLER) is true if either
</span><span class="lines">@@ -185,7 +186,6 @@
</span><span class="cx"> #if ENABLE(PROMISES)
</span><span class="cx">     , promisePrototypeTable(adoptPtr(new HashTable(JSC::promisePrototypeTable)))
</span><span class="cx">     , promiseConstructorTable(adoptPtr(new HashTable(JSC::promiseConstructorTable)))
</span><del>-    , promiseResolverPrototypeTable(adoptPtr(new HashTable(JSC::promiseResolverPrototypeTable)))
</del><span class="cx"> #endif
</span><span class="cx">     , identifierTable(vmType == Default ? wtfThreadData().currentIdentifierTable() : createIdentifierTable())
</span><span class="cx">     , propertyNames(new CommonIdentifiers(this))
</span><span class="lines">@@ -258,6 +258,8 @@
</span><span class="cx">     propertyTableStructure.set(*this, PropertyTable::createStructure(*this, 0, jsNull()));
</span><span class="cx">     mapDataStructure.set(*this, MapData::createStructure(*this, 0, jsNull()));
</span><span class="cx">     weakMapDataStructure.set(*this, WeakMapData::createStructure(*this, 0, jsNull()));
</span><ins>+    promiseDeferredStructure.set(*this, JSPromiseDeferred::createStructure(*this, 0, jsNull()));
+    promiseReactionStructure.set(*this, JSPromiseReaction::createStructure(*this, 0, jsNull()));
</ins><span class="cx">     iterationTerminator.set(*this, JSFinalObject::create(*this, JSFinalObject::createStructure(*this, 0, jsNull(), 1)));
</span><span class="cx">     smallStrings.initializeCommonStrings(*this);
</span><span class="cx"> 
</span><span class="lines">@@ -350,7 +352,6 @@
</span><span class="cx"> #if ENABLE(PROMISES)
</span><span class="cx">     promisePrototypeTable-&gt;deleteTable();
</span><span class="cx">     promiseConstructorTable-&gt;deleteTable();
</span><del>-    promiseResolverPrototypeTable-&gt;deleteTable();
</del><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     delete emptyList;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeVMh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/VM.h (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/VM.h        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/JavaScriptCore/runtime/VM.h        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -252,7 +252,6 @@
</span><span class="cx"> #if ENABLE(PROMISES)
</span><span class="cx">         const OwnPtr&lt;const HashTable&gt; promisePrototypeTable;
</span><span class="cx">         const OwnPtr&lt;const HashTable&gt; promiseConstructorTable;
</span><del>-        const OwnPtr&lt;const HashTable&gt; promiseResolverPrototypeTable;
</del><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">         Strong&lt;Structure&gt; structureStructure;
</span><span class="lines">@@ -283,6 +282,8 @@
</span><span class="cx">         Strong&lt;Structure&gt; propertyTableStructure;
</span><span class="cx">         Strong&lt;Structure&gt; mapDataStructure;
</span><span class="cx">         Strong&lt;Structure&gt; weakMapDataStructure;
</span><ins>+        Strong&lt;Structure&gt; promiseDeferredStructure;
+        Strong&lt;Structure&gt; promiseReactionStructure;
</ins><span class="cx">         Strong&lt;JSCell&gt; iterationTerminator;
</span><span class="cx"> 
</span><span class="cx">         IdentifierTable* identifierTable;
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/WebCore/ChangeLog        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -1,3 +1,45 @@
</span><ins>+2014-01-02  Sam Weinig  &lt;sam@webkit.org&gt;
+
+        Update Promises to the https://github.com/domenic/promises-unwrapping spec
+        https://bugs.webkit.org/show_bug.cgi?id=120954
+
+        Reviewed by Filip Pizlo.
+
+        * ForwardingHeaders/runtime/JSPromiseDeferred.h: Added.
+        * ForwardingHeaders/runtime/JSPromiseResolver.h: Removed.
+        * bindings/js/JSDOMGlobalObjectTask.cpp:
+        (WebCore::JSGlobalObjectTask::JSGlobalObjectTask):
+        * bindings/js/JSDOMGlobalObjectTask.h:
+        * bindings/js/JSDOMPromise.cpp:
+        (WebCore::DeferredWrapper::DeferredWrapper):
+        (WebCore::DeferredWrapper::promise):
+        (WebCore::DeferredWrapper::resolve):
+        (WebCore::DeferredWrapper::reject):
+        * bindings/js/JSDOMPromise.h:
+        (WebCore::DeferredWrapper::resolve):
+        (WebCore::DeferredWrapper::reject):
+        (WebCore::DeferredWrapper::resolve&lt;String&gt;):
+        (WebCore::DeferredWrapper::resolve&lt;bool&gt;):
+        (WebCore::char&gt;&gt;):
+        (WebCore::DeferredWrapper::reject&lt;String&gt;):
+        * bindings/js/JSDOMWindowBase.cpp:
+        (WebCore::JSDOMWindowBase::queueTaskToEventLoop):
+        * bindings/js/JSDOMWindowBase.h:
+        * bindings/js/JSSubtleCryptoCustom.cpp:
+        (WebCore::JSSubtleCrypto::encrypt):
+        (WebCore::JSSubtleCrypto::decrypt):
+        (WebCore::JSSubtleCrypto::sign):
+        (WebCore::JSSubtleCrypto::verify):
+        (WebCore::JSSubtleCrypto::digest):
+        (WebCore::JSSubtleCrypto::generateKey):
+        (WebCore::JSSubtleCrypto::importKey):
+        (WebCore::JSSubtleCrypto::exportKey):
+        (WebCore::JSSubtleCrypto::wrapKey):
+        (WebCore::JSSubtleCrypto::unwrapKey):
+        * bindings/js/JSWorkerGlobalScopeBase.cpp:
+        (WebCore::JSWorkerGlobalScopeBase::queueTaskToEventLoop):
+        * bindings/js/JSWorkerGlobalScopeBase.h:
+
</ins><span class="cx"> 2014-01-02  Tim Horton  &lt;timothy_horton@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         ImageBufferBackingStoreCache should use DeferrableOneShotTimer
</span></span></pre></div>
<a id="trunkSourceWebCoreForwardingHeadersruntimeJSPromiseDeferredh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/ForwardingHeaders/runtime/JSPromiseDeferred.h (0 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ForwardingHeaders/runtime/JSPromiseDeferred.h                                (rev 0)
+++ trunk/Source/WebCore/ForwardingHeaders/runtime/JSPromiseDeferred.h        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -0,0 +1,4 @@
</span><ins>+#ifndef WebCore_FWD_JSPromiseDeferred_h
+#define WebCore_FWD_JSPromiseDeferred_h
+#include &lt;JavaScriptCore/JSPromiseDeferred.h&gt;
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebCoreForwardingHeadersruntimeJSPromiseResolverh"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/ForwardingHeaders/runtime/JSPromiseResolver.h (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ForwardingHeaders/runtime/JSPromiseResolver.h        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/WebCore/ForwardingHeaders/runtime/JSPromiseResolver.h        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -1,4 +0,0 @@
</span><del>-#ifndef WebCore_FWD_JSPromiseResolver_h
-#define WebCore_FWD_JSPromiseResolver_h
-#include &lt;JavaScriptCore/JSPromiseResolver.h&gt;
-#endif
</del></span></pre></div>
<a id="trunkSourceWebCoreForwardingHeadersruntimeMicrotaskh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/ForwardingHeaders/runtime/Microtask.h (0 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ForwardingHeaders/runtime/Microtask.h                                (rev 0)
+++ trunk/Source/WebCore/ForwardingHeaders/runtime/Microtask.h        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -0,0 +1,4 @@
</span><ins>+#ifndef WebCore_FWD_Microtask_h
+#define WebCore_FWD_Microtask_h
+#include &lt;JavaScriptCore/Microtask.h&gt;
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSDOMGlobalObjectTaskcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSDOMGlobalObjectTask.cpp (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSDOMGlobalObjectTask.cpp        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/WebCore/bindings/js/JSDOMGlobalObjectTask.cpp        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> #include &quot;ActiveDOMCallback.h&quot;
</span><span class="cx"> #include &quot;JSMainThreadExecState.h&quot;
</span><span class="cx"> #include &lt;heap/StrongInlines.h&gt;
</span><ins>+#include &lt;runtime/Microtask.h&gt;
</ins><span class="cx"> #include &lt;wtf/Ref.h&gt;
</span><span class="cx"> 
</span><span class="cx"> using namespace JSC;
</span><span class="lines">@@ -37,9 +38,9 @@
</span><span class="cx"> 
</span><span class="cx"> class JSGlobalObjectCallback FINAL : public RefCounted&lt;JSGlobalObjectCallback&gt;, private ActiveDOMCallback {
</span><span class="cx"> public:
</span><del>-    static PassRefPtr&lt;JSGlobalObjectCallback&gt; create(JSDOMGlobalObject* globalObject, GlobalObjectMethodTable::QueueTaskToEventLoopCallbackFunctionPtr functionPtr, PassRefPtr&lt;TaskContext&gt; taskContext)
</del><ins>+    static PassRefPtr&lt;JSGlobalObjectCallback&gt; create(JSDOMGlobalObject* globalObject, PassRefPtr&lt;Microtask&gt; task)
</ins><span class="cx">     {
</span><del>-        return adoptRef(new JSGlobalObjectCallback(globalObject, functionPtr, taskContext));
</del><ins>+        return adoptRef(new JSGlobalObjectCallback(globalObject, task));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     void call()
</span><span class="lines">@@ -61,27 +62,25 @@
</span><span class="cx">         // push the current ExecState on to the JSMainThreadExecState stack.
</span><span class="cx">         if (context-&gt;isDocument()) {
</span><span class="cx">             JSMainThreadExecState currentState(exec);
</span><del>-            m_functionPtr(exec, m_taskContext.get());
</del><ins>+            m_task-&gt;run(exec);
</ins><span class="cx">         } else
</span><del>-            m_functionPtr(exec, m_taskContext.get());
</del><ins>+            m_task-&gt;run(exec);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    JSGlobalObjectCallback(JSDOMGlobalObject* globalObject, GlobalObjectMethodTable::QueueTaskToEventLoopCallbackFunctionPtr functionPtr, PassRefPtr&lt;TaskContext&gt; taskContext)
</del><ins>+    JSGlobalObjectCallback(JSDOMGlobalObject* globalObject, PassRefPtr&lt;Microtask&gt; task)
</ins><span class="cx">         : ActiveDOMCallback(globalObject-&gt;scriptExecutionContext())
</span><span class="cx">         , m_globalObject(globalObject-&gt;vm(), globalObject)
</span><del>-        , m_functionPtr(functionPtr)
-        , m_taskContext(taskContext)
</del><ins>+        , m_task(task)
</ins><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     Strong&lt;JSDOMGlobalObject&gt; m_globalObject;
</span><del>-    GlobalObjectMethodTable::QueueTaskToEventLoopCallbackFunctionPtr m_functionPtr;
-    RefPtr&lt;TaskContext&gt; m_taskContext;
</del><ins>+    RefPtr&lt;Microtask&gt; m_task;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><del>-JSGlobalObjectTask::JSGlobalObjectTask(JSDOMGlobalObject* globalObject, GlobalObjectMethodTable::QueueTaskToEventLoopCallbackFunctionPtr functionPtr, PassRefPtr&lt;TaskContext&gt; taskContext)
-    : m_callback(JSGlobalObjectCallback::create(globalObject, functionPtr, taskContext))
</del><ins>+JSGlobalObjectTask::JSGlobalObjectTask(JSDOMGlobalObject* globalObject, PassRefPtr&lt;Microtask&gt; task)
+    : m_callback(JSGlobalObjectCallback::create(globalObject, task))
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSDOMGlobalObjectTaskh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSDOMGlobalObjectTask.h (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSDOMGlobalObjectTask.h        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/WebCore/bindings/js/JSDOMGlobalObjectTask.h        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -35,15 +35,15 @@
</span><span class="cx"> 
</span><span class="cx"> class JSGlobalObjectTask FINAL : public ScriptExecutionContext::Task {
</span><span class="cx"> public:
</span><del>-    static PassOwnPtr&lt;JSGlobalObjectTask&gt; create(JSDOMGlobalObject* globalObject, JSC::GlobalObjectMethodTable::QueueTaskToEventLoopCallbackFunctionPtr functionPtr, PassRefPtr&lt;JSC::TaskContext&gt; taskContext)
</del><ins>+    static PassOwnPtr&lt;JSGlobalObjectTask&gt; create(JSDOMGlobalObject* globalObject, PassRefPtr&lt;JSC::Microtask&gt; task)
</ins><span class="cx">     {
</span><del>-        return adoptPtr(new JSGlobalObjectTask(globalObject, functionPtr, taskContext));
</del><ins>+        return adoptPtr(new JSGlobalObjectTask(globalObject, task));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     virtual ~JSGlobalObjectTask();
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    JSGlobalObjectTask(JSDOMGlobalObject*, JSC::GlobalObjectMethodTable::QueueTaskToEventLoopCallbackFunctionPtr, PassRefPtr&lt;JSC::TaskContext&gt;);
</del><ins>+    JSGlobalObjectTask(JSDOMGlobalObject*, PassRefPtr&lt;JSC::Microtask&gt;);
</ins><span class="cx"> 
</span><span class="cx">     virtual void performTask(ScriptExecutionContext*) OVERRIDE;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSDOMPromisecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSDOMPromise.cpp (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSDOMPromise.cpp        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/WebCore/bindings/js/JSDOMPromise.cpp        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -26,12 +26,47 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;JSDOMPromise.h&quot;
</span><span class="cx"> 
</span><ins>+using namespace JSC;
+
</ins><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-PromiseWrapper::PromiseWrapper(JSDOMGlobalObject* globalObject, JSC::JSPromise* promise)
-    : m_globalObject(globalObject-&gt;vm(), globalObject)
-    , m_promise(globalObject-&gt;vm(), promise)
</del><ins>+DeferredWrapper::DeferredWrapper(ExecState* exec, JSDOMGlobalObject* globalObject)
+    : m_globalObject(exec-&gt;vm(), globalObject)
+    , m_deferred(exec-&gt;vm(), JSPromiseDeferred::create(exec, globalObject))
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+JSObject* DeferredWrapper::promise() const
+{
+    return m_deferred-&gt;promise();
</ins><span class="cx"> }
</span><ins>+
+void DeferredWrapper::resolve(ExecState* exec, JSValue resolution)
+{
+    JSValue deferredResolve = m_deferred-&gt;resolve();
+
+    CallData resolveCallData;
+    CallType resolveCallType = getCallData(deferredResolve, resolveCallData);
+    ASSERT(resolveCallType != CallTypeNone);
+
+    MarkedArgumentBuffer arguments;
+    arguments.append(resolution);
+
+    call(exec, deferredResolve, resolveCallType, resolveCallData, jsUndefined(), arguments);
+}
+
+void DeferredWrapper::reject(ExecState* exec, JSValue reason)
+{
+    JSValue deferredReject = m_deferred-&gt;reject();
+
+    CallData rejectCallData;
+    CallType rejectCallType = getCallData(deferredReject, rejectCallData);
+    ASSERT(rejectCallType != CallTypeNone);
+
+    MarkedArgumentBuffer arguments;
+    arguments.append(reason);
+
+    call(exec, deferredReject, rejectCallType, rejectCallData, jsUndefined(), arguments);
+}
+
+}
</ins></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSDOMPromiseh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSDOMPromise.h (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSDOMPromise.h        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/WebCore/bindings/js/JSDOMPromise.h        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -29,76 +29,79 @@
</span><span class="cx"> #include &quot;JSCryptoKey.h&quot;
</span><span class="cx"> #include &quot;JSCryptoKeyPair.h&quot;
</span><span class="cx"> #include &quot;JSDOMBinding.h&quot;
</span><del>-#include &lt;runtime/JSGlobalObject.h&gt;
-#include &lt;runtime/JSPromise.h&gt;
-#include &lt;runtime/JSPromiseResolver.h&gt;
</del><span class="cx"> #include &lt;heap/StrongInlines.h&gt;
</span><ins>+#include &lt;runtime/JSPromiseDeferred.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-class PromiseWrapper {
</del><ins>+class DeferredWrapper {
</ins><span class="cx"> public:
</span><del>-    PromiseWrapper(JSDOMGlobalObject*, JSC::JSPromise*);
</del><ins>+    DeferredWrapper(JSC::ExecState*, JSDOMGlobalObject*);
</ins><span class="cx"> 
</span><del>-    template&lt;class FulfillResultType&gt;
-    void fulfill(const FulfillResultType&amp;);
</del><ins>+    template&lt;class ResolveResultType&gt;
+    void resolve(const ResolveResultType&amp;);
</ins><span class="cx"> 
</span><span class="cx">     template&lt;class RejectResultType&gt;
</span><span class="cx">     void reject(const RejectResultType&amp;);
</span><span class="cx"> 
</span><ins>+    JSC::JSObject* promise() const;
+
</ins><span class="cx"> private:
</span><ins>+    void resolve(JSC::ExecState*, JSC::JSValue);
+    void reject(JSC::ExecState*, JSC::JSValue);
+
</ins><span class="cx">     JSC::Strong&lt;JSDOMGlobalObject&gt; m_globalObject;
</span><del>-    JSC::Strong&lt;JSC::JSPromise&gt; m_promise;
</del><ins>+    JSC::Strong&lt;JSC::JSPromiseDeferred&gt; m_deferred;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><del>-template&lt;class FulfillResultType&gt;
-inline void PromiseWrapper::fulfill(const FulfillResultType&amp; result)
</del><ins>+template&lt;class ResolveResultType&gt;
+inline void DeferredWrapper::resolve(const ResolveResultType&amp; result)
</ins><span class="cx"> {
</span><span class="cx">     JSC::ExecState* exec = m_globalObject-&gt;globalExec();
</span><del>-    m_promise-&gt;resolver()-&gt;fulfillIfNotResolved(exec, toJS(exec, m_globalObject.get(), result));
</del><ins>+    resolve(exec, toJS(exec, m_globalObject.get(), result));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;class RejectResultType&gt;
</span><del>-inline void PromiseWrapper::reject(const RejectResultType&amp; result)
</del><ins>+inline void DeferredWrapper::reject(const RejectResultType&amp; result)
</ins><span class="cx"> {
</span><span class="cx">     JSC::ExecState* exec = m_globalObject-&gt;globalExec();
</span><del>-    m_promise-&gt;resolver()-&gt;rejectIfNotResolved(exec, toJS(exec, m_globalObject.get(), result));
</del><ins>+    reject(exec, toJS(exec, m_globalObject.get(), result));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline void PromiseWrapper::reject(const std::nullptr_t&amp;)
</del><ins>+inline void DeferredWrapper::reject(const std::nullptr_t&amp;)
</ins><span class="cx"> {
</span><span class="cx">     JSC::ExecState* exec = m_globalObject-&gt;globalExec();
</span><del>-    m_promise-&gt;resolver()-&gt;rejectIfNotResolved(exec, JSC::jsNull());
</del><ins>+    reject(exec, JSC::jsNull());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline void PromiseWrapper::fulfill&lt;String&gt;(const String&amp; result)
</del><ins>+inline void DeferredWrapper::resolve&lt;String&gt;(const String&amp; result)
</ins><span class="cx"> {
</span><span class="cx">     JSC::ExecState* exec = m_globalObject-&gt;globalExec();
</span><del>-    m_promise-&gt;resolver()-&gt;fulfillIfNotResolved(exec, jsString(exec, result));
</del><ins>+    resolve(exec, jsString(exec, result));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline void PromiseWrapper::fulfill&lt;bool&gt;(const bool&amp; result)
</del><ins>+inline void DeferredWrapper::resolve&lt;bool&gt;(const bool&amp; result)
</ins><span class="cx"> {
</span><span class="cx">     JSC::ExecState* exec = m_globalObject-&gt;globalExec();
</span><del>-    m_promise-&gt;resolver()-&gt;fulfillIfNotResolved(exec, JSC::jsBoolean(result));
</del><ins>+    resolve(exec, JSC::jsBoolean(result));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline void PromiseWrapper::fulfill&lt;Vector&lt;unsigned char&gt;&gt;(const Vector&lt;unsigned char&gt;&amp; result)
</del><ins>+inline void DeferredWrapper::resolve&lt;Vector&lt;unsigned char&gt;&gt;(const Vector&lt;unsigned char&gt;&amp; result)
</ins><span class="cx"> {
</span><span class="cx">     JSC::ExecState* exec = m_globalObject-&gt;globalExec();
</span><span class="cx">     RefPtr&lt;ArrayBuffer&gt; buffer = ArrayBuffer::create(result.data(), result.size());
</span><del>-    m_promise-&gt;resolver()-&gt;fulfillIfNotResolved(exec, toJS(exec, m_globalObject.get(), buffer.get()));
</del><ins>+    resolve(exec, toJS(exec, m_globalObject.get(), buffer.get()));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt;
</span><del>-inline void PromiseWrapper::reject&lt;String&gt;(const String&amp; result)
</del><ins>+inline void DeferredWrapper::reject&lt;String&gt;(const String&amp; result)
</ins><span class="cx"> {
</span><span class="cx">     JSC::ExecState* exec = m_globalObject-&gt;globalExec();
</span><del>-    m_promise-&gt;resolver()-&gt;rejectIfNotResolved(exec, jsString(exec, result));
</del><ins>+    reject(exec, jsString(exec, result));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSDOMWindowBasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSDOMWindowBase.cpp (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSDOMWindowBase.cpp        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/WebCore/bindings/js/JSDOMWindowBase.cpp        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -37,6 +37,7 @@
</span><span class="cx"> #include &quot;SecurityOrigin.h&quot;
</span><span class="cx"> #include &quot;Settings.h&quot;
</span><span class="cx"> #include &quot;WebCoreJSClientData.h&quot;
</span><ins>+#include &lt;runtime/Microtask.h&gt;
</ins><span class="cx"> #include &lt;wtf/MainThread.h&gt;
</span><span class="cx"> 
</span><span class="cx"> using namespace JSC;
</span><span class="lines">@@ -181,10 +182,10 @@
</span><span class="cx">     return frame-&gt;settings().javaScriptExperimentsEnabled();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void JSDOMWindowBase::queueTaskToEventLoop(const JSGlobalObject* object, GlobalObjectMethodTable::QueueTaskToEventLoopCallbackFunctionPtr functionPtr, PassRefPtr&lt;TaskContext&gt; taskContext)
</del><ins>+void JSDOMWindowBase::queueTaskToEventLoop(const JSGlobalObject* object, PassRefPtr&lt;Microtask&gt; task)
</ins><span class="cx"> {
</span><span class="cx">     const JSDOMWindowBase* thisObject = static_cast&lt;const JSDOMWindowBase*&gt;(object);
</span><del>-    thisObject-&gt;scriptExecutionContext()-&gt;postTask(JSGlobalObjectTask::create((JSDOMWindowBase*)thisObject, functionPtr, taskContext));
</del><ins>+    thisObject-&gt;scriptExecutionContext()-&gt;postTask(JSGlobalObjectTask::create((JSDOMWindowBase*)thisObject, task));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void JSDOMWindowBase::willRemoveFromWindowShell()
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSDOMWindowBaseh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSDOMWindowBase.h (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSDOMWindowBase.h        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/WebCore/bindings/js/JSDOMWindowBase.h        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -65,8 +65,7 @@
</span><span class="cx">         static bool shouldInterruptScript(const JSC::JSGlobalObject*);
</span><span class="cx">         static bool shouldInterruptScriptBeforeTimeout(const JSC::JSGlobalObject*);
</span><span class="cx">         static bool javaScriptExperimentsEnabled(const JSC::JSGlobalObject*);
</span><del>-
-        static void queueTaskToEventLoop(const JSC::JSGlobalObject*, JSC::GlobalObjectMethodTable::QueueTaskToEventLoopCallbackFunctionPtr, PassRefPtr&lt;JSC::TaskContext&gt;);
</del><ins>+        static void queueTaskToEventLoop(const JSC::JSGlobalObject*, PassRefPtr&lt;JSC::Microtask&gt;);
</ins><span class="cx">         
</span><span class="cx">         void printErrorMessage(const String&amp;) const;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSSubtleCryptoCustomcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSSubtleCryptoCustom.cpp (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSSubtleCryptoCustom.cpp        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/WebCore/bindings/js/JSSubtleCryptoCustom.cpp        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -161,13 +161,13 @@
</span><span class="cx">         return jsUndefined();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    JSPromise* promise = JSPromise::createWithResolver(exec-&gt;vm(), globalObject());
-    PromiseWrapper promiseWrapper(globalObject(), promise);
-    auto successCallback = [promiseWrapper](const Vector&lt;uint8_t&gt;&amp; result) mutable {
-        promiseWrapper.fulfill(result);
</del><ins>+    
+    DeferredWrapper wrapper(exec, globalObject());
+    auto successCallback = [wrapper](const Vector&lt;uint8_t&gt;&amp; result) mutable {
+        wrapper.resolve(result);
</ins><span class="cx">     };
</span><del>-    auto failureCallback = [promiseWrapper]() mutable {
-        promiseWrapper.reject(nullptr);
</del><ins>+    auto failureCallback = [wrapper]() mutable {
+        wrapper.reject(nullptr);
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     ExceptionCode ec = 0;
</span><span class="lines">@@ -177,7 +177,7 @@
</span><span class="cx">         return jsUndefined();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return promise;
</del><ins>+    return wrapper.promise();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> JSValue JSSubtleCrypto::decrypt(ExecState* exec)
</span><span class="lines">@@ -213,13 +213,12 @@
</span><span class="cx">         return jsUndefined();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    JSPromise* promise = JSPromise::createWithResolver(exec-&gt;vm(), globalObject());
-    PromiseWrapper promiseWrapper(globalObject(), promise);
-    auto successCallback = [promiseWrapper](const Vector&lt;uint8_t&gt;&amp; result) mutable {
-        promiseWrapper.fulfill(result);
</del><ins>+    DeferredWrapper wrapper(exec, globalObject());
+    auto successCallback = [wrapper](const Vector&lt;uint8_t&gt;&amp; result) mutable {
+        wrapper.resolve(result);
</ins><span class="cx">     };
</span><del>-    auto failureCallback = [promiseWrapper]() mutable {
-        promiseWrapper.reject(nullptr);
</del><ins>+    auto failureCallback = [wrapper]() mutable {
+        wrapper.reject(nullptr);
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     ExceptionCode ec = 0;
</span><span class="lines">@@ -229,7 +228,7 @@
</span><span class="cx">         return jsUndefined();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return promise;
</del><ins>+    return wrapper.promise();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> JSValue JSSubtleCrypto::sign(ExecState* exec)
</span><span class="lines">@@ -265,13 +264,12 @@
</span><span class="cx">         return jsUndefined();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    JSPromise* promise = JSPromise::createWithResolver(exec-&gt;vm(), globalObject());
-    PromiseWrapper promiseWrapper(globalObject(), promise);
-    auto successCallback = [promiseWrapper](const Vector&lt;uint8_t&gt;&amp; result) mutable {
-        promiseWrapper.fulfill(result);
</del><ins>+    DeferredWrapper wrapper(exec, globalObject());
+    auto successCallback = [wrapper](const Vector&lt;uint8_t&gt;&amp; result) mutable {
+        wrapper.resolve(result);
</ins><span class="cx">     };
</span><del>-    auto failureCallback = [promiseWrapper]() mutable {
-        promiseWrapper.reject(nullptr);
</del><ins>+    auto failureCallback = [wrapper]() mutable {
+        wrapper.reject(nullptr);
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     ExceptionCode ec = 0;
</span><span class="lines">@@ -281,7 +279,7 @@
</span><span class="cx">         return jsUndefined();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return promise;
</del><ins>+    return wrapper.promise();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> JSValue JSSubtleCrypto::verify(ExecState* exec)
</span><span class="lines">@@ -323,13 +321,12 @@
</span><span class="cx">         return jsUndefined();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    JSPromise* promise = JSPromise::createWithResolver(exec-&gt;vm(), globalObject());
-    PromiseWrapper promiseWrapper(globalObject(), promise);
-    auto successCallback = [promiseWrapper](bool result) mutable {
-        promiseWrapper.fulfill(result);
</del><ins>+    DeferredWrapper wrapper(exec, globalObject());
+    auto successCallback = [wrapper](bool result) mutable {
+        wrapper.resolve(result);
</ins><span class="cx">     };
</span><del>-    auto failureCallback = [promiseWrapper]() mutable {
-        promiseWrapper.reject(nullptr);
</del><ins>+    auto failureCallback = [wrapper]() mutable {
+        wrapper.reject(nullptr);
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     ExceptionCode ec = 0;
</span><span class="lines">@@ -339,7 +336,7 @@
</span><span class="cx">         return jsUndefined();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return promise;
</del><ins>+    return wrapper.promise();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> JSValue JSSubtleCrypto::digest(ExecState* exec)
</span><span class="lines">@@ -365,13 +362,12 @@
</span><span class="cx">         return jsUndefined();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    JSPromise* promise = JSPromise::createWithResolver(exec-&gt;vm(), globalObject());
-    PromiseWrapper promiseWrapper(globalObject(), promise);
-    auto successCallback = [promiseWrapper](const Vector&lt;uint8_t&gt;&amp; result) mutable {
-        promiseWrapper.fulfill(result);
</del><ins>+    DeferredWrapper wrapper(exec, globalObject());
+    auto successCallback = [wrapper](const Vector&lt;uint8_t&gt;&amp; result) mutable {
+        wrapper.resolve(result);
</ins><span class="cx">     };
</span><del>-    auto failureCallback = [promiseWrapper]() mutable {
-        promiseWrapper.reject(nullptr);
</del><ins>+    auto failureCallback = [wrapper]() mutable {
+        wrapper.reject(nullptr);
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     ExceptionCode ec = 0;
</span><span class="lines">@@ -381,7 +377,7 @@
</span><span class="cx">         return jsUndefined();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return promise;
</del><ins>+    return wrapper.promise();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> JSValue JSSubtleCrypto::generateKey(ExecState* exec)
</span><span class="lines">@@ -416,18 +412,17 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    JSPromise* promise = JSPromise::createWithResolver(exec-&gt;vm(), globalObject());
-    PromiseWrapper promiseWrapper(globalObject(), promise);
-    auto successCallback = [promiseWrapper](CryptoKey* key, CryptoKeyPair* keyPair) mutable {
</del><ins>+    DeferredWrapper wrapper(exec, globalObject());
+    auto successCallback = [wrapper](CryptoKey* key, CryptoKeyPair* keyPair) mutable {
</ins><span class="cx">         ASSERT(key || keyPair);
</span><span class="cx">         ASSERT(!key || !keyPair);
</span><span class="cx">         if (key)
</span><del>-            promiseWrapper.fulfill(key);
</del><ins>+            wrapper.resolve(key);
</ins><span class="cx">         else
</span><del>-            promiseWrapper.fulfill(keyPair);
</del><ins>+            wrapper.resolve(keyPair);
</ins><span class="cx">     };
</span><del>-    auto failureCallback = [promiseWrapper]() mutable {
-        promiseWrapper.reject(nullptr);
</del><ins>+    auto failureCallback = [wrapper]() mutable {
+        wrapper.reject(nullptr);
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     ExceptionCode ec = 0;
</span><span class="lines">@@ -437,7 +432,7 @@
</span><span class="cx">         return jsUndefined();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return promise;
</del><ins>+    return wrapper.promise();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static void importKey(ExecState* exec, CryptoKeyFormat keyFormat, CryptoOperationData data, CryptoAlgorithm* algorithmPtr, CryptoAlgorithmParameters* parametersPtr, bool extractable, CryptoKeyUsage keyUsages, CryptoAlgorithm::KeyCallback callback, CryptoAlgorithm::VoidCallback failureCallback)
</span><span class="lines">@@ -547,20 +542,19 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    JSPromise* promise = JSPromise::createWithResolver(exec-&gt;vm(), globalObject());
-    PromiseWrapper promiseWrapper(globalObject(), promise);
-    auto successCallback = [promiseWrapper](CryptoKey&amp; result) mutable {
-        promiseWrapper.fulfill(&amp;result);
</del><ins>+    DeferredWrapper wrapper(exec, globalObject());
+    auto successCallback = [wrapper](CryptoKey&amp; result) mutable {
+        wrapper.resolve(&amp;result);
</ins><span class="cx">     };
</span><del>-    auto failureCallback = [promiseWrapper]() mutable {
-        promiseWrapper.reject(nullptr);
</del><ins>+    auto failureCallback = [wrapper]() mutable {
+        wrapper.reject(nullptr);
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     WebCore::importKey(exec, keyFormat, data, algorithm.release(), parameters.release(), extractable, keyUsages, std::move(successCallback), std::move(failureCallback));
</span><span class="cx">     if (exec-&gt;hadException())
</span><span class="cx">         return jsUndefined();
</span><span class="cx"> 
</span><del>-    return promise;
</del><ins>+    return wrapper.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">@@ -610,21 +604,19 @@
</span><span class="cx">     if (!key)
</span><span class="cx">         return throwTypeError(exec);
</span><span class="cx"> 
</span><del>-    JSPromise* promise = JSPromise::createWithResolver(exec-&gt;vm(), globalObject());
-    PromiseWrapper promiseWrapper(globalObject(), promise);
-
-    auto successCallback = [promiseWrapper](const Vector&lt;uint8_t&gt;&amp; result) mutable {
-        promiseWrapper.fulfill(result);
</del><ins>+    DeferredWrapper wrapper(exec, globalObject());
+    auto successCallback = [wrapper](const Vector&lt;uint8_t&gt;&amp; result) mutable {
+        wrapper.resolve(result);
</ins><span class="cx">     };
</span><del>-    auto failureCallback = [promiseWrapper]() mutable {
-        promiseWrapper.reject(nullptr);
</del><ins>+    auto failureCallback = [wrapper]() mutable {
+        wrapper.reject(nullptr);
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     WebCore::exportKey(exec, keyFormat, *key, std::move(successCallback), std::move(failureCallback));
</span><span class="cx">     if (exec-&gt;hadException())
</span><span class="cx">         return jsUndefined();
</span><span class="cx"> 
</span><del>-    return promise;
</del><ins>+    return wrapper.promise();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> JSValue JSSubtleCrypto::wrapKey(ExecState* exec)
</span><span class="lines">@@ -664,18 +656,17 @@
</span><span class="cx">         return jsUndefined();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    JSPromise* promise = JSPromise::createWithResolver(exec-&gt;vm(), globalObject());
-    PromiseWrapper promiseWrapper(globalObject(), promise);
</del><ins>+    DeferredWrapper wrapper(exec, globalObject());
</ins><span class="cx"> 
</span><span class="cx">     CryptoAlgorithm* algorithmPtr = algorithm.release();
</span><span class="cx">     CryptoAlgorithmParameters* parametersPtr = parameters.release();
</span><span class="cx"> 
</span><del>-    auto exportSuccessCallback = [keyFormat, algorithmPtr, parametersPtr, wrappingKey, promiseWrapper](const Vector&lt;uint8_t&gt;&amp; exportedKeyData) mutable {
-        auto encryptSuccessCallback = [promiseWrapper](const Vector&lt;uint8_t&gt;&amp; encryptedData) mutable {
-            promiseWrapper.fulfill(encryptedData);
</del><ins>+    auto exportSuccessCallback = [keyFormat, algorithmPtr, parametersPtr, wrappingKey, wrapper](const Vector&lt;uint8_t&gt;&amp; exportedKeyData) mutable {
+        auto encryptSuccessCallback = [wrapper](const Vector&lt;uint8_t&gt;&amp; encryptedData) mutable {
+            wrapper.resolve(encryptedData);
</ins><span class="cx">         };
</span><del>-        auto encryptFailureCallback = [promiseWrapper]() mutable {
-            promiseWrapper.reject(nullptr);
</del><ins>+        auto encryptFailureCallback = [wrapper]() mutable {
+            wrapper.reject(nullptr);
</ins><span class="cx">         };
</span><span class="cx">         ExceptionCode ec = 0;
</span><span class="cx">         algorithmPtr-&gt;encryptForWrapKey(*parametersPtr, *wrappingKey, std::make_pair(exportedKeyData.data(), exportedKeyData.size()), std::move(encryptSuccessCallback), std::move(encryptFailureCallback), ec);
</span><span class="lines">@@ -685,10 +676,10 @@
</span><span class="cx">         }
</span><span class="cx">     };
</span><span class="cx"> 
</span><del>-    auto exportFailureCallback = [promiseWrapper, algorithmPtr, parametersPtr]() mutable {
</del><ins>+    auto exportFailureCallback = [wrapper, algorithmPtr, parametersPtr]() mutable {
</ins><span class="cx">         delete algorithmPtr;
</span><span class="cx">         delete parametersPtr;
</span><del>-        promiseWrapper.reject(nullptr);
</del><ins>+        wrapper.reject(nullptr);
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     ExceptionCode ec = 0;
</span><span class="lines">@@ -698,7 +689,7 @@
</span><span class="cx">         return jsUndefined();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return promise;
</del><ins>+    return wrapper.promise();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> JSValue JSSubtleCrypto::unwrapKey(ExecState* exec)
</span><span class="lines">@@ -771,19 +762,18 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    JSPromise* promise = JSPromise::createWithResolver(exec-&gt;vm(), globalObject());
-    PromiseWrapper promiseWrapper(globalObject(), promise);
</del><ins>+    DeferredWrapper wrapper(exec, globalObject());
</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="cx">     CryptoAlgorithmParameters* unwrappedKeyAlgorithmParametersPtr = unwrappedKeyAlgorithmParameters.release();
</span><span class="cx"> 
</span><del>-    auto decryptSuccessCallback = [domGlobalObject, keyFormat, unwrappedKeyAlgorithmPtr, unwrappedKeyAlgorithmParametersPtr, extractable, keyUsages, promiseWrapper](const Vector&lt;uint8_t&gt;&amp; result) mutable {
-        auto importSuccessCallback = [promiseWrapper](CryptoKey&amp; key) mutable {
-            promiseWrapper.fulfill(&amp;key);
</del><ins>+    auto decryptSuccessCallback = [domGlobalObject, keyFormat, unwrappedKeyAlgorithmPtr, unwrappedKeyAlgorithmParametersPtr, extractable, keyUsages, wrapper](const Vector&lt;uint8_t&gt;&amp; result) mutable {
+        auto importSuccessCallback = [wrapper](CryptoKey&amp; key) mutable {
+            wrapper.resolve(&amp;key);
</ins><span class="cx">         };
</span><del>-        auto importFailureCallback = [promiseWrapper]() mutable {
-            promiseWrapper.reject(nullptr);
</del><ins>+        auto importFailureCallback = [wrapper]() mutable {
+            wrapper.reject(nullptr);
</ins><span class="cx">         };
</span><span class="cx">         ExecState* exec = domGlobalObject-&gt;globalExec();
</span><span class="cx">         WebCore::importKey(exec, keyFormat, std::make_pair(result.data(), result.size()), unwrappedKeyAlgorithmPtr, unwrappedKeyAlgorithmParametersPtr, extractable, keyUsages, std::move(importSuccessCallback), std::move(importFailureCallback));
</span><span class="lines">@@ -794,10 +784,10 @@
</span><span class="cx">         }
</span><span class="cx">     };
</span><span class="cx"> 
</span><del>-    auto decryptFailureCallback = [promiseWrapper, unwrappedKeyAlgorithmPtr, unwrappedKeyAlgorithmParametersPtr]() mutable {
</del><ins>+    auto decryptFailureCallback = [wrapper, unwrappedKeyAlgorithmPtr, unwrappedKeyAlgorithmParametersPtr]() mutable {
</ins><span class="cx">         delete unwrappedKeyAlgorithmPtr;
</span><span class="cx">         delete unwrappedKeyAlgorithmParametersPtr;
</span><del>-        promiseWrapper.reject(nullptr);
</del><ins>+        wrapper.reject(nullptr);
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     ExceptionCode ec = 0;
</span><span class="lines">@@ -807,7 +797,7 @@
</span><span class="cx">         return jsUndefined();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return promise;
</del><ins>+    return wrapper.promise();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSWorkerGlobalScopeBasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSWorkerGlobalScopeBase.cpp (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSWorkerGlobalScopeBase.cpp        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/WebCore/bindings/js/JSWorkerGlobalScopeBase.cpp        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -34,6 +34,7 @@
</span><span class="cx"> #include &quot;JSDedicatedWorkerGlobalScope.h&quot;
</span><span class="cx"> #include &quot;JSWorkerGlobalScope.h&quot;
</span><span class="cx"> #include &quot;WorkerGlobalScope.h&quot;
</span><ins>+#include &lt;runtime/Microtask.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(SHARED_WORKERS)
</span><span class="cx"> #include &quot;JSSharedWorkerGlobalScope.h&quot;
</span><span class="lines">@@ -99,10 +100,10 @@
</span><span class="cx">     return JSGlobalObject::javaScriptExperimentsEnabled(object);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void JSWorkerGlobalScopeBase::queueTaskToEventLoop(const JSGlobalObject* object, GlobalObjectMethodTable::QueueTaskToEventLoopCallbackFunctionPtr functionPtr, PassRefPtr&lt;TaskContext&gt; taskContext)
</del><ins>+void JSWorkerGlobalScopeBase::queueTaskToEventLoop(const JSGlobalObject* object, PassRefPtr&lt;Microtask&gt; task)
</ins><span class="cx"> {
</span><span class="cx">     const JSWorkerGlobalScopeBase* thisObject = static_cast&lt;const JSWorkerGlobalScopeBase*&gt;(object);
</span><del>-    thisObject-&gt;scriptExecutionContext()-&gt;postTask(JSGlobalObjectTask::create((JSDOMGlobalObject*)thisObject, functionPtr, taskContext));
</del><ins>+    thisObject-&gt;scriptExecutionContext()-&gt;postTask(JSGlobalObjectTask::create((JSDOMGlobalObject*)thisObject, task));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> JSValue toJS(ExecState* exec, JSDOMGlobalObject*, WorkerGlobalScope* workerGlobalScope)
</span></span></pre></div>
<a id="trunkSourceWebCorebindingsjsJSWorkerGlobalScopeBaseh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/bindings/js/JSWorkerGlobalScopeBase.h (161240 => 161241)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/bindings/js/JSWorkerGlobalScopeBase.h        2014-01-03 00:24:14 UTC (rev 161240)
+++ trunk/Source/WebCore/bindings/js/JSWorkerGlobalScopeBase.h        2014-01-03 00:40:16 UTC (rev 161241)
</span><span class="lines">@@ -59,7 +59,7 @@
</span><span class="cx">         static bool shouldInterruptScript(const JSC::JSGlobalObject*);
</span><span class="cx">         static bool shouldInterruptScriptBeforeTimeout(const JSC::JSGlobalObject*);
</span><span class="cx">         static bool javaScriptExperimentsEnabled(const JSC::JSGlobalObject*);
</span><del>-        static void queueTaskToEventLoop(const JSC::JSGlobalObject*, JSC::GlobalObjectMethodTable::QueueTaskToEventLoopCallbackFunctionPtr, PassRefPtr&lt;JSC::TaskContext&gt;);
</del><ins>+        static void queueTaskToEventLoop(const JSC::JSGlobalObject*, PassRefPtr&lt;JSC::Microtask&gt;);
</ins><span class="cx"> 
</span><span class="cx">     protected:
</span><span class="cx">         JSWorkerGlobalScopeBase(JSC::VM&amp;, JSC::Structure*, PassRefPtr&lt;WorkerGlobalScope&gt;);
</span></span></pre>
</div>
</div>

</body>
</html>