In a following patch, all DevTools moz.build files will use DevToolsModules to install JS modules at a path that corresponds directly to their source tree location. Here we rewrite all require and import calls to match the new location that these files are installed to.
221 lines
5.9 KiB
JavaScript
221 lines
5.9 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
"use strict";
|
|
|
|
const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
|
|
|
|
const XHTML_NS = "http://www.w3.org/1999/xhtml";
|
|
|
|
Cu.import("resource://gre/modules/Services.jsm");
|
|
const {Task} = Cu.import("resource://gre/modules/Task.jsm", {});
|
|
|
|
// This gives logging to stdout for tests
|
|
var {console} = Cu.import("resource://gre/modules/devtools/shared/Console.jsm", {});
|
|
|
|
var {require} = Cu.import("resource://gre/modules/devtools/shared/Loader.jsm", {});
|
|
var WebConsoleUtils = require("devtools/shared/webconsole/utils").Utils;
|
|
|
|
var ConsoleAPIStorage = Cc["@mozilla.org/consoleAPI-storage;1"]
|
|
.getService(Ci.nsIConsoleAPIStorage);
|
|
var {DebuggerServer} = require("devtools/server/main");
|
|
var {DebuggerClient, ObjectClient} = require("devtools/shared/client/main");
|
|
|
|
var {ConsoleServiceListener, ConsoleAPIListener} =
|
|
require("devtools/shared/webconsole/utils");
|
|
|
|
function initCommon()
|
|
{
|
|
//Services.prefs.setBoolPref("devtools.debugger.log", true);
|
|
}
|
|
|
|
function initDebuggerServer()
|
|
{
|
|
if (!DebuggerServer.initialized) {
|
|
DebuggerServer.init();
|
|
DebuggerServer.addBrowserActors();
|
|
}
|
|
DebuggerServer.allowChromeProcess = true;
|
|
}
|
|
|
|
function connectToDebugger(aCallback)
|
|
{
|
|
initCommon();
|
|
initDebuggerServer();
|
|
|
|
let transport = DebuggerServer.connectPipe();
|
|
let client = new DebuggerClient(transport);
|
|
|
|
let dbgState = { dbgClient: client };
|
|
client.connect(aCallback.bind(null, dbgState));
|
|
}
|
|
|
|
function attachConsole(aListeners, aCallback, aAttachToTab)
|
|
{
|
|
function _onAttachConsole(aState, aResponse, aWebConsoleClient)
|
|
{
|
|
if (aResponse.error) {
|
|
Cu.reportError("attachConsole failed: " + aResponse.error + " " +
|
|
aResponse.message);
|
|
}
|
|
|
|
aState.client = aWebConsoleClient;
|
|
|
|
aCallback(aState, aResponse);
|
|
}
|
|
|
|
connectToDebugger(function _onConnect(aState, aResponse) {
|
|
if (aResponse.error) {
|
|
Cu.reportError("client.connect() failed: " + aResponse.error + " " +
|
|
aResponse.message);
|
|
aCallback(aState, aResponse);
|
|
return;
|
|
}
|
|
|
|
if (aAttachToTab) {
|
|
aState.dbgClient.listTabs(function _onListTabs(aResponse) {
|
|
if (aResponse.error) {
|
|
Cu.reportError("listTabs failed: " + aResponse.error + " " +
|
|
aResponse.message);
|
|
aCallback(aState, aResponse);
|
|
return;
|
|
}
|
|
let tab = aResponse.tabs[aResponse.selected];
|
|
let consoleActor = tab.consoleActor;
|
|
aState.dbgClient.attachTab(tab.actor, function () {
|
|
aState.actor = consoleActor;
|
|
aState.dbgClient.attachConsole(consoleActor, aListeners,
|
|
_onAttachConsole.bind(null, aState));
|
|
});
|
|
});
|
|
} else {
|
|
aState.dbgClient.getProcess().then(response => {
|
|
aState.dbgClient.attachTab(response.form.actor, function () {
|
|
let consoleActor = response.form.consoleActor;
|
|
aState.actor = consoleActor;
|
|
aState.dbgClient.attachConsole(consoleActor, aListeners,
|
|
_onAttachConsole.bind(null, aState));
|
|
});
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
function closeDebugger(aState, aCallback)
|
|
{
|
|
aState.dbgClient.close(aCallback);
|
|
aState.dbgClient = null;
|
|
aState.client = null;
|
|
}
|
|
|
|
function checkConsoleAPICall(aCall, aExpected)
|
|
{
|
|
if (aExpected.level != "trace" && aExpected.arguments) {
|
|
is(aCall.arguments.length, aExpected.arguments.length,
|
|
"number of arguments");
|
|
}
|
|
|
|
checkObject(aCall, aExpected);
|
|
}
|
|
|
|
function checkObject(aObject, aExpected)
|
|
{
|
|
for (let name of Object.keys(aExpected))
|
|
{
|
|
let expected = aExpected[name];
|
|
let value = aObject[name];
|
|
checkValue(name, value, expected);
|
|
}
|
|
}
|
|
|
|
function checkValue(aName, aValue, aExpected)
|
|
{
|
|
if (aExpected === null) {
|
|
ok(!aValue, "'" + aName + "' is null");
|
|
}
|
|
else if (aValue === undefined) {
|
|
ok(false, "'" + aName + "' is undefined");
|
|
}
|
|
else if (aValue === null) {
|
|
ok(false, "'" + aName + "' is null");
|
|
}
|
|
else if (typeof aExpected == "string" || typeof aExpected == "number" ||
|
|
typeof aExpected == "boolean") {
|
|
is(aValue, aExpected, "property '" + aName + "'");
|
|
}
|
|
else if (aExpected instanceof RegExp) {
|
|
ok(aExpected.test(aValue), aName + ": " + aExpected + " matched " + aValue);
|
|
}
|
|
else if (Array.isArray(aExpected)) {
|
|
info("checking array for property '" + aName + "'");
|
|
checkObject(aValue, aExpected);
|
|
}
|
|
else if (typeof aExpected == "object") {
|
|
info("checking object for property '" + aName + "'");
|
|
checkObject(aValue, aExpected);
|
|
}
|
|
}
|
|
|
|
function checkHeadersOrCookies(aArray, aExpected)
|
|
{
|
|
let foundHeaders = {};
|
|
|
|
for (let elem of aArray) {
|
|
if (!(elem.name in aExpected)) {
|
|
continue;
|
|
}
|
|
foundHeaders[elem.name] = true;
|
|
info("checking value of header " + elem.name);
|
|
checkValue(elem.name, elem.value, aExpected[elem.name]);
|
|
}
|
|
|
|
for (let header in aExpected) {
|
|
if (!(header in foundHeaders)) {
|
|
ok(false, header + " was not found");
|
|
}
|
|
}
|
|
}
|
|
|
|
function checkRawHeaders(aText, aExpected)
|
|
{
|
|
let headers = aText.split(/\r\n|\n|\r/);
|
|
let arr = [];
|
|
for (let header of headers) {
|
|
let index = header.indexOf(": ");
|
|
if (index < 0) {
|
|
continue;
|
|
}
|
|
arr.push({
|
|
name: header.substr(0, index),
|
|
value: header.substr(index + 2)
|
|
});
|
|
}
|
|
|
|
checkHeadersOrCookies(arr, aExpected);
|
|
}
|
|
|
|
var gTestState = {};
|
|
|
|
function runTests(aTests, aEndCallback)
|
|
{
|
|
function* driver()
|
|
{
|
|
let lastResult, sendToNext;
|
|
for (let i = 0; i < aTests.length; i++) {
|
|
gTestState.index = i;
|
|
let fn = aTests[i];
|
|
info("will run test #" + i + ": " + fn.name);
|
|
lastResult = fn(sendToNext, lastResult);
|
|
sendToNext = yield lastResult;
|
|
}
|
|
yield aEndCallback(sendToNext, lastResult);
|
|
}
|
|
gTestState.driver = driver();
|
|
return gTestState.driver.next();
|
|
}
|
|
|
|
function nextTest(aMessage)
|
|
{
|
|
return gTestState.driver.next(aMessage);
|
|
}
|