summaryrefslogtreecommitdiffstats
path: root/comm/mail/components/AboutRedirector.jsm
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mail/components/AboutRedirector.jsm')
-rw-r--r--comm/mail/components/AboutRedirector.jsm124
1 files changed, 124 insertions, 0 deletions
diff --git a/comm/mail/components/AboutRedirector.jsm b/comm/mail/components/AboutRedirector.jsm
new file mode 100644
index 0000000000..a652ba5a6d
--- /dev/null
+++ b/comm/mail/components/AboutRedirector.jsm
@@ -0,0 +1,124 @@
+/* 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/. */
+
+var EXPORTED_SYMBOLS = ["AboutRedirector"];
+
+function AboutRedirector() {}
+AboutRedirector.prototype = {
+ QueryInterface: ChromeUtils.generateQI(["nsIAboutModule"]),
+
+ // Each entry in the map has the key as the part after the "about:" and the
+ // value as a record with url and flags entries. Note that each addition here
+ // should be coupled with a corresponding addition in mailComponents.manifest.
+ _redirMap: {
+ newserror: {
+ url: "chrome://messenger/content/newsError.xhtml",
+ flags: Ci.nsIAboutModule.ALLOW_SCRIPT,
+ },
+ rights: {
+ url: "chrome://messenger/content/aboutRights.xhtml",
+ flags:
+ Ci.nsIAboutModule.ALLOW_SCRIPT |
+ Ci.nsIAboutModule.URI_SAFE_FOR_UNTRUSTED_CONTENT,
+ },
+ support: {
+ url: "chrome://messenger/content/about-support/aboutSupport.xhtml",
+ flags: Ci.nsIAboutModule.ALLOW_SCRIPT,
+ },
+ preferences: {
+ url: "chrome://messenger/content/preferences/preferences.xhtml",
+ flags: Ci.nsIAboutModule.ALLOW_SCRIPT,
+ },
+ downloads: {
+ url: "chrome://messenger/content/downloads/aboutDownloads.xhtml",
+ flags: Ci.nsIAboutModule.ALLOW_SCRIPT,
+ },
+ policies: {
+ url: "chrome://messenger/content/policies/aboutPolicies.xhtml",
+ flags: Ci.nsIAboutModule.ALLOW_SCRIPT,
+ },
+ accountsettings: {
+ url: "chrome://messenger/content/AccountManager.xhtml",
+ flags: Ci.nsIAboutModule.ALLOW_SCRIPT,
+ },
+ accountsetup: {
+ url: "chrome://messenger/content/accountcreation/accountSetup.xhtml",
+ flags: Ci.nsIAboutModule.ALLOW_SCRIPT,
+ },
+ accountprovisioner: {
+ url: "chrome://messenger/content/newmailaccount/accountProvisioner.xhtml",
+ flags: Ci.nsIAboutModule.ALLOW_SCRIPT,
+ },
+ addressbook: {
+ url: "chrome://messenger/content/addressbook/aboutAddressBook.xhtml",
+ flags: Ci.nsIAboutModule.ALLOW_SCRIPT,
+ },
+ "3pane": {
+ url: "chrome://messenger/content/about3Pane.xhtml",
+ flags: Ci.nsIAboutModule.ALLOW_SCRIPT,
+ },
+ message: {
+ url: "chrome://messenger/content/aboutMessage.xhtml",
+ flags: Ci.nsIAboutModule.ALLOW_SCRIPT,
+ },
+ import: {
+ url: "chrome://messenger/content/aboutImport.xhtml",
+ flags: Ci.nsIAboutModule.ALLOW_SCRIPT,
+ },
+ profiling: {
+ url: "chrome://devtools/content/performance-new/aboutprofiling/index.xhtml",
+ flags:
+ Ci.nsIAboutModule.ALLOW_SCRIPT | Ci.nsIAboutModule.IS_SECURE_CHROME_UI,
+ },
+ },
+
+ /**
+ * Gets the module name from the given URI.
+ */
+ _getModuleName(aURI) {
+ // Strip out the first ? or #, and anything following it
+ let name = /[^?#]+/.exec(aURI.pathQueryRef)[0];
+ return name.toLowerCase();
+ },
+
+ getURIFlags(aURI) {
+ let name = this._getModuleName(aURI);
+ if (!(name in this._redirMap)) {
+ throw Components.Exception(`no about:${name}`, Cr.NS_ERROR_ILLEGAL_VALUE);
+ }
+ return this._redirMap[name].flags;
+ },
+
+ newChannel(aURI, aLoadInfo) {
+ let name = this._getModuleName(aURI);
+ if (!(name in this._redirMap)) {
+ throw Components.Exception(`no about:${name}`, Cr.NS_ERROR_ILLEGAL_VALUE);
+ }
+
+ let newURI = Services.io.newURI(this._redirMap[name].url);
+ let channel = Services.io.newChannelFromURIWithLoadInfo(newURI, aLoadInfo);
+ channel.originalURI = aURI;
+
+ if (
+ this._redirMap[name].flags &
+ Ci.nsIAboutModule.URI_SAFE_FOR_UNTRUSTED_CONTENT
+ ) {
+ let principal = Services.scriptSecurityManager.createContentPrincipal(
+ aURI,
+ {}
+ );
+ channel.owner = principal;
+ }
+
+ return channel;
+ },
+
+ getChromeURI(aURI) {
+ let name = this._getModuleName(aURI);
+ if (!(name in this._redirMap)) {
+ throw Components.Exception(`no about:${name}`, Cr.NS_ERROR_ILLEGAL_VALUE);
+ }
+ return Services.io.newURI(this._redirMap[name].url);
+ },
+};