v8/test/inspector/runtime/remote-object.js
Mathias Bynens 50be01b2b8 [inspector] Improve regular expression printing
Prior to this patch, `new RegExp('a/b')` logs the following in
the DevTools Console:

    /a/b/

This is syntactically invalid.

This patch fixes this while simplifying regular expression printing
in general by leveraging `RegExp#toString`, instead of duplicating
the logic on the inspector side. This is possible thanks to the recent
work on making `RegExp#toString` more robust (v8:1982).

Bug: chromium:1202013, v8:1982
Change-Id: I14ccc1892f4a99361ad170fea608ace630740991
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2848463
Commit-Queue: Mathias Bynens <mathias@chromium.org>
Reviewed-by: Yang Guo <yangguo@chromium.org>
Cr-Commit-Position: refs/heads/master@{#74169}
2021-04-26 08:17:46 +00:00

647 lines
21 KiB
JavaScript

// Copyright 2018 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.
const {session, contextGroup, Protocol} =
InspectorTest.start('Tests Runtime.RemoteObject.');
function evaluate(options) {
InspectorTest.log(`'${options.expression}', ` +
`returnByValue: ${options.returnByValue || false}, ` +
`generatePreview: ${options.generatePreview || false}`);
return Protocol.Runtime.evaluate(options);
}
InspectorTest.runAsyncTestSuite([
async function testNull() {
InspectorTest.logMessage((await evaluate({
expression: 'null'
})).result);
InspectorTest.logMessage((await evaluate({
expression: 'null',
returnByValue: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: 'null',
generatePreview: true
})).result);
},
async function testBoolean() {
InspectorTest.logMessage((await evaluate({
expression: 'true'
})).result);
InspectorTest.logMessage((await evaluate({
expression: 'false'
})).result);
InspectorTest.logMessage((await evaluate({
expression: 'true',
returnByValue: true,
})).result);
InspectorTest.logMessage((await evaluate({
expression: 'true',
generatePreview: true,
})).result);
},
async function testNumber() {
InspectorTest.logMessage((await evaluate({
expression: '0 / {}'
})).result);
InspectorTest.logMessage((await evaluate({
expression: '-0'
})).result);
InspectorTest.logMessage((await evaluate({
expression: '0'
})).result);
InspectorTest.logMessage((await evaluate({
expression: '1/0'
})).result);
InspectorTest.logMessage((await evaluate({
expression: '-1/0'
})).result);
InspectorTest.logMessage((await evaluate({
expression: '2.3456'
})).result);
InspectorTest.logMessage((await evaluate({
expression: '2.3456',
returnByValue: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: '1/0',
returnByValue: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: '({a: 1/0})',
returnByValue: true
})).result);
},
async function testUndefined() {
InspectorTest.logMessage((await evaluate({
expression: 'undefined'
})).result);
InspectorTest.logMessage((await evaluate({
expression: 'undefined',
returnByValue: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: '({a : undefined})',
returnByValue: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: '([1, undefined])',
returnByValue: true
})).result);
},
async function testString() {
InspectorTest.logMessage((await evaluate({
expression: '\'Hello!\''
})).result);
InspectorTest.logMessage((await evaluate({
expression: '\'Hello!\'',
returnByValue: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: '\'Hello!\'',
generatePreview: true
})).result);
},
async function testSymbol() {
InspectorTest.logMessage((await evaluate({
expression: 'Symbol()',
generatePreview: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: 'Symbol(42)',
generatePreview: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: `Symbol('abc')`,
generatePreview: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: `Symbol('abc')`,
returnByValue: true
})));
},
async function testReturnByValue() {
InspectorTest.log('Empty object');
InspectorTest.logMessage((await evaluate({
expression: '({})', returnByValue: true
})).result);
InspectorTest.log('Object with properties');
InspectorTest.logMessage((await evaluate({
expression: '({a:1, b:2})', returnByValue: true
})).result);
InspectorTest.log('Object with cycle');
InspectorTest.logMessage((await evaluate({
expression: 'a = {};a.a = a; a', returnByValue: true
})).error);
InspectorTest.log('Function () => 42');
InspectorTest.logMessage((await evaluate({
expression: '() => 42', returnByValue: true
})).result);
InspectorTest.log('Symbol(42)');
InspectorTest.logMessage((await evaluate({
expression: 'Symbol(42)', returnByValue: true
})).error);
InspectorTest.log('Error object');
InspectorTest.logMessage((await evaluate({
expression: 'new Error()', returnByValue: true
})).result);
},
async function testFunction() {
InspectorTest.logMessage((await evaluate({
expression: '(() => 42)'
})).result);
InspectorTest.logMessage((await evaluate({
expression: '(function() { return 42 })'
})).result);
InspectorTest.logMessage((await evaluate({
expression: '(function name() { return 42 })'
})).result);
InspectorTest.logMessage((await evaluate({
expression: '(async function asyncName() { return 42 })'
})).result);
InspectorTest.logMessage((await evaluate({
expression: '(async () => 42)'
})).result);
InspectorTest.logMessage((await evaluate({
expression: '(function (a) { return a; }).bind(null, 42)'
})).result);
InspectorTest.logMessage((await evaluate({
expression: 'a = (function() { return 42 }); a.b = 2; a',
generatePreview: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: '(function() { return 42 })',
returnByValue: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: 'a = (function() { return 42 }); a.b = 2; a',
returnByValue: true
})).result);
},
async function testBigInt() {
InspectorTest.logMessage((await evaluate({
expression: '1n'
})).result);
InspectorTest.logMessage((await evaluate({
expression: '-5n'
})).result);
InspectorTest.logMessage((await evaluate({
expression: '1234567890123456789012345678901234567890n'
})).result);
InspectorTest.logMessage((await evaluate({
expression: '-5n',
returnByValue: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: '-5n',
generatePreview: true
})).result);
},
async function testRegExp() {
InspectorTest.logMessage((await evaluate({
expression: '/\w+/d'
})).result);
InspectorTest.logMessage((await evaluate({
expression: '/\w+/g'
})).result);
InspectorTest.logMessage((await evaluate({
expression: '/\w+/i'
})).result);
InspectorTest.logMessage((await evaluate({
expression: '/\w+/m'
})).result);
InspectorTest.logMessage((await evaluate({
expression: '/\w+/s'
})).result);
InspectorTest.logMessage((await evaluate({
expression: '/\w+/u'
})).result);
InspectorTest.logMessage((await evaluate({
expression: '/\w+/y'
})).result);
InspectorTest.logMessage((await evaluate({
expression: '/\w+/dgimsuy'
})).result);
InspectorTest.logMessage((await evaluate({
expression: `new RegExp('\\w+', 'g')`,
})).result);
InspectorTest.logMessage((await evaluate({
expression: `new RegExp('foo/bar')`
})).result);
InspectorTest.logMessage((await evaluate({
expression: `var re = new RegExp('\\w+', 'g');
re.prop = 32;
re`,
generatePreview: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: `var re = new RegExp('\\w+', 'g');
re.prop = 32;
re`,
returnByValue: true
})).result);
},
async function testDate() {
let result = (await evaluate({
expression: `new Date('May 18, 1991 03:24:00')`,
generatePreview: true
})).result;
if (result.result.description === new Date('May 18, 1991 03:24:00') + '')
result.result.description = '<expected description>';
if (result.result.preview.description === new Date('May 18, 1991 03:24:00') + '')
result.result.preview.description = '<expected description>';
InspectorTest.logMessage(result);
result = (await evaluate({
expression: `new Date(2018, 9, 31)`,
generatePreview: true
})).result;
if (result.result.description === new Date(2018, 9, 31) + '')
result.result.description = '<expected description>';
if (result.result.preview.description === new Date(2018, 9, 31) + '')
result.result.preview.description = '<expected description>';
InspectorTest.logMessage(result);
result = (await evaluate({
expression: `a = new Date(2018, 9, 31); a.b = 2; a`,
generatePreview: true
})).result;
if (result.result.description === new Date(2018, 9, 31) + '')
result.result.description = '<expected description>';
if (result.result.preview.description === new Date(2018, 9, 31) + '')
result.result.preview.description = '<expected description>';
InspectorTest.logMessage(result);
},
async function testMap() {
InspectorTest.logMessage((await evaluate({
expression: 'new Map()',
generatePreview: true,
})).result);
InspectorTest.logMessage((await evaluate({
expression: 'new Map([[1,2]])',
generatePreview: true,
})).result);
InspectorTest.logMessage((await evaluate({
expression: 'a = new Map(); a.set(a, a); a',
generatePreview: true,
})).result);
InspectorTest.logMessage((await evaluate({
expression: `new Map([['a','b']])`
})).result);
InspectorTest.logMessage((await evaluate({
expression: `({ a: new Map([['a','b']]) })`,
generatePreview: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: `m = new Map([['a', {b: 2}]])
m.d = 42;
m`,
generatePreview: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: `m = new Map([['a', {b: 2}]])
m.d = 42;
m`,
returnByValue: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: `new Map([['a', {b: 2}]]).values()`
})).result);
InspectorTest.logMessage((await evaluate({
expression: `new Map([['a', {b: 2}]]).values()`,
generatePreview: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: `it = new Map([['a', {b: 2}]]).values(); it.next(); it`,
generatePreview: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: `new Map([['a', {b: 2}]]).values()`,
returnByValue: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: `new Map([['a', {b: 2}]]).entries()`
})).result);
InspectorTest.logMessage((await evaluate({
expression: `new Map([['a', {b: 2}]]).entries()`,
generatePreview: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: `it = new Map([['a', {b: 2}]]).entries(); it.next(); it`,
generatePreview: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: `new Map([['a', {b: 2}]]).entries()`,
returnByValue: true
})).result);
},
async function testSet() {
InspectorTest.logMessage((await evaluate({
expression: 'new Set([1])',
generatePreview: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: 'new Set([1])',
returnByValue: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: 'new Set([1,2,3,4,5,6,7])',
generatePreview: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: 'new Set([1,2,3]).values()',
generatePreview: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: 'it = new Set([1,2,3]).values(); it.next(); it',
generatePreview: true
})).result);
},
async function testWeakMap() {
InspectorTest.logMessage((await evaluate({
expression: 'new WeakMap()',
generatePreview: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: 'new WeakMap([[this, 1]])',
generatePreview: true
})).result);
},
async function testWeakSet() {
InspectorTest.logMessage((await evaluate({
expression: 'new WeakSet()',
generatePreview: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: 'new WeakSet([this])',
generatePreview: true
})).result);
},
async function testGenerator() {
InspectorTest.logMessage((await evaluate({
expression: 'g = (function*(){ yield 42; })(); g.a = 2; g',
generatePreview: true
})).result);
},
async function testError() {
InspectorTest.logMessage((await evaluate({
expression: 'new Error()'
})).result);
InspectorTest.logMessage((await evaluate({
expression: `new Error('abc')`
})).result);
InspectorTest.logMessage((await evaluate({
expression: `new Error('at\\nat')`
})).result);
InspectorTest.logMessage((await evaluate({
expression: `new Error('preview')`,
returnByValue: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: `new Error('preview')`,
generatePreview: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: `({a: new Error('preview')})`,
generatePreview: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: `a = new Error('preview and a'); a.a = 123; a`,
generatePreview: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: `a = new Error('preview and a'); a.a = 123; a`,
returnByValue: true
})).result);
},
async function testCustomError() {
InspectorTest.logMessage((await evaluate({
expression: `class CustomError extends Error {}; a = new CustomError(); delete a.stack; a`
})).result);
},
async function testCustomErrorWithMessage() {
InspectorTest.logMessage((await evaluate( {
expression: `class CustomMsgError extends Error {}; a = new CustomMsgError(); delete a.stack; a.message = 'foobar'; a`
})).result);
},
async function testProxy() {
InspectorTest.logMessage((await evaluate({
expression: 'new Proxy({}, {})'
})).result);
InspectorTest.logMessage((await evaluate({
expression: 'new Proxy(new Error(), {})'
})).result);
InspectorTest.logMessage((await evaluate({
expression: 'new Proxy({c: 3}, {d: 4})',
returnByValue: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: 'new Proxy({a: 1}, {b: 2})',
generatePreview: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: '({e: new Proxy({a: 1}, {b: 2})})',
generatePreview: true
})).result);
},
async function testPromise() {
InspectorTest.logMessage((await evaluate({
expression: 'Promise.resolve(42)'
})).result);
InspectorTest.logMessage((await evaluate({
expression: 'Promise.reject(42)'
})).result);
InspectorTest.logMessage((await evaluate({
expression: '(async function(){})()'
})).result);
InspectorTest.logMessage((await evaluate({
expression: `Promise.resolve('a'.repeat(101))`,
generatePreview: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: 'Promise.reject(42)',
generatePreview: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: 'new Promise(resolve => this.resolve = resolve)',
generatePreview: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: 'a = Promise.resolve(42); a.b = 2; a',
returnByValue: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: '({a: Promise.resolve(42)})',
generatePreview: true
})).result);
},
async function testTypedArray() {
InspectorTest.logMessage((await evaluate({
expression: 'a = new Uint8Array(2); a.b = 2; a',
generatePreview: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: 'new Int32Array(101)',
generatePreview: true
})).result);
},
async function testArrayBuffer() {
InspectorTest.logMessage((await evaluate({
expression: 'new Uint8Array().buffer',
generatePreview: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: 'new Int32Array(100).buffer',
generatePreview: true
})).result);
},
async function testDataView() {
InspectorTest.logMessage((await evaluate({
expression: 'new DataView(new ArrayBuffer(16))',
generatePreview: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: 'new DataView(new ArrayBuffer(16), 12, 4)',
generatePreview: true
})).result);
},
async function testArray() {
InspectorTest.logMessage((await evaluate({
expression: '[]'
})).result);
InspectorTest.logMessage((await evaluate({
expression: '[1,2,3]'
})).result);
},
async function testArrayLike() {
InspectorTest.logMessage((await evaluate({
expression: '({length: 5, splice: () => []})'
})).result);
InspectorTest.logMessage((await evaluate({
expression: `new (class Foo{constructor() {
this.length = 5;
this.splice = () => [];
}})`
})).result);
InspectorTest.logMessage((await evaluate({
expression: '({length: -5, splice: () => []})'
})).result);
},
async function testOtherObjects() {
InspectorTest.logMessage((await evaluate({
expression: '({a: 1, b:2})'
})).result);
InspectorTest.logMessage((await evaluate({
expression: '({a: 1, b:2})',
returnByValue: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: '({a: 1, b:2})',
generatePreview: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: 'new (function Foo() { this.a = 5; })'
})).result);
InspectorTest.logMessage((await evaluate({
expression: 'new (function Foo() { this.a = [1,2,3]; })',
returnByValue: true
})).result);
InspectorTest.logMessage((await evaluate({
expression: 'new (class Bar {})'
})).result);
InspectorTest.logMessage((await evaluate({
expression: 'inspector.createObjectWithAccessor(\'title\', true)',
generatePreview: true
})));
InspectorTest.logMessage((await evaluate({
expression: 'inspector.createObjectWithAccessor(\'title\', false)',
generatePreview: true
})));
// TODO(kozyatinskiy): fix this one.
InspectorTest.logMessage((await evaluate({
expression: 'inspector.createObjectWithAccessor(\'title\', true)',
returnByValue: true
})));
InspectorTest.logMessage((await evaluate({
expression: '({get a() { return 42; }})',
generatePreview: true
})));
InspectorTest.logMessage((await evaluate({
expression: '({set a(v) {}})',
generatePreview: true
})));
InspectorTest.logMessage((await evaluate({
expression: '({a: () => 42})',
generatePreview: true
})));
InspectorTest.logMessage((await evaluate({
expression: '({a: null})',
generatePreview: true
})));
InspectorTest.logMessage((await evaluate({
expression: '({a: true})',
generatePreview: true
})));
InspectorTest.logMessage((await evaluate({
expression: '({a1: -Infinity, a2: +Infinity, a3: -0, a4: NaN, a5: 1.23})',
generatePreview: true
})));
InspectorTest.logMessage((await evaluate({
expression: '({a1: 1234567890123456789012345678901234567890n})',
generatePreview: true
})));
InspectorTest.logMessage((await evaluate({
expression: '({a1: Symbol(42)})',
generatePreview: true
})));
InspectorTest.logMessage((await evaluate({
expression: '({a1: /abc/i})',
generatePreview: true
})));
InspectorTest.logMessage((await evaluate({
expression: '({a1: () => 42, a2: async () => 42})',
generatePreview: true
})));
InspectorTest.logMessage((await evaluate({
expression: '({a1: ({}), a2: new (class Bar{})})',
generatePreview: true
})));
InspectorTest.logMessage((await evaluate({
expression: `({a1: 'a'.repeat(100), a2: 'a'.repeat(101)})`,
generatePreview: true
})));
InspectorTest.logMessage((await evaluate({
expression: `({a1: 1, a2: 2, a3: 3, a4:4, a5:5, a6: 6})`,
generatePreview: true
})));
InspectorTest.logMessage((await evaluate({
expression: `([1,2,3])`,
generatePreview: true
})));
},
async function testArray2() {
InspectorTest.logMessage((await evaluate({
expression: `([1,2,3])`
})));
InspectorTest.logMessage((await evaluate({
expression: `([1,2,3])`,
returnByValue: true
})));
InspectorTest.logMessage((await evaluate({
expression: `([1,2,3])`,
generatePreview: true
})));
InspectorTest.logMessage((await evaluate({
expression: `({a: [1,2,3]})`,
generatePreview: true
})));
}
]);