<!DOCTYPE html>
<!--
The test aligns with the spec on which behavior is deferred. The test asserts
that media resources are not loaded during prerendering, but it's possible the
spec will allow loading and only disallow playback.
-->
<title>Access to the Play of the Media is deferred</title>
<meta name="variant" content="?target_hint=_self">
<meta name="variant" content="?target_hint=_blank">
<meta name="timeout" content="long">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/utils.js"></script>
<script src="../resources/utils.js"></script>
<script src="resources/utils.js"></script>

<body>
<script>
setup(() => assertSpeculationRulesIsSupported());

function RunTest(type, description) {
  promise_test(async t => {
    const uid = token();
    const bc = new PrerenderChannel('test-channel', uid);
    t.add_cleanup(_ => bc.close());

    const gotMessage = new Promise(resolve => {
      bc.addEventListener('message', e => {
        resolve(e.data);
      }, {
        once: true
      });
    });

    const url = `resources/media-play.html?type=${type}&uid=${uid}&target_hint=${getTargetHint()}`;
    window.open(url, '_blank', 'noopener');

    const result = await gotMessage;
    const expected = [
      {
        event: 'started waiting Media.Play',
        prerendering: true
      },
      {
        event: 'prerendering change',
        prerendering: false
      },
      {
        event: 'fired loadedmetadata event after prerendering is activated',
        prerendering: false
      },
      {
        event: 'finished waiting Media.Play',
        prerendering: false
      },
    ];

    assert_equals(result.length, expected.length, `${type}`);
    for (let i = 0; i < result.length; i++) {
      assert_equals(result[i].event, expected[i].event, `event${i}`);
      assert_equals(result[i].prerendering, expected[i].prerendering,
        `prerendering${i}`);
    }

    // Send a close signal to PrerenderEventCollector on the prerendered page.
    new PrerenderChannel('close', uid).postMessage('');
  }, description);
}

RunTest('audio', `play of the audio media should be deferred until the prerendered page is activated`);

RunTest('video', `play of the video media should be deferred until the prerendered page is activated`);
</script>
