NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name AdAttack
// @namespace https://github.com/elcattivo/AdAttack
// @version 0.3.0-alpha
// @description Removes ads shown by AdDefend.
// @author elcattivo
// @copyright 2016, El Cattivo (http://byteland.cc)
// @license The MIT License (MIT); https://opensource.org/licenses/MIT
// @include *
// @grant none
// @run-at document-end
// @nocompat Chrome
// @updateURL https://raw.githubusercontent.com/elcattivo/AdAttack/master/AdAttack.meta.js
// @downloadURL https://raw.githubusercontent.com/elcattivo/AdAttack/master/AdAttack.user.js
// @supportURL https://github.com/elcattivo/AdAttack/issues
// ==/UserScript==
(function() {
'use strict';
var scriptPattern = /\/\* [0-9a-f]{32} \*\/\s*$/,
idPattern = /[a-zA-z]{1}\([a-zA-z]{1}\,\"([a-zA-Z]{2,})\s*\"\)/g,
ids = {},
isInitialized = false,
cachedNodes = [],
scriptContent,
match,
observer;
MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
observer = new MutationObserver(function (mutations) {
mutations.forEach(function (mutation) {
for(var i = 0; i < mutation.addedNodes.length; i++) {
var node = mutation.addedNodes[i];
if (isInitialized === true) {
for (var id in ids) {
if (node.id === id || (node.classList && node.classList.contains(id))) {
node.parentNode.removeChild(node);
break;
}
}
} else {
cachedNodes.push(node);
}
}
});
});
observer.observe(document, {
childList: true,
subtree: true,
attributes: false
});
Array.from(document.scripts).forEach(function (script) {
scriptContent = script.innerHTML;
if (scriptPattern.test(scriptContent)) {
match = idPattern.exec(scriptContent);
while (match !== null) {
ids[match[1].trim()] = true;
match = idPattern.exec(scriptContent);
}
}
});
isInitialized = true;
var currentNode = cachedNodes.pop();
while (currentNode !== null && currentNode !== undefined) {
currentNode.parentNode.removeChild(currentNode);
currentNode = cachedNodes.pop();
}
})();