1'use strict'; 2const common = require('../common'); 3common.skipIfInspectorDisabled(); 4const { NodeInstance } = require('../common/inspector-helper.js'); 5const assert = require('assert'); 6 7const script = ` 8 'use strict'; 9 const assert = require('assert'); 10 const vm = require('vm'); 11 global.outer = true; 12 global.inner = false; 13 const context = vm.createContext({ 14 outer: false, 15 inner: true 16 }); 17 const script = new vm.Script("outer"); 18 debugger; 19 20 assert.strictEqual(script.runInThisContext(), true); 21 assert.strictEqual(script.runInContext(context), false); 22 debugger; 23 24 vm.runInContext('inner', context); 25 debugger; 26 27 vm.runInNewContext('Array', {}); 28 debugger; 29 30 vm.runInNewContext('debugger', {}); 31`; 32 33async function getContext(session) { 34 const created = 35 await session.waitForNotification('Runtime.executionContextCreated'); 36 return created.params.context; 37} 38 39async function checkScriptContext(session, context) { 40 const scriptParsed = 41 await session.waitForNotification('Debugger.scriptParsed'); 42 assert.strictEqual(scriptParsed.params.executionContextId, context.id); 43} 44 45async function runTests() { 46 const instance = new NodeInstance(['--inspect-brk=0', '--expose-internals'], 47 script); 48 const session = await instance.connectInspectorSession(); 49 await session.send([ 50 { 'method': 'Debugger.enable' }, 51 { 'method': 'Runtime.runIfWaitingForDebugger' }, 52 ]); 53 await session.waitForBreakOnLine(2, '[eval]'); 54 55 await session.send({ 'method': 'Runtime.enable' }); 56 await getContext(session); 57 await session.send({ 'method': 'Debugger.resume' }); 58 const childContext = await getContext(session); 59 await session.waitForBreakOnLine(11, '[eval]'); 60 61 console.error('[test]', 'Script is unbound'); 62 await session.send({ 'method': 'Debugger.resume' }); 63 await session.waitForBreakOnLine(15, '[eval]'); 64 65 console.error('[test]', 'vm.runInContext associates script with context'); 66 await session.send({ 'method': 'Debugger.resume' }); 67 await checkScriptContext(session, childContext); 68 await session.waitForBreakOnLine(18, '[eval]'); 69 70 console.error('[test]', 'vm.runInNewContext associates script with context'); 71 await session.send({ 'method': 'Debugger.resume' }); 72 const thirdContext = await getContext(session); 73 await checkScriptContext(session, thirdContext); 74 await session.waitForBreakOnLine(21, '[eval]'); 75 76 console.error('[test]', 'vm.runInNewContext can contain debugger statements'); 77 await session.send({ 'method': 'Debugger.resume' }); 78 const fourthContext = await getContext(session); 79 await checkScriptContext(session, fourthContext); 80 await session.waitForBreakOnLine(0, 'evalmachine.<anonymous>'); 81 82 await session.runToCompletion(); 83 assert.strictEqual((await instance.expectShutdown()).exitCode, 0); 84} 85 86runTests().then(common.mustCall()); 87