// Copyright 2017 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. let {session, contextGroup, Protocol} = InspectorTest.start('Tests evaluateOnCallFrame in module.'); var module1 = ` let a1 = 10; let g1 = 1; export let b1 = 11; export function foo1() { let c1 = 12; let g1 = 2; debugger; return a1 + b1 + c1 + g1; }; export default 42; `; var module2 = ` import { foo1 } from 'module1'; let a2 = 20; export * as mod1 from 'module1'; export let b2 = 21; export function foo2() { let c2 = 22; return foo1() + a2 + b2 + c2; }`; var module3 = ` import { foo2 } from 'module2'; let a3 = 30; export let b3 = 31; foo2(); `; var module4 = ` let a = 1; let b = 2; function bar() { let a = 0; (() => {a; debugger;})(); }; bar();`; var module5 = ` import { b2 } from 'module2'; export const a = 0; export let b = 0; export var c = 0; debugger; `; var module6 = ` let x = 5; (function() { let y = x; debugger; })() `; var module7 = ` let x = 5; debugger; `; InspectorTest.runAsyncTestSuite([ async function testTotal() { session.setupScriptMap(); Protocol.Debugger.enable(); contextGroup.addModule(module1, 'module1'); contextGroup.addModule(module2, 'module2'); contextGroup.addModule(module3, 'module3'); let {params:{callFrames}} = (await Protocol.Debugger.oncePaused()); session.logCallFrames(callFrames); for (let i = 0; i < callFrames.length; ++i) { await checkFrame(callFrames[i], i); } await Protocol.Debugger.resume(); }, async function testAnother() { contextGroup.addModule(module4, 'module4'); let {params:{callFrames}} = (await Protocol.Debugger.oncePaused()); session.logCallFrames(callFrames); for (let i = 0; i < callFrames.length; ++i) { await checkFrame(callFrames[i], i); } await Protocol.Debugger.resume(); }, async function testDifferentModuleVariables() { contextGroup.addModule(module5, 'module5'); let {params:{callFrames}} = (await Protocol.Debugger.oncePaused()); session.logCallFrames(callFrames); for (let i = 0; i < callFrames.length; ++i) { await checkFrame(callFrames[i], i); } await Protocol.Debugger.resume(); }, async function testCapturedLocalVariable() { contextGroup.addModule(module6, 'module6'); let {params:{callFrames}} = (await Protocol.Debugger.oncePaused()); session.logCallFrames(callFrames); for (let i = 0; i < callFrames.length; ++i) { await checkFrame(callFrames[i], i); } await Protocol.Debugger.resume(); }, async function testLocalVariableToplevel() { contextGroup.addModule(module7, 'module7'); let {params:{callFrames}} = (await Protocol.Debugger.oncePaused()); session.logCallFrames(callFrames); for (let i = 0; i < callFrames.length; ++i) { await checkFrame(callFrames[i], i); } await Protocol.Debugger.resume(); } ]); async function checkFrame(frame, i) { let variables = new Set(); variables.add('Array'); for (let scopeChain of frame.scopeChain) { if (scopeChain.name) { InspectorTest.log(scopeChain.type + ':' + scopeChain.name); } else { InspectorTest.log(scopeChain.type); } if (scopeChain.type === 'global') { InspectorTest.log('[\n ...\n]'); continue; } let {result: {result}} = await Protocol.Runtime.getProperties({ objectId: scopeChain.object.objectId}); result.forEach(v => variables.add(v.name)); result = result.map(v => v.value ? (v.name + ' = ' + v.value.description) : (v.name)); InspectorTest.logMessage(result); } InspectorTest.log(`Check variables in frame#${i}`); await session.logSourceLocation(frame.location); await checkVariables(frame.callFrameId, variables); } async function checkVariables(callFrameId, names) { for (let name of names) { var {result:{result}} = await Protocol.Debugger.evaluateOnCallFrame({ callFrameId, expression: name}); if (result.type === 'object' && result.subtype && result.subtype === 'error') { continue; } InspectorTest.log(name + ' = '); InspectorTest.logMessage(result); if (result.type === "number") { let updateExpression = '++' + name; InspectorTest.log('Evaluating: ' + updateExpression); await Protocol.Debugger.evaluateOnCallFrame({ callFrameId, expression: updateExpression}); var {result:{result}} = await Protocol.Debugger.evaluateOnCallFrame({ callFrameId, expression: name}); InspectorTest.log('updated ' + name + ' = '); InspectorTest.logMessage(result); updateExpression = '--' + name; InspectorTest.log('Evaluating: ' + updateExpression); await Protocol.Debugger.evaluateOnCallFrame({ callFrameId, expression: updateExpression}); } } }