Удалить указанную c javascript функцию с помощью Greasemonkey - PullRequest
0 голосов
/ 06 марта 2020

Я захожу на веб-сайт с файлом javascript в заголовке HTML

<script>(function(d){var config={kitId:'gpn1wjb',scriptTimeout:3000,async:true},h=d.documentElement,t=setTimeout(function(){h.className=h.className.replace(/\bwf-loading\b/g,"")+" wf-inactive";},config.scriptTimeout),tk=d.createElement("script"),f=false,s=d.getElementsByTagName("script")[0],a;h.className+=" wf-loading";tk.src='//use.typekit.net/'+config.kitId+'.js';tk.async=true;tk.onload=tk.onreadystatechange=function(){a=this.readyState;if(f||a&&a!="complete"&&a!="loaded")return;f=true;clearTimeout(t);try{Typekit.load(config)}catch(e){}};s.parentNode.insertBefore(tk,s)})(document);</script>

Как отключить / удалить / заменить эту функцию Greasemonkey?

1 Ответ

1 голос
/ 06 марта 2020

Нет стандартного способа справиться с этим. Функция, которую вы хотите отключить, запускается, как только браузер читает эту часть HTML, что означает, что вы не можете удалить узел сценария из tampermonkey, даже если вы запускаете usercript в начале загрузки документа (используя @run-at document-start).

Вы можете попытаться использовать тот факт, что они называют setTimeout. Идея состоит в том, чтобы выдать ошибку в тот момент, когда они ее вызывают, чтобы их фрагмент кода не работал должным образом.

Код должен выглядеть следующим образом. Убедитесь, что вы получаете доступ к незаписанному window объекту.

const oldSetTimeout = window.setTimeout;
// replace setTimeout with our hacked version
window.setTimeout = newSetTimeout;
/**
 *
 * @param {function} cb
 * @param {number} delay
 */
function newSetTimeout(cb, delay) {
    // Check if callback contains string we know from the sourcecode
    if (cb && cb.toString().indexOf("bwf-loading")!=-1) {
        // misdeed done, restore normal setTimeout
        window.setTimeout = oldSetTimeout;
        throw new Error("Failing set timeout to kill unwanted script.");
    }
    // otherwise act as normal setTimeout
    else {
        return oldSetTimeout.call(window, arguments);
    }
}
...