summaryrefslogtreecommitdiffstats
path: root/testing/talos/talos/pageloader/api.js
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--testing/talos/talos/pageloader/api.js136
1 files changed, 136 insertions, 0 deletions
diff --git a/testing/talos/talos/pageloader/api.js b/testing/talos/talos/pageloader/api.js
new file mode 100644
index 0000000000..7a88d0e62c
--- /dev/null
+++ b/testing/talos/talos/pageloader/api.js
@@ -0,0 +1,136 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is DOM Inspector.
+ *
+ * The Initial Developer of the Original Code is
+ * Christopher A. Aillon <christopher@aillon.com>.
+ * Portions created by the Initial Developer are Copyright (C) 2003
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Christopher A. Aillon <christopher@aillon.com>
+ * L. David Baron, Mozilla Corporation <dbaron@dbaron.org> (modified for reftest)
+ * Vladimir Vukicevic, Mozilla Corporation <dbaron@dbaron.org> (modified for tp)
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+/* globals AppConstants, Services, XPCOMUtils */
+
+const { setTimeout } = ChromeUtils.importESModule(
+ "resource://gre/modules/Timer.sys.mjs"
+);
+
+XPCOMUtils.defineLazyServiceGetter(
+ this,
+ "aomStartup",
+ "@mozilla.org/addons/addon-manager-startup;1",
+ "amIAddonManagerStartup"
+);
+
+async function talosStart() {
+ // Tests are driven from pageloader.xhtml. We need to be careful to open
+ // pageloader.xhtml before dismissing the default browser window or we
+ // may inadvertently cause the browser to exit before the pageloader.xhtml
+ // window is opened. Start by finding or waiting for the default window.
+ let defaultWin = Services.wm.getMostRecentWindow("navigator:browser");
+ if (!defaultWin) {
+ defaultWin = await new Promise(resolve => {
+ const listener = {
+ onOpenWindow(win) {
+ if (
+ win.docShell.domWindow.location.href ==
+ AppConstants.BROWSER_CHROME_URL
+ ) {
+ Services.wm.removeListener(listener);
+ resolve(win);
+ }
+ },
+ };
+ Services.wm.addListener(listener);
+ });
+ }
+
+ // Wwe've got the default window, it is time for pageloader to take over.
+ // Open pageloader.xhtml in a new window and then close the default window.
+ let chromeURL = "chrome://pageloader/content/pageloader.xhtml";
+
+ let args = {};
+ args.wrappedJSObject = args;
+ let newWin = Services.ww.openWindow(
+ null,
+ chromeURL,
+ "_blank",
+ "chrome,dialog=no,all",
+ args
+ );
+
+ await new Promise(resolve => {
+ newWin.addEventListener("load", resolve);
+ });
+ defaultWin.close();
+}
+
+/* globals ExtensionAPI */
+this.pageloader = class extends ExtensionAPI {
+ onStartup() {
+ const manifestURI = Services.io.newURI(
+ "manifest.json",
+ null,
+ this.extension.rootURI
+ );
+ this.chromeHandle = aomStartup.registerChrome(manifestURI, [
+ ["content", "pageloader", "chrome/"],
+ ]);
+
+ if (Services.env.exists("MOZ_USE_PAGELOADER")) {
+ // TalosPowers is a separate WebExtension that may or may not already have
+ // finished loading. tryLoad is used to wait for TalosPowers to be around
+ // before continuing.
+ async function tryLoad() {
+ try {
+ ChromeUtils.importESModule(
+ "resource://talos-powers/TalosParentProfiler.sys.mjs"
+ );
+ } catch (err) {
+ await new Promise(resolve => setTimeout(resolve, 500));
+ return tryLoad();
+ }
+
+ return null;
+ }
+
+ // talosStart is async but we're deliberately not await-ing or return-ing
+ // it here since it doesn't block extension startup.
+ tryLoad().then(() => {
+ talosStart();
+ });
+ }
+ }
+
+ onShutdown() {
+ this.chromeHandle.destruct();
+ }
+};