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

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

もずはっく日記(2016年1月)

2016年1月30日

Bug-org 1153156 [e10s] Mousewheel scroll distance does not match non-e10s (with apz disabled)
初回投稿日時: 2016年01月30日23時04分24秒
最終更新日時: 2016年10月15日19時48分33秒
カテゴリ: e10s Mozilla Core Mozilla46 WheelEvent Windows バグ修正
SNS: (list)

Windowsでは、マウスホイールのスクロール量のシステム設定が変更されていない場合、ルートのドキュメントのページ全体のスクロール時にのみ、スクロール量を倍にするシステムスクロールオーバーライドという機能があります。e10sモードが無効の時と、e10sモードが有効でも、APZが有効な場合には問題無く動いてるのですが、e10sモードが有効でAPZが無効の場合、スクロール量が本来の速度に戻ってしまい、遅く感じるというバグです。

e10sモードが有効で、APZが無効な場合のみ、オーバライドは子プロセスからnsIWidget::OverrideSystemMouseScrollSpeed()が呼び出されているのがその違いなのですが、親プロセスではnsWindow::OverrideSystemMouseScrollSpeed()が呼び出されるのに対し、子プロセスではPuppetWidget::OverrideSystemMouseScrollSpeed()が実装されていないのでnsBaseWidget::OverrideSystemMouseScrollSpeed()が呼び出され、Windows固有のこの機能がうまく動いていなかったわけです。

このメソッドはwheelイベントが発生する度に呼び出されますので、単純にPuppetWidget::OverrideSystemMouseScrollSpeed()からプロセス間通信を行って、親プロセスのnsWindow::OverrideSystemMouseScrollSpeed()を呼び出していては負荷が大きくなりすぎます。

そこで、今回の修正では、WidgetWheelEventに設定の確認とオーバーライド済みのデルタ値を返すメソッドを実装し、親プロセスでなくては問い合わせることができない、システム設定がデフォルト設定かどうかをWidgetWheelEventの発火時に先に確認し、デフォルト設定でなければWidgetWheelEvent::mAllowToOverrideSystemScrollSpeedfalseに、デフォルト設定ならtrueにするようにし、全ての判断材料をWidgetWheelEventに持たせておくようにしました。

APZはこのこのコードをコピペで重複して持っているので、APZ対応に関しては独立したパッチにまとめていますので、参考にしてみてください。

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

bug-org 1153156を含むエントリ