- // ==UserScript==
- // @name RU AdList JS Fixes
- // @namespace ruadlist_js_fixes
- // @version 20161103.1
- // @description try to take over the world!
- // @author lainverse & dimisa
- // @match *://*/*
- // @grant unsafeWindow
- // @grant window.close
- // @run-at document-start
- // ==/UserScript==
-
- (function() {
- 'use strict';
- var win = (unsafeWindow || window),
- isFirefox = /firefox/i.test(navigator.userAgent);
-
- // NodeList iterator polyfill (mostly for Safari)
- // https://jakearchibald.com/2014/iterators-gonna-iterate/
- if (!NodeList.prototype[Symbol.iterator]) {
- NodeList.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator];
- }
-
- // Create fake shadow root and style element as a bait for those who want to break ABP functionality
- (function() {
- // skip Firefox since ABP doesn't use shadowRoot there
- // also, skip browsers which doesn't support createShadowRoot (Safari)
- if (isFirefox || !document.documentElement.createShadowRoot) {
- return;
- }
- function createShadowTrap() {
- var sr = document.documentElement.createShadowRoot();
- // create 'shadow' element similar to ABP
- sr.appendChild(document.createElement('shadow'));
- // create empty 'style' bait
- var st = document.createElement('style');
- sr.appendChild(st);
- var o = new MutationObserver(function(ms){
- var m, node;
- for (m of ms) {
- for (node of m.removedNodes) {
- if (node === st) {
- st = document.createElement('style');
- sr.appendChild(st);
- console.log('Site took the bait and attempted to remove it.');
- }
- }
- }
- });
- o.observe(sr, {childList: true});
- }
- var tooLate = false;
- document.addEventListener('DOMContentLoaded', function(){
- tooLate = true;
- });
- (function checker(){
- if (document.documentElement.shadowRoot === null && !tooLate) {
- setTimeout(checker, 1);
- } else {
- if (!tooLate) {
- createShadowTrap();
- }
- }
- })();
- })();
-
- // Creates and return protected style (unless protection is manually disabled).
- // Protected style will re-add itself on removal and remaind enabled on attempt to disable it.
- function createStyle(rules, props, skip_protect) {
- var root = document.documentElement;
-
- function _protect(style) {
- Object.defineProperty(style, 'sheet', {
- value: style.sheet,
- enumerable: true
- });
- Object.defineProperty(style, 'disabled', {
- get: function() {return true;}, //pretend to be disabled
- set: function() {},
- enumerable: true
- });
- }
-
- function _create() {
- var style = root.appendChild(document.createElement('style')),
- prop, rule;
- style.type = 'text/css';
- for (prop in props) {
- if (style.hasOwnProperty(prop)) {
- style[prop] = props[prop];
- }
- }
- for (rule of rules) {
- try {
- style.sheet.insertRule(rule, 0);
- } catch (e) {
- console.error(e);
- }
- }
- if (!skip_protect) {
- _protect(style);
- }
- return style;
- }
-
- var style = _create();
- if (skip_protect) {
- return style;
- }
-
- var o = new MutationObserver(function(ms){
- var m, node, rule;
- for (m of ms) {
- for (node of m.removedNodes) {
- if (node === style) {
- (new Promise(function(resolve){
- setTimeout(function(resolve){
- resolve(_create());
- }, 0, resolve);
- })).then(function(st){
- style = st;
- });
- }
- }
- }
- });
- o.observe(root, {childList:true});
-
- return style;
- }
-
- // https://greasyfork.org/scripts/19144-websuckit/
- (function() {
- // check does browser support Proxy and WebSocket
- if (typeof Proxy !== 'function' ||
- typeof WebSocket !== 'function') {
- return;
- }
-
- function getWrappedCode(removeSelf) {
- var text = getWrappedCode.toString()+WSI.toString();
- text = (
- '(function(){"use strict";'+
- text.replace(/\/\/[^\r\n]*/g,'').replace(/[\s\r\n]+/g,' ')+
- '(new WSI(self||window)).init();'+
- '})();\n'+
- (removeSelf?'var s = document.currentScript; if (s) {s.parentNode.removeChild(s);}':'')
- );
- return text;
- }
-
- function WSI(win, safeWin) {
- safeWin = safeWin || win;
- var masks = [], filter;
- for (filter of [// blacklist
- '||24video.xxx^',
- '||adlabs.ru^', '||adspayformymortgage.win^', '||aviabay.ru^',
- '||bgrndi.com^', '||brokeloy.com^',
- '||cnamerutor.ru^',
- '||docfilms.info^', '||dreadfula.ru^',
- '||et-code.ru^',
- '||film-doma.ru^',
- '||free-torrent.org^', '||free-torrent.pw^',
- '||free-torrents.org^', '||free-torrents.pw^',
- '||game-torrent.info^', '||gocdn.ru^',
- '||hdkinoshka.com^', '||hghit.com^', '||hindcine.net^',
- '||kiev.ua^', '||kinotochka.net^',
- '||kinott.com^', '||kinott.ru^', '||kuveres.com^',
- '||lepubs.com^', '||luxadv.com^', '||luxup.ru^',
- '||mail.ru^', '||marketgid.com^', '||mxtads.com^',
- '||oconner.biz^',
- '||pkpojhc.com^',
- '||psma01.com^', '||psma02.com^', '||psma03.com^',
- '||recreativ.ru^', '||regpole.com^', '||ruttwind.com^',
- '||skidl.ru^',
- '||torvind.com^', '||trafmag.com^',
- '||webadvert-gid.ru^', '||webadvertgid.ru^',
- '||xxuhter.ru^',
- '||yuiout.online^',
- '||zoom-film.ru^'
- ]) {
- masks.push(new RegExp(
- filter.replace(/([\\\/\[\].*+?(){}$])/g, '\\$1')
- .replace(/\^(?!$)/g,'\\.?[^\\w%._-]')
- .replace(/\^$/,'\\.?([^\\w%._-]|$)')
- .replace(/^\|\|/,'^wss?:\\/+([^\/.]+\\.)*'),
- 'i'));
- }
-
- function isBlocked(url) {
- for (var mask of masks) {
- if (mask.test(url)) {
- return true;
- }
- }
- return false;
- }
-
- var realWebSocket = win.WebSocket;
- function wsGetter (target, name) {
- try {
- if (typeof realWebSocket.prototype[name] === 'function') {
- if (name === 'close' || name === 'send') { // send also closes connection
- target.readyState = realWebSocket.CLOSED;
- }
- return (
- function fake() {
- console.log('[WSI] Invoked function "'+name+'"', '| Tracing', (new Error()));
- return;
- }
- );
- }
- if (typeof realWebSocket.prototype[name] === 'number') {
- return realWebSocket[name];
- }
- } catch(ignore) {}
- return target[name];
- }
-
- function createWebSocketWrapper(target) {
- return new Proxy(realWebSocket, {
- construct: function (target, args) {
- var url = args[0];
- console.log('[WSI] Opening socket on ' + url + ' \u2026');
- if (isBlocked(url)) {
- console.log("[WSI] Blocked.");
- return new Proxy({
- url: url,
- readyState: realWebSocket.OPEN
- }, {
- get: wsGetter
- });
- }
- return new target(args[0], args[1]);
- }
- });
- }
-
- function WorkerWrapper() {
- var realWorker = win.Worker;
- function wrappedWorker(resourceURI) {
- var isBlobURL = /^blob:/i,
- xhr = null,
- _callbacks = new WeakMap(),
- _worker = null,
- _terminate = false,
- _onerror = null,
- _onmessage = null,
- _messages = [],
- _events = [],
- /*jshint validthis:true */
- _self = this;
-
- function callbackWrapper(func) {
- if (typeof func !== 'function') {
- return undefined;
- }
- return (
- function callback() {
- func.apply(_self, arguments);
- }
- );
- }
-
- _self.terminate = function(){
- _terminate = true;
- if (_worker) {
- _worker.terminate();
- }
- };
- Object.defineProperty(_self, 'onmessage', {
- get: function() {
- return _onmessage;
- },
- set: function(val) {
- _onmessage = val;
- if (_worker) {
- _worker.onmessage = callbackWrapper(val);
- }
- }
- });
- Object.defineProperty(_self, 'onerror', {
- get: function() {
- return _onerror;
- },
- set: function(val) {
- _onerror = val;
- if (_worker) {
- _worker.onerror = callbackWrapper(val);
- }
- }
- });
- _self.postMessage = function(message){
- if (_worker) {
- _worker.postMessage(message);
- } else {
- _messages.push(message);
- }
- };
- _self.terminate = function() {
- _terminate = true;
- if (_worker) {
- _worker.terminate();
- }
- };
- _self.addEventListener = function(){
- if (typeof arguments[1] !== 'function') {
- return;
- }
- if (!_callbacks.has(arguments[1])) {
- _callbacks.set(arguments[1], callbackWrapper(arguments[1]));
- }
- arguments[1] = _callbacks.get(arguments[1]);
- if (_worker) {
- _worker.addEventListener.apply(_worker, arguments);
- } else {
- _events.push(['addEventListener', arguments]);
- }
- };
- _self.removeEventListener = function(){
- if (typeof arguments[1] !== 'function' || !_callbacks.has(arguments[1])) {
- return;
- }
- arguments[1] = _callbacks.get(arguments[1]);
- _callbacks.delete(arguments[1]);
- if (_worker) {
- _worker.removeEventListener.apply(_worker, arguments);
- } else {
- _events.push(['removeEventListener', arguments]);
- }
- };
-
- if (!isBlobURL.test(resourceURI)) {
- _worker = new realWorker(resourceURI);
- return; // not a blob, no need to wrap
- }
-
- xhr = new XMLHttpRequest();
- xhr.responseType = 'blob';
- try {
- xhr.open('GET', resourceURI, true);
- } catch(ignore) {
- _worker = new realWorker(resourceURI);
- return; // failed to open connection, unable to continue wrapping procedure
- }
- (new Promise(function(resolve, reject){
- if (xhr.readyState !== XMLHttpRequest.OPENED) {
- // connection wasn't opened, unable to continue wrapping procedure
- return reject();
- }
- xhr.onload = function(){
- if (this.status === 200) {
- var reader = new FileReader();
- reader.addEventListener("loadend", function() {
- resolve(new realWorker(URL.createObjectURL(
- new Blob([getWrappedCode(false)+this.result])
- )));
- });
- reader.readAsText(this.response);
- }
- };
- xhr.send();
- })).then(function(val) {
- _worker = val;
- _worker.onerror = callbackWrapper(_onerror);
- _worker.onmessage = callbackWrapper(_onmessage);
- var _e;
- while(_events.length) {
- _e = _events.shift();
- _worker[_e[0]].apply(_worker, _e[1]);
- }
- while(_messages.length) {
- _worker.postMessage(_messages.shift());
- }
- if (_terminate) {
- _worker.terminate();
- }
- }).catch(function(){});
-
- }
- win.Worker = wrappedWorker.bind(safeWin);
- }
-
- function CreateElementWrapper() {
- var realCreateElement = document.createElement.bind(document),
- code = encodeURIComponent('<scr'+'ipt>'+getWrappedCode(true)+'</scr'+'ipt>\n'),
- isDataURL = /^data:/i,
- isBlobURL = /^blob:/i;
-
- function frameRewrite(e) {
- var f = e.target,
- w = f.contentWindow;
- if (!f.src || (w && isBlobURL.test(f.src))) {
- w.WebSocket = createWebSocketWrapper();
- }
- if (isDataURL.test(f.src) && f.src.indexOf(code) < 0) {
- f.src = f.src.replace(',',',' + code);
- }
- }
-
- function wrappedCreateElement(name) {
- var el = realCreateElement.apply(document, arguments);
- if (el.tagName === 'IFRAME') {
- el.addEventListener('load', frameRewrite, false);
- }
- return el;
- }
- document.createElement = wrappedCreateElement.bind(document);
-
- document.addEventListener('DOMContentLoaded', function(){
- for (var ifr of document.querySelectorAll('IFRAME')) {
- ifr.addEventListener('load', frameRewrite, false);
- }
- }, false);
- }
-
- this.init = function() {
- win.WebSocket = createWebSocketWrapper();
- WorkerWrapper();
- if (typeof document !== 'undefined') {
- CreateElementWrapper();
- }
- };
- }
-
- if (isFirefox) {
- var script = document.createElement('script');
- script.appendChild(document.createTextNode(getWrappedCode()));
- document.head.insertBefore(script, document.head.firstChild);
- return; //we don't want to call functions on page from here in Fx, so exit
- }
-
- (new WSI((unsafeWindow||self||window),(self||window))).init();
- })();
-
- if (!isFirefox) { // scripts for non-Firefox browsers
-
- // https://greasyfork.org/scripts/14720-it-s-not-important
- (function(){
- var imptt = /((display|(margin|padding)(-top|-bottom)?)\s*:[^;!]*)!\s*important/ig;
-
- function unimportanter(el, si) {
- if (!imptt.test(si) || el.style.display === 'none') {
- return 0; // get out if we have nothing to do here
- }
- if (el.nodeName === 'IFRAME' && el.src &&
- el.src.slice(0,17) === 'chrome-extension:') {
- return 0; // Web of Trust uses this method to add their frame
- }
- var so = si.replace(imptt, function(){return arguments[1];}), ret = 0;
- if (si !== so) {
- ret = 1;
- el.setAttribute('style', so);
- }
- return ret;
- }
-
- function logger(c) {
- if (c) {
- console.log('Some page elements became a bit less important.');
- }
- }
-
- function checkTarget(node, cnt) {
- if (!(node && node.getAttribute)) {
- return 0;
- }
- var si = node.getAttribute('style');
- if (si && si.indexOf('!') > -1) {
- cnt += unimportanter(node, si);
- }
- return cnt;
- }
-
- var observer = new MutationObserver(function(mutations) {
- setTimeout(function(ms) {
- var cnt = 0, m, node;
- for (m of ms) {
- cnt = checkTarget(m.target, cnt);
- for (node of m.addedNodes) {
- cnt += checkTarget(node, cnt);
- }
- }
- logger(cnt);
- }, 0, mutations);
- });
-
- observer.observe(document, { childList : true, attributes : true, attributeFilter : ['style'], subtree : true });
-
- win.addEventListener ("load", function(){
- var c = 0, imp;
- for (imp of document.querySelectorAll('[style*="!"]')) {
- c+= checkTarget(imp, c);
- }
- logger(c);
- }, false);
- })();
-
- }
-
- if (/^https?:\/\/(mail\.yandex\.|music\.yandex\.|news\.yandex\.|(www\.)?yandex\.[^\/]+\/(yand)?search[\/?])/i.test(win.location.href)) {
- // https://greasyfork.org/en/scripts/809-no-yandex-ads
- (function(){
- var adWords = ['Яндекс.Директ','Реклама','Ad'];
- function remove(node) {
- node.parentNode.removeChild(node);
- }
- // Generic ads removal and fixes
- function removeGenericAds() {
- var s, i;
- s = document.querySelector('.serp-header');
- if (s) {
- s.style.marginTop='0';
- }
- for (s of document.querySelectorAll('.serp-adv__head + .serp-item, #adbanner, .serp-adv, .b-spec-adv, div[class*="serp-adv__"]')) {
- remove(s);
- }
- }
- // Search ads
- function removeSearchAds() {
- var s, item;
- for (s of document.querySelectorAll('.serp-block, .serp-item, .search-item')) {
- item = s.querySelector('.label, .serp-item__label, .document__provider-name');
- if (item && adWords.indexOf(item.textContent) > -1) {
- remove(s);
- console.log('Ads removed.');
- }
- }
- }
- // News ads
- function removeNewsAds() {
- for (var s of document.querySelectorAll(
- '.page-content__left > *,'+
- '.page-content__right > *:not(.page-content__col),'+
- '.page-content__right > .page-content__col > *'
- )) {
- if (s.textContent.indexOf(adWords[0]) > -1 ||
- (s.clientHeight < 15 && s.classList.contains('rubric'))) {
- remove(s);
- console.log('Ads removed.');
- }
- }
- }
- // Music ads
- function removeMusicAds() {
- for (var s of document.querySelectorAll('.ads-block')) {
- remove(s);
- }
- }
- // Mail ads
- function removeMailAds() {
- var slice = Array.prototype.slice,
- nodes = slice.call(document.querySelectorAll('.ns-view-folders')),
- node, len, classes, cls;
- for (node of nodes) {
- if (!len || len > node.classList.length) {
- len = node.classList.length;
- }
- }
- node = nodes.pop();
- while (node) {
- if (node.classList.length > len) {
- for (cls of slice.call(node.classList)) {
- if (cls.indexOf('-') === -1) {
- remove(node);
- break;
- }
- };
-
- }
- node = nodes.pop();
- }
- }
- // News fixes
- function removePageAdsClass() {
- if (document.body.classList.contains("b-page_ads_yes")){
- document.body.classList.remove("b-page_ads_yes");
- console.log('Page ads class removed.');
- }
- }
- // Function to attach an observer to monitor dynamic changes on the page
- function pageUpdateObserver(func, obj, params) {
- if (obj) {
- var o = new MutationObserver(func);
- o.observe(obj,(params || {childList:true, subtree:true}));
- }
- }
- // Cleaner
- document.addEventListener ('DOMContentLoaded', function() {
- removeGenericAds();
- if (win.location.hostname.search(/^mail\./i) === 0) {
- pageUpdateObserver(function(ms, o){
- var aside = document.querySelector('.mail-Layout-Aside');
- if (aside) {
- o.disconnect();
- pageUpdateObserver(removeMailAds, aside);
- }
- }, document.querySelector('BODY'));
- removeMailAds();
- } else if (win.location.hostname.search(/^music\./i) === 0) {
- pageUpdateObserver(removeMusicAds, document.querySelector('.sidebar'));
- removeMusicAds();
- } else if (win.location.hostname.search(/^news\./i) === 0) {
- pageUpdateObserver(removeNewsAds, document.querySelector('BODY'));
- pageUpdateObserver(removePageAdsClass, document.body, {attributes:true, attributesFilter:['class']});
- removeNewsAds();
- removePageAdsClass();
- } else {
- pageUpdateObserver(removeSearchAds, document.querySelector('.main__content'));
- removeSearchAds();
- }
- });
- })();
- return; //skip fixes for other sites
- }
-
- // https://greasyfork.org/en/scripts/14470-4pda-unbrender
- if (/(^|\.)4pda\.ru$/i.test(window.location.hostname)) {
- (function() {
- var isForum = document.location.href.search('/forum/') !== -1,
- hStyle;
-
- function remove(n) {
- if (n) {
- n.parentNode.removeChild(n);
- }
- }
-
- function afterClean() {
- hStyle.disabled = true;
- remove(hStyle);
- }
-
- function beforeClean() {
- // attach styles before document displayed
- hStyle = createStyle([
- 'html { overflow-y: scroll }',
- 'article + aside * { display: none !important }',
- '#header + div:after {'+(
- 'content: "";'+
- 'position: fixed;'+
- 'top: 0;'+
- 'left: 0;'+
- 'width: 100%;'+
- 'height: 100%;'+
- 'background-color: #E6E7E9'
- )+'}',
- // http://codepen.io/Beaugust/pen/DByiE
- '@keyframes spin { 100% { transform: rotate(360deg) } }',
- 'article + aside:after {'+(
- 'content: "";'+
- 'position: absolute;'+
- 'width: 150px;'+
- 'height: 150px;'+
- 'top: 150px;'+
- 'left: 50%;'+
- 'margin-top: -75px;'+
- 'margin-left: -75px;'+
- 'box-sizing: border-box;'+
- 'border-radius: 100%;'+
- 'border: 10px solid rgba(0, 0, 0, 0.2);'+
- 'border-top-color: rgba(0, 0, 0, 0.6);'+
- 'animation: spin 2s infinite linear'
- )+'}'
- ], {id:'ubrHider'}, true);
-
- // display content of a page if time to load a page is more than 2 seconds to avoid
- // blocking access to a page if it is loading for too long or stuck in a loading state
- setTimeout(2000, afterClean);
- }
-
- createStyle([
- '#nav .use-ad { display: block !important }',
- 'article:not(.post) + article:not(#id), a[target="_blank"] img[height="90"] { display: none !important }'
- ]);
-
- if (!isForum) {
- beforeClean();
- }
-
- // save links to non-overridden functions to use later
- var oGA = Element.prototype.getAttribute,
- oSA = Element.prototype.setAttribute,
- protectedElems;
- // protect/hide changed attributes in case site attempt to restore them
- function styleProtector(eventMode) {
- var oRAN = Element.prototype.removeAttributeNode,
- isStyleText = function(t){ return t === 'style'; },
- isStyleAttr = function(a){ return a instanceof Attr && a.nodeName === 'style'; },
- returnUndefined = function(){},
- protectedElems = new WeakMap();
- function protoOverride(element, functionName, isStyleCheck, returnIfProtected) {
- var oF = element.prototype[functionName];
- element.prototype[functionName] = function(){
- if (protectedElems.get(this) !== undefined && isStyleCheck(arguments[0])) {
- return returnIfProtected(protectedElems.get(this), arguments, this);
- }
- return oF.apply(this, arguments);
- };
- }
- protoOverride(Element, 'removeAttribute', isStyleText, returnUndefined);
- protoOverride(Element, 'removeAttributeNS', isStyleText, returnUndefined);
- protoOverride(Element, 'removeAttributeNode', isStyleAttr, function(o, args, node) {
- if (args[0] instanceof Attr && args[0].ownerElement !== node) {
- // throw 'attribute of another element' error
- oRAN.call(node, document.createAttribute('style'));
- }
- if (o.oldStyle === null) {
- // throw 'not an Attr' error
- oRAN.call(node, null);
- }
- o.oldStyle = null;
- return args[0];
- });
- protoOverride(Element, 'hasAttribute', isStyleText, function(o) {
- return o.oldStyle !== null;
- });
- protoOverride(Element, 'hasAttributeNS', isStyleText, function(o) {
- return o.oldStyle !== null;
- });
- protoOverride(Element, 'setAttribute', isStyleText, function(o, args) {
- o.oldStyle = args[1];
- });
- protoOverride(Element, 'setAttributeNS', isStyleText, returnUndefined);
- protoOverride(Element, 'setAttributeNode', isStyleAttr, returnUndefined);
- protoOverride(Element, 'getAttribute', isStyleText, function(o) {
- return o.oldStyle;
- });
- protoOverride(Element, 'getAttributeNS', isStyleText, returnUndefined);
- protoOverride(Element, 'getAttributeNode', isStyleText, function(o){
- if (o.oldStyle === null) {
- return null;
- }
- var at = document.createAttribute('style');
- at.value = o.oldStyle;
- Object.defineProperty(at, 'ownerElement', {
- value: this,
- enumerable: true
- });
- return at;
- });
- if (eventMode) {
- var e = document.createEvent('Event');
- e.initEvent('protoOverride', false, false);
- window.protectedElems = protectedElems;
- window.dispatchEvent(e);
- } else {
- return protectedElems;
- }
- }
- if (isFirefox) {
- var s = document.createElement('script');
- s.textContent = '(' + styleProtector.toString() + ')(true);' +
- 'var s = document.currentScript; if (s) {s.parentNode.removeChild(s);}';
- window.addEventListener('protoOverride', function protoOverrideCallback(e){
- if (win.protectedElems) {
- protectedElems = win.protectedElems;
- delete win.protectedElems;
- }
- document.removeEventListener('protoOverride', protoOverrideCallback, true);
- }, true);
- document.documentElement.appendChild(s);
- } else {
- protectedElems = styleProtector(false);
- }
-
- // clean a page
- window.addEventListener('DOMContentLoaded', function(){
- var rem, si, itm;
- function width(){ return window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth||0; }
- function height(){ return window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight||0; }
-
-
- if (isForum) {
- si = document.querySelector('#logostrip');
- if (si) {
- remove(si.parentNode.nextSibling);
- }
- }
-
- if (document.location.href.search('/forum/dl/') !== -1) {
- document.body.setAttribute('style', (document.body.getAttribute('style')||'')+
- ';background-color:black!important');
- for (itm of document.querySelectorAll('body>div')) {
- if (!itm.querySelector('.dw-fdwlink')) {
- remove(itm);
- }
- }
- }
-
- if (isForum) { // Do not continue if it's a forum
- return;
- }
-
- si = document.querySelector('#header');
- if (si) {
- rem = si.previousSibling;
- while (rem) {
- si = rem.previousSibling;
- remove(rem);
- rem = si;
- }
- }
-
- for (itm of document.querySelectorAll('#nav li[class]')) {
- if (itm && itm.querySelector('a[href^="/tag/"]')) {
- remove(itm);
- }
- }
-
- var style, result;
- for (itm of document.querySelectorAll('DIV')) {
- if (itm.offsetWidth > 0.95 * width() && itm.offsetHeight > 0.8 * height()) {
- style = window.getComputedStyle(itm, null);
- result = [];
- if (style.backgroundImage !== 'none') {
- result.push('background-image:none!important');
- }
- if (style.backgroundColor !== 'transparent' &&
- style.backgroundColor !== 'rgba(0, 0, 0, 0)') {
- result.push('background-color:transparent!important');
- }
- if (result.length) {
- if (itm.getAttribute('style')) {
- result.unshift(itm.getAttribute('style'));
- }
- (function(){
- var fakeStyle = {
- 'backgroundImage': itm.style.backgroundImage,
- 'backgroundColor': itm.style.backgroundColor
- };
- try {
- Object.defineProperty(itm, 'style', {
- value: new Proxy(itm.style, {
- get: function(target, prop){
- if (fakeStyle.hasOwnProperty(prop)) {
- return fakeStyle[prop];
- } else {
- return target[prop];
- }
- },
- set: function(target, prop, value){
- if (fakeStyle.hasOwnProperty(prop)) {
- fakeStyle[prop] = value;
- } else {
- target[prop] = value;
- }
- return value;
- }
- }),
- enumerable: true
- });
- } catch (e) {
- console.log('Unable to protect style property.', e);
- }
- })();
- if (protectedElems) {
- protectedElems.set(itm, {oldStyle: oGA.call(itm, 'style')});
- }
- oSA.call(itm, 'style', result.join(';'));
- }
- }
- }
-
- for (itm of document.querySelectorAll('ASIDE>DIV')) {
- if ( ((itm.querySelector('script, iframe, a[href*="/ad/www/"]') ||
- itm.querySelector('img[src$=".gif"]:not([height="0"]), img[height="400"]')) &&
- !itm.classList.contains('post') ) || !itm.childNodes.length ) {
- remove(itm);
- }
- }
-
- document.body.setAttribute('style', (document.body.getAttribute('style')||'')+';background-color:#E6E7E9!important');
-
- // display content of the page
- afterClean();
- });
- })();
- return;
- }
-
- // https://greasyfork.org/en/scripts/21937-moonwalk-hdgo-kodik-fix v0.7+ (adapted & fixed)
- document.addEventListener ('DOMContentLoaded', function() {
- var tmp, t;
- function log (e) {
- console.log('Moonwalk&HDGo&Kodik FIX: ' + e + ' player in ' + win.location.href);
- }
- if (win.adv_enabled !== undefined && win.condition_detected !== undefined) { // moonwalk
- log('Moonwalk');
- if (win.adv_enabled) {
- win.adv_enabled = false;
- }
- win.condition_detected = false;
- if (win.MXoverrollCallback) {
- document.addEventListener('click', function catcher(e){
- e.stopPropagation();
- win.MXoverrollCallback.call(window);
- document.removeEventListener('click', catcher, true);
- }, true);
- }
- } else if (win.banner_second !== undefined && win.$banner_ads !== undefined) { // hdgo
- log('HDGo');
- tmp = document.querySelector('#swtf');
- if (tmp) {
- tmp.style.display = 'none';
- }
- win.banner_second = 0;
- win.$banner_ads = false;
- if (win.$new_ads !== undefined) {
- win.$new_ads = false;
- }
- if (win.canRunAds !== undefined && win.canRunAds !== true) {
- win.canRunAds = true;
- }
- } else if (win.MXoverrollCallback && win.iframeSearch !== undefined) { // kodik
- log('Kodik');
- tmp = document.querySelector('.play_button');
- if (tmp) {
- tmp.onclick = win.MXoverrollCallback.bind(window);
- }
- win.IsAdBlock = false;
- }
- }, false);
-
- // function to search and remove nodes by content
- // selector - standard CSS selector to define set of nodes to check
- // words - regular expression to check content of the suspicious nodes
- // params - object with multiple extra parameters:
- // .hide - set display to none instead of removing from the page
- // .parent - parent node to remove if content is found in the child node
- // .siblings - number of simling nodes to remove (excluding text nodes)
- function scRemove(e) {e.parentNode.removeChild(e);}
- function scHide(e) {
- var s = e.getAttribute('style')||'',
- h = ';display:none!important;';
- if (s.indexOf(h) < 0) {
- e.setAttribute('style', s+h);
- }
- }
- function scissors (selector, words, scope, params) {
- var remFunc = (params.hide ? scHide : scRemove),
- iterFunc = (params.siblings > 0 ?
- 'nextSibling' :
- 'previousSibling'),
- toRemove = [],
- siblings,
- node;
- for (node of scope.querySelectorAll(selector)) {
- if (words.test(node.innerHTML) || !node.childNodes.length) {
- // drill up to the specified parent node if required
- if (params.parent) {
- while(node !== scope && !(node.matches(params.parent))) {
- node = node.parentNode;
- }
- }
- if (node === scope) {
- break;
- }
- toRemove.push(node);
- // add multiple nodes if defined more than one sibling
- siblings = Math.abs(params.siblings) || 0;
- while (siblings) {
- node = node[iterFunc];
- toRemove.push(node);
- if (node.nodeType === Node.ELEMENT_NODE) {
- siblings -= 1; //count only element nodes
- }
- }
- }
- }
- for (node of toRemove) {
- remFunc(node);
- }
- return toRemove.length;
- }
-
- // function to perform multiple checks if ads inserted with a delay
- // by default does 30 checks withing a 3 seconds unless nonstop mode specified
- // also does 1 extra check when a page completely loads
- // selector and words - passed dow to scissors
- // params - object with multiple extra parameters:
- // .root - selector to narrow down scope to scan;
- // .observe - if true then check will be performed continuously;
- // Other parameters passed down to scissors.
- function gardener(selector, words, params) {
- params = params || {};
- var scope = document.body,
- nonstop = false;
- // narrow down scope to a specific element
- if (params.root) {
- scope = scope.querySelector(params.root);
- if (!scope) {// exit if the root element is not present on the page
- return 0;
- }
- }
- // add observe mode if required
- if (params.observe) {
- if (typeof MutationObserver === 'function') {
- var o = new MutationObserver(function(ms){
- for (var m of ms) {
- if (m.addedNodes.length) {
- scissors(selector, words, scope, params);
- }
- }
- });
- o.observe(scope, {childList:true, subtree: true});
- } else {
- nonstop = true;
- }
- }
- // wait for a full page load to do one extra cut
- win.addEventListener('load',function(){
- scissors(selector, words, scope, params);
- });
- // do multiple cuts until ads removed
- function cut(sci, s, w, sc, p, i) {
- if (i > 0) {
- i -= 1;
- }
- if (i && !sci(s, w, sc, p)) {
- setTimeout(cut, 100, sci, s, w, sc, p, i);
- }
- }
- cut(scissors, selector, words, scope, params, (nonstop ? -1 : 30));
- }
-
- function preventBackgroundRedirect() {
- // create "cose_me" event to call high-level window.close()
- var key = Math.random().toString(36).substr(2);
- window.addEventListener('close_me_'+key, function(e) {
- window.close();
- });
-
- // window.open wrapper
- function pbrLander() {
- var orgOpen = window.open.bind(window);
- function closeWindow(){
- // site went to a new tab and attempts to unload
- // call for high-level close through event
- var event = new CustomEvent("close_me_%key%", {});
- window.dispatchEvent(event);
- }
- function open(){
- var idx = String.prototype.indexOf;
- if (arguments[0] &&
- (idx.call(arguments[0], window.location.host) > -1 ||
- idx.call(arguments[0], '://') === -1)) {
- window.addEventListener('unload', closeWindow, true);
- }
- orgOpen.apply(window, arguments);
- }
- window.open = open.bind(window);
- var s = document.currentScript;
- if (s) {s.parentNode.removeChild(s);}
- }
-
- // land wrapper on the page
- var script = document.createElement('script');
- script.appendChild(document.createTextNode('('+pbrLander.toString().replace(/%key%/g,key)+')();'));
- document.head.insertBefore(script,document.head.firstChild);
- console.log("Background redirect prevention enabled.");
- }
-
- function forbidServiceWorker() {
- if (!("serviceWorker" in navigator)) {
- return;
- }
- var svr = navigator.serviceWorker.ready;
- Object.defineProperty(navigator, 'serviceWorker', {
- value: {
- register: function(){
- console.log('Registration of serviceWorker ' + arguments[0] + ' blocked.');
- return new Promise(function(){});
- },
- ready: new Promise(function(){}),
- addEventListener:function(){}
- }
- });
- document.addEventListener('DOMContentLoaded', function() {
- if (!svr) {
- return;
- }
- svr.then(function(sw) {
- console.log('Found existing serviceWorker:', sw);
- console.log('Attempting to unregister...');
- sw.unregister().then(function() {
- console.log('Unregistered! :)');
- }).catch(function(err) {
- console.log('Unregistration failed. :(', err);
- console.log('Try to remove it manually:');
- console.log(' 1. Open: chrome://serviceworker-internals/ (Google Chrome and alike) or about:serviceworkers (Mozilla Firefox) in a new tab.');
- console.log(' 2. Search there for one with "'+document.domain+'" in the name.');
- console.log(' 3. Use buttons in the same block with service you found to stop it and uninstall/unregister.');
- });
- }).catch(function(err) {
- console.log("Lol, it failed on it's own. -_-", err);
- });
- }, false);
- }
-
- var scripts = {};
- scripts['fs.to'] = function() {
- function skipClicker(i) {
- if (!i) {
- return;
- }
- var skip = document.querySelector('.b-aplayer-banners__close');
- if (skip) {
- skip.click();
- } else {
- setTimeout(skipClicker, 100, i-1);
- }
- }
- setTimeout(skipClicker, 100, 30);
-
- createStyle([
- '.l-body-branding *,'+
- '.b-styled__item-central,'+
- '.b-styled__content-right,'+
- '.b-styled__section-central,'+
- 'div[id^="adsProxy-"]'+
- '{display:none!important}',
- 'body {background-image:url(data:image/png;base64,'+
- 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACX'+
- 'BIWXMAAC4jAAAuIwF4pT92AAAADUlEQVR42mOQUdL5DwACMgFq'+
- 'BC3ttwAAAABJRU5ErkJggg==)!important}'
- ]);
-
- if (/\/(view_iframe|iframeplayer)\//i.test(document.location.pathname)) {
- var p = document.querySelector('#player:not([preload="auto"])'),
- m = document.querySelector('.main'),
- adStepper = function(p) {
- if (p.currentTime < p.duration) {
- p.currentTime += 1;
- }
- },
- adSkipper = function(f, p) {
- f.click();
- p.waitAfterSkip = false;
- p.longerSkipper = false;
- console.log('Пропустили.');
- },
- cl = function(p) {
- var faster = document.querySelector('.b-aplayer__html5-desktop-skip'),
- series = document.querySelector('.b-aplayer__actions-series');
-
- function clickSelected() {
- var s = document.querySelector('.b-aplayer__popup-series-episodes .selected a');
- if (s) {
- s.click();
- }
- }
-
- if ((!faster || faster.style.display !== 'block') && series && !p.seriesClicked) {
- series.click();
- p.seriesClicked = true;
- p.longerSkipper = true;
- setTimeout(clickSelected, 1000);
- p.pause();
- }
-
- function skipListener() {
- if (p.waitAfterSkip) {
- console.log('В процессе пропуска…');
- return;
- }
- p.pause();
- if (!p.classList.contains('m-hidden')) {
- p.classList.add('m-hidden');
- }
- if (faster && p.currentTime &&
- win.getComputedStyle(faster).display === 'block' &&
- !faster.querySelector('.b-aplayer__html5-desktop-skip-timer')) {
- p.waitAfterSkip = true;
- setTimeout(adSkipper, (p.longerSkipper?3:1)*1000, faster, p);
- console.log('Доступен быстрый пропуск…');
- } else {
- setTimeout(adStepper, 1000, p);
- }
- }
-
- p.addEventListener('timeupdate', skipListener, false);
- },
- o = new MutationObserver(function (ms) {
- var m, node;
- for (m of ms) {
- for (node of m.addedNodes) {
- if (node.id === 'player' &&
- node.nodeName === 'VIDEO' &&
- node.getAttribute('preload') !== 'auto') {
- cl(node);
- }
- }
- }
- });
- if (p.nodeName === 'VIDEO') {
- cl(p);
- } else {
- o.observe(m, {childList: true});
- }
- }
- };
- scripts['brb.to'] = scripts['fs.to'];
- scripts['cxz.to'] = scripts['fs.to'];
-
- scripts['drive2.ru'] = function() {
- gardener('.c-block:not(.js-recommendations),.o-grid__item', />Реклама<\//i);
- };
-
- scripts['fishki.net'] = function() {
- gardener('.main-post', /543769|Реклама/);
- };
-
- scripts['hdgo.cc'] = {
- 'now': function(){
- var o = new MutationObserver(function(ms) {
- var m, node;
- for (m of ms) {
- for (node of m.addedNodes) {
- if (node.tagName === 'SCRIPT' && node.getAttribute('onerror') !== null) {
- node.removeAttribute('onerror');
- }
- }
- }
- });
- o.observe(document, {childList:true, subtree: true});
- }
- };
- scripts['couber.be'] = scripts['hdgo.cc'];
- scripts['46.30.43.38'] = scripts['hdgo.cc'];
-
- scripts['hdrezka.me'] = {
- 'now': function() {
- Object.defineProperty(win, 'fuckAdBlock', {
- value: {
- onDetected: function() {
- console.log('Pretending to be an ABP detector.');
- }
- }
- });
- Object.defineProperty(win, 'ab', {
- value: false,
- enumerable: true
- });
- },
- 'DOMContentLoaded': function() {
- gardener('div[id][onclick][onmouseup][onmousedown]', /onmouseout/i);
- }
- };
-
- scripts['megogo.net'] = {
- 'now': function() {
- Object.defineProperty(win, "adBlock", {
- value : false,
- enumerable : true
- });
- Object.defineProperty(win, "showAdBlockMessage", {
- value : function () {},
- enumerable : true
- });
- }
- };
-
- scripts['naruto-base.su'] = function() {
- gardener('div[id^="entryID"],.block', /href="http.*?target="_blank"/i);
- };
-
- scripts['overclockers.ru'] = {
- 'now': function() {
- // Following code inspired by:
- // https://greasyfork.org/en/scripts/23922-anti-adblock-killer-for-overclockers-ru
- function antiAntiABP() {
- var o = new MutationObserver(function(ms) {
- var m, node;
- for (m of ms) {
- for (node of m.addedNodes) {
- if (node.nodeType === Node.ELEMENT_NODE && node.onerror) {
- node.onerror = null;
- console.log("Disabled 'onerror' on", node);
- }
- }
- }
- });
- o.observe(document, {childList: true, subtree: true});
- var s = document.currentScript;
- s.parentNode.removeChild(s);
- }
- var s = document.createElement('script');
- s.textContent = '(' + antiAntiABP.toString() + ')();';
- document.documentElement.appendChild(s);
- }
- };
- scripts['forums.overclockers.ru'] = {
- 'now': function() {
- createStyle(['.needblock {position: fixed; left: -10000px}']);
- Object.defineProperty(win, 'adblck', {
- value: 'no',
- enumerable: true
- });
- }
- };
-
- scripts['pb.wtf'] = function() {
- createStyle(['.reques,#result,tbody.row1:not([id]) {display: none !important}']);
- // image in the slider in the header
- gardener('a[href$="=="]', /img/i, {root:'.release-navbar', observe:true, parent:'div'});
- // ads in blocks on the page
- gardener('a[href^="/"]', /<img\s.*<br>/i, {root:'#main_content', observe:true, parent:'div[class]'});
- // line above topic content
- gardener('.re_top1', /./, {root:'#main_content', parent:'.hidden-sm'});
- };
- scripts['piratbit.org'] = scripts['pb.wtf'];
- scripts['piratbit.ru'] = scripts['pb.wtf'];
-
- scripts['pikabu.ru'] = function() {
- gardener('.story', /story__sponsor|story__gag|profile\/ads"/i, {root: '.inner_wrap', observe: true});
- };
-
- scripts['rp5.ru'] = function() {
- var co = document.querySelector('#content'), i, nodes;
- if (!co) {
- return;
- }
- nodes = co.parentNode.childNodes;
- i = nodes.length;
- while (i--) {
- if (nodes[i] !== co) {
- nodes[i].parentNode.removeChild(nodes[i]);
- }
- }
- };
-
- scripts['rustorka.com'] = {
- 'now':function(){
- win.open = function(){
- console.log('Site attempted to open a new window', arguments);
- };
- },
- 'DOMContentLoaded':function() {
- gardener('span[class],ul[class],span[id],ul[id]', /\/\d{12,}\.php/i, {root:'#sidebar1', observe:true});
- gardener('div[id][style*="!important"]', /!important/i);
- }
- };
- scripts['rumedia.ws'] = scripts['rustorka.com'];
-
- scripts['sport-express.ru'] = function() {
- gardener('.js-relap__item',/>Реклама\s+<\//, {root:'.container', observe: true});
- };
-
- scripts['sports.ru'] = function() {
- gardener('.aside-news-list__item', /aside-news-list__advert/i, {root:'.aside-news-block'});
- };
-
- scripts['turbobit.net'] = {'now': preventBackgroundRedirect};
-
- scripts['yap.ru'] = function() {
- var words = /member1438|Administration/;
- gardener('form > table[id^="p_row_"]', words);
- gardener('tr > .holder.newsbottom', words, {parent:'tr', siblings:-2});
- };
- scripts['yaplakal.com'] = scripts['yap.ru'];
-
- scripts['reactor.cc'] = {
- 'now': function() {
- win.open = (function(){ throw new Error('Redirect prevention.'); }).bind(window);
- },
- 'click': function(e) {
- var node = e.target;
- if (node.nodeType === Node.ELEMENT_NODE &&
- node.style.position === 'absolute' &&
- node.style.zIndex > 0)
- node.parentNode.removeChild(node);
- },
- 'DOMContentLoaded': function() {
- var words = new RegExp(
- 'блокировщика рекламы'
- .split('')
- .map(function(e){return e+'[\u200b\u200c\u200d]*';})
- .join('')
- .replace(' ', '\\s*')
- .replace(/[аоре]/g, function(e){return ['[аa]','[оo]','[рp]','[еe]']['аоре'.indexOf(e)];}),
- 'i'),
- can;
- function deeper(spider) {
- var c, l, n;
- if (words.test(spider.innerText)) {
- if (spider.nodeType === Node.TEXT_NODE) {
- return true;
- }
- c = spider.childNodes;
- l = c.length;
- n = 0;
- while(l--) {
- if (deeper(c[l]), can) {
- n++;
- }
- }
- if (n > 0 && n === c.length && spider.offsetHeight < 750) {
- can.push(spider);
- }
- return false;
- }
- return true;
- }
- function probe(){
- if (words.test(document.body.innerText)) {
- can = [];
- deeper(document.body);
- var i = can.length, j, spider;
- while(i--) {
- spider = can[i];
- if (spider.offsetHeight > 10 && spider.offsetHeight < 750) {
- spider.setAttribute('style', 'background:none!important');
- }
- }
- }
- }
- var o = new MutationObserver(probe);
- o.observe(document,{childList:true, subtree:true});
- }
- };
- scripts['joyreactor.cc'] = scripts['reactor.cc'];
- scripts['pornreactor.cc'] = scripts['reactor.cc'];
-
- scripts['auto.ru'] = function() {
- var words = /Реклама|Яндекс.Директ|yandex_ad_/;
- var userAdsListAds = [
- '.listing-list > .listing-item',
- '.listing-item_type_fixed.listing-item'
- ];
- var catalogAds = [
- 'div[class*="layout_catalog-inline"]',
- 'div[class$="layout_horizontal"]'
- ];
- var otherAds = [
- '.advt_auto',
- '.sidebar-block',
- '.pager-listing + div[class]',
- '.card > div[class][style]',
- '.sidebar > div[class]',
- '.main-page__section + div[class]',
- '.listing > tbody'];
- gardener(userAdsListAds.join(','), words, {root:'.listing-wrap', observe:true});
- gardener(catalogAds.join(','), words, {root:'.catalog__page,.content__wrapper', observe:true});
- gardener(otherAds.join(','), words);
- };
-
- scripts['online.anidub.com'] = function() {
- var script = document.createElement('script');
- script.type = "text/javascript";
- script.innerHTML = "function ogonekstart1() {}";
- document.getElementsByTagName('head')[0].appendChild(script);
-
- var style = document.createElement('style');
- style.type = 'text/css';
- style.appendChild(document.createTextNode('.background {background: none!important;}'));
- style.appendChild(document.createTextNode('.background > script + div, .background > script ~ div:not([id]):not([class]) + div[id][class] {display:none!important}'));
- document.head.appendChild(style);
- };
-
- scripts['rsload.net'] = {
- 'load': function() {
- var dis = document.querySelector('.cb-disable');
- if (dis) {
- dis.click();
- }
- },
- 'click': function(e) {
- var t = e.target;
- if (t && t.href && (/:\/\/\d+\.\d+\.\d+\.\d+\//.test(t.href))) {
- t.href = t.href.replace('://','://rsload.net:rsload.net@');
- }
- }
- };
-
- scripts['imageban.ru'] = {
- 'now': preventBackgroundRedirect,
- 'DOMContentLoaded': function() {
- win.addEventListener('unload', function() {
- if (!window.location.hash) {
- window.location.replace(window.location+'#');
- } else {
- window.location.hash = '';
- }
- }, true);
- }
- };
-
- var domain = document.domain, name;
- while (domain.indexOf('.') !== -1) {
- if (scripts.hasOwnProperty(domain)) {
- if (typeof scripts[domain] === 'function') {
- document.addEventListener ('DOMContentLoaded', scripts[domain], false);
- }
- for (name in scripts[domain]) {
- if (name !== 'now') {
- (name === 'load' ? window : document)
- .addEventListener (name, scripts[domain][name], false);
- } else {
- scripts[domain][name]();
- }
- }
- }
- domain = domain.slice(domain.indexOf('.') + 1);
- }
- })();