summaryrefslogtreecommitdiffstats
path: root/comm/mail/modules/MailE10SUtils.jsm
blob: 224dd50a7155a68ce36b9397bcd21576e394dbed (plain)
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
/* 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;
  },
};