1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
|
/* 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/. */
/* globals AppConstants, ExtensionAPI, Services */
function loadChromeScripts(win) {
Services.scriptloader.loadSubScript(
"chrome://mochikit/content/chrome-harness.js",
win
);
Services.scriptloader.loadSubScript(
"chrome://mochikit/content/mochitest-e10s-utils.js",
win
);
Services.scriptloader.loadSubScript(
"chrome://mochikit/content/browser-test.js",
win
);
}
// ///// Android ///////
const windowTracker = {
init() {
Services.obs.addObserver(this, "chrome-document-global-created");
},
async observe(window, topic) {
if (topic === "chrome-document-global-created") {
await new Promise(resolve =>
window.addEventListener("DOMContentLoaded", resolve, { once: true })
);
let { document } = window;
let { documentURI } = document;
if (documentURI !== AppConstants.BROWSER_CHROME_URL) {
return;
}
loadChromeScripts(window);
}
},
};
function androidStartup() {
// Only browser chrome tests need help starting.
let testRoot = Services.prefs.getStringPref("mochitest.testRoot", "");
if (testRoot.endsWith("/chrome")) {
// The initial window is created from browser startup, which races
// against extension initialization. If it has already been created,
// inject the test scripts now, otherwise wait for the browser window
// to show up.
let win = Services.wm.getMostRecentWindow("navigator:browser");
if (win) {
loadChromeScripts(win);
return;
}
windowTracker.init();
}
Services.fog.initializeFOG();
}
// ///// Desktop ///////
// Special case for Thunderbird windows.
const IS_THUNDERBIRD =
Services.appinfo.ID == "{3550f703-e582-4d05-9a08-453d09bdfdc6}";
const WINDOW_TYPE = IS_THUNDERBIRD ? "mail:3pane" : "navigator:browser";
var WindowListener = {
// browser-test.js is only loaded into the first window. Setup that
// needs to happen in all navigator:browser windows should go here.
setupWindow(win) {
win.nativeConsole = win.console;
let { ConsoleAPI } = ChromeUtils.importESModule(
"resource://gre/modules/Console.sys.mjs"
);
win.console = new ConsoleAPI();
},
tearDownWindow(win) {
if (win.nativeConsole) {
win.console = win.nativeConsole;
win.nativeConsole = undefined;
}
},
onOpenWindow(xulWin) {
let win = xulWin.docShell.domWindow;
win.addEventListener(
"load",
function () {
if (
win.document.documentElement.getAttribute("windowtype") == WINDOW_TYPE
) {
WindowListener.setupWindow(win);
}
},
{ once: true }
);
},
};
function loadMochitest(e) {
let flavor = e.detail[0];
let url = e.detail[1];
let win = Services.wm.getMostRecentWindow(WINDOW_TYPE);
win.removeEventListener("mochitest-load", loadMochitest);
// for mochitest-plain, navigating to the url is all we need
if (!IS_THUNDERBIRD) {
win.openLinkIn(url, "current", {
triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal(),
});
}
if (flavor == "mochitest") {
return;
}
WindowListener.setupWindow(win);
Services.wm.addListener(WindowListener);
loadChromeScripts(win);
}
this.mochikit = class extends ExtensionAPI {
onStartup() {
let aomStartup = Cc[
"@mozilla.org/addons/addon-manager-startup;1"
].getService(Ci.amIAddonManagerStartup);
const manifestURI = Services.io.newURI(
"manifest.json",
null,
this.extension.rootURI
);
const targetURL = this.extension.rootURI.resolve("content/");
this.chromeHandle = aomStartup.registerChrome(manifestURI, [
["content", "mochikit", targetURL],
]);
if (AppConstants.platform == "android") {
androidStartup();
} else {
let win = Services.wm.getMostRecentWindow(WINDOW_TYPE);
// wait for event fired from start_desktop.js containing the
// suite and url to load
win.addEventListener("mochitest-load", loadMochitest);
}
}
onShutdown() {
if (AppConstants.platform != "android") {
for (let win of Services.wm.getEnumerator(WINDOW_TYPE)) {
WindowListener.tearDownWindow(win);
}
Services.wm.removeListener(WindowListener);
}
this.chromeHandle.destruct();
this.chromeHandle = null;
}
};
|