Web Animations: Add tests for player state transitions and fix discovered issues

BUG=396372,410229

Review URL: https://codereview.chromium.org/555063002

git-svn-id: svn://svn.chromium.org/blink/trunk@181716 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent e9932e62
...@@ -307,19 +307,13 @@ void AnimationPlayer::setCurrentTime(double newCurrentTime) ...@@ -307,19 +307,13 @@ void AnimationPlayer::setCurrentTime(double newCurrentTime)
return; return;
setCompositorPending(); setCompositorPending();
m_currentTimePending = false;
// Setting current time while pending forces a start time.
if (m_currentTimePending) {
m_startTime = 0;
m_currentTimePending = false;
}
setCurrentTimeInternal(newCurrentTime / 1000, TimingUpdateOnDemand); setCurrentTimeInternal(newCurrentTime / 1000, TimingUpdateOnDemand);
} }
void AnimationPlayer::setStartTime(double startTime) void AnimationPlayer::setStartTime(double startTime)
{ {
if (m_paused) // FIXME: Should this throw an exception? if (m_paused || m_idle)
return; return;
if (!std::isfinite(startTime)) if (!std::isfinite(startTime))
return; return;
...@@ -472,23 +466,13 @@ void AnimationPlayer::reverse() ...@@ -472,23 +466,13 @@ void AnimationPlayer::reverse()
} }
uncancel(); uncancel();
if (m_content) {
if (m_playbackRate > 0 && currentTimeInternal() > sourceEnd()) {
setCurrentTimeInternal(sourceEnd(), TimingUpdateOnDemand);
ASSERT(finished());
} else if (m_playbackRate < 0 && currentTimeInternal() < 0) {
setCurrentTimeInternal(0, TimingUpdateOnDemand);
ASSERT(finished());
}
}
setPlaybackRate(-m_playbackRate); setPlaybackRate(-m_playbackRate);
unpauseInternal(); play();
} }
void AnimationPlayer::finish(ExceptionState& exceptionState) void AnimationPlayer::finish(ExceptionState& exceptionState)
{ {
if (!m_playbackRate) { if (!m_playbackRate || m_idle) {
return; return;
} }
if (m_playbackRate > 0 && sourceEnd() == std::numeric_limits<double>::infinity()) { if (m_playbackRate > 0 && sourceEnd() == std::numeric_limits<double>::infinity()) {
...@@ -500,13 +484,14 @@ void AnimationPlayer::finish(ExceptionState& exceptionState) ...@@ -500,13 +484,14 @@ void AnimationPlayer::finish(ExceptionState& exceptionState)
} }
uncancel(); uncancel();
m_startTime = 0;
if (m_playbackRate < 0) { double newCurrentTime = m_playbackRate < 0 ? 0 : sourceEnd();
setCurrentTimeInternal(0, TimingUpdateOnDemand); setCurrentTimeInternal(newCurrentTime, TimingUpdateOnDemand);
} else { if (!paused()) {
setCurrentTimeInternal(sourceEnd(), TimingUpdateOnDemand); m_startTime = calculateStartTime(newCurrentTime);
} }
m_currentTimePending = false;
ASSERT(finished()); ASSERT(finished());
} }
...@@ -546,7 +531,7 @@ void AnimationPlayer::setPlaybackRate(double playbackRate) ...@@ -546,7 +531,7 @@ void AnimationPlayer::setPlaybackRate(double playbackRate)
return; return;
setCompositorPending(); setCompositorPending();
if (!finished() && !paused()) if (!finished() && !paused() && hasStartTime())
m_currentTimePending = true; m_currentTimePending = true;
double storedCurrentTime = currentTimeInternal(); double storedCurrentTime = currentTimeInternal();
...@@ -663,6 +648,7 @@ void AnimationPlayer::cancel() ...@@ -663,6 +648,7 @@ void AnimationPlayer::cancel()
m_held = true; m_held = true;
m_idle = true; m_idle = true;
m_startTime = nullValue(); m_startTime = nullValue();
m_currentTimePending = false;
setCompositorPending(); setCompositorPending();
} }
......
...@@ -284,7 +284,7 @@ TEST_F(AnimationAnimationPlayerTest, StartTimePauseFinish) ...@@ -284,7 +284,7 @@ TEST_F(AnimationAnimationPlayerTest, StartTimePauseFinish)
EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal()); EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal());
EXPECT_TRUE(std::isnan(player->startTime())); EXPECT_TRUE(std::isnan(player->startTime()));
player->finish(exceptionState); player->finish(exceptionState);
EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal()); EXPECT_EQ(AnimationPlayer::Paused, player->playStateInternal());
EXPECT_TRUE(std::isnan(player->startTime())); EXPECT_TRUE(std::isnan(player->startTime()));
} }
...@@ -300,9 +300,8 @@ TEST_F(AnimationAnimationPlayerTest, PauseBeatsFinish) ...@@ -300,9 +300,8 @@ TEST_F(AnimationAnimationPlayerTest, PauseBeatsFinish)
TEST_F(AnimationAnimationPlayerTest, StartTimeFinishPause) TEST_F(AnimationAnimationPlayerTest, StartTimeFinishPause)
{ {
double startTime = player->startTime();
player->finish(exceptionState); player->finish(exceptionState);
EXPECT_EQ(startTime, player->startTime()); EXPECT_EQ(-30 * 1000, player->startTime());
player->pause(); player->pause();
EXPECT_TRUE(std::isnan(player->startTime())); EXPECT_TRUE(std::isnan(player->startTime()));
} }
...@@ -461,18 +460,18 @@ TEST_F(AnimationAnimationPlayerTest, ReverseSeeksToEnd) ...@@ -461,18 +460,18 @@ TEST_F(AnimationAnimationPlayerTest, ReverseSeeksToEnd)
EXPECT_EQ(30, player->currentTimeInternal()); EXPECT_EQ(30, player->currentTimeInternal());
} }
TEST_F(AnimationAnimationPlayerTest, ReverseLimitsAnimationPlayer) TEST_F(AnimationAnimationPlayerTest, ReverseBeyondLimit)
{ {
player->setCurrentTimeInternal(40); player->setCurrentTimeInternal(40);
player->setPlaybackRate(-1); player->setPlaybackRate(-1);
player->reverse(); player->reverse();
EXPECT_TRUE(player->finished()); EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal());
EXPECT_EQ(40, player->currentTimeInternal()); EXPECT_EQ(0, player->currentTimeInternal());
player->setCurrentTimeInternal(-10); player->setCurrentTimeInternal(-10);
player->reverse(); player->reverse();
EXPECT_TRUE(player->finished()); EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal());
EXPECT_EQ(-10, player->currentTimeInternal()); EXPECT_EQ(30, player->currentTimeInternal());
} }
...@@ -849,8 +848,6 @@ TEST_F(AnimationAnimationPlayerTest, PlayBackwardsAfterCancel) ...@@ -849,8 +848,6 @@ TEST_F(AnimationAnimationPlayerTest, PlayBackwardsAfterCancel)
EXPECT_EQ(40 * 1000, player->startTime()); EXPECT_EQ(40 * 1000, player->startTime());
} }
// FIXME: crbug.com/410229, when fixed, will reuqire the expected results of
// this test to change (currentTime -> 30 * 1000).
TEST_F(AnimationAnimationPlayerTest, ReverseAfterCancel) TEST_F(AnimationAnimationPlayerTest, ReverseAfterCancel)
{ {
player->cancel(); player->cancel();
...@@ -859,12 +856,12 @@ TEST_F(AnimationAnimationPlayerTest, ReverseAfterCancel) ...@@ -859,12 +856,12 @@ TEST_F(AnimationAnimationPlayerTest, ReverseAfterCancel)
EXPECT_TRUE(std::isnan(player->startTime())); EXPECT_TRUE(std::isnan(player->startTime()));
player->reverse(); player->reverse();
EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal()); EXPECT_EQ(AnimationPlayer::Pending, player->playStateInternal());
EXPECT_TRUE(std::isnan(player->currentTime())); EXPECT_EQ(30 * 1000, player->currentTime());
EXPECT_TRUE(std::isnan(player->startTime())); EXPECT_TRUE(std::isnan(player->startTime()));
simulateFrame(10); simulateFrame(10);
EXPECT_EQ(AnimationPlayer::Finished, player->playStateInternal()); EXPECT_EQ(AnimationPlayer::Running, player->playStateInternal());
EXPECT_EQ(0 * 1000, player->currentTime()); EXPECT_EQ(30 * 1000, player->currentTime());
EXPECT_EQ(10 * 1000, player->startTime()); EXPECT_EQ(40 * 1000, player->startTime());
} }
TEST_F(AnimationAnimationPlayerTest, FinishAfterCancel) TEST_F(AnimationAnimationPlayerTest, FinishAfterCancel)
...@@ -874,9 +871,9 @@ TEST_F(AnimationAnimationPlayerTest, FinishAfterCancel) ...@@ -874,9 +871,9 @@ TEST_F(AnimationAnimationPlayerTest, FinishAfterCancel)
EXPECT_TRUE(std::isnan(player->currentTime())); EXPECT_TRUE(std::isnan(player->currentTime()));
EXPECT_TRUE(std::isnan(player->startTime())); EXPECT_TRUE(std::isnan(player->startTime()));
player->finish(exceptionState); player->finish(exceptionState);
EXPECT_EQ(AnimationPlayer::Finished, player->playStateInternal()); EXPECT_TRUE(std::isnan(player->currentTime()));
EXPECT_EQ(30 * 1000, player->currentTime()); EXPECT_TRUE(std::isnan(player->startTime()));
EXPECT_EQ(0, player->startTime()); EXPECT_EQ(AnimationPlayer::Idle, player->playStateInternal());
} }
TEST_F(AnimationAnimationPlayerTest, PauseAfterCancel) TEST_F(AnimationAnimationPlayerTest, PauseAfterCancel)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment