2010-11-28 10 views
12

आदेश में सक्षम किया गया है यदि संभव हो तो संघर्ष के उपयोगकर्ता को सूचित, मैं अगर एक और ऐड-ऑन स्थापित किया है और सक्षम किया गया है जांच पर ऐड-मेरी करना चाहते हैं। यदि हां, तो मैं या तो इसे या अपने खुद के उपयोगकर्ता की वसीयत में निष्क्रिय कर सकते हैं:चेक एक 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) के लिए कोड ठीक काम करता है। फ़ायरफ़ॉक्स के पुराने संस्करणों (3.5 और पुराने) के लिए, मैं अपने जीवन के लिए यह नहीं समझ सकता कि यह निर्धारित करने के लिए कि एक्सटेंशन वास्तव में स्थापित है या नहीं।

क्या कोई यह जानता है कि यह कैसे करें?

+0

दिमाग में आने वाली एकमात्र चीज 'extension.ini' के माध्यम से चल रही है और एक्सटेंशन 'getInstallLocation()' की तलाश में है, लेकिन मुझे यह दृष्टिकोण बिल्कुल पसंद नहीं है। –

उत्तर

5

उत्तर छोटा था; मैंने के लिए enabled विशेषता को अनदेखा कर दिया था।

मैं इसे हल कर इस प्रकार है:

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

यह फ़ायरफ़ॉक्स 1.0-1.5 पर परीक्षण नहीं किया गया , लेकिन इस पर काम करता है:

के लिए
  • फ़ायरफ़ॉक्स 4.0b7
  • Firefox 3.6
  • Firefox 3.5
  • फ़ायरफ़ॉक्स 3.0
  • फ़ायरफ़ॉक्स 2,0

क्रेडिट Atte Kemppilä को जाता है।

+0

संयोग से, मैं ऐड-ऑन अक्षम करने और उपयोगकर्ता की सहमति के बिना फ़ायरफ़ॉक्स को पुनरारंभ करने की अनुशंसा नहीं करता हूं। उपर्युक्त कोड सरलीकृत है, और मेरे ऐड-ऑन में मैं इन चरणों के माध्यम से उपयोगकर्ता को मार्गदर्शन करने के लिए अधिसूचनाओं का उपयोग करता हूं। –

2

बहुत जानकारीपूर्ण लेखन-अप।
ध्यान दें कि आप गीको 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); 
     }); 
    } 

सर्वोत्तम अभ्यास के लिए आप निश्चित रूप से दोहराए गए कोड को बाहरी फ़ंक्शन में ले जा सकते हैं।

+0

मैंने यह कोशिश नहीं की है, लेकिन ऐसा लगता है कि मोज़िला पीछे की तरफ संगतता रखने में काफी अच्छा है। जब मुझे मौका मिलता है और परिणाम पोस्ट करते हैं तो मैं इसे एक शॉट दूंगा। –