Greasemonkey 0.9.5でもldrize_cooperationがちょっと動くようにする

Greasemonkey 0.9.5から*1内部仕様変更の為に2011年6月9日現在のldrize_cooperation.jsが動かなくなったので、復活させるパッチを書いた。ただし、ldrize_cooperation.jsの他の色々な機能は死んだまま(拡張ヒントlとLとか、コマンドmbとかpinとか、intelligence_bindとかも)*2

まずFirefox 4以降の人はFirefox 4 で Minibuffer + LDRize + ReblogCommand を動かす | WWW WATCHを参考にLDRize自体を動くようにしておく。

あとは2011年6月9日現在のldrize_cooperation.jsへ以下のパッチを当てるだけ。

--- a/ldrize_cooperation.js
+++ b/ldrize_cooperation.js
@@ -315,7 +315,8 @@
             this.LDRizeCooperationPanel.setAttribute("src",value ? DISABLE_ICON : ENABLE_ICON);
             _isEnable = value;
         },
-        isEnableLDRize: function() this.LDRize.getSiteinfo() != undefined,
+        isEnableLDRize: function() this.LDRize.getSiteinfo() != undefined ||
+                                   window.content.wrappedJSObject.document.getElementById("gm_ldrize") != null,
         isEnableLDRizeCooperation: function() /^https?:$/.test(content.location.protocol) && this.isEnable && this.isEnableLDRize(),

         //Pin

パッチ当て済みのldrize_cooperation.jsはこちら

動かなくなった原因

ldrize_cooperation.jsは、今までLDRizeとMinibufferのインスタンスを取得するために、GM_GreasemonkeyService#evalInSandbox()と言う関数をフックしていた。けれど例のグリモンのコミット0cb7d4acf437a4a88e3dによって、このGM_GreasemonkeyService#evalInSandbox()に相当する関数が、グリモンのコンポーネントグローバルな関数runScriptInSandbox()に置き換えられ、フックできなくなったためLDRize、Minibufferのインスタンスを取得できなくなった。*3
つまり、パッチを見て感じ取れる通り、isEnableLDRize()関数がfalseを返しちゃうのが割と直接の原因。

解決方法

LDRizeはページ内に"gm_ldrize"と言うIDを持ったDIV要素を挿入するので、それがあればisEnableLDRize()がtrueを返すようにした。これだけ。

所でそもそもLDRizeインスタンス取得できてないのにLDRizeできているのは不思議に思うかもしれない。実はldrize_cooperation.jsはLDRizeの普通の操作にそのインスタンスを利用するのではなく、単純にページドキュメントへキーイベントを発行することでLDRizeしていたからでした。

*1:正確には0cb7d4acf437a4a88e3dから

*2:intelligence_bindは前から死んでた?

*3:コンポーネント周りの知識が足りてないので変な事言ってるかもしれません。