blob: 196d29aeaed11dc7c5ee3a1e3d1cf7610d29df55 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
// 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);
|