OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 } |
OLD | NEW |