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

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

もずはっく日記(2017年10月)

2017年10月20日

Bug-org 143038 Horizontal Scrolling with Mouse wheel+ modifier key
初回投稿日時: 2017年10月26日03時09分54秒
カテゴリ: Firefox Mozilla Core Mozilla58 WheelEvent バグ修正
SNS: (list)

実に16年前に報告されたバグですが、修正しました。

安いマウスだと今でもホイールは縦スクロールしかサポートしていませんし、また、少し古いノートPCのタッチパッドでも、縦スクロールしかサポートしていませんでした。この様なデバイスを使っている時でも、Shiftキーを押すことで横スクロールして欲しいというバグでした。

かなり前から巻き込まれていたのですが、今まで修正しなかったのは、WheelEventdeltaYdeltaXに回すべきか否かという問題が大きかったのと、既にXULアドオンでこれを実現するものが存在したからです。

WheelEvent.deltaYをゼロにして、WheelEvent.deltaXWheelEvent.deltaYの元の値をセットする方が個人的にはメリットがあると思いました。というのも、Webアプリによっては、自前でwheelイベントを捕まえて、スクロール処理を行っている場合があります。この様なケースでも、ユーザは当然、Shiftキーを押していれば横スクロールを期待すると思います。

ですが、これをやってしまうと、Shiftキーを押した状態で、WheelEvent.deltaYの値を使うようなゲーム等があった場合に、そのようなイベントは絶対に発生しないことになります。これは非常によくありません。Firefoxのシェアが下がっている今、このような、他のブラウザでのみテストされた場合に動かなくなるような修正はできません。

しかし、Google Chromeは、WheelEvent.deltaXの値がゼロのまま、デフォルトアクションが単純に横スクロールになるという実装を行っていました。そこで、これに倣えば、現在のシェアを考えると、問題無く動作する(上記のようなWebアプリでは横スクロールできませんが)ということになりますし、前述のXULアドオンが57以降では使えなくなるということで、急遽、修正することにしました。

というわけで、Shiftキーを押しながら、縦スクロールの操作をホイールで行うと、Firefoxでも横スクロールするようになります。ただし、これはデフォルトアクションがそのように変わっただけで、発火されるWheelEventの内容に変化はありません。つまり、WheelEvent.deltaYが非ゼロで、WheelEvent.deltaXがゼロ、WheelEvent.shiftKeytrueのイベントのデフォルトアクションが横スクロールになります

また、これまでは、IEと動作をあわせるために、Shiftキーが押されている場合にはそのタブの履歴を辿るようになっていましたが、これは、これまでのmacOS版と同じAltキーに変更になりました。この設定は、mousewheel.default.actionmousewheel.with_alt.action等でカスタマイズ可能です。詳しくはソースコードにあるコメントを参照してください

Web開発者のみなさんに注意していただきたいのは、macOS版でShiftキーを押しながら、このようなレガシーなマウスを利用した場合の動作についてです。macOSは、Shiftキーを押しながら、マウスホイールを縦に回すと、横スクロールのイベントがOSレベルで発火します。このため、macOS版Firefoxでは、 今回実装した機能は、デフォルト設定では無効化されています。しかし、macOS自身の機能により、横スクロールになります。そして困ったことに、WheelEvent.deltaYはゼロです。つまり、macOS版とそれ以外のFirefoxでは、Shiftキーを押している時の、縦方向へのホイール操作によって発火するイベントが異なります

この注意点はまさに、私が、WheelEvent.deltaXの値を書き換えるべきではと思っていた理由のひとつではあるので、非常に気になるポイントです。

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

bug-org 143038を含むエントリ