Search code examples
javascriptfirefoxfirefox-addonxpcom

Check if a Firefox 3.5 add-on is enabled


In order inform the user of possible conflicts, I'd like to have my add-on check if another add-on is installed and enabled. If so, I can disable either it or my own at the user's bequest:

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

But I first, of course have to check if a certain other add-on is installed. Presently, I do this as follows:

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

The code for Firefox 4 (the else-statement) works fine. For older versions of Firefox (3.5 and older), I can't for the life of me figure out how to determine if the extension is in fact installed.

Does anybody know how to do this?


Solution

  • The answer was trivial; I had overlooked the enabled attribute for extIExtension.

    I resolved it as follows:

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

    Where disableExtension() is:

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

    And restart() is:

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

    This hasn't been tested on Firefox 1.0-1.5, but works on:

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

    Credit for helping me out goes to Atte Kemppilä.