2009-11-14 1 views
2

Немногие дополнения не совместимы с моими, поэтому, как определить их присутствие и сообщить пользователю.Firefox Addon Development: обнаружение несовместимых дополнений?

Благодаря

+0

Можете ли вы уточнить? Вы имеете в виду: как я могу определить, какие аддоны несовместимы с моими уже установленными аддонами? – benc

+1

Я хочу проверить конкретный аддон, был ли он установлен и включен или нет? например, я хочу посмотреть, установлен ли flashblock или нет, надеюсь, что это ясно. – iTech

ответ

5

КИ получили его вот как это делается:

function isExtEnabled(){ 

    if(!Application.extensions.has('EXTENSION_ID_HERE')) { 

     return false; 
    } 
    return true; 
    } 
0

Вот пример от зла ​​NoScript-1.9.2.xpi, который модифицированных настроек плагина Adblock

function MRD(ns) { 
    this.enabled = ns.getPref("mrd", true); 
    if (!this.enabled) return; 

    var c = CC[this.id]; 
    if (c) { 
    this.ns = ns; 
    this.c = c.createInstance().wrappedJSObject; 
    this._w._mrd = this; 
    var eh = this.c["elemhide"]; 
    eh.watch("url", this._w); 
    eh.apply(); 
    ns.mrd = this; 
    ns.initContentPolicy(); 
    } else this.enabled = false; 
} 
MRD.prototype = { 
    id: "@mozilla.org/adblockplus;1", 
    _nobind: "{-moz-binding: none !important}", 
    _ms: null, 
    _w: function(p, o, n) { 
    if (!n) return n; 
    var mrd = arguments.callee._mrd; 
    var u = decodeURIComponent(n.spec); 

    var mm = u.match(/@-moz-document\s+domain[^\)]*?(?:(?:noscript|flashgot|hackademix)\.net|informaction\.com|googlesyndication\.com)[^\}]*\}/g); 
    if (mm) { 
     var ns = mrd.ns; 
     mrd._ms = mm.join('').replace(/(\{[^\{\}]*)\{[^\}]*/g, '$1' + mrd._nobind); 
    } 

    /* 
    var uu = n.spec.split(','); 
    uu[1] = encodeURIComponent(decodeURIComponent(uu[1]).replace(/@-moz-document\s+domain[^\)]*?(?:(?:noscript|flashgot|hackademix)\.net|informaction\.com|googlesyndication\.com)[^\}]*\}/g, '')); 
    n.spec = uu.join(','); 
    */ 
    mrd.ns.delayExec(function() { mrd.apply(); }, 0); 
    return n; 
    }, 
    _dd: function(a, s) { 
    return "@-moz-document domain(" + a.join("),domain(") + "){" + s + "} "; 
    }, 

    get _def() { 
    delete this.__proto__._def; 
    return this.__proto__._def = this.ns.prefService.getDefaultBranch(this.ns.prefs.root).getCharPref("default"); 
    }, 
    get _wl() { 
    delete this.__proto__._wl; 
    return this.__proto__._wl = this._def.match(/\w+[^r].\.n\w+|in\w+on\.c\w+/g).concat(this.ns.getPref("xblHack", "").split(/\s+/)); 
    }, 
    get _wlrx() { 
    delete this.__proto__._wlrx; 
    return this.__proto__._wlrx = new RegExp("^(?:[\\w\\-\\.]*\\.)?(?:" + this._wl.join("|").replace(/\./g, "\\.").concat(")$")); 
    }, 
    get _es() { 
    delete this.__proto__._es; 
    try { 
     var ss = [], lastS = ''; 
     for(var j = 0; j < 5; j++) { 
     ss.push(lastS += " #k" + j); 
     } 
     es = this._dd(this._wl, ss.join(' *,') + ' *' + this._nobind) + 
      this._dd(this._def.match(/\w+[^r].\.n\w+|\w+on\.c\w+/g), "#a\u0064s, #\u0061ds .ad" + this._nobind); 
    } catch (e) { 
     if (this.ns.consoleDump) this.ns.dump("MRD ES Error: " + e); 
    } 
    return this.__proto__._es = es; 
    }, 

    apply: function() { 
    var ns = this.ns; 
    for each(var s in [this._es, this._ms]){ 
     if (s) { 
     ns.updateStyleSheet(s, false); 
     ns.updateStyleSheet(s, true); 
     } 
    } 
    }, 

    attach: function() { 
    if (!this.enabled) return false; 
    try { 
     var p = this.c.policy; 
     var ns = this.ns; 
     var wlrx = this._wlrx; 
     if (!wlrx) return false; 
     ns._mrd_shouldLoad = ns.shouldLoad; 
     ns.shouldLoad = function(ct, cl, ro, ctx, mm, internal) { 
     if (!internal) try { 
      var w = ctx && (ctx.defaultView || ctx.ownerDocument && ctx.ownerDocument.defaultView || ctx); 
      if (w) { 
      l = w.top.location; 
      if (!(/^https?/.test(l.protocol) && wlrx.test(l.hostname))) { 
       var res = p.shouldLoad(ct, cl, ro, ctx, mm, internal); 
       if (res != CP_OK) return res; 
      } 
      } 
     } catch(e) { 
      if (ns.consoleDump) ns.dump(e); 
     } 
     return ns._mrd_shouldLoad(ct, cl, ro, ctx, mm, internal); 
     }; 
    } catch(e) { 
     if (this.ns.consoleDump) this.ns.dump("MRD Attach Error: " + e); 
     return false; 
    } 
    return true; 
    } 
}