aboutsummaryrefslogtreecommitdiff
path: root/tools/addon-sdk-1.4/packages/api-utils/lib/xpcom.js
diff options
context:
space:
mode:
Diffstat (limited to 'tools/addon-sdk-1.4/packages/api-utils/lib/xpcom.js')
-rw-r--r--tools/addon-sdk-1.4/packages/api-utils/lib/xpcom.js152
1 files changed, 152 insertions, 0 deletions
diff --git a/tools/addon-sdk-1.4/packages/api-utils/lib/xpcom.js b/tools/addon-sdk-1.4/packages/api-utils/lib/xpcom.js
new file mode 100644
index 0000000..10f1d6b
--- /dev/null
+++ b/tools/addon-sdk-1.4/packages/api-utils/lib/xpcom.js
@@ -0,0 +1,152 @@
+/* ***** 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 Jetpack.
+ *
+ * The Initial Developer of the Original Code is Mozilla.
+ * Portions created by the Initial Developer are Copyright (C) 2007
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Atul Varma <atul@mozilla.com>
+ * Drew Willcoxon <adw@mozilla.com>
+ *
+ * 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 ***** */
+
+"use strict";
+
+const {Cc,Ci,Cm,Cr,Cu} = require("chrome");
+
+var jsm = {};
+Cu.import("resource://gre/modules/XPCOMUtils.jsm", jsm);
+var utils = exports.utils = jsm.XPCOMUtils;
+
+Cm.QueryInterface(Ci.nsIComponentRegistrar);
+
+var factories = [];
+
+function Factory(options) {
+ memory.track(this);
+
+ this.wrappedJSObject = this;
+ this.create = options.create;
+ this.uuid = options.uuid;
+ this.name = options.name;
+ this.contractID = options.contractID;
+
+ Cm.registerFactory(this.uuid,
+ this.name,
+ this.contractID,
+ this);
+
+ var self = this;
+
+ factories.push(this);
+}
+
+Factory.prototype = {
+ createInstance: function(outer, iid) {
+ try {
+ if (outer)
+ throw Cr.NS_ERROR_NO_AGGREGATION;
+ return (new this.create()).QueryInterface(iid);
+ } catch (e) {
+ console.exception(e);
+ if (e instanceof Ci.nsIException)
+ throw e;
+ else
+ throw Cr.NS_ERROR_FAILURE;
+ }
+ },
+ unregister: function() {
+ var index = factories.indexOf(this);
+ if (index == -1)
+ throw new Error("factory already unregistered");
+
+ var self = this;
+
+ factories.splice(index, 1);
+ Cm.unregisterFactory(this.uuid, this);
+ },
+ QueryInterface: utils.generateQI([Ci.nsIFactory])
+};
+
+var makeUuid = exports.makeUuid = function makeUuid() {
+ var uuidGenerator = Cc["@mozilla.org/uuid-generator;1"]
+ .getService(Ci.nsIUUIDGenerator);
+ var uuid = uuidGenerator.generateUUID();
+ return uuid;
+};
+
+var autoRegister = exports.autoRegister = function autoRegister(path) {
+ // TODO: This assumes that the url points to a directory
+ // that contains subdirectories corresponding to OS/ABI and then
+ // further subdirectories corresponding to Gecko platform version.
+ // we should probably either behave intelligently here or allow
+ // the caller to pass-in more options if e.g. there aren't
+ // Gecko-specific binaries for a component (which will be the case
+ // if only frozen interfaces are used).
+
+ var appInfo = Cc["@mozilla.org/xre/app-info;1"]
+ .getService(Ci.nsIXULAppInfo);
+ var runtime = Cc["@mozilla.org/xre/app-info;1"]
+ .getService(Ci.nsIXULRuntime);
+
+ var osDirName = runtime.OS + "_" + runtime.XPCOMABI;
+ var platformVersion = appInfo.platformVersion.substring(0, 5);
+
+ var file = Cc['@mozilla.org/file/local;1']
+ .createInstance(Ci.nsILocalFile);
+ file.initWithPath(path);
+ file.append(osDirName);
+ file.append(platformVersion);
+
+ if (!(file.exists() && file.isDirectory()))
+ throw new Error("component not available for OS/ABI " +
+ osDirName + " and platform " + platformVersion);
+
+ Cm.QueryInterface(Ci.nsIComponentRegistrar);
+ Cm.autoRegister(file);
+};
+
+var register = exports.register = function register(options) {
+ options = {__proto__: options};
+ if (!options.uuid)
+ options.uuid = makeUuid();
+ return new Factory(options);
+};
+
+var getClass = exports.getClass = function getClass(contractID, iid) {
+ if (!iid)
+ iid = Ci.nsISupports;
+ return Cm.getClassObjectByContractID(contractID, iid);
+};
+
+require("./unload").when(
+ function() {
+ var copy = factories.slice();
+ copy.reverse();
+ copy.forEach(function(factory) { factory.unregister(); });
+ });