// ==UserScript== // @name RU AdList JS Fixes // @namespace ruadlist_js_fixes // @version 0.6.1 // @description try to take over the world! // @author lainverse & dimisa // @match *://*/* // @grant none // @run-at document-start // @downloadURL none // ==/UserScript== (function() { 'use strict'; if (!/firefox/i.test(navigator.userAgent)) { // scripts for non-Firefox browsers // https://greasyfork.org/scripts/19144-websuckit/ (function() { // check if the browser supports Proxy and WebSocket if (!window.Proxy || !window.WebSocket) return; var to_block =[ 'et-code.ru', 'news.mail.ru', 'mxtads.com', 'torvind.com', 'trafmag.com', 'ws.hghit.com', 'wsp.marketgid.com' ]; var ws = window.WebSocket; window.WebSocket = new Proxy(ws, { construct: function(WS,i){ console.log('Opening WebSocket on', i[0], '…'); var d = i[0].match(/:\/\/[^:/]+/)[0]; if (d && to_block.indexOf(d.substring(3)) > -1) { console.log("Nope! Not gonna happen!"); return {}; } else return new WS(i[0],i[1]); } }); })(); // https://greasyfork.org/scripts/14720-it-s-not-important (function(){ var imptt = /((display|(margin|padding)(-top|-bottom)?)\s*:[^;!]*)!\s*important/ig, rplsf = function(str,grp){return grp;}; function unimportanter(el, si) { if (!imptt.test(si) || el.style.display == 'none') return 0; // get out if we have nothing to do here var so = si.replace(imptt, rplsf), 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(m, c) { var si = m.getAttribute ? m.getAttribute('style') : null; if (si && si.indexOf('!') > -1) c+=unimportanter(m, si); return c; } function checkNodes(m, c) { var i = m.length; while(i--) c = checkTarget(m[i], c); return c; } var observer = new MutationObserver(function(mutations) { setTimeout(function(m) { var i = m.length, c = 0; while(i--) { if (m[i].target) c = checkTarget(m[i].target, c); if (m[i].addedNodes.length) c = checkNodes(m[i].addedNodes, c); } logger(c); },0,mutations); }); observer.observe(document, { childList : true, attributes : true, attributeFilter : ['style'], subtree : true }); window.addEventListener ("load", function(){ var c = 0, imp = document.querySelectorAll('[style*="!"]'), i = imp.length; while(i--) { c+= checkTarget(imp[i], c); } logger(c); }, false); })(); } document.addEventListener ("DOMContentLoaded", function() { // function to search and remove nodes by conten // 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: // .parent - parent node to remove if content is found in the child node // .siblings - number of simling nodes to remove (excluding text nodes) function scissors (selector, words, scope, params) { var nodes = scope.querySelectorAll(selector), i = nodes.length, toRemove = []; while (i--) if (words.test(nodes[i].innerHTML) || !nodes[i].childNodes.length) { var node = nodes[i], siblings = Math.abs(params.siblings) || 0, iterFunc = params.siblings > 0 ? 'nextSibling' : 'previousSibling'; // drill up to the specified parent node if required if (params.parent) while(node !== scope && node.tagName.toLowerCase() !== params.parent) node = node.parentNode; if (node === scope) break; toRemove.push(node); // add multiple nodes if defined more than one sibling while (siblings) { node = node[iterFunc]; toRemove.push(node); if (node.tagName) siblings--; //don't count text nodes } } i = toRemove.length; while(i--) toRemove[i].parentNode.removeChild(toRemove[i]); 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 // .watch - if true then check will be performed continuously // .parent - passed down to scissors // .siblings - passed down to scissors function gardener(selector, words, params) { params = params || {}; var scope = document.body, nonstop = false; // narrow dowsn 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 watch mode if required if (params.watch) { if (window.MutationObserver) { var o = new MutationObserver(function(ms){ ms.forEach(function(m){ if (m.addedNodes.length) scissors(selector, words, scope, params); }); }); o.observe(document.querySelector(params.root), {childList:true, subtree: true}); } else nonstop = true; } // watch for a full page load to do one extra cut window.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--; 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)); } 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); var divs = document.getElementsByTagName('div'); var re = /\w{1,5}\d{1,5}\w{1,5}\d{1,5}/; for(var i = 0; i < divs.length; i++) if(re.test(divs[i].className)) divs[i].style.display = 'none'; var style = document.head.appendChild( document.createElement('style') ); style.type = 'text/css'; style.sheet.insertRule([ '.b-aplayer-teasers > a', '.b-player-popup__content > div[class][style="position: relative;"]', 'div[class^="b-adproxy"]', 'div[id^="admixer_async_"]' ].join(',')+'{display:none!important}', 0); if (/\/view_iframe\//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++; }, cl = function(p) { function skipListener() { p.pause(); if (!p.classList.contains('m-hidden')) p.classList.add('m-hidden'); setTimeout(adStepper, 1000, p); } p.addEventListener('timeupdate', skipListener, false); }, o = new MutationObserver(function (mut) { mut.forEach(function (e) { for (var i = 0; i < e.addedNodes.length; i++) { if (e.addedNodes[i].id === 'player' && e.addedNodes[i].nodeName === 'VIDEO' && e.addedNodes[i].getAttribute('preload') != 'auto') { cl(e.addedNodes[i]); } } }); }); 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['fishki.net'] = function() { gardener('.main-post', /543769|Реклама/); }; scripts['hdrezka.me'] = function() { gardener('div[id][onclick][onmouseup][onmousedown]', /onmouseout/i); }; 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['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', watch:true}); gardener(catalogAds.join(','), words, {root:'.catalog__page,.content__wrapper', watch: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); }; var domain = document.domain; while (domain.indexOf('.') + 1) { if (domain in scripts) { scripts[domain](); break; } domain = domain.slice(domain.indexOf('.') + 1); } }); })();