Index: Source/core/inspector/InspectorAnimationAgent.cpp |
diff --git a/Source/core/inspector/InspectorAnimationAgent.cpp b/Source/core/inspector/InspectorAnimationAgent.cpp |
index 99fc461a20b4b78d794c9eb5446dd2b0457b2d81..65e01661d0cff44b8eefd8494e5c1cb49ac86706 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)) |
.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::seekTimelineTo(ErrorString* errorString, double time, 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((time - timeline.zeroTime() * 1000) * timeline.playbackRate()); |
+ } |
+ } |
+ animationStartTimes = buildArrayForStartTimes(); |
+} |
+ |
+ |
+void InspectorAnimationAgent::seekTimelineBy(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) |
@@ -302,10 +349,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(); |