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 98f4e1350a715ff5aeb0842ba07932d822046528..660125e66a8c8e1cd99cf785df6def1830ab3604 100644 |
| --- a/third_party/WebKit/Source/platform/scroll/ScrollAnimator.cpp |
| +++ b/third_party/WebKit/Source/platform/scroll/ScrollAnimator.cpp |
| @@ -32,6 +32,7 @@ |
| #include "platform/TraceEvent.h" |
| #include "platform/graphics/GraphicsLayer.h" |
| +#include "platform/scroll/MainThreadScrollingReason.h" |
| #include "platform/scroll/ScrollableArea.h" |
| #include "public/platform/Platform.h" |
| #include "public/platform/WebCompositorAnimation.h" |
| @@ -41,6 +42,11 @@ |
| namespace blink { |
| +WebLayer* toWebLayer(blink::GraphicsLayer* layer) |
|
jbroman
2016/02/10 20:36:37
Please make this a static function or enclose it i
ymalik
2016/02/10 21:57:58
Done. Thanks!
|
| +{ |
| + return layer ? layer->platformLayer() : nullptr; |
| +} |
| + |
| PassOwnPtrWillBeRawPtr<ScrollAnimatorBase> ScrollAnimatorBase::create(ScrollableArea* scrollableArea) |
| { |
| if (scrollableArea && scrollableArea->scrollAnimatorEnabled()) |
| @@ -189,10 +195,21 @@ void ScrollAnimator::tickAnimation(double monotonicTime) |
| notifyPositionChanged(); |
| } |
| +void ScrollAnimator::postAnimationCleanupAndReset() |
| +{ |
| + // Remove the temporary main thread scrolling reason that was added while |
| + // main thread had scheduled an animation. |
| + removeMainThreadScrollingReason(); |
| + |
| + resetAnimationState(); |
| +} |
| + |
| void ScrollAnimator::updateCompositorAnimations() |
| { |
| - if (m_runState == RunState::PostAnimationCleanup) |
| - return resetAnimationState(); |
| + if (m_runState == RunState::PostAnimationCleanup) { |
| + postAnimationCleanupAndReset(); |
| + return; |
| + } |
| if (m_compositorAnimationId && m_runState != RunState::RunningOnCompositor |
| && m_runState != RunState::RunningOnCompositorButNeedsUpdate) { |
| @@ -208,7 +225,8 @@ void ScrollAnimator::updateCompositorAnimations() |
| m_compositorAnimationId = 0; |
| m_compositorAnimationGroupId = 0; |
| if (m_runState == RunState::WaitingToCancelOnCompositor) { |
| - return resetAnimationState(); |
| + postAnimationCleanupAndReset(); |
| + return; |
| } |
| } |
| @@ -263,10 +281,34 @@ void ScrollAnimator::updateCompositorAnimations() |
| } |
| } |
| + bool runningOnMainThread = false; |
| if (!sentToCompositor) { |
| - if (registerAndScheduleAnimation()) |
| + runningOnMainThread = registerAndScheduleAnimation(); |
| + if (runningOnMainThread) |
| m_runState = RunState::RunningOnMainThread; |
| } |
| + |
| + // Main thread should deal with the scroll animations it started. |
| + if (sentToCompositor || runningOnMainThread) |
| + addMainThreadScrollingReason(); |
| + else |
| + removeMainThreadScrollingReason(); |
| + } |
| +} |
| + |
| +void ScrollAnimator::addMainThreadScrollingReason() |
| +{ |
| + if (WebLayer* scrollLayer = toWebLayer(scrollableArea()->layerForScrolling())) { |
| + scrollLayer->addMainThreadScrollingReasons( |
| + MainThreadScrollingReason::kAnimatingScollOnMainThread); |
| + } |
| +} |
| + |
| +void ScrollAnimator::removeMainThreadScrollingReason() |
| +{ |
| + if (WebLayer* scrollLayer = toWebLayer(scrollableArea()->layerForScrolling())) { |
| + scrollLayer->clearMainThreadScrollingReasons( |
| + MainThreadScrollingReason::kAnimatingScollOnMainThread); |
| } |
| } |
| @@ -290,7 +332,8 @@ void ScrollAnimator::cancelAnimation() |
| void ScrollAnimator::layerForCompositedScrollingDidChange( |
| WebCompositorAnimationTimeline* timeline) |
| { |
| - reattachCompositorPlayerIfNeeded(timeline); |
| + if (reattachCompositorPlayerIfNeeded(timeline) && m_animationCurve) |
| + addMainThreadScrollingReason(); |
| } |
| bool ScrollAnimator::registerAndScheduleAnimation() |