Bug 1316505 part.2 wheel event handler of XUL <scrollbox> should use lineOrPageDelta(X|Y) when the deltaMode is DOM_DELTA_LINE or DOM_DELTA_PAGE r?enndeakin
<scrollbox>.scrollByIndex() and <scrollbox>.scrollByPage() handle their argument as 1 or -1 (or 0 for ignoring). Therefore, specifying small value such as 0.001 causes too fast scroll with wheel devices supporting high resolution events.
Therefore, instead of specifying WheelEvent.delta(X|Y), it should use WheelEvent.lineOrPageDelta(X|Y) because lineOrPageDelta is set to 1 or -1 when it wants to handle the wheel events as low resolution events. When the value becomes non-zero depends on the platform, though. On Windows and Linux, the value is set before. On Mac, the value is set after accumulated delta values becomes 1 or -1. Anyway, when the value is non-zero, it's good timing to handle wheel events as low resolution events on each platform.
MozReview-Commit-ID: KwO8UemHkxi
--- a/toolkit/content/widgets/scrollbox.xml
+++ b/toolkit/content/widgets/scrollbox.xml
@@ -553,31 +553,40 @@
</implementation>
<handlers>
<handler event="wheel"><![CDATA[
if (this.orient == "vertical") {
if (event.deltaMode == event.DOM_DELTA_PIXEL)
this.scrollByPixels(event.deltaY);
else if (event.deltaMode == event.DOM_DELTA_PAGE)
- this.scrollByPage(event.deltaY);
+ this.scrollByPage(event.lineOrPageDeltaY);
else
- this.scrollByIndex(event.deltaY);
+ this.scrollByIndex(event.lineOrPageDeltaY);
}
// We allow vertical scrolling to scroll a horizontal scrollbox
// because many users have a vertical scroll wheel but no
// horizontal support.
// Because of this, we need to avoid scrolling chaos on trackpads
// and mouse wheels that support simultaneous scrolling in both axes.
// We do this by scrolling only when the last two scroll events were
// on the same axis as the current scroll event.
// For diagonal scroll events we only respect the dominant axis.
else {
let isVertical = Math.abs(event.deltaY) > Math.abs(event.deltaX);
- let delta = isVertical ? event.deltaY : event.deltaX;
+ let delta;
+ if (event.deltaMode == event.DOM_DELTA_PIXEL) {
+ delta = isVertical ? event.deltaY : event.deltaX;
+ } else {
+ // Use low resolution delta value for line or page scroll because
+ // neither scrollByIndex() nor scrollByPage() treats delta value as
+ // double. It treats delta just as 1, -1 or 0.
+ delta = isVertical ? event.lineOrPageDeltaY :
+ event.lineOrPageDeltaX;
+ }
let scrollByDelta = isVertical && this._isRTLScrollbox ? -delta : delta;
if (this._prevMouseScrolls.every(prev => prev == isVertical)) {
if (event.deltaMode == event.DOM_DELTA_PIXEL)
this.scrollByPixels(scrollByDelta);
else if (event.deltaMode == event.DOM_DELTA_PAGE)
this.scrollByPage(scrollByDelta);
else