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 draft
authorMasayuki Nakano <masayuki@d-toybox.com>
Fri, 11 Nov 2016 22:50:12 +0900
changeset 437737 1cec999b3faeaa6ea08db936a579926ac9e93018
parent 437736 7ee87f0f6e82e598d9d124e31ddfa8537233af3e
child 536725 5f9421f50e146723bcab487b752f774195565364
push id35511
push usermasayuki@d-toybox.com
push dateFri, 11 Nov 2016 16:02:02 +0000
reviewersenndeakin
bugs1316505
milestone52.0a1
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
toolkit/content/widgets/scrollbox.xml
--- 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