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

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: Test 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());
177 return player.startTime() / player.timeline()->playbackRate() + player.timel ine()->zeroTime() * 1000;
pfeldman 2015/04/01 13:06:45 What time is this?
samli 2015/04/02 09:58:00 We take relative timeline times and convert them t
pfeldman 2015/04/02 14:42:38 But zeroTime is already monotonicTime, why do mult
samli 2015/04/02 20:13:19 Chrome's internal representations are in seconds.
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))
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*, double normalisedCurr entTime, RefPtr<TypeBuilder::Array<TypeBuilder::Animation::AnimationStartTime>>& animationStartTimes)
258 { 266 {
259 m_pageAgent->inspectedFrame()->document()->timeline().setCurrentTime(current Time); 267 for (Frame* frame = m_pageAgent->inspectedFrame(); frame; frame = frame->tre e().traverseNext(m_pageAgent->inspectedFrame())) {
pfeldman 2015/04/01 13:06:45 It is strange that this synchronization takes plac
samli 2015/04/02 09:58:00 This code isn't to sync timelines. This code is us
pfeldman 2015/04/02 14:42:38 Ok, I think I understand.
268 if (frame->isLocalFrame()) {
269 AnimationTimeline& timeline = toLocalFrame(frame)->document()->timel ine();
270 timeline.setCurrentTime((normalisedCurrentTime - timeline.zeroTime() * 1000) * timeline.playbackRate());
pfeldman 2015/04/02 14:42:38 There is something wrong with the timeline units:
samli 2015/04/02 20:13:19 I think this is the milliseconds confusion?
271 }
272 }
273 animationStartTimes = buildArrayForStartTimes();
274 }
275
276 PassRefPtr<TypeBuilder::Array<TypeBuilder::Animation::AnimationStartTime>> Inspe ctorAnimationAgent::buildArrayForStartTimes()
277 {
278 RefPtr<TypeBuilder::Array<TypeBuilder::Animation::AnimationStartTime>> anima tionStartTimes = TypeBuilder::Array<TypeBuilder::Animation::AnimationStartTime>: :create();
279 for (const auto& pair : m_idToAnimationPlayer) {
280 const RefPtr<AnimationPlayer> player = pair.value;
281 RefPtr<TypeBuilder::Animation::AnimationStartTime> startTimeObject = Typ eBuilder::Animation::AnimationStartTime::create()
282 .setId(pair.key)
283 .setStartTime(normalizedStartTime(*player.get()));
284 animationStartTimes->addItem(startTimeObject);
285 }
286 return animationStartTimes.release();
260 } 287 }
261 288
262 void InspectorAnimationAgent::setTiming(ErrorString* errorString, const String& playerId, double duration, double delay) 289 void InspectorAnimationAgent::setTiming(ErrorString* errorString, const String& playerId, double duration, double delay)
263 { 290 {
264 AnimationPlayer* player = assertAnimationPlayer(errorString, playerId); 291 AnimationPlayer* player = assertAnimationPlayer(errorString, playerId);
265 if (!player) 292 if (!player)
266 return; 293 return;
267 294
268 RefPtrWillBeRawPtr<AnimationNodeTiming> timing = player->source()->timing(); 295 RefPtrWillBeRawPtr<AnimationNodeTiming> timing = player->source()->timing();
269 UnrestrictedDoubleOrString unrestrictedDuration; 296 UnrestrictedDoubleOrString unrestrictedDuration;
270 unrestrictedDuration.setUnrestrictedDouble(duration); 297 unrestrictedDuration.setUnrestrictedDouble(duration);
271 timing->setDuration(unrestrictedDuration); 298 timing->setDuration(unrestrictedDuration);
272 timing->setDelay(delay); 299 timing->setDelay(delay);
273 } 300 }
274 301
275 void InspectorAnimationAgent::didCreateAnimationPlayer(AnimationPlayer* player) 302 void InspectorAnimationAgent::didCreateAnimationPlayer(AnimationPlayer* player)
276 { 303 {
277 const String& playerId = String::number(player->sequenceNumber()); 304 const String& playerId = String::number(player->sequenceNumber());
278 if (m_idToAnimationPlayer.get(playerId)) 305 if (m_idToAnimationPlayer.get(playerId))
279 return; 306 return;
280 307
281 // Check threshold 308 // Check threshold
282 double latestStartTime = 0; 309 double latestStartTime = 0;
283 for (const auto& p : m_idToAnimationPlayer.values()) 310 for (const auto& p : m_idToAnimationPlayer.values())
284 latestStartTime = max(latestStartTime, p->startTime()); 311 latestStartTime = max(latestStartTime, normalizedStartTime(*p));
285 312
286 bool reset = false; 313 bool reset = false;
287 if (player->startTime() - latestStartTime > 1000) { 314 if (normalizedStartTime(*player) - latestStartTime > 1000) {
288 reset = true; 315 reset = true;
289 m_idToAnimationPlayer.clear(); 316 m_idToAnimationPlayer.clear();
290 m_idToAnimationType.clear(); 317 m_idToAnimationType.clear();
291 } 318 }
292 319
293 frontend()->animationPlayerCreated(buildObjectForAnimationPlayer(*player), r eset); 320 frontend()->animationPlayerCreated(buildObjectForAnimationPlayer(*player), r eset);
294 } 321 }
295 322
296 void InspectorAnimationAgent::didCancelAnimationPlayer(AnimationPlayer* player) 323 void InspectorAnimationAgent::didCancelAnimationPlayer(AnimationPlayer* player)
297 { 324 {
(...skipping 18 matching lines...) Expand all
316 #if ENABLE(OILPAN) 343 #if ENABLE(OILPAN)
317 visitor->trace(m_pageAgent); 344 visitor->trace(m_pageAgent);
318 visitor->trace(m_domAgent); 345 visitor->trace(m_domAgent);
319 visitor->trace(m_idToAnimationPlayer); 346 visitor->trace(m_idToAnimationPlayer);
320 visitor->trace(m_idToAnimationType); 347 visitor->trace(m_idToAnimationType);
321 #endif 348 #endif
322 InspectorBaseAgent::trace(visitor); 349 InspectorBaseAgent::trace(visitor);
323 } 350 }
324 351
325 } 352 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698