いくつかのGreasemonkeyスクリプトが動かなくなってた件

FirefoxというかGreasemonkeyの話。

2008年1月頃にGreasemonkeyのUpdateがあった。

その更新によってunsafeWindowの中でGM_xmlhttpRequestなど、いくつかのメソッドが使えなくなっていたことに昨日気が付いた。うお!ほとんど1年も放置してた!?

ええと、この度(といっても10ヶ月前の)仕様変更は、user.jsによってunsafeWindowに不用意に関数を渡さないように!という趣旨のものである。セキュリティ向上のためなら、既存のuser.jsが多少動かなくなるとしても是非もなし。unsafeWindow関連の詳しい情報はこちら

で、GreaseSpot.netの情報によると、

上記5つについてはunsafeWindowから直接呼べなくなりました。

具体的には、

unsafeWindow.someAPIfunction = function() {
  GM_setValue("foo", "bar");
};

上記のように書いても動作しなくなりました。

じゃ、どうすればいいのかというと、

unsafeWindow.someAPIfunction = function() {
  window.setTimeout(function() {
    GM_setValue("foo", "bar");
  }, 0);
});

というようにwindow.setTimeoutにぶち込むことで実行可能になります。

私の場合は、LDRから直接はてブするlivedoor Reader 2 Hatena::Bookmark TagAutoCompと、LDR上でブコメを見るLDR HatebuComment Displayが動かなくなってました。対策は、

  1. GM_xmlhttpRequest を window.setTimeout で包み込む
  2. window.setTimeout の間に入った this を書き換える*1

以上。

インストールしたuser.jsがunsafeWindow絡みで動かなくて困ったときは、大体この二点ぐらいに着目して修正すれば再び動かすことぐらいはできるだろう。っていうか、ネット上でもあんまり誰も困ってないのが凄いと思った。みんなコレ(左腕で軽く作った力こぶを右手でバンバン叩きながら)持ってるんだねぇ。

まとめ

unsafeWindowの問題点を今まできちんと理解してなかった。反省。認証を必要とするサービス(はてブにブクマ追加など)を全てのURLで動かしたい場合は、かなり注意が必要ですね。

気をつけよう バナナの売り切れと unsafeWindow

*1:livedoor Reader 2 Hatena::Bookmark TagAutoCompについては、thisキーワードを消すだけで一応動くようにはなる。