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_○○併用したい場合はどうすりゃいいんだろう…。

追記

同じようなやり方で解決されている方がいました!
http://d.hatena.ne.jp/os0x/20080403/1207223147

ブックマークレットっぽく実行する方法もあるんですね。