Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: assets/js/ElemHide.jsm

Issue 8482109: ABP/Android JavaScript code (Closed)
Patch Set: ABP/Android JavaScript code Created Nov. 13, 2012, 9:44 a.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | assets/js/FilterClasses.jsm » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
« no previous file with comments | « no previous file | assets/js/FilterClasses.jsm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld