忙しい時に限って、こういう使い物にならないバグが出てくるもんですね。私の環境は、一番よく作業で使うディスプレイがプライマリモニタではないので、ここ最近のビルドは使いにくくて仕方がありませんでした。
で、コメントに書いてあるとおり、セキュリティバグからのregressionなので詳しくは書けないのですが、このセキュリティバグは、自動テストを作ってみたところ、クラッシュするぞ、という話に基づいています。ところが、そのテストが通常利用では、もっと言うなら人間では再現不能なバグなので、おそらくこのテストされているUIがこんな状況を再現していないと思われるのと、Geckoもそんなタイミングで二つのreflowが発生することを想定していないので結果、クラッシュしてるんではないか、と推測されるものでした。
そのクラッシュの原因のひとつは、nsIDeviceContextがネイティブウインドウの生のポインタを持っているのに、nsIWidgetより微妙に長生きすることが直接的な原因のようでした。そこで、セキュリティバグではnsIWidgetが破棄される時に常にnsIDeviceContextを再初期化してポインタをNULLにしていたのですが、nsIDeviceContextを複数のnsIWidgetで共有しているプラットフォームではnsIDeviceContextが現在のディスプレイを取得するのに失敗するようになり、結果、プライマリモニタに常にメニュー等が展開される、という状況になっていました。
nsIDeviceContextに保存するネイティブウインドウへのポインタをNS_NATIVE_WIDGET
のものから、NS_NATIVE_WINDOW
のものに変更し、更にこれをトップレベルウインドウのものを常に使うようにしています。これで、問題はひとまず隠蔽することができました。
そう、おそらくこの修正は正しくありませんが、十分なものだと思われます。多くのハッカーが本家のバグでコメントをつけてくれていますが、結局、誰もこのバグの本質は理解できていません。ですが、バグの重要性から、このパッチは間もなく1.9.1 branchにも降ろされる予定です。
ちなみにこの変更で、nsIScreenManager::screenForNativeWidget
の仕様が大きな変更を受けています(見た目に変更が無いのがタチ悪いですが)。このメソッドは[noscript]
なのでほとんどの拡張作者には関係無いですが、バイナリのモジュールを持つ、特殊な拡張や、Geckoを埋め込んでこのAPIを利用している場合かつ、それがMac上で動作するものである場合は影響を受けます。Cocoaでは、このポインタはNSView
から、NSWindow
に変更されているためです。もし不明な点があればIRCかメールで直接私にコンタクトをとって確認してください。