Bug 1337990 - Support cross-apz axis lock with touch-action enabled, and add a gtest for it. r=kats
MozReview-Commit-ID: AwPgwyYw2fV
--- a/gfx/layers/apz/src/AsyncPanZoomController.cpp
+++ b/gfx/layers/apz/src/AsyncPanZoomController.cpp
@@ -2205,28 +2205,34 @@ void AsyncPanZoomController::SetVelocity
mX.SetVelocity(aVelocityVector.x);
mY.SetVelocity(aVelocityVector.y);
}
void AsyncPanZoomController::HandlePanningWithTouchAction(double aAngle) {
// Handling of cross sliding will need to be added in this method after touch-action released
// enabled by default.
MOZ_ASSERT(GetCurrentTouchBlock());
+ RefPtr<const OverscrollHandoffChain> overscrollHandoffChain =
+ GetCurrentInputBlock()->GetOverscrollHandoffChain();
+ bool canScrollHorizontal = !mX.IsAxisLocked() &&
+ overscrollHandoffChain->CanScrollInDirection(this, ScrollDirection::HORIZONTAL);
+ bool canScrollVertical = !mY.IsAxisLocked() &&
+ overscrollHandoffChain->CanScrollInDirection(this, ScrollDirection::VERTICAL);
if (GetCurrentTouchBlock()->TouchActionAllowsPanningXY()) {
- if (mX.CanScrollNow() && mY.CanScrollNow()) {
+ if (canScrollHorizontal && canScrollVertical) {
if (IsCloseToHorizontal(aAngle, gfxPrefs::APZAxisLockAngle())) {
mY.SetAxisLocked(true);
SetState(PANNING_LOCKED_X);
} else if (IsCloseToVertical(aAngle, gfxPrefs::APZAxisLockAngle())) {
mX.SetAxisLocked(true);
SetState(PANNING_LOCKED_Y);
} else {
SetState(PANNING);
}
- } else if (mX.CanScrollNow() || mY.CanScrollNow()) {
+ } else if (canScrollHorizontal || canScrollVertical) {
SetState(PANNING);
} else {
SetState(NOTHING);
}
} else if (GetCurrentTouchBlock()->TouchActionAllowsPanningX()) {
// Using bigger angle for panning to keep behavior consistent
// with IE.
if (IsCloseToHorizontal(aAngle, gfxPrefs::APZAllowedDirectPanAngle())) {
--- a/gfx/layers/apz/test/gtest/TestScrollHandoff.cpp
+++ b/gfx/layers/apz/test/gtest/TestScrollHandoff.cpp
@@ -531,8 +531,13 @@ TEST_F(APZScrollHandoffTester, Immediate
// Verify that the parent scrolled from the fling.
EXPECT_GT(parentApzc->GetFrameMetrics().GetScrollOffset().y, 10);
}
TEST_F(APZScrollHandoffTester, CrossApzcAxisLock_NoTouchAction) {
SCOPED_GFX_PREF(TouchActionEnabled, bool, false);
TestCrossApzcAxisLock();
}
+
+TEST_F(APZScrollHandoffTester, CrossApzcAxisLock_TouchAction) {
+ SCOPED_GFX_PREF(TouchActionEnabled, bool, true);
+ TestCrossApzcAxisLock();
+}