Firefox3 + GreasemonkeyでunsafeWindowのプロパティが取れない件を解決する方法
RTMにカレンダーを出すGMを書いたのですが、FF2ではちゃんと動いていたもののFF3ではunsafeWindowのオブジェクトを利用したときにエラーになっていました。原因は分からないんですが、FF3でセキュリティが厳しくなったんでしょうか?
とりあえず以下の方法で解決しました。
(function() { var gm_script = function() { alert(1); } var script = document.createElement('script'); script.type = 'text/javascript'; script.innerHTML = gm_script.toSource() + '();'; document.getElementsByTagName('head')[0].appendChild(script); })();
alert(1);の部分にGMで実行したいスクリプトを書きます。
キモは今までGM内で実行していたスクリプトを、scriptタグにつっこんでページに追加していることです。ページ内のネィティブなscript(言い方あってる?)として実行されるので、alert(1);の部分でwindowにくっついているプロパティに普通にアクセスできます。
gm_script.toSource();で(function(){alert(1);})が返ってくるので、();をくっつけて即時実行しちゃってます。この書き方なら今までのスクリプトをほとんど変えずにFF3 + GMでとりあえず動かせます。ただし、unsafeWindowが必要なくなることと、GM_○○系のメソッドは使えなくなることに注意してください。unsafeWindowとGM_○○併用したい場合はどうすりゃいいんだろう…。