Index: pkg/polymer/lib/elements/web-animations-js/test/testcases/test-player.html |
diff --git a/pkg/polymer/lib/elements/web-animations-js/test/testcases/test-player.html b/pkg/polymer/lib/elements/web-animations-js/test/testcases/test-player.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..22a968b32caa84cdb7c1ffc7ff2a436467d30728 |
--- /dev/null |
+++ b/pkg/polymer/lib/elements/web-animations-js/test/testcases/test-player.html |
@@ -0,0 +1,786 @@ |
+<!-- |
+Copyright 2013 Google Inc. All Rights Reserved. |
+ |
+Licensed under the Apache License, Version 2.0 (the "License"); |
+you may not use this file except in compliance with the License. |
+You may obtain a copy of the License at |
+ |
+ http://www.apache.org/licenses/LICENSE-2.0 |
+ |
+Unless required by applicable law or agreed to in writing, software |
+distributed under the License is distributed on an "AS IS" BASIS, |
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+See the License for the specific language governing permissions and |
+limitations under the License. |
+ |
+Written by Steph McArthur |
+--> |
+ |
+<!DOCTYPE html><meta charset="UTF-8"> |
+<div id="anim"></div> |
+ |
+<script src="../bootstrap.js"></script> |
+<script> |
+var animation = new Animation(anim, {left: "100px"}, 100); |
+var dt = document.timeline; |
+ |
+// Test Player.timeline. |
+var player1 = dt.play(animation); |
+test(function() {assert_equals(player1.timeline, document.timeline)}, |
+ "Player.timeline is document timeline"); |
+ |
+// Test that TimedItem.player and Player.source are consistent. |
+test(function() {assert_equals(player1.source, animation)}, |
+ "Player.source should be the Animation"); |
+test(function() {assert_equals(animation.player, player1)}, |
+ "TimedItem.player should be the Player"); |
+ |
+// Test that play() always returns a new Player. |
+var player2 = dt.play(animation); |
+test(function() {assert_not_equals(player2, player1)}, |
+ "Repeated calls to play() should create a new Player"); |
+test(function() {assert_equals(animation.player, player2)}, |
+ "Repeated play(): TimedItem.player should be the Player"); |
+test(function() {assert_equals(player2.source, animation)}, |
+ "Repeated play(): Player.source should be the Animation"); |
+test(function() {assert_equals(player2.startTime, player1.startTime)}, |
+ "Repeated play(): Players should have same start time"); |
+ |
+// Test explicit setting of Player.source. |
+player1.source = animation; |
+test(function() {assert_equals(player2.source, null)}, |
+ "Set Player.source: Old Player.source should be null"); |
+test(function() {assert_equals(player1.source, animation)}, |
+ "Set Player.source: New Player.source should be the Animation"); |
+test(function() {assert_equals(animation.player, player1)}, |
+ "Set Player.source: TimedItem.player should be the Player"); |
+ |
+// Test that TimedItem.player gives null on a detached tree. |
+var animation2 = |
+ new Animation(document.getElementById("anim"), {left: "100px"}); |
+var parGroup = new ParGroup([animation2]); |
+test(function() {assert_equals(parGroup.player, null)}, |
+ "TimedItem.player should be null for root"); |
+test(function() {assert_equals(animation2.player, null)}, |
+ "TimedItem.player should be null for leaf"); |
+ |
+// Test that TimedItem.player remotes to the root of the tree. |
+var player3 = dt.play(parGroup); |
+test(function() {assert_equals(animation2.player, player3)}, |
+ "TimedItem.player should remote"); |
+ |
+// Test that calling play() on a TimedItem with a parent results in. |
+// reparenting. |
+var player4 = dt.play(animation2); |
+test(function() {assert_equals(animation2.parent, null)}, |
+ "Animation should be reparented"); |
+test(function() {assert_equals(parGroup.children.length, 0)}, |
+ "Animation parent should be updated, leaving parGroup.children.length = 0"); |
+test(function() {assert_equals(player4.source, animation2)}, |
+ "Player should use reparented animation"); |
+ |
+// Test that setting a parent on a TimedItem with a Player causes the player to. |
+// be disconnected. |
+parGroup.append(animation2); |
+test(function() {assert_equals(parGroup.player, player3)}, |
+ "TimedItem.player should be updated for root"); |
+test(function() {assert_equals(animation2.player, player3)}, |
+ "TimedItem.player should be updated for leaf"); |
+test(function() {assert_equals(player4.source, null)}, |
+ "Player.source should be updated"); |
+test(function() {assert_equals(animation2.parent, parGroup)}, |
+ "Animation.parent should be updated"); |
+test(function() {assert_equals(parGroup.children.length, 1)}, |
+ "Animation parent should be updated, leaving parGroup.children.length = 1"); |
+test(function() {assert_equals(parGroup.children[0], animation2)}, |
+ "Animation parent should be updated"); |
+ |
+// Test that currentTime is zero before timeline starts. |
+test(function() {assert_equals(document.timeline.play(animation).currentTime, 0)}, |
+ "currentTime should be zero before Timeline starts"); |
+ |
+// Test that startTime is zero before timeline starts. |
+test(function() {assert_equals(document.timeline.play(animation).startTime, 0)}, |
+ "startTime should be zero before Timeline starts"); |
+ |
+// Test that setting currentTime has an effect before the timeline starts. |
+var player5 = dt.play(animation); |
+player5.currentTime = 42; |
+test(function() {assert_equals(player5.currentTime, 42)}, |
+ "player5 can be seeked before timeline starts"); |
+timing_test(function() { |
+ at(0.1, function() { |
+ assert_equals(player5.currentTime, 42.1); |
+ }); |
+ }, "player5's updates to currentTime should persist after Timeline starts"); |
+ |
+// Test that setting startTime has an effect before the timeline starts. |
+var player6 = dt.play(animation.clone()); |
+player6.startTime = 42; |
+test(function() {assert_equals(player6.currentTime, -42)}, |
+ "player6's currentTime should always be zero before Timeline starts"); |
+ |
+// Test that a Player's TimedItem gets a null inherited time until the. |
+// timeline starts. |
+var animation1 = new Animation(document.getElementById("anim"), {left: "100px"}); |
+dt.play(animation1); |
+test(function() {assert_equals(animation1.localTime, null)}, |
+ "TimedItem's inherited time, and thus " + |
+ "localTime should be null before Timeline starts"); |
+timing_test(function() { |
+ at(0.0, function() {assert_not_equals(animation1.localTime, null)}); |
+ }, "TimedItem's inherited time " + |
+ "and thus localTime should not be null after Timeline starts"); |
+ |
+// Test that TimedItem is updated immediately on calling Timeline.play() after. |
+// the timeline starts. |
+var animation4 = new Animation( |
+ document.getElementById("anim"), {left: "100px"}); |
+test(function() {assert_equals(animation4.localTime, null)}, |
+ "localTime should be null before playing"); |
+timing_test(function() { |
+ at(0.0, function() { |
+ document.timeline.play(animation4); |
+ assert_equals(animation4.localTime, 0) |
+ }); |
+ }, "localTime should be set by playing"); |
+ |
+// Test that updates to currentTime take immediate effect. |
+timing_test(function() { |
+ at(0.0, function() { |
+ var animation5 = new Animation( |
+ document.getElementById("anim"), {left: "100px"}, 100); |
+ document.timeline.play(animation5).currentTime = 42; |
+ assert_equals(animation5.localTime, 42); |
+ }); |
+ }, "Updates to Player.currentTime should take immediate effect"); |
+ |
+// Test that updates to source take immediate effect. |
+timing_test(function() { |
+ at(0.0, function() { |
+ var player = document.timeline.play(new Animation( |
+ document.getElementById("anim"), {left: "100px"})); |
+ var animation7 = new Animation( |
+ document.getElementById("anim"), {left: "100px"}); |
+ player.source = animation7; |
+ assert_equals(animation7.localTime, 0); |
+ }); |
+ }, "Updates to Player.source should take immediate effect"); |
+ |
+function createPlayer(duration) { |
+ return document.timeline.play(new Animation(null, null, duration)); |
+} |
+ |
+// Tests the initial values of the Player API. |
+timing_test(function() { |
+ at(0, function() { |
+ var anim = new Animation(null, null, 3); |
+ assert_equals(anim.player, null, "Player should be null initially"); |
+ |
+ // Check state after playing |
+ document.timeline.play(anim); |
+ assert_not_equals(anim.player, null, "Player should be not be null when playing"); |
+ assert_equals(anim.player.source, anim, "Initial source content"); |
+ assert_equals(anim.player.timeline, document.timeline, "Initial document timeline"); |
+ assert_equals(anim.player.startTime, document.timeline.currentTime, "Initial start time"); |
+ assert_equals(anim.player.currentTime, 0, "Initial current time"); |
+ assert_equals(anim.player.timeLag, 0, "Initial time lag"); |
+ assert_equals(anim.player.playbackRate, 1, "Initial playback rate"); |
+ assert_false(anim.player.paused, "Initial paused state"); |
+ assert_false(anim.player.finished, "Initial finished state"); |
+ }); |
+ }, "Initial state"); |
+ |
+// Test paused states after pausing. |
+test(function() { |
+ var player = createPlayer(3); |
+ |
+ // Pause |
+ player.pause(); |
+ assert_true(player.paused, "Paused state after pausing"); |
+ assert_false(player.finished, "Finished state after pausing"); |
+ |
+ // Unpause |
+ player.play(); |
+ assert_false(player.paused, "Paused state after unpausing"); |
+ assert_false(player.finished, "Finished state after unpausing"); |
+ }, "Pause"); |
+ |
+// Test seeking behind startTime for a forwards player. |
+timing_test(function() { |
+ var player = createPlayer(3); |
+ |
+ // Seek before start |
+ player.currentTime = -0.1; |
+ assert_equals(player.currentTime, -0.1, "Current time after seeking before start"); |
+ assert_false(player.paused, "Paused state after seeking before start"); |
+ assert_false(player.finished, "Finished state after seeking before start"); |
+ |
+ // Check player does progress |
+ at(0.2, function() { |
+ assert_equals(player.currentTime, 0.1, "Current time should progress"); |
+ }); |
+ }, "Seek behind content (forwards)"); |
+ |
+// Test players do not get bounded after updating startTime such that they are before the start time. |
+timing_test(function() { |
+ var player = createPlayer(3); |
+ |
+ // Set start time in the future |
+ player.startTime = 0.1; |
+ |
+ // Check state of player |
+ assert_equals(player.currentTime, -0.1, "Current time while waiting to start"); |
+ assert_false(player.paused, "Paused state while waiting to start"); |
+ assert_false(player.finished, "Finished state while waiting to start"); |
+ |
+ // Check player starts automatically |
+ at(0.2, function() { |
+ assert_equals(player.currentTime, 0.1, "Current time should progress"); |
+ assert_false(player.paused, "Paused state after starting"); |
+ assert_false(player.finished, "Finished state after starting"); |
+ }); |
+ }, "No bounding at start"); |
+ |
+// Test players get bounded when they finish their source content. |
+timing_test(function() { |
+ var player = createPlayer(3); |
+ |
+ // Seek to just before end |
+ player.currentTime = 2.9; |
+ |
+ // Check state of player |
+ assert_equals(player.currentTime, 2.9, "Current time just before end"); |
+ assert_false(player.paused, "Paused state just before end"); |
+ assert_false(player.finished, "Finished state just before end"); |
+ |
+ // Check player after finishing |
+ at(0.2, function() { |
+ assert_equals(player.currentTime, 3.0, "Current time when bounded progress"); |
+ assert_false(player.paused, "Paused state after ending"); |
+ assert_true(player.finished, "Finished state after ending"); |
+ }); |
+ }, "Limiting at end (seek with current time)"); |
+ |
+// Test players get bounded when they finish their source content after altering start time. |
+timing_test(function() { |
+ var player = createPlayer(3); |
+ |
+ // Seek to just before end using the start time |
+ player.startTime -= 2.9; |
+ |
+ // Check state of player |
+ assert_equals(player.currentTime, 2.9, "Current time just before end"); |
+ assert_false(player.paused, "Paused state just before end"); |
+ assert_false(player.finished, "Finished state just before end"); |
+ |
+ // Check player after finishing |
+ at(0.2, function() { |
+ assert_equals(player.currentTime, 3.0, "Current time when bounded progress"); |
+ assert_false(player.paused, "Paused state after ending"); |
+ assert_true(player.finished, "Finished state after ending"); |
+ }); |
+ }, "Limiting at end (seek with start time)"); |
+ |
+// Test reversing a player prior to starting doesn't snap the current time to the beginning. |
+timing_test(function() { |
+ var player = createPlayer(3); |
+ |
+ // Seek before start |
+ player.currentTime = -0.1; |
+ |
+ // Check state |
+ assert_equals(player.currentTime, -0.1, "Current time before reversing"); |
+ assert_false(player.finished, "Finished state before reversing"); |
+ |
+ // Reverse |
+ player.reverse(); |
+ assert_equals(player.currentTime, -0.1, "Current time after reversing"); |
+ assert_true(player.finished, "Finished state after reversing"); |
+ assert_equals(player.playbackRate, -1, "Playback rate after reversing"); |
+ |
+ // Check player after some time |
+ at(0.2, function() { |
+ assert_equals(player.currentTime, -0.1, "Current time later"); |
+ assert_true(player.finished, "Finished state later"); |
+ }); |
+ }, "reverse() before start"); |
+ |
+// Test reversing a player at the start causes the player to become bounded. |
+timing_test(function() { |
+ var player = createPlayer(3); |
+ |
+ // Reverse |
+ player.reverse(); |
+ assert_equals(player.currentTime, 0, "Current time after reversing"); |
+ assert_true(player.finished, "Finished state after reversing"); |
+ assert_equals(player.playbackRate, -1, "Playback rate after reversing"); |
+ |
+ // Check player after some time |
+ at(0.2, function() { |
+ assert_equals(player.currentTime, 0, "Current time later"); |
+ assert_true(player.finished, "Finished state later"); |
+ }); |
+ }, "reverse() at start"); |
+ |
+// Test reversing a player halfway through an animation. |
+timing_test(function() { |
+ var player = createPlayer(3); |
+ |
+ // Seek midway |
+ player.currentTime = 1.5; |
+ |
+ // Reverse |
+ player.reverse(); |
+ assert_equals(player.currentTime, 1.5, "Current time after reversing"); |
+ assert_false(player.finished, "Finished state after reversing"); |
+ assert_equals(player.playbackRate, -1, "Playback rate after reversing"); |
+ |
+ // Check player after some time |
+ at(0.2, function() { |
+ assert_equals(player.currentTime, 1.3, "Current time when reversing"); |
+ assert_false(player.finished, "Finished state later"); |
+ }); |
+ }, "reverse() while playing"); |
+ |
+// Test reversing a player that has ended starts playing backwards. |
+timing_test(function() { |
+ var player = createPlayer(3); |
+ |
+ // Seek to just before the end |
+ player.currentTime = 2.9; |
+ |
+ // Wait to finish |
+ at(0.2, function() { |
+ assert_equals(player.currentTime, 3.0, "Current time when finished"); |
+ assert_true(player.finished, "Finished state after finished"); |
+ |
+ // Reverse |
+ player.reverse(); |
+ assert_equals(player.currentTime, 3.0, "Current time after reversing"); |
+ assert_false(player.finished, "Finished state after reversing"); |
+ assert_equals(player.playbackRate, -1, "Playback rate after reversing"); |
+ |
+ // Check we actually reverse |
+ at(0.2, function() { |
+ assert_equals(player.currentTime, 2.8, "Current time after beginning reverse"); |
+ assert_false(player.finished, "Finished state after reversing"); |
+ }); |
+ }); |
+ }, "reverse() when finished"); |
+ |
+// Test reversing a player seeked past the end will snap back to the end. |
+timing_test(function() { |
+ var player = createPlayer(3); |
+ |
+ // Seek to past the end |
+ player.currentTime = 4.0 |
+ |
+ player.reverse(); |
+ assert_equals(player.currentTime, 3.0, "Current time after reversing"); |
+ assert_false(player.finished, "Finished state after reversing"); |
+ assert_equals(player.playbackRate, -1, "Playback rate after reversing"); |
+ |
+ // Check we actually reverse |
+ at(0.2, function() { |
+ assert_equals(player.currentTime, 2.8, "Current time after beginning reverse"); |
+ assert_false(player.finished, "Finished state after reversing"); |
+ }); |
+ }, "reverse() when seeked past end"); |
+ |
+// Test player current time after adjusting start time. |
+test(function() { |
+ var player = createPlayer(3); |
+ |
+ player.startTime = 1; |
+ |
+ assert_equals(player.currentTime, -1, "currentTime while waiting to start"); |
+ assert_false(player.finished, "Finished state while waiting to start"); |
+ |
+ // Then put it in range |
+ player.startTime -= 2; |
+ assert_equals(player.currentTime, 1, "currentTime after updating start time"); |
+ assert_false(player.finished, "Finished state while after updating start time"); |
+ }, "Adjust start time (1)"); |
+ |
+// Test player current time after adjusting start time and playing. |
+timing_test(function() { |
+ var player = createPlayer(3); |
+ |
+ player.startTime = 1; |
+ |
+ assert_equals(player.currentTime, -1, "currentTime while waiting to start"); |
+ assert_false(player.finished, "Finished state while waiting to start"); |
+ |
+ // Then adjust start time |
+ player.startTime -= 0.75; |
+ |
+ // Check player is still waiting |
+ assert_equals(player.currentTime, -0.25, "currentTime while waiting to start"); |
+ assert_false(player.finished, "Finished state while still waiting to start"); |
+ |
+ // Verify the time *did* update though |
+ at(0.5, function() { |
+ assert_equals(player.currentTime, 0.25, "currentTime after starting to play"); |
+ assert_false(player.finished, "Finished state after starting to play"); |
+ }); |
+ }, "Adjust start time (2)"); |
+ |
+// Test player bounding by changing start time. |
+test(function() { |
+ var player = createPlayer(3); |
+ |
+ // Put it past the end |
+ player.startTime = -4; |
+ assert_equals(player.currentTime, 3, "currentTime after end"); |
+ assert_true(player.finished, "Finished state after end"); |
+ }, "Adjust start time (3)"); |
+ |
+// Test bounding and unbounding a player by modifying start time. |
+test(function() { |
+ var player = createPlayer(3); |
+ |
+ // Put player in limited stage |
+ player.startTime = -4; |
+ |
+ assert_equals(player.currentTime, 3, "currentTime state while limited"); |
+ assert_true(player.finished, "Finished state while limited"); |
+ |
+ // Then put it in range |
+ player.startTime += 2; |
+ assert_equals(player.currentTime, 2, "currentTime after updating start time"); |
+ assert_false(player.finished, "Finished state while after updating start time"); |
+ }, "Adjust start time (4)"); |
+ |
+// Test seeking past end of player |
+timing_test(function() { |
+ var player = createPlayer(3); |
+ player.currentTime = 4; |
+ assert_equals(player.currentTime, 4, "currentTime before waiting"); |
+ at(0.2, function() { |
+ assert_equals(player.currentTime, 4, "currentTime after waiting"); |
+ }); |
+ }, "Seeking past player content end and waiting"); |
+ |
+// Test seeking before start of reversed player |
+timing_test(function() { |
+ var player = createPlayer(3); |
+ player.playbackRate = -1; |
+ player.currentTime = -1; |
+ assert_equals(player.currentTime, -1, "currentTime before waiting"); |
+ at(0.2, function() { |
+ assert_equals(player.currentTime, -1, "currentTime after waiting"); |
+ }); |
+ }, "Seeking before reversed player content start and waiting"); |
+ |
+// Test reversing the playback rate of a bounded player. |
+timing_test(function() { |
+ var player = createPlayer(3); |
+ |
+ // Set up player to start in 0.1s |
+ player.startTime = 0.1; |
+ |
+ // Check state |
+ assert_equals(player.currentTime, -0.1, "currentTime after while waiting to start"); |
+ assert_false(player.finished, "Finished state while waiting to start"); |
+ |
+ // Reverse playbackRate |
+ player.playbackRate = -1; |
+ |
+ // We should maintain the same current time |
+ assert_equals(player.currentTime, -0.1, "currentTime after updating playbackRate"); |
+ assert_true(player.finished, "Finished state after updating playbackRate"); |
+ |
+ // If we wait a while we should be stuck at the end |
+ at(0.2, function() { |
+ assert_equals(player.currentTime, -0.1, "currentTime after waiting"); |
+ assert_true(player.finished, "Finished state after waiting"); |
+ |
+ // Call play and we should start from the end |
+ player.play(); |
+ assert_equals(player.currentTime, 3, "currentTime after play()"); |
+ assert_false(player.finished, "Finished state after play()"); |
+ }); |
+ }, "Reversing playbackRate before start"); |
+ |
+// Test normal current time progression of a player after being bounded and unbounded. |
+timing_test(function() { |
+ // Set up player |
+ var player = createPlayer(3); |
+ |
+ // Seek to bounded time |
+ player.currentTime = 4; |
+ |
+ // Check state |
+ assert_equals(player.currentTime, 4, "currentTime while bounded"); |
+ assert_true(player.finished, "Finished state while bounded"); |
+ |
+ // Seek to unbounded time |
+ player.currentTime = 2; |
+ assert_equals(player.currentTime, 2, "currentTime while unbounded"); |
+ assert_false(player.finished, "Finished state while unbounded"); |
+ |
+ // Check it actually is playing |
+ at(0.2, function() { |
+ assert_equals(player.currentTime, 2.2, "Current time after playing unbounded"); |
+ }); |
+ }, "Seeking from end to playing"); |
+ |
+// Test finishing and replaying a player in reverse. |
+timing_test(function() { |
+ // Set up player |
+ var player = createPlayer(3); |
+ |
+ // Seek to middle of interval and reverse |
+ player.currentTime = 2; |
+ player.reverse(); |
+ |
+ // Check state |
+ assert_equals(player.currentTime, 2, "currentTime after reversing"); |
+ assert_false(player.finished, "Finished state after reversing"); |
+ assert_equals(player.playbackRate, -1, "Playback rate after reversing"); |
+ player.finish(); |
+ assert_equals(player.currentTime, 0, "currentTime after finishing"); |
+ assert_true(player.finished, "Finished state after finishing"); |
+ |
+ // Then play again |
+ player.play(); |
+ assert_equals(player.currentTime, 3, "currentTime after playing again"); |
+ assert_false(player.finished, "Finished state after playing again"); |
+ |
+ // Check if actually progresses |
+ at(0.2, function() { |
+ assert_equals(player.currentTime, 2.8, "Current time after playing for a while"); |
+ }); |
+ }, "play() on a finished reversed player"); |
+ |
+// Test player.play() seeking to start when behind the source content. |
+timing_test(function() { |
+ // Set up player to start in 2s |
+ var player = createPlayer(3); |
+ player.startTime = 2; |
+ |
+ // Check it is waiting to start |
+ assert_equals(player.currentTime, -2, "currentTime while waiting"); |
+ assert_false(player.finished, "Finished state while waiting"); |
+ |
+ // Call play() |
+ player.play(); |
+ assert_equals(player.currentTime, 0, "currentTime after calling play()"); |
+ assert_false(player.finished, "Finished state after calling play()"); |
+ |
+ // Check it really is playing |
+ at(0.5, function() { |
+ assert_equals(player.currentTime, 0.5, "Current time after playing for a while"); |
+ }); |
+ }, "play() on player waiting to start kick-starts it"); |
+ |
+// Test seeking a player to the start of its animation. |
+timing_test(function() { |
+ // Set up player to start in 2s |
+ var player = createPlayer(3); |
+ player.startTime = 2; |
+ |
+ // Check it is waiting to start |
+ assert_equals(player.currentTime, -2, "currentTime while waiting"); |
+ assert_false(player.finished, "Finished state while waiting"); |
+ |
+ // Set currentTime = 0 |
+ player.currentTime = 0; |
+ assert_equals(player.currentTime, 0, "currentTime after setting currentTime = 0"); |
+ assert_false(player.finished, "Finished state after setting currentTime = 0"); |
+ |
+ // Check it is playing |
+ at(0.5, function() { |
+ assert_equals(player.currentTime, 0.5, "currentTime after waiting a while"); |
+ assert_false(player.finished, "Finished state after waiting a while"); |
+ }); |
+ }, "currentTime = 0 on player waiting to start is ok"); |
+ |
+// Test player becoming unbounded after source content is extended. |
+timing_test(function() { |
+ var player = createPlayer(3); |
+ |
+ player.currentTime = 4; |
+ assert_equals(player.currentTime, 4, "currentTime after setting currentTime = 4"); |
+ assert_true(player.finished, "Finished state after setting currentTime = 4"); |
+ |
+ // Check it is NOT playing |
+ at(0.2, function() { |
+ assert_equals(player.currentTime, 4, "currentTime after waiting a while"); |
+ |
+ // Extend source |
+ player.source.specified.duration = 5; |
+ assert_equals(player.currentTime, 4, "currentTime after extending source"); |
+ assert_false(player.finished, "Finished state after extending source"); |
+ |
+ // Check it IS playing |
+ at(0.2, function() { |
+ assert_equals(player.currentTime, 4.2, "currentTime after waiting a while again"); |
+ }); |
+ }); |
+ }, "Extending source unblocks player (seek past end)"); |
+ |
+// Test player ending normally and becoming unbounded after source content is extended. |
+timing_test(function() { |
+ var player = createPlayer(3); |
+ |
+ // Set currentTime to just before the end |
+ player.currentTime = 2.9; |
+ assert_false(player.finished, "Finished state just before ending"); |
+ |
+ // Play to end |
+ at(0.2, function() { |
+ assert_equals(player.currentTime, 3, "currentTime after ending normally"); |
+ assert_true(player.finished, "Finished state after ending normally"); |
+ |
+ // Extend source |
+ player.source.specified.duration = 5; |
+ assert_equals(player.currentTime, 3.0, "currentTime after extending source"); |
+ assert_false(player.finished, "Finished state after extending source"); |
+ |
+ // Check it is playing |
+ at(0.2, function() { |
+ assert_equals(player.currentTime, 3.2, "currentTime after waiting a while again"); |
+ }); |
+ }); |
+ }, "Extending source unblocks player (end normally)"); |
+ |
+// Test player becomes bounded after source content is shortened. |
+timing_test(function() { |
+ var player = createPlayer(3); |
+ |
+ // Set currentTime to just before the end |
+ player.currentTime = 2; |
+ assert_equals(player.currentTime, 2.0, "currentTime before shortening"); |
+ assert_false(player.finished, "Finished state before shortening"); |
+ |
+ // Shorten source |
+ player.source.specified.duration = 1; |
+ assert_equals(player.currentTime, 2.0, "currentTime after shortening"); |
+ assert_true(player.finished, "Finished state after shortening"); |
+ |
+ // Check it is not playing |
+ at(0.2, function() { |
+ assert_equals(player.currentTime, 2.0, "currentTime after shortening"); |
+ }); |
+ }, "Shortening source blocks player"); |
+ |
+// Test playing player becomes bounded after source content is shortened. |
+timing_test(function() { |
+ var player = createPlayer(3); |
+ |
+ // Set currentTime to midway |
+ player.currentTime = 1.5; |
+ assert_equals(player.currentTime, 1.5, "currentTime before shortening"); |
+ assert_false(player.finished, "Finished state after seeking"); |
+ |
+ // Let it play for a while |
+ at(0.2, function() { |
+ assert_equals(player.currentTime, 1.7, "currentTime before shortening"); |
+ assert_false(player.finished, "Finished state before shortening"); |
+ |
+ // Shorten source |
+ player.source.specified.duration = 1; |
+ assert_equals(player.currentTime, 1.7, "currentTime after shortening"); |
+ assert_true(player.finished, "Finished state after shortening"); |
+ }); |
+ }, "Shortening source blocks player when playing"); |
+ |
+// Test reversed player does not become bounded after its source content is shortened. |
+timing_test(function() { |
+ var player = createPlayer(3); |
+ |
+ // Set currentTime to just before the end |
+ player.currentTime = 2; |
+ player.reverse(); |
+ assert_equals(player.currentTime, 2.0, "currentTime before shortening"); |
+ assert_false(player.finished, "Finished state before shortening"); |
+ |
+ // Shorten source |
+ player.source.specified.duration = 1; |
+ assert_equals(player.currentTime, 2.0, "currentTime after shortening"); |
+ assert_false(player.finished, "Finished state after shortening"); |
+ |
+ // Check it is playing |
+ at(0.2, function() { |
+ assert_equals(player.currentTime, 1.8, "currentTime after shortening"); |
+ }); |
+ }, "Shortening source does not block in reverse"); |
+ |
+// Test player becoming unbounded after duration 0 source content is extended. |
+timing_test(function() { |
+ // Add empty animation |
+ var player = createPlayer(0); |
+ |
+ // Check we don't progress |
+ assert_equals(player.currentTime, 0, "currentTime before adding content"); |
+ assert_true(player.finished, "Finished state before adding content"); |
+ |
+ // Wait and check we don't progress |
+ at(0.2, function() { |
+ assert_equals(player.currentTime, 0, "currentTime after waiting"); |
+ assert_true(player.finished, "Finished state after waiting"); |
+ |
+ // "Add" content |
+ player.source.specified.duration = 3; |
+ |
+ // We should pick up from 0, not jump 0.2s in |
+ assert_equals(player.currentTime, 0, "currentTime after extending"); |
+ assert_false(player.finished, "Finished state after extending"); |
+ |
+ // Wait and check |
+ at(0.2, function() { |
+ assert_equals(player.currentTime, 0.2, "currentTime after extending and waiting"); |
+ }); |
+ }); |
+ }, "Async add content"); |
+ |
+// Test negative player playback rate with negative current time. |
+timing_test(function() { |
+ var player = createPlayer(3); |
+ |
+ // Set a negative time and let it play for a while |
+ player.currentTime = -1; |
+ at(0.2, function() { |
+ assert_equals(player.currentTime, -0.8, "currentTime after waiting"); |
+ assert_false(player.finished, "Finished state after waiting"); |
+ |
+ // Reverse |
+ player.playbackRate = -1; |
+ assert_equals(player.currentTime, -0.8, "currentTime after reversing"); |
+ assert_true(player.finished, "Finished state after reversing"); |
+ }); |
+ }, "Setting negative playback rate in negative space"); |
+ |
+// Test reversed player becoming bounded when start of animation is reached. |
+timing_test(function() { |
+ var player = createPlayer(3); |
+ |
+ // Seek to just before end |
+ player.reverse(); |
+ player.currentTime = 0.1; |
+ |
+ // Check state of player |
+ assert_equals(player.currentTime, 0.1, "Current time just before end"); |
+ assert_false(player.paused, "Paused state just before end"); |
+ assert_false(player.finished, "Finished state just before end"); |
+ |
+ // Check player after finishing |
+ at(0.2, function() { |
+ assert_equals(player.currentTime, 0, "Current time when limited"); |
+ assert_false(player.paused, "Paused state after ending"); |
+ assert_true(player.finished, "Finished state after ending"); |
+ }); |
+}, "Limiting at start"); |
+ |
+// Test the floating point accuracy of seeking a player. |
+test(function() { |
+ var player = createPlayer(3); |
+ // Setting a high playbackRate has caused the reported currentTime to differ |
+ // from what was set in previous implementations of Player. |
+ player.playbackRate = 123456; |
+ player.currentTime = 1.618; |
+ assert_equals(player.currentTime, 1.618, "currentTime after seeking to fractional time"); |
+ }, "currentTime preserves floating point accuracy after seeking"); |
+</script> |