зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1240202 - Avoid getting stuck in overscroll when the screen is tapped during an overscroll animation. r=kats
--HG-- extra : source : 43acc75c7734bf63264a07019770c780aeb7bdb9
This commit is contained in:
Родитель
0f5f481663
Коммит
2607d8f81f
|
@ -1339,7 +1339,13 @@ nsEventStatus AsyncPanZoomController::OnTouchEnd(const MultiTouchInput& aEvent)
|
|||
if (CurrentTouchBlock()->GetActiveTouchCount() == 0) {
|
||||
// It's possible we may be overscrolled if the user tapped during a
|
||||
// previous overscroll pan. Make sure to snap back in this situation.
|
||||
if (!SnapBackIfOverscrolled()) {
|
||||
// An ancestor APZC could be overscrolled instead of this APZC, so
|
||||
// walk the handoff chain as well.
|
||||
CurrentTouchBlock()->GetOverscrollHandoffChain()->SnapBackOverscrolledApzc(this);
|
||||
// SnapBackOverscrolledApzc() will put any APZC it causes to snap back
|
||||
// into the OVERSCROLL_ANIMATION state. If that's not us, since we're
|
||||
// done TOUCHING enter the NOTHING state.
|
||||
if (mState != OVERSCROLL_ANIMATION) {
|
||||
SetState(NOTHING);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -273,6 +273,39 @@ TEST_F(APZScrollHandoffTester, StuckInOverscroll_Bug1231228) {
|
|||
EXPECT_FALSE(rootApzc->IsOverscrolled());
|
||||
}
|
||||
|
||||
TEST_F(APZScrollHandoffTester, StuckInOverscroll_Bug1240202a) {
|
||||
// Enable overscrolling.
|
||||
SCOPED_GFX_PREF(APZOverscrollEnabled, bool, true);
|
||||
|
||||
CreateScrollHandoffLayerTree1();
|
||||
|
||||
TestAsyncPanZoomController* child = ApzcOf(layers[1]);
|
||||
|
||||
// Pan, causing the parent APZC to overscroll.
|
||||
Pan(manager, mcc, 60, 90, true /* keep finger down */);
|
||||
EXPECT_FALSE(child->IsOverscrolled());
|
||||
EXPECT_TRUE(rootApzc->IsOverscrolled());
|
||||
|
||||
// Lift the finger, triggering an overscroll animation
|
||||
// (but don't allow it to run).
|
||||
TouchUp(manager, ScreenIntPoint(10, 90), mcc->Time());
|
||||
|
||||
// Put the finger down again, interrupting the animation
|
||||
// and entering the TOUCHING state.
|
||||
TouchDown(manager, ScreenIntPoint(10, 90), mcc->Time());
|
||||
|
||||
// Lift the finger once again.
|
||||
TouchUp(manager, ScreenIntPoint(10, 90), mcc->Time());
|
||||
|
||||
// Allow any animations to run their course.
|
||||
child->AdvanceAnimationsUntilEnd();
|
||||
rootApzc->AdvanceAnimationsUntilEnd();
|
||||
|
||||
// Make sure nothing is overscrolled.
|
||||
EXPECT_FALSE(child->IsOverscrolled());
|
||||
EXPECT_FALSE(rootApzc->IsOverscrolled());
|
||||
}
|
||||
|
||||
// Test that flinging in a direction where one component of the fling goes into
|
||||
// overscroll but the other doesn't, results in just the one component being
|
||||
// handed off to the parent, while the original APZC continues flinging in the
|
||||
|
|
Загрузка…
Ссылка в новой задаче