-if (!services.has("extensionManager"))
- Components.utils.import("resource://gre/modules/AddonManager.jsm");
-else
- var AddonManager = {
- PERM_CAN_UNINSTALL: 1,
- PERM_CAN_ENABLE: 2,
- PERM_CAN_DISABLE: 4,
- PERM_CAN_UPGRADE: 8,
-
- getAddonByID: function (id, callback) {
- callback = callback || util.identity;
- addon = services.extensionManager.getItemForID(id);
- if (addon)
- addon = this.wrapAddon(addon);
- return callback(addon);
- },
-
- wrapAddon: function wrapAddon(addon) {
- addon = Object.create(addon.QueryInterface(Ci.nsIUpdateItem));
-
- ["aboutURL", "creator", "description", "developers",
- "homepageURL", "installDate", "optionsURL",
- "releaseNotesURI", "updateDate"].forEach(function (item) {
- memoize(addon, item, function (item) this.getProperty(item));
- });
-
- update(addon, {
-
- get permissions() 1 | (this.userDisabled ? 2 : 4),
-
- appDisabled: false,
-
- getProperty: function getProperty(property) {
- let resource = services.rdf.GetResource("urn:mozilla:item:" + this.id);
-
- if (resource) {
- let target = services.extensionManager.datasource.GetTarget(resource,
- services.rdf.GetResource("http://www.mozilla.org/2004/em-rdf#" + property), true);
-
- if (target && target instanceof Ci.nsIRDFLiteral)
- return target.Value;
- }
-
- return "";
- },
-
- installLocation: Class.Memoize(function () services.extensionManager.getInstallLocation(this.id)),
- getResourceURI: function getResourceURI(path) {
- let file = this.installLocation.getItemFile(this.id, path);
- return services.io.newFileURI(file);
- },
-
- get isActive() this.getProperty("isDisabled") != "true",
-
- uninstall: function uninstall() {
- services.extensionManager.uninstallItem(this.id);
- },
-
- get userDisabled() this.getProperty("userDisabled") === "true",
- set userDisabled(val) {
- services.extensionManager[val ? "disableItem" : "enableItem"](this.id);
- }
- });
-
- return addon;
- },
-
- getAddonsByTypes: function (types, callback) {
- let res = [];
- for (let [, type] in Iterator(types))
- for (let [, item] in Iterator(services.extensionManager
- .getItemList(Ci.nsIUpdateItem["TYPE_" + type.toUpperCase()], {})))
- res.push(this.wrapAddon(item));
-
- if (callback)
- util.timeout(function () { callback(res); });
- return res;
- },
-
- getInstallForFile: function (file, callback, mimetype) {
- callback({
- addListener: function () {},
- install: function () {
- services.extensionManager.installItemFromFile(file, "app-profile");
- }
- });
- },
-
- getInstallForURL: function (url, callback, mimetype) {
- util.assert(false, _("error.unavailable", config.host, services.runtime.version));
- },
-
- observers: [],
- addAddonListener: function (listener) {
- observer.listener = listener;
- function observer(subject, topic, data) {
- if (subject instanceof Ci.nsIUpdateItem)
- subject = AddonManager.wrapAddon(subject);
-
- if (data === "item-installed")
- listener.onInstalling(subject, true);
- else if (data === "item-uninstalled")
- listener.onUnistalling(subject, true);
- else if (data === "item-upgraded")
- listener.onInstalling(subject, true);
- else if (data === "item-enabled")
- listener.onEnabling(subject, true);
- else if (data === "item-disabled")
- listener.onDisabling(subject, true);
- }
- services.observer.addObserver(observer, "em-action-requested", false);
- this.observers.push(observer);
- },
- removeAddonListener: function (listener) {
- this.observers = this.observers.filter(function (observer) {
- if (observer.listener !== listener)
- return true;
- services.observer.removeObserver(observer, "em-action-requested");
- });
- }
- };