Подтвердить что ты не робот

Проверьте, включено ли дополнение Firefox 3.5

Чтобы информировать пользователя о возможных конфликтах, я бы хотел, чтобы моя надстройка проверяла, установлено и включено другое дополнение. Если это так, я могу отключить либо его, либо мою собственную по запросу пользователя:

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 -statement) отлично работает. Для более старых версий Firefox (3.5 и старше) я не могу на всю жизнь выяснить, как определить, действительно ли установлено расширение.

Кто-нибудь знает, как это сделать?

4b9b3361

Ответ 1

Ответ был тривиальным; Я забыл атрибут 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, но работает над:

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

Кредит помогает мне переходит в Atte Kemppilä.

Ответ 2

Очень информативная рецензия.
Обратите внимание, что вы также можете использовать атрибут "enabled" для Gecko 2. Это делает код несколько проще.

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

Для лучшей практики вы можете, конечно, переместить повторяющийся код на внешнюю функцию.