Index: assets/js/ElemHide.jsm |
=================================================================== |
new file mode 100755 |
--- /dev/null |
+++ b/assets/js/ElemHide.jsm |
@@ -0,0 +1,303 @@ |
+/* |
+ * This Source Code is subject to the terms of the Mozilla Public License |
+ * version 2.0 (the "License"). You can obtain a copy of the License at |
+ * http://mozilla.org/MPL/2.0/. |
+ */ |
+ |
+// |
+// This file has been generated automatically from Adblock Plus source code |
+// |
+ |
+(function (_patchFunc0) { |
+ var filterByKey = { |
+ __proto__: null |
+ }; |
+ var styleURL = null; |
+ var ElemHide = { |
+ isDirty: false, |
+ applied: false, |
+ keyByFilter: { |
+ __proto__: null |
+ }, |
+ init: function () { |
+ Prefs.addListener(function (name) { |
+ if (name == "enabled") |
+ ElemHide.apply(); |
+ } |
+ ); |
+ var styleFile = Utils.resolveFilePath(Prefs.data_directory); |
+ styleFile.append("elemhide.css"); |
+ styleURL = Utils.ioService.newFileURI(styleFile).QueryInterface(Ci.nsIFileURL); |
+ var registrar = Components.manager.QueryInterface(Ci.nsIComponentRegistrar); |
+ registrar.registerFactory(ElemHidePrivate.classID, ElemHidePrivate.classDescription, "@mozilla.org/network/protocol/about;1?what=" + ElemHidePrivate.aboutPrefix, ElemHidePrivate); |
+ } |
+ , |
+ clear: function () { |
+ filterByKey = { |
+ __proto__: null |
+ }; |
+ ElemHide.keyByFilter = { |
+ __proto__: null |
+ }; |
+ ElemHide.isDirty = false; |
+ ElemHide.unapply(); |
+ } |
+ , |
+ add: function (filter) { |
+ if (filter.text in ElemHide.keyByFilter) |
+ return ; |
+ var key; |
+ do { |
+ key = Math.random().toFixed(15).substr(5); |
+ } |
+ while (key in filterByKey); |
+ filterByKey[key] = filter.text; |
+ ElemHide.keyByFilter[filter.text] = key; |
+ ElemHide.isDirty = true; |
+ } |
+ , |
+ remove: function (filter) { |
+ if (!(filter.text in ElemHide.keyByFilter)) |
+ return ; |
+ var key = ElemHide.keyByFilter[filter.text]; |
+ delete filterByKey[key]; |
+ delete ElemHide.keyByFilter[filter.text]; |
+ ElemHide.isDirty = true; |
+ } |
+ , |
+ apply: function () { |
+ if (ElemHide.applied) |
+ ElemHide.unapply(); |
+ try { |
+ if (!Prefs.enabled) { |
+ return ; |
+ } |
+ if (ElemHide.isDirty) { |
+ ElemHide.isDirty = false; |
+ var domains = { |
+ __proto__: null |
+ }; |
+ var hasFilters = false; |
+ for (var key in filterByKey) { |
+ var filter = Filter.knownFilters[filterByKey[key]]; |
+ if (!filter) { |
+ delete filterByKey[key]; |
+ continue; |
+ } |
+ var domain = filter.selectorDomain || ""; |
+ var list; |
+ if (domain in domains) |
+ list = domains[domain]; |
+ else { |
+ list = { |
+ __proto__: null |
+ }; |
+ domains[domain] = list; |
+ } |
+ list[filter.selector] = key; |
+ hasFilters = true; |
+ } |
+ if (!hasFilters) { |
+ return ; |
+ } |
+ try { |
+ styleURL.file.parent.create(Ci.nsIFile.DIRECTORY_TYPE, 493); |
+ } |
+ catch (e){} |
+ var stream; |
+ try { |
+ stream = Cc["@mozilla.org/network/safe-file-output-stream;1"].createInstance(Ci.nsIFileOutputStream); |
+ stream.init(styleURL.file, 2 | 8 | 32, 420, 0); |
+ } |
+ catch (e){ |
+ Cu.reportError(e); |
+ return ; |
+ } |
+ var buf = []; |
+ var maxBufLen = 1024; |
+ function escapeChar(match) { |
+ return "\\" + match.charCodeAt(0).toString(16) + " "; |
+ } |
+ function writeString(str, forceWrite) { |
+ buf.push(str); |
+ if (buf.length >= maxBufLen || forceWrite) { |
+ var output = buf.join("").replace(/[^\x01-\x7F]/g, escapeChar); |
+ stream.write(output, output.length); |
+ buf.splice(0, buf.length); |
+ } |
+ } |
+ var cssTemplate = "-moz-binding: url(about:" + ElemHidePrivate.aboutPrefix + "?%ID%#dummy) !important;"; |
+ for (var domain in domains) { |
+ var rules = []; |
+ var list = domains[domain]; |
+ if (domain) |
+ writeString("@-moz-document domain(\"" + domain.split(",").join("\"),domain(\"") + "\"){\n"); |
+ else { |
+ writeString("@-moz-document url-prefix(\"http://\"),url-prefix(\"https://\"),url-prefix(\"mailbox://\"),url-prefix(\"imap://\"),url-prefix(\"news://\"),url-prefix(\"snews://\"){\n"); |
+ } |
+ for (var selector in list) |
+ writeString(selector + "{" + cssTemplate.replace("%ID%", list[selector]) + "}\n"); |
+ writeString("}\n"); |
+ } |
+ writeString("", true); |
+ try { |
+ stream.QueryInterface(Ci.nsISafeOutputStream).finish(); |
+ } |
+ catch (e){ |
+ Cu.reportError(e); |
+ return ; |
+ } |
+ } |
+ try { |
+ Utils.styleService.loadAndRegisterSheet(styleURL, Ci.nsIStyleSheetService.USER_SHEET); |
+ ElemHide.applied = true; |
+ } |
+ catch (e){ |
+ Cu.reportError(e); |
+ } |
+ } |
+ finally { |
+ FilterNotifier.triggerListeners("elemhideupdate"); |
+ } |
+ } |
+ , |
+ unapply: function () { |
+ if (ElemHide.applied) { |
+ try { |
+ Utils.styleService.unregisterSheet(styleURL, Ci.nsIStyleSheetService.USER_SHEET); |
+ } |
+ catch (e){ |
+ Cu.reportError(e); |
+ } |
+ ElemHide.applied = false; |
+ } |
+ } |
+ , |
+ get styleURL() { |
+ return ElemHide.applied ? styleURL.spec : null; |
+ }, |
+ getFilterByKey: function (key) { |
+ return (key in filterByKey ? Filter.knownFilters[filterByKey[key]] : null); |
+ } |
+ , |
+ toCache: function (cache) { |
+ cache.elemhide = { |
+ filterByKey: filterByKey |
+ }; |
+ } |
+ , |
+ fromCache: function (cache) { |
+ filterByKey = cache.elemhide.filterByKey; |
+ filterByKey.__proto__ = null; |
+ delete ElemHide.keyByFilter; |
+ ElemHide.__defineGetter__("keyByFilter", function () { |
+ var result = { |
+ __proto__: null |
+ }; |
+ for (var k in filterByKey) |
+ result[filterByKey[k]] = k; |
+ return ElemHide.keyByFilter = result; |
+ } |
+ ); |
+ ElemHide.__defineSetter__("keyByFilter", function (value) { |
+ delete ElemHide.keyByFilter; |
+ return ElemHide.keyByFilter = value; |
+ } |
+ ); |
+ } |
+ |
+ }; |
+ var ElemHidePrivate = { |
+ classID: Components.ID("{55fb7be0-1dd2-11b2-98e6-9e97caf8ba67}"), |
+ classDescription: "Element hiding hit registration protocol handler", |
+ aboutPrefix: "abp-elemhidehit", |
+ createInstance: function (outer, iid) { |
+ if (outer != null) |
+ throw Cr.NS_ERROR_NO_AGGREGATION; |
+ return this.QueryInterface(iid); |
+ } |
+ , |
+ getURIFlags: function (uri) { |
+ return ("HIDE_FROM_ABOUTABOUT" in Ci.nsIAboutModule ? Ci.nsIAboutModule.HIDE_FROM_ABOUTABOUT : 0); |
+ } |
+ , |
+ newChannel: function (uri) { |
+ if (!/\?(\d+)/.test(uri.path)) |
+ throw Cr.NS_ERROR_FAILURE; |
+ return new HitRegistrationChannel(uri, RegExp["$1"]); |
+ } |
+ , |
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIFactory, Ci.nsIAboutModule]) |
+ }; |
+ function HitRegistrationChannel(uri, key) { |
+ this.key = key; |
+ this.URI = this.originalURI = uri; |
+ } |
+ HitRegistrationChannel.prototype = { |
+ key: null, |
+ URI: null, |
+ originalURI: null, |
+ contentCharset: "utf-8", |
+ contentLength: 0, |
+ contentType: "text/xml", |
+ owner: Utils.systemPrincipal, |
+ securityInfo: null, |
+ notificationCallbacks: null, |
+ loadFlags: 0, |
+ loadGroup: null, |
+ name: null, |
+ status: Cr.NS_OK, |
+ asyncOpen: function (listener, context) { |
+ var stream = this.open(); |
+ Utils.runAsync(function () { |
+ try { |
+ listener.onStartRequest(this, context); |
+ } |
+ catch (e){} |
+ try { |
+ listener.onDataAvailable(this, context, stream, 0, stream.available()); |
+ } |
+ catch (e){} |
+ try { |
+ listener.onStopRequest(this, context, Cr.NS_OK); |
+ } |
+ catch (e){} |
+ } |
+ , this); |
+ } |
+ , |
+ open: function () { |
+ var data = "<bindings xmlns='http://www.mozilla.org/xbl'><binding id='dummy'/></bindings>"; |
+ if (this.key in filterByKey) { |
+ var wnd = Utils.getRequestWindow(this); |
+ if (wnd && wnd.document && !Policy.processNode(wnd, wnd.document, Policy.type.ELEMHIDE, Filter.knownFilters[filterByKey[this.key]])) |
+ data = "<bindings xmlns='http://www.mozilla.org/xbl'/>"; |
+ } |
+ var stream = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(Ci.nsIStringInputStream); |
+ stream.setData(data, data.length); |
+ return stream; |
+ } |
+ , |
+ isPending: function () { |
+ return false; |
+ } |
+ , |
+ cancel: function () { |
+ throw Cr.NS_ERROR_NOT_IMPLEMENTED; |
+ } |
+ , |
+ suspend: function () { |
+ throw Cr.NS_ERROR_NOT_IMPLEMENTED; |
+ } |
+ , |
+ resume: function () { |
+ throw Cr.NS_ERROR_NOT_IMPLEMENTED; |
+ } |
+ , |
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIChannel, Ci.nsIRequest]) |
+ }; |
+ if (typeof _patchFunc0 != "undefined") |
+ eval("(" + _patchFunc0.toString() + ")()"); |
+ window.ElemHide = ElemHide; |
+} |
+)(window.ElemHidePatch); |