rBlock

Removes redirects of some sites, such as google, zhihu...

当前为 2016-06-14 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==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.0
// @grant        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
        }
    );
});