Bug 5669 マウスのホイールのトランザクションが、スクロール不可能な方向のイベントに対しても継続される
初回投稿日時: 2009年02月20日19時25分28秒
最終更新日時: 2009年02月20日19時27分05秒
カテゴリ: Mozilla Core バグ修正
SNS:
Tweet (list)
例えば、縦スクロールバーのみを持つサブフレーム上でマウスホイールからスクロールさせると、body等の別の横スクロールバーをホイールで横スクロールしようとしても、ホイールによるスクロールのターゲットが、最初のサブフレームにロックされているため、何もスクロールできずに混乱する、というバグでした。あまり発生するようなバグではないですが、この辺の実装をやっている私自身が何が起きてるのか分からずに混乱させられるぐらい、実際に出会うと何が起きているのか理解に苦しむバグです。
今回の修正で、ホイールを回転させてスクロールしようとしても実際にスクロールしなかった場合、ホイールスクロールのトランザクションを更新しないように変更しました。つまり、ホイールによるスクロールを失敗し続けていると、そのうちにそのトランザクションはタイムアウトして、スクロールターゲットがリセットされるようになっています。
具体的に言うと、まず縦スクロールバーしか無いサブフレームを縦にスクロールした時点で、サブフレームがスクロールターゲットとしてロックされます。その後、ユーザが他の横スクロールバーのために横スクロールのホイールイベントを生成してもすぐには横スクロールは実行されません。つまり、何もスクロールしない状態になります。ですが、そのまま横スクロールの操作を継続しているとサブフレームへのロックが外れて、新しい横スクロール可能なターゲットを探して、スクロールを実行します。
これにより、当初からの、意図しないスクロールが行われないようにする、という話との両立を図っています。
実はパッチ自体は昨年末にほぼ完成していたのですが、一連の機能を自動テストに追加しようという話が出たのでその作業にかかりっきりでした。できあがった自動テストは1400行を超えるという非道い規模になってしまいました。レビュアから修正点を指摘されて修正を入れるとテスト自体がregressionを起こすという複雑さでした。スクロールイベントが非同期で発生する上に、javascriptにはsleep
に該当する機能が無いので、このようなものになっています。興味のある方は見てみてください。