nsmaildefaulthandler.js

来自「现在很火的邮件客户端软件thunderbird的源码」· JavaScript 代码 · 共 354 行

JS
354
字号
/* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is the Mozilla Firefox browser. * * The Initial Developer of the Original Code is * Benjamin Smedberg <benjamin@smedbergs.us> * * Portions created by the Initial Developer are Copyright (C) 2004 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */const nsISupports              = Components.interfaces.nsISupports;const nsICommandLine           = Components.interfaces.nsICommandLine;const nsICommandLineHandler    = Components.interfaces.nsICommandLineHandler;const nsIDOMWindowInternal     = Components.interfaces.nsIDOMWindowInternal;const nsIFactory               = Components.interfaces.nsIFactory;const nsISupportsString        = Components.interfaces.nsISupportsString;const nsIWindowMediator        = Components.interfaces.nsIWindowMediator;const nsIWindowWatcher         = Components.interfaces.nsIWindowWatcher;const NS_ERROR_ABORT = Components.results.NS_ERROR_ABORT;function mayOpenURI(uri){  var ext = Components.classes["@mozilla.org/uriloader/external-protocol-service;1"]    .getService(Components.interfaces.nsIExternalProtocolService);  return ext.isExposedProtocol(uri.scheme);}function openURI(uri){  if (!mayOpenURI(uri))    throw Components.results.NS_ERROR_FAILURE;  var io = Components.classes["@mozilla.org/network/io-service;1"]                     .getService(Components.interfaces.nsIIOService);  var channel = io.newChannelFromURI(uri);  var loader = Components.classes["@mozilla.org/uriloader;1"]                         .getService(Components.interfaces.nsIURILoader);  var listener = {    onStartURIOpen: function(uri) { return false; },    doContent: function(ctype, preferred, request, handler) { return false; },    isPreferred: function(ctype, desired) { return false; },    canHandleContent: function(ctype, preferred, desired) { return false; },    loadCookie: null,    parentContentListener: null,    getInterface: function(iid) {      if (iid.equals(Components.interfaces.nsIURIContentListener))        return this;      throw Components.results.NS_ERROR_NO_INTERFACE;    }  };  loader.openURI(channel, true, listener);}var nsMailDefaultHandler = {  /* nsISupports */  QueryInterface : function mdh_QI(iid) {    if (iid.equals(nsICommandLineHandler) ||        iid.equals(nsIFactory) ||        iid.equals(nsISupports))      return this;    throw Components.results.NS_ERROR_NO_INTERFACE;  },  /* nsICommandLineHandler */  handle : function mdh_handle(cmdLine) {    var uri;    try {      var remoteCommand = cmdLine.handleFlagWithParam("remote", true);    }    catch (e) {      throw NS_ERROR_ABORT;    }    if (remoteCommand != null) {      try {        var a = /^\s*(\w+)\(([^\)]*)\)\s*$/.exec(remoteCommand);        var remoteVerb = a[1].toLowerCase();        var remoteParams = a[2].split(",");        switch (remoteVerb) {        case "openurl":          var xuri = cmdLine.resolveURI(remoteParams[0]);          openURI(xuri);          break;        case "mailto":          var xuri = cmdLine.resolveURI("mailto:" + remoteParams[0]);          openURI(xuri);          break;        case "xfedocommand":          // xfeDoCommand(openBrowser)          switch (remoteParams[0].toLowerCase()) {          case "openinbox":            var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]                               .getService(Components.classes.nsIWindowMediator);            var win = wm.getMostRecentWindow("mail:3pane");            if (win) {              win.focus();            }            else {              var wwatch = Components.classes["@mozilla.org/embedcomp/window-watcher;1"]                                     .getService(nsIWindowWatcher);              // Bug 277798 - we have to pass an argument to openWindow(), or              // else it won't honor the dialog=no instruction.              var argstring = Components.classes["@mozilla.org/supports-string;1"]                                        .createInstance(nsISupportsString);              wwatch.openWindow(null, "chrome://messenger/content/", "_blank",                                "chrome,dialog=no,all", argstring);            }            break;          case "composemessage":            var wwatch = Components.classes["@mozilla.org/embedcomp/window-watcher;1"]                                   .getService(nsIWindowWatcher);            var argstring = Components.classes["@mozilla.org/supports-string;1"]                                      .createInstance(nsISupportsString);            remoteParams.shift();            argstring.data = remoteParams.join(",");            wwatch.openWindow(null, "chrome://messenger/content/messengercompose/messengercompose.xul", "_blank",                              "chrome,dialog=no,all", argstring);            break;          default:            throw Components.results.NS_ERROR_ABORT;          }          break;        default:          // Somebody sent us a remote command we don't know how to process:          // just abort.          throw Components.results.NS_ERROR_ABORT;        }        cmdLine.preventDefault = true;      }      catch (e) {        // If we had a -remote flag but failed to process it, throw        // NS_ERROR_ABORT so that the xremote code knows to return a failure        // back to the handling code.        dump(e);        throw Components.results.NS_ERROR_ABORT;      }    }    var chromeParam = cmdLine.handleFlagWithParam("chrome", false);    if (chromeParam) {      var features = "chrome,dialog=no,all";      var wwatch = Components.classes["@mozilla.org/embedcomp/window-watcher;1"]                             .getService(nsIWindowWatcher);      var argstring = Components.classes["@mozilla.org/supports-string;1"]                                .createInstance(nsISupportsString);      wwatch.openWindow(null, chromeParam, "_blank",                        "chrome,dialog=no,all", argstring);      cmdLine.preventDefault = true;    }        var count = cmdLine.length;    if (count) {      var i = 0;      while (i < count) {        var curarg = cmdLine.getArgument(i);        if (!curarg.match(/^-/))          break;        dump ("Warning: unrecognized command line flag " + curarg + "\n");        // To emulate the pre-nsICommandLine behavior, we ignore the        // argument after an unrecognized flag.        i += 2;        // xxxbsmedberg: make me use the console service!      }      if (i < count) {        uri = cmdLine.getArgument(i);        // mailto: URIs are frequently passed with spaces in them. They should be        // escaped into %20, but we hack around bad clients, see bug 231032        if (uri.match(/^mailto:/)) {          while (++i < count) {            var testarg = cmdLine.getArgument(i);            if (testarg.match(/^-/))              break;            uri += " " + testarg;          }        }      }    }    if (!uri && cmdLine.preventDefault)      return;    // xxxbsmedberg: This should be using nsIURILoader.openURI, which is what    // the 1.0 branch does (see nsAppShellService.cpp, revision 1.212.6.6).    // However, nsIURILoader.openURI is async, which means that the event loop    // sometimes is not run when it is supposed to, and other badness.    if (cmdLine.state != nsICommandLine.STATE_INITIAL_LAUNCH) {      if (uri) {        openURI(cmdLine.resolveURI(uri));        return;      }      else {        try {          var wmed = Components.classes["@mozilla.org/appshell/window-mediator;1"]                               .getService(nsIWindowMediator);          var wlist = wmed.getEnumerator("mail:3pane");          if (wlist.hasMoreElements()) {            var window = wlist.getNext().QueryInterface(nsIDOMWindowInternal);            window.focus();            return;          }        }        catch (e) {          dump(e);        }      }    }    var wwatch = Components.classes["@mozilla.org/embedcomp/window-watcher;1"]                           .getService(nsIWindowWatcher);    var argstring = Components.classes["@mozilla.org/supports-string;1"]                              .createInstance(nsISupportsString);    var chromeURI = "chrome://messenger/content/";    if (uri) {      argstring.data = uri;      if (uri.match(/^mailto:/)) {        chromeURI = "chrome://messenger/content/messengercompose/messengercompose.xul";      }    }    wwatch.openWindow(null, chromeURI, "_blank",                      "chrome,dialog=no,all", argstring);  },  helpInfo : "",  /* nsIFactory */  createInstance : function mdh_CI(outer, iid) {    if (outer != null)      throw Components.results.NS_ERROR_NO_AGGREGATION;    return this.QueryInterface(iid);  },  lockFactory : function mdh_lock(lock) {    /* no-op */  }};const mdh_contractID = "@mozilla.org/mail/clh;1";const mdh_CID = Components.ID("{44346520-c5d2-44e5-a1ec-034e04d7fac4}");var Module = {  /* nsISupports */  QueryInterface : function QI(iid) {    if (iid.equals(Components.interfaces.nsIModule) &&        iid.equals(Components.interfaces.nsISupports))      return this;    throw Components.results.NS_ERROR_NO_INTERFACE;  },  /* nsIModule */  getClassObject : function (compMgr, cid, iid) {    if (cid.equals(mdh_CID))      return nsMailDefaultHandler.QueryInterface(iid);    throw Components.results.NS_ERROR_FAILURE;  },      registerSelf: function mod_regself(compMgr, fileSpec, location, type) {    var compReg =      compMgr.QueryInterface( Components.interfaces.nsIComponentRegistrar );    compReg.registerFactoryLocation(mdh_CID,                                    "nsMailDefaultHandler",                                    mdh_contractID,                                    fileSpec,                                    location,                                    type );    var catMan = Components.classes["@mozilla.org/categorymanager;1"]                           .getService(Components.interfaces.nsICategoryManager);    catMan.addCategoryEntry("command-line-handler",                            "x-default",                            mdh_contractID, true, true);  },      unregisterSelf : function mod_unregself(compMgr, location, type) {    var compReg = compMgr.QueryInterface(nsIComponentRegistrar);    compReg.unregisterFactoryLocation(mdh_CID, location);    var catMan = Components.classes["@mozilla.org/categorymanager;1"]                           .getService(Components.interfaces.nsICategoryManager);    catMan.deleteCategoryEntry("command-line-handler",                               "y-default", true);  },  canUnload: function(compMgr) {    return true;  }}// NSGetModule: Return the nsIModule object.function NSGetModule(compMgr, fileSpec) {  return Module;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?