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

Side by Side Diff: Source/core/inspector/InspectorAnimationAgent.cpp

Issue 1042143005: Devtools Animations: Support multiple frames in the animation timeline (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 8 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "config.h" 5 #include "config.h"
6 6
7 #include "core/inspector/InspectorAnimationAgent.h" 7 #include "core/inspector/InspectorAnimationAgent.h"
8 8
9 #include "core/animation/Animation.h" 9 #include "core/animation/Animation.h"
10 #include "core/animation/AnimationEffect.h" 10 #include "core/animation/AnimationEffect.h"
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 if (!keyframe.get()->isStringKeyframe()) 164 if (!keyframe.get()->isStringKeyframe())
165 continue; 165 continue;
166 const StringKeyframe* stringKeyframe = toStringKeyframe(keyframe.get()); 166 const StringKeyframe* stringKeyframe = toStringKeyframe(keyframe.get());
167 keyframes->addItem(buildObjectForStringKeyframe(stringKeyframe)); 167 keyframes->addItem(buildObjectForStringKeyframe(stringKeyframe));
168 } 168 }
169 RefPtr<TypeBuilder::Animation::KeyframesRule> keyframesObject = TypeBuilder: :Animation::KeyframesRule::create() 169 RefPtr<TypeBuilder::Animation::KeyframesRule> keyframesObject = TypeBuilder: :Animation::KeyframesRule::create()
170 .setKeyframes(keyframes); 170 .setKeyframes(keyframes);
171 return keyframesObject.release(); 171 return keyframesObject.release();
172 } 172 }
173 173
174 static double normalizedStartTime(AnimationPlayer& player)
175 {
176 ASSERT(player.timeline() && player.timeline()->playbackRate());
177 return player.startTime() / player.timeline()->playbackRate() + player.timel ine()->zeroTime() * 1000;
178 }
179
174 PassRefPtr<TypeBuilder::Animation::AnimationPlayer> InspectorAnimationAgent::bui ldObjectForAnimationPlayer(AnimationPlayer& player) 180 PassRefPtr<TypeBuilder::Animation::AnimationPlayer> InspectorAnimationAgent::bui ldObjectForAnimationPlayer(AnimationPlayer& player)
175 { 181 {
176 // Find type of animation 182 // Find type of animation
177 const Element* element = toAnimation(player.source())->target(); 183 const Element* element = toAnimation(player.source())->target();
178 StyleResolver& styleResolver = element->ownerDocument()->ensureStyleResolver (); 184 StyleResolver& styleResolver = element->ownerDocument()->ensureStyleResolver ();
179 CSSAnimations& cssAnimations = element->elementAnimations()->cssAnimations() ; 185 CSSAnimations& cssAnimations = element->elementAnimations()->cssAnimations() ;
180 const AtomicString animationName = cssAnimations.getAnimationNameForInspecto r(player); 186 const AtomicString animationName = cssAnimations.getAnimationNameForInspecto r(player);
181 RefPtr<TypeBuilder::Animation::KeyframesRule> keyframeRule = nullptr; 187 RefPtr<TypeBuilder::Animation::KeyframesRule> keyframeRule = nullptr;
182 AnimationType animationType; 188 AnimationType animationType;
183 189
(...skipping 17 matching lines...) Expand all
201 207
202 RefPtr<TypeBuilder::Animation::AnimationNode> animationObject = buildObjectF orAnimation(toAnimation(player.source()), animationType == AnimationType::CSSTra nsition); 208 RefPtr<TypeBuilder::Animation::AnimationNode> animationObject = buildObjectF orAnimation(toAnimation(player.source()), animationType == AnimationType::CSSTra nsition);
203 if (keyframeRule) 209 if (keyframeRule)
204 animationObject->setKeyframesRule(keyframeRule); 210 animationObject->setKeyframesRule(keyframeRule);
205 211
206 RefPtr<TypeBuilder::Animation::AnimationPlayer> playerObject = TypeBuilder:: Animation::AnimationPlayer::create() 212 RefPtr<TypeBuilder::Animation::AnimationPlayer> playerObject = TypeBuilder:: Animation::AnimationPlayer::create()
207 .setId(id) 213 .setId(id)
208 .setPausedState(player.paused()) 214 .setPausedState(player.paused())
209 .setPlayState(player.playState()) 215 .setPlayState(player.playState())
210 .setPlaybackRate(player.playbackRate()) 216 .setPlaybackRate(player.playbackRate())
211 .setStartTime(player.startTime()) 217 .setStartTime(normalizedStartTime(player))
pfeldman 2015/04/02 14:42:38 Different time scales is confusing, if you are usi
samli 2015/04/02 20:13:19 Will fix
212 .setCurrentTime(player.currentTime()) 218 .setCurrentTime(player.currentTime())
213 .setSource(animationObject.release()) 219 .setSource(animationObject.release())
214 .setType(animationType); 220 .setType(animationType);
215 return playerObject.release(); 221 return playerObject.release();
216 } 222 }
217 223
218 PassRefPtr<TypeBuilder::Array<TypeBuilder::Animation::AnimationPlayer> > Inspect orAnimationAgent::buildArrayForAnimationPlayers(Element& element, const WillBeHe apVector<RefPtrWillBeMember<AnimationPlayer> > players) 224 PassRefPtr<TypeBuilder::Array<TypeBuilder::Animation::AnimationPlayer> > Inspect orAnimationAgent::buildArrayForAnimationPlayers(Element& element, const WillBeHe apVector<RefPtrWillBeMember<AnimationPlayer> > players)
219 { 225 {
220 RefPtr<TypeBuilder::Array<TypeBuilder::Animation::AnimationPlayer> > animati onPlayersArray = TypeBuilder::Array<TypeBuilder::Animation::AnimationPlayer>::cr eate(); 226 RefPtr<TypeBuilder::Array<TypeBuilder::Animation::AnimationPlayer> > animati onPlayersArray = TypeBuilder::Array<TypeBuilder::Animation::AnimationPlayer>::cr eate();
221 for (const auto& it : players) { 227 for (const auto& it : players) {
(...skipping 14 matching lines...) Expand all
236 WillBeHeapVector<RefPtrWillBeMember<AnimationPlayer> > players; 242 WillBeHeapVector<RefPtrWillBeMember<AnimationPlayer> > players;
237 if (!includeSubtreeAnimations) 243 if (!includeSubtreeAnimations)
238 players = ElementAnimation::getAnimationPlayers(*element); 244 players = ElementAnimation::getAnimationPlayers(*element);
239 else 245 else
240 players = element->ownerDocument()->timeline().getAnimationPlayers(); 246 players = element->ownerDocument()->timeline().getAnimationPlayers();
241 animationPlayersArray = buildArrayForAnimationPlayers(*element, players); 247 animationPlayersArray = buildArrayForAnimationPlayers(*element, players);
242 } 248 }
243 249
244 void InspectorAnimationAgent::getPlaybackRate(ErrorString*, double* playbackRate ) 250 void InspectorAnimationAgent::getPlaybackRate(ErrorString*, double* playbackRate )
245 { 251 {
252 // All timelines should have the same playback rate
246 *playbackRate = m_pageAgent->inspectedFrame()->document()->timeline().playba ckRate(); 253 *playbackRate = m_pageAgent->inspectedFrame()->document()->timeline().playba ckRate();
247 } 254 }
248 255
249 void InspectorAnimationAgent::setPlaybackRate(ErrorString*, double playbackRate) 256 void InspectorAnimationAgent::setPlaybackRate(ErrorString*, double playbackRate, RefPtr<TypeBuilder::Array<TypeBuilder::Animation::AnimationStartTime>>& animati onStartTimes)
250 { 257 {
251 for (Frame* frame = m_pageAgent->inspectedFrame(); frame; frame = frame->tre e().traverseNext(m_pageAgent->inspectedFrame())) { 258 for (Frame* frame = m_pageAgent->inspectedFrame(); frame; frame = frame->tre e().traverseNext(m_pageAgent->inspectedFrame())) {
252 if (frame->isLocalFrame()) 259 if (frame->isLocalFrame())
253 toLocalFrame(frame)->document()->timeline().setPlaybackRate(playback Rate); 260 toLocalFrame(frame)->document()->timeline().setPlaybackRate(playback Rate);
254 } 261 }
262 animationStartTimes = buildArrayForStartTimes();
255 } 263 }
256 264
257 void InspectorAnimationAgent::setCurrentTime(ErrorString*, double currentTime) 265 void InspectorAnimationAgent::setCurrentTime(ErrorString* errorString, double no rmalizedCurrentTime, RefPtr<TypeBuilder::Array<TypeBuilder::Animation::Animation StartTime>>& animationStartTimes)
258 { 266 {
259 m_pageAgent->inspectedFrame()->document()->timeline().setCurrentTime(current Time); 267 if (!m_pageAgent->inspectedFrame()->document()->timeline().playbackRate()) {
268 *errorString = "Cannot set current time when timeline is paused";
269 return;
270 }
271 for (Frame* frame = m_pageAgent->inspectedFrame(); frame; frame = frame->tre e().traverseNext(m_pageAgent->inspectedFrame())) {
272 if (frame->isLocalFrame()) {
273 AnimationTimeline& timeline = toLocalFrame(frame)->document()->timel ine();
274 timeline.setCurrentTime((normalizedCurrentTime - timeline.zeroTime() * 1000) * timeline.playbackRate());
275 }
276 }
277 animationStartTimes = buildArrayForStartTimes();
278 }
279
280
281 void InspectorAnimationAgent::seekTimeline(ErrorString* errorString, double time Delta)
282 {
283 if (m_pageAgent->inspectedFrame()->document()->timeline().playbackRate())
284 *errorString = "Cannot apply time delta when timeline is playing";
285 for (Frame* frame = m_pageAgent->inspectedFrame(); frame; frame = frame->tre e().traverseNext(m_pageAgent->inspectedFrame())) {
286 if (frame->isLocalFrame()) {
287 AnimationTimeline& timeline = toLocalFrame(frame)->document()->timel ine();
288 timeline.setCurrentTime(timeline.currentTime() + timeDelta);
289 }
290 }
291 }
292
293 PassRefPtr<TypeBuilder::Array<TypeBuilder::Animation::AnimationStartTime>> Inspe ctorAnimationAgent::buildArrayForStartTimes()
294 {
295 RefPtr<TypeBuilder::Array<TypeBuilder::Animation::AnimationStartTime>> anima tionStartTimes = TypeBuilder::Array<TypeBuilder::Animation::AnimationStartTime>: :create();
296 if (!m_pageAgent->inspectedFrame()->document()->timeline().playbackRate())
297 return animationStartTimes.release();
298
299 for (const auto& pair : m_idToAnimationPlayer) {
300 const RefPtr<AnimationPlayer> player = pair.value;
301 RefPtr<TypeBuilder::Animation::AnimationStartTime> startTimeObject = Typ eBuilder::Animation::AnimationStartTime::create()
302 .setId(pair.key)
303 .setStartTime(normalizedStartTime(*player.get()));
304 animationStartTimes->addItem(startTimeObject);
305 }
306 return animationStartTimes.release();
260 } 307 }
261 308
262 void InspectorAnimationAgent::setTiming(ErrorString* errorString, const String& playerId, double duration, double delay) 309 void InspectorAnimationAgent::setTiming(ErrorString* errorString, const String& playerId, double duration, double delay)
263 { 310 {
264 AnimationPlayer* player = assertAnimationPlayer(errorString, playerId); 311 AnimationPlayer* player = assertAnimationPlayer(errorString, playerId);
265 if (!player) 312 if (!player)
266 return; 313 return;
267 314
268 RefPtrWillBeRawPtr<AnimationNodeTiming> timing = player->source()->timing(); 315 RefPtrWillBeRawPtr<AnimationNodeTiming> timing = player->source()->timing();
269 UnrestrictedDoubleOrString unrestrictedDuration; 316 UnrestrictedDoubleOrString unrestrictedDuration;
270 unrestrictedDuration.setUnrestrictedDouble(duration); 317 unrestrictedDuration.setUnrestrictedDouble(duration);
271 timing->setDuration(unrestrictedDuration); 318 timing->setDuration(unrestrictedDuration);
272 timing->setDelay(delay); 319 timing->setDelay(delay);
273 } 320 }
274 321
275 void InspectorAnimationAgent::didCreateAnimationPlayer(AnimationPlayer* player) 322 void InspectorAnimationAgent::didCreateAnimationPlayer(AnimationPlayer* player)
276 { 323 {
277 const String& playerId = String::number(player->sequenceNumber()); 324 const String& playerId = String::number(player->sequenceNumber());
278 if (m_idToAnimationPlayer.get(playerId)) 325 if (m_idToAnimationPlayer.get(playerId))
279 return; 326 return;
280 327
281 // Check threshold 328 // Check threshold
282 double latestStartTime = 0; 329 double latestStartTime = 0;
283 for (const auto& p : m_idToAnimationPlayer.values()) 330 for (const auto& p : m_idToAnimationPlayer.values())
284 latestStartTime = max(latestStartTime, p->startTime()); 331 latestStartTime = max(latestStartTime, normalizedStartTime(*p));
285 332
286 bool reset = false; 333 bool reset = false;
287 if (player->startTime() - latestStartTime > 1000) { 334 if (normalizedStartTime(*player) - latestStartTime > 1000) {
288 reset = true; 335 reset = true;
289 m_idToAnimationPlayer.clear(); 336 m_idToAnimationPlayer.clear();
290 m_idToAnimationType.clear(); 337 m_idToAnimationType.clear();
291 } 338 }
292 339
293 frontend()->animationPlayerCreated(buildObjectForAnimationPlayer(*player), r eset); 340 frontend()->animationPlayerCreated(buildObjectForAnimationPlayer(*player), r eset);
294 } 341 }
295 342
296 void InspectorAnimationAgent::didCancelAnimationPlayer(AnimationPlayer* player) 343 void InspectorAnimationAgent::didCancelAnimationPlayer(AnimationPlayer* player)
297 { 344 {
(...skipping 18 matching lines...) Expand all
316 #if ENABLE(OILPAN) 363 #if ENABLE(OILPAN)
317 visitor->trace(m_pageAgent); 364 visitor->trace(m_pageAgent);
318 visitor->trace(m_domAgent); 365 visitor->trace(m_domAgent);
319 visitor->trace(m_idToAnimationPlayer); 366 visitor->trace(m_idToAnimationPlayer);
320 visitor->trace(m_idToAnimationType); 367 visitor->trace(m_idToAnimationType);
321 #endif 368 #endif
322 InspectorBaseAgent::trace(visitor); 369 InspectorBaseAgent::trace(visitor);
323 } 370 }
324 371
325 } 372 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698