Как программировать без «unsafeWindow»? - PullRequest
0 голосов
/ 12 декабря 2011

В моем скрипте Greasemonkey я хотел бы переопределить функцию, которая все еще существует на веб-странице.

Итак, я использую этот код JavaScript:

var oldDoWork = DoWork;

unsafeWindow.DoWork = function()
{
    // Do some new work
    ...

    oldDoWork(); // Call the old function
}

Работает.

Но есть две проблемы с этим методом:

  1. По словам Greasemonkey, функция unsafeWindow является проблемой безопасности.
  2. В этой новой функции мы не можем использовать GM_getValue и GM_setValue. Обходной путь использования таймера вызывает некоторые другие проблемы асинхронного задания.

Как мне управлять приведенным выше кодом без использования unsafeWindow?

Ответы [ 2 ]

1 голос
/ 12 декабря 2011

Чтобы избежать unsafeWindow, вы можете использовать:

location.assign("javascript:YOUR_CODE_GOES_HERE");

Но это также не позволит вам использовать функции GM_ *.

И единственный способ использовать GM_ * "изсфера ГМ "использует таймер.

Так что, в основном, ответ на ваш вопрос: вы находитесь в правильном пути, вы просто не можете с этим поделать.

Если вашфункция ничего не возвращает, тогда я бы порекомендовал вам использовать location.assign

0 голосов
/ 13 декабря 2011

Если вы хотите избежать unsafeWindow, введите код, который взаимодействует с JS страницы, на страницу.См. addJS_Node() ниже.

Чтобы запускать функции GM_ из таких событий, вы должны иметь возможность взаимодействовать через:

Так что на данный момент обходной путь все еще должен использовать таймер, , но Вы можете избежать unsafeWindow, если хотите:

//--- Put everything that goes into the main page, inside myJS().
function myJS () {

    window.oldDoWork = DoWork;

    window.DoWork = function() {
        // Do some new work

        callGM_setValue ("From target page", "some value");

        window.oldDoWork(); // Call the old function
    }

    function callGM_setValue (varName, varValue) {

        //--- Generate and dispatch a synthetic event.
        var zEvent  = document.createEvent ("CustomEvent");
        zEvent.initCustomEvent (
            "messageToGM_setvalue", true, false,
            {Name: varName, Value: varValue}
        );

        document.body.dispatchEvent (zEvent);
    }
}

document.body.addEventListener (
    "messageToGM_setvalue", fireGM_setValue, false
);

function fireGM_setValue (zEvent) {

    /*--- setTimeout remains one of the few things that can cleanse
        the calling tree of it's "unsafe" origins.
    */
    setTimeout (function() {
        GM_setValue (zEvent.detail.Name, zEvent.detail.Value);
    }, 0);
}

addJS_Node (null, null, myJS);

function addJS_Node (text, s_URL, funcToRun) {
    var D           = document;
    var scriptNode  = D.createElement ('script');
    scriptNode.type = "text/javascript";
    if (text)       scriptNode.textContent  = text;
    if (s_URL)      scriptNode.src          = s_URL;
    if (funcToRun)  scriptNode.textContent  = '(' 
                                            +   funcToRun.toString()
                                            + ')()';

     var targ    = D.getElementsByTagName('head')[0]
                || D.body
                || D.documentElement;
    targ.appendChild (scriptNode);
}
...