Creammonkey の GM_XHR

March 6th, 2007

やるよやるよと言っていた Creammonkey の GM_xmlhttpRequest 対応を、さっき SVN trunk に commit した。まだ unsafeWindow まわりはちゃんと動いていないのだけど、ページ上から GM_* が呼ばれるのだけは防げているように思う。

文字列置換で、bridge には GM_* をあつめたオブジェクトの変数名が、body にはユーザースクリプトそのものがはいります。

(function () {
    // define GM functions
    var GM_log = function (s) {
        <bridge>.gmLog_(s);
    }
    var GM_getValue = function (k, d) {
        <bridge>.gmValueForKey_defaultValue_(k, d);
    }
    var GM_setValue = function (k, v) {
        <bridge>.gmSetValue_ForKey_(v, k);
    }
    var GM_registerMenuCommand = function (t, c) {
        <bridge>.gmRegisterMenuCommand_callback_(t, c);
    }
    var GM_xmlhttpRequest = function (d) {
        <bridge>.gmXmlhttpRequest_(d);
    }

    // unsafeWindow
    var unsafeWindow = window;

    with ({ document: unsafeWindow.document, location: unsafeWindow.location, window: {} }) {
        <body>;
    }
})();

bridge の変数名はページ上のグローバルな変数とかぶらないように乱数で名前をつけて、実行直前にそこに GM_* をいれたオブジェクトを代入、直後に null を代入している。