Chromium Code Reviews| 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 ef7a5d0f7b7b061d3385d9ac59b56a34564fd148..16e573a942abfd42460037167cf97628de992d10 100644 |
| --- a/third_party/WebKit/Source/platform/scroll/ScrollAnimator.cpp |
| +++ b/third_party/WebKit/Source/platform/scroll/ScrollAnimator.cpp |
| @@ -186,8 +186,14 @@ bool ScrollAnimator::willAnimateToOffset(const FloatPoint& targetPos) |
| m_targetOffset = targetPos; |
| m_startTime = m_timeFunction(); |
| - if (registerAndScheduleAnimation()) |
| - m_runState = RunState::WaitingToSendToCompositor; |
| + if (registerAndScheduleAnimation()) { |
| + if (m_scrollableArea->shouldScrollOnMainThread()) { |
| + createAnimationCurve(); |
| + m_runState = RunState::RunningOnMainThread; |
| + } else { |
| + m_runState = RunState::WaitingToSendToCompositor; |
| + } |
| + } |
| return true; |
| } |
| @@ -287,9 +293,28 @@ bool ScrollAnimator::sendAnimationToCompositor() |
| return sentToCompositor; |
| } |
| +void ScrollAnimator::createAnimationCurve() |
| +{ |
| + DCHECK(!m_animationCurve); |
| + m_animationCurve = adoptPtr(CompositorFactory::current().createScrollOffsetAnimationCurve( |
| + compositorOffsetFromBlinkOffset(m_targetOffset), |
| + m_lastGranularity == ScrollByPixel ? |
| + CompositorScrollOffsetAnimationCurve::ScrollDurationInverseDelta : |
| + CompositorScrollOffsetAnimationCurve::ScrollDurationConstant)); |
| + m_animationCurve->setInitialValue(compositorOffsetFromBlinkOffset(currentPosition())); |
| +} |
| + |
| void ScrollAnimator::updateCompositorAnimations() |
| { |
| ScrollAnimatorCompositorCoordinator::updateCompositorAnimations(); |
| + if (m_runState == RunState::RunningOnMainThread) { |
| + // We add a temporary main thread scrolling reason so that subsequent |
| + // scrolls get handled on the main thread. This is removed when the |
| + // animation is finished in ::tickAnimation. |
| + addMainThreadScrollingReason(); |
| + return; |
| + } |
| + |
| if (m_runState == RunState::PostAnimationCleanup) { |
| postAnimationCleanupAndReset(); |
| return; |
| @@ -338,14 +363,8 @@ void ScrollAnimator::updateCompositorAnimations() |
| if (!m_compositorAnimationAttachedToLayerId) |
| reattachCompositorPlayerIfNeeded(getScrollableArea()->compositorAnimationTimeline()); |
| - if (!m_animationCurve) { |
| - m_animationCurve = adoptPtr(CompositorFactory::current().createScrollOffsetAnimationCurve( |
| - compositorOffsetFromBlinkOffset(m_targetOffset), |
| - m_lastGranularity == ScrollByPixel ? |
| - CompositorScrollOffsetAnimationCurve::ScrollDurationInverseDelta : |
| - CompositorScrollOffsetAnimationCurve::ScrollDurationConstant)); |
| - m_animationCurve->setInitialValue(compositorOffsetFromBlinkOffset(currentPosition())); |
| - } |
| + if (!m_animationCurve) |
| + createAnimationCurve(); |
| bool runningOnMainThread = false; |
| bool sentToCompositor = sendAnimationToCompositor(); |
| @@ -366,6 +385,9 @@ void ScrollAnimator::updateCompositorAnimations() |
| void ScrollAnimator::addMainThreadScrollingReason() |
| { |
| if (WebLayer* scrollLayer = toWebLayer(getScrollableArea()->layerForScrolling())) { |
| + uint32_t reasons = scrollLayer->mainThreadScrollingReasons(); |
| + if (reasons & MainThreadScrollingReason::kAnimatingScrollOnMainThread) |
| + return; |
|
ajuma
2016/06/02 14:07:27
cc::Layer::AddMainThreadScrollingReasons already e
ymalik
2016/06/02 14:13:10
We essentially call this function every time we're
ajuma
2016/06/02 14:20:27
The call to mainThreadScrollingReasons() winds up
ymalik
2016/06/02 14:30:08
Removed.
|
| scrollLayer->addMainThreadScrollingReasons( |
| MainThreadScrollingReason::kAnimatingScrollOnMainThread); |
| } |