// ==UserScript== // @name rBlock // @description Removes redirects of some sites, such as Google, Zhihu... // @namespace https://greasyfork.org/zh-CN/scripts/20524-redirect-blocker // @author nonoroazoro // @include /^https?\:\/\/(www|encrypted|news)\.google\./ // @version 1.2 // @grant none // @downloadURL none // ==/UserScript== if (typeof unsafeWindow == "undefined") { unsafeWindow = window; } // block redirects of google function _blockGoogle() { // 1. all/videos/news/apps let elems = document.querySelectorAll(`a[onmousedown^="return rwt("]`); for (let e of elems) { e.removeAttribute("onmousedown"); } // 2. images elems = document.querySelectorAll(`#irc_cc a[class^="irc_"], #irc_cc a[class*=" irc_"]`); for (let e of elems) { _removeListeners(e, "mousedown"); } // 3. news elems = document.querySelectorAll(`a.article`); for (let e of elems) { _removeListeners(e, "click mousedown"); } // 4. general elems = document.querySelectorAll(`a[href^="/url?"]`); const regex = /(?:\/url\?.*url\=)(http.*?)$/i; for (let e of elems) { // reveal url const m = e.href.match(regex); if (m && m[1]) { e.href = decodeURIComponent(m[1]); } // open in new tab if (!e.target) { e.target = "_blank"; } } // 5. expose cached links let menuLink; let cacheLink; elems = document.querySelectorAll(`a[href^="http://webcache.googleusercontent."], a[href^="https://webcache.googleusercontent."]`); for (let e of elems) { e.style.display = "inline"; menuLink = e.closest("div.action-menu.ab_ctl"); cacheLink = document.createElement("a"); cacheLink.href = e.href.replace(/^http\:/, "https:"); cacheLink.target = "_blank"; cacheLink.innerText = " Cached "; menuLink.parentNode.insertBefore(cacheLink, menuLink); } } function _removeListeners(p_element, p_events) { if (p_element instanceof EventTarget && typeof p_events === "string") { const eventList = p_events.split(/\W+/) || []; for (let event of eventList) { p_element.removeEventListener(event, _preventDefaultAction, true); p_element.addEventListener(event, _preventDefaultAction, true); } } } function _preventDefaultAction(e) { e.stopPropagation(); } // start blocker unsafeWindow.addEventListener("load", () => { _blockGoogle(); const observer = new unsafeWindow.MutationObserver((p_mutations) => { _blockGoogle(); }); observer.observe(document.body, { childList: true, subtree: true } ); });