wpt / css / selectors / media / media-loading-state-timing.sub.html

Status: FAIL | Duration: 43ms | Subtests: 0/1 | Open test on wpt.live | wpt.fyi

/css/selectors/media/media-loading-state-timing.sub.html

<!DOCTYPE html>
<title>Media Loading State: the :buffering and :stalled pseudo-classes</title>
<link rel="help" href="https://drafts.csswg.org/selectors/#media-loading-state">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/media.js"></script>
<body>
  <video width="300" height="300" muted autoplay></video>
  <script>
    // The order of "is currently stalled" changing and events firing changed in
    // https://github.com/whatwg/html/pull/11959 so that "is currently stalled"
    // is set before the stalled event fires. :stalled also requires readyState
    // to be HAVE_CURRENT_DATA or less, which is indicated by the waiting event.
    // Since the spec does not guarantee the order of stalled and waiting, we
    // await both before checking :stalled.
    //
    // This uses a Python custom handler that sends the initial part of the
    // video and then waits for a POST request to send the rest.
    const key = "{{uuid()}}";

    // Wait for the load event so that the video delaying-the-load-event flag
    // doesn't interact with the test harness.
    window.addEventListener("load", () => {
      promise_test(async (t) => {
        assert_implements(CSS.supports("selector(:stalled)"),
          ":stalled is not supported");
        const video = document.querySelector("video");

        const waitingPromise = new Promise(
          r => video.addEventListener("waiting", r, { once: true }));
        const stalledPromise = new Promise(
          r => video.addEventListener("stalled", r, { once: true }));

        video.src = `support/stall-resume.py?video&key=${key}`;
        video.play();

        await Promise.all([waitingPromise, stalledPromise]);
        assert_true(video.matches(":stalled"),
          ":stalled matches after waiting and stalled events");

        fetch(`support/stall-resume.py?resume&key=${key}`, { method: 'POST' });
        await new Promise(
          r => video.addEventListener("timeupdate", r, { once: true }));
        assert_false(video.matches(":stalled"),
          ":stalled does not match after media recovers from stalled");
      }, "Test :stalled timing relative to waiting and timeupdate events");
    });
  </script>
</body>