この日記はMozillaのプロダクトへの貢献者としての私の成果を中心に、気になったバグやWeb界隈の話題について書いていますが、 断り書きがある場合を除き、いかなる団体のオフィシャルな見解ではありません。あくまでも個人的なものです。 Mozilla Foundation、Mozilla Corporation、及び関連企業の公式情報ではないことに注意してください。

現在、XHTML 1.0 (もどき)から、HTML5なコンテンツに修正中です。古い日記は修正が完了していませんので表示が崩れます。 順次、修正していく予定ですのでしばらくお待ちください。

もずはっく日記(2012年2月)

2012年2月15日

Bug-org 625151 Alt key sometimes fails to open Menu bar
初回投稿日時: 2012年02月15日17時31分28秒
カテゴリ: Mozilla Core Mozilla13 バグ修正
SNS: (list)

Windowsで、Altキーを押しても、メニューバーが表示されないことがある、というバグです。MozillaZine.jpのフォーラムにあがってた報告からバグを探して修正しました。

再現条件を挙動から絞り込むのは難しかったのですが、コードを見ると分かりやすかったです。まず、Alt+Tabでウインドウがフォーカスを失う時にAltキーが押されているのかどうかを保存しているフラグがクリアされないケースがありました(というか、現状のUIだと基本的にはクリアされない)。ウインドウがフォーカスを失う時にはAltキーの状態を引き継ぐ必要が全くないはずなので、常にフラグをクリアするようにしました。もし、この部分の修正で問題があったとしても別のフラグを用意してどうにか対応すべき問題のように思えます。

さらに、IMMがインストールされている環境ではもうひとつ、未だに残っているハックがこのバグをメジャーなものにしていました。現在、GeckoはWM_IME_NOTIFYAltキーを押している間に受け取ると、`キー(半角/全角キー)のkeypressイベントを生成します。メニューバーはこのキーイベントを受け取ると、Altキーを押している間に別のキー入力があったため、Altキーのkeyupイベントでメニューバーをアクティブにする必要がないと判断するからです。ですので、この余計なイベントがAltキーによるメニューバーの表示操作はキャンセルされた、というフラグを無条件に立てていたため、次にウインドウがアクティブになった後、最初のAltキーのイベントをキャンセル済みであるとして処理しなくなっていました。

後者のもうひとつの原因は、Altキーのkeydown時にはそもそもフラグを初期化すべきなはずですが、それをearly returnではないコードで書いたため、メンテナンスでフラグが増加したときにエンバグした感じです。正常ケースを、if文をネストして深い位置に書こうとすると条件判定が複雑になりすぎてこういうことになるので、成功したかどうかではなく、失敗したかどうか判定して、とっとと処理から抜ける方がやはり合理的ですね。

関連するかもしれないエントリ

bug-org 625151を含むエントリ