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

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

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

2009年2月20日

Bug 5669 マウスのホイールのトランザクションが、スクロール不可能な方向のイベントに対しても継続される
初回投稿日時: 2009年02月20日19時25分28秒
最終更新日時: 2009年02月20日19時27分05秒
カテゴリ: Mozilla Core バグ修正
SNS: (list)

例えば、縦スクロールバーのみを持つサブフレーム上でマウスホイールからスクロールさせると、body等の別の横スクロールバーをホイールで横スクロールしようとしても、ホイールによるスクロールのターゲットが、最初のサブフレームにロックされているため、何もスクロールできずに混乱する、というバグでした。あまり発生するようなバグではないですが、この辺の実装をやっている私自身が何が起きてるのか分からずに混乱させられるぐらい、実際に出会うと何が起きているのか理解に苦しむバグです。

今回の修正で、ホイールを回転させてスクロールしようとしても実際にスクロールしなかった場合、ホイールスクロールのトランザクションを更新しないように変更しました。つまり、ホイールによるスクロールを失敗し続けていると、そのうちにそのトランザクションはタイムアウトして、スクロールターゲットがリセットされるようになっています。

具体的に言うと、まず縦スクロールバーしか無いサブフレームを縦にスクロールした時点で、サブフレームがスクロールターゲットとしてロックされます。その後、ユーザが他の横スクロールバーのために横スクロールのホイールイベントを生成してもすぐには横スクロールは実行されません。つまり、何もスクロールしない状態になります。ですが、そのまま横スクロールの操作を継続しているとサブフレームへのロックが外れて、新しい横スクロール可能なターゲットを探して、スクロールを実行します。

これにより、当初からの、意図しないスクロールが行われないようにする、という話との両立を図っています。

実はパッチ自体は昨年末にほぼ完成していたのですが、一連の機能を自動テストに追加しようという話が出たのでその作業にかかりっきりでした。できあがった自動テストは1400行を超えるという非道い規模になってしまいました。レビュアから修正点を指摘されて修正を入れるとテスト自体がregressionを起こすという複雑さでした。スクロールイベントが非同期で発生する上に、javascriptにはsleepに該当する機能が無いので、このようなものになっています。興味のある方は見てみてください。

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

bug 5669を含むエントリ