| <!DOCTYPE html> | |
| <html> | |
| <head> | |
| <script src=media-file.js></script> | |
| <script src=video-test.js></script> | |
| <script> | |
| var seekCount = 0; | |
| var playCount = 0; | |
| function play() | |
| { | |
| if (video.readyState < HTMLMediaElement.HAVE_METADATA) { | |
| setTimeout(play, 100); | |
| return; | |
| } | |
| if (++playCount > 1) | |
| return; | |
| consoleWrite("<br><em>++ seek to near the end, wait for 'seeked' event to announce loop.</em>"); | |
| testExpected("video.paused", false); | |
| // Pause playback so the movie can't possibly loop before the seeked event fires | |
| run("video.pause()"); | |
| waitForEvent("seeked", seeked); | |
| run("video.currentTime = video.duration - 0.4"); | |
| consoleWrite(""); | |
| } | |
| function seeked() | |
| { | |
| switch (++seekCount) | |
| { | |
| case 1: | |
| consoleWrite("<br><em>++ first seek completed, beginning playback.</em>"); | |
| testExpected("video.paused", true); | |
| testExpected("video.ended", false); | |
| run("video.play()"); | |
| consoleWrite(""); | |
| break; | |
| case 2: | |
| consoleWrite("<br><em>++ second seek completed because video looped, toggle 'loop' and seek to near end again.</em>"); | |
| testExpected("video.paused", false); | |
| testExpected("video.ended", false); | |
| run("video.pause()"); | |
| testExpected("mediaElement.currentTime", 0, '>='); | |
| // don't use "testExpected()" so we won't log the actual duration as the floating point result may differ with different engines | |
| reportExpected(mediaElement.currentTime < mediaElement.duration, "mediaElement.currentTime", "<", "mediaElement.duration", mediaElement.currentTime); | |
| run("video.loop = false"); | |
| run("video.currentTime = video.duration - 0.4"); | |
| consoleWrite(""); | |
| break; | |
| case 3: | |
| consoleWrite("<br><em>++ third seek completed, beginning playback for the last time.</em>"); | |
| testExpected("video.paused", true); | |
| testExpected("video.ended", false); | |
| run("video.play()"); | |
| consoleWrite(""); | |
| break; | |
| default: | |
| failTest("Video should have only seeked three times."); | |
| break; | |
| } | |
| } | |
| function ended() | |
| { | |
| consoleWrite("<br><em>++ played to end and stopped.</em>"); | |
| testExpected("video.ended", true); | |
| // don't use "testExpected()" so we won't log the actual duration as the floating point result may differ with different engines | |
| reportExpected(mediaElement.currentTime == mediaElement.duration, "mediaElement.currentTime", "==", "mediaElement.duration", mediaElement.currentTime); | |
| consoleWrite(""); | |
| endTest(); | |
| } | |
| function start() | |
| { | |
| findMediaElement(); | |
| consoleWrite("<em>++ Test setting/removing the attribute.</em>"); | |
| testExpected("video.getAttribute('loop')", null); | |
| testExpected("video.loop", false); | |
| run("video.loop = true"); | |
| testExpected("video.loop", true); | |
| testExpected("video.getAttribute('loop')", null, "!="); | |
| run("video.removeAttribute('loop')"); | |
| testExpected("video.loop", false); | |
| waitForEvent('pause'); | |
| waitForEvent('play', play); | |
| waitForEvent("ended", ended); | |
| consoleWrite("<br><em>++ Set 'loop' to true and begin playing.</em>"); | |
| var mediaFile = findMediaFile("video", "content/test"); | |
| run("video.loop = true"); | |
| video.src = mediaFile; | |
| consoleWrite(""); | |
| } | |
| </script> | |
| </head> | |
| <body> | |
| <video controls autoplay ></video> | |
| <p><b>Test looping by:</b> | |
| <ol> | |
| <li>Play to end with 'loop' set to true.</li> | |
| <li>When 'seeked' event fires, verify that time has jumped back and movie is playing.</li> | |
| <li>Set 'loop' to false and play again.</li> | |
| <li>Verify that 'ended' event fires.</li> | |
| </ol> | |
| </p> | |
| <script>start()</script> | |
| </body> | |
| </html> |