mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1039979 - When cancelling animations based on user input, cancel animations on the entire handoff chain. r=botond
This commit is contained in:
parent
5def7d9126
commit
ff8d4c8ff4
@ -888,16 +888,26 @@ bool
|
||||
APZCTreeManager::FlushRepaintsForOverscrollHandoffChain()
|
||||
{
|
||||
MonitorAutoLock lock(mTreeLock); // to access mOverscrollHandoffChain
|
||||
if (mOverscrollHandoffChain.length() == 0) {
|
||||
return false;
|
||||
}
|
||||
for (uint32_t i = 0; i < mOverscrollHandoffChain.length(); i++) {
|
||||
nsRefPtr<AsyncPanZoomController> item = mOverscrollHandoffChain[i];
|
||||
if (item) {
|
||||
item->FlushRepaintForOverscrollHandoff();
|
||||
}
|
||||
}
|
||||
return true;
|
||||
return mOverscrollHandoffChain.length() > 0;
|
||||
}
|
||||
|
||||
bool
|
||||
APZCTreeManager::CancelAnimationsForOverscrollHandoffChain()
|
||||
{
|
||||
MonitorAutoLock lock(mTreeLock); // to access mOverscrollHandoffChain
|
||||
for (uint32_t i = 0; i < mOverscrollHandoffChain.length(); i++) {
|
||||
nsRefPtr<AsyncPanZoomController> item = mOverscrollHandoffChain[i];
|
||||
if (item) {
|
||||
item->CancelAnimation();
|
||||
}
|
||||
}
|
||||
return mOverscrollHandoffChain.length() > 0;
|
||||
}
|
||||
|
||||
bool
|
||||
|
@ -293,6 +293,7 @@ public:
|
||||
bool HandOffFling(AsyncPanZoomController* aApzc, ScreenPoint aVelocity);
|
||||
|
||||
bool FlushRepaintsForOverscrollHandoffChain();
|
||||
bool CancelAnimationsForOverscrollHandoffChain();
|
||||
|
||||
/**
|
||||
* Determine whether |aApzc|, or any APZC along its overscroll handoff chain,
|
||||
|
@ -813,6 +813,18 @@ AsyncPanZoomController::GetTouchStartTolerance()
|
||||
return static_cast<AxisLockMode>(gfxPrefs::APZAxisLockMode());
|
||||
}
|
||||
|
||||
void
|
||||
AsyncPanZoomController::CancelAnimationForHandoffChain()
|
||||
{
|
||||
APZCTreeManager* treeManagerLocal = mTreeManager;
|
||||
if (treeManagerLocal && treeManagerLocal->CancelAnimationsForOverscrollHandoffChain()) {
|
||||
return;
|
||||
}
|
||||
NS_WARNING("Overscroll handoff chain was empty in CancelAnimationForHandoffChain! This should not be the case.");
|
||||
// Graceful handling of error condition
|
||||
CancelAnimation();
|
||||
}
|
||||
|
||||
nsEventStatus AsyncPanZoomController::ReceiveInputEvent(const InputData& aEvent) {
|
||||
AssertOnControllerThread();
|
||||
|
||||
@ -830,7 +842,7 @@ nsEventStatus AsyncPanZoomController::ReceiveInputEvent(const InputData& aEvent)
|
||||
ScheduleContentResponseTimeout();
|
||||
// However, we still want to cancel animations here because a finger has gone down
|
||||
// and we don't want to keep moving the content under the finger.
|
||||
CancelAnimation();
|
||||
CancelAnimationForHandoffChain();
|
||||
} else {
|
||||
// Content won't prevent-default this, so we can just pretend like we scheduled
|
||||
// a timeout and it expired. Note that we will still receive a ContentReceivedTouch
|
||||
@ -967,7 +979,7 @@ nsEventStatus AsyncPanZoomController::OnTouchStart(const MultiTouchInput& aEvent
|
||||
}
|
||||
// Fall through.
|
||||
case ANIMATING_ZOOM:
|
||||
CancelAnimation();
|
||||
CancelAnimationForHandoffChain();
|
||||
// Fall through.
|
||||
case NOTHING: {
|
||||
mX.StartTouch(point.x, aEvent.mTime);
|
||||
@ -1293,7 +1305,7 @@ nsEventStatus AsyncPanZoomController::OnPanMayBegin(const PanGestureInput& aEven
|
||||
|
||||
mX.StartTouch(aEvent.mPanStartPoint.x, aEvent.mTime);
|
||||
mY.StartTouch(aEvent.mPanStartPoint.y, aEvent.mTime);
|
||||
CancelAnimation();
|
||||
CancelAnimationForHandoffChain();
|
||||
|
||||
return nsEventStatus_eConsumeNoDefault;
|
||||
}
|
||||
|
@ -536,6 +536,12 @@ protected:
|
||||
void FireAsyncScrollOnTimeout();
|
||||
|
||||
private:
|
||||
/**
|
||||
* Cancel animations all the way up the overscroll handoff chain if possible,
|
||||
* or just the local APZC if not.
|
||||
*/
|
||||
void CancelAnimationForHandoffChain();
|
||||
|
||||
/**
|
||||
* Helper to set the current state. Holds the monitor before actually setting
|
||||
* it and fires content controller events based on state changes. Always set
|
||||
|
Loading…
Reference in New Issue
Block a user