• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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