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..90a94f3a77dfabc7cd5ba8d8d23acabb5da17ebf 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" |
@@ -39,6 +40,15 @@ |
#include "wtf/CurrentTime.h" |
#include "wtf/PassRefPtr.h" |
+namespace { |
+ |
+blink::WebLayer* toWebLayer(blink::GraphicsLayer* layer) |
jbroman
2016/02/10 22:42:55
nit: you can put the anonymous namespace inside th
ymalik
2016/02/12 17:55:52
Done.
|
+{ |
+ return layer ? layer->platformLayer() : nullptr; |
+} |
+ |
+} // namespace |
+ |
namespace blink { |
PassOwnPtrWillBeRawPtr<ScrollAnimatorBase> ScrollAnimatorBase::create(ScrollableArea* scrollableArea) |
@@ -189,10 +199,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 +229,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( |
WebCompositorAnimationTimeline* timeline) |
{ |
- reattachCompositorPlayerIfNeeded(timeline); |
+ if (reattachCompositorPlayerIfNeeded(timeline) && m_animationCurve) |
+ addMainThreadScrollingReason(); |
} |
bool ScrollAnimator::registerAndScheduleAnimation() |