人によっては非常に気になっていたのではないかと思われるこのバグ、修正が完了した。
どいういうバグかと言うと、サブメニューが開く瞬間に、そのサブメニューの親のメニューごと閉じられてしまうことがあるというバグ。詳しくはバグ内のコメントを参照。
詳しく、説明してみると、まず、これまであるメニューがハイライトされた時、そのポップアップの他のメニューアイテムがサブメニューを開いているなら、そのサブメニューを閉じるためのタイマーを起動していた。一定時間経過して、そのサブメニューが相変わらずアクティブなメニューではなかった場合にはそのメニューを閉じ、アクティブになっていたらサブメニューを開いたままにしていた。
このメニューがアクティブであるかは閉じようとしているメニューから、子孫メニューの方へ順に下っていき、最後までポップアップ内のどれかのアイテムがハイライトされていたらアクティブ、そうでなければ非アクティブ、という判定方法だった。
この方法は多くの場合に問題が無かったが、以下の場合に最も子孫のメニューがハイライトされていない、という問題を抱えていた。
- サブフォルダを開いた直後
- メニューセパレータの上にマウスカーソルを移動した時
- メニュー内のスクロールボタンにマウスカーソルを移動した時
- メニュー内がスクロール出来るときに、マウスホイールでスクロールした時
これらの問題を、現在のアプローチのまま解決することは実に難しい。メニューはマウスでもキーボードでも操作できるという事実が特にこれを困難にしている。そこで、閉じるメカニズムはそのままに、アプローチを完全に変えてみるとこにした。
新方式では、あるメニューアイテムがハイライトした時、その祖先のポップアップのサブメニューを閉じるためのタイマーを全てキャンセルし、サブメニューを開いているアイテムをハイライト状態に戻して行っている。逆に言うなら、タイマーがタイムアウトした場合、メニューの状態は非アクティブのままだったいう判定で、常に閉じるようになった。
もし、微妙にフィードバックに違和感を感じるなら、この祖先メニューのハイライト状態の変更が従来よりも素早くなっていることに対するものだろう。(従来は、タイムアウト時に、そのメニューがアクティブと判定された場合に、サブメニューを開いているメニューをハイライトしなおしていた。)
メニューの動作を大きく変更したパッチなので、どのようなregressionがあるか想像つかないため、1.8branchへの承認申請は行わないことに注意して欲しい。
IEのめちゃくちゃな処理方法が告白されている。
この話によると、IE6まででは、base要素が出現すると、空要素にも関わらず(しかもhead要素内にしか出現できないにも関わらず)、それを開始タグとして、終了タグを"適切に"補完し、そのbase要素の影響すべきリンク全体がbase要素の子孫要素となるようにし、リンクは、自分に最も近い祖先のbase要素を参照していたというのだ。(base要素がhead要素内にあった場合は、body要素の親をbase要素とするらしい。詳しくはCode-Only: BASE tag changes in IE 7 with Examplesを参照。)
こんなことは普通の人なら思いつかない。base要素の処理における使用頻度を考えると、こんな複雑で、奇怪なことをしなくても各documentオブジェクトにbase要素の情報を持たせれば簡単で、高速な処理ができるではないか。(base要素はhead要素内でも一度しか出現が許されていない、つまり複数のbase要素を処理する義理など何処にもない。)
こんな非常識なことをおそらく、様々な処理で行っているのだろう。IEのバグには不可解で、原因を推測できないものも多い。W3Cの仕様などより、IEの仕様に他のブラウザが仕様を合わせるべきだと主張することがいかに荒唐無稽なことであるか分かるというものだ。IEの仕様にあわせるには、IEと同じ処理、ひいてはIEと同じコードを使わなくては同じになどなろうはずがない。