| <!DOCTYPE html> |
| <html> |
| <head> |
| <script src="../../../http/tests/inspector/resources/inspector-test.js"></script> |
| <script src="../resources/log-pause-location.js"></script> |
| <script> |
| function a() { |
| return 1; |
| } |
| |
| function entryDebuggerStatement() { |
| debugger; |
| debugger; |
| debugger; |
| } |
| |
| function entryBlockStatement() { |
| debugger; |
| { |
| let x = 1; |
| } |
| } |
| |
| function entryWithStatement() { |
| let o = {x:1, y:2}; |
| debugger; |
| with (o) |
| a(); |
| with (o) { |
| a(); |
| } |
| } |
| |
| function entryLabeledStatement() { |
| let arr = []; |
| debugger; |
| label: |
| { |
| arr.push(1); |
| break label; |
| arr.push(2); |
| } |
| } |
| |
| function entryLabelBreakLoop() { |
| debugger; |
| outer: |
| for (let i = 0; ; ++i) { |
| for (let j = 0; j < 2; ++j) { |
| if (i === 1 && j === 0) |
| break outer; |
| a(); |
| } |
| } |
| } |
| |
| function entryVariableDeclaration() { |
| debugger; |
| var a = 1, |
| x = 1; |
| let b = 2, |
| y = 2; |
| const c = 3, |
| z = 3; |
| } |
| |
| function entryDestructuring() { |
| var o = {x:1, y:2}; |
| var arr = [1, 2]; |
| debugger; |
| var {x, y} = o; |
| var [w, z] = arr; |
| } |
| |
| function entryIfWithDotExpression() { |
| var o = {condition: true}; |
| debugger; |
| if (o.condition) |
| a(); |
| } |
| |
| function entryIfWithBracketExpression() { |
| var o = {condition: true}; |
| debugger; |
| if (o["condition"]) |
| a(); |
| } |
| |
| function entryIfWithTaggedTemplate() { |
| debugger; |
| if (String.raw`test`) |
| a(); |
| } |
| |
| |
| // FIXME: Not Yet Tested |
| // - Iterators |
| // - Spread (...) |
| // - Generators (function*, yield) |
| // - Import / Export statements |
| |
| // --------- |
| |
| function test() |
| { |
| let suite = InspectorTest.createAsyncSuite("Debugger.stepping.misc"); |
| |
| window.initializeSteppingTestSuite(suite); |
| |
| addSteppingTestCase({ |
| name: "Debugger.stepping.DebuggerStatement", |
| description: "Should be able to step through debugger statements.", |
| expression: "setTimeout(entryDebuggerStatement)", |
| steps: [ |
| "over", |
| "in", // debugger |
| "over", // debugger |
| "resume", |
| ] |
| }); |
| |
| addSteppingTestCase({ |
| name: "Debugger.stepping.BlockStatement", |
| description: "Should be able to step through debugger statements.", |
| expression: "setTimeout(entryBlockStatement)", |
| steps: [ |
| "over", |
| "over", // let x = 1 |
| "resume", |
| ] |
| }); |
| |
| addSteppingTestCase({ |
| name: "Debugger.stepping.WithStatement", |
| description: "Should be able to step through with statements.", |
| expression: "setTimeout(entryWithStatement)", |
| steps: [ |
| "over", |
| "over", // with (o) |
| "over", // a() |
| "over", // with (o) |
| "over", // a() |
| "resume", |
| ] |
| }); |
| |
| addSteppingTestCase({ |
| name: "Debugger.stepping.LabeledStatement", |
| description: "Should be able to step through label statements.", |
| expression: "setTimeout(entryLabeledStatement)", |
| steps: [ |
| "over", |
| "over", // arr.push(1) |
| "over", // break outer |
| "resume", |
| ] |
| }); |
| |
| addSteppingTestCase({ |
| name: "Debugger.stepping.LabelBreakLoop", |
| description: "Should be able to step through loops with break label.", |
| expression: "setTimeout(entryLabelBreakLoop)", |
| steps: [ |
| "over", |
| "in", // let i = 0 - before inner for |
| "in", // let j = 0 - before condition |
| "in", // (j < 2) [j=0] - before if |
| "over", // if [false] - before a() |
| "over", // a(); |
| "over", // ++j |
| "over", // (j < 2) [j=1] - before if |
| "over", // if [false] - before a() |
| "over", // a(); |
| "over", // ++j |
| "over", // (j < 2) [j=2] - before ++i |
| "in", // ++i - before let j = 0 |
| "in", // j = 0 - before condition |
| "in", // (j < 2) - before if |
| "in", // if [true] - before break |
| "in", // break - leaving entry |
| "resume", |
| ] |
| }); |
| |
| addSteppingTestCase({ |
| name: "Debugger.stepping.VariableDeclaration", |
| description: "Should be able to step through variable declarations.", |
| expression: "setTimeout(entryVariableDeclaration)", |
| steps: [ |
| "over", |
| // FIXME: Opportunity to pause at assignment expressions. |
| "in", // a = 1, x = 1 |
| "in", // b = 2, y = 2 |
| "in", // c = 3, z = 3 |
| "resume", |
| ] |
| }); |
| |
| addSteppingTestCase({ |
| name: "Debugger.stepping.Destructuring", |
| description: "Should be able to step through destructuring assignment.", |
| expression: "setTimeout(entryDestructuring)", |
| steps: [ |
| "over", |
| "in", // var {x, y} = o; |
| "in", // var [w, z] = arr |
| "resume", |
| ] |
| }); |
| |
| addSteppingTestCase({ |
| name: "Debugger.stepping.IfWithDotExpression", |
| description: "Should step to the entire expression, not the dot.", |
| expression: "setTimeout(entryIfWithDotExpression)", |
| steps: [ |
| "over", |
| "in", // o.condition |
| "over", // a |
| "resume", |
| ] |
| }); |
| |
| addSteppingTestCase({ |
| name: "Debugger.stepping.IfWithBracketExpression", |
| description: "Should step to the entire expression, not the bracket dot.", |
| expression: "setTimeout(entryIfWithBracketExpression)", |
| steps: [ |
| "over", |
| "in", // o["condition"] |
| "over", // a |
| "resume", |
| ] |
| }); |
| |
| addSteppingTestCase({ |
| name: "Debugger.stepping.IfWithTaggedTemplate", |
| description: "Should step to the entire expression, not the template.", |
| expression: "setTimeout(entryIfWithTaggedTemplate)", |
| steps: [ |
| "over", |
| "in", // String.raw`test` |
| "over", // a |
| "resume", |
| ] |
| }); |
| |
| loadMainPageContent().then(() => { |
| suite.runTestCasesAndFinish(); |
| }); |
| } |
| </script> |
| </head> |
| <body onload="runTest()"> |
| <p>Checking pause locations when stepping in, out, and over misc statements.</p> |
| </body> |
| </html> |