やるよやるよと言っていた 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 を代入している。
