133 lines
3.4 KiB
JavaScript
133 lines
3.4 KiB
JavaScript
/* exported attachURL, promiseDone,
|
|
promiseOnce,
|
|
addTest, addAsyncTest,
|
|
runNextTest, _documentWalker */
|
|
"use strict";
|
|
|
|
const { require } = ChromeUtils.importESModule(
|
|
"resource://devtools/shared/loader/Loader.sys.mjs"
|
|
);
|
|
const {
|
|
CommandsFactory,
|
|
} = require("resource://devtools/shared/commands/commands-factory.js");
|
|
const {
|
|
DevToolsServer,
|
|
} = require("resource://devtools/server/devtools-server.js");
|
|
const { BrowserTestUtils } = ChromeUtils.importESModule(
|
|
"resource://testing-common/BrowserTestUtils.sys.mjs"
|
|
);
|
|
const {
|
|
DocumentWalker: _documentWalker,
|
|
} = require("resource://devtools/server/actors/inspector/document-walker.js");
|
|
|
|
// Always log packets when running tests.
|
|
Services.prefs.setBoolPref("devtools.debugger.log", true);
|
|
SimpleTest.registerCleanupFunction(function () {
|
|
Services.prefs.clearUserPref("devtools.debugger.log");
|
|
});
|
|
|
|
if (!DevToolsServer.initialized) {
|
|
DevToolsServer.init();
|
|
DevToolsServer.registerAllActors();
|
|
SimpleTest.registerCleanupFunction(function () {
|
|
DevToolsServer.destroy();
|
|
});
|
|
}
|
|
|
|
var gAttachCleanups = [];
|
|
|
|
SimpleTest.registerCleanupFunction(function () {
|
|
for (const cleanup of gAttachCleanups) {
|
|
cleanup();
|
|
}
|
|
});
|
|
|
|
/**
|
|
* Open a tab, load the url, wait for it to signal its readiness,
|
|
* connect to this tab via DevTools protocol and return.
|
|
*
|
|
* Returns an object with a few helpful attributes:
|
|
* - commands {Object}: The commands object defined by modules from devtools/shared/commands
|
|
* - target {TargetFront}: The current top-level target front.
|
|
* - doc {HtmlDocument}: the tab's document that got opened
|
|
*/
|
|
async function attachURL(url) {
|
|
// Get the current browser window
|
|
const gBrowser =
|
|
Services.wm.getMostRecentWindow("navigator:browser").gBrowser;
|
|
|
|
// open the url in a new tab, save a reference to the new inner window global object
|
|
// and wait for it to load. The tests rely on this window object to send a "ready"
|
|
// event to its opener (the test page). This window reference is used within
|
|
// the test tab, to reference the webpage being tested against, which is in another
|
|
// tab.
|
|
const windowOpened = BrowserTestUtils.waitForNewTab(gBrowser, url);
|
|
const win = window.open(url, "_blank");
|
|
await windowOpened;
|
|
|
|
const commands = await CommandsFactory.forTab(gBrowser.selectedTab);
|
|
await commands.targetCommand.startListening();
|
|
|
|
const cleanup = async function () {
|
|
await commands.destroy();
|
|
if (win) {
|
|
win.close();
|
|
}
|
|
};
|
|
|
|
gAttachCleanups.push(cleanup);
|
|
return {
|
|
commands,
|
|
target: commands.targetCommand.targetFront,
|
|
doc: win.document,
|
|
};
|
|
}
|
|
|
|
function promiseOnce(target, event) {
|
|
return new Promise(resolve => {
|
|
target.on(event, (...args) => {
|
|
if (args.length === 1) {
|
|
resolve(args[0]);
|
|
} else {
|
|
resolve(args);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
function promiseDone(currentPromise) {
|
|
currentPromise.catch(err => {
|
|
ok(false, "Promise failed: " + err);
|
|
if (err.stack) {
|
|
dump(err.stack);
|
|
}
|
|
SimpleTest.finish();
|
|
});
|
|
}
|
|
|
|
var _tests = [];
|
|
function addTest(test) {
|
|
_tests.push(test);
|
|
}
|
|
|
|
function addAsyncTest(generator) {
|
|
_tests.push(() => generator().catch(ok.bind(null, false)));
|
|
}
|
|
|
|
function runNextTest() {
|
|
if (!_tests.length) {
|
|
SimpleTest.finish();
|
|
return;
|
|
}
|
|
const fn = _tests.shift();
|
|
try {
|
|
fn();
|
|
} catch (ex) {
|
|
info(
|
|
"Test function " +
|
|
(fn.name ? "'" + fn.name + "' " : "") +
|
|
"threw an exception: " +
|
|
ex
|
|
);
|
|
}
|
|
}
|