Bug 1596918: Part 1c - Make some more globals available to SpecialPowers.spawn tasks. r=mccr8

A number of additional globals are available to ContentTask.spawn tasks
compared to SpecialPowers.spawn tasks. Most of these are available by
accident, as a side-effect of running in a shared frame script global, or
being evaled in the context of the content-task.js frame script, but several
of them are pretty broadly useful, or difficult to obtain from a Sandbox
environment without reaching into arbitrary nearby globals.

This patch adds some of the more useful ones to the default task environment.

Differential Revision: https://phabricator.services.mozilla.com/D53736

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Kris Maglione 2019-12-07 18:44:32 +00:00
Родитель d22440c671
Коммит 4e0f1f1f23
4 изменённых файлов: 71 добавлений и 8 удалений

Просмотреть файл

@ -1709,12 +1709,17 @@ class SpecialPowersChild extends JSWindowActorChild {
sb.sandbox.SpecialPowers = this;
sb.sandbox.ContentTaskUtils = ContentTaskUtils;
Object.defineProperty(sb.sandbox, "content", {
get: () => {
return this.contentWindow;
},
enumerable: true,
});
for (let [global, prop] of Object.entries({
content: "contentWindow",
docShell: "docShell",
})) {
Object.defineProperty(sb.sandbox, global, {
get: () => {
return this[prop];
},
enumerable: true,
});
}
return sb.execute(task, args, caller);
}

Просмотреть файл

@ -0,0 +1,42 @@
/* 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/. */
"use strict";
var EXPORTED_SYMBOLS = ["EventUtils"];
/**
* Loads a stub copy of EventUtils.js which can be used by things like
* content tasks without holding any direct references to windows.
*/
const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
let EventUtils = {};
EventUtils.window = {};
EventUtils.parent = EventUtils.window;
EventUtils._EU_Ci = Ci;
EventUtils._EU_Cc = Cc;
EventUtils.synthesizeClick = element =>
new Promise(resolve => {
element.addEventListener("click", () => resolve(), { once: true });
EventUtils.synthesizeMouseAtCenter(
element,
{ type: "mousedown", isSynthesized: false },
element.ownerGlobal
);
EventUtils.synthesizeMouseAtCenter(
element,
{ type: "mouseup", isSynthesized: false },
element.ownerGlobal
);
});
Services.scriptloader.loadSubScript(
"chrome://mochikit/content/tests/SimpleTest/EventUtils.js",
EventUtils
);

Просмотреть файл

@ -18,6 +18,14 @@ ChromeUtils.defineModuleGetter(
"resource://testing-common/Assert.jsm"
);
const SANDBOX_GLOBALS = [
"Blob",
"ChromeUtils",
"TextDecoder",
"TextEncoder",
"URL",
];
let expectFail = false;
function expectingFail(fn) {
try {
@ -38,7 +46,7 @@ class SpecialPowersSandbox {
this.sandbox = Cu.Sandbox(
Cu.getGlobalForObject({}),
Object.assign(
{ wantGlobalProperties: ["ChromeUtils"] },
{ wantGlobalProperties: SANDBOX_GLOBALS },
opts.sandboxOptions
)
);
@ -53,11 +61,18 @@ class SpecialPowersSandbox {
});
}
for (let [symbol, url] of Object.entries(opts.imports || {})) {
let imports = {
EventUtils: "resource://specialpowers/SpecialPowersEventUtils.jsm",
Services: "resource://gre/modules/Services.jsm",
...opts.imports,
};
for (let [symbol, url] of Object.entries(imports)) {
ChromeUtils.defineModuleGetter(this.sandbox, symbol, url);
}
Object.assign(this.sandbox, {
BrowsingContext,
InspectorUtils,
ok: (...args) => {
this.Assert.ok(...args);
},

Просмотреть файл

@ -20,6 +20,7 @@ FINAL_TARGET_FILES.content += [
'content/MockFilePicker.jsm',
'content/MockPermissionPrompt.jsm',
'content/SpecialPowersChild.jsm',
'content/SpecialPowersEventUtils.jsm',
'content/SpecialPowersParent.jsm',
'content/SpecialPowersSandbox.jsm',
'content/WrapPrivileged.jsm',