Bug 951793 - Obey overscroll-behavior for swipe navigation. r=mstange

MozReview-Commit-ID: i2BuiAfG71

--HG--
extra : rebase_source : 9fd9b60db5c6e5f01033f6dca934024ce488cedb
This commit is contained in:
Botond Ballo 2017-10-23 18:27:24 -04:00
parent c956e489bc
commit 3ddd46e5f1
7 changed files with 25 additions and 2 deletions

View File

@ -1198,6 +1198,9 @@ APZCTreeManager::ReceiveInputEvent(InputData& aEvent,
apzc->GetGuid(aOutTargetGuid);
panInput.mPanStartPoint = *untransformedStartPoint;
panInput.mPanDisplacement = *untransformedDisplacement;
panInput.mOverscrollBehaviorAllowsSwipe =
apzc->OverscrollBehaviorAllowsSwipe();
}
break;
} case PINCHGESTURE_INPUT: { // note: no one currently sends these

View File

@ -2880,6 +2880,12 @@ ParentLayerPoint AsyncPanZoomController::AdjustHandoffVelocityForOverscrollBehav
return residualVelocity;
}
bool AsyncPanZoomController::OverscrollBehaviorAllowsSwipe() const
{
RecursiveMutexAutoLock lock(mRecursiveMutex);
// Swipe navigation is a "non-local" overscroll behavior like handoff.
return mX.OverscrollBehaviorAllowsHandoff();
}
void AsyncPanZoomController::HandleFlingOverscroll(const ParentLayerPoint& aVelocity,
const RefPtr<const OverscrollHandoffChain>& aOverscrollHandoffChain,

View File

@ -442,6 +442,8 @@ public:
void NotifyMozMouseScrollEvent(const nsString& aString) const;
bool OverscrollBehaviorAllowsSwipe() const;
protected:
// Protected destructor, to discourage deletion outside of Release():
virtual ~AsyncPanZoomController();

View File

@ -490,6 +490,7 @@ PanGestureInput::PanGestureInput()
, mHandledByAPZ(false)
, mFollowedByMomentum(false)
, mRequiresContentResponseIfCannotScrollHorizontallyInStartDirection(false)
, mOverscrollBehaviorAllowsSwipe(false)
{
}
@ -509,6 +510,7 @@ PanGestureInput::PanGestureInput(PanGestureType aType, uint32_t aTime,
, mHandledByAPZ(false)
, mFollowedByMomentum(false)
, mRequiresContentResponseIfCannotScrollHorizontallyInStartDirection(false)
, mOverscrollBehaviorAllowsSwipe(false)
{
}

View File

@ -385,6 +385,14 @@ public:
// confirmed target.
// This is used by events that can result in a swipe instead of a scroll.
bool mRequiresContentResponseIfCannotScrollHorizontallyInStartDirection;
// This is used by APZ to communicate to the macOS widget code whether
// the overscroll-behavior of the scroll frame handling this swipe allows
// non-local overscroll behaviors in the horizontal direction (such as
// swipe navigation).
bool mOverscrollBehaviorAllowsSwipe;
// XXX: If adding any more bools, switch to using bitfields instead.
};
/**

View File

@ -2923,7 +2923,7 @@ nsChildView::DispatchAPZWheelInputEvent(InputData& aEvent, bool aCanTriggerSwipe
PanGestureInput& panInput = aEvent.AsPanGestureInput();
event = panInput.ToWidgetWheelEvent(this);
if (aCanTriggerSwipe) {
if (aCanTriggerSwipe && panInput.mOverscrollBehaviorAllowsSwipe) {
SwipeInfo swipeInfo = SendMayStartSwipe(panInput);
event.mCanTriggerSwipe = swipeInfo.wantsSwipe;
if (swipeInfo.wantsSwipe) {

View File

@ -1225,6 +1225,7 @@ struct ParamTraits<mozilla::PanGestureInput>
WriteParam(aMsg, aParam.mHandledByAPZ);
WriteParam(aMsg, aParam.mFollowedByMomentum);
WriteParam(aMsg, aParam.mRequiresContentResponseIfCannotScrollHorizontallyInStartDirection);
WriteParam(aMsg, aParam.mOverscrollBehaviorAllowsSwipe);
}
static bool Read(const Message* aMsg, PickleIterator* aIter, paramType* aResult)
@ -1241,7 +1242,8 @@ struct ParamTraits<mozilla::PanGestureInput>
ReadParam(aMsg, aIter, &aResult->mUserDeltaMultiplierY) &&
ReadParam(aMsg, aIter, &aResult->mHandledByAPZ) &&
ReadParam(aMsg, aIter, &aResult->mFollowedByMomentum) &&
ReadParam(aMsg, aIter, &aResult->mRequiresContentResponseIfCannotScrollHorizontallyInStartDirection);
ReadParam(aMsg, aIter, &aResult->mRequiresContentResponseIfCannotScrollHorizontallyInStartDirection) &&
ReadParam(aMsg, aIter, &aResult->mOverscrollBehaviorAllowsSwipe);
}
};