129 lines
3.5 KiB
JavaScript
129 lines
3.5 KiB
JavaScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
/* eslint-env mozilla/frame-script */
|
|
|
|
"use strict";
|
|
|
|
let { ContentTaskUtils } = ChromeUtils.importESModule(
|
|
"resource://testing-common/ContentTaskUtils.sys.mjs"
|
|
);
|
|
const { Assert: AssertCls } = ChromeUtils.importESModule(
|
|
"resource://testing-common/Assert.sys.mjs"
|
|
);
|
|
const { setTimeout } = ChromeUtils.importESModule(
|
|
"resource://gre/modules/Timer.sys.mjs"
|
|
);
|
|
|
|
// Injects EventUtils into ContentTask scope. To avoid leaks, this does not hold on
|
|
// to the window global. This means you **need** to pass the window as an argument to
|
|
// the individual EventUtils functions.
|
|
// See SimpleTest/EventUtils.js for documentation.
|
|
var EventUtils = {
|
|
_EU_Ci: Ci,
|
|
_EU_Cc: Cc,
|
|
KeyboardEvent: content.KeyboardEvent,
|
|
navigator: content.navigator,
|
|
setTimeout,
|
|
window: {},
|
|
};
|
|
|
|
EventUtils.synthesizeClick = element =>
|
|
new Promise(resolve => {
|
|
element.addEventListener(
|
|
"click",
|
|
function () {
|
|
resolve();
|
|
},
|
|
{ once: true }
|
|
);
|
|
|
|
EventUtils.synthesizeMouseAtCenter(
|
|
element,
|
|
{ type: "mousedown", isSynthesized: false },
|
|
content
|
|
);
|
|
EventUtils.synthesizeMouseAtCenter(
|
|
element,
|
|
{ type: "mouseup", isSynthesized: false },
|
|
content
|
|
);
|
|
});
|
|
|
|
try {
|
|
Services.scriptloader.loadSubScript(
|
|
"chrome://mochikit/content/tests/SimpleTest/EventUtils.js",
|
|
EventUtils
|
|
);
|
|
} catch (e) {
|
|
// There are some xpcshell tests which may use ContentTask.
|
|
// Just ignore if loading EventUtils fails. Tests that need it
|
|
// will fail anyway.
|
|
EventUtils = null;
|
|
}
|
|
|
|
addMessageListener("content-task:spawn", async function (msg) {
|
|
let id = msg.data.id;
|
|
let source = msg.data.runnable || "()=>{}";
|
|
|
|
function getStack(aStack) {
|
|
let frames = [];
|
|
for (let frame = aStack; frame; frame = frame.caller) {
|
|
frames.push(frame.filename + ":" + frame.name + ":" + frame.lineNumber);
|
|
}
|
|
return frames.join("\n");
|
|
}
|
|
|
|
var Assert = new AssertCls((err, message, stack) => {
|
|
sendAsyncMessage("content-task:test-result", {
|
|
id,
|
|
condition: !err,
|
|
name: err ? err.message : message,
|
|
stack: getStack(err ? err.stack : stack),
|
|
});
|
|
});
|
|
|
|
/* eslint-disable no-unused-vars */
|
|
var ok = Assert.ok.bind(Assert);
|
|
var is = Assert.equal.bind(Assert);
|
|
var isnot = Assert.notEqual.bind(Assert);
|
|
|
|
function todo(expr, name) {
|
|
sendAsyncMessage("content-task:test-todo", { id, expr, name });
|
|
}
|
|
|
|
function todo_is(a, b, name) {
|
|
sendAsyncMessage("content-task:test-todo_is", { id, a, b, name });
|
|
}
|
|
|
|
function info(name) {
|
|
sendAsyncMessage("content-task:test-info", { id, name });
|
|
}
|
|
/* eslint-enable no-unused-vars */
|
|
|
|
// Note that ContentTaskUtils is imported above, so it's also available in the
|
|
// scope of the eval.
|
|
// If more variables are made available, don't forget to update
|
|
// tools/lint/eslint/eslint-plugin-mozilla/lib/rules/import-content-task-globals.js.
|
|
|
|
try {
|
|
let runnablestr = `
|
|
(() => {
|
|
return (${source});
|
|
})();`;
|
|
|
|
// eslint-disable-next-line no-eval
|
|
let runnable = eval(runnablestr);
|
|
let result = await runnable.call(this, msg.data.arg);
|
|
sendAsyncMessage("content-task:complete", {
|
|
id,
|
|
result,
|
|
});
|
|
} catch (ex) {
|
|
sendAsyncMessage("content-task:complete", {
|
|
id,
|
|
error: ex.toString(),
|
|
});
|
|
}
|
|
});
|