| // 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; |
| } |