Bug 1316505 part.1 Expose mozilla::WheelEvent::mLineOrPageDelta(X|Y) to chrome script via DOM WheelEvent r?smaug draft
authorMasayuki Nakano <masayuki@d-toybox.com>
Fri, 11 Nov 2016 17:07:05 +0900
changeset 437736 7ee87f0f6e82e598d9d124e31ddfa8537233af3e
parent 437631 1af7620d3352ad62ea424942e94b38fc613e46cc
child 437737 1cec999b3faeaa6ea08db936a579926ac9e93018
push id35510
push usermasayuki@d-toybox.com
push dateFri, 11 Nov 2016 16:01:05 +0000
reviewerssmaug
bugs1316505
milestone52.0a1
Bug 1316505 part.1 Expose mozilla::WheelEvent::mLineOrPageDelta(X|Y) to chrome script via DOM WheelEvent r?smaug It's useful for chrome script if chrome's wheel event handler just wants low resolution wheel events. MozReview-Commit-ID: CTTfahFdow1
dom/events/WheelEvent.cpp
dom/events/WheelEvent.h
dom/webidl/WheelEvent.webidl
--- a/dom/events/WheelEvent.cpp
+++ b/dom/events/WheelEvent.cpp
@@ -104,16 +104,28 @@ WheelEvent::DeltaZ()
 }
 
 uint32_t
 WheelEvent::DeltaMode()
 {
   return mEvent->AsWheelEvent()->mDeltaMode;
 }
 
+int32_t
+WheelEvent::LineOrPageDeltaX()
+{
+  return mEvent->AsWheelEvent()->mLineOrPageDeltaX;
+}
+
+int32_t
+WheelEvent::LineOrPageDeltaY()
+{
+  return mEvent->AsWheelEvent()->mLineOrPageDeltaY;
+}
+
 already_AddRefed<WheelEvent>
 WheelEvent::Constructor(const GlobalObject& aGlobal,
                         const nsAString& aType,
                         const WheelEventInit& aParam,
                         ErrorResult& aRv)
 {
   nsCOMPtr<EventTarget> t = do_QueryInterface(aGlobal.GetAsSupports());
   RefPtr<WheelEvent> e = new WheelEvent(t, nullptr, nullptr);
--- a/dom/events/WheelEvent.h
+++ b/dom/events/WheelEvent.h
@@ -40,16 +40,20 @@ public:
   // NOTE: DeltaX(), DeltaY() and DeltaZ() return CSS pixels when deltaMode is
   //       DOM_DELTA_PIXEL. (The internal event's delta values are device pixels
   //       if it's dispatched by widget)
   double DeltaX();
   double DeltaY();
   double DeltaZ();
   uint32_t DeltaMode();
 
+  // Chrome only.
+  int32_t LineOrPageDeltaX();
+  int32_t LineOrPageDeltaY();
+
   void
   InitWheelEvent(const nsAString& aType, bool aCanBubble, bool aCancelable,
                  nsGlobalWindow* aView, int32_t aDetail,
                  int32_t aScreenX, int32_t aScreenY,
                  int32_t aClientX, int32_t aClientY, uint16_t aButton,
                  EventTarget* aRelatedTarget, const nsAString& aModifiersList,
                  double aDeltaX, double aDeltaY, double aDeltaZ,
                  uint32_t aDeltaMode);
--- a/dom/webidl/WheelEvent.webidl
+++ b/dom/webidl/WheelEvent.webidl
@@ -17,16 +17,30 @@ interface WheelEvent : MouseEvent
   const unsigned long DOM_DELTA_LINE  = 0x01;
   const unsigned long DOM_DELTA_PAGE  = 0x02;
 
   readonly attribute double        deltaX;
   readonly attribute double        deltaY;
   readonly attribute double        deltaZ;
   readonly attribute unsigned long deltaMode;
 
+  // lineOrPageDelta attributes are useful when wheel event handlers want to
+  // handles wheel events as low resoultuion events.  If the wheel device
+  // supports high resolution delta value, delta values may be less than 1.
+  // In such case, wheel event handler may need to wait to do something
+  // until accumulated delta value becomes 1 or -1.  These attributes
+  // are useful for such case.  For example, if each deltaY value is 0.4,
+  // lineOrPageDeltaY becomes 1 only when the first event and 4th event or
+  // the 3rd event (because accumulated deltaY value is 1.2) and the 5th event
+  // (because accumulated deltaY is 2.0).  It depends on platforms if
+  // lineOrPageDelta is set to 1 at first event or later event.  But the
+  // value is non-zero means that it's good timing to handle it on the
+  // platform.
+  [ChromeOnly] readonly attribute long lineOrPageDeltaX;
+  [ChromeOnly] readonly attribute long lineOrPageDeltaY;
 };
 
 dictionary WheelEventInit : MouseEventInit
 {
   double deltaX = 0;
   double deltaY = 0;
   double deltaZ = 0;
   unsigned long deltaMode = 0;