Замена функций страницы через пользовательский скрипт в Chrome? - PullRequest
2 голосов
/ 22 августа 2010

Я создал скрипт Greasemonkey, который заменяет функцию страницы:

(function() {
    var oldFunc = func;
    func = function() {
        oldFunc();
        // other stuff
    };
)();

Я всегда предполагал, что этот скрипт будет работать как в Gresemonkey, так и в Chrome, и прочитал, что Chrome не поддерживает unsafeWindowпоэтому вводил скрипт на страницу, конвертируя функцию в строку и используя setTimeout:

setTimeout("(function(){var old=func;func=function(){old();/*other stuff*/}}())", 0);

. Это отлично работает в Greasemonkey, но абсолютно ничего не дает в Chrome.Он явно не стреляет, но в журнале тоже ничего не появляется.Я пробовал несколько других стилей инъекций, но не могу заставить что-либо работать.(Для тестирования я также добавил alert() в начало функции.)

  1. setTimeout(..., 0) - ничего
  2. Запуск функции в области видимости, без внедрения встраница - без предупреждения, но "func не определено" в консоли
  3. document.href = "javascript:..." - ничего
  4. document.body.addEventListener("load", ...) - ничего

Все это с@run-at document-end.

К сожалению, это мой первый пользовательский скрипт в Chrome, и я не знаю, как его отладить, даже после часа или около того, что он гуглит и ковыряется в SO.Любая помощь?

Актуальный скрипт, в данный момент работающий в Greasemonkey: http://pastebin.com/HtLVjYHg

1 Ответ

4 голосов
/ 30 августа 2010

В конце концов, единственная найденная мною техника, которая работала в Chrome, - это создание узла <script> с использованием методов DOM. К счастью, в Firefox и Opera это работает одинаково хорошо, и <func>.toString():

делает его совершенно безболезненным
function embed() {
   var oldFunc = window.func;

    window.func = function() {
        oldFunc();

        // other stuff
    };
}

var inject = document.createElement("script");

inject.setAttribute("type", "text/javascript");
inject.appendChild(document.createTextNode("(" + embed + ")()"));

document.body.appendChild(inject);

Окончательный сценарий: http://userscripts.org/scripts/review/84394

...