mirror of
https://github.com/gryf/pentadactyl-pm.git
synced 2026-03-03 09:25:45 +01:00
Recfactoring:
* Standard module format. All modules are explicitly declared as modules, they're created via a constructor and instantiated automatically. They're dependency aware. They stringify properly. * Classes are declared the same way (rather like Structs already were). They also stringify properly. Plus, each instance has a rather nifty closure member that closes all of its methods around 'this', so you can pass them to map, forEach, setTimeout, etc. Modules are themselves classes, with a special metaclass, as it were. * Doug Crockford is dead, metaphorically speaking. Closure-based classes just don't fit into any of the common JavaScript frameworks, and they're inefficient and confusing. Now, all class and module members are accessed explicitly via 'this', which makes it very clear that they're class members and not (e.g.) local variables, without anything nasty like Hungarian notation. * Strictly one module per file. Classes that belong to a module live in the same file. * For the moment, there are quite a few utility functions sitting in base.c, because my class implementation used them, and I haven't had the time or inclination to sort them out. I plan to reconcile them with the current mess that is the util namespace. * Changed bracing style.
This commit is contained in:
@@ -15,15 +15,46 @@ const Cu = Components.utils;
|
||||
*
|
||||
* @constructor
|
||||
*/
|
||||
function Services()
|
||||
{
|
||||
const classes = {};
|
||||
const services = {};
|
||||
const Services = Module("services", {
|
||||
init: function () {
|
||||
this.classes = {};
|
||||
this.services = {};
|
||||
|
||||
function create(classes, ifaces, meth)
|
||||
{
|
||||
try
|
||||
{
|
||||
this.add("appStartup", "@mozilla.org/toolkit/app-startup;1", Ci.nsIAppStartup);
|
||||
this.add("autoCompleteSearch", "@mozilla.org/autocomplete/search;1?name=history", Ci.nsIAutoCompleteSearch);
|
||||
this.add("bookmarks", "@mozilla.org/browser/nav-bookmarks-service;1", Ci.nsINavBookmarksService);
|
||||
this.add("browserSearch", "@mozilla.org/browser/search-service;1", Ci.nsIBrowserSearchService);
|
||||
this.add("cache", "@mozilla.org/network/cache-service;1", Ci.nsICacheService);
|
||||
this.add("console", "@mozilla.org/consoleservice;1", Ci.nsIConsoleService);
|
||||
this.add("liberator:", "@mozilla.org/network/protocol;1?name=liberator");
|
||||
this.add("directory", "@mozilla.org/file/directory_service;1", Ci.nsIProperties);
|
||||
this.add("downloadManager", "@mozilla.org/download-manager;1", Ci.nsIDownloadManager);
|
||||
this.add("environment", "@mozilla.org/process/environment;1", Ci.nsIEnvironment);
|
||||
this.add("extensionManager", "@mozilla.org/extensions/manager;1", Ci.nsIExtensionManager);
|
||||
this.add("favicon", "@mozilla.org/browser/favicon-service;1", Ci.nsIFaviconService);
|
||||
this.add("history", "@mozilla.org/browser/global-history;2", [Ci.nsIGlobalHistory3, Ci.nsINavHistoryService, Ci.nsIBrowserHistory]);
|
||||
this.add("io", "@mozilla.org/network/io-service;1", Ci.nsIIOService);
|
||||
this.add("json", "@mozilla.org/dom/json;1", Ci.nsIJSON, "createInstance");
|
||||
this.add("livemark", "@mozilla.org/browser/livemark-service;2", Ci.nsILivemarkService);
|
||||
this.add("observer", "@mozilla.org/observer-service;1", Ci.nsIObserverService);
|
||||
this.add("pref", "@mozilla.org/preferences-service;1", [Ci.nsIPrefService, Ci.nsIPrefBranch, Ci.nsIPrefBranch2]);
|
||||
this.add("profile", "@mozilla.org/toolkit/profile-service;1", Ci.nsIToolkitProfileService);
|
||||
this.add("rdf", "@mozilla.org/rdf/rdf-service;1", Ci.nsIRDFService);
|
||||
this.add("sessionStore", "@mozilla.org/browser/sessionstore;1", Ci.nsISessionStore);
|
||||
this.add("subscriptLoader", "@mozilla.org/moz/jssubscript-loader;1", Ci.mozIJSSubScriptLoader);
|
||||
this.add("threadManager", "@mozilla.org/thread-manager;1", Ci.nsIThreadManager);
|
||||
this.add("windowMediator", "@mozilla.org/appshell/window-mediator;1", Ci.nsIWindowMediator);
|
||||
this.add("windowWatcher", "@mozilla.org/embedcomp/window-watcher;1", Ci.nsIWindowWatcher);
|
||||
this.add("xulAppInfo", "@mozilla.org/xre/app-info;1", Ci.nsIXULAppInfo);
|
||||
|
||||
this.addClass("file", "@mozilla.org/file/local;1", Ci.nsILocalFile);
|
||||
this.addClass("file:", "@mozilla.org/network/protocol;1?name=file", Ci.nsIFileProtocolHandler);
|
||||
this.addClass("find", "@mozilla.org/embedcomp/rangefind;1", Ci.nsIFind);
|
||||
this.addClass("process", "@mozilla.org/process/util;1", Ci.nsIProcess);
|
||||
},
|
||||
|
||||
_create: function (classes, ifaces, meth) {
|
||||
try {
|
||||
let res = Cc[classes][meth || "getService"]();
|
||||
if (!ifaces)
|
||||
return res.wrappedJSObject;
|
||||
@@ -31,97 +62,52 @@ function Services()
|
||||
ifaces.forEach(function (iface) res.QueryInterface(iface));
|
||||
return res;
|
||||
}
|
||||
catch (e)
|
||||
{
|
||||
catch (e) {
|
||||
// liberator.log() is not defined at this time, so just dump any error
|
||||
dump("Service creation failed for '" + classes + "': " + e + "\n");
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
const self = {
|
||||
/* @property {Object} A map of all cached services. */
|
||||
get services() services,
|
||||
/**
|
||||
* Adds a new XPCOM service to the cache.
|
||||
*
|
||||
* @param {string} name The service's cache key.
|
||||
* @param {string} class The class's contract ID.
|
||||
* @param {nsISupports|nsISupports[]} ifaces The interface or array of
|
||||
* interfaces implemented by this service.
|
||||
* @param {string} meth The name of the function used to instanciate
|
||||
* the service.
|
||||
*/
|
||||
add: function (name, class, ifaces, meth) {
|
||||
return this.services[name] = this._create(class, ifaces, meth);
|
||||
},
|
||||
|
||||
/* @property {Object} A map of all cached classes. */
|
||||
get classes() classes,
|
||||
/**
|
||||
* Adds a new XPCOM class to the cache.
|
||||
*
|
||||
* @param {string} name The class's cache key.
|
||||
* @param {string} class The class's contract ID.
|
||||
* @param {nsISupports|nsISupports[]} ifaces The interface or array of
|
||||
* interfaces implemented by this class.
|
||||
*/
|
||||
addClass: function (name, class, ifaces) {
|
||||
const self = this;
|
||||
return this.classes[name] = function () self._create(class, ifaces, "createInstance");
|
||||
},
|
||||
|
||||
/**
|
||||
* Adds a new XPCOM service to the cache.
|
||||
*
|
||||
* @param {string} name The service's cache key.
|
||||
* @param {string} class The class's contract ID.
|
||||
* @param {nsISupports|nsISupports[]} ifaces The interface or array of
|
||||
* interfaces implemented by this service.
|
||||
* @param {string} meth The name of the function used to instanciate
|
||||
* the service.
|
||||
*/
|
||||
add: function (name, class, ifaces, meth)
|
||||
{
|
||||
return services[name] = create(class, ifaces, meth);
|
||||
},
|
||||
/**
|
||||
* Returns the cached service with the specified name.
|
||||
*
|
||||
* @param {string} name The service's cache key.
|
||||
*/
|
||||
get: function (name) this.services[name],
|
||||
|
||||
/**
|
||||
* Adds a new XPCOM class to the cache.
|
||||
*
|
||||
* @param {string} name The class's cache key.
|
||||
* @param {string} class The class's contract ID.
|
||||
* @param {nsISupports|nsISupports[]} ifaces The interface or array of
|
||||
* interfaces implemented by this class.
|
||||
*/
|
||||
addClass: function (name, class, ifaces)
|
||||
{
|
||||
return classes[name] = function () create(class, ifaces, "createInstance");
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns the cached service with the specified name.
|
||||
*
|
||||
* @param {string} name The service's cache key.
|
||||
*/
|
||||
get: function (name) services[name],
|
||||
|
||||
/**
|
||||
* Returns a new instance of the cached class with the specified name.
|
||||
*
|
||||
* @param {string} name The class's cache key.
|
||||
*/
|
||||
create: function (name) classes[name]()
|
||||
};
|
||||
|
||||
self.add("appStartup", "@mozilla.org/toolkit/app-startup;1", Ci.nsIAppStartup);
|
||||
self.add("autoCompleteSearch", "@mozilla.org/autocomplete/search;1?name=history", Ci.nsIAutoCompleteSearch);
|
||||
self.add("bookmarks", "@mozilla.org/browser/nav-bookmarks-service;1", Ci.nsINavBookmarksService);
|
||||
self.add("browserSearch", "@mozilla.org/browser/search-service;1", Ci.nsIBrowserSearchService);
|
||||
self.add("cache", "@mozilla.org/network/cache-service;1", Ci.nsICacheService);
|
||||
self.add("console", "@mozilla.org/consoleservice;1", Ci.nsIConsoleService);
|
||||
self.add("directory", "@mozilla.org/file/directory_service;1", Ci.nsIProperties);
|
||||
self.add("environment", "@mozilla.org/process/environment;1", Ci.nsIEnvironment);
|
||||
self.add("extensionManager", "@mozilla.org/extensions/manager;1", Ci.nsIExtensionManager);
|
||||
self.add("favicon", "@mozilla.org/browser/favicon-service;1", Ci.nsIFaviconService);
|
||||
self.add("json", "@mozilla.org/dom/json;1", Ci.nsIJSON, "createInstance");
|
||||
self.add("liberator:", "@mozilla.org/network/protocol;1?name=liberator");
|
||||
self.add("livemark", "@mozilla.org/browser/livemark-service;2", Ci.nsILivemarkService);
|
||||
self.add("observer", "@mozilla.org/observer-service;1", Ci.nsIObserverService);
|
||||
self.add("io", "@mozilla.org/network/io-service;1", Ci.nsIIOService);
|
||||
self.add("pref", "@mozilla.org/preferences-service;1", [Ci.nsIPrefService, Ci.nsIPrefBranch, Ci.nsIPrefBranch2]);
|
||||
self.add("profile", "@mozilla.org/toolkit/profile-service;1", Ci.nsIToolkitProfileService);
|
||||
self.add("rdf", "@mozilla.org/rdf/rdf-service;1", Ci.nsIRDFService);
|
||||
self.add("sessionStore", "@mozilla.org/browser/sessionstore;1", Ci.nsISessionStore);
|
||||
self.add("subscriptLoader", "@mozilla.org/moz/jssubscript-loader;1", Ci.mozIJSSubScriptLoader);
|
||||
self.add("threadManager", "@mozilla.org/thread-manager;1", Ci.nsIThreadManager);
|
||||
self.add("windowMediator", "@mozilla.org/appshell/window-mediator;1", Ci.nsIWindowMediator);
|
||||
self.add("windowWatcher", "@mozilla.org/embedcomp/window-watcher;1", Ci.nsIWindowWatcher);
|
||||
self.add("xulAppInfo", "@mozilla.org/xre/app-info;1", Ci.nsIXULAppInfo);
|
||||
|
||||
self.addClass("file", "@mozilla.org/file/local;1", Ci.nsILocalFile);
|
||||
self.addClass("file:", "@mozilla.org/network/protocol;1?name=file", Ci.nsIFileProtocolHandler);
|
||||
self.addClass("find", "@mozilla.org/embedcomp/rangefind;1", Ci.nsIFind);
|
||||
self.addClass("process", "@mozilla.org/process/util;1", Ci.nsIProcess);
|
||||
self.addClass("zipWriter", "@mozilla.org/zipwriter;1", Ci.nsIZipWriter);
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
var services = Services();
|
||||
/**
|
||||
* Returns a new instance of the cached class with the specified name.
|
||||
*
|
||||
* @param {string} name The class's cache key.
|
||||
*/
|
||||
create: function (name) this.classes[name]()
|
||||
});
|
||||
|
||||
// vim: set fdm=marker sw=4 ts=4 et:
|
||||
|
||||
Reference in New Issue
Block a user