Index: third_party/WebKit/Source/platform/scroll/ScrollAnimator.cpp |
diff --git a/third_party/WebKit/Source/platform/scroll/ScrollAnimator.cpp b/third_party/WebKit/Source/platform/scroll/ScrollAnimator.cpp |
index 804f154d32645c10c36d1cb1230e8dd7e27c3ae3..ef7a5d0f7b7b061d3385d9ac59b56a34564fd148 100644 |
--- a/third_party/WebKit/Source/platform/scroll/ScrollAnimator.cpp |
+++ b/third_party/WebKit/Source/platform/scroll/ScrollAnimator.cpp |
@@ -119,7 +119,6 @@ ScrollResult ScrollAnimator::userScroll( |
resetAnimationState(); |
FloatSize consumedDelta = computeDeltaToConsume(delta); |
- |
FloatPoint targetPos = desiredTargetPosition(); |
targetPos.move(consumedDelta); |
@@ -149,7 +148,8 @@ bool ScrollAnimator::willAnimateToOffset(const FloatPoint& targetPos) |
if (m_runState == RunState::PostAnimationCleanup) |
resetAnimationState(); |
- if (m_runState == RunState::WaitingToCancelOnCompositor) { |
+ if (m_runState == RunState::WaitingToCancelOnCompositor |
+ || m_runState == RunState::WaitingToCancelOnCompositorButNewScroll) { |
ASSERT(m_animationCurve); |
m_targetOffset = targetPos; |
if (registerAndScheduleAnimation()) |
@@ -192,6 +192,28 @@ bool ScrollAnimator::willAnimateToOffset(const FloatPoint& targetPos) |
return true; |
} |
+void ScrollAnimator::adjustAnimationAndSetScrollPosition( |
+ IntSize adjustment, ScrollType scrollType) |
+{ |
+ DoublePoint adjustedPos = m_scrollableArea->clampScrollPosition( |
+ m_scrollableArea->scrollPositionDouble() + adjustment); |
+ IntSize actualAdjustment = roundedIntPoint(adjustedPos) - |
+ roundedIntPoint(m_scrollableArea->scrollPositionDouble()); |
+ |
+ m_scrollableArea->setScrollPosition(adjustedPos, scrollType); |
+ |
+ if (m_runState == RunState::Idle) { |
+ adjustImplOnlyScrollOffsetAnimation(actualAdjustment); |
+ } else if (hasRunningAnimation()) { |
+ m_targetOffset += toFloatSize(actualAdjustment); |
+ if (m_animationCurve) { |
+ m_animationCurve->applyAdjustment(actualAdjustment); |
+ if (m_runState != RunState::RunningOnMainThread && registerAndScheduleAnimation()) |
+ m_runState = RunState::RunningOnCompositorButNeedsAdjustment; |
+ } |
+ } |
+} |
+ |
void ScrollAnimator::scrollToOffsetWithoutAnimation(const FloatPoint& offset) |
{ |
m_currentPos = offset; |
@@ -273,46 +295,42 @@ void ScrollAnimator::updateCompositorAnimations() |
return; |
} |
- if (m_compositorAnimationId && m_runState != RunState::RunningOnCompositor |
- && m_runState != RunState::RunningOnCompositorButNeedsUpdate |
- && m_runState != RunState::WaitingToCancelOnCompositorButNewScroll) { |
- // If the current run state is WaitingToSendToCompositor but we have a |
- // non-zero compositor animation id, there's a currently running |
- // compositor animation that needs to be removed here before the new |
- // animation is added below. |
- ASSERT(m_runState == RunState::WaitingToCancelOnCompositor |
- || m_runState == RunState::WaitingToSendToCompositor |
- || m_runState == RunState::RunningOnCompositorButNeedsTakeover); |
- |
- if (m_runState == RunState::RunningOnCompositorButNeedsTakeover) { |
- // The animation is already aborted when the call to |
- // ::takeOverCompositorAnimation is made. |
- m_runState = RunState::WaitingToSendToCompositor; |
- } else { |
- abortAnimation(); |
- } |
+ if (m_runState == RunState::WaitingToCancelOnCompositor) { |
+ DCHECK(m_compositorAnimationId); |
+ abortAnimation(); |
+ postAnimationCleanupAndReset(); |
+ return; |
+ } |
- m_compositorAnimationId = 0; |
- m_compositorAnimationGroupId = 0; |
- if (m_runState == RunState::WaitingToCancelOnCompositor) { |
- postAnimationCleanupAndReset(); |
- return; |
- } |
+ if (m_runState == RunState::RunningOnCompositorButNeedsTakeover) { |
+ // The call to ::takeOverCompositorAnimation aborted the animation and |
+ // put us in this state. The assumption is that takeOver is called |
+ // because a main thread scrolling reason is added, and simply trying |
+ // to ::sendAnimationToCompositor will fail and we will run on the main |
+ // thread. |
+ resetAnimationIds(); |
+ m_runState = RunState::WaitingToSendToCompositor; |
} |
if (m_runState == RunState::RunningOnCompositorButNeedsUpdate |
- || m_runState == RunState::WaitingToCancelOnCompositorButNewScroll) { |
+ || m_runState == RunState::WaitingToCancelOnCompositorButNewScroll |
+ || m_runState == RunState::RunningOnCompositorButNeedsAdjustment) { |
// Abort the running animation before a new one with an updated |
// target is added. |
abortAnimation(); |
+ resetAnimationIds(); |
- m_compositorAnimationId = 0; |
- m_compositorAnimationGroupId = 0; |
+ if (m_runState != RunState::RunningOnCompositorButNeedsAdjustment) { |
+ // When in RunningOnCompositorButNeedsAdjustment, the call to |
+ // ::adjustScrollOffsetAnimation should have made the necessary |
+ // adjustment to the curve. |
+ m_animationCurve->updateTarget(m_timeFunction() - m_startTime, |
+ compositorOffsetFromBlinkOffset(m_targetOffset)); |
+ } |
- m_animationCurve->updateTarget(m_timeFunction() - m_startTime, |
- compositorOffsetFromBlinkOffset(m_targetOffset)); |
if (m_runState == RunState::WaitingToCancelOnCompositorButNewScroll) |
m_animationCurve->setInitialValue(compositorOffsetFromBlinkOffset(currentPosition())); |
+ |
m_runState = RunState::WaitingToSendToCompositor; |
} |