143 lines
3.5 KiB
JavaScript
143 lines
3.5 KiB
JavaScript
var util = require('util');
|
|
|
|
var DBG_INITIAL_SUGGESTIONS =
|
|
['repl', 'c', 'frame', 'scopes', 'scripts', 'source', 'backtrace'];
|
|
|
|
/**
|
|
* Repl to step through webdriver test code.
|
|
*
|
|
* @param {Client} node debugger client.
|
|
* @constructor
|
|
*/
|
|
var DebuggerRepl = function(client) {
|
|
this.client = client;
|
|
this.prompt = '>>> ';
|
|
};
|
|
|
|
/**
|
|
* Eval function for processing a single step in repl.
|
|
* Call callback with the result when complete.
|
|
*
|
|
* @public
|
|
* @param {string} cmd
|
|
* @param {function} callback
|
|
*/
|
|
DebuggerRepl.prototype.stepEval = function(cmd, callback) {
|
|
switch (cmd) {
|
|
case 'c':
|
|
this.printNextStep_(callback);
|
|
this.client.reqContinue(function() {
|
|
// Intentionally blank.
|
|
});
|
|
break;
|
|
case 'repl':
|
|
console.log('Error: using repl from browser.pause() has been removed. ' +
|
|
'Please use browser.enterRepl instead.');
|
|
callback();
|
|
break;
|
|
case 'schedule':
|
|
this.printControlFlow_(callback);
|
|
break;
|
|
case 'frame':
|
|
this.client.req({command: 'frame'}, function(err, res) {
|
|
console.log(util.inspect(res, {colors: true}));
|
|
callback();
|
|
});
|
|
break;
|
|
case 'scopes':
|
|
this.client.req({command: 'scopes'}, function(err, res) {
|
|
console.log(util.inspect(res, {depth: 4, colors: true}));
|
|
callback();
|
|
});
|
|
break;
|
|
case 'scripts':
|
|
this.client.req({command: 'scripts'}, function(err, res) {
|
|
console.log(util.inspect(res, {depth: 4, colors: true}));
|
|
callback();
|
|
});
|
|
break;
|
|
case 'source':
|
|
this.client.req({command: 'source'}, function(err, res) {
|
|
console.log(util.inspect(res, {depth: 4, colors: true}));
|
|
callback();
|
|
});
|
|
break;
|
|
case 'backtrace':
|
|
this.client.req({command: 'backtrace'}, function(err, res) {
|
|
console.log(util.inspect(res, {depth: 4, colors: true}));
|
|
callback();
|
|
});
|
|
break;
|
|
default:
|
|
console.log('Unrecognized command.');
|
|
callback();
|
|
break;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Autocomplete user entries.
|
|
* Call callback with the suggestions.
|
|
*
|
|
* @public
|
|
* @param {string} line Initial user entry
|
|
* @param {function} callback
|
|
*/
|
|
DebuggerRepl.prototype.complete = function(line, callback) {
|
|
var suggestions = DBG_INITIAL_SUGGESTIONS.filter(function(suggestion) {
|
|
return suggestion.indexOf(line) === 0;
|
|
});
|
|
console.log('suggestions');
|
|
callback(null, [suggestions, line]);
|
|
};
|
|
|
|
/**
|
|
* Print the next command and setup the next breakpoint.
|
|
*
|
|
* @private
|
|
* @param {function} callback
|
|
*/
|
|
DebuggerRepl.prototype.printNextStep_ = function(callback) {
|
|
var self = this;
|
|
var onBreak_ = function() {
|
|
self.client.req({
|
|
command: 'evaluate',
|
|
arguments: {
|
|
frame: 0,
|
|
maxStringLength: 1000,
|
|
expression: 'command.getName()'
|
|
}
|
|
}, function(err, res) {
|
|
// We ignore errors here because we'll get one from the initial break.
|
|
if (res.value) {
|
|
console.log('-- Next command: ' + res.value);
|
|
}
|
|
callback();
|
|
});
|
|
};
|
|
this.client.once('break', onBreak_);
|
|
};
|
|
|
|
/**
|
|
* Print the controlflow.
|
|
*
|
|
* @private
|
|
* @param {function} callback
|
|
*/
|
|
DebuggerRepl.prototype.printControlFlow_ = function(callback) {
|
|
this.client.req({
|
|
command: 'evaluate',
|
|
arguments: {
|
|
frame: 0,
|
|
maxStringLength: 4000,
|
|
expression: 'protractor.promise.controlFlow().getSchedule()'
|
|
}
|
|
}, function(err, controlFlowResponse) {
|
|
if (controlFlowResponse.value) {
|
|
console.log(controlFlowResponse.value);
|
|
}
|
|
callback();
|
|
});
|
|
};
|
|
|
|
module.exports = DebuggerRepl;
|