diff --git a/assets/checksums.txt b/assets/checksums.txt
index e056c4313..94f4daeaa 100644
--- a/assets/checksums.txt
+++ b/assets/checksums.txt
@@ -4,7 +4,8 @@
9bcc718383fec8b2ce0f9c379f45da9a assets/ublock/filters.txt
146704ad1c0393e342afdb416762c183 assets/ublock/badware.txt
5baa90e2da7cd6a73edff2010557ee57 assets/ublock/redirect.txt
-045bc19b802a2bed6cd31ac83524b1d6 assets/ublock/experimental.txt
+b5e3ffc73ffce5c671b1eb9edd466241 assets/ublock/experimental.txt
+62111a29f0a5cb361ba8dbae92054adb assets/ublock/resources.txt
6c9d89c5dc6db345de36c8c966fff575 assets/ublock/filter-lists.json
50573388b525ede1a920cd4b4ee7fbf0 assets/thirdparties/easylist-downloads.adblockplus.org/easyprivacy.txt
61cc16cf02e034370f0f47bc17c46551 assets/thirdparties/easylist-downloads.adblockplus.org/easylist.txt
diff --git a/assets/ublock/resources.txt b/assets/ublock/resources.txt
new file mode 100644
index 000000000..93a5b3cf0
--- /dev/null
+++ b/assets/ublock/resources.txt
@@ -0,0 +1,237 @@
+# Resources to be used as redirect destinations.
+#
+# - Each distinct resource entry is separated by an empty line.
+# - The first line in a resource entry is: token mime-type[;encoding]
+# - All following lines are the data. An empty line signals the end of the
+# data.
+#
+# If the encoding is absent, the data will be converted to base64, and the
+# encoding will be set to `;base64`.
+
+
+# http://probablyprogramming.com/2009/03/15/the-tiniest-gif-ever
+1x1-transparent.gif image/gif;base64
+R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
+
+
+2x2-transparent.png image/png;base64
+iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAC0lEQVQI12NgQAcAABIAAe+JVKQAAAAASUVORK5CYII=
+
+
+# Obsolete: to be removed -- need to stick to sensible resource names
+handtinytrans.gif image/gif;base64
+R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
+
+
+noopcss text/css
+
+
+noopjs application/javascript
+(function() {
+ ;
+})();
+
+
+noopframe text/html
+
+
+
+
+
+
+
+hd-main.js application/javascript
+var L = (function(){
+ var l = {};
+ var noopfn = function() {
+ ;
+ };
+ var props = ["pf", "ed", "Qe", "fd", "xh", "Uc", "ef", "zd", "Ad", "Qc", "Ri", "Wc", "Vc", "Xc", "Wg", "rd", "qd", "sd", "Pe", "Id", "Hd", "Jd", "fg", "Fd", "Ed", "Gd", "ek", "Cd", "Bd", "Dd", "Nj", "Sc", "Rc", "Tc", "wg", "xd", "wd", "yd", "fh", "ld", "md", "nd", "Re", "cd", "Pc", "ke", "Yc", "Xg", "jd", "kd", "oh", "ad", "bd", "mi", "gd", "hd", "ae", "dd", "fk", "ij", "ud", "td", "vd", "ig", "od", "pd", "Yd", "$j", "Oc", "bf"];
+ for (var i = 0; i < props.length; i++) {
+ l[props[i]] = noopfn;
+ }
+ return l;
+})();
+
+
+fuckadblock.js-3.2.0 application/javascript
+(function() {
+ var noopfn = function() {
+ ;
+ };
+ //
+ var Fab = function() {};
+ Fab.prototype.check = noopfn;
+ Fab.prototype.clearEvent = noopfn;
+ Fab.prototype.emitEvent = noopfn;
+ Fab.prototype.on = function(a, b) {
+ if ( !a ) { b(); }
+ };
+ Fab.prototype.onDetected = function() {
+ return this;
+ };
+ Fab.prototype.onNotDetected = function(a) {
+ a();
+ return this;
+ };
+ Fab.prototype.setOption = noopfn;
+ window.FuckAdBlock = Fab;
+ //
+ window.fuckAdBlock = new Fab();
+})();
+
+
+antiAdBlock.js application/javascript
+(function() {
+ window.antiAdBlock = {
+ onDetected: function() {
+ ;
+ },
+ onNotDetected: function(a) {
+ a();
+ }
+ };
+})();
+
+
+# To neutralize GA scripts. The goal is to provide the minimal API
+# expected by clients of these scripts so that the end users are able
+# to wholly block GA while minimizing risks of page breakage.
+# Test cases (need way more):
+# - https://github.com/chrisaljoudi/uBlock/issues/119
+
+www.google-analytics.com/ga.js application/javascript
+(function() {
+ var noopfn = function() {
+ ;
+ };
+ //
+ var Gaq = function() {
+ ;
+ };
+ Gaq.prototype.Na = noopfn;
+ Gaq.prototype.O = noopfn;
+ Gaq.prototype.Sa = noopfn;
+ Gaq.prototype.Ta = noopfn;
+ Gaq.prototype.Va = noopfn;
+ Gaq.prototype._createAsyncTracker = noopfn;
+ Gaq.prototype._getAsyncTracker = noopfn;
+ Gaq.prototype._getPlugin = noopfn;
+ Gaq.prototype.push = function(a) {
+ if ( typeof a === 'function' ) {
+ a();
+ }
+ };
+ //
+ var tracker = function() {};
+ tracker._getLinkerUrl = function(a) {
+ return a;
+ };
+ //
+ var tracker = {
+ _initData: noopfn,
+ _trackPageview: noopfn
+ };
+ //
+ var Gat = function() {
+ ;
+ };
+ Gat.prototype._anonymizeIP = noopfn;
+ Gat.prototype._createTracker = noopfn;
+ Gat.prototype._forceSSL = noopfn;
+ Gat.prototype._getPlugin = noopfn;
+ Gat.prototype._getTracker = function() {
+ return tracker;
+ };
+ Gat.prototype._getTrackerByName = function() {
+ return tracker;
+ };
+ Gat.prototype._getTrackers = noopfn;
+ Gat.prototype.aa = noopfn;
+ Gat.prototype.ab = noopfn;
+ Gat.prototype.hb = noopfn;
+ Gat.prototype.la = noopfn;
+ Gat.prototype.oa = noopfn;
+ Gat.prototype.pa = noopfn;
+ Gat.prototype.u = noopfn;
+ var gat = new Gat();
+ window._gat = gat;
+ //
+ var gaq = new Gaq();
+ (function() {
+ var aa = window._gaq || [];
+ if ( Array.isArray(aa) ) {
+ while ( aa[0] ) {
+ gaq.push(aa.shift());
+ }
+ }
+ })();
+ window._gaq = gaq.qf = gaq;
+})();
+
+
+# Ubiquitous googletagservices.com: not blocked by EasyPrivacy.
+# "Tags are tiny bits of website code that let you measure traffic and
+# "visitor behavior"
+googletagservices.com/gpt.js application/javascript
+(function() {
+ var noopfn = function() {
+ ;
+ };
+ //
+ var gpt = window.googletag || {};
+ gpt._vars_ = gpt._vars_ || {};
+ gpt.cmd = gpt.cmd || [];
+ gpt.getVersion = gpt.getVersion || noopfn;
+ //
+ window.googletag = gpt;
+})();
+
+
+# https://forums.lanik.us/viewtopic.php?f=91&t=27188
+i.ligatus.com/*/angular-tag.js application/javascript
+(function() {
+ self.adProtect = true;
+})();
+
+
+# Yavli ads. These are blocked using an inline script tag filter, but this
+# works only on Firefox. So we side-load the following script using whatever
+# script is normally blocked on the site.
+yavli-defuser.js application/javascript
+(function() {
+ try {
+ Object.defineProperty(window, '__durl', {
+ set: function() {
+ ;
+ },
+ get: function() {
+ return '';
+ }
+ });
+ Object.defineProperty(window, '__lsurl', {
+ set: function() {
+ ;
+ },
+ get: function() {
+ return '';
+ }
+ });
+ Object.defineProperty(window, '__lturl', {
+ set: function() {
+ ;
+ },
+ get: function() {
+ return '';
+ }
+ });
+ } catch (ex) {
+ }
+})();
+
+
+# Addefend defuser
+uabinject-defuser.js application/javascript
+(function() {
+ window.uabpdl = window.uabInject = window.uabDetect = true;
+})();
diff --git a/src/js/contentscript-start.js b/src/js/contentscript-start.js
index 4e9ef27c8..e99233305 100644
--- a/src/js/contentscript-start.js
+++ b/src/js/contentscript-start.js
@@ -139,7 +139,7 @@ var netFilters = function(details) {
// redirection resources: Sometimes it is useful to use these resources as
// standalone scriptlets.
// Library of redirection resources:
-// https://github.com/gorhill/uBlock/blob/master/assets/ublock/redirect-resources.txt
+// https://github.com/gorhill/uBlock/blob/master/assets/ublock/resources.txt
var injectScripts = function(dataURIs) {
var parent = document.head || document.documentElement;
diff --git a/src/js/storage.js b/src/js/storage.js
index 5bd1b01cd..d55889d00 100644
--- a/src/js/storage.js
+++ b/src/js/storage.js
@@ -669,7 +669,7 @@
callback();
};
- this.assets.get('assets/ublock/redirect-resources.txt', onResourcesLoaded);
+ this.assets.get('assets/ublock/resources.txt', onResourcesLoaded);
};
/******************************************************************************/
@@ -854,7 +854,7 @@
assets[location] = true;
}
assets[µb.pslPath] = true;
- assets['assets/ublock/redirect-resources.txt'] = true;
+ assets['assets/ublock/resources.txt'] = true;
callback(assets);
};