| Index: test/inspector/debugger/step-into.js
|
| diff --git a/test/inspector/debugger/step-into.js b/test/inspector/debugger/step-into.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8d833e36ebca78490849bd9f316d4ce5ed3c0381
|
| --- /dev/null
|
| +++ b/test/inspector/debugger/step-into.js
|
| @@ -0,0 +1,269 @@
|
| +// 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.
|
| +
|
| +print('Checks possible break locations.');
|
| +
|
| +InspectorTest.addScript(`
|
| +
|
| +function testEval() {
|
| + eval('// comment only');
|
| + eval('// comment only\\n');
|
| +}
|
| +
|
| +// function without return
|
| +function procedure() {
|
| + var a = 1;
|
| + var b = 2;
|
| +}
|
| +
|
| +function testProcedure() {
|
| + procedure();
|
| +}
|
| +
|
| +function returnTrue() {
|
| + return true;
|
| +}
|
| +
|
| +function testIf() {
|
| + var a;
|
| + if (true) a = true;
|
| + if (!a) {
|
| + a = true;
|
| + } else {
|
| + a = false;
|
| + }
|
| + if (returnTrue()) {
|
| + a = false;
|
| + } else {
|
| + a = true;
|
| + }
|
| +}
|
| +
|
| +function emptyFunction() {}
|
| +
|
| +function testEmptyFunction() {
|
| + emptyFunction();
|
| +}
|
| +
|
| +function twoArguments(a1, a2) {
|
| +}
|
| +
|
| +function testCallArguments() {
|
| + twoArguments(emptyFunction(), emptyFunction());
|
| +}
|
| +
|
| +function testNested() {
|
| + function nested1() {
|
| + function nested2() {
|
| + function nested3() {
|
| + }
|
| + nested3();
|
| + return;
|
| + }
|
| + return nested2();
|
| + }
|
| + nested1();
|
| +}
|
| +
|
| +function return42() {
|
| + return 42;
|
| +}
|
| +
|
| +function returnCall() {
|
| + return return42();
|
| +}
|
| +
|
| +function testCallAtReturn() {
|
| + return returnCall();
|
| +}
|
| +
|
| +function returnObject() {
|
| + return ({ foo: () => 42 });
|
| +}
|
| +
|
| +function testWith() {
|
| + with (returnObject()) {
|
| + foo();
|
| + }
|
| + with({}) {
|
| + return;
|
| + }
|
| +}
|
| +
|
| +function testForLoop() {
|
| + for (var i = 0; i < 1; ++i) {}
|
| + for (var i = 0; i < 1; ++i) i;
|
| + for (var i = 0; i < 0; ++i) {}
|
| +}
|
| +
|
| +function testForOfLoop() {
|
| + for (var k of []) {}
|
| + for (var k of [1]) k;
|
| + var a = [];
|
| + for (var k of a) {}
|
| +}
|
| +
|
| +function testForInLoop() {
|
| + var o = {};
|
| + for (var k in o) {}
|
| + for (var k in o) k;
|
| + for (var k in { a:1 }) {}
|
| + for (var k in { a:1 }) k;
|
| +}
|
| +
|
| +function testSimpleExpressions() {
|
| + 1 + 2 + 3;
|
| + var a = 1;
|
| + ++a;
|
| + a--;
|
| +}
|
| +
|
| +Object.defineProperty(this, 'getterFoo', {
|
| + get: () => return42
|
| +});
|
| +
|
| +function testGetter() {
|
| + getterFoo();
|
| +}
|
| +
|
| +var obj = {
|
| + foo: () => ({
|
| + boo: () => return42
|
| + })
|
| +};
|
| +
|
| +function testChainedCalls() {
|
| + obj.foo().boo()();
|
| +}
|
| +
|
| +function testChainedWithNative() {
|
| + Array.from([1]).concat([2]).map(v => v * 2);
|
| +}
|
| +
|
| +function testPromiseThen() {
|
| + return Promise.resolve().then(v => v * 2).then(v => v * 2);
|
| +}
|
| +
|
| +function testSwitch() {
|
| + for (var i = 0; i < 3; ++i) {
|
| + switch(i) {
|
| + case 0: continue;
|
| + case 1: return42(); break;
|
| + default: return;
|
| + }
|
| + }
|
| +}
|
| +
|
| +function* idMaker() {
|
| + yield 1;
|
| + yield 2;
|
| + yield 3;
|
| +}
|
| +
|
| +function testGenerator() {
|
| + var gen = idMaker();
|
| + return42();
|
| + gen.next().value;
|
| + debugger;
|
| + gen.next().value;
|
| + return42();
|
| + gen.next().value;
|
| + return42();
|
| + gen.next().value;
|
| +}
|
| +
|
| +function throwException() {
|
| + throw new Error();
|
| +}
|
| +
|
| +function testCaughtException() {
|
| + try {
|
| + throwException()
|
| + } catch (e) {
|
| + return;
|
| + }
|
| +}
|
| +
|
| +function testClasses() {
|
| + class Cat {
|
| + constructor(name) {
|
| + this.name = name;
|
| + }
|
| +
|
| + speak() {
|
| + }
|
| + }
|
| + class Lion extends Cat {
|
| + constructor(name) {
|
| + super(name);
|
| + }
|
| +
|
| + speak() {
|
| + super.speak();
|
| + }
|
| + }
|
| + new Lion().speak();
|
| +}
|
| +
|
| +async function asyncFoo() {
|
| + await Promise.resolve().then(v => v * 2);
|
| + return42();
|
| + await asyncBoo();
|
| +}
|
| +
|
| +async function asyncBoo() {
|
| + await Promise.resolve();
|
| +}
|
| +
|
| +async function testAsyncAwait() {
|
| + await asyncFoo();
|
| + await awaitBoo();
|
| +}
|
| +
|
| +// TODO(kozyatinskiy): fix this.
|
| +async function testPromiseAsyncWithCode() {
|
| + var nextTest;
|
| + var testPromise = new Promise(resolve => nextTest = resolve);
|
| + async function main() {
|
| + async function foo() {
|
| + var resolveNested;
|
| + var p = new Promise(resolve => resolveNested = resolve);
|
| + setTimeout(resolveNested, 0);
|
| + await p;
|
| + }
|
| + setTimeout(returnCall, 0);
|
| + await foo();
|
| + await foo();
|
| + nextTest();
|
| + }
|
| + main();
|
| + return testPromise;
|
| +}
|
| +
|
| +//# sourceURL=test.js`);
|
| +
|
| +InspectorTest.setupScriptMap();
|
| +Protocol.Debugger.onPaused(message => {
|
| + var frames = message.params.callFrames;
|
| + if (frames.length === 1) {
|
| + Protocol.Debugger.stepInto();
|
| + return;
|
| + }
|
| + var scriptId = frames[0].location.scriptId;
|
| + InspectorTest.log('break at:');
|
| + InspectorTest.logCallFrameSourceLocation(frames[0])
|
| + .then(() => Protocol.Debugger.stepInto());
|
| +});
|
| +
|
| +Protocol.Debugger.enable();
|
| +Protocol.Runtime.evaluate({ expression: 'Object.keys(this).filter(name => name.indexOf(\'test\') === 0)', returnByValue: true })
|
| + .then(runTests);
|
| +
|
| +function runTests(message) {
|
| + var tests = message.result.result.value;
|
| + InspectorTest.runTestSuite(tests.map(test => eval(`(function ${test}(next) {
|
| + Protocol.Runtime.evaluate({ expression: 'debugger; ${test}()', awaitPromise: ${test.indexOf('testPromise') === 0}})
|
| + .then(next);
|
| + })`)));
|
| +}
|
|
|