2010-11-28 14 views
12

Para informar al usuario de posibles conflictos, me gustaría tener mi complemento de verificación si hay otro complemento instalado y habilitado. Si es así, puedo desactivar cualquiera o la mía en el legado del usuario:Comprueba si un complemento de Firefox 3.5 está habilitado

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

Pero primero, por supuesto, tiene que comprobar si se ha instalado un cierto otro complemento. Actualmente, hago esto de la siguiente manera:

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

El código para Firefox 4 (el else -statement) funciona bien. Para las versiones anteriores de Firefox (3.5 y anteriores), no puedo por la vida de averiguar cómo determinar si la extensión está instalada de hecho.

¿Alguien sabe cómo hacer esto?

+0

Lo único que se me ocurre es ejecutar 'extensions.ini' y buscar' getInstallLocation() 'en la extensión, pero no me gusta ese enfoque. –

Respuesta

5

La respuesta fue trivial; Pasé por alto el atributo enabled para extIExtension.

lo resolví de la siguiente manera:

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

Dónde disableExtension() es:

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

Y restart() es:

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

Esto no ha sido probado en Firefox 1.0-1.5 , pero funciona en:

  • Firefox 4.0b7
  • Firefox 3.6
  • Firefox 3.5
  • Firefox 3.0
  • Firefox 2,0

crédito para helping me out va a Atte Kemppilä.

+0

Por cierto, no recomiendo inhabilitar complementos y reiniciar Firefox sin el consentimiento del usuario. El código anterior está simplificado, y en mi complemento uso notificaciones para guiar al usuario a través de estos pasos. –

2

Redacción muy informativa.
Tenga en cuenta que también puede usar el atributo "habilitado" para Gecko 2. Esto hace que el código sea algo más simple.

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

Para una mejor práctica, por supuesto puede mover el código repetido a una función externa.

+0

No he probado esto, pero parece que funcionará, ya que Mozilla es bastante bueno para mantener la compatibilidad con versiones anteriores. Lo intentaré cuando tenga la oportunidad y publique los resultados. –

Cuestiones relacionadas