Frame-asyncPromise-04.js (2613B)
1 // Test the promise property on async generator 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 yield 42; 11 debugger; 12 return 50 13 } 14 `); 15 16 let frame; 17 const promises = []; 18 dbg.onEnterFrame = function(f) { 19 frame = f; 20 promises.push(["enter", frame.asyncPromise]); 21 22 frame.onPop = function() { 23 promises.push(["leave", frame.asyncPromise]); 24 }; 25 26 dbg.onDebuggerStatement = function(f) { 27 assertEq(f, frame); 28 promises.push(["dbg", frame.asyncPromise]); 29 }; 30 }; 31 32 33 (async () => { 34 const it = g.f(); 35 36 // Promise is null until initial iteration. 37 assertEq(frame.asyncPromise, null); 38 39 assertEq(promises.length, 2); 40 assertEq(promises[0][0], "enter"); 41 assertEq(promises[0][1], null); 42 43 assertEq(promises[1][0], "leave"); 44 assertEq(promises[1][1], null); 45 46 47 const result1Promise = it.next(); 48 49 const frameIt1Promise = frame.asyncPromise; 50 assertEq(frameIt1Promise instanceof Debugger.Object, true); 51 assertEq(frameIt1Promise.unsafeDereference(), result1Promise); 52 53 assertEq(promises.length, 5); 54 assertEq(promises[2][0], "enter"); 55 assertEq(promises[2][1], frameIt1Promise); 56 57 assertEq(promises[3][0], "dbg"); 58 assertEq(promises[3][1], frameIt1Promise); 59 60 assertEq(promises[4][0], "leave"); 61 assertEq(promises[4][1], frameIt1Promise); 62 63 await result1Promise; 64 65 // Iteration step has fully completed, so promise state has been cleared. 66 assertEq(frame.asyncPromise, null); 67 68 assertEq(promises.length, 7); 69 assertEq(promises[5][0], "enter"); 70 assertEq(promises[5][1], frameIt1Promise); 71 72 assertEq(promises[6][0], "leave"); 73 assertEq(promises[6][1], frameIt1Promise); 74 75 76 const result2Promise = it.next(); 77 78 const frameIt2Promise = frame.asyncPromise; 79 assertEq(frameIt2Promise instanceof Debugger.Object, true); 80 assertEq(frameIt2Promise.unsafeDereference(), result2Promise); 81 assertEq(frameIt1Promise !== frameIt2Promise, true); 82 83 assertEq(promises.length, 10); 84 assertEq(promises[7][0], "enter"); 85 assertEq(promises[7][1], frameIt2Promise); 86 87 assertEq(promises[8][0], "dbg"); 88 assertEq(promises[8][1], frameIt2Promise); 89 90 assertEq(promises[9][0], "leave"); 91 assertEq(promises[9][1], frameIt2Promise); 92 93 await result2Promise; 94 95 // Frame has terminated, so accessing the property throws. 96 assertThrowsInstanceOf(() => frame.asyncPromise, Error); 97 98 assertEq(promises.length, 12); 99 assertEq(promises[10][0], "enter"); 100 assertEq(promises[10][1], frameIt2Promise); 101 102 assertEq(promises[11][0], "leave"); 103 assertEq(promises[11][1], frameIt2Promise); 104 })();