079c0fd8f6
It is preparation step for step-into-worker. There are few changes: - added breakOnAsyncCall flag for Debugger.stepInto. When flag is set and async task is scheduled before step-into finished, we pause execution with additional Debugger.paused event. This event contains additional scheduledAsyncTaskId field. - added Debugger.pauseOnAsyncTask. This method will pause execution as soon as given async task is started. This mechanism is replacement for Debugger.scheduleStepIntoAsync which can not be used between multiple targets. As result we can split async task scheduling in one target and requesting break for this async task running in another target. R=pfeldman@chromium.org Bug: chromium:778796 Cq-Include-Trybots: master.tryserver.blink:linux_trusty_blink_rel Change-Id: I77be0c880d91253d333c54a23a4c084e7b8549e9 Reviewed-on: https://chromium-review.googlesource.com/750071 Reviewed-by: Jakob Gruber <jgruber@chromium.org> Reviewed-by: Pavel Feldman <pfeldman@chromium.org> Commit-Queue: Aleksey Kozyatinskiy <kozyatinskiy@chromium.org> Cr-Commit-Position: refs/heads/master@{#49127}
183 lines
6.2 KiB
JavaScript
183 lines
6.2 KiB
JavaScript
// 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.
|
|
|
|
let {session, contextGroup, Protocol} = InspectorTest.start('Checks Debugger.scheduleStepIntoAsync.');
|
|
|
|
contextGroup.addScript(`
|
|
function testNoScheduledTask() {
|
|
debugger;
|
|
return 42;
|
|
}
|
|
|
|
function testSimple() {
|
|
debugger;
|
|
Promise.resolve().then(v => v * 2);
|
|
}
|
|
|
|
function testNotResolvedPromise() {
|
|
var resolveCallback;
|
|
var p = new Promise(resolve => resolveCallback = resolve);
|
|
debugger;
|
|
p.then(v => v * 2);
|
|
resolveCallback();
|
|
}
|
|
|
|
function testTwoAsyncTasks() {
|
|
debugger;
|
|
Promise.resolve().then(v => v * 2);
|
|
Promise.resolve().then(v => v * 4);
|
|
}
|
|
|
|
function testTwoAsyncTasksWithBreak() {
|
|
debugger;
|
|
Promise.resolve().then(v => v * 2);
|
|
debugger;
|
|
Promise.resolve().then(v => v * 4);
|
|
}
|
|
|
|
function testPromiseAll() {
|
|
debugger;
|
|
Promise.all([ Promise.resolve(), Promise.resolve() ]).then(v => v * 2);
|
|
}
|
|
|
|
function testBlackboxedCreatePromise() {
|
|
debugger;
|
|
createPromise().then(v => v * 2);
|
|
}
|
|
//# sourceURL=test.js`);
|
|
|
|
contextGroup.addScript(`
|
|
|
|
function createPromise() {
|
|
return Promise.resolve().then(v => v * 3).then(v => v * 4);
|
|
}
|
|
|
|
//# sourceURL=framework.js`)
|
|
|
|
session.setupScriptMap();
|
|
|
|
Protocol.Debugger.enable();
|
|
InspectorTest.runAsyncTestSuite([
|
|
async function testScheduleErrors() {
|
|
Protocol.Runtime.evaluate({ expression: 'testNoScheduledTask()' });
|
|
await waitPauseAndDumpLocation();
|
|
Protocol.Debugger.stepInto({breakOnAsyncCall: true});
|
|
await waitPauseAndDumpLocation();
|
|
Protocol.Debugger.stepInto({breakOnAsyncCall: true});
|
|
await waitPauseAndDumpLocation();
|
|
await Protocol.Debugger.resume();
|
|
},
|
|
|
|
async function testSimple() {
|
|
Protocol.Runtime.evaluate({ expression: 'testSimple()' });
|
|
await waitPauseAndDumpLocation();
|
|
Protocol.Debugger.stepOver();
|
|
await waitPauseAndDumpLocation();
|
|
Protocol.Debugger.stepInto({breakOnAsyncCall: true});
|
|
let scheduledAsyncTaskId = await waitPauseAndDumpLocation();
|
|
Protocol.Debugger.pauseOnAsyncTask({asyncTaskId: scheduledAsyncTaskId});
|
|
Protocol.Debugger.resume();
|
|
await waitPauseAndDumpLocation();
|
|
await Protocol.Debugger.resume();
|
|
},
|
|
|
|
async function testNotResolvedPromise() {
|
|
Protocol.Runtime.evaluate({ expression: 'testNotResolvedPromise()' });
|
|
await waitPauseAndDumpLocation();
|
|
Protocol.Debugger.stepOver();
|
|
await waitPauseAndDumpLocation();
|
|
Protocol.Debugger.stepInto({breakOnAsyncCall: true});
|
|
let scheduledAsyncTaskId = await waitPauseAndDumpLocation();
|
|
Protocol.Debugger.pauseOnAsyncTask({asyncTaskId: scheduledAsyncTaskId});
|
|
Protocol.Debugger.resume();
|
|
await waitPauseAndDumpLocation();
|
|
await Protocol.Debugger.resume();
|
|
},
|
|
|
|
async function testTwoAsyncTasks() {
|
|
Protocol.Runtime.evaluate({ expression: 'testTwoAsyncTasks()' });
|
|
await waitPauseAndDumpLocation();
|
|
Protocol.Debugger.stepInto();
|
|
await waitPauseAndDumpLocation();
|
|
Protocol.Debugger.stepInto({breakOnAsyncCall: true});
|
|
let scheduledAsyncTaskId = await waitPauseAndDumpLocation();
|
|
Protocol.Debugger.pauseOnAsyncTask({asyncTaskId: scheduledAsyncTaskId});
|
|
Protocol.Debugger.resume();
|
|
await waitPauseAndDumpLocation();
|
|
await Protocol.Debugger.resume();
|
|
},
|
|
|
|
async function testTwoTasksAndGoToSecond() {
|
|
Protocol.Runtime.evaluate({ expression: 'testTwoAsyncTasks()' });
|
|
await waitPauseAndDumpLocation();
|
|
Protocol.Debugger.stepOver();
|
|
await waitPauseAndDumpLocation();
|
|
Protocol.Debugger.stepOver();
|
|
await waitPauseAndDumpLocation();
|
|
Protocol.Debugger.stepInto({breakOnAsyncCall: true});
|
|
let scheduledAsyncTaskId = await waitPauseAndDumpLocation();
|
|
Protocol.Debugger.pauseOnAsyncTask({asyncTaskId: scheduledAsyncTaskId});
|
|
Protocol.Debugger.resume();
|
|
await waitPauseAndDumpLocation();
|
|
await Protocol.Debugger.resume();
|
|
},
|
|
|
|
async function testTwoAsyncTasksWithBreak() {
|
|
Protocol.Runtime.evaluate({ expression: 'testTwoAsyncTasksWithBreak()' });
|
|
await waitPauseAndDumpLocation();
|
|
Protocol.Debugger.stepOver();
|
|
await waitPauseAndDumpLocation();
|
|
Protocol.Debugger.stepInto({breakOnAsyncCall: true});
|
|
let scheduledAsyncTaskId = await waitPauseAndDumpLocation();
|
|
Protocol.Debugger.pauseOnAsyncTask({asyncTaskId: scheduledAsyncTaskId});
|
|
Protocol.Debugger.resume();
|
|
await waitPauseAndDumpLocation();
|
|
Protocol.Debugger.stepOver();
|
|
await waitPauseAndDumpLocation();
|
|
Protocol.Debugger.stepInto({breakOnAsyncCall: true});
|
|
scheduledAsyncTaskId = await waitPauseAndDumpLocation();
|
|
Protocol.Debugger.pauseOnAsyncTask({asyncTaskId: scheduledAsyncTaskId});
|
|
Protocol.Debugger.resume();
|
|
await waitPauseAndDumpLocation();
|
|
await Protocol.Debugger.resume();
|
|
},
|
|
|
|
async function testPromiseAll() {
|
|
Protocol.Runtime.evaluate({ expression: 'testPromiseAll()' });
|
|
await waitPauseAndDumpLocation();
|
|
Protocol.Debugger.stepOver();
|
|
await waitPauseAndDumpLocation();
|
|
Protocol.Debugger.stepInto({breakOnAsyncCall: true});
|
|
let scheduledAsyncTaskId = await waitPauseAndDumpLocation();
|
|
Protocol.Debugger.pauseOnAsyncTask({asyncTaskId: scheduledAsyncTaskId});
|
|
Protocol.Debugger.resume();
|
|
await waitPauseAndDumpLocation();
|
|
await Protocol.Debugger.resume();
|
|
},
|
|
|
|
async function testWithBlackboxedCode() {
|
|
Protocol.Runtime.evaluate({ expression: 'testBlackboxedCreatePromise()' });
|
|
await waitPauseAndDumpLocation();
|
|
Protocol.Debugger.stepOver();
|
|
await waitPauseAndDumpLocation();
|
|
await Protocol.Debugger.setBlackboxPatterns({patterns: ['framework\.js'] });
|
|
Protocol.Debugger.stepInto({breakOnAsyncCall: true});
|
|
let scheduledAsyncTaskId = await waitPauseAndDumpLocation();
|
|
Protocol.Debugger.pauseOnAsyncTask({asyncTaskId: scheduledAsyncTaskId});
|
|
Protocol.Debugger.resume();
|
|
await waitPauseAndDumpLocation();
|
|
await Protocol.Debugger.resume();
|
|
}
|
|
]);
|
|
|
|
async function waitPauseAndDumpLocation() {
|
|
var {params:{callFrames, scheduledAsyncTaskId}} = await Protocol.Debugger.oncePaused();
|
|
InspectorTest.log('paused at:');
|
|
await session.logSourceLocation(callFrames[0].location);
|
|
if (scheduledAsyncTaskId) {
|
|
InspectorTest.log('scheduledAsyncTaskId is set\n');
|
|
}
|
|
return scheduledAsyncTaskId;
|
|
}
|