检查是否启用了Firefox 3.5加载项

时间:2010-11-28 03:24:01

标签: javascript firefox firefox-addon xpcom

为了告知用户可能存在的冲突,我想让我的附加组件检查是否安装了另一个加载项并启用了。如果是这样,我可以在用户的​​遗赠中禁用它或我自己:

function disableExtension(id) {
    var man = Components.classes["@mozilla.org/extensions/manager;1"];
    if (man) {
        man = man.getService(Components.interfaces.nsIExtensionManager);
    }
    if (man) {
        man.disableItem(id);
    } else {
        Components.utils.import("resource://gre/modules/AddonManager.jsm");
        AddonManager.getAddonByID(id, function(addon) {
            addon.userDisabled = true;
        });
    }
}

但我首先要检查是否安装了某个其他附加组件。目前,我这样做如下:

if (Application.extensions) {
    // Gecko 1.9.2 and older
    ext = Application.extensions.get(id);
    if (ext) {
        // TODO check if extension is also enabled
        disableExtension(id);
    }
} else {
    // Gecko 2.0.0 and newer
    Application.getExtensions(function(extensions) {
        ext = extensions.get(id);
        Components.utils.import("resource://gre/modules/AddonManager.jsm");
        AddonManager.getAddonByID(id, function(addon) {
            if (!addon.userDisabled) {
                disableExtension(id);
            }
        });
    })
}

Firefox 4的代码(else - 语句)运行正常。对于旧版本的Firefox(3.5及更早版本),我无法终身了解如何确定扩展名是否实际已安装。

有人知道怎么做吗?

2 个答案:

答案 0 :(得分:5)

答案很简单;我忽略了enabled的{​​{1}}属性。

我解决了如下:

extIExtension

var ext; if (typeof Application != 'undefined') { if (Application.extensions) { // Gecko 1.9.0 - 1.9.2 ext = Application.extensions.get(id); if (ext) { if (ext.enabled) disableExtension(id); } } else { // Gecko 2.0.0 and newer Application.getExtensions(function(extensions) { ext = extensions.get(id); Components.utils.import("resource://gre/modules/AddonManager.jsm"); AddonManager.getAddonByID(id, function(addon) { if (!addon.userDisabled) { disableExtension(id); } }); }) } } else { // Gecko 1.8.0 var extMgr = Cc["@mozilla.org/extensions/manager;1"].getService(Ci.nsIExtensionManager); if (extMgr) { ext = extMgr.getItemForID(id); } var extMgrDs = extMgr.datasource; if (extMgrDs) { var rdfSvc = Cc["@mozilla.org/rdf/rdf-service;1"].getService(Ci.nsIRDFService); if (rdfSvc && ext) { var source = rdfSvc.GetResource("urn:mozilla:item:" + ext.id); var property = rdfSvc.GetResource("http://www.mozilla.org/2004/em-rdf#isDisabled"); var target = rdfSvc.GetLiteral("true"); var disabled = extMgrDs.HasAssertion(source, property, target, true); if (!disabled) { disableExtension(id); } } } else if (typeof className != "undefined") { // Opens the add-on window BrowserOpenAddonsMgr(); } } 的位置:

disableExtension()

disableExtension: function(id) { var man = Components.classes["@mozilla.org/extensions/manager;1"]; if (man) { man = man.getService(Components.interfaces.nsIExtensionManager); } if (man) { man.disableItem(id); restart(); } else { Components.utils.import("resource://gre/modules/AddonManager.jsm"); AddonManager.getAddonByID(id, function(addon) { addon.userDisabled = true; restart(); }); } } 是:

restart()

这在Firefox 1.0-1.5上尚未经过测试,但适用于:

  • Firefox 4.0b7
  • Firefox 3.6
  • Firefox 3.5
  • Firefox 3.0
  • Firefox 2.0

helping me out的归功于AtteKemppilä。

答案 1 :(得分:2)

非常翔实的写作。
请注意,您也可以使用Gecko 2的“enabled”属性。这使代码更简单。

   if (Application.extensions) {
        // Gecko 1.9.0 - 1.9.2
        ext = Application.extensions.get(id);
        if (ext) {
            if (ext.enabled) disableExtension(id);
        }
    } else {
        // Gecko 2.0.0 and newer
        Application.getExtensions(function(extensions) {
            ext = extensions.get(id);
            if (ext.enabled) disableExtension(id);
        });
    }

对于最佳实践,您当然可以将重复的代码移动到外部函数。