diff options
Diffstat (limited to 'testing/web-platform/tests/html/semantics/embedded-content/media-elements/ready-states')
3 files changed, 156 insertions, 0 deletions
diff --git a/testing/web-platform/tests/html/semantics/embedded-content/media-elements/ready-states/autoplay-hidden.optional.html b/testing/web-platform/tests/html/semantics/embedded-content/media-elements/ready-states/autoplay-hidden.optional.html new file mode 100644 index 0000000000..16c6e29be9 --- /dev/null +++ b/testing/web-platform/tests/html/semantics/embedded-content/media-elements/ready-states/autoplay-hidden.optional.html @@ -0,0 +1,37 @@ +<!doctype html> +<title>autoplay hidden</title> +<link rel="author" title="Intel" href="http://www.intel.com"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/media.html#ready-states"/> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/media.js"></script> +<div id="log"></div> +<script> + +// https://html.spec.whatwg.org/multipage/media.html#ready-states:eligible-for-autoplay-2 + +promise_test(async t => { + let video = document.createElement("video"); + video.src = getVideoURI("/media/movie_5"); + video.autoplay = true; + // In Safari, Chrome and Firefox, the video needs to be muted in order to be + // paused when hidden. They decided to do this in order to save resources when + // a video goes out of view and isn't expected to make any sound. + video.muted = true; + video.loop = true; + let watcher = new EventWatcher(t, video, ["playing", "pause"]); + document.body.appendChild(video); + + await watcher.wait_for("playing"); + assert_false(video.paused, "paused when video is display"); + video.hidden = true; + + await watcher.wait_for("pause"); + assert_true(video.paused, "paused when video is hidden"); + video.hidden = false; + + await watcher.wait_for("playing"); + assert_false(video.paused, "paused when video is display"); +}, "Allow delaying autoplay until video elements become visible"); + +</script> diff --git a/testing/web-platform/tests/html/semantics/embedded-content/media-elements/ready-states/autoplay-with-slow-text-tracks.html b/testing/web-platform/tests/html/semantics/embedded-content/media-elements/ready-states/autoplay-with-slow-text-tracks.html new file mode 100644 index 0000000000..930d9cbd5b --- /dev/null +++ b/testing/web-platform/tests/html/semantics/embedded-content/media-elements/ready-states/autoplay-with-slow-text-tracks.html @@ -0,0 +1,46 @@ +<!doctype html> +<title>autoplay with slow text tracks</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/media.js"></script> +<div id="log"></div> +<script> +setup({ single_test: true }); +// https://html.spec.whatwg.org/#ready-states says: +// +// HAVE_FUTURE_DATA: "the text tracks are ready". +// HAVE_ENOUGH_DATA: All the conditions described for the HAVE_FUTURE_DATA state are met, ... +// +// When the ready state of a media element whose networkState is not NETWORK_EMPTY changes, +// the user agent must follow the steps given below: +// If the new ready state is HAVE_ENOUGH_DATA +// (autoplay) +// +// So if the text tracks are not yet ready, we can't autoplay. + +var started = 0; +var numOfTests = 5; + +function createTest() { + var video = document.createElement('video'); + video.src = getVideoURI('/media/movie_5'); + video.autoplay = true; + video.muted = true; + video.controls = true; + video.onplaying = function() { + started++; + assert_equals(track.track.cues.length, 1); + if (started === numOfTests) { + done(); + } + }; + var track = document.createElement('track'); + track.src = '/media/foo.vtt?pipe=trickle(d2)'; + track.default = true; + video.appendChild(track); + document.body.appendChild(video); +} +for (var i = 0; i < numOfTests; ++i) { + createTest(); +} +</script> diff --git a/testing/web-platform/tests/html/semantics/embedded-content/media-elements/ready-states/autoplay.html b/testing/web-platform/tests/html/semantics/embedded-content/media-elements/ready-states/autoplay.html new file mode 100644 index 0000000000..b60b58a421 --- /dev/null +++ b/testing/web-platform/tests/html/semantics/embedded-content/media-elements/ready-states/autoplay.html @@ -0,0 +1,73 @@ +<!doctype html> +<title>autoplay</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/media.js"></script> +<div id="log"></div> +<script> +function autoplay_test(tagName, src) { + function expect_events(t, e, expected_events) { + var actual_events = []; + var callback = t.step_func(function(ev) { + actual_events.push(ev.type); + assert_array_equals(actual_events, + expected_events.slice(0, actual_events.length)); + if (expected_events.length == actual_events.length) { + t.done(); + } + }); + ['canplay', 'canplaythrough', + 'pause', 'play', 'playing', 'error'].forEach(function(type) { + e.addEventListener(type, callback); + }); + } + + async_test(function(t) { + var e = document.createElement(tagName); + e.src = src; + e.autoplay = true; + expect_events(t, e, ['canplay', 'play', 'playing', 'canplaythrough']); + }, tagName + '.autoplay'); + + async_test(function(t) { + var e = document.createElement(tagName); + e.src = src; + e.autoplay = true; + e.pause(); // sets the autoplaying flag to false + e.load(); // sets the autoplaying flag to true + expect_events(t, e, ['canplay', 'play', 'playing', 'canplaythrough']); + }, tagName + '.autoplay and load()'); + + async_test(function(t) { + var e = document.createElement(tagName); + e.src = src; + e.autoplay = true; + e.play(); // sets the autoplaying flag to false + // play() also sets the paused attribute to false; there is no way for the + // autoplaying flag to be true when the paused attribute is false. + assert_equals(e.paused, false); + expect_events(t, e, ['play', 'canplay', 'playing', 'canplaythrough']); + }, tagName + '.autoplay and play()'); + + async_test(function(t) { + var e = document.createElement(tagName); + e.src = src; + e.autoplay = true; + e.pause(); // sets the autoplaying flag to false + expect_events(t, e, ['canplay', 'canplaythrough']); + }, tagName + '.autoplay and pause()'); + + async_test(function(t) { + var e = document.createElement(tagName); + e.src = src; + e.autoplay = true; + document.body.appendChild(e); + document.body.removeChild(e); + // in stable state, internal pause steps sets the autoplaying flag to false + expect_events(t, e, ['canplay', 'canplaythrough']); + }, tagName + '.autoplay and internal pause steps'); +} + +autoplay_test('audio', getAudioURI('/media/sound_5')); +autoplay_test('video', getVideoURI('/media/movie_5')); +</script> |