2

XMLHttpRequestこのようなリクエストを通じてページ上でデータが更新されていることをユーザースクリプトに知らせるために、の sendをオーバーライドしたいと考えています。私のオーバーライドコードは次のようになります。

var oldSend = unsafeWindow.XMLHttpRequest.prototype.send;

unsafeWindow.XMLHttpRequest.prototype.send = function(){
    console.log("notified of XHR update");
    oldSend.apply(this, arguments);
}

これをページに挿入すると(unsafeWindow参照なしで)正常に機能しますが、これをユーザースクリプトスコープから機能させたいと思います。 unsafeWindowこれは Firefox では機能しますが、Chrome では機能しません。そこで、Brock Adams の気の利いたトリックを利用してunsafeWindow、Chrome で機能するものを作成しました。

var bGreasemonkeyServiceDefined     = false;

try {
    if (typeof Components.interfaces.gmIGreasemonkeyService === "object") {
        bGreasemonkeyServiceDefined = true;
    }
}
catch (err) {
    //Ignore.
}

if ( typeof unsafeWindow === "undefined"  ||  ! bGreasemonkeyServiceDefined) {
    unsafeWindow    = ( function () {
        var dummyElem   = document.createElement('p');
        dummyElem.setAttribute ('onclick', 'return window;');
        return dummyElem.onclick ();
    } ) ();
}

ただし、2つを組み合わせても何も起こりません。すべてコンソールに貼り付けて動作しますが、ユーザースクリプトから実行してもエラーも出力もありません。私は何か間違ったことをしていますか、それともおそらくこれはこのトリックの能力を超えていますか?

うーん、次のような簡単なことを試してみましunsafeWindow.document.title = 'testing';たが、それも機能しないため、に固有のものではない可能性がありXMLHttpRequestます。

可能な限り、ページへの挿入を回避しようとしています。

4

1 に答える 1

1

これ:

/*--- Create a proper unsafeWindow object on browsers where it doesn't exist
    (Chrome, mainly).
    Chrome now defines unsafeWindow, but does not give it the same access to
    a page's javascript that a properly unsafe, unsafeWindow has.
    This code remedies that.
*/
var bGreasemonkeyServiceDefined     = false;

try {
    if (typeof Components.interfaces.gmIGreasemonkeyService === "object") {
        bGreasemonkeyServiceDefined = true;
    }
}
catch (err) {
    //Ignore.
}

if ( typeof unsafeWindow === "undefined"  ||  ! bGreasemonkeyServiceDefined) {
    unsafeWindow    = ( function () {
        var dummyElem   = document.createElement('p');
        dummyElem.setAttribute ('onclick', 'return window;');
        return dummyElem.onclick ();
    } ) ();
}

これに続いて:

unsafeWindow.document.title = 'testing';

私のテストユーザースクリプトからは問題なく動作します。

これらは次のunsafeWindowトリックでも機能します。

unsafeWindow.foo = function () {
    console.log ("In foo().");
};

unsafeWindow.alert = function (s) {
    console.log ("Alert: ", s);
};

(スクリプトが実行されたページでfoo()、コンソールに入力すると、" In foo(). ". alert()ポップアップは生成されませんが、コンソールに出力されます。)

XMLHttpRequest.prototype.sendそのオーバーライドが Chrome ユーザースクリプトからそのように機能しない理由 (まだ)はわかりませんが、とにかくそのためのアプローチはお勧めしません。unsafeWindow

オーバーライドコードを挿入します。スクリプト全体を挿入しない (またはできない) 場合は、postMessage() (Chrome でも機能します) を使用して、ページ スコープとスクリプト スコープの間で通信します

于 2012-06-19T04:20:07.020 に答える