Bug 1324581 - check event handled by apz in nsSliderFrame::StartAPZDrag r=botond draft
authorKevin Wern <kevin.m.wern@gmail.com>
Fri, 23 Dec 2016 03:49:38 -0500
changeset 453663 c76e9fed3dcab806b17e85740c94339ac0e7ccca
parent 450573 d7d724c6e6b5f5cbd3b33917d689c39e4ab83204
child 453664 a98cdde39a78b975a01e14c45899ca7141e8087e
push id39724
push userbmo:kevin.m.wern@gmail.com
push dateSat, 24 Dec 2016 07:31:37 +0000
reviewersbotond
bugs1324581
milestone53.0a1
Bug 1324581 - check event handled by apz in nsSliderFrame::StartAPZDrag r=botond test_scroll_snapping_scrollbars.html is failing when apz.drag.enabled is true because synthesizeMouse does not route events through APZ, meaning that the drag is never handled by APZ or Gecko. Resolve this by adding a check that mHandledByApz flag is true for WidgetGUIEvent, and handle in Gecko if that is not the case. MozReview-Commit-ID: IrxVLxqs64V
layout/xul/nsSliderFrame.cpp
layout/xul/nsSliderFrame.h
--- a/layout/xul/nsSliderFrame.cpp
+++ b/layout/xul/nsSliderFrame.cpp
@@ -925,18 +925,22 @@ nsSliderMediator::HandleEvent(nsIDOMEven
   // Only process the event if the thumb is not being dragged.
   if (mSlider && !mSlider->isDraggingThumb())
     return mSlider->StartDrag(aEvent);
 
   return NS_OK;
 }
 
 bool
-nsSliderFrame::StartAPZDrag()
+nsSliderFrame::StartAPZDrag(WidgetGUIEvent* aEvent)
 {
+  if (!aEvent->mFlags.mHandledByAPZ) {
+    return false;
+  }
+
   if (!gfxPlatform::GetPlatform()->SupportsApzDragInput()) {
     return false;
   }
 
   nsContainerFrame* scrollFrame = GetScrollbar()->GetParent();
   if (!scrollFrame) {
     return false;
   }
@@ -1051,17 +1055,17 @@ nsSliderFrame::StartDrag(nsIDOMEvent* aE
 
   if (isHorizontal)
     mThumbStart = thumbFrame->GetPosition().x;
   else
     mThumbStart = thumbFrame->GetPosition().y;
 
   mDragStart = pos - mThumbStart;
 
-  mScrollingWithAPZ = StartAPZDrag();
+  mScrollingWithAPZ = StartAPZDrag(event);
 
 #ifdef DEBUG_SLIDER
   printf("Pressed mDragStart=%d\n",mDragStart);
 #endif
 
   if (!mScrollingWithAPZ && !mSuppressionActive) {
     MOZ_ASSERT(PresContext()->PresShell());
     APZCCallbackHelper::SuppressDisplayport(true, PresContext()->PresShell());
--- a/layout/xul/nsSliderFrame.h
+++ b/layout/xul/nsSliderFrame.h
@@ -95,17 +95,17 @@ public:
                             nsIFrame*       aPrevFrame,
                             nsFrameList&    aFrameList) override;
   virtual void RemoveFrame(ChildListID     aListID,
                            nsIFrame*       aOldFrame) override;
 
   nsresult StartDrag(nsIDOMEvent* aEvent);
   nsresult StopDrag();
 
-  bool StartAPZDrag();
+  bool StartAPZDrag(WidgetGUIEvent* aEvent);
 
   static int32_t GetCurrentPosition(nsIContent* content);
   static int32_t GetMinPosition(nsIContent* content);
   static int32_t GetMaxPosition(nsIContent* content);
   static int32_t GetIncrement(nsIContent* content);
   static int32_t GetPageIncrement(nsIContent* content);
   static int32_t GetIntegerAttribute(nsIContent* content, nsIAtom* atom, int32_t defaultValue);
   void EnsureOrient();