f7d357b20a
It was shipped in Chrome 67. Bug: v8:6791, v8:8238 Cq-Include-Trybots: luci.chromium.try:linux_chromium_headless_rel;luci.chromium.try:linux_chromium_rel_ng;luci.v8.try:v8_linux_noi18n_rel_ng;master.tryserver.blink:linux_trusty_blink_rel Change-Id: I94d8f0aa18570452403a35dea270b18f155c970a Reviewed-on: https://chromium-review.googlesource.com/1253604 Reviewed-by: Georg Neis <neis@chromium.org> Commit-Queue: Mathias Bynens <mathias@chromium.org> Cr-Commit-Position: refs/heads/master@{#56310}
164 lines
5.6 KiB
JavaScript
164 lines
5.6 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.
|
|
|
|
let {session, contextGroup, Protocol} = InspectorTest.start('Tests that Runtime.callFunctionOn works with awaitPromise flag.');
|
|
let callFunctionOn = Protocol.Runtime.callFunctionOn.bind(Protocol.Runtime);
|
|
|
|
let remoteObject1;
|
|
let remoteObject2;
|
|
let executionContextId;
|
|
|
|
Protocol.Runtime.enable();
|
|
Protocol.Runtime.onExecutionContextCreated(messageObject => {
|
|
executionContextId = messageObject.params.context.id;
|
|
InspectorTest.runAsyncTestSuite(testSuite);
|
|
});
|
|
|
|
let testSuite = [
|
|
async function prepareTestSuite() {
|
|
let result = await Protocol.Runtime.evaluate({ expression: '({a : 1})' });
|
|
remoteObject1 = result.result.result;
|
|
result = await Protocol.Runtime.evaluate({ expression: '({a : 2})' });
|
|
remoteObject2 = result.result.result;
|
|
|
|
await Protocol.Runtime.evaluate({ expression: 'globalObjectProperty = 42;' });
|
|
},
|
|
|
|
async function testArguments() {
|
|
InspectorTest.logMessage(await callFunctionOn({
|
|
objectId: remoteObject1.objectId,
|
|
functionDeclaration: 'function(arg1, arg2, arg3, arg4) { return \'\' + arg1 + \'|\' + arg2 + \'|\' + arg3 + \'|\' + arg4; }',
|
|
arguments: prepareArguments([undefined, NaN, remoteObject2, remoteObject1]),
|
|
returnByValue: true,
|
|
generatePreview: false,
|
|
awaitPromise: false
|
|
}));
|
|
},
|
|
|
|
async function testUnserializableArguments() {
|
|
InspectorTest.logMessage(await callFunctionOn({
|
|
objectId: remoteObject1.objectId,
|
|
functionDeclaration: 'function(arg1, arg2, arg3, arg4, arg5) { return \'\' + Object.is(arg1, -0) + \'|\' + Object.is(arg2, NaN) + \'|\' + Object.is(arg3, Infinity) + \'|\' + Object.is(arg4, -Infinity) + \'|\' + (typeof arg5); }',
|
|
arguments: prepareArguments([-0, NaN, Infinity, -Infinity, 2n]),
|
|
returnByValue: true,
|
|
generatePreview: false,
|
|
awaitPromise: false
|
|
}));
|
|
},
|
|
|
|
async function testComplexArguments() {
|
|
InspectorTest.logMessage(await callFunctionOn({
|
|
objectId: remoteObject1.objectId,
|
|
functionDeclaration: 'function(arg) { return arg.foo; }',
|
|
arguments: prepareArguments([{foo: 'bar'}]),
|
|
returnByValue: true,
|
|
generatePreview: false,
|
|
awaitPromise: false
|
|
}));
|
|
},
|
|
|
|
async function testSyntaxErrorInFunction() {
|
|
InspectorTest.logMessage(await callFunctionOn({
|
|
objectId: remoteObject1.objectId,
|
|
functionDeclaration: '\n }',
|
|
arguments: prepareArguments([]),
|
|
returnByValue: false,
|
|
generatePreview: false,
|
|
awaitPromise: true
|
|
}));
|
|
},
|
|
|
|
async function testExceptionInFunctionExpression() {
|
|
InspectorTest.logMessage(await callFunctionOn({
|
|
objectId: remoteObject1.objectId,
|
|
functionDeclaration: '(function() { throw new Error() })()',
|
|
arguments: prepareArguments([]),
|
|
returnByValue: false,
|
|
generatePreview: false,
|
|
awaitPromise: true
|
|
}));
|
|
},
|
|
|
|
async function testFunctionReturnNotPromise() {
|
|
InspectorTest.logMessage(await callFunctionOn({
|
|
objectId: remoteObject1.objectId,
|
|
functionDeclaration: '(function() { return 239; })',
|
|
arguments: prepareArguments([]),
|
|
returnByValue: true,
|
|
generatePreview: false,
|
|
awaitPromise: true
|
|
}));
|
|
},
|
|
|
|
async function testFunctionReturnResolvedPromiseReturnByValue() {
|
|
InspectorTest.logMessage(await callFunctionOn({
|
|
objectId: remoteObject1.objectId,
|
|
functionDeclaration: '(function(arg) { return Promise.resolve({a : this.a + arg.a}); })',
|
|
arguments: prepareArguments([ remoteObject2 ]),
|
|
returnByValue: true,
|
|
generatePreview: false,
|
|
awaitPromise: true
|
|
}));
|
|
},
|
|
|
|
async function testFunctionReturnResolvedPromiseWithPreview() {
|
|
InspectorTest.logMessage(await callFunctionOn({
|
|
objectId: remoteObject1.objectId,
|
|
functionDeclaration: '(function(arg) { return Promise.resolve({a : this.a + arg.a}); })',
|
|
arguments: prepareArguments([ remoteObject2 ]),
|
|
returnByValue: false,
|
|
generatePreview: true,
|
|
awaitPromise: true
|
|
}));
|
|
},
|
|
|
|
async function testFunctionReturnRejectedPromise() {
|
|
InspectorTest.logMessage(await callFunctionOn({
|
|
objectId: remoteObject1.objectId,
|
|
functionDeclaration: '(function(arg) { return Promise.reject({a : this.a + arg.a}); })',
|
|
arguments: prepareArguments([ remoteObject2 ]),
|
|
returnByValue: true,
|
|
generatePreview: false,
|
|
awaitPromise: true
|
|
}));
|
|
},
|
|
|
|
async function testEvaluateOnExecutionContext() {
|
|
InspectorTest.logMessage(await callFunctionOn({
|
|
executionContextId,
|
|
functionDeclaration: '(function(arg) { return this.globalObjectProperty + arg; })',
|
|
arguments: prepareArguments([ 28 ]),
|
|
returnByValue: true,
|
|
generatePreview: false,
|
|
awaitPromise: false
|
|
}));
|
|
},
|
|
|
|
async function testPassingBothObjectIdAndExecutionContextId() {
|
|
InspectorTest.logMessage(await callFunctionOn({
|
|
executionContextId,
|
|
objectId: remoteObject1.objectId,
|
|
functionDeclaration: '(function() { return 42; })',
|
|
arguments: prepareArguments([]),
|
|
returnByValue: true,
|
|
generatePreview: false,
|
|
awaitPromise: false
|
|
}));
|
|
},
|
|
];
|
|
|
|
function prepareArguments(args) {
|
|
return args.map(arg => {
|
|
if (Object.is(arg, -0))
|
|
return {unserializableValue: '-0'};
|
|
if (Object.is(arg, NaN) || Object.is(arg, Infinity) || Object.is(arg, -Infinity))
|
|
return {unserializableValue: arg + ''};
|
|
if (typeof arg === 'bigint')
|
|
return {unserializableValue: arg + 'n'};
|
|
if (arg && arg.objectId)
|
|
return {objectId: arg.objectId};
|
|
return {value: arg};
|
|
});
|
|
}
|