<!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<String>):
(WebCore::DeferredWrapper::resolve<bool>):
(WebCore::char>>):
(WebCore::DeferredWrapper::reject<String>):
* 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 <sam@webkit.org>
+
+ 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 <mmaxfield@apple.com>
</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("\nPassing algorithm name as a string object...");
</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 < 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("SHA1 of []");
</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("SHA224 of []");
</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("SHA256 of []");
</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("SHA384 of []");
</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("SHA512 of []");
</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 "PASS" messages, followed by "TEST COMPLETE".
-
-PASS result is "foo"
-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>-<!DOCTYPE html>
-<html>
-<head>
-<script src="../../resources/js-test-pre.js"></script>
-</head>
-<body>
-<div id="description"></div>
-<div id="console"></div>
-<script>
-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();
-});
-
-</script>
-<script src="../../resources/js-test-post.js"></script>
-</body>
-</html>
</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 "PASS" messages, followed by "TEST COMPLETE".
</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 "hello"
</span><span class="cx"> PASS result is "bye"
</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 "PASS" messages, followed by "TEST COMPLETE".
</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 "hello"
</span><span class="cx"> PASS [Worker] result is "bye"
</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)', '"TypeError: Expected function or undefined as as first argument"');
-shouldThrow('firstPromise.catch(37)', '"TypeError: Expected function or undefined as as first argument"');
-
-resolver.reject('hello');
</del><ins>+reject('hello');
</ins><span class="cx"> </script>
</span><span class="cx"> <script src="../../resources/js-test-post.js"></script>
</span><span class="cx"> </body>
</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 "PASS" messages, followed by "TEST COMPLETE".
</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 "foobar"
</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 "PASS" messages, followed by "TEST COMPLETE".
-
-PASS promiseState is "pending"
-PASS promiseState is "pending"
-PASS promiseState is "fulfilled"
-PASS promiseResult is "hello"
-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 "PASS" messages, followed by "TEST COMPLETE".
-
-Starting worker: ../resources/Promise-fulfill-in-workers.js
-PASS [Worker] promiseState is "pending"
-PASS [Worker] promiseState is "pending"
-PASS [Worker] promiseState is "fulfilled"
-PASS [Worker] promiseResult is "hello"
-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>-<!DOCTYPE html>
-<html>
-<head>
-<script src="../../resources/js-test-pre.js"></script>
-</head>
-<body>
-<div id="description"></div>
-<div id="console"></div>
-<script>
-worker = startWorker('../resources/Promise-fulfill-in-workers.js');
-</script>
-<script src="../../resources/js-test-post.js"></script>
-</body>
-</html>
</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>-<!DOCTYPE html>
-<html>
-<head>
-<script src="../../resources/js-test-pre.js"></script>
-</head>
-<body>
-<div id="description"></div>
-<div id="console"></div>
-<script>
-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();
-});
-
-</script>
-<script src="../../resources/js-test-post.js"></script>
-</body>
-</html>
</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 "PASS" messages, followed by "TEST COMPLETE".
+
+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>+<!DOCTYPE html>
+<html>
+<head>
+<script src="../../resources/js-test-pre.js"></script>
+</head>
+<body>
+<div id="description"></div>
+<div id="console"></div>
+<script>
+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');
+});
+
+</script>
+<script src="../../resources/js-test-post.js"></script>
+</body>
+</html>
</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("foo"); }) did not throw exception.
</span><span class="cx"> PASS result.message is "foo"
</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("foo"); }) did not throw exception.
</span><span class="cx"> PASS [Worker] result.message is "foo"
</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()', '"TypeError: Expected at least one argument"');
-shouldThrow('new Promise(37)', '"TypeError: Expected function as as first argument"');
</del><ins>+shouldThrow('new Promise()', '"TypeError: Promise constructor takes a function argument"');
+shouldThrow('new Promise(37)', '"TypeError: Promise constructor takes a function argument"');
</ins><span class="cx">
</span><span class="cx"> shouldNotThrow('promise = new Promise(function() { throw Error("foo"); })');
</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("hello");
</del><ins>+new Promise(function(resolve) {
+ resolve("hello");
</ins><span class="cx"> throw Error("foo");
</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 "PASS" messages, followed by "TEST COMPLETE".
+
+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>+<!DOCTYPE html>
+<html>
+<head>
+<script src="../../resources/js-test-pre.js"></script>
+</head>
+<body>
+<div id="description"></div>
+<div id="console"></div>
+<script>
+description('Test Promise.');
+
+window.jsTestIsAsync = true;
+
+var result;
+var resolve;
+var promise = new Promise(function (r) { resolve = r; });
+
+for (var i = 0; i < 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);
+
+</script>
+<script src="../../resources/js-test-post.js"></script>
+</body>
+</html>
</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 "PASS" messages, followed by "TEST COMPLETE".
+
+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>+<!DOCTYPE html>
+<html>
+<head>
+<script src="../../resources/js-test-pre.js"></script>
+</head>
+<body>
+<div id="description"></div>
+<div id="console"></div>
+<script>
+description('Test Promise.');
+
+window.jsTestIsAsync = true;
+
+var result;
+var reject;
+var promise = new Promise(function (_, r) { reject = r; });
+
+for (var i = 0; i < 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);
+
+</script>
+<script src="../../resources/js-test-post.js"></script>
+</body>
+</html>
</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"> </script>
</span><span class="cx"> <script src="../../resources/js-test-post.js"></script>
</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 "PASS" messages, followed by "TEST COMPLETE".
</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 "hello"
</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 "PASS" messages, followed by "TEST COMPLETE".
</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 "hello"
</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 "PASS" messages, followed by "TEST COMPLETE".
+
+PASS promiseState is "pending"
+PASS promiseState is "pending"
+PASS promiseState is "fulfilled"
+PASS promiseResult is "hello"
+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 "PASS" messages, followed by "TEST COMPLETE".
+
+Starting worker: ../resources/Promise-resolve-state-in-workers.js
+PASS [Worker] promiseState is "pending"
+PASS [Worker] promiseState is "pending"
+PASS [Worker] promiseState is "fulfilled"
+PASS [Worker] promiseResult is "hello"
+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>+<!DOCTYPE html>
+<html>
+<head>
+<script src="../../resources/js-test-pre.js"></script>
+</head>
+<body>
+<div id="description"></div>
+<div id="console"></div>
+<script>
+worker = startWorker('../resources/Promise-resolve-state-in-workers.js');
+</script>
+<script src="../../resources/js-test-post.js"></script>
+</body>
+</html>
</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>+<!DOCTYPE html>
+<html>
+<head>
+<script src="../../resources/js-test-pre.js"></script>
+</head>
+<body>
+<div id="description"></div>
+<div id="console"></div>
+<script>
+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();
+});
+
+</script>
+<script src="../../resources/js-test-post.js"></script>
+</body>
+</html>
</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 "PASS" messages, followed by "TEST COMPLETE".
+
+PASS rejected
+PASS result is "TypeError: Resolve a promise with itself"
+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>+<!DOCTYPE html>
+<html>
+<head>
+<script src="../../resources/js-test-pre.js"></script>
+</head>
+<body>
+<div id="description"></div>
+<div id="console"></div>
+<script>
+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);
+
+</script>
+<script src="../../resources/js-test-post.js"></script>
+</body>
+</html>
</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 "PASS" messages, followed by "TEST COMPLETE".
</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 "hello"
</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"> </script>
</span><span class="cx"> <script src="../../resources/js-test-post.js"></script>
</span><span class="cx"> </body>
</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 "PASS" messages, followed by "TEST COMPLETE".
</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 "hello"
</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"> </script>
</span><span class="cx"> <script src="../../resources/js-test-post.js"></script>
</span><span class="cx"> </body>
</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 "PASS" messages, followed by "TEST COMPLETE".
</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 "hello"
</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 "PASS" messages, followed by "TEST COMPLETE".
-
-PASS result is "hello"
-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 "PASS" messages, followed by "TEST COMPLETE".
-
-PASS result is "hello"
-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>-<!DOCTYPE html>
-<html>
-<head>
-<script src="../../resources/js-test-pre.js"></script>
-</head>
-<body>
-<div id="description"></div>
-<div id="console"></div>
-<script>
-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();
-});
-
-</script>
-<script src="../../resources/js-test-post.js"></script>
-</body>
-</html>
</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>-<!DOCTYPE html>
-<html>
-<head>
-<script src="../../resources/js-test-pre.js"></script>
-</head>
-<body>
-<div id="description"></div>
-<div id="console"></div>
-<script>
-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();
-});
-
-</script>
-<script src="../../resources/js-test-post.js"></script>
-</body>
-</html>
</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 "PASS" messages, followed by "TEST COMPLETE".
</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 "hello"
</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 "PASS" messages, followed by "TEST COMPLETE".
+
+PASS result is "hello"
+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>+<!DOCTYPE html>
+<html>
+<head>
+<script src="../../resources/js-test-pre.js"></script>
+</head>
+<body>
+<div id="description"></div>
+<div id="console"></div>
+<script>
+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();
+});
+
+</script>
+<script src="../../resources/js-test-post.js"></script>
+</body>
+</html>
</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"> </script>
</span><span class="cx"> <script src="../../resources/js-test-post.js"></script>
</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 "PASS" messages, followed by "TEST COMPLETE".
+
+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>+<!DOCTYPE html>
+<html>
+<head>
+<script src="../../resources/js-test-pre.js"></script>
+</head>
+<body>
+<div id="description"></div>
+<div id="console"></div>
+<script>
+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');
+*/
+
+</script>
+<script src="../../resources/js-test-post.js"></script>
+</body>
+</html>
</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 "PASS" messages, followed by "TEST COMPLETE".
+
+PASS promise === value is true
+PASS result is undefined
+PASS result2 is undefined
+PASS result is "hello"
+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>+<!DOCTYPE html>
+<html>
+<head>
+<script src="../../resources/js-test-pre.js"></script>
+</head>
+<body>
+<div id="description"></div>
+<div id="console"></div>
+<script>
+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');
+</script>
+<script src="../../resources/js-test-post.js"></script>
+</body>
+</html>
</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 "PASS" messages, followed by "TEST COMPLETE".
-
-PASS result is undefined
-PASS result is "hello"
-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>-<!DOCTYPE html>
-<html>
-<head>
-<script src="../../resources/js-test-pre.js"></script>
-</head>
-<body>
-<div id="description"></div>
-<div id="console"></div>
-<script>
-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');
-</script>
-<script src="../../resources/js-test-post.js"></script>
-</body>
-</html>
</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 "PASS" messages, followed by "TEST COMPLETE".
+
+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>+<!DOCTYPE html>
+<html>
+<head>
+<script src="../../resources/js-test-pre.js"></script>
+</head>
+<body>
+<div id="description"></div>
+<div id="console"></div>
+<script>
+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');
+*/
+</script>
+<script src="../../resources/js-test-post.js"></script>
+</body>
+</html>
</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"> </script>
</span><span class="cx"> <script src="../../resources/js-test-post.js"></script>
</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 "PASS" messages, followed by "TEST COMPLETE".
+
+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>+<!DOCTYPE html>
+<html>
+<head>
+<script src="../../resources/js-test-pre.js"></script>
+</head>
+<body>
+<div id="description"></div>
+<div id="console"></div>
+<script>
+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);
+
+</script>
+<script src="../../resources/js-test-post.js"></script>
+</body>
+</html>
</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 "PASS" messages, followed by "TEST COMPLETE".
</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 "hello"
</span><ins>+PASS result is "world"
+PASS rejected
+PASS result is "exception"
+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 "PASS" messages, followed by "TEST COMPLETE".
</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 "hello"
</span><ins>+PASS [Worker] result is "world"
+PASS [Worker] rejected
+PASS [Worker] result is "exception"
+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)', '"TypeError: Expected function or undefined as as first argument"');
-shouldThrow('firstPromise.then(undefined, null)', '"TypeError: Expected function or undefined as as second argument"');
-shouldThrow('firstPromise.then(37)', '"TypeError: Expected function or undefined as as first argument"');
</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"> </script>
</span><span class="cx"> <script src="../../resources/js-test-post.js"></script>
</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("aPromise.then");
</span><span class="cx"> shouldBeType("aPromise.then", "Function");
</span><del>-shouldBe("aPromise.then.length", "0");
</del><ins>+shouldBe("aPromise.then.length", "2");
</ins><span class="cx"> shouldBeDefined("aPromise.catch");
</span><span class="cx"> shouldBeType("aPromise.catch", "Function");
</span><del>-shouldBe("aPromise.catch.length", "0");
</del><ins>+shouldBe("aPromise.catch.length", "1");
</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("new Promise()");
</span><span class="cx">
</span><span class="cx"> // Parameter must be a function.
</span><del>-shouldThrow("new Promise(1)", "'TypeError: Expected function as as first argument'");
-shouldThrow("new Promise('hello')", "'TypeError: Expected function as as first argument'");
-shouldThrow("new Promise([])", "'TypeError: Expected function as as first argument'");
-shouldThrow("new Promise({})", "'TypeError: Expected function as as first argument'");
-shouldThrow("new Promise(null)", "'TypeError: Expected function as as first argument'");
-shouldThrow("new Promise(undefined)", "'TypeError: Expected function as as first argument'");
-shouldNotThrow("new Promise(function(resolver) { resolver.resolve(1); })");
</del><ins>+shouldThrow("new Promise(1)", "'TypeError: Promise constructor takes a function argument'");
+shouldThrow("new Promise('hello')", "'TypeError: Promise constructor takes a function argument'");
+shouldThrow("new Promise([])", "'TypeError: Promise constructor takes a function argument'");
+shouldThrow("new Promise({})", "'TypeError: Promise constructor takes a function argument'");
+shouldThrow("new Promise(null)", "'TypeError: Promise constructor takes a function argument'");
+shouldThrow("new Promise(undefined)", "'TypeError: Promise constructor takes a function argument'");
</ins><span class="cx">
</span><del>-// Can't be called as a function
-shouldThrow("Promise()");
-
-
</del><span class="cx"> // Promise statics
</span><span class="cx"> debug("");
</span><span class="cx"> debug("Promise statics");
</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("Promise.fulfill", "Function");
-shouldBe("Promise.fulfill.length", "1");
-shouldThrow("Promise.fulfill()", "'TypeError: Expected at least one argument'");
-shouldNotThrow("Promise.fulfill(1)");
-
</del><span class="cx"> shouldBeType("Promise.resolve", "Function");
</span><span class="cx"> shouldBe("Promise.resolve.length", "1");
</span><del>-shouldThrow("Promise.resolve()", "'TypeError: Expected at least one argument'");
</del><span class="cx"> shouldNotThrow("Promise.resolve(1)");
</span><span class="cx">
</span><span class="cx"> shouldBeType("Promise.reject", "Function");
</span><span class="cx"> shouldBe("Promise.reject.length", "1");
</span><del>-shouldThrow("Promise.reject()", "'TypeError: Expected at least one argument'");
</del><span class="cx"> shouldNotThrow("Promise.reject(1)");
</span><span class="cx">
</span><ins>+shouldBeType("Promise.cast", "Function");
+shouldBe("Promise.cast.length", "1");
+shouldNotThrow("Promise.cast(1)");
+
</ins><span class="cx"> // Should return Promise objects.
</span><del>-shouldBeType("Promise.fulfill(1)", "Promise");
</del><span class="cx"> shouldBeType("Promise.resolve(1)", "Promise");
</span><span class="cx"> shouldBeType("Promise.reject(1)", "Promise");
</span><ins>+shouldBeType("Promise.cast(1)", "Promise");
</ins><span class="cx">
</span><del>-
-
-// PromiseResolver
-debug("");
-debug("PromiseResolver");
-debug("");
-
-var aResolver;
-var resolverFulfill;
-var resolverResolve;
-var resolverReject;
-
-new Promise(function(r) {
- aResolver = r;
-
- // The resolver should be of type PromiseResolver.
- debug("aResolver is from new Promise(function(aResolver) { ... })")
- shouldBeType("aResolver", "PromiseResolver");
- shouldBe("String(aResolver)", "'[object PromiseResolver]'");
- shouldBeType("aResolver.fulfill", "Function");
- shouldBe("aResolver.fulfill.length", "1");
- shouldBeType("aResolver.resolve", "Function");
- shouldBe("aResolver.resolve.length", "1");
- shouldBeType("aResolver.reject", "Function");
- shouldBe("aResolver.reject.length", "1");
-
- // Resolvers functions must be called on the resolver.
- resolverFulfill = aResolver.fulfill;
- shouldThrow("resolverFulfill()", "'TypeError: Receiver of fulfill must be a PromiseResolver'");
- resolverResolve = aResolver.resolve;
- shouldThrow("resolverResolve()", "'TypeError: Receiver of resolve must be a PromiseResolver'");
- resolverReject = aResolver.reject;
- shouldThrow("resolverReject()", "'TypeError: Receiver of reject must be a PromiseResolver'");
-});
-
-debug("");
-debug("PromiseResolver constructor");
-debug("");
-
-shouldThrow("new PromiseResolver()");
-
-debug("");
</del><span class="cx"> </script>
</span><span class="cx"> <script src="../../resources/js-test-post.js"></script>
</span><span class="cx"> </body>
</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) + " is " + stringify(_b));
- else
- testFailed(stringify(_a) + " should be " + 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) + " is " + stringify(_b));
+ else
+ testFailed(stringify(_a) + " should be " + stringify(_b));
+}
+
+function isnot(_a, _b, _msg) {
+ if (!isResultCorrect(_a, _b))
+ testPassed(stringify(_a) + " should not be " + stringify(_b));
+ else
+ testFailed(stringify(_a) + " is " + stringify(_b));
+}
+
</ins><span class="cx"> function promiseResolve() {
</span><del>- debug("Test Promise resolve.")
-
- var promise = new Promise(function(resolver) {
- resolver.resolve(42);
</del><ins>+ ok(Promise, "Promise object should exist");
+
+ var promise = new Promise(function(resolve, reject) {
+ ok(resolve, "Promise.resolve exists");
+ ok(reject, "Promise.reject exists");
+
+ resolve(42);
</ins><span class="cx"> }).then(function(what) {
</span><del>- testPassed("Then.resolve has been called");
- test(what, 42);
</del><ins>+ ok(true, "Then - resolveCb has been called");
+ is(what, 42, "ResolveCb received 42");
</ins><span class="cx"> runTest();
</span><span class="cx"> }, function() {
</span><del>- testFailed("Then.reject has been called");
</del><ins>+ ok(false, "Then - rejectCb has been called");
</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, "Promise.resolve exists");
+ ok(reject, "Promise.reject exists");
+
+ resolve();
+ }).then(function(what) {
+ ok(true, "Then - resolveCb has been called");
+ is(what, undefined, "ResolveCb received undefined");
+ runTest();
+ }, function() {
+ ok(false, "Then - rejectCb has been called");
+ runTest();
+ });
+}
+
</ins><span class="cx"> function promiseReject() {
</span><del>- debug("Test Promise reject.");
-
- 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("Then.resolve has been called");
</del><ins>+ ok(false, "Then - resolveCb has been called");
</ins><span class="cx"> runTest();
</span><span class="cx"> }, function(what) {
</span><del>- testPassed("Then.reject has been called");
- test(what, 42);
</del><ins>+ ok(true, "Then - rejectCb has been called");
+ is(what, 42, "RejectCb received 42");
</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, "Then - resolveCb has been called");
+ runTest();
+ }, function(what) {
+ ok(true, "Then - rejectCb has been called");
+ is(what, undefined, "RejectCb received undefined");
+ runTest();
+ });
+}
+
</ins><span class="cx"> function promiseException() {
</span><del>- debug("Test Promise reject.");
-
- 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("Then.resolve has been called");
</del><ins>+ ok(false, "Then - resolveCb has been called");
</ins><span class="cx"> runTest();
</span><span class="cx"> }, function(what) {
</span><del>- testPassed("Then.reject has been called");
- test(what, 42);
</del><ins>+ ok(true, "Then - rejectCb has been called");
+ is(what, 42, "RejectCb received 42");
</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("Test Promise gc.");
-
- 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("Then - promise is still alive");
</del><ins>+ ok(true, "Then - promise is still alive");
</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("Test Promise async.");
-
</del><span class="cx"> var global = "foo";
</span><del>- var f = new Promise(function(r) {
- debug("Global should be foo");
- test(global, 'foo');
-
- r.resolve(42);
-
- debug("Global should still be foo");
- test(global, 'foo');
-
</del><ins>+ var f = new Promise(function(r1, r2) {
+ is(global, "foo", "Global should be foo");
+ r1(42);
+ is(global, "foo", "Global should still be foo");
</ins><span class="cx"> setTimeout(function() {
</span><del>- debug("Global should be bar");
- test(global, 'bar');
</del><ins>+ is(global, "bar", "Global should still be bar!");
</ins><span class="cx"> runTest();
</span><span class="cx"> }, 0);
</span><span class="cx"> }).then(function() {
</span><span class="cx"> global = "bar";
</span><span class="cx"> });
</span><del>-
- debug("Global should still be foo (2)");
- test(global, 'foo');
</del><ins>+ is(global, "foo", "Global should still be foo (2)");
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> function promiseDoubleThen() {
</span><del>- debug("Test Promise double then.");
-
</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("Then.resolve has been called");
- test(what, 42);
</del><ins>+ ok(true, "Then.resolve has been called");
+ is(what, 42, "Value == 42");
</ins><span class="cx"> steps++;
</span><span class="cx"> }, function(what) {
</span><del>- testFailed("Then.reject has been called");
</del><ins>+ ok(false, "Then.reject has been called");
</ins><span class="cx"> });
</span><span class="cx">
</span><span class="cx"> promise.then(function(what) {
</span><del>- testPassed("Then.resolve has been called");
- test(steps, 1);
- test(what, 42);
</del><ins>+ ok(true, "Then.resolve has been called");
+ is(steps, 1, "Then.resolve - step == 1");
+ is(what, 42, "Value == 42");
</ins><span class="cx"> runTest();
</span><span class="cx"> }, function(what) {
</span><del>- testFailed("Then.reject has been called");
</del><ins>+ ok(false, "Then.reject has been called");
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> function promiseThenException() {
</span><del>- debug("Test Promise - then / exception.");
-
- 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("Then.resolve has been called");
</del><ins>+ ok(true, "Then.resolve has been called");
</ins><span class="cx"> throw "booh";
</span><span class="cx"> }).catch(function(e) {
</span><del>- testPassed("Catch handler (e.g. the reject handler) called.");
</del><ins>+ ok(true, "window.onerror has been called!");
</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("Test Promise - then / catch / then.");
-
- 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("Then.resolve has been called");
- test(what, 42);
</del><ins>+ ok(true, "Then.resolve has been called");
+ is(what, 42, "Value == 42");
</ins><span class="cx"> return what + 1;
</span><span class="cx"> }, function(what) {
</span><del>- testFailed("Then.reject has been called");
</del><ins>+ ok(false, "Then.reject has been called");
</ins><span class="cx"> });
</span><span class="cx">
</span><ins>+ isnot(promise, promise2, "These 2 promise objs are different");
+
</ins><span class="cx"> promise2.then(function(what) {
</span><del>- testPassed("Then.resolve has been called");
- test(what, 43);
</del><ins>+ ok(true, "Then.resolve has been called");
+ is(what, 43, "Value == 43");
</ins><span class="cx"> return what + 1;
</span><span class="cx"> }, function(what) {
</span><del>- testFailed("Then.reject has been called");
</del><ins>+ ok(false, "Then.reject has been called");
</ins><span class="cx"> }).catch(function() {
</span><del>- testFailed("Catch has been called");
</del><ins>+ ok(false, "Catch has been called");
</ins><span class="cx"> }).then(function(what) {
</span><del>- testPassed("Then.resolve has been called");
- test(what, 44);
</del><ins>+ ok(true, "Then.resolve has been called");
+ is(what, 44, "Value == 44");
</ins><span class="cx"> runTest();
</span><span class="cx"> }, function(what) {
</span><del>- testFailed("Then.reject has been called");
</del><ins>+ ok(false, "Then.reject has been called");
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><del>-function promiseRejectThenCatchThen() {
- debug("Test Promise - reject / then / catch / then.");
</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, "These 2 promise objs are different");
+ promise.then(function(v) {
+ clone.then(function(cv) {
+ is(v, cv, "Both resolve to the same value");
+ 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, "Promise rejected with 42");
+ runTest();
+ });
+ } catch (e) {
+ ok(false, "then should not throw on undefined resolve function");
+ }
+}
+
+function promiseThenNullResolveFunction() {
+ var promise = new Promise(function(resolve, reject) {
+ reject(42);
+ });
+
+ try {
+ promise.then(null, function(v) {
+ is(v, 42, "Promise rejected with 42");
+ runTest();
+ });
+ } catch (e) {
+ ok(false, "then should not throw on null resolve function");
+ }
+}
+
+function promiseRejectThenCatchThen() {
+ var promise = new Promise(function(resolve, reject) {
+ reject(42);
+ });
+
</ins><span class="cx"> var promise2 = promise.then(function(what) {
</span><del>- testFailed("Then.resolve has been called");
</del><ins>+ ok(false, "Then.resolve has been called");
</ins><span class="cx"> }, function(what) {
</span><del>- testPassed("Then.reject has been called");
- test(what, 42);
</del><ins>+ ok(true, "Then.reject has been called");
+ is(what, 42, "Value == 42");
</ins><span class="cx"> return what + 1;
</span><span class="cx"> });
</span><span class="cx">
</span><ins>+ isnot(promise, promise2, "These 2 promise objs are different");
+
</ins><span class="cx"> promise2.then(function(what) {
</span><del>- testPassed("Then.resolve has been called");
- test(what, 43);
- return what + 1;
</del><ins>+ ok(true, "Then.resolve has been called");
+ is(what, 43, "Value == 43");
+ return what+1;
</ins><span class="cx"> }).catch(function(what) {
</span><del>- testFailed("Catch has been called");
</del><ins>+ ok(false, "Catch has been called");
</ins><span class="cx"> }).then(function(what) {
</span><del>- testPassed("Then.resolve has been called");
- test(what, 44);
</del><ins>+ ok(true, "Then.resolve has been called");
+ is(what, 44, "Value == 44");
</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("Test Promise - reject / then / catch / then (2).");
-
- 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("Then.resolve has been called");
- test(what, 42);
- return what + 1;
</del><ins>+ ok(true, "Then.resolve has been called");
+ is(what, 42, "Value == 42");
+ return what+1;
</ins><span class="cx"> }).catch(function(what) {
</span><del>- testPassed("Catch has been called");
- test(what, 42);
- return what + 1;
</del><ins>+ is(what, 42, "Value == 42");
+ ok(true, "Catch has been called");
+ return what+1;
</ins><span class="cx"> }).then(function(what) {
</span><del>- testPassed("Then.resolve has been called");
- test(what, 43);
</del><ins>+ ok(true, "Then.resolve has been called");
+ is(what, 43, "Value == 43");
</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("Test Promise - reject / then / catch exception / then.");
-
- 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("Then.resolve has been called");
</del><ins>+ ok(false, "Then.resolve has been called");
</ins><span class="cx"> }, function(what) {
</span><del>- testPassed("Then.reject has been called");
- test(what, 42);
</del><ins>+ ok(true, "Then.reject has been called");
+ is(what, 42, "Value == 42");
</ins><span class="cx"> throw(what + 1);
</span><span class="cx"> }).catch(function(what) {
</span><del>- testPassed("Catch has been called");
- test(what, 43);
</del><ins>+ ok(true, "Catch has been called");
+ is(what, 43, "Value == 43");
</ins><span class="cx"> return what + 1;
</span><span class="cx"> }).then(function(what) {
</span><del>- testPassed("Then.resolve has been called");
- test(what, 44);
</del><ins>+ ok(true, "Then.resolve has been called");
+ is(what, 44, "Value == 44");
</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("Test Promise - then / catch ordering (resolve).");
-
</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("Many steps... should return 2");
- test(global, 2);
</del><ins>+ is(global, 2, "Many steps... should return 2");
</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("Test Promise - then / catch ordering (reject).");
-
</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("Many steps... should return 2");
- test(global, 2);
</del><ins>+ is(global, 2, "Many steps... should return 2");
</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, "These 2 promise objs are different");
+ promise.catch(function(v) {
+ clone.catch(function(cv) {
+ is(v, cv, "Both reject to the same value");
+ runTest();
+ });
+ });
+}
+
</ins><span class="cx"> function promiseNestedPromise() {
</span><del>- debug("Test Promise - nested promise");
-
- new Promise(function(resolver) {
- resolver.resolve(new Promise(function(r) {
- testPassed("Nested promise is executed");
- r.resolve(42);
</del><ins>+ new Promise(function(resolve, reject) {
+ resolve(new Promise(function(resolve, reject) {
+ ok(true, "Nested promise is executed");
+ resolve(42);
</ins><span class="cx"> }));
</span><span class="cx"> }).then(function(value) {
</span><del>- testPassed("Then.resolve has been called");
- test(value, 42);
</del><ins>+ is(value, 42, "Nested promise is executed and then == 42");
</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("Test Promise - nested-nested promise.");
-
- new Promise(function(resolver) {
- resolver.resolve(new Promise(function(r) {
- testPassed("Nested promise is executed");
- r.resolve(42);
- }).then(function(what) { return what + 1; }));
</del><ins>+ new Promise(function(resolve, reject) {
+ resolve(new Promise(function(resolve, reject) {
+ ok(true, "Nested promise is executed");
+ resolve(42);
+ }).then(function(what) { return what+1; }));
</ins><span class="cx"> }).then(function(value) {
</span><del>- testPassed("Then.resolve has been called");
- test(value, 43);
</del><ins>+ is(value, 43, "Nested promise is executed and then == 43");
</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("Test Promise - wrong nested promise.");
-
- new Promise(function(resolver) {
- resolver.resolve(new Promise(function(r) {
- testPassed("Nested promise is executed");
- r.resolve(42);
</del><ins>+ new Promise(function(resolve, reject) {
+ resolve(new Promise(function(r, r2) {
+ ok(true, "Nested promise is executed");
+ 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("Then.resolve has been called");
- test(value, 42);
</del><ins>+ is(value, 42, "Nested promise is executed and then == 42");
</ins><span class="cx"> runTest();
</span><span class="cx"> }, function(value) {
</span><del>- testFailed("Then.reject has been called");
</del><ins>+ ok(false, "This is wrong");
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> function promiseLoop() {
</span><del>- debug("Test Promise - promise loop.");
-
- new Promise(function(resolver) {
- resolver.resolve(new Promise(function(r) {
- testPassed("Nested promise is executed");
- r.resolve(new Promise(function(r) {
- testPassed("Nested-nested promise is executed");
- r.resolve(42);
</del><ins>+ new Promise(function(resolve, reject) {
+ resolve(new Promise(function(r1, r2) {
+ ok(true, "Nested promise is executed");
+ r1(new Promise(function(r1, r2) {
+ ok(true, "Nested nested promise is executed");
+ r1(42);
</ins><span class="cx"> }));
</span><span class="cx"> }));
</span><span class="cx"> }).then(function(value) {
</span><del>- testPassed("Then.resolve has been called");
- test(value, 42);
</del><ins>+ is(value, 42, "Nested nested promise is executed and then == 42");
</ins><span class="cx"> runTest();
</span><span class="cx"> }, function(value) {
</span><del>- testFailed("Then.reject has been called");
</del><ins>+ ok(false, "This is wrong");
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><del>-function promiseRejectConstructor() {
- debug("Test Promise - Promise.reject().");
-
</del><ins>+function promiseStaticReject() {
</ins><span class="cx"> var promise = Promise.reject(42).then(function(what) {
</span><del>- testFailed("Then.resolve has been called");
</del><ins>+ ok(false, "This should not be called");
</ins><span class="cx"> }, function(what) {
</span><del>- testPassed("Then.reject has been called");
- test(what, 42);
</del><ins>+ is(what, 42, "Value == 42");
</ins><span class="cx"> runTest();
</span><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><del>-function promiseResolveConstructor() {
- debug("Test Promise - Promise.resolve().");
-
</del><ins>+function promiseStaticResolve() {
</ins><span class="cx"> var promise = Promise.resolve(42).then(function(what) {
</span><del>- testPassed("Then.resolve has been called");
- test(what, 42);
</del><ins>+ is(what, 42, "Value == 42");
</ins><span class="cx"> runTest();
</span><span class="cx"> }, function() {
</span><del>- testFailed("Then.reject has been called");
</del><ins>+ ok(false, "This should not be called");
</ins><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><del>-function promiseResolveConstructorNestedPromise() {
- debug("Test Promise - Promise.resolve() with nested promise.");
-
- var promise = Promise.resolve(new Promise(function(r) {
- testPassed("Nested promise is executed");
- r.resolve(42);
</del><ins>+function promiseResolveNestedPromise() {
+ var promise = Promise.resolve(new Promise(function(r, r2) {
+ ok(true, "Nested promise is executed");
+ r(42);
</ins><span class="cx"> }, function() {
</span><del>- testFailed("Second argument to Promise constructor called.");
</del><ins>+ ok(false, "This should not be called");
</ins><span class="cx"> })).then(function(what) {
</span><del>- testPassed("Then.resolve has been called");
- test(what, 42);
</del><ins>+ is(what, 42, "Value == 42");
</ins><span class="cx"> runTest();
</span><span class="cx"> }, function() {
</span><del>- testFailed("Then.reject has been called");
</del><ins>+ ok(false, "This should not be called");
</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("");
</del><span class="cx"> var test = tests.shift();
</span><ins>+ debug("\nAbout to run test - " + 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)', '"TypeError: Expected function or undefined as as first argument"');
-shouldThrow('firstPromise.catch(37)', '"TypeError: Expected function or undefined as as first argument"');
</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()', '"TypeError: Expected at least one argument"');
-shouldThrow('new Promise(37)', '"TypeError: Expected function as as first argument"');
</del><ins>+shouldThrow('new Promise()', '"TypeError: Promise constructor takes a function argument"');
+shouldThrow('new Promise(37)', '"TypeError: Promise constructor takes a function argument"');
</ins><span class="cx">
</span><span class="cx"> shouldNotThrow('promise = new Promise(function() { throw Error("foo"); })');
</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("hello");
</del><ins>+new Promise(function(resolve) {
+ resolve("hello");
</ins><span class="cx"> throw Error("foo");
</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)', '"TypeError: Expected function or undefined as as first argument"');
-shouldThrow('firstPromise.then(undefined, null)', '"TypeError: Expected function or undefined as as second argument"');
-shouldThrow('firstPromise.then(37)', '"TypeError: Expected function or undefined as as first argument"');
</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 <sam@webkit.org>
+
+ 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 <mhahnenberg@apple.com>
</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"> <ClCompile Include="..\runtime\JSONObject.cpp" />
</span><span class="cx"> <ClCompile Include="..\runtime\JSObject.cpp" />
</span><span class="cx"> <ClCompile Include="..\runtime\JSPromise.cpp" />
</span><del>- <ClCompile Include="..\runtime\JSPromiseCallback.cpp" />
</del><span class="cx"> <ClCompile Include="..\runtime\JSPromiseConstructor.cpp" />
</span><ins>+ <ClCompile Include="..\runtime\JSPromiseDeferred.cpp" />
+ <ClCompile Include="..\runtime\JSPromiseFunctions.cpp" />
+ <ClCompile Include="..\runtime\JSPromiseReaction.cpp" />
</ins><span class="cx"> <ClCompile Include="..\runtime\JSPromisePrototype.cpp" />
</span><del>- <ClCompile Include="..\runtime\JSPromiseResolver.cpp" />
- <ClCompile Include="..\runtime\JSPromiseResolverConstructor.cpp" />
- <ClCompile Include="..\runtime\JSPromiseResolverPrototype.cpp" />
</del><span class="cx"> <ClCompile Include="..\runtime\JSPropertyNameIterator.cpp" />
</span><span class="cx"> <ClCompile Include="..\runtime\JSProxy.cpp" />
</span><span class="cx"> <ClCompile Include="..\runtime\JSScope.cpp" />
</span><span class="lines">@@ -720,7 +719,6 @@
</span><span class="cx"> <ClInclude Include="$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\$(ProjectName)\DerivedSources\JSONObject.lut.h" />
</span><span class="cx"> <ClInclude Include="$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\$(ProjectName)\DerivedSources\JSPromiseConstructor.lut.h" />
</span><span class="cx"> <ClInclude Include="$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\$(ProjectName)\DerivedSources\JSPromisePrototype.lut.h" />
</span><del>- <ClInclude Include="$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\$(ProjectName)\DerivedSources\JSPromiseResolverPrototype.lut.h" />
</del><span class="cx"> <ClInclude Include="$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\$(ProjectName)\DerivedSources\KeywordLookup.lut.h" />
</span><span class="cx"> <ClInclude Include="$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\$(ProjectName)\DerivedSources\Lexer.lut.h" />
</span><span class="cx"> <ClInclude Include="$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\$(ProjectName)\DerivedSources\NamePrototype.lut.h" />
</span><span class="lines">@@ -1233,12 +1231,11 @@
</span><span class="cx"> <ClInclude Include="..\runtime\JSONObject.h" />
</span><span class="cx"> <ClInclude Include="..\runtime\JSObject.h" />
</span><span class="cx"> <ClInclude Include="..\runtime\JSPromise.h" />
</span><del>- <ClInclude Include="..\runtime\JSPromiseCallback.h" />
</del><span class="cx"> <ClInclude Include="..\runtime\JSPromiseConstructor.h" />
</span><ins>+ <ClInclude Include="..\runtime\JSPromiseDeferred.h" />
+ <ClInclude Include="..\runtime\JSPromiseFunctions.h" />
+ <ClInclude Include="..\runtime\JSPromiseReaction.h" />
</ins><span class="cx"> <ClInclude Include="..\runtime\JSPromisePrototype.h" />
</span><del>- <ClInclude Include="..\runtime\JSPromiseResolver.h" />
- <ClInclude Include="..\runtime\JSPromiseResolverConstructor.h" />
- <ClInclude Include="..\runtime\JSPromiseResolverPrototype.h" />
</del><span class="cx"> <ClInclude Include="..\runtime\JSPropertyNameIterator.h" />
</span><span class="cx"> <ClInclude Include="..\runtime\JSProxy.h" />
</span><span class="cx"> <ClInclude Include="..\runtime\JSScope.h" />
</span><span class="lines">@@ -1271,6 +1268,7 @@
</span><span class="cx"> <ClInclude Include="..\runtime\MapPrototype.h" />
</span><span class="cx"> <ClInclude Include="..\runtime\MatchResult.h" />
</span><span class="cx"> <ClInclude Include="..\runtime\MathObject.h" />
</span><ins>+ <ClInclude Include="..\runtime\Microtask.h" />
</ins><span class="cx"> <ClInclude Include="..\runtime\NameConstructor.h" />
</span><span class="cx"> <ClInclude Include="..\runtime\NameInstance.h" />
</span><span class="cx"> <ClInclude Include="..\runtime\NamePrototype.h" />
</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"> <ClCompile Include="..\runtime\SimpleTypedArrayController.cpp">
</span><span class="cx"> <Filter>runtime</Filter>
</span><span class="cx"> </ClCompile>
</span><del>- <ClCompile Include="..\runtime\JSPromiseResolverPrototype.cpp">
</del><ins>+ <ClCompile Include="..\runtime\JSPromise.cpp">
</ins><span class="cx"> <Filter>runtime</Filter>
</span><span class="cx"> </ClCompile>
</span><del>- <ClCompile Include="..\runtime\JSPromiseResolverConstructor.cpp">
</del><ins>+ <ClCompile Include="..\runtime\JSPromiseConstructor.cpp">
</ins><span class="cx"> <Filter>runtime</Filter>
</span><span class="cx"> </ClCompile>
</span><del>- <ClCompile Include="..\runtime\JSPromiseResolver.cpp">
</del><ins>+ <ClCompile Include="..\runtime\JSPromiseDeferred.cpp">
</ins><span class="cx"> <Filter>runtime</Filter>
</span><span class="cx"> </ClCompile>
</span><del>- <ClCompile Include="..\runtime\JSPromisePrototype.cpp">
</del><ins>+ <ClCompile Include="..\runtime\JSPromiseFunctions.cpp">
</ins><span class="cx"> <Filter>runtime</Filter>
</span><span class="cx"> </ClCompile>
</span><del>- <ClCompile Include="..\runtime\JSPromiseConstructor.cpp">
</del><ins>+ <ClCompile Include="..\runtime\JSPromiseReaction.cpp">
</ins><span class="cx"> <Filter>runtime</Filter>
</span><span class="cx"> </ClCompile>
</span><del>- <ClCompile Include="..\runtime\JSPromiseCallback.cpp">
</del><ins>+ <ClCompile Include="..\runtime\JSPromisePrototype.cpp">
</ins><span class="cx"> <Filter>runtime</Filter>
</span><span class="cx"> </ClCompile>
</span><del>- <ClCompile Include="..\runtime\JSPromise.cpp">
- <Filter>runtime</Filter>
- </ClCompile>
</del><span class="cx"> <ClCompile Include="..\runtime\WeakMapConstructor.cpp">
</span><span class="cx"> <Filter>runtime</Filter>
</span><span class="cx"> </ClCompile>
</span><span class="lines">@@ -2571,25 +2568,22 @@
</span><span class="cx"> <ClInclude Include="..\runtime\JSGenericTypedArrayViewPrototype.h">
</span><span class="cx"> <Filter>runtime</Filter>
</span><span class="cx"> </ClInclude>
</span><del>- <ClInclude Include="..\runtime\JSPromiseResolverPrototype.h">
- <Filter>runtime</Filter>
- </ClInclude>
</del><span class="cx"> <ClInclude Include="..\runtime\JSPromise.h">
</span><span class="cx"> <Filter>runtime</Filter>
</span><span class="cx"> </ClInclude>
</span><del>- <ClInclude Include="..\runtime\JSPromiseCallback.h">
</del><ins>+ <ClInclude Include="..\runtime\JSPromiseConstructor.h">
</ins><span class="cx"> <Filter>runtime</Filter>
</span><span class="cx"> </ClInclude>
</span><del>- <ClInclude Include="..\runtime\JSPromiseConstructor.h">
</del><ins>+ <ClInclude Include="..\runtime\JSPromiseDeferred.h">
</ins><span class="cx"> <Filter>runtime</Filter>
</span><span class="cx"> </ClInclude>
</span><del>- <ClInclude Include="..\runtime\JSPromisePrototype.h">
</del><ins>+ <ClInclude Include="..\runtime\JSPromiseFunctions.h">
</ins><span class="cx"> <Filter>runtime</Filter>
</span><span class="cx"> </ClInclude>
</span><del>- <ClInclude Include="..\runtime\JSPromiseResolver.h">
</del><ins>+ <ClInclude Include="..\runtime\JSPromiseReaction.h">
</ins><span class="cx"> <Filter>runtime</Filter>
</span><span class="cx"> </ClInclude>
</span><del>- <ClInclude Include="..\runtime\JSPromiseResolverConstructor.h">
</del><ins>+ <ClInclude Include="..\runtime\JSPromisePrototype.h">
</ins><span class="cx"> <Filter>runtime</Filter>
</span><span class="cx"> </ClInclude>
</span><span class="cx"> <ClInclude Include="..\runtime\JSInt8Array.h">
</span><span class="lines">@@ -2703,9 +2697,6 @@
</span><span class="cx"> <ClInclude Include="$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\$(ProjectName)\DerivedSources\JSPromisePrototype.lut.h">
</span><span class="cx"> <Filter>Derived Sources</Filter>
</span><span class="cx"> </ClInclude>
</span><del>- <ClInclude Include="$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\$(ProjectName)\DerivedSources\JSPromiseResolverPrototype.lut.h">
- <Filter>Derived Sources</Filter>
- </ClInclude>
</del><span class="cx"> <ClInclude Include="$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\$(ProjectName)\DerivedSources\KeywordLookup.lut.h">
</span><span class="cx"> <Filter>Derived Sources</Filter>
</span><span class="cx"> </ClInclude>
</span><span class="lines">@@ -3156,6 +3147,9 @@
</span><span class="cx"> <ClInclude Include="..\runtime\MapIteratorConstructor.h">
</span><span class="cx"> <Filter>runtime</Filter>
</span><span class="cx"> </ClInclude>
</span><ins>+ <ClInclude Include="..\runtime\Microtask.h">
+ <Filter>runtime</Filter>
+ </ClInclude>
</ins><span class="cx"> <ClInclude Include="..\jit\AssemblyHelpers.h">
</span><span class="cx"> <Filter>jit</Filter>
</span><span class="cx"> </ClInclude>
</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 = "<group>"; };
</span><span class="cx">                 65FB5116184EE9BC00C12B70 /* ProtoCallFrame.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ProtoCallFrame.cpp; sourceTree = "<group>"; };
</span><span class="cx">                 704FD35305697E6D003DBED9 /* BooleanObject.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = BooleanObject.h; sourceTree = "<group>"; tabWidth = 8; };
</span><del>-                7C15F65B17C199CE00794D40 /* JSPromiseCallback.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSPromiseCallback.cpp; sourceTree = "<group>"; };
-                7C15F65C17C199CE00794D40 /* JSPromiseCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSPromiseCallback.h; sourceTree = "<group>"; };
</del><ins>+                7C008CD0186F8A9300955C24 /* JSPromiseFunctions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSPromiseFunctions.cpp; sourceTree = "<group>"; };
+                7C008CD1186F8A9300955C24 /* JSPromiseFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSPromiseFunctions.h; sourceTree = "<group>"; };
+                7C008CD8187124BB00955C24 /* JSPromiseDeferred.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSPromiseDeferred.cpp; sourceTree = "<group>"; };
+                7C008CD9187124BB00955C24 /* JSPromiseDeferred.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSPromiseDeferred.h; sourceTree = "<group>"; };
+                7C008CDC1871258D00955C24 /* JSPromiseReaction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSPromiseReaction.cpp; sourceTree = "<group>"; };
+                7C008CDD1871258D00955C24 /* JSPromiseReaction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSPromiseReaction.h; sourceTree = "<group>"; };
+                7C008CE5187631B600955C24 /* Microtask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Microtask.h; sourceTree = "<group>"; };
</ins><span class="cx">                 7C184E1817BEDBD3007CB63A /* JSPromise.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSPromise.cpp; sourceTree = "<group>"; };
</span><span class="cx">                 7C184E1917BEDBD3007CB63A /* JSPromise.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSPromise.h; sourceTree = "<group>"; };
</span><span class="cx">                 7C184E1C17BEE22E007CB63A /* JSPromisePrototype.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSPromisePrototype.cpp; sourceTree = "<group>"; };
</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 = "<group>"; };
</span><span class="cx">                 7C184E2417BFFA36007CB63A /* JSPromiseConstructor.lut.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JSPromiseConstructor.lut.h; sourceTree = "<group>"; };
</span><span class="cx">                 7C184E2517BFFA36007CB63A /* JSPromisePrototype.lut.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JSPromisePrototype.lut.h; sourceTree = "<group>"; };
</span><del>-                7C3BA28E17C039560072DDC9 /* JSPromiseResolver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSPromiseResolver.cpp; sourceTree = "<group>"; };
-                7C3BA28F17C039560072DDC9 /* JSPromiseResolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSPromiseResolver.h; sourceTree = "<group>"; };
-                7C3BA29017C039560072DDC9 /* JSPromiseResolverConstructor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSPromiseResolverConstructor.cpp; sourceTree = "<group>"; };
-                7C3BA29117C039560072DDC9 /* JSPromiseResolverConstructor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSPromiseResolverConstructor.h; sourceTree = "<group>"; };
-                7C3BA29217C039560072DDC9 /* JSPromiseResolverPrototype.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSPromiseResolverPrototype.cpp; sourceTree = "<group>"; };
-                7C3BA29317C039560072DDC9 /* JSPromiseResolverPrototype.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSPromiseResolverPrototype.h; sourceTree = "<group>"; };
-                7C3BA29A17C03BE10072DDC9 /* JSPromiseResolverPrototype.lut.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JSPromiseResolverPrototype.lut.h; sourceTree = "<group>"; };
</del><span class="cx">                 7E4EE7080EBB7963005934AA /* StructureChain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StructureChain.h; sourceTree = "<group>"; };
</span><span class="cx">                 7E4EE70E0EBB7A5B005934AA /* StructureChain.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StructureChain.cpp; sourceTree = "<group>"; };
</span><span class="cx">                 7EFF00630EC05A9A00AA7C93 /* NodeInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NodeInfo.h; sourceTree = "<group>"; };
</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<typename T> void append(JITWriteBarrier<T>*);
</span><span class="cx"> template<typename T> void append(WriteBarrierBase<T>*);
</span><ins>+ template<typename Iterator> void append(Iterator begin , Iterator end);
</ins><span class="cx"> void appendValues(WriteBarrierBase<Unknown>*, size_t count);
</span><span class="cx">
</span><span class="cx"> template<typename T>
</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->slot());
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+template<typename Iterator> inline void SlotVisitor::append(Iterator begin, Iterator end)
+{
+ for (auto it = begin; it != end; ++it)
+ append(&*it);
+}
+
</ins><span class="cx"> ALWAYS_INLINE void SlotVisitor::appendValues(WriteBarrierBase<Unknown>* barriers, size_t count)
</span><span class="cx"> {
</span><span class="cx"> append(barriers->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& promisePrototypeTable(CallFrame* callFrame) { return *callFrame->vm().promisePrototypeTable; }
</span><span class="cx"> static const HashTable& promiseConstructorTable(CallFrame* callFrame) { return *callFrame->vm().promiseConstructorTable; }
</span><del>- static const HashTable& promiseResolverPrototypeTable(CallFrame* callFrame) { return *callFrame->vm().promiseResolverPrototypeTable; }
</del><span class="cx"> #endif
</span><span class="cx">
</span><span class="cx"> static CallFrame* create(Register* callFrameBase) { return static_cast<CallFrame*>(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, "__proto__")
</span><span class="cx"> , thisIdentifier(vm, "this")
</span><span class="cx"> , useStrictIdentifier(vm, "use strict")
</span><del>- , iteratorPrivateName(Identifier::from(PrivateName()))
- , iteratorNextPrivateName(Identifier::from(PrivateName()))
</del><span class="cx"> , hasNextIdentifier(vm, "hasNext")
</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 "MapIteratorPrototype.h"
</span><span class="cx"> #include "MapPrototype.h"
</span><span class="cx"> #include "MathObject.h"
</span><ins>+#include "Microtask.h"
</ins><span class="cx"> #include "NameConstructor.h"
</span><span class="cx"> #include "NameInstance.h"
</span><span class="cx"> #include "NamePrototype.h"
</span><span class="lines">@@ -117,12 +118,8 @@
</span><span class="cx">
</span><span class="cx"> #if ENABLE(PROMISES)
</span><span class="cx"> #include "JSPromise.h"
</span><del>-#include "JSPromiseCallback.h"
</del><span class="cx"> #include "JSPromiseConstructor.h"
</span><span class="cx"> #include "JSPromisePrototype.h"
</span><del>-#include "JSPromiseResolver.h"
-#include "JSPromiseResolverConstructor.h"
-#include "JSPromiseResolverPrototype.h"
</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("SyntaxError")));
</span><span class="cx"> m_typeErrorConstructor.set(vm, this, NativeErrorConstructor::create(vm, this, nativeErrorStructure, nativeErrorPrototypeStructure, ASCIILiteral("TypeError")));
</span><span class="cx"> m_URIErrorConstructor.set(vm, this, NativeErrorConstructor::create(vm, this, nativeErrorStructure, nativeErrorPrototypeStructure, ASCIILiteral("URIError")));
</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->putDirectWithoutTransition(vm, vm.propertyNames->constructor, objectConstructor, DontEnum);
</span><span class="cx"> m_functionPrototype->putDirectWithoutTransition(vm, vm.propertyNames->constructor, functionConstructor, DontEnum);
</span><span class="cx"> m_arrayPrototype->putDirectWithoutTransition(vm, vm.propertyNames->constructor, arrayConstructor, DontEnum);
</span><span class="cx"> m_regExpPrototype->putDirectWithoutTransition(vm, vm.propertyNames->constructor, m_regExpConstructor.get(), DontEnum);
</span><span class="cx"> #if ENABLE(PROMISES)
</span><del>- m_promisePrototype->putDirectWithoutTransition(vm, vm.propertyNames->constructor, promiseConstructor, DontEnum);
- m_promiseResolverPrototype->putDirectWithoutTransition(vm, vm.propertyNames->constructor, promiseResolverConstructor, DontEnum);
</del><ins>+ m_promisePrototype->putDirectWithoutTransition(vm, vm.propertyNames->constructor, m_promiseConstructor.get(), DontEnum);
</ins><span class="cx"> #endif
</span><span class="cx">
</span><span class="cx"> putDirectWithoutTransition(vm, vm.propertyNames->Object, objectConstructor, DontEnum);
</span><span class="lines">@@ -403,10 +390,7 @@
</span><span class="cx"> putDirectWithoutTransition(vm, vm.propertyNames->SyntaxError, m_syntaxErrorConstructor.get(), DontEnum);
</span><span class="cx"> putDirectWithoutTransition(vm, vm.propertyNames->TypeError, m_typeErrorConstructor.get(), DontEnum);
</span><span class="cx"> putDirectWithoutTransition(vm, vm.propertyNames->URIError, m_URIErrorConstructor.get(), DontEnum);
</span><del>-#if ENABLE(PROMISES)
- putDirectWithoutTransition(vm, vm.propertyNames->Promise, promiseConstructor, DontEnum);
- putDirectWithoutTransition(vm, vm.propertyNames->PromiseResolver, promiseResolverConstructor, DontEnum);
-#endif
</del><ins>+ putDirectWithoutTransition(vm, vm.propertyNames->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(&thisObject->m_syntaxErrorConstructor);
</span><span class="cx"> visitor.append(&thisObject->m_typeErrorConstructor);
</span><span class="cx"> visitor.append(&thisObject->m_URIErrorConstructor);
</span><ins>+ visitor.append(&thisObject->m_promiseConstructor);
</ins><span class="cx">
</span><span class="cx"> visitor.append(&thisObject->m_evalFunction);
</span><span class="cx"> visitor.append(&thisObject->m_callFunction);
</span><span class="lines">@@ -636,7 +621,6 @@
</span><span class="cx"> visitor.append(&thisObject->m_errorPrototype);
</span><span class="cx"> #if ENABLE(PROMISES)
</span><span class="cx"> visitor.append(&thisObject->m_promisePrototype);
</span><del>- visitor.append(&thisObject->m_promiseResolverPrototype);
</del><span class="cx"> #endif
</span><span class="cx">
</span><span class="cx"> visitor.append(&thisObject->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(&thisObject->m_promiseStructure);
</span><del>- visitor.append(&thisObject->m_promiseResolverStructure);
- visitor.append(&thisObject->m_promiseCallbackStructure);
- visitor.append(&thisObject->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<Microtask> task)
+{
+ if (globalObjectMethodTable()->queueTaskToEventLoop)
+ globalObjectMethodTable()->queueTaskToEventLoop(this, task);
+ else
+ WTFLogAlways("ERROR: Event loop not supported.");
+}
+
</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<ExecState*, 16> ExecStateStack;
</span><span class="cx">
</span><del>-class TaskContext : public RefCounted<TaskContext> {
-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<TaskContext>);
</del><ins>+ typedef void (*QueueTaskToEventLoopFunctionPtr)(const JSGlobalObject*, PassRefPtr<Microtask>);
</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<JSObject> m_globalThis;
</span><span class="lines">@@ -165,6 +157,7 @@
</span><span class="cx"> WriteBarrier<NativeErrorConstructor> m_syntaxErrorConstructor;
</span><span class="cx"> WriteBarrier<NativeErrorConstructor> m_typeErrorConstructor;
</span><span class="cx"> WriteBarrier<NativeErrorConstructor> m_URIErrorConstructor;
</span><ins>+ WriteBarrier<JSPromiseConstructor> m_promiseConstructor;
</ins><span class="cx">
</span><span class="cx"> WriteBarrier<JSFunction> m_evalFunction;
</span><span class="cx"> WriteBarrier<JSFunction> m_callFunction;
</span><span class="lines">@@ -176,7 +169,6 @@
</span><span class="cx"> WriteBarrier<ArrayPrototype> m_arrayPrototype;
</span><span class="cx"> WriteBarrier<RegExpPrototype> m_regExpPrototype;
</span><span class="cx"> WriteBarrier<JSPromisePrototype> m_promisePrototype;
</span><del>- WriteBarrier<JSPromiseResolverPrototype> m_promiseResolverPrototype;
</del><span class="cx">
</span><span class="cx"> WriteBarrier<Structure> m_withScopeStructure;
</span><span class="cx"> WriteBarrier<Structure> 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<Structure> m_promiseStructure;
</span><del>- WriteBarrier<Structure> m_promiseResolverStructure;
- WriteBarrier<Structure> m_promiseCallbackStructure;
- WriteBarrier<Structure> 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<Microtask>);
+
</ins><span class="cx"> bool evalEnabled() const { return m_evalEnabled; }
</span><span class="cx"> const String& evalDisabledErrorMessage() const { return m_evalDisabledErrorMessage; }
</span><span class="cx"> void setEvalEnabled(bool enabled, const String& 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 "Error.h"
</span><span class="cx"> #include "JSCJSValueInlines.h"
</span><span class="cx"> #include "JSCellInlines.h"
</span><del>-#include "JSPromiseResolver.h"
</del><ins>+#include "JSPromiseConstructor.h"
+#include "JSPromiseReaction.h"
+#include "Microtask.h"
</ins><span class="cx"> #include "SlotVisitorInlines.h"
</span><del>-#include "StrongInlines.h"
</del><span class="cx"> #include "StructureInlines.h"
</span><span class="cx">
</span><span class="cx"> namespace JSC {
</span><span class="cx">
</span><del>-class JSPromiseTaskContext : public TaskContext {
-public:
- static PassRefPtr<JSPromiseTaskContext> create(VM& vm, JSPromise* promise)
- {
- return adoptRef(new JSPromiseTaskContext(vm, promise));
- }
</del><ins>+static void triggerPromiseReactions(VM&, JSGlobalObject*, Vector<WriteBarrier<JSPromiseReaction>>&, JSValue);
</ins><span class="cx">
</span><del>- JSPromise& promise() const { return *m_promise.get(); }
-
-private:
- JSPromiseTaskContext(VM& vm, JSPromise* promise)
- {
- m_promise.set(vm, promise);
- }
-
- Strong<JSPromise> m_promise;
-};
-
</del><span class="cx"> const ClassInfo JSPromise::s_info = { "Promise", &Base::s_info, 0, 0, CREATE_METHOD_TABLE(JSPromise) };
</span><span class="cx">
</span><del>-JSPromise* JSPromise::create(VM& vm, Structure* structure)
</del><ins>+JSPromise* JSPromise::create(VM& vm, JSGlobalObject* globalObject, JSPromiseConstructor* constructor)
</ins><span class="cx"> {
</span><del>- JSPromise* promise = new (NotNull, allocateCell<JSPromise>(vm.heap)) JSPromise(vm, structure);
- promise->finishCreation(vm);
- return promise;
-}
-
-JSPromise* JSPromise::createWithResolver(VM& vm, JSGlobalObject* globalObject)
-{
</del><span class="cx"> JSPromise* promise = new (NotNull, allocateCell<JSPromise>(vm.heap)) JSPromise(vm, globalObject->promiseStructure());
</span><del>- promise->finishCreation(vm);
-
- JSPromiseResolver* resolver = JSPromiseResolver::create(vm, globalObject->promiseResolverStructure(), promise);
- promise->setResolver(vm, resolver);
-
</del><ins>+ promise->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& 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& vm)
</del><ins>+void JSPromise::finishCreation(VM& 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(&thisObject->m_resolver);
</del><span class="cx"> visitor.append(&thisObject->m_result);
</span><del>-
- for (size_t i = 0; i < thisObject->m_fulfillCallbacks.size(); ++i)
- visitor.append(&thisObject->m_fulfillCallbacks[i]);
- for (size_t i = 0; i < thisObject->m_rejectCallbacks.size(); ++i)
- visitor.append(&thisObject->m_rejectCallbacks[i]);
</del><ins>+ visitor.append(&thisObject->m_constructor);
+ visitor.append(thisObject->m_resolveReactions.begin(), thisObject->m_resolveReactions.end());
+ visitor.append(thisObject->m_rejectReactions.begin(), thisObject->m_rejectReactions.end());
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void JSPromise::setResolver(VM& vm, JSPromiseResolver* resolver)
</del><ins>+void JSPromise::reject(VM& 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 "unresolved", 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& vm, JSValue result)
-{
- m_result.set(vm, this, result);
-}
</del><ins>+ // 2. Let 'reactions' be the value of promise's [[RejectReactions]] internal slot.
+ Vector<WriteBarrier<JSPromiseReaction>> 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 "has-rejection".
+ 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& vm, JSValue resolution)
</ins><span class="cx"> {
</span><del>- // 1. Append fulfillCallback to promise's fulfill callbacks.
- m_fulfillCallbacks.append(WriteBarrier<InternalFunction>(exec->vm(), this, fulfillCallback));
-
- // 2. Append rejectCallback to promise' reject callbacks.
- m_rejectCallbacks.append(WriteBarrier<InternalFunction>(exec->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 "unresolved", 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->globalObject();
- if (globalObject->globalObjectMethodTable()->queueTaskToEventLoop)
- globalObject->globalObjectMethodTable()->queueTaskToEventLoop(globalObject, processFulfillCallbacksForTask, JSPromiseTaskContext::create(exec->vm(), this));
- else
- WTFLogAlways("ERROR: Event loop not supported.");
-}
</del><ins>+ // 2. Let 'reactions' be the value of promise's [[ResolveReactions]] internal slot.
+ Vector<WriteBarrier<JSPromiseReaction>> 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->globalObject();
- if (globalObject->globalObjectMethodTable()->queueTaskToEventLoop)
- globalObject->globalObjectMethodTable()->queueTaskToEventLoop(globalObject, processRejectCallbacksForTask, JSPromiseTaskContext::create(exec->vm(), this));
- else
- WTFLogAlways("ERROR: Event loop not supported.");
-}
</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<JSPromiseTaskContext*>(taskContext);
- JSPromise& promise = promiseTaskContext->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 "has-resolution".
+ 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& vm, JSPromiseReaction* reaction)
</ins><span class="cx"> {
</span><del>- JSPromiseTaskContext* promiseTaskContext = static_cast<JSPromiseTaskContext*>(taskContext);
- JSPromise& promise = promiseTaskContext->promise();
-
- promise.processRejectCallbacksWithValue(exec, promise.result());
</del><ins>+ m_resolveReactions.append(WriteBarrier<JSPromiseReaction>(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& vm, JSPromiseReaction* reaction)
</ins><span class="cx"> {
</span><del>- ASSERT(m_state == Fulfilled);
-
- for (size_t i = 0; i < 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<JSPromiseReaction>(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& vm, JSGlobalObject* globalObject, Vector<WriteBarrier<JSPromiseReaction>>& reactions, JSValue argument)
</ins><span class="cx"> {
</span><del>- ASSERT(m_state == Rejected);
-
- for (size_t i = 0; i < 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& reaction : reactions) {
+ // i. Call QueueMicrotask(ExecutePromiseReaction, (reaction, argument)).
+ globalObject->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&, Structure*);
</del><ins>+ static JSPromise* create(VM&, JSGlobalObject*, JSPromiseConstructor*);
</ins><span class="cx"> static Structure* createStructure(VM&, JSGlobalObject*, JSValue);
</span><span class="cx">
</span><del>- JS_EXPORT_PRIVATE static JSPromise* createWithResolver(VM&, JSGlobalObject*);
-
</del><span class="cx"> DECLARE_INFO;
</span><span class="cx">
</span><del>- void setResolver(VM&, 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&, 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&, JSValue);
+ void resolve(VM&, JSValue);
</ins><span class="cx">
</span><del>-protected:
- void finishCreation(VM&);
- static const unsigned StructureFlags = OverridesVisitChildren | JSObject::StructureFlags;
</del><ins>+ void appendResolveReaction(VM&, JSPromiseReaction*);
+ void appendRejectReaction(VM&, JSPromiseReaction*);
</ins><span class="cx">
</span><span class="cx"> private:
</span><span class="cx"> JSPromise(VM&, Structure*);
</span><del>-
- static void processFulfillCallbacksForTask(ExecState*, TaskContext*);
- static void processRejectCallbacksForTask(ExecState*, TaskContext*);
-
</del><ins>+ void finishCreation(VM&, 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&);
</span><span class="cx">
</span><del>- WriteBarrier<JSPromiseResolver> m_resolver;
</del><ins>+ Status m_status;
</ins><span class="cx"> WriteBarrier<Unknown> m_result;
</span><del>- Vector<WriteBarrier<InternalFunction>> m_fulfillCallbacks;
- Vector<WriteBarrier<InternalFunction>> m_rejectCallbacks;
- State m_state;
</del><ins>+ WriteBarrier<JSPromiseConstructor> m_constructor;
+ Vector<WriteBarrier<JSPromiseReaction>> m_resolveReactions;
+ Vector<WriteBarrier<JSPromiseReaction>> 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 "config.h"
-#include "JSPromiseCallback.h"
-
-#if ENABLE(PROMISES)
-
-#include "JSCJSValueInlines.h"
-#include "JSCellInlines.h"
-#include "JSPromise.h"
-#include "JSPromiseResolver.h"
-#include "SlotVisitorInlines.h"
-#include "StructureInlines.h"
-
-namespace JSC {
-
-const ClassInfo JSPromiseCallback::s_info = { "Function", &Base::s_info, 0, 0, CREATE_METHOD_TABLE(JSPromiseCallback) };
-
-JSPromiseCallback* JSPromiseCallback::create(VM& vm, Structure* structure, JSPromiseResolver* resolver, Algorithm algorithm)
-{
- JSPromiseCallback* constructor = new (NotNull, allocateCell<JSPromiseCallback>(vm.heap)) JSPromiseCallback(vm, structure, algorithm);
- constructor->finishCreation(vm, resolver);
- return constructor;
-}
-
-Structure* JSPromiseCallback::createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype)
-{
- return Structure::create(vm, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), info());
-}
-
-JSPromiseCallback::JSPromiseCallback(VM& vm, Structure* structure, Algorithm algorithm)
- : InternalFunction(vm, structure)
- , m_algorithm(algorithm)
-{
-}
-
-void JSPromiseCallback::finishCreation(VM& vm, JSPromiseResolver* resolver)
-{
- Base::finishCreation(vm, "PromiseCallback");
- m_resolver.set(vm, this, resolver);
-}
-
-void JSPromiseCallback::visitChildren(JSCell* cell, SlotVisitor& visitor)
-{
- JSPromiseCallback* thisObject = jsCast<JSPromiseCallback*>(cell);
- ASSERT_GC_OBJECT_INHERITS(thisObject, info());
- COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag);
- ASSERT(thisObject->structure()->typeInfo().overridesVisitChildren());
-
- Base::visitChildren(thisObject, visitor);
-
- visitor.append(&thisObject->m_resolver);
-}
-
-EncodedJSValue JSC_HOST_CALL JSPromiseCallback::callPromiseCallback(ExecState* exec)
-{
- JSPromiseCallback* promiseCallback = jsCast<JSPromiseCallback*>(exec->callee());
- JSPromiseResolver* resolver = promiseCallback->m_resolver.get();
-
- // 1. Let value be the first argument that is passed, and undefined otherwise.
- JSValue value = exec->argument(0);
-
- // 2. Run resolver's algorithm with value and the synchronous flag set.
- switch (promiseCallback->m_algorithm) {
- case JSPromiseCallback::Fulfill:
- resolver->fulfill(exec, value, JSPromiseResolver::ResolveSynchronously);
- break;
-
- case JSPromiseCallback::Resolve:
- resolver->resolve(exec, value, JSPromiseResolver::ResolveSynchronously);
- break;
-
- case JSPromiseCallback::Reject:
- resolver->reject(exec, value, JSPromiseResolver::ResolveSynchronously);
- break;
- }
-
- return JSValue::encode(jsUndefined());
-}
-
-CallType JSPromiseCallback::getCallData(JSCell*, CallData& callData)
-{
- callData.native.function = callPromiseCallback;
- return CallTypeHost;
-}
-
-
-
-
-const ClassInfo JSPromiseWrapperCallback::s_info = { "Function", &Base::s_info, 0, 0, CREATE_METHOD_TABLE(JSPromiseWrapperCallback) };
-
-JSPromiseWrapperCallback* JSPromiseWrapperCallback::create(VM& vm, Structure* structure, JSPromiseResolver* resolver, JSValue callback)
-{
- JSPromiseWrapperCallback* constructor = new (NotNull, allocateCell<JSPromiseWrapperCallback>(vm.heap)) JSPromiseWrapperCallback(vm, structure);
- constructor->finishCreation(vm, resolver, callback);
- return constructor;
-}
-
-Structure* JSPromiseWrapperCallback::createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype)
-{
- return Structure::create(vm, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), info());
-}
-
-JSPromiseWrapperCallback::JSPromiseWrapperCallback(VM& vm, Structure* structure)
- : InternalFunction(vm, structure)
-{
-}
-
-void JSPromiseWrapperCallback::finishCreation(VM& vm, JSPromiseResolver* resolver, JSValue callback)
-{
- Base::finishCreation(vm, "PromiseWrapperCallback");
- m_resolver.set(vm, this, resolver);
- m_callback.set(vm, this, callback);
-}
-
-void JSPromiseWrapperCallback::visitChildren(JSCell* cell, SlotVisitor& visitor)
-{
- JSPromiseWrapperCallback* thisObject = jsCast<JSPromiseWrapperCallback*>(cell);
- ASSERT_GC_OBJECT_INHERITS(thisObject, info());
- COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag);
- ASSERT(thisObject->structure()->typeInfo().overridesVisitChildren());
-
- Base::visitChildren(thisObject, visitor);
-
- visitor.append(&thisObject->m_resolver);
- visitor.append(&thisObject->m_callback);
-}
-
-EncodedJSValue JSC_HOST_CALL JSPromiseWrapperCallback::callPromiseWrapperCallback(ExecState* exec)
-{
- JSPromiseWrapperCallback* promiseWrapperCallback = jsCast<JSPromiseWrapperCallback*>(exec->callee());
-
- JSPromiseResolver* resolver = promiseWrapperCallback->m_resolver.get();
- JSValue callback = promiseWrapperCallback->m_callback.get();
-
- // 1. Let argument be the first argument that is passed, and undefined otherwise.
- JSValue argument = exec->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->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->hadException()) {
- JSValue exception = exec->exception();
- exec->clearException();
-
- resolver->reject(exec, exception, JSPromiseResolver::ResolveSynchronously);
- return JSValue::encode(jsUndefined());
- }
-
- // 5. Otherwise, run resolver's resolve with value and the synchronous flag set.
- resolver->resolve(exec, value, JSPromiseResolver::ResolveSynchronously);
-
- return JSValue::encode(jsUndefined());
-}
-
-CallType JSPromiseWrapperCallback::getCallData(JSCell*, CallData& 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 "InternalFunction.h"
-
-namespace JSC {
-
-class JSPromiseResolver;
-
-class JSPromiseCallback : public InternalFunction {
-public:
- typedef InternalFunction Base;
-
- enum Algorithm {
- Fulfill,
- Resolve,
- Reject,
- };
-
- static JSPromiseCallback* create(VM&, Structure*, JSPromiseResolver*, Algorithm);
- static Structure* createStructure(VM&, JSGlobalObject*, JSValue);
-
- DECLARE_INFO;
-
-private:
- JSPromiseCallback(VM&, Structure*, Algorithm);
- void finishCreation(VM&, JSPromiseResolver*);
- static const unsigned StructureFlags = OverridesVisitChildren | JSObject::StructureFlags;
-
- static EncodedJSValue JSC_HOST_CALL callPromiseCallback(ExecState*);
- static CallType getCallData(JSCell*, CallData&);
-
- static void visitChildren(JSCell*, SlotVisitor&);
-
- WriteBarrier<JSPromiseResolver> m_resolver;
- Algorithm m_algorithm;
-};
-
-class JSPromiseWrapperCallback : public InternalFunction {
-public:
- typedef InternalFunction Base;
-
- static JSPromiseWrapperCallback* create(VM&, Structure*, JSPromiseResolver*, JSValue callback);
- static Structure* createStructure(VM&, JSGlobalObject*, JSValue);
-
- DECLARE_INFO;
-
-private:
- JSPromiseWrapperCallback(VM&, Structure*);
- void finishCreation(VM&, JSPromiseResolver*, JSValue callback);
- static const unsigned StructureFlags = OverridesVisitChildren | JSObject::StructureFlags;
-
- static EncodedJSValue JSC_HOST_CALL callPromiseWrapperCallback(ExecState*);
- static CallType getCallData(JSCell*, CallData&);
-
- static void visitChildren(JSCell*, SlotVisitor&);
-
- WriteBarrier<JSPromiseResolver> m_resolver;
- WriteBarrier<Unknown> 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 "JSCJSValueInlines.h"
</span><span class="cx"> #include "JSCellInlines.h"
</span><span class="cx"> #include "JSPromise.h"
</span><del>-#include "JSPromiseCallback.h"
</del><ins>+#include "JSPromiseDeferred.h"
+#include "JSPromiseFunctions.h"
</ins><span class="cx"> #include "JSPromisePrototype.h"
</span><del>-#include "JSPromiseResolver.h"
</del><span class="cx"> #include "Lookup.h"
</span><span class="cx"> #include "StructureInlines.h"
</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 "JSPromiseConstructor.lut.h"
</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->argumentCount())
- return throwVMError(exec, createTypeError(exec, "Expected at least one argument"));
</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->uncheckedArgument(0);
</del><ins>+ JSValue resolver = exec->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, "Expected function as as first argument"));
</del><ins>+ return JSValue::encode(throwTypeError(exec, ASCIILiteral("Promise constructor takes a function argument")));
</ins><span class="cx">
</span><del>- JSGlobalObject* globalObject = asInternalFunction(exec->callee())->globalObject();
</del><ins>+ VM& vm = exec->vm();
+ JSGlobalObject* globalObject = exec->callee()->globalObject();
+
+ JSPromise* promise = JSPromise::create(vm, globalObject, jsCast<JSPromiseConstructor*>(exec->callee()));
+
+ // NOTE: Steps 6-8 are handled by JSPromise::create().
+ // 6. Set promise's [[PromiseStatus]] internal slot to "unresolved".
+ // 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->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->resolver();
</del><ins>+ // 10. Set the [[Promise]] internal slot of 'resolve' to 'promise'.
+ resolve->putDirect(vm, vm.propertyNames->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->putDirect(vm, vm.propertyNames->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->hadException()) {
</span><span class="cx"> JSValue exception = exec->exception();
</span><span class="cx"> exec->clearException();
</span><span class="cx">
</span><del>- resolver->rejectIfNotResolved(exec, exception);
</del><ins>+ promise->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&)
</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<InternalFunction>(exec, ExecState::promiseConstructorTable(exec), jsCast<JSPromiseConstructor*>(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->argumentCount())
- return throwVMError(exec, createTypeError(exec, "Expected at least one argument"));
</del><ins>+ // -- Promise.cast(x) --
+ JSValue x = exec->argument(0);
</ins><span class="cx">
</span><del>- JSGlobalObject* globalObject = exec->callee()->globalObject();
</del><ins>+ // 1. Let 'C' be the this value.
+ JSValue C = exec->thisValue();
</ins><span class="cx">
</span><del>- JSPromise* promise = JSPromise::createWithResolver(exec->vm(), globalObject);
- promise->resolver()->fulfill(exec, exec->uncheckedArgument(0));
</del><ins>+ // 2. If IsPromise(x) is true,
+ JSPromise* promise = jsDynamicCast<JSPromise*>(x);
+ if (promise) {
+ // i. Let 'constructor' be the value of x's [[PromiseConstructor]] internal slot.
+ JSValue constructor = promise->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->hadException())
+ return JSValue::encode(jsUndefined());
+
+ JSPromiseDeferred* deferred = jsCast<JSPromiseDeferred*>(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->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->hadException())
+ return JSValue::encode(jsUndefined());
+
+ // 7. Return deferred.[[Promise]].
+ return JSValue::encode(deferred->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->argumentCount())
- return throwVMError(exec, createTypeError(exec, "Expected at least one argument"));
</del><ins>+ // -- Promise.resolve(x) --
+ JSValue x = exec->argument(0);
</ins><span class="cx">
</span><del>- JSGlobalObject* globalObject = exec->callee()->globalObject();
</del><ins>+ // 1. Let 'C' be the this value.
+ JSValue C = exec->thisValue();
</ins><span class="cx">
</span><del>- JSPromise* promise = JSPromise::createWithResolver(exec->vm(), globalObject);
- promise->resolver()->resolve(exec, exec->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->hadException())
+ return JSValue::encode(jsUndefined());
+
+ JSPromiseDeferred* deferred = jsCast<JSPromiseDeferred*>(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->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->hadException())
+ return JSValue::encode(jsUndefined());
+
+ // 6. Return deferred.[[Promise]].
+ return JSValue::encode(deferred->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->argumentCount())
- return throwVMError(exec, createTypeError(exec, "Expected at least one argument"));
</del><ins>+ // -- Promise.reject(x) --
+ JSValue r = exec->argument(0);
</ins><span class="cx">
</span><del>- JSGlobalObject* globalObject = exec->callee()->globalObject();
</del><ins>+ // 1. Let 'C' be the this value.
+ JSValue C = exec->thisValue();
</ins><span class="cx">
</span><del>- JSPromise* promise = JSPromise::createWithResolver(exec->vm(), globalObject);
- promise->resolver()->reject(exec, exec->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->hadException())
+ return JSValue::encode(jsUndefined());
+
+ JSPromiseDeferred* deferred = jsCast<JSPromiseDeferred*>(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->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->hadException())
+ return JSValue::encode(jsUndefined());
+
+ // 6. Return deferred.[[Promise]].
+ return JSValue::encode(deferred->promise());
</ins><span class="cx"> }
</span><span class="cx">
</span><ins>+JSPromise* constructPromise(ExecState* exec, JSGlobalObject* globalObject, JSFunction* resolver)
+{
+ JSPromiseConstructor* promiseConstructor = globalObject->promiseConstructor();
+
+ ConstructData constructData;
+ ConstructType constructType = getConstructData(promiseConstructor, constructData);
+ ASSERT(constructType != ConstructTypeNone);
+
+ MarkedArgumentBuffer arguments;
+ arguments.append(resolver);
+
+ return jsCast<JSPromise*>(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&);
</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 "config.h"
+#include "JSPromiseDeferred.h"
+
+#include "Error.h"
+#include "JSCJSValueInlines.h"
+#include "JSCellInlines.h"
+#include "JSPromise.h"
+#include "JSPromiseConstructor.h"
+#include "JSPromiseFunctions.h"
+#include "SlotVisitorInlines.h"
+
+namespace JSC {
+
+const ClassInfo JSPromiseDeferred::s_info = { "JSPromiseDeferred", 0, 0, 0, CREATE_METHOD_TABLE(JSPromiseDeferred) };
+
+JSPromiseDeferred* JSPromiseDeferred::create(ExecState* exec, JSGlobalObject* globalObject)
+{
+ VM& vm = exec->vm();
+
+ JSFunction* resolver = createDeferredConstructionFunction(vm, globalObject);
+
+ JSPromise* promise = constructPromise(exec, globalObject, resolver);
+ JSValue resolve = resolver->get(exec, vm.propertyNames->resolvePrivateName);
+ JSValue reject = resolver->get(exec, vm.propertyNames->rejectPrivateName);
+
+ return JSPromiseDeferred::create(vm, promise, resolve, reject);
+}
+
+JSPromiseDeferred* JSPromiseDeferred::create(VM& vm, JSObject* promise, JSValue resolve, JSValue reject)
+{
+ JSPromiseDeferred* deferred = new (NotNull, allocateCell<JSPromiseDeferred>(vm.heap)) JSPromiseDeferred(vm);
+ deferred->finishCreation(vm, promise, resolve, reject);
+ return deferred;
+}
+
+JSPromiseDeferred::JSPromiseDeferred(VM& vm)
+ : Base(vm, vm.promiseDeferredStructure.get())
+{
+}
+
+void JSPromiseDeferred::finishCreation(VM& 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& visitor)
+{
+ JSPromiseDeferred* thisObject = jsCast<JSPromiseDeferred*>(cell);
+ ASSERT_GC_OBJECT_INHERITS(thisObject, info());
+ COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag);
+ ASSERT(thisObject->structure()->typeInfo().overridesVisitChildren());
+
+ Base::visitChildren(thisObject, visitor);
+
+ visitor.append(&thisObject->m_promise);
+ visitor.append(&thisObject->m_resolve);
+ visitor.append(&thisObject->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& vm = exec->vm();
+
+ // 2. Let 'resolver' be a new built-in function object as defined in Deferred Construction Functions.
+ JSFunction* resolver = createDeferredConstructionFunction(vm, asObject(C)->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->hadException())
+ return jsUndefined();
+
+ // 5. Let 'resolve' be the value of resolver's [[Resolve]] internal slot.
+ JSValue resolve = resolver->get(exec, vm.propertyNames->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->get(exec, vm.propertyNames->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->vm(), promise, resolve, reject);
+}
+
+ThenableStatus updateDeferredFromPotentialThenable(ExecState* exec, JSValue x, JSPromiseDeferred* deferred)
+{
+ // 1. If Type(x) is not Object, return "not a thenable".
+ if (!x.isObject())
+ return NotAThenable;
+
+ // 2. Let 'then' be the result of calling Get(x, "then").
+ JSValue thenValue = x.get(exec, exec->vm().propertyNames->then);
+
+ // 3. If then is an abrupt completion,
+ if (exec->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->exception();
+ exec->clearException();
+
+ JSValue deferredReject = deferred->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 "not a thenable".
+ 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->resolve());
+ thenArguments.append(deferred->reject());
+
+ call(exec, thenValue, thenCallType, thenCallData, x, thenArguments);
+
+ // 7. If 'thenCallResult' is an abrupt completion,
+ if (exec->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->exception();
+ exec->clearException();
+
+ JSValue deferredReject = deferred->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 "JSCell.h"
+#include "Structure.h"
+
+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&, JSObject* promise, JSValue resolve, JSValue reject);
+
+ static Structure* createStructure(VM& 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&);
+ void finishCreation(VM&, JSObject*, JSValue, JSValue);
+ static const unsigned StructureFlags = OverridesVisitChildren | Base::StructureFlags;
+ static void visitChildren(JSCell*, SlotVisitor&);
+
+ WriteBarrier<JSObject> m_promise;
+ WriteBarrier<Unknown> m_resolve;
+ WriteBarrier<Unknown> 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 "config.h"
+#include "JSPromiseFunctions.h"
+
+#if ENABLE(PROMISES)
+
+#include "Error.h"
+#include "JSCJSValueInlines.h"
+#include "JSCellInlines.h"
+#include "JSPromise.h"
+#include "JSPromiseConstructor.h"
+#include "JSPromiseDeferred.h"
+
+namespace JSC {
+
+// Deferred Construction Functions
+static EncodedJSValue JSC_HOST_CALL deferredConstructionFunction(ExecState* exec)
+{
+ JSObject* F = exec->callee();
+
+ VM& vm = exec->vm();
+
+ // 1. Set F's [[Resolve]] internal slot to resolve.
+ F->putDirect(vm, vm.propertyNames->resolvePrivateName, exec->argument(0));
+
+ // 2. Set F's [[Reject]] internal slot to reject.
+ F->putDirect(vm, vm.propertyNames->rejectPrivateName, exec->argument(1));
+
+ // 3. Return.
+ return JSValue::encode(jsUndefined());
+}
+
+JSFunction* createDeferredConstructionFunction(VM& vm, JSGlobalObject* globalObject)
+{
+ return JSFunction::create(vm, globalObject, 2, ASCIILiteral("DeferredConstructionFunction"), deferredConstructionFunction);
+}
+
+// Identity Functions
+
+static EncodedJSValue JSC_HOST_CALL identifyFunction(ExecState* exec)
+{
+ return JSValue::encode(exec->argument(0));
+}
+
+JSFunction* createIdentifyFunction(VM& vm, JSGlobalObject* globalObject)
+{
+ return JSFunction::create(vm, globalObject, 1, ASCIILiteral("IdentityFunction"), identifyFunction);
+}
+
+// Promise Resolution Handler Functions
+
+static EncodedJSValue JSC_HOST_CALL promiseResolutionHandlerFunction(ExecState* exec)
+{
+ JSValue x = exec->argument(0);
+ VM& vm = exec->vm();
+ JSObject* F = exec->callee();
+
+ // 1. Let 'promise' be the value of F's [[Promise]] internal slot
+ JSPromise* promise = jsCast<JSPromise*>(F->get(exec, vm.propertyNames->promisePrivateName));
+
+ // 2. Let 'fulfillmentHandler' be the value of F's [[FulfillmentHandler]] internal slot.
+ JSValue fulfillmentHandler = F->get(exec, vm.propertyNames->fulfillmentHandlerPrivateName);
+
+ // 3. Let 'rejectionHandler' be the value of F's [[RejectionHandler]] internal slot.
+ JSValue rejectionHandler = F->get(exec, vm.propertyNames->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("Resolve a promise with itself"));
+ // 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->constructor();
+
+ // 6. Let 'deferred' be the result of calling GetDeferred(C)
+ JSValue deferredValue = createJSPromiseDeferredFromConstructor(exec, C);
+
+ // 7. ReturnIfAbrupt(deferred).
+ if (exec->hadException())
+ return JSValue::encode(jsUndefined());
+
+ JSPromiseDeferred* deferred = jsCast<JSPromiseDeferred*>(deferredValue);
+
+ // 8. Let 'updateResult' be the result of calling UpdateDeferredFromPotentialThenable(x, deferred).
+ ThenableStatus updateResult = updateDeferredFromPotentialThenable(exec, x, deferred);
+
+ // 9. ReturnIfAbrupt(updateResult).
+ if (exec->hadException())
+ return JSValue::encode(jsUndefined());
+
+ // 10. If 'updateResult' is not "not a thenable", return the result of calling
+ // Invoke(deferred.[[Promise]], "then", (fulfillmentHandler, rejectionHandler)).
+ // NOTE: Invoke does not seem to be defined anywhere, so I am guessing here.
+ if (updateResult != NotAThenable) {
+ JSObject* deferredPromise = deferred->promise();
+
+ JSValue thenValue = deferredPromise->get(exec, exec->vm().propertyNames->then);
+ if (exec->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& vm, JSGlobalObject* globalObject)
+{
+ return JSFunction::create(vm, globalObject, 1, ASCIILiteral("PromiseResolutionHandlerFunction"), promiseResolutionHandlerFunction);
+}
+
+// Reject Promise Functions
+
+static EncodedJSValue JSC_HOST_CALL rejectPromiseFunction(ExecState* exec)
+{
+ JSValue reason = exec->argument(0);
+ JSObject* F = exec->callee();
+ VM& vm = exec->vm();
+
+ // 1. Let 'promise' be the value of F's [[Promise]] internal slot.
+ JSPromise* promise = jsCast<JSPromise*>(F->get(exec, exec->vm().propertyNames->promisePrivateName));
+
+ // 2. Return the result of calling PromiseReject(promise, reason);
+ promise->reject(vm, reason);
+
+ return JSValue::encode(jsUndefined());
+}
+
+JSFunction* createRejectPromiseFunction(VM& vm, JSGlobalObject* globalObject)
+{
+ return JSFunction::create(vm, globalObject, 1, ASCIILiteral("RejectPromiseFunction"), rejectPromiseFunction);
+}
+
+// Resolve Promise Functions
+
+static EncodedJSValue JSC_HOST_CALL resolvePromiseFunction(ExecState* exec)
+{
+ JSValue resolution = exec->argument(0);
+ JSObject* F = exec->callee();
+ VM& vm = exec->vm();
+
+ // 1. Let 'promise' be the value of F's [[Promise]] internal slot.
+ JSPromise* promise = jsCast<JSPromise*>(F->get(exec, vm.propertyNames->promisePrivateName));
+
+ // 2. Return the result of calling PromiseResolve(promise, resolution);
+ promise->resolve(vm, resolution);
+
+ return JSValue::encode(jsUndefined());
+}
+
+JSFunction* createResolvePromiseFunction(VM& vm, JSGlobalObject* globalObject)
+{
+ return JSFunction::create(vm, globalObject, 1, ASCIILiteral("ResolvePromiseFunction"), resolvePromiseFunction);
+}
+
+// Thrower Functions
+
+static EncodedJSValue JSC_HOST_CALL throwerFunction(ExecState* exec)
+{
+ return JSValue::encode(exec->vm().throwException(exec, exec->argument(0)));
+}
+
+JSFunction* createThrowerFunction(VM& vm, JSGlobalObject* globalObject)
+{
+ return JSFunction::create(vm, globalObject, 1, ASCIILiteral("ThrowerFunction"), 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 "JSFunction.h"
+
+namespace JSC {
+
+JSFunction* createDeferredConstructionFunction(VM&, JSGlobalObject*);
+JSFunction* createIdentifyFunction(VM&, JSGlobalObject*);
+JSFunction* createPromiseResolutionHandlerFunction(VM&, JSGlobalObject*);
+JSFunction* createRejectPromiseFunction(VM&, JSGlobalObject*);
+JSFunction* createResolvePromiseFunction(VM&, JSGlobalObject*);
+JSFunction* createThrowerFunction(VM&, 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 "JSCellInlines.h"
</span><span class="cx"> #include "JSGlobalObject.h"
</span><span class="cx"> #include "JSPromise.h"
</span><del>-#include "JSPromiseCallback.h"
-#include "JSPromiseResolver.h"
</del><ins>+#include "JSPromiseDeferred.h"
+#include "JSPromiseFunctions.h"
+#include "JSPromiseReaction.h"
+#include "Microtask.h"
</ins><span class="cx"> #include "StructureInlines.h"
</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<JSObject>(exec, ExecState::promisePrototypeTable(exec), jsCast<JSPromisePrototype*>(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->vm(), globalObject->promiseWrapperCallbackStructure(), resolver, callback);
- return JSPromiseCallback::create(exec->vm(), globalObject->promiseCallbackStructure(), resolver, algorithm);
-}
-
</del><span class="cx"> EncodedJSValue JSC_HOST_CALL JSPromisePrototypeFuncThen(ExecState* exec)
</span><span class="cx"> {
</span><del>- JSPromise* thisObject = jsDynamicCast<JSPromise*>(exec->thisValue());
- if (!thisObject)
- return throwVMError(exec, createTypeError(exec, "Receiver of then must be a Promise"));
</del><ins>+ // -- Promise.prototype.then(onFulfilled, onRejected) --
</ins><span class="cx">
</span><del>- JSValue fulfillCallback = exec->argument(0);
- if (!fulfillCallback.isUndefined()) {
- CallData callData;
- CallType callType = getCallData(fulfillCallback, callData);
- if (callType == CallTypeNone)
- return throwVMError(exec, createTypeError(exec, "Expected function or undefined as as first argument"));
- }
</del><ins>+ // 1. Let promise be the this value.
+ // 2. If IsPromise(promise) is false, throw a TypeError exception.
+ JSPromise* promise = jsDynamicCast<JSPromise*>(exec->thisValue());
+ if (!promise)
+ return JSValue::encode(throwTypeError(exec));
+
+ // 3. Let 'C' be the result of calling Get(promise, "constructor").
+ JSValue C = promise->get(exec, exec->propertyNames().constructor);
</ins><span class="cx">
</span><del>- JSValue rejectCallback = exec->argument(1);
- if (!rejectCallback.isUndefined()) {
- CallData callData;
- CallType callType = getCallData(rejectCallback, callData);
- if (callType == CallTypeNone)
- return throwVMError(exec, createTypeError(exec, "Expected function or undefined as as second argument"));
- }
</del><ins>+ // 4. ReturnIfAbrupt(C).
+ if (exec->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<JSFunction*>(exec->callee());
- JSGlobalObject* globalObject = callee->globalObject();
</del><ins>+ // 6. ReturnIfAbrupt(deferred).
+ if (exec->hadException())
+ return JSValue::encode(jsUndefined());
</ins><span class="cx">
</span><del>- // 1. Let promise be a new promise.
- JSPromise* promise = JSPromise::createWithResolver(exec->vm(), globalObject);
</del><ins>+ VM& vm = exec->vm();
+ JSGlobalObject* globalObject = promise->globalObject();
</ins><span class="cx">
</span><del>- // 2. Let resolver be promise's associated resolver.
- JSPromiseResolver* resolver = promise->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->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->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->putDirect(vm, vm.propertyNames->promisePrivateName, promise);
</ins><span class="cx">
</span><del>- // 5. Append fulfillWrapper and rejectWrapper to the context object.
- thisObject->appendCallbacks(exec, fulfillWrapper, rejectWrapper);
</del><ins>+ // 13. Set the [[FulfillmentHandler]] internal slot of resolutionHandler to fulfillmentHandler.
+ resolutionHandler->putDirect(vm, vm.propertyNames->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->putDirect(vm, vm.propertyNames->rejectionHandlerPrivateName, rejectionHandler);
</ins><span class="cx">
</span><del>-EncodedJSValue JSC_HOST_CALL JSPromisePrototypeFuncCatch(ExecState* exec)
-{
- JSPromise* thisObject = jsDynamicCast<JSPromise*>(exec->thisValue());
- if (!thisObject)
- return throwVMError(exec, createTypeError(exec, "Receiver of catch must be a Promise"));
-
- JSValue rejectCallback = exec->argument(0);
- if (!rejectCallback.isUndefined()) {
- CallData callData;
- CallType callType = getCallData(rejectCallback, callData);
- if (callType == CallTypeNone)
- return throwVMError(exec, createTypeError(exec, "Expected function or undefined as as first argument"));
</del><ins>+ // 15. Let 'resolveReaction' be the PromiseReaction { [[Deferred]]: deferred, [[Handler]]: resolutionHandler }.
+ JSPromiseReaction* resolveReaction = JSPromiseReaction::create(vm, jsCast<JSPromiseDeferred*>(deferred), resolutionHandler);
+
+ // 16. Let 'rejectReaction' be the PromiseReaction { [[Deferred]]: deferred, [[Handler]]: rejectionHandler }.
+ JSPromiseReaction* rejectReaction = JSPromiseReaction::create(vm, jsCast<JSPromiseDeferred*>(deferred), rejectionHandler);
+
+ switch (promise->status()) {
+ case JSPromise::Status::Unresolved: {
+ // 17. If the value of promise's [[PromiseStatus]] internal slot is "unresolved",
+
+ // i. Append resolveReaction as the last element of promise's [[ResolveReactions]] internal slot.
+ promise->appendResolveReaction(vm, resolveReaction);
+
+ // ii. Append rejectReaction as the last element of promise's [[RejectReactions]] internal slot.
+ promise->appendRejectReaction(vm, rejectReaction);
+ break;
</ins><span class="cx"> }
</span><span class="cx">
</span><del>- JSFunction* callee = jsCast<JSFunction*>(exec->callee());
- JSGlobalObject* globalObject = callee->globalObject();
- VM& vm = exec->vm();
</del><ins>+ case JSPromise::Status::HasResolution: {
+ // 18. If the value of promise's [[PromiseStatus]] internal slot is "has-resolution",
</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->result();
</ins><span class="cx">
</span><del>- // 2. Let resolver be promise's associated resolver.
- JSPromiseResolver* resolver = promise->resolver();
</del><ins>+ // ii. Call QueueMicrotask(ExecutePromiseReaction, (resolveReaction, resolution)).
+ globalObject->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->promiseCallbackStructure(), resolver, JSPromiseCallback::Fulfill);
</del><ins>+ case JSPromise::Status::HasRejection: {
+ // 19. If the value of promise's [[PromiseStatus]] internal slot is "has-rejection",
</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->result();
</ins><span class="cx">
</span><del>- // 5. Append fulfillWrapper and rejectWrapper to the context object.
- thisObject->appendCallbacks(exec, fulfillWrapper, rejectWrapper);
</del><ins>+ // ii. Call QueueMicrotask(ExecutePromiseReaction, (rejectReaction, reason)).
+ globalObject->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<JSPromiseDeferred*>(deferred)->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->thisValue();
+
+ // 2. Return the result of calling Invoke(promise, "then", (undefined, onRejected)).
+ // NOTE: Invoke does not seem to be defined anywhere, so I am guessing here.
+ JSValue thenValue = promise.get(exec, exec->vm().propertyNames->then);
+ if (exec->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->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 "config.h"
+#include "JSPromiseReaction.h"
+
+#include "Error.h"
+#include "JSCJSValueInlines.h"
+#include "JSCellInlines.h"
+#include "JSGlobalObject.h"
+#include "JSPromiseDeferred.h"
+#include "Microtask.h"
+#include "SlotVisitorInlines.h"
+#include "StrongInlines.h"
+
+namespace JSC {
+
+class ExecutePromiseReactionMicrotask final : public Microtask {
+public:
+ ExecutePromiseReactionMicrotask(VM& vm, JSPromiseReaction* reaction, JSValue argument)
+ {
+ m_reaction.set(vm, reaction);
+ m_argument.set(vm, argument);
+ }
+
+ virtual ~ExecutePromiseReactionMicrotask()
+ {
+ }
+
+private:
+ virtual void run(ExecState*) override;
+
+ Strong<JSPromiseReaction> m_reaction;
+ Strong<Unknown> m_argument;
+};
+
+PassRefPtr<Microtask> createExecutePromiseReactionMicrotask(VM& 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->deferred();
+
+ // 2. Let 'handler' be reaction.[[Handler]].
+ JSValue handler = m_reaction->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->hadException()) {
+ JSValue exception = exec->exception();
+ exec->clearException();
+
+ JSValue deferredReject = deferred->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->promise())) {
+ // i. Let 'selfResolutionError' be a newly-created TypeError object.
+ JSObject* selfResolutionError = createTypeError(exec, ASCIILiteral("Resolve a promise with itself"));
+ // 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->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->hadException())
+ return;
+
+ // 9. If 'updateResult' is "not a thenable",
+ 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->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 = { "JSPromiseReaction", 0, 0, 0, CREATE_METHOD_TABLE(JSPromiseReaction) };
+
+JSPromiseReaction* JSPromiseReaction::create(VM& vm, JSPromiseDeferred* deferred, JSValue handler)
+{
+ JSPromiseReaction* promiseReaction = new (NotNull, allocateCell<JSPromiseReaction>(vm.heap)) JSPromiseReaction(vm);
+ promiseReaction->finishCreation(vm, deferred, handler);
+ return promiseReaction;
+}
+
+JSPromiseReaction::JSPromiseReaction(VM& vm)
+ : Base(vm, vm.promiseReactionStructure.get())
+{
+}
+
+void JSPromiseReaction::finishCreation(VM& 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& visitor)
+{
+ JSPromiseReaction* thisObject = jsCast<JSPromiseReaction*>(cell);
+ ASSERT_GC_OBJECT_INHERITS(thisObject, info());
+ COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag);
+ ASSERT(thisObject->structure()->typeInfo().overridesVisitChildren());
+
+ Base::visitChildren(thisObject, visitor);
+
+ visitor.append(&thisObject->m_deferred);
+ visitor.append(&thisObject->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 "JSCell.h"
+#include "Structure.h"
+
+namespace JSC {
+
+class JSPromiseDeferred;
+class Microtask;
+
+class JSPromiseReaction : public JSCell {
+public:
+ typedef JSCell Base;
+
+ static JSPromiseReaction* create(VM&, JSPromiseDeferred*, JSValue);
+ static Structure* createStructure(VM& 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&);
+ void finishCreation(VM&, JSPromiseDeferred*, JSValue);
+ static const unsigned StructureFlags = OverridesVisitChildren | Base::StructureFlags;
+ static void visitChildren(JSCell*, SlotVisitor&);
+
+ WriteBarrier<JSPromiseDeferred> m_deferred;
+ WriteBarrier<Unknown> m_handler;
+};
+
+PassRefPtr<Microtask> createExecutePromiseReactionMicrotask(VM&, 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 "config.h"
-#include "JSPromiseResolver.h"
-
-#if ENABLE(PROMISES)
-
-#include "JSCJSValueInlines.h"
-#include "JSCellInlines.h"
-#include "JSGlobalObject.h"
-#include "JSPromise.h"
-#include "JSPromiseCallback.h"
-#include "SlotVisitorInlines.h"
-#include "StructureInlines.h"
-
-namespace JSC {
-
-const ClassInfo JSPromiseResolver::s_info = { "PromiseResolver", &Base::s_info, 0, 0, CREATE_METHOD_TABLE(JSPromiseResolver) };
-
-JSPromiseResolver* JSPromiseResolver::create(VM& vm, Structure* structure, JSPromise* promise)
-{
- JSPromiseResolver* object = new (NotNull, allocateCell<JSPromiseResolver>(vm.heap)) JSPromiseResolver(vm, structure);
- object->finishCreation(vm, promise);
- return object;
-}
-
-Structure* JSPromiseResolver::createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype)
-{
- return Structure::create(vm, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), info());
-}
-
-JSPromiseResolver::JSPromiseResolver(VM& vm, Structure* structure)
- : JSNonFinalObject(vm, structure)
- , m_isResolved(false)
-{
-}
-
-void JSPromiseResolver::finishCreation(VM& vm, JSPromise* promise)
-{
- Base::finishCreation(vm);
- ASSERT(inherits(info()));
- m_promise.set(vm, this, promise);
-}
-
-void JSPromiseResolver::visitChildren(JSCell* cell, SlotVisitor& visitor)
-{
- JSPromiseResolver* thisObject = jsCast<JSPromiseResolver*>(cell);
- ASSERT_GC_OBJECT_INHERITS(thisObject, info());
- COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag);
- ASSERT(thisObject->structure()->typeInfo().overridesVisitChildren());
-
- Base::visitChildren(thisObject, visitor);
- visitor.append(&thisObject->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->setState(JSPromise::Fulfilled);
-
- // 3. Set promise's result to value.
- m_promise->setResult(exec->vm(), value);
-
- // 4. If the synchronous flag is set, process promise's fulfill callbacks with value.
- if (mode == ResolveSynchronously) {
- m_promise->processFulfillCallbacksWithValue(exec, value);
- return;
- }
-
- // 5. Otherwise, the synchronous flag is unset, queue a task to process promise's fulfill callbacks with value.
- m_promise->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->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->hadException()) {
- JSValue exception = exec->exception();
- exec->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& vm = exec->vm();
- // 4.1. Let fulfillCallback be a promise callback for the context object and its resolve algorithm.
- JSPromiseCallback* fulfillCallback = JSPromiseCallback::create(vm, globalObject()->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()->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->hadException()) {
- JSValue exception = exec->exception();
- exec->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->setState(JSPromise::Rejected);
-
- // 3. Set promise's result to value.
- m_promise->setResult(exec->vm(), value);
-
- // 4. If the synchronous flag is set, process promise's reject callbacks with value.
- if (mode == ResolveSynchronously) {
- m_promise->processRejectCallbacksWithValue(exec, value);
- return;
- }
-
- // 5. Otherwise, the synchronous flag is unset, queue a task to process promise's reject callbacks with value.
- m_promise->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 "JSObject.h"
-
-namespace JSC {
-
-class JSPromise;
-
-class JSPromiseResolver : public JSNonFinalObject {
-public:
- typedef JSNonFinalObject Base;
-
- static JSPromiseResolver* create(VM&, Structure*, JSPromise*);
- static Structure* createStructure(VM&, 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&, JSPromise*);
- static const unsigned StructureFlags = OverridesVisitChildren | JSObject::StructureFlags;
-
-private:
- JSPromiseResolver(VM&, Structure*);
-
- static void visitChildren(JSCell*, SlotVisitor&);
-
- WriteBarrier<JSPromise> 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 "config.h"
-#include "JSPromiseResolverConstructor.h"
-
-#if ENABLE(PROMISES)
-
-#include "JSCJSValueInlines.h"
-#include "JSCellInlines.h"
-#include "JSPromiseResolverPrototype.h"
-#include "Lookup.h"
-#include "StructureInlines.h"
-
-namespace JSC {
-
-STATIC_ASSERT_IS_TRIVIALLY_DESTRUCTIBLE(JSPromiseResolverConstructor);
-
-const ClassInfo JSPromiseResolverConstructor::s_info = { "Function", &Base::s_info, 0, 0, CREATE_METHOD_TABLE(JSPromiseResolverConstructor) };
-
-JSPromiseResolverConstructor* JSPromiseResolverConstructor::create(VM& vm, Structure* structure, JSPromiseResolverPrototype* promisePrototype)
-{
- JSPromiseResolverConstructor* constructor = new (NotNull, allocateCell<JSPromiseResolverConstructor>(vm.heap)) JSPromiseResolverConstructor(vm, structure);
- constructor->finishCreation(vm, promisePrototype);
- return constructor;
-}
-
-Structure* JSPromiseResolverConstructor::createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype)
-{
- return Structure::create(vm, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), info());
-}
-
-JSPromiseResolverConstructor::JSPromiseResolverConstructor(VM& vm, Structure* structure)
- : InternalFunction(vm, structure)
-{
-}
-
-void JSPromiseResolverConstructor::finishCreation(VM& vm, JSPromiseResolverPrototype* promiseResolverPrototype)
-{
- Base::finishCreation(vm, "PromiseResolver");
- putDirectWithoutTransition(vm, vm.propertyNames->prototype, promiseResolverPrototype, DontEnum | DontDelete | ReadOnly);
-}
-
-ConstructType JSPromiseResolverConstructor::getConstructData(JSCell*, ConstructData&)
-{
- return ConstructTypeNone;
-}
-
-CallType JSPromiseResolverConstructor::getCallData(JSCell*, CallData&)
-{
- 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 "InternalFunction.h"
-
-namespace JSC {
-
-class JSPromiseResolverPrototype;
-
-class JSPromiseResolverConstructor : public InternalFunction {
-public:
- typedef InternalFunction Base;
-
- static JSPromiseResolverConstructor* create(VM&, Structure*, JSPromiseResolverPrototype*);
- static Structure* createStructure(VM&, JSGlobalObject*, JSValue);
-
- DECLARE_INFO;
-
-protected:
- void finishCreation(VM&, JSPromiseResolverPrototype*);
- static const unsigned StructureFlags = InternalFunction::StructureFlags;
-
-private:
- JSPromiseResolverConstructor(VM&, Structure*);
- static ConstructType getConstructData(JSCell*, ConstructData&);
- static CallType getCallData(JSCell*, CallData&);
-};
-
-} // 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 "config.h"
-#include "JSPromiseResolverPrototype.h"
-
-#if ENABLE(PROMISES)
-
-#include "Error.h"
-#include "JSCJSValueInlines.h"
-#include "JSCellInlines.h"
-#include "JSPromiseResolver.h"
-#include "StructureInlines.h"
-
-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 "JSPromiseResolverPrototype.lut.h"
-
-namespace JSC {
-
-const ClassInfo JSPromiseResolverPrototype::s_info = { "PromiseResolverPrototype", &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& vm = exec->vm();
- JSPromiseResolverPrototype* object = new (NotNull, allocateCell<JSPromiseResolverPrototype>(vm.heap)) JSPromiseResolverPrototype(exec, structure);
- object->finishCreation(vm, structure);
- return object;
-}
-
-Structure* JSPromiseResolverPrototype::createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype)
-{
- return Structure::create(vm, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), info());
-}
-
-JSPromiseResolverPrototype::JSPromiseResolverPrototype(ExecState* exec, Structure* structure)
- : JSNonFinalObject(exec->vm(), structure)
-{
-}
-
-void JSPromiseResolverPrototype::finishCreation(VM& vm, Structure*)
-{
- Base::finishCreation(vm);
-}
-
-bool JSPromiseResolverPrototype::getOwnPropertySlot(JSObject* object, ExecState* exec, PropertyName propertyName, PropertySlot& slot)
-{
- return getStaticFunctionSlot<JSObject>(exec, ExecState::promiseResolverPrototypeTable(exec), jsCast<JSPromiseResolverPrototype*>(object), propertyName, slot);
-}
-
-EncodedJSValue JSC_HOST_CALL JSPromiseResolverPrototypeFuncFulfill(ExecState* exec)
-{
- JSPromiseResolver* thisObject = jsDynamicCast<JSPromiseResolver*>(exec->thisValue());
- if (!thisObject)
- return throwVMError(exec, createTypeError(exec, "Receiver of fulfill must be a PromiseResolver"));
-
- thisObject->fulfillIfNotResolved(exec, exec->argument(0));
- return JSValue::encode(jsUndefined());
-}
-
-EncodedJSValue JSC_HOST_CALL JSPromiseResolverPrototypeFuncResolve(ExecState* exec)
-{
- JSPromiseResolver* thisObject = jsDynamicCast<JSPromiseResolver*>(exec->thisValue());
- if (!thisObject)
- return throwVMError(exec, createTypeError(exec, "Receiver of resolve must be a PromiseResolver"));
-
- thisObject->resolveIfNotResolved(exec, exec->argument(0));
- return JSValue::encode(jsUndefined());
-}
-
-EncodedJSValue JSC_HOST_CALL JSPromiseResolverPrototypeFuncReject(ExecState* exec)
-{
- JSPromiseResolver* thisObject = jsDynamicCast<JSPromiseResolver*>(exec->thisValue());
- if (!thisObject)
- return throwVMError(exec, createTypeError(exec, "Receiver of reject must be a PromiseResolver"));
-
- thisObject->rejectIfNotResolved(exec, exec->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 "JSObject.h"
-
-namespace JSC {
-
-class JSPromiseResolverPrototype : public JSNonFinalObject {
-public:
- typedef JSNonFinalObject Base;
-
- static JSPromiseResolverPrototype* create(ExecState*, JSGlobalObject*, Structure*);
- static Structure* createStructure(VM&, JSGlobalObject*, JSValue);
-
- DECLARE_INFO;
-
-protected:
- void finishCreation(VM&, Structure*);
- static const unsigned StructureFlags = OverridesGetOwnPropertySlot | JSObject::StructureFlags;
-
-private:
- JSPromiseResolverPrototype(ExecState*, Structure*);
- static bool getOwnPropertySlot(JSObject*, ExecState*, PropertyName, PropertySlot&);
-};
-
-} // 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 <wtf/RefCounted.h>
+
+namespace JSC {
+
+class ExecState;
+
+class Microtask : public RefCounted<Microtask> {
+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 "JSLock.h"
</span><span class="cx"> #include "JSNameScope.h"
</span><span class="cx"> #include "JSNotAnObject.h"
</span><ins>+#include "JSPromiseDeferred.h"
+#include "JSPromiseReaction.h"
</ins><span class="cx"> #include "JSPropertyNameIterator.h"
</span><span class="cx"> #include "JSWithScope.h"
</span><span class="cx"> #include "Lexer.h"
</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->deleteTable();
</span><span class="cx"> promiseConstructorTable->deleteTable();
</span><del>- promiseResolverPrototypeTable->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<const HashTable> promisePrototypeTable;
</span><span class="cx"> const OwnPtr<const HashTable> promiseConstructorTable;
</span><del>- const OwnPtr<const HashTable> promiseResolverPrototypeTable;
</del><span class="cx"> #endif
</span><span class="cx">
</span><span class="cx"> Strong<Structure> structureStructure;
</span><span class="lines">@@ -283,6 +282,8 @@
</span><span class="cx"> Strong<Structure> propertyTableStructure;
</span><span class="cx"> Strong<Structure> mapDataStructure;
</span><span class="cx"> Strong<Structure> weakMapDataStructure;
</span><ins>+ Strong<Structure> promiseDeferredStructure;
+ Strong<Structure> promiseReactionStructure;
</ins><span class="cx"> Strong<JSCell> 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 <sam@webkit.org>
+
+ 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<String>):
+ (WebCore::DeferredWrapper::resolve<bool>):
+ (WebCore::char>>):
+ (WebCore::DeferredWrapper::reject<String>):
+ * 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 <timothy_horton@apple.com>
</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 <JavaScriptCore/JSPromiseDeferred.h>
+#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 <JavaScriptCore/JSPromiseResolver.h>
-#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 <JavaScriptCore/Microtask.h>
+#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 "ActiveDOMCallback.h"
</span><span class="cx"> #include "JSMainThreadExecState.h"
</span><span class="cx"> #include <heap/StrongInlines.h>
</span><ins>+#include <runtime/Microtask.h>
</ins><span class="cx"> #include <wtf/Ref.h>
</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<JSGlobalObjectCallback>, private ActiveDOMCallback {
</span><span class="cx"> public:
</span><del>- static PassRefPtr<JSGlobalObjectCallback> create(JSDOMGlobalObject* globalObject, GlobalObjectMethodTable::QueueTaskToEventLoopCallbackFunctionPtr functionPtr, PassRefPtr<TaskContext> taskContext)
</del><ins>+ static PassRefPtr<JSGlobalObjectCallback> create(JSDOMGlobalObject* globalObject, PassRefPtr<Microtask> 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->isDocument()) {
</span><span class="cx"> JSMainThreadExecState currentState(exec);
</span><del>- m_functionPtr(exec, m_taskContext.get());
</del><ins>+ m_task->run(exec);
</ins><span class="cx"> } else
</span><del>- m_functionPtr(exec, m_taskContext.get());
</del><ins>+ m_task->run(exec);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> private:
</span><del>- JSGlobalObjectCallback(JSDOMGlobalObject* globalObject, GlobalObjectMethodTable::QueueTaskToEventLoopCallbackFunctionPtr functionPtr, PassRefPtr<TaskContext> taskContext)
</del><ins>+ JSGlobalObjectCallback(JSDOMGlobalObject* globalObject, PassRefPtr<Microtask> task)
</ins><span class="cx"> : ActiveDOMCallback(globalObject->scriptExecutionContext())
</span><span class="cx"> , m_globalObject(globalObject->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<JSDOMGlobalObject> m_globalObject;
</span><del>- GlobalObjectMethodTable::QueueTaskToEventLoopCallbackFunctionPtr m_functionPtr;
- RefPtr<TaskContext> m_taskContext;
</del><ins>+ RefPtr<Microtask> m_task;
</ins><span class="cx"> };
</span><span class="cx">
</span><del>-JSGlobalObjectTask::JSGlobalObjectTask(JSDOMGlobalObject* globalObject, GlobalObjectMethodTable::QueueTaskToEventLoopCallbackFunctionPtr functionPtr, PassRefPtr<TaskContext> taskContext)
- : m_callback(JSGlobalObjectCallback::create(globalObject, functionPtr, taskContext))
</del><ins>+JSGlobalObjectTask::JSGlobalObjectTask(JSDOMGlobalObject* globalObject, PassRefPtr<Microtask> 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<JSGlobalObjectTask> create(JSDOMGlobalObject* globalObject, JSC::GlobalObjectMethodTable::QueueTaskToEventLoopCallbackFunctionPtr functionPtr, PassRefPtr<JSC::TaskContext> taskContext)
</del><ins>+ static PassOwnPtr<JSGlobalObjectTask> create(JSDOMGlobalObject* globalObject, PassRefPtr<JSC::Microtask> 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<JSC::TaskContext>);
</del><ins>+ JSGlobalObjectTask(JSDOMGlobalObject*, PassRefPtr<JSC::Microtask>);
</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 "config.h"
</span><span class="cx"> #include "JSDOMPromise.h"
</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->vm(), globalObject)
- , m_promise(globalObject->vm(), promise)
</del><ins>+DeferredWrapper::DeferredWrapper(ExecState* exec, JSDOMGlobalObject* globalObject)
+ : m_globalObject(exec->vm(), globalObject)
+ , m_deferred(exec->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->promise();
</ins><span class="cx"> }
</span><ins>+
+void DeferredWrapper::resolve(ExecState* exec, JSValue resolution)
+{
+ JSValue deferredResolve = m_deferred->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->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 "JSCryptoKey.h"
</span><span class="cx"> #include "JSCryptoKeyPair.h"
</span><span class="cx"> #include "JSDOMBinding.h"
</span><del>-#include <runtime/JSGlobalObject.h>
-#include <runtime/JSPromise.h>
-#include <runtime/JSPromiseResolver.h>
</del><span class="cx"> #include <heap/StrongInlines.h>
</span><ins>+#include <runtime/JSPromiseDeferred.h>
</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<class FulfillResultType>
- void fulfill(const FulfillResultType&);
</del><ins>+ template<class ResolveResultType>
+ void resolve(const ResolveResultType&);
</ins><span class="cx">
</span><span class="cx"> template<class RejectResultType>
</span><span class="cx"> void reject(const RejectResultType&);
</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<JSDOMGlobalObject> m_globalObject;
</span><del>- JSC::Strong<JSC::JSPromise> m_promise;
</del><ins>+ JSC::Strong<JSC::JSPromiseDeferred> m_deferred;
</ins><span class="cx"> };
</span><span class="cx">
</span><del>-template<class FulfillResultType>
-inline void PromiseWrapper::fulfill(const FulfillResultType& result)
</del><ins>+template<class ResolveResultType>
+inline void DeferredWrapper::resolve(const ResolveResultType& result)
</ins><span class="cx"> {
</span><span class="cx"> JSC::ExecState* exec = m_globalObject->globalExec();
</span><del>- m_promise->resolver()->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<class RejectResultType>
</span><del>-inline void PromiseWrapper::reject(const RejectResultType& result)
</del><ins>+inline void DeferredWrapper::reject(const RejectResultType& result)
</ins><span class="cx"> {
</span><span class="cx"> JSC::ExecState* exec = m_globalObject->globalExec();
</span><del>- m_promise->resolver()->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<>
</span><del>-inline void PromiseWrapper::reject(const std::nullptr_t&)
</del><ins>+inline void DeferredWrapper::reject(const std::nullptr_t&)
</ins><span class="cx"> {
</span><span class="cx"> JSC::ExecState* exec = m_globalObject->globalExec();
</span><del>- m_promise->resolver()->rejectIfNotResolved(exec, JSC::jsNull());
</del><ins>+ reject(exec, JSC::jsNull());
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> template<>
</span><del>-inline void PromiseWrapper::fulfill<String>(const String& result)
</del><ins>+inline void DeferredWrapper::resolve<String>(const String& result)
</ins><span class="cx"> {
</span><span class="cx"> JSC::ExecState* exec = m_globalObject->globalExec();
</span><del>- m_promise->resolver()->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<>
</span><del>-inline void PromiseWrapper::fulfill<bool>(const bool& result)
</del><ins>+inline void DeferredWrapper::resolve<bool>(const bool& result)
</ins><span class="cx"> {
</span><span class="cx"> JSC::ExecState* exec = m_globalObject->globalExec();
</span><del>- m_promise->resolver()->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<>
</span><del>-inline void PromiseWrapper::fulfill<Vector<unsigned char>>(const Vector<unsigned char>& result)
</del><ins>+inline void DeferredWrapper::resolve<Vector<unsigned char>>(const Vector<unsigned char>& result)
</ins><span class="cx"> {
</span><span class="cx"> JSC::ExecState* exec = m_globalObject->globalExec();
</span><span class="cx"> RefPtr<ArrayBuffer> buffer = ArrayBuffer::create(result.data(), result.size());
</span><del>- m_promise->resolver()->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<>
</span><del>-inline void PromiseWrapper::reject<String>(const String& result)
</del><ins>+inline void DeferredWrapper::reject<String>(const String& result)
</ins><span class="cx"> {
</span><span class="cx"> JSC::ExecState* exec = m_globalObject->globalExec();
</span><del>- m_promise->resolver()->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 "SecurityOrigin.h"
</span><span class="cx"> #include "Settings.h"
</span><span class="cx"> #include "WebCoreJSClientData.h"
</span><ins>+#include <runtime/Microtask.h>
</ins><span class="cx"> #include <wtf/MainThread.h>
</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->settings().javaScriptExperimentsEnabled();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void JSDOMWindowBase::queueTaskToEventLoop(const JSGlobalObject* object, GlobalObjectMethodTable::QueueTaskToEventLoopCallbackFunctionPtr functionPtr, PassRefPtr<TaskContext> taskContext)
</del><ins>+void JSDOMWindowBase::queueTaskToEventLoop(const JSGlobalObject* object, PassRefPtr<Microtask> task)
</ins><span class="cx"> {
</span><span class="cx"> const JSDOMWindowBase* thisObject = static_cast<const JSDOMWindowBase*>(object);
</span><del>- thisObject->scriptExecutionContext()->postTask(JSGlobalObjectTask::create((JSDOMWindowBase*)thisObject, functionPtr, taskContext));
</del><ins>+ thisObject->scriptExecutionContext()->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<JSC::TaskContext>);
</del><ins>+ static void queueTaskToEventLoop(const JSC::JSGlobalObject*, PassRefPtr<JSC::Microtask>);
</ins><span class="cx">
</span><span class="cx"> void printErrorMessage(const String&) 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->vm(), globalObject());
- PromiseWrapper promiseWrapper(globalObject(), promise);
- auto successCallback = [promiseWrapper](const Vector<uint8_t>& result) mutable {
- promiseWrapper.fulfill(result);
</del><ins>+
+ DeferredWrapper wrapper(exec, globalObject());
+ auto successCallback = [wrapper](const Vector<uint8_t>& 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->vm(), globalObject());
- PromiseWrapper promiseWrapper(globalObject(), promise);
- auto successCallback = [promiseWrapper](const Vector<uint8_t>& result) mutable {
- promiseWrapper.fulfill(result);
</del><ins>+ DeferredWrapper wrapper(exec, globalObject());
+ auto successCallback = [wrapper](const Vector<uint8_t>& 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->vm(), globalObject());
- PromiseWrapper promiseWrapper(globalObject(), promise);
- auto successCallback = [promiseWrapper](const Vector<uint8_t>& result) mutable {
- promiseWrapper.fulfill(result);
</del><ins>+ DeferredWrapper wrapper(exec, globalObject());
+ auto successCallback = [wrapper](const Vector<uint8_t>& 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->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->vm(), globalObject());
- PromiseWrapper promiseWrapper(globalObject(), promise);
- auto successCallback = [promiseWrapper](const Vector<uint8_t>& result) mutable {
- promiseWrapper.fulfill(result);
</del><ins>+ DeferredWrapper wrapper(exec, globalObject());
+ auto successCallback = [wrapper](const Vector<uint8_t>& 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->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->vm(), globalObject());
- PromiseWrapper promiseWrapper(globalObject(), promise);
- auto successCallback = [promiseWrapper](CryptoKey& result) mutable {
- promiseWrapper.fulfill(&result);
</del><ins>+ DeferredWrapper wrapper(exec, globalObject());
+ auto successCallback = [wrapper](CryptoKey& 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::importKey(exec, keyFormat, data, algorithm.release(), parameters.release(), extractable, keyUsages, std::move(successCallback), std::move(failureCallback));
</span><span class="cx"> if (exec->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& 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->vm(), globalObject());
- PromiseWrapper promiseWrapper(globalObject(), promise);
-
- auto successCallback = [promiseWrapper](const Vector<uint8_t>& result) mutable {
- promiseWrapper.fulfill(result);
</del><ins>+ DeferredWrapper wrapper(exec, globalObject());
+ auto successCallback = [wrapper](const Vector<uint8_t>& 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->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->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<uint8_t>& exportedKeyData) mutable {
- auto encryptSuccessCallback = [promiseWrapper](const Vector<uint8_t>& encryptedData) mutable {
- promiseWrapper.fulfill(encryptedData);
</del><ins>+ auto exportSuccessCallback = [keyFormat, algorithmPtr, parametersPtr, wrappingKey, wrapper](const Vector<uint8_t>& exportedKeyData) mutable {
+ auto encryptSuccessCallback = [wrapper](const Vector<uint8_t>& 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->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->vm(), globalObject());
- PromiseWrapper promiseWrapper(globalObject(), promise);
</del><ins>+ DeferredWrapper wrapper(exec, globalObject());
</ins><span class="cx"> Strong<JSDOMGlobalObject> domGlobalObject(exec->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<uint8_t>& result) mutable {
- auto importSuccessCallback = [promiseWrapper](CryptoKey& key) mutable {
- promiseWrapper.fulfill(&key);
</del><ins>+ auto decryptSuccessCallback = [domGlobalObject, keyFormat, unwrappedKeyAlgorithmPtr, unwrappedKeyAlgorithmParametersPtr, extractable, keyUsages, wrapper](const Vector<uint8_t>& result) mutable {
+ auto importSuccessCallback = [wrapper](CryptoKey& key) mutable {
+ wrapper.resolve(&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->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 "JSDedicatedWorkerGlobalScope.h"
</span><span class="cx"> #include "JSWorkerGlobalScope.h"
</span><span class="cx"> #include "WorkerGlobalScope.h"
</span><ins>+#include <runtime/Microtask.h>
</ins><span class="cx">
</span><span class="cx"> #if ENABLE(SHARED_WORKERS)
</span><span class="cx"> #include "JSSharedWorkerGlobalScope.h"
</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<TaskContext> taskContext)
</del><ins>+void JSWorkerGlobalScopeBase::queueTaskToEventLoop(const JSGlobalObject* object, PassRefPtr<Microtask> task)
</ins><span class="cx"> {
</span><span class="cx"> const JSWorkerGlobalScopeBase* thisObject = static_cast<const JSWorkerGlobalScopeBase*>(object);
</span><del>- thisObject->scriptExecutionContext()->postTask(JSGlobalObjectTask::create((JSDOMGlobalObject*)thisObject, functionPtr, taskContext));
</del><ins>+ thisObject->scriptExecutionContext()->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<JSC::TaskContext>);
</del><ins>+ static void queueTaskToEventLoop(const JSC::JSGlobalObject*, PassRefPtr<JSC::Microtask>);
</ins><span class="cx">
</span><span class="cx"> protected:
</span><span class="cx"> JSWorkerGlobalScopeBase(JSC::VM&, JSC::Structure*, PassRefPtr<WorkerGlobalScope>);
</span></span></pre>
</div>
</div>
</body>
</html>