| 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();
|
|
|