| 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)) |
| 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::seekTimelineTo(ErrorString* errorString, double ti
me, RefPtr<TypeBuilder::Array<TypeBuilder::Animation::AnimationStartTime>>& anim
ationStartTimes) |
| 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((time - timeline.zeroTime() * 1000) * timeli
ne.playbackRate()); |
| 275 } |
| 276 } |
| 277 animationStartTimes = buildArrayForStartTimes(); |
| 278 } |
| 279 |
| 280 |
| 281 void InspectorAnimationAgent::seekTimelineBy(ErrorString* errorString, double ti
meDelta) |
| 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 AnimationType type = m_idToAnimationType.get(playerId); | 315 AnimationType type = m_idToAnimationType.get(playerId); |
| 269 if (type == AnimationType::CSSTransition) { | 316 if (type == AnimationType::CSSTransition) { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 295 | 342 |
| 296 void InspectorAnimationAgent::didCreateAnimationPlayer(AnimationPlayer* player) | 343 void InspectorAnimationAgent::didCreateAnimationPlayer(AnimationPlayer* player) |
| 297 { | 344 { |
| 298 const String& playerId = String::number(player->sequenceNumber()); | 345 const String& playerId = String::number(player->sequenceNumber()); |
| 299 if (m_idToAnimationPlayer.get(playerId)) | 346 if (m_idToAnimationPlayer.get(playerId)) |
| 300 return; | 347 return; |
| 301 | 348 |
| 302 // Check threshold | 349 // Check threshold |
| 303 double latestStartTime = 0; | 350 double latestStartTime = 0; |
| 304 for (const auto& p : m_idToAnimationPlayer.values()) | 351 for (const auto& p : m_idToAnimationPlayer.values()) |
| 305 latestStartTime = max(latestStartTime, p->startTime()); | 352 latestStartTime = max(latestStartTime, normalizedStartTime(*p)); |
| 306 | 353 |
| 307 bool reset = false; | 354 bool reset = false; |
| 308 if (player->startTime() - latestStartTime > 1000) { | 355 if (normalizedStartTime(*player) - latestStartTime > 1000) { |
| 309 reset = true; | 356 reset = true; |
| 310 m_idToAnimationPlayer.clear(); | 357 m_idToAnimationPlayer.clear(); |
| 311 m_idToAnimationType.clear(); | 358 m_idToAnimationType.clear(); |
| 312 } | 359 } |
| 313 | 360 |
| 314 frontend()->animationPlayerCreated(buildObjectForAnimationPlayer(*player), r
eset); | 361 frontend()->animationPlayerCreated(buildObjectForAnimationPlayer(*player), r
eset); |
| 315 } | 362 } |
| 316 | 363 |
| 317 void InspectorAnimationAgent::didCancelAnimationPlayer(AnimationPlayer* player) | 364 void InspectorAnimationAgent::didCancelAnimationPlayer(AnimationPlayer* player) |
| 318 { | 365 { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 337 #if ENABLE(OILPAN) | 384 #if ENABLE(OILPAN) |
| 338 visitor->trace(m_pageAgent); | 385 visitor->trace(m_pageAgent); |
| 339 visitor->trace(m_domAgent); | 386 visitor->trace(m_domAgent); |
| 340 visitor->trace(m_idToAnimationPlayer); | 387 visitor->trace(m_idToAnimationPlayer); |
| 341 visitor->trace(m_idToAnimationType); | 388 visitor->trace(m_idToAnimationType); |
| 342 #endif | 389 #endif |
| 343 InspectorBaseAgent::trace(visitor); | 390 InspectorBaseAgent::trace(visitor); |
| 344 } | 391 } |
| 345 | 392 |
| 346 } | 393 } |
| OLD | NEW |