| 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 a5fadca7e4645961f020556f1a68400926daaeb3..bb9b623b747eff5072409b64535cb43d2820fa18 100644
|
| --- a/third_party/WebKit/Source/platform/scroll/ScrollAnimator.cpp
|
| +++ b/third_party/WebKit/Source/platform/scroll/ScrollAnimator.cpp
|
| @@ -34,6 +34,7 @@
|
| #include "platform/animation/CompositorAnimation.h"
|
| #include "platform/graphics/CompositorFactory.h"
|
| #include "platform/graphics/GraphicsLayer.h"
|
| +#include "platform/scroll/MainThreadScrollingReason.h"
|
| #include "platform/scroll/ScrollableArea.h"
|
| #include "public/platform/Platform.h"
|
| #include "public/platform/WebCompositorSupport.h"
|
| @@ -42,6 +43,15 @@
|
|
|
| namespace blink {
|
|
|
| +namespace {
|
| +
|
| +WebLayer* toWebLayer(GraphicsLayer* layer)
|
| +{
|
| + return layer ? layer->platformLayer() : nullptr;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| PassOwnPtrWillBeRawPtr<ScrollAnimatorBase> ScrollAnimatorBase::create(ScrollableArea* scrollableArea)
|
| {
|
| if (scrollableArea && scrollableArea->scrollAnimatorEnabled())
|
| @@ -190,10 +200,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) {
|
| @@ -209,7 +230,8 @@ void ScrollAnimator::updateCompositorAnimations()
|
| m_compositorAnimationId = 0;
|
| m_compositorAnimationGroupId = 0;
|
| if (m_runState == RunState::WaitingToCancelOnCompositor) {
|
| - return resetAnimationState();
|
| + postAnimationCleanupAndReset();
|
| + return;
|
| }
|
| }
|
|
|
| @@ -263,10 +285,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::kAnimatingScrollOnMainThread);
|
| + }
|
| +}
|
| +
|
| +void ScrollAnimator::removeMainThreadScrollingReason()
|
| +{
|
| + if (WebLayer* scrollLayer = toWebLayer(scrollableArea()->layerForScrolling())) {
|
| + scrollLayer->clearMainThreadScrollingReasons(
|
| + MainThreadScrollingReason::kAnimatingScrollOnMainThread);
|
| }
|
| }
|
|
|
| @@ -290,7 +336,8 @@ void ScrollAnimator::cancelAnimation()
|
| void ScrollAnimator::layerForCompositedScrollingDidChange(
|
| CompositorAnimationTimeline* timeline)
|
| {
|
| - reattachCompositorPlayerIfNeeded(timeline);
|
| + if (reattachCompositorPlayerIfNeeded(timeline) && m_animationCurve)
|
| + addMainThreadScrollingReason();
|
| }
|
|
|
| bool ScrollAnimator::registerAndScheduleAnimation()
|
|
|