forked from mirrors/nixpkgs
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;
|
||
|
}
|