155 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			155 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								const nsIAppShellService    = Components.interfaces.nsIAppShellService;
							 | 
						||
| 
								 | 
							
								const nsISupports           = Components.interfaces.nsISupports;
							 | 
						||
| 
								 | 
							
								const nsICategoryManager    = Components.interfaces.nsICategoryManager;
							 | 
						||
| 
								 | 
							
								const nsIComponentRegistrar = Components.interfaces.nsIComponentRegistrar;
							 | 
						||
| 
								 | 
							
								const nsICommandLine        = Components.interfaces.nsICommandLine;
							 | 
						||
| 
								 | 
							
								const nsICommandLineHandler = Components.interfaces.nsICommandLineHandler;
							 | 
						||
| 
								 | 
							
								const nsIFactory            = Components.interfaces.nsIFactory;
							 | 
						||
| 
								 | 
							
								const nsIModule             = Components.interfaces.nsIModule;
							 | 
						||
| 
								 | 
							
								const nsIWindowWatcher      = Components.interfaces.nsIWindowWatcher;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// CHANGEME: to the chrome URI of your extension or application
							 | 
						||
| 
								 | 
							
								const CHROME_URI = "chrome://nixos-gui/content/myviewer.xul";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// CHANGEME: change the contract id, CID, and category to be unique
							 | 
						||
| 
								 | 
							
								// to your application.
							 | 
						||
| 
								 | 
							
								const clh_contractID = "@mozilla.org/commandlinehandler/general-startup;1?type=myapp";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// use uuidgen to generate a unique ID
							 | 
						||
| 
								 | 
							
								const clh_CID = Components.ID("{2991c315-b871-42cd-b33f-bfee4fcbf682}");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// category names are sorted alphabetically. Typical command-line handlers use a
							 | 
						||
| 
								 | 
							
								// category that begins with the letter "m".
							 | 
						||
| 
								 | 
							
								const clh_category = "m-myapp";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Utility functions
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Opens a chrome window.
							 | 
						||
| 
								 | 
							
								 * @param aChromeURISpec a string specifying the URI of the window to open.
							 | 
						||
| 
								 | 
							
								 * @param aArgument an argument to pass to the window (may be null)
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								function openWindow(aChromeURISpec, aArgument)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  var ww = Components.classes["@mozilla.org/embedcomp/window-watcher;1"].
							 | 
						||
| 
								 | 
							
								    getService(Components.interfaces.nsIWindowWatcher);
							 | 
						||
| 
								 | 
							
								  ww.openWindow(null, aChromeURISpec, "_blank",
							 | 
						||
| 
								 | 
							
								                "chrome,menubar,toolbar,status,resizable,dialog=no",
							 | 
						||
| 
								 | 
							
								                aArgument);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * The XPCOM component that implements nsICommandLineHandler.
							 | 
						||
| 
								 | 
							
								 * It also implements nsIFactory to serve as its own singleton factory.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								const myAppHandler = {
							 | 
						||
| 
								 | 
							
								  /* nsISupports */
							 | 
						||
| 
								 | 
							
								  QueryInterface : function clh_QI(iid)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    if (iid.equals(nsICommandLineHandler) ||
							 | 
						||
| 
								 | 
							
								        iid.equals(nsIFactory) ||
							 | 
						||
| 
								 | 
							
								        iid.equals(nsISupports))
							 | 
						||
| 
								 | 
							
								      return this;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    throw Components.results.NS_ERROR_NO_INTERFACE;
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /* nsICommandLineHandler */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  handle : function clh_handle(cmdLine)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    openWindow(CHROME_URI, cmdLine);
							 | 
						||
| 
								 | 
							
								    cmdLine.preventDefault = true;
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // CHANGEME: change the help info as appropriate, but
							 | 
						||
| 
								 | 
							
								  // follow the guidelines in nsICommandLineHandler.idl
							 | 
						||
| 
								 | 
							
								  // specifically, flag descriptions should start at
							 | 
						||
| 
								 | 
							
								  // character 24, and lines should be wrapped at
							 | 
						||
| 
								 | 
							
								  // 72 characters with embedded newlines,
							 | 
						||
| 
								 | 
							
								  // and finally, the string should end with a newline
							 | 
						||
| 
								 | 
							
								  helpInfo : "  <filename>           Open the file in the viewer\n",
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /* nsIFactory */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  createInstance : function clh_CI(outer, iid)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    if (outer != null)
							 | 
						||
| 
								 | 
							
								      throw Components.results.NS_ERROR_NO_AGGREGATION;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return this.QueryInterface(iid);
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  lockFactory : function clh_lock(lock)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    /* no-op */
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * The XPCOM glue that implements nsIModule
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								const myAppHandlerModule = {
							 | 
						||
| 
								 | 
							
								  /* nsISupports */
							 | 
						||
| 
								 | 
							
								  QueryInterface : function mod_QI(iid)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    if (iid.equals(nsIModule) ||
							 | 
						||
| 
								 | 
							
								        iid.equals(nsISupports))
							 | 
						||
| 
								 | 
							
								      return this;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    throw Components.results.NS_ERROR_NO_INTERFACE;
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /* nsIModule */
							 | 
						||
| 
								 | 
							
								  getClassObject : function mod_gch(compMgr, cid, iid)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    if (cid.equals(clh_CID))
							 | 
						||
| 
								 | 
							
								      return myAppHandler.QueryInterface(iid);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    throw Components.results.NS_ERROR_NOT_REGISTERED;
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  registerSelf : function mod_regself(compMgr, fileSpec, location, type)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    compMgr.QueryInterface(nsIComponentRegistrar);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    compMgr.registerFactoryLocation(clh_CID,
							 | 
						||
| 
								 | 
							
								                                    "myAppHandler",
							 | 
						||
| 
								 | 
							
								                                    clh_contractID,
							 | 
						||
| 
								 | 
							
								                                    fileSpec,
							 | 
						||
| 
								 | 
							
								                                    location,
							 | 
						||
| 
								 | 
							
								                                    type);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    var catMan = Components.classes["@mozilla.org/categorymanager;1"].
							 | 
						||
| 
								 | 
							
								      getService(nsICategoryManager);
							 | 
						||
| 
								 | 
							
								    catMan.addCategoryEntry("command-line-handler",
							 | 
						||
| 
								 | 
							
								                            clh_category,
							 | 
						||
| 
								 | 
							
								                            clh_contractID, true, true);
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  unregisterSelf : function mod_unreg(compMgr, location, type)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    compMgr.QueryInterface(nsIComponentRegistrar);
							 | 
						||
| 
								 | 
							
								    compMgr.unregisterFactoryLocation(clh_CID, location);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    var catMan = Components.classes["@mozilla.org/categorymanager;1"].
							 | 
						||
| 
								 | 
							
								      getService(nsICategoryManager);
							 | 
						||
| 
								 | 
							
								    catMan.deleteCategoryEntry("command-line-handler", clh_category);
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  canUnload : function (compMgr)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    return true;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* The NSGetModule function is the magic entry point that XPCOM uses to find what XPCOM objects
							 | 
						||
| 
								 | 
							
								 * this component provides
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								function NSGetModule(comMgr, fileSpec)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  return myAppHandlerModule;
							 | 
						||
| 
								 | 
							
								}
							 |