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); |
} |