Source code

Revision control

Copy as Markdown

Other Tools

// Promise.race(...) may add a dummy PromiseReaction which is only used for the
// debugger.
//
// See BlockOnPromise when called from PerformPromiseRace for when this dummy
// reaction is created.
var g = newGlobal({newCompartment: true});
var dbg = new Debugger();
var gw = dbg.addDebuggee(g);
function test(withFastPath) {
g.eval(`
function newPromiseCapability() {
var resolve, reject, promise = new Promise(function(r1, r2) {
resolve = r1;
reject = r2;
});
return {promise, resolve, reject};
}
var {promise: alwaysPending} = newPromiseCapability();
if (!${withFastPath}) {
// Disable the BlockOnPromise fast path by giving |alwaysPending| a
// non-default "then" function property. This will ensure the dummy
// reaction is created.
alwaysPending.then = function() {};
}
var result = Promise.race([alwaysPending]);
`);
var alwaysPending = gw.makeDebuggeeValue(g.alwaysPending);
var result = gw.makeDebuggeeValue(g.result);
assertEq(alwaysPending.promiseDependentPromises.length, 1);
assertEq(alwaysPending.promiseDependentPromises[0], result);
assertEq(result.promiseDependentPromises.length, 0);
}
// No dummy reaction created when the fast path is taken.
test(true);
// Dummy reaction is created when we can't take the fast path.
test(false);