Frame-asyncPromise-01.js (1688B)
1 // Testing the promise property on async function frames. 2 3 load(libdir + 'asserts.js'); 4 5 var g = newGlobal({ newCompartment: true }); 6 var dbg = Debugger(g); 7 g.eval(` 8 async function f() { 9 debugger; 10 await Promise.resolve(); 11 debugger; 12 } 13 `); 14 15 let frame; 16 const promises = []; 17 dbg.onEnterFrame = function(f) { 18 frame = f; 19 promises.push(["start", frame.asyncPromise]); 20 21 dbg.onEnterFrame = function(f) { 22 assertEq(f, frame); 23 promises.push(["resume", frame.asyncPromise]); 24 }; 25 26 frame.onPop = function() { 27 promises.push(["suspend", frame.asyncPromise]); 28 29 frame.onPop = function() { 30 promises.push(["finish", frame.asyncPromise]); 31 }; 32 }; 33 34 dbg.onDebuggerStatement = function(f) { 35 assertEq(f, frame); 36 promises.push(["dbg", frame.asyncPromise]); 37 }; 38 }; 39 40 (async () => { 41 const resultPromise = g.f(); 42 43 const framePromise = frame.asyncPromise; 44 assertEq(framePromise instanceof Debugger.Object, true); 45 assertEq(framePromise.unsafeDereference(), resultPromise); 46 47 assertEq(promises.length, 3); 48 assertEq(promises[0][0], "start"); 49 assertEq(promises[0][1], null); 50 51 assertEq(promises[1][0], "dbg"); 52 assertEq(promises[1][1], framePromise); 53 54 assertEq(promises[2][0], "suspend"); 55 assertEq(promises[2][1], framePromise); 56 57 await resultPromise; 58 59 // Frame has terminated, so accessing the property throws. 60 assertThrowsInstanceOf(() => frame.asyncPromise, Error); 61 62 assertEq(promises.length, 6); 63 64 assertEq(promises[3][0], "resume"); 65 assertEq(promises[3][1], framePromise); 66 67 assertEq(promises[4][0], "dbg"); 68 assertEq(promises[4][1], framePromise); 69 70 assertEq(promises[5][0], "finish"); 71 assertEq(promises[5][1], framePromise); 72 })();