summaryrefslogtreecommitdiffstats
path: root/comm/mail/modules/MailE10SUtils.jsm
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mail/modules/MailE10SUtils.jsm')
-rw-r--r--comm/mail/modules/MailE10SUtils.jsm98
1 files changed, 98 insertions, 0 deletions
diff --git a/comm/mail/modules/MailE10SUtils.jsm b/comm/mail/modules/MailE10SUtils.jsm
new file mode 100644
index 0000000000..224dd50a71
--- /dev/null
+++ b/comm/mail/modules/MailE10SUtils.jsm
@@ -0,0 +1,98 @@
+/* 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/. */
+
+const EXPORTED_SYMBOLS = ["MailE10SUtils"];
+
+const { E10SUtils } = ChromeUtils.importESModule(
+ "resource://gre/modules/E10SUtils.sys.mjs"
+);
+const { ExtensionParent } = ChromeUtils.importESModule(
+ "resource://gre/modules/ExtensionParent.sys.mjs"
+);
+
+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} uri
+ * @param {object} params
+ */
+ loadURI(browser, uri, params = {}) {
+ let multiProcess = browser.ownerGlobal.docShell.QueryInterface(
+ Ci.nsILoadContext
+ ).useRemoteTabs;
+ let remoteSubframes = browser.ownerGlobal.docShell.QueryInterface(
+ Ci.nsILoadContext
+ ).useRemoteSubframes;
+
+ let isRemote = browser.getAttribute("remote") == "true";
+ let remoteType = E10SUtils.getRemoteTypeForURI(
+ uri,
+ multiProcess,
+ remoteSubframes
+ );
+ let shouldBeRemote = remoteType !== E10SUtils.NOT_REMOTE;
+
+ if (shouldBeRemote != isRemote) {
+ this.changeRemoteness(browser, remoteType);
+ }
+
+ params.triggeringPrincipal =
+ params.triggeringPrincipal ||
+ Services.scriptSecurityManager.getSystemPrincipal();
+ browser.fixupAndLoadURIString(uri, params);
+ },
+
+ /**
+ * Force `browser` to be a remote/local browser.
+ *
+ * @see E10SUtils.jsm 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();
+
+ if (remoteType) {
+ browser.setAttribute("remote", "true");
+ browser.setAttribute("remoteType", remoteType);
+ } else {
+ browser.setAttribute("remote", "false");
+ browser.removeAttribute("remoteType");
+ }
+
+ browser.changeRemoteness({ remoteType });
+ browser.construct();
+ ExtensionParent.apiManager.emit("extension-browser-inserted", browser);
+
+ return true;
+ },
+};