代码之家  ›  专栏  ›  技术社区  ›  Paul Lammertsma

检查是否启用了Firefox 3.5附加组件

  •  12
  • Paul Lammertsma  · 技术社区  · 14 年前

    为了通知用户可能的冲突,我想检查是否安装了另一个加载项 并启用 . 如果是,我可以在用户的遗赠中禁用它或我自己的:

    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);
                }
            });
        })
    }
    

    Firefox4的代码 else -声明)工作正常。对于老版本的Firefox(3.5及更高版本),我无法确定扩展是否真的安装了。

    有人知道怎么做吗?

    2 回复  |  直到 14 年前
        1
  •  5
  •   Paul Lammertsma    14 年前

    答案微不足道;我忽略了 enabled 属性 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() 是:

    restart: function() {
        var appStartup = Components.classes["@mozilla.org/toolkit/app-startup;1"];
        if (appStartup) {
            appStartup = appStartup.getService(Components.interfaces.nsIAppStartup);
        }
        if (appStartup) {
            appStartup.quit(appStartup.eAttemptQuit | appStartup.eRestart);
        } else if (typeof Application != 'undefined') {
            if (Application.restart) Application.restart();
        }
    }
    

    这还没有在Firefox 1.0-1.5上测试过,但可以在以下方面工作:

    • 火狐4.0b7
    • 火狐3.6
    • 火狐3.5
    • 火狐3.0
    • 火狐2.0

    功劳 helping me out 去阿特·坎皮尔。

        2
  •  2
  •   Ronenz    14 年前

    非常翔实的报道。
    注意,您也可以为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);
            });
        }
    

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