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() |