/* 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/. */ import { E10SUtils } from "resource://gre/modules/E10SUtils.sys.mjs"; import { ExtensionParent } from "resource://gre/modules/ExtensionParent.sys.mjs"; export var MailE10SUtils = { /** * Loads about:blank in `browser` without switching remoteness. about:blank * can load in a local browser or a remote browser, and `loadURI` will make * it load in a remote browser even if you don't want it to. * * @param {nsIBrowser} browser */ loadAboutBlank(browser) { if (!browser.currentURI || browser.currentURI.spec == "about:blank") { return; } browser.loadURI(Services.io.newURI("about:blank"), { triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal(), remoteTypeOverride: browser.remoteType, }); }, /** * Loads `uri` in `browser`, changing to a remote/local browser if necessary. * * @see `nsIWebNavigation.loadURI` * * @param {nsIBrowser} browser * @param {string} url * @param {object} params */ loadURI(browser, url, params = {}) { const uri = Services.io.newURI(url); const remoteType = ChromeUtils.predictRemoteTypeForURI(uri, { window: browser.documentGlobal, }); const isRemote = browser.hasAttribute("remote"); const shouldBeRemote = remoteType !== E10SUtils.NOT_REMOTE; if (shouldBeRemote != isRemote) { this.changeRemoteness(browser, remoteType); } params.triggeringPrincipal = params.triggeringPrincipal || Services.scriptSecurityManager.getSystemPrincipal(); browser.fixupAndLoadURIString(url, params); }, /** * Force `browser` to be a remote/local browser. * * @see E10SUtils.sys.mjs for remote types. * * @param {nsIBrowser} browser - the browser to enforce the remoteness of. * @param {string} remoteType - the remoteness to enforce. * @returns {boolean} true if any change happened on the browser (which would * not be the case if its remoteness is already in the correct state). */ changeRemoteness(browser, remoteType) { if (browser.remoteType == remoteType) { return false; } browser.destroy(); browser.toggleAttribute("remote", !!remoteType); if (remoteType) { browser.setAttribute("remoteType", remoteType); } else { browser.removeAttribute("remoteType"); } browser.changeRemoteness({ remoteType }); browser.construct(); ExtensionParent.apiManager.emit("extension-browser-inserted", browser); return true; }, };