v8/test/inspector/debugger/async-instrumentation.js
kozyatinskiy 754736d26c [inspector] async stacks for Promise.then calls...
... which were done after the promise has been resolved.

Goal of this CL - change promise instrumentation to support better callbacks, chained after promise resolution and prepare instrumentation for adding new asyncTaskCreated instrumentation.

Instrumentation changes:
- asyncTaskScheduled(recurring) when promise is fulfilled or rejected,
- asyncTaskCancelled when promise is collected (since [1] we can be sure that promise will survive scheduled microtasks).

Minor changes:
- async task type in inspector <-> debugger API transferred by enum instead of string,
- Debug manages async task ids based on promise objects.

More details: https://docs.google.com/document/d/1u19N45f1gSF7M39mGsycJEK3IPyJgIXCBnWyiPeuJFE

[1] https://codereview.chromium.org/2581503003/

BUG=chromium:632829,v8:5738
R=dgozman@chromium.org,yangguo@chromium.org,gsathya@chromium.org

Review-Url: https://codereview.chromium.org/2578923002
Cr-Commit-Position: refs/heads/master@{#42178}
2017-01-10 12:54:12 +00:00

69 lines
2.0 KiB
JavaScript

// Copyright 2016 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 async instrumentation enabled in the middle.');
InspectorTest.addScript(`
function foo() {
// asyncTaskStarted
debugger;
// asyncTaskFinished
debugger;
}
function test() {
var resolve1;
var p1 = new Promise(resolve => resolve1 = resolve);
var p2 = p1.then(foo);
debugger;
resolve1(); // asyncTaskScheduled
debugger;
return p2;
}
//# sourceURL=test.js`, 7, 26);
InspectorTest.setupScriptMap();
Protocol.Debugger.onPaused(message => {
if (enableOnPause-- === 0)
Protocol.Debugger.setAsyncCallStackDepth({ maxDepth: 128 });
InspectorTest.logCallFrames(message.params.callFrames);
var asyncStackTrace = message.params.asyncStackTrace;
while (asyncStackTrace) {
InspectorTest.log(`-- ${asyncStackTrace.description} --`);
InspectorTest.logCallFrames(asyncStackTrace.callFrames);
asyncStackTrace = asyncStackTrace.parent;
}
InspectorTest.log('');
Protocol.Debugger.resume();
});
Protocol.Debugger.enable();
var enableOnPause = 0;
InspectorTest.runTestSuite([
function beforeAsyncTaskScheduled(next) {
enableOnPause = 0;
Protocol.Runtime.evaluate({ expression: 'test()//# sourceURL=expr1.js',
awaitPromise: true })
.then(() => Protocol.Debugger.setAsyncCallStackDepth({ maxDepth: 0 }))
.then(next);
},
function afterAsyncTaskScheduled(next) {
enableOnPause = 2;
Protocol.Runtime.evaluate({ expression: 'test()//# sourceURL=expr1.js',
awaitPromise: true })
.then(() => Protocol.Debugger.setAsyncCallStackDepth({ maxDepth: 0 }))
.then(next);
},
function afterAsyncTaskStarted(next) {
enableOnPause = 3;
Protocol.Runtime.evaluate({ expression: 'test()//# sourceURL=expr1.js',
awaitPromise: true })
.then(() => Protocol.Debugger.setAsyncCallStackDepth({ maxDepth: 0 }))
.then(next);
}
]);