blob: 7d96cd42c6b9ccb7ac71e6f3ba1582760641dcd9 [file] [log] [blame]
(async function(testRunner) {
var {page, session, dp} = await testRunner.startURL(
'http://first.test:8000/inspector-protocol/resources/test-page.html',
`Tests the order in which not finished asynchronous Runtime.evaluate calls are temintated on navigation.`);
// Runtime.enable so we can capture console.log below. This command completes.
await dp.Runtime.enable();
dp.Runtime.onConsoleAPICalled(e => { testRunner.log(e.params.args[0].value); });
const callIdsToWatch = new Set();
// Creates a promise which doesn't resolve, so therefore, we won't get a
// response - only once we've navigated below, we'll get an error response
// due to command termination. Request ID will be call_id.
async function createNonResolvingPromise(call_id) {
const saveRequestId = DevToolsAPI._requestId;
DevToolsAPI._requestId = call_id - 1;
dp.Runtime.evaluate({
expression: `new Promise(() => console.log('promise created (` + call_id + `)'))`,
awaitPromise: true
});
DevToolsAPI._requestId = saveRequestId;
await dp.Runtime.onceConsoleAPICalled(); // Be sure to capture the log.
callIdsToWatch.add(call_id);
}
// Override the dispatch routine so we can intercept and log the responses in
// the order in which they arrive.
const originalDispatch = DevToolsAPI.dispatchMessage;
DevToolsAPI.dispatchMessage = function(message) {
var obj = JSON.parse(message);
if (callIdsToWatch.has(obj.id)) {
testRunner.log(obj, 'receiving result ' + obj.id + ':\n', ['sessionId']);
}
originalDispatch(message);
}
// Now create three promises with out-of-order call ids.
await createNonResolvingPromise(100021);
await createNonResolvingPromise(100013);
await createNonResolvingPromise(100017);
// Navigate, this causes the error notifications to arrive - in the same order
// in which the original requests were sent.
await page.navigate('http://second.test:8000/inspector-protocol/resources/test-page.html');
testRunner.completeTest();
})