rBlock

Removes redirects of some sites, such as Google, Zhihu...

As of 2016-06-14. See the latest version.

// ==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
// ==/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
        }
    );
});