Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(22)

Side by Side Diff: third_party/WebKit/Source/platform/scroll/ScrollAnimator.cpp

Issue 1551933002: Fix retargeting of composited smooth scrolls from the main thread. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: address review comment Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2011, Google Inc. All rights reserved. 2 * Copyright (c) 2011, Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 43
44 PassOwnPtrWillBeRawPtr<ScrollAnimatorBase> ScrollAnimatorBase::create(Scrollable Area* scrollableArea) 44 PassOwnPtrWillBeRawPtr<ScrollAnimatorBase> ScrollAnimatorBase::create(Scrollable Area* scrollableArea)
45 { 45 {
46 if (scrollableArea && scrollableArea->scrollAnimatorEnabled()) 46 if (scrollableArea && scrollableArea->scrollAnimatorEnabled())
47 return adoptPtrWillBeNoop(new ScrollAnimator(scrollableArea)); 47 return adoptPtrWillBeNoop(new ScrollAnimator(scrollableArea));
48 return adoptPtrWillBeNoop(new ScrollAnimatorBase(scrollableArea)); 48 return adoptPtrWillBeNoop(new ScrollAnimatorBase(scrollableArea));
49 } 49 }
50 50
51 ScrollAnimator::ScrollAnimator(ScrollableArea* scrollableArea, WTF::TimeFunction timeFunction) 51 ScrollAnimator::ScrollAnimator(ScrollableArea* scrollableArea, WTF::TimeFunction timeFunction)
52 : ScrollAnimatorBase(scrollableArea) 52 : ScrollAnimatorBase(scrollableArea)
53 , m_lastTickTime(0.0)
54 , m_timeFunction(timeFunction) 53 , m_timeFunction(timeFunction)
55 { 54 {
56 } 55 }
57 56
58 ScrollAnimator::~ScrollAnimator() 57 ScrollAnimator::~ScrollAnimator()
59 { 58 {
60 } 59 }
61 60
62 FloatPoint ScrollAnimator::desiredTargetPosition() const 61 FloatPoint ScrollAnimator::desiredTargetPosition() const
63 { 62 {
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
107 return ScrollResultOneDimensional(/* didScroll */ true, /* unusedScr ollDelta */ 0); 106 return ScrollResultOneDimensional(/* didScroll */ true, /* unusedScr ollDelta */ 0);
108 } 107 }
109 108
110 m_targetOffset = targetPos; 109 m_targetOffset = targetPos;
111 ASSERT(m_runState == RunState::RunningOnMainThread 110 ASSERT(m_runState == RunState::RunningOnMainThread
112 || m_runState == RunState::RunningOnCompositor 111 || m_runState == RunState::RunningOnCompositor
113 || m_runState == RunState::RunningOnCompositorButNeedsUpdate); 112 || m_runState == RunState::RunningOnCompositorButNeedsUpdate);
114 113
115 if (m_runState == RunState::RunningOnCompositor 114 if (m_runState == RunState::RunningOnCompositor
116 || m_runState == RunState::RunningOnCompositorButNeedsUpdate) { 115 || m_runState == RunState::RunningOnCompositorButNeedsUpdate) {
117 m_runState = RunState::RunningOnCompositorButNeedsUpdate; 116 if (registerAndScheduleAnimation())
117 m_runState = RunState::RunningOnCompositorButNeedsUpdate;
118 return ScrollResultOneDimensional(/* didScroll */ true, /* unusedScr ollDelta */ 0); 118 return ScrollResultOneDimensional(/* didScroll */ true, /* unusedScr ollDelta */ 0);
119 } 119 }
120 120
121 // Running on the main thread, simply update the target offset instead 121 // Running on the main thread, simply update the target offset instead
122 // of sending to the compositor. 122 // of sending to the compositor.
123 m_animationCurve->updateTarget(m_timeFunction() - m_startTime, targetPos ); 123 m_animationCurve->updateTarget(m_timeFunction() - m_startTime, targetPos );
124 return ScrollResultOneDimensional(/* didScroll */ true, /* unusedScrollD elta */ 0); 124 return ScrollResultOneDimensional(/* didScroll */ true, /* unusedScrollD elta */ 0);
125 } 125 }
126 126
127 if ((targetPos - currentPosition()).isZero()) { 127 if ((targetPos - currentPosition()).isZero()) {
128 // Report unused delta only if there is no animation and we are not 128 // Report unused delta only if there is no animation and we are not
129 // starting one. This ensures we latch for the duration of the 129 // starting one. This ensures we latch for the duration of the
130 // animation rather than animating multiple scrollers at the same time. 130 // animation rather than animating multiple scrollers at the same time.
131 return ScrollResultOneDimensional(/* didScroll */ false, delta); 131 return ScrollResultOneDimensional(/* didScroll */ false, delta);
132 } 132 }
133 133
134 m_targetOffset = targetPos; 134 m_targetOffset = targetPos;
135 m_startTime = m_timeFunction(); 135 m_startTime = m_timeFunction();
136 136
137 scrollableArea()->registerForAnimation(); 137 if (registerAndScheduleAnimation())
138 if (!m_scrollableArea->scheduleAnimation()) { 138 m_runState = RunState::WaitingToSendToCompositor;
139 scrollToOffsetWithoutAnimation(targetPos);
140 resetAnimationState();
141 return ScrollResultOneDimensional(/* didScroll */ true, /* unusedScrollD elta */ 0);
142 }
143 139
144 m_runState = RunState::WaitingToSendToCompositor;
145 return ScrollResultOneDimensional(/* didScroll */ true, /* unusedScrollDelta */ 0); 140 return ScrollResultOneDimensional(/* didScroll */ true, /* unusedScrollDelta */ 0);
146 } 141 }
147 142
148 void ScrollAnimator::scrollToOffsetWithoutAnimation(const FloatPoint& offset) 143 void ScrollAnimator::scrollToOffsetWithoutAnimation(const FloatPoint& offset)
149 { 144 {
150 m_currentPosX = offset.x(); 145 m_currentPosX = offset.x();
151 m_currentPosY = offset.y(); 146 m_currentPosY = offset.y();
152 147
153 resetAnimationState(); 148 resetAnimationState();
154 notifyPositionChanged(); 149 notifyPositionChanged();
155 } 150 }
156 151
157 void ScrollAnimator::tickAnimation(double monotonicTime) 152 void ScrollAnimator::tickAnimation(double monotonicTime)
158 { 153 {
159 m_lastTickTime = monotonicTime;
160
161 if (m_runState != RunState::RunningOnMainThread) 154 if (m_runState != RunState::RunningOnMainThread)
162 return; 155 return;
163 156
164 TRACE_EVENT0("blink", "ScrollAnimator::tickAnimation"); 157 TRACE_EVENT0("blink", "ScrollAnimator::tickAnimation");
165 double elapsedTime = monotonicTime - m_startTime; 158 double elapsedTime = monotonicTime - m_startTime;
166 159
167 bool isFinished = (elapsedTime > m_animationCurve->duration()); 160 bool isFinished = (elapsedTime > m_animationCurve->duration());
168 FloatPoint offset = isFinished ? m_animationCurve->targetValue() 161 FloatPoint offset = isFinished ? m_animationCurve->targetValue()
169 : m_animationCurve->getValue(elapsedTime); 162 : m_animationCurve->getValue(elapsedTime);
170 163
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 if (m_runState == RunState::WaitingToSendToCompositor 199 if (m_runState == RunState::WaitingToSendToCompositor
207 || m_runState == RunState::RunningOnCompositorButNeedsUpdate) { 200 || m_runState == RunState::RunningOnCompositorButNeedsUpdate) {
208 if (m_runState == RunState::RunningOnCompositorButNeedsUpdate) { 201 if (m_runState == RunState::RunningOnCompositorButNeedsUpdate) {
209 // Abort the running animation before a new one with an updated 202 // Abort the running animation before a new one with an updated
210 // target is added. 203 // target is added.
211 abortAnimation(); 204 abortAnimation();
212 205
213 m_compositorAnimationId = 0; 206 m_compositorAnimationId = 0;
214 m_compositorAnimationGroupId = 0; 207 m_compositorAnimationGroupId = 0;
215 208
216 m_animationCurve->updateTarget(m_lastTickTime - m_startTime, 209 m_animationCurve->updateTarget(m_timeFunction() - m_startTime,
217 m_targetOffset); 210 m_targetOffset);
218 m_runState = RunState::WaitingToSendToCompositor; 211 m_runState = RunState::WaitingToSendToCompositor;
219 } 212 }
220 213
221 if (!m_animationCurve) { 214 if (!m_animationCurve) {
222 m_animationCurve = adoptPtr(Platform::current()->compositorSupport() 215 m_animationCurve = adoptPtr(Platform::current()->compositorSupport()
223 ->createScrollOffsetAnimationCurve( 216 ->createScrollOffsetAnimationCurve(
224 m_targetOffset, 217 m_targetOffset,
225 WebCompositorAnimationCurve::TimingFunctionTypeEaseInOut, 218 WebCompositorAnimationCurve::TimingFunctionTypeEaseInOut,
226 WebScrollOffsetAnimationCurve::ScrollDurationConstant)); 219 WebScrollOffsetAnimationCurve::ScrollDurationConstant));
(...skipping 22 matching lines...) Expand all
249 sentToCompositor = addAnimation(animation.release()); 242 sentToCompositor = addAnimation(animation.release());
250 if (sentToCompositor) { 243 if (sentToCompositor) {
251 m_runState = RunState::RunningOnCompositor; 244 m_runState = RunState::RunningOnCompositor;
252 m_compositorAnimationId = animationId; 245 m_compositorAnimationId = animationId;
253 m_compositorAnimationGroupId = animationGroupId; 246 m_compositorAnimationGroupId = animationGroupId;
254 } 247 }
255 } 248 }
256 } 249 }
257 250
258 if (!sentToCompositor) { 251 if (!sentToCompositor) {
259 m_runState = RunState::RunningOnMainThread; 252 if (registerAndScheduleAnimation())
260 if (!m_scrollableArea->scheduleAnimation()) { 253 m_runState = RunState::RunningOnMainThread;
261 scrollToOffsetWithoutAnimation(m_targetOffset);
262 resetAnimationState();
263 }
264 } 254 }
265 } 255 }
266 } 256 }
267 257
268 void ScrollAnimator::notifyCompositorAnimationFinished(int groupId) 258 void ScrollAnimator::notifyCompositorAnimationFinished(int groupId)
269 { 259 {
270 ScrollAnimatorCompositorCoordinator::compositorAnimationFinished(groupId); 260 ScrollAnimatorCompositorCoordinator::compositorAnimationFinished(groupId);
271 } 261 }
272 262
273 void ScrollAnimator::cancelAnimation() 263 void ScrollAnimator::cancelAnimation()
274 { 264 {
275 ScrollAnimatorCompositorCoordinator::cancelAnimation(); 265 ScrollAnimatorCompositorCoordinator::cancelAnimation();
276 } 266 }
277 267
278 void ScrollAnimator::layerForCompositedScrollingDidChange( 268 void ScrollAnimator::layerForCompositedScrollingDidChange(
279 WebCompositorAnimationTimeline* timeline) 269 WebCompositorAnimationTimeline* timeline)
280 { 270 {
281 reattachCompositorPlayerIfNeeded(timeline); 271 reattachCompositorPlayerIfNeeded(timeline);
282 } 272 }
283 273
274 bool ScrollAnimator::registerAndScheduleAnimation()
275 {
276 scrollableArea()->registerForAnimation();
277 if (!m_scrollableArea->scheduleAnimation()) {
278 scrollToOffsetWithoutAnimation(m_targetOffset);
279 resetAnimationState();
280 return false;
281 }
282 return true;
283 }
284
284 DEFINE_TRACE(ScrollAnimator) 285 DEFINE_TRACE(ScrollAnimator)
285 { 286 {
286 ScrollAnimatorBase::trace(visitor); 287 ScrollAnimatorBase::trace(visitor);
287 } 288 }
288 289
289 } // namespace blink 290 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698