debuggerNXHelper.js (2477B)
1 function testDebuggerHooksNX(dbg, g, testHook) { 2 function testDebuggerHook(hookName, trigger) { 3 var hit = false; 4 dbg[hookName] = () => { 5 hit = true; 6 dbg[hookName] = undefined; 7 testHook(hookName); 8 }; 9 trigger(); 10 assertEq(hit, true); 11 } 12 13 // Hooks on the Debugger instance itself. 14 testDebuggerHook("onDebuggerStatement", 15 () => { g.eval("debugger;"); }); 16 17 testDebuggerHook("onExceptionUnwind", 18 () => { 19 try { 20 g.eval("throw 42;"); 21 } catch (e) { 22 assertEq(e, 42); 23 } 24 }); 25 26 testDebuggerHook("onNewScript", 27 () => { g.eval("42"); }); 28 29 testDebuggerHook("onEnterFrame", 30 () => { g.eval("(() => {})()"); }); 31 32 testDebuggerHook("onNewGlobalObject", 33 () => { newGlobal(); }); 34 35 if ('Promise' in g) { 36 testDebuggerHook("onNewPromise", 37 () => { new g.Promise(()=>{}); }); 38 39 testDebuggerHook("onPromiseSettled", 40 () => { 41 var p = new g.Promise(()=>{}); 42 g.settlePromiseNow(p); 43 }); 44 } 45 46 // Hooks on frames. 47 var onStepHit = false; 48 var onPopHit = false; 49 dbg.onEnterFrame = (frame) => { 50 dbg.onEnterFrame = undefined; 51 52 frame.onStep = () => { 53 onStepHit = true; 54 frame.onStep = undefined; 55 testHook("onStep"); 56 }; 57 58 frame.onPop = () => { 59 onPopHit = true; 60 testHook("onPop"); 61 }; 62 }; 63 g.eval("42"); 64 assertEq(onStepHit, true); 65 66 // We can't actually assert that onPop executed because there's one test 67 // that tests NX works across a removeDebuggee/addDebuggee toggle. The 68 // removeDebuggee purges D.F instances, so the onPop won't be called even 69 // when the global is re-added. 70 //assertEq(onPopHit, true); 71 72 // Breakpoints 73 var breakpointHits = 0; 74 dbg.onDebuggerStatement = (frame) => { 75 dbg.onDebuggerStatement = undefined; 76 var line0 = frame.script.getOffsetLocation(frame.offset).lineNumber; 77 var offs = frame.script.getLineOffsets(line0 + 1); 78 for (let i = 0; i < offs.length; i++) { 79 frame.script.setBreakpoint(offs[i], { 80 hit: () => { 81 breakpointHits++; 82 testHook("breakpoint"); 83 } 84 }); 85 } 86 }; 87 g.eval(`debugger; 88 s = 'a'`); 89 assertEq(breakpointHits >= 1, true); 90 }