// Copyright 2018 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. const {session, contextGroup, Protocol} = InspectorTest.start(`Test for Debugger.evaluateOnCallFrame`); Protocol.Debugger.enable(); InspectorTest.runAsyncTestSuite([ async function testFoo() { contextGroup.addInlineScript(` function foo(x) { var a; y = 0; a = x; y = 0; } `, 'foo.js'); InspectorTest.log('Set breakpoint before a = x.'); let {result:{breakpointId}} = await Protocol.Debugger.setBreakpointByUrl({ lineNumber: 14, url: 'foo.js' }); await evaluateOnDump('foo()', ['x', 'a']); await evaluateOnDump('foo("Hello, world!")', ['x', 'a']); await Protocol.Debugger.removeBreakpoint({ breakpointId }); InspectorTest.log('Set breakpoint after a = x.'); await Protocol.Debugger.setBreakpointByUrl({ lineNumber: 16, url: 'foo.js' }); await evaluateOnDump('foo("Hello, world!")', ['x', 'a']); }, async function testZoo() { contextGroup.addInlineScript(` x = undefined; function zoo(t) { var a = x; Object.prototype.x = 42; x = t; y = 0; delete Object.prototype.x; x = a; } `, 'zoo.js'); InspectorTest.log('Set breakpoint before y = 0.'); await Protocol.Debugger.setBreakpointByUrl({ lineNumber: 47, url: 'zoo.js' }); await evaluateOnDump('zoo("Hello, world!")', ['x', 'a']); }, async function testBar() { contextGroup.addInlineScript(` y = 0; x = 'Goodbye, world!'; function bar(x, b) { var a; function barbar() { y = 0; x = b; a = x; } barbar(); y = 0; } `, 'bar.js'); InspectorTest.log('Set breakpoint before a = x.'); let {result:{breakpointId}} = await Protocol.Debugger.setBreakpointByUrl({ lineNumber: 68, url: 'bar.js' }); await evaluateOnDump('bar(undefined, "Hello, world!")', ['x', 'a']); await Protocol.Debugger.removeBreakpoint({ breakpointId }); InspectorTest.log('Set breakpoint after a = x.'); await Protocol.Debugger.setBreakpointByUrl({ lineNumber: 73, url: 'bar.js' }); await evaluateOnDump('bar(undefined, "Hello, world!")', ['x', 'a']); } ]); async function evaluateOnDump(expression, variables) { InspectorTest.log(expression); Protocol.Runtime.evaluate({ expression: `${expression}//# sourceURL=expr.js` }); const {params:{callFrames:[{callFrameId}]}} = await Protocol.Debugger.oncePaused(); for (const variable of variables) { InspectorTest.log(`${variable} = `); const {result:{result}} = await Protocol.Debugger.evaluateOnCallFrame({ callFrameId, expression: variable }); InspectorTest.logMessage(result); } await Protocol.Debugger.resume(); InspectorTest.log(''); }