// 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. let {session, contextGroup, Protocol} = InspectorTest.start('Check different set breakpoint cases.'); contextGroup.addScript( `function f() { a=1; }; function g() { // Comment. f(); } eval('function h(){}'); eval('function sourceUrlFunc() { a = 2; }\\n//# sourceURL=sourceUrlScript');`); (async function test() { session.setupScriptMap(); Protocol.Debugger.enable(); { InspectorTest.log('Set breakpoint at function g..'); const location = await functionLocation('g'); const {result} = await Protocol.Debugger.setBreakpoint({location}); InspectorTest.log('Breakpoint set at:'); await session.logSourceLocation(result.actualLocation); InspectorTest.log('Call g..'); Protocol.Runtime.evaluate({expression: 'g()'}); const {params:{ callFrames:[topFrame], hitBreakpoints }} = await Protocol.Debugger.oncePaused(); InspectorTest.log('Breakpoint hit at:'); await session.logSourceLocation(topFrame.location); const hitBreakpoint = hitBreakpoints[0] === result.breakpointId; InspectorTest.log(`hitBreakpoints contains breakpoint: ${hitBreakpoint}\n`); } { InspectorTest.log('Set breakpoint at function f when we on pause..'); const {result} = await Protocol.Debugger.setBreakpoint({ location: await functionLocation('f') }); InspectorTest.log('Breakpoint set at:'); await session.logSourceLocation(result.actualLocation); InspectorTest.log('Resume..'); Protocol.Debugger.resume(); const {params:{ callFrames:[topFrame], hitBreakpoints }} = await Protocol.Debugger.oncePaused(); InspectorTest.log('Breakpoint hit at:'); await session.logSourceLocation(topFrame.location); const hitBreakpoint = hitBreakpoints[0] === result.breakpointId; InspectorTest.log(`hitBreakpoints contains breakpoint: ${hitBreakpoint}\n`); await Protocol.Debugger.resume(); } { InspectorTest.log('Set breakpoint by url at sourceUrlFunc..'); const {lineNumber, columnNumber} = await functionLocation('sourceUrlFunc'); const {result} = await Protocol.Debugger.setBreakpointByUrl({ url: 'sourceUrlScript', lineNumber, columnNumber }); InspectorTest.log('Breakpoint set at:'); await session.logSourceLocation(result.locations[0]); InspectorTest.log('Call sourceUrlFunc..'); Protocol.Runtime.evaluate({expression: 'sourceUrlFunc()'}); const {params:{ callFrames:[topFrame], hitBreakpoints }} = await Protocol.Debugger.oncePaused(); InspectorTest.log('Breakpoint hit at:'); await session.logSourceLocation(topFrame.location); const hitBreakpoint = hitBreakpoints[0] === result.breakpointId; InspectorTest.log(`hitBreakpoints contains breakpoint: ${hitBreakpoint}\n`); await Protocol.Debugger.resume(); } { InspectorTest.log( 'Set breakpoint at empty line by url in top level function..'); const {result:{breakpointId}} = await Protocol.Debugger.setBreakpointByUrl({ url: 'test-script', lineNumber: 4, columnNumber: 0 }); Protocol.Runtime.evaluate({ expression: `//# sourceURL=test-script\nfunction i1(){};\n\n\n\n\nfunction i2(){}\n// last line` }); const [{ params:{location} }, { params:{ callFrames:[topFrame], hitBreakpoints } }] = await Promise.all([ Protocol.Debugger.onceBreakpointResolved(), Protocol.Debugger.oncePaused()]); InspectorTest.log('Breakpoint resolved at:'); await session.logSourceLocation(location); InspectorTest.log('Breakpoint hit at:'); await session.logSourceLocation(topFrame.location); const hitBreakpoint = hitBreakpoints[0] === breakpointId; InspectorTest.log(`hitBreakpoints contains breakpoint: ${hitBreakpoint}\n`); } await Protocol.Debugger.disable(); InspectorTest.completeTest(); })(); async function functionLocation(name) { const {result:{result}} = await Protocol.Runtime.evaluate({expression: name}); const {result:{internalProperties}} = await Protocol.Runtime.getProperties({ objectId: result.objectId }); const {value:{value}} = internalProperties.find( prop => prop.name === '[[FunctionLocation]]'); return value; }