diff options
Diffstat (limited to '')
-rw-r--r-- | testing/talos/talos/pageloader/api.js | 136 |
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(); + } +}; |