Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1154)

Unified Diff: Source/core/inspector/InspectorAnimationAgent.cpp

Issue 1042143005: Devtools Animations: Support multiple frames in the animation timeline (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Naming changes Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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();

Powered by Google App Engine
This is Rietveld 408576698