Chromium Code Reviews| Index: Source/core/inspector/InspectorAnimationAgent.cpp |
| diff --git a/Source/core/inspector/InspectorAnimationAgent.cpp b/Source/core/inspector/InspectorAnimationAgent.cpp |
| index fe063f4aeca66c36c81f83ed303828bff05e5ceb..b94004ef901fb859d0667f7dcd54ef512ddd8f6d 100644 |
| --- a/Source/core/inspector/InspectorAnimationAgent.cpp |
| +++ b/Source/core/inspector/InspectorAnimationAgent.cpp |
| @@ -171,6 +171,12 @@ static PassRefPtr<TypeBuilder::Animation::KeyframesRule> buildObjectForAnimation |
| return keyframesObject.release(); |
| } |
| +static double normalizedStartTime(AnimationPlayer& player) |
| +{ |
| + ASSERT(player.timeline() && player.timeline()->playbackRate()); |
| + return player.startTime() / player.timeline()->playbackRate() + player.timeline()->zeroTime() * 1000; |
| +} |
| + |
| PassRefPtr<TypeBuilder::Animation::AnimationPlayer> InspectorAnimationAgent::buildObjectForAnimationPlayer(AnimationPlayer& player) |
| { |
| // Find type of animation |
| @@ -208,7 +214,7 @@ PassRefPtr<TypeBuilder::Animation::AnimationPlayer> InspectorAnimationAgent::bui |
| .setPausedState(player.paused()) |
| .setPlayState(player.playState()) |
| .setPlaybackRate(player.playbackRate()) |
| - .setStartTime(player.startTime()) |
| + .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
|
| .setCurrentTime(player.currentTime()) |
| .setSource(animationObject.release()) |
| .setType(animationType); |
| @@ -243,20 +249,61 @@ void InspectorAnimationAgent::getAnimationPlayersForNode(ErrorString* errorStrin |
| void InspectorAnimationAgent::getPlaybackRate(ErrorString*, double* playbackRate) |
| { |
| + // All timelines should have the same playback rate |
| *playbackRate = m_pageAgent->inspectedFrame()->document()->timeline().playbackRate(); |
| } |
| -void InspectorAnimationAgent::setPlaybackRate(ErrorString*, double playbackRate) |
| +void InspectorAnimationAgent::setPlaybackRate(ErrorString*, double playbackRate, RefPtr<TypeBuilder::Array<TypeBuilder::Animation::AnimationStartTime>>& animationStartTimes) |
| { |
| for (Frame* frame = m_pageAgent->inspectedFrame(); frame; frame = frame->tree().traverseNext(m_pageAgent->inspectedFrame())) { |
| if (frame->isLocalFrame()) |
| toLocalFrame(frame)->document()->timeline().setPlaybackRate(playbackRate); |
| } |
| + animationStartTimes = buildArrayForStartTimes(); |
| } |
| -void InspectorAnimationAgent::setCurrentTime(ErrorString*, double currentTime) |
| +void InspectorAnimationAgent::setCurrentTime(ErrorString* errorString, double normalizedCurrentTime, RefPtr<TypeBuilder::Array<TypeBuilder::Animation::AnimationStartTime>>& animationStartTimes) |
| { |
| - m_pageAgent->inspectedFrame()->document()->timeline().setCurrentTime(currentTime); |
| + if (!m_pageAgent->inspectedFrame()->document()->timeline().playbackRate()) { |
| + *errorString = "Cannot set current time when timeline is paused"; |
| + return; |
| + } |
| + for (Frame* frame = m_pageAgent->inspectedFrame(); frame; frame = frame->tree().traverseNext(m_pageAgent->inspectedFrame())) { |
| + if (frame->isLocalFrame()) { |
| + AnimationTimeline& timeline = toLocalFrame(frame)->document()->timeline(); |
| + timeline.setCurrentTime((normalizedCurrentTime - timeline.zeroTime() * 1000) * timeline.playbackRate()); |
| + } |
| + } |
| + animationStartTimes = buildArrayForStartTimes(); |
| +} |
| + |
| + |
| +void InspectorAnimationAgent::seekTimeline(ErrorString* errorString, double timeDelta) |
| +{ |
| + if (m_pageAgent->inspectedFrame()->document()->timeline().playbackRate()) |
| + *errorString = "Cannot apply time delta when timeline is playing"; |
| + for (Frame* frame = m_pageAgent->inspectedFrame(); frame; frame = frame->tree().traverseNext(m_pageAgent->inspectedFrame())) { |
| + if (frame->isLocalFrame()) { |
| + AnimationTimeline& timeline = toLocalFrame(frame)->document()->timeline(); |
| + timeline.setCurrentTime(timeline.currentTime() + timeDelta); |
| + } |
| + } |
| +} |
| + |
| +PassRefPtr<TypeBuilder::Array<TypeBuilder::Animation::AnimationStartTime>> InspectorAnimationAgent::buildArrayForStartTimes() |
| +{ |
| + RefPtr<TypeBuilder::Array<TypeBuilder::Animation::AnimationStartTime>> animationStartTimes = TypeBuilder::Array<TypeBuilder::Animation::AnimationStartTime>::create(); |
| + if (!m_pageAgent->inspectedFrame()->document()->timeline().playbackRate()) |
| + return animationStartTimes.release(); |
| + |
| + for (const auto& pair : m_idToAnimationPlayer) { |
| + const RefPtr<AnimationPlayer> player = pair.value; |
| + RefPtr<TypeBuilder::Animation::AnimationStartTime> startTimeObject = TypeBuilder::Animation::AnimationStartTime::create() |
| + .setId(pair.key) |
| + .setStartTime(normalizedStartTime(*player.get())); |
| + animationStartTimes->addItem(startTimeObject); |
| + } |
| + return animationStartTimes.release(); |
| } |
| void InspectorAnimationAgent::setTiming(ErrorString* errorString, const String& playerId, double duration, double delay) |
| @@ -281,10 +328,10 @@ void InspectorAnimationAgent::didCreateAnimationPlayer(AnimationPlayer* player) |
| // Check threshold |
| double latestStartTime = 0; |
| for (const auto& p : m_idToAnimationPlayer.values()) |
| - latestStartTime = max(latestStartTime, p->startTime()); |
| + latestStartTime = max(latestStartTime, normalizedStartTime(*p)); |
| bool reset = false; |
| - if (player->startTime() - latestStartTime > 1000) { |
| + if (normalizedStartTime(*player) - latestStartTime > 1000) { |
| reset = true; |
| m_idToAnimationPlayer.clear(); |
| m_idToAnimationType.clear(); |