diff options
Diffstat (limited to 'comm/mail/components/AboutRedirector.jsm')
-rw-r--r-- | comm/mail/components/AboutRedirector.jsm | 124 |
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); + }, +}; |