2017-03-29 21:40:07 +00:00
|
|
|
// 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.
|
|
|
|
|
2017-05-19 00:35:45 +00:00
|
|
|
let {session, contextGroup, Protocol} = InspectorTest.start('Checks command line API.');
|
2017-03-29 21:40:07 +00:00
|
|
|
|
|
|
|
InspectorTest.runAsyncTestSuite([
|
|
|
|
async function testKeys() {
|
|
|
|
InspectorTest.logMessage(await Protocol.Runtime.evaluate({
|
|
|
|
expression: 'keys', includeCommandLineAPI: true}));
|
|
|
|
InspectorTest.logMessage(await Protocol.Runtime.evaluate({
|
|
|
|
expression: 'keys({a : 1})', includeCommandLineAPI: true, returnByValue: true}));
|
|
|
|
|
|
|
|
Protocol.Runtime.evaluate({expression: 'this.keys = keys', includeCommandLineAPI: true});
|
|
|
|
InspectorTest.logMessage(await Protocol.Runtime.evaluate({
|
|
|
|
expression: 'this.keys({a : 1})', returnByValue: true}));
|
|
|
|
},
|
|
|
|
|
|
|
|
async function testInspect() {
|
|
|
|
InspectorTest.log(await Protocol.Runtime.evaluate({expression: 'inspect', includeCommandLineAPI: true}));
|
|
|
|
await Protocol.Runtime.enable();
|
|
|
|
Protocol.Runtime.onInspectRequested(InspectorTest.logMessage);
|
|
|
|
await Protocol.Runtime.evaluate({expression: 'inspect({})', includeCommandLineAPI: true});
|
|
|
|
await Protocol.Runtime.evaluate({expression: 'inspect(239)', includeCommandLineAPI: true});
|
|
|
|
await Protocol.Runtime.evaluate({expression: 'inspect(-0)', includeCommandLineAPI: true});
|
|
|
|
await Protocol.Runtime.evaluate({expression: 'copy(\'hello\')', includeCommandLineAPI: true});
|
|
|
|
InspectorTest.logMessage(await Protocol.Runtime.evaluate({expression: '$0', includeCommandLineAPI: true}));
|
|
|
|
|
|
|
|
Protocol.Runtime.evaluate({expression: 'this.inspect = inspect', includeCommandLineAPI: true});
|
|
|
|
await Protocol.Runtime.evaluate({expression: 'this.inspect({})'});
|
|
|
|
|
|
|
|
Protocol.Runtime.onInspectRequested(null);
|
|
|
|
await Protocol.Runtime.disable();
|
|
|
|
},
|
|
|
|
|
2017-08-24 00:03:53 +00:00
|
|
|
async function testQueryObjects() {
|
|
|
|
InspectorTest.logMessage(await Protocol.Runtime.evaluate({expression: 'queryObjects', includeCommandLineAPI: true}));
|
|
|
|
await Protocol.Runtime.enable();
|
2018-03-28 01:04:10 +00:00
|
|
|
let {result:{result:{objectId}}} = await Protocol.Runtime.evaluate({expression: 'Promise.prototype'});
|
|
|
|
Protocol.Runtime.evaluate({expression: 'queryObjects(Promise)', includeCommandLineAPI: true});
|
|
|
|
let request = await Protocol.Runtime.onceInspectRequested();
|
|
|
|
InspectorTest.logMessage(request);
|
|
|
|
InspectorTest.logMessage('Is Promise.prototype: ' + await isEqual(objectId, request.params.object.objectId));
|
|
|
|
|
|
|
|
Protocol.Runtime.evaluate({expression: 'queryObjects(Promise.prototype)', includeCommandLineAPI: true});
|
|
|
|
request = await Protocol.Runtime.onceInspectRequested();
|
|
|
|
InspectorTest.logMessage(request);
|
|
|
|
InspectorTest.logMessage('Is Promise.prototype: ' + await isEqual(objectId, request.params.object.objectId));
|
|
|
|
|
|
|
|
({result:{result:{objectId}}} = await Protocol.Runtime.evaluate({expression:'p = {a:1}'}));
|
|
|
|
Protocol.Runtime.evaluate({expression: 'queryObjects(p)', includeCommandLineAPI: true});
|
|
|
|
request = await Protocol.Runtime.onceInspectRequested();
|
|
|
|
InspectorTest.logMessage(request);
|
|
|
|
InspectorTest.logMessage('Is p: ' + await isEqual(objectId, request.params.object.objectId));
|
|
|
|
|
|
|
|
Protocol.Runtime.evaluate({expression: 'queryObjects(1)', includeCommandLineAPI: true});
|
|
|
|
InspectorTest.logMessage(await Protocol.Runtime.onceInspectRequested());
|
2017-08-24 00:03:53 +00:00
|
|
|
await Protocol.Runtime.disable();
|
|
|
|
},
|
|
|
|
|
2017-03-29 21:40:07 +00:00
|
|
|
async function testEvaluationResult() {
|
|
|
|
InspectorTest.logMessage(await Protocol.Runtime.evaluate({expression: '$_', includeCommandLineAPI: true}));
|
|
|
|
await Protocol.Runtime.evaluate({expression: '42', objectGroup: 'console', includeCommandLineAPI: true});
|
|
|
|
InspectorTest.logMessage(await Protocol.Runtime.evaluate({expression: '$_', includeCommandLineAPI: true}));
|
|
|
|
await Protocol.Runtime.evaluate({expression: '239', includeCommandLineAPI: true});
|
|
|
|
InspectorTest.logMessage(await Protocol.Runtime.evaluate({expression: '$_', includeCommandLineAPI: true}));
|
|
|
|
await Protocol.Runtime.evaluate({expression: '-0', objectGroup: 'console', includeCommandLineAPI: true});
|
|
|
|
InspectorTest.logMessage(await Protocol.Runtime.evaluate({expression: '$_', includeCommandLineAPI: true}));
|
|
|
|
await Protocol.Runtime.evaluate({expression: '({})', objectGroup: 'console', includeCommandLineAPI: true});
|
|
|
|
InspectorTest.logMessage(await Protocol.Runtime.evaluate({expression: '$_', includeCommandLineAPI: true, returnByValue: true}));
|
|
|
|
},
|
|
|
|
|
|
|
|
async function testDebug() {
|
2017-05-19 00:35:45 +00:00
|
|
|
session.setupScriptMap();
|
2017-03-29 21:40:07 +00:00
|
|
|
await Protocol.Debugger.enable();
|
|
|
|
InspectorTest.logMessage(await Protocol.Runtime.evaluate({expression: 'debug', includeCommandLineAPI: true}));
|
|
|
|
InspectorTest.logMessage(await Protocol.Runtime.evaluate({expression: 'undebug', includeCommandLineAPI: true}));
|
|
|
|
await Protocol.Runtime.evaluate({expression: 'function foo() {}'});
|
|
|
|
await Protocol.Runtime.evaluate({expression: 'debug(foo)', includeCommandLineAPI: true});
|
|
|
|
Protocol.Runtime.evaluate({ expression: 'foo()'});
|
|
|
|
let message = await Protocol.Debugger.oncePaused();
|
2017-05-19 00:35:45 +00:00
|
|
|
session.logCallFrames(message.params.callFrames);
|
2017-03-29 21:40:07 +00:00
|
|
|
InspectorTest.logMessage(message.params.hitBreakpoints);
|
2018-03-22 12:12:28 +00:00
|
|
|
InspectorTest.logMessage(message.params.reason);
|
2017-03-29 21:40:07 +00:00
|
|
|
await Protocol.Debugger.resume();
|
|
|
|
await Protocol.Runtime.evaluate({expression: 'undebug(foo)', includeCommandLineAPI: true});
|
|
|
|
await Protocol.Runtime.evaluate({ expression: 'foo()'});
|
|
|
|
|
|
|
|
Protocol.Runtime.evaluate({
|
|
|
|
expression: 'this.debug = debug; this.undebug = undebug;', includeCommandLineAPI: true});
|
|
|
|
await Protocol.Runtime.evaluate({expression: 'this.debug(foo)'});
|
|
|
|
Protocol.Runtime.evaluate({ expression: 'foo()'});
|
|
|
|
message = await Protocol.Debugger.oncePaused();
|
2017-05-19 00:35:45 +00:00
|
|
|
session.logCallFrames(message.params.callFrames);
|
2017-03-29 21:40:07 +00:00
|
|
|
InspectorTest.logMessage(message.params.hitBreakpoints);
|
2018-03-22 12:12:28 +00:00
|
|
|
InspectorTest.logMessage(message.params.reason);
|
2017-03-29 21:40:07 +00:00
|
|
|
await Protocol.Debugger.resume();
|
|
|
|
await Protocol.Runtime.evaluate({expression: 'this.undebug(foo)'});
|
|
|
|
await Protocol.Runtime.evaluate({expression: 'foo()'});
|
|
|
|
|
2018-03-22 12:12:28 +00:00
|
|
|
// Test builtin.
|
|
|
|
await Protocol.Runtime.evaluate({expression: 'function toUpper(x) { return x.toUpperCase() }'});
|
|
|
|
await Protocol.Runtime.evaluate({expression: 'debug(String.prototype.toUpperCase)', includeCommandLineAPI: true});
|
|
|
|
Protocol.Runtime.evaluate({ expression: 'toUpper("first call")'});
|
|
|
|
message = await Protocol.Debugger.oncePaused();
|
|
|
|
session.logCallFrames(message.params.callFrames);
|
|
|
|
InspectorTest.logMessage(message.params.hitBreakpoints);
|
|
|
|
InspectorTest.logMessage(message.params.reason);
|
|
|
|
await Protocol.Debugger.resume();
|
|
|
|
await Protocol.Runtime.evaluate({expression: 'undebug(String.prototype.toUpperCase)', includeCommandLineAPI: true});
|
|
|
|
await Protocol.Runtime.evaluate({ expression: 'toUpper("second call")'});
|
|
|
|
|
|
|
|
// Test API callback.
|
|
|
|
await Protocol.Runtime.evaluate({expression: 'function callSetTimeout() { setTimeout(function(){}, 0) }'});
|
|
|
|
await Protocol.Runtime.evaluate({expression: 'debug(setTimeout)', includeCommandLineAPI: true});
|
|
|
|
Protocol.Runtime.evaluate({ expression: 'callSetTimeout()'});
|
|
|
|
message = await Protocol.Debugger.oncePaused();
|
|
|
|
session.logCallFrames(message.params.callFrames);
|
|
|
|
InspectorTest.logMessage(message.params.hitBreakpoints);
|
|
|
|
InspectorTest.logMessage(message.params.reason);
|
|
|
|
let breakpointId = message.params.hitBreakpoints[0];
|
|
|
|
await Protocol.Debugger.resume();
|
|
|
|
await Protocol.Runtime.evaluate({expression: 'undebug(setTimeout)', includeCommandLineAPI: true});
|
|
|
|
await Protocol.Runtime.evaluate({ expression: 'callSetTimeout()'});
|
|
|
|
|
|
|
|
// Test remove break via protocol.
|
|
|
|
await Protocol.Runtime.evaluate({expression: 'function callSetTimeout() { setTimeout(function(){}, 0) }'});
|
|
|
|
await Protocol.Runtime.evaluate({expression: 'debug(setTimeout)', includeCommandLineAPI: true});
|
|
|
|
Protocol.Runtime.evaluate({ expression: 'callSetTimeout()'});
|
|
|
|
message = await Protocol.Debugger.oncePaused();
|
|
|
|
session.logCallFrames(message.params.callFrames);
|
|
|
|
InspectorTest.logMessage(message.params.hitBreakpoints);
|
|
|
|
InspectorTest.logMessage(message.params.reason);
|
|
|
|
await Protocol.Debugger.resume();
|
|
|
|
await Protocol.Debugger.removeBreakpoint({breakpointId});
|
|
|
|
await Protocol.Runtime.evaluate({ expression: 'callSetTimeout()'});
|
|
|
|
|
|
|
|
// Test condition.
|
|
|
|
await Protocol.Runtime.evaluate({expression: 'function fromCharCode(...args) { String.fromCharCode(...args) }'});
|
|
|
|
await Protocol.Runtime.evaluate({expression: 'debug(String.fromCharCode, "arguments.length == 3")'});
|
|
|
|
Protocol.Runtime.evaluate({ expression: 'fromCharCode("1", "2", "3")'});
|
|
|
|
message = await Protocol.Debugger.oncePaused();
|
|
|
|
session.logCallFrames(message.params.callFrames);
|
|
|
|
InspectorTest.logMessage(message.params.hitBreakpoints);
|
|
|
|
InspectorTest.logMessage(message.params.reason);
|
|
|
|
await Protocol.Runtime.evaluate({expression: 'undebug(String.fromCharCode)'});
|
|
|
|
await Protocol.Runtime.evaluate({ expression: 'fromCharCode()'});
|
|
|
|
|
2017-03-29 21:40:07 +00:00
|
|
|
await Protocol.Debugger.disable();
|
|
|
|
},
|
|
|
|
|
|
|
|
async function testMonitor() {
|
|
|
|
await Protocol.Debugger.enable();
|
|
|
|
await Protocol.Runtime.enable();
|
|
|
|
Protocol.Runtime.onConsoleAPICalled(message => InspectorTest.log(message.params.args[0].value));
|
|
|
|
InspectorTest.logMessage(await Protocol.Runtime.evaluate({expression: 'monitor', includeCommandLineAPI: true}));
|
|
|
|
InspectorTest.logMessage(await Protocol.Runtime.evaluate({expression: 'unmonitor', includeCommandLineAPI: true}));
|
|
|
|
await Protocol.Runtime.evaluate({expression: 'function foo() {}'});
|
|
|
|
|
|
|
|
await Protocol.Runtime.evaluate({expression: 'monitor(foo)', includeCommandLineAPI: true});
|
|
|
|
Protocol.Runtime.evaluate({ expression: 'foo(); console.log(\'after first call\')'});
|
|
|
|
await Protocol.Runtime.evaluate({expression: 'unmonitor(foo)', includeCommandLineAPI: true});
|
|
|
|
await Protocol.Runtime.evaluate({ expression: 'foo()'});
|
|
|
|
|
|
|
|
Protocol.Runtime.evaluate({
|
|
|
|
expression: 'console.log(\'store functions..\'); this.monitor = monitor; this.unmonitor = unmonitor;', includeCommandLineAPI: true});
|
|
|
|
await Protocol.Runtime.evaluate({expression: 'this.monitor(foo)'});
|
|
|
|
Protocol.Runtime.evaluate({ expression: 'foo(); console.log(\'after first call\')'});
|
|
|
|
await Protocol.Runtime.evaluate({expression: 'this.unmonitor(foo)'});
|
|
|
|
await Protocol.Runtime.evaluate({ expression: 'foo()'});
|
|
|
|
|
2018-03-22 12:12:28 +00:00
|
|
|
// Test builtin.
|
|
|
|
await Protocol.Runtime.evaluate({expression: 'function fromCharCode(...args) { String.fromCharCode(...args) }'});
|
|
|
|
await Protocol.Runtime.evaluate({expression: 'monitor(String.fromCharCode)'});
|
|
|
|
Protocol.Runtime.evaluate({ expression: 'fromCharCode("1", "2", "3")'});
|
|
|
|
await Protocol.Runtime.evaluate({expression: 'unmonitor(String.fromCharCode)'});
|
|
|
|
await Protocol.Runtime.evaluate({ expression: 'fromCharCode()'});
|
|
|
|
|
2017-03-29 21:40:07 +00:00
|
|
|
Protocol.Runtime.onConsoleAPICalled(null);
|
|
|
|
await Protocol.Debugger.disable();
|
|
|
|
await Protocol.Runtime.disable();
|
|
|
|
},
|
|
|
|
|
|
|
|
async function testProfile() {
|
|
|
|
await Protocol.Profiler.enable();
|
|
|
|
InspectorTest.logMessage(await Protocol.Runtime.evaluate({expression: 'profile', includeCommandLineAPI: true}));
|
|
|
|
InspectorTest.logMessage(await Protocol.Runtime.evaluate({expression: 'profileEnd', includeCommandLineAPI: true}));
|
|
|
|
|
|
|
|
Protocol.Runtime.evaluate({expression: 'profile(42)', includeCommandLineAPI: true});
|
|
|
|
InspectorTest.logMessage(await Protocol.Profiler.onceConsoleProfileStarted());
|
|
|
|
Protocol.Runtime.evaluate({expression: 'profileEnd(42)', includeCommandLineAPI: true});
|
|
|
|
let message = await Protocol.Profiler.onceConsoleProfileFinished();
|
|
|
|
message.params.profile = '<profile>';
|
|
|
|
InspectorTest.logMessage(message);
|
|
|
|
|
|
|
|
Protocol.Runtime.evaluate({
|
|
|
|
expression: 'this.profile = profile; this.profileEnd = profileEnd;', includeCommandLineAPI: true});
|
|
|
|
Protocol.Runtime.evaluate({expression: 'this.profile(239)'});
|
|
|
|
InspectorTest.logMessage(await Protocol.Profiler.onceConsoleProfileStarted());
|
|
|
|
Protocol.Runtime.evaluate({expression: 'this.profileEnd(239)'});
|
|
|
|
message = await Protocol.Profiler.onceConsoleProfileFinished();
|
|
|
|
message.params.profile = '<profile>';
|
|
|
|
InspectorTest.logMessage(message);
|
|
|
|
|
|
|
|
await Protocol.Profiler.disable();
|
|
|
|
},
|
|
|
|
|
|
|
|
async function testDir() {
|
|
|
|
InspectorTest.logMessage(await Protocol.Runtime.evaluate({expression: 'dir', includeCommandLineAPI: true}));
|
|
|
|
|
|
|
|
await Protocol.Runtime.enable();
|
|
|
|
Protocol.Runtime.evaluate({expression: 'dir({})', includeCommandLineAPI: true});
|
|
|
|
InspectorTest.logMessage(await Protocol.Runtime.onceConsoleAPICalled());
|
|
|
|
Protocol.Runtime.evaluate({expression: 'dir(42)', includeCommandLineAPI: true});
|
|
|
|
InspectorTest.logMessage(await Protocol.Runtime.onceConsoleAPICalled());
|
|
|
|
|
|
|
|
Protocol.Runtime.evaluate({expression: 'this.dir = dir', includeCommandLineAPI: true});
|
|
|
|
Protocol.Runtime.evaluate({expression: 'this.dir({})'});
|
|
|
|
InspectorTest.logMessage(await Protocol.Runtime.onceConsoleAPICalled());
|
|
|
|
await Protocol.Runtime.disable();
|
|
|
|
},
|
|
|
|
|
|
|
|
async function testDirXML() {
|
|
|
|
InspectorTest.logMessage(await Protocol.Runtime.evaluate({expression: 'dirxml', includeCommandLineAPI: true}));
|
|
|
|
|
|
|
|
await Protocol.Runtime.enable();
|
|
|
|
Protocol.Runtime.evaluate({expression: 'dirxml({})', includeCommandLineAPI: true});
|
|
|
|
InspectorTest.logMessage(await Protocol.Runtime.onceConsoleAPICalled());
|
|
|
|
Protocol.Runtime.evaluate({expression: 'dirxml(42)', includeCommandLineAPI: true});
|
|
|
|
InspectorTest.logMessage(await Protocol.Runtime.onceConsoleAPICalled());
|
|
|
|
await Protocol.Runtime.disable();
|
|
|
|
},
|
|
|
|
|
|
|
|
async function testTable() {
|
|
|
|
InspectorTest.logMessage(await Protocol.Runtime.evaluate({expression: 'table', includeCommandLineAPI: true}));
|
|
|
|
|
|
|
|
await Protocol.Runtime.enable();
|
|
|
|
Protocol.Runtime.evaluate({expression: 'table({})', includeCommandLineAPI: true});
|
|
|
|
InspectorTest.logMessage(await Protocol.Runtime.onceConsoleAPICalled());
|
|
|
|
Protocol.Runtime.evaluate({expression: 'table(42)', includeCommandLineAPI: true});
|
|
|
|
InspectorTest.logMessage(await Protocol.Runtime.onceConsoleAPICalled());
|
|
|
|
await Protocol.Runtime.disable();
|
|
|
|
},
|
|
|
|
|
|
|
|
async function testClear() {
|
|
|
|
InspectorTest.logMessage(await Protocol.Runtime.evaluate({expression: 'clear', includeCommandLineAPI: true}));
|
|
|
|
|
|
|
|
await Protocol.Runtime.enable();
|
|
|
|
Protocol.Runtime.evaluate({expression: 'clear()', includeCommandLineAPI: true});
|
|
|
|
InspectorTest.logMessage(await Protocol.Runtime.onceConsoleAPICalled());
|
|
|
|
|
|
|
|
Protocol.Runtime.evaluate({expression: 'this.clear = clear', includeCommandLineAPI: true});
|
|
|
|
Protocol.Runtime.evaluate({expression: 'this.clear()'});
|
|
|
|
InspectorTest.logMessage(await Protocol.Runtime.onceConsoleAPICalled());
|
|
|
|
await Protocol.Runtime.disable();
|
|
|
|
}
|
|
|
|
]);
|
2017-08-24 00:03:53 +00:00
|
|
|
|
|
|
|
async function isEqual(objectId1, objectId2) {
|
|
|
|
return (await Protocol.Runtime.callFunctionOn({
|
|
|
|
objectId: objectId1,
|
|
|
|
functionDeclaration: 'function(arg){return this === arg;}',
|
|
|
|
returnByValue: true,
|
|
|
|
arguments: [{objectId: objectId2}]
|
|
|
|
})).result.result.value;
|
|
|
|
}
|