Bug 951793 - Obey overscroll-behavior for immediate scroll handoff. r=kats
MozReview-Commit-ID: JPJOK8A1PQ
--- a/gfx/layers/apz/src/AsyncPanZoomController.cpp
+++ b/gfx/layers/apz/src/AsyncPanZoomController.cpp
@@ -2888,18 +2888,35 @@ void AsyncPanZoomController::CallDispatc
OverscrollHandoffState& aOverscrollHandoffState) {
// Make a local copy of the tree manager pointer and check if it's not
// null before calling DispatchScroll(). This is necessary because
// Destroy(), which nulls out mTreeManager, could be called concurrently.
APZCTreeManager* treeManagerLocal = GetApzcTreeManager();
if (!treeManagerLocal) {
return;
}
+
+ // Obey overscroll-behavior.
+ ParentLayerPoint endPoint = aEndPoint;
+ if (aOverscrollHandoffState.mChainIndex > 0) {
+ RecursiveMutexAutoLock lock(mRecursiveMutex);
+ if (!mX.OverscrollBehaviorAllowsHandoff()) {
+ endPoint.x = aStartPoint.x;
+ }
+ if (!mY.OverscrollBehaviorAllowsHandoff()) {
+ endPoint.y = aStartPoint.y;
+ }
+ if (aStartPoint == endPoint) {
+ // Handoff not allowed in either direction - don't even bother.
+ return;
+ }
+ }
+
treeManagerLocal->DispatchScroll(this,
- aStartPoint, aEndPoint,
+ aStartPoint, endPoint,
aOverscrollHandoffState);
}
void AsyncPanZoomController::TrackTouch(const MultiTouchInput& aEvent) {
ParentLayerPoint prevTouchPoint(mX.GetPos(), mY.GetPos());
ParentLayerPoint touchPoint = GetFirstTouchPoint(aEvent);
ScreenPoint panDistance = ToScreenCoordinates(