很少有插件与我的不兼容,所以如何检测它们的存在并通知用户。
谢谢
好的,这里是如何完成的:
function isExtEnabled(){
if(!Application.extensions.has('EXTENSION_ID_HERE')) {
return false;
}
return true;
}
这是一个来自邪恶 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;
}
}