<!DOCTYPE html>
<title>Access to the Encrypted Media API is deferred</title>
<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());

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/encrypted-media.https.html?config=support&uid=${uid}`;
  window.open(url, '_blank', 'noopener');

  const result = await gotMessage;
  const expected = [
    {
      event: 'started waiting navigator.requestMediaKeySystemAccess',
      prerendering: true
    },
    {
      event: 'prerendering change',
      prerendering: false
    },
    {
      event: 'finished waiting navigator.requestMediaKeySystemAccess',
      prerendering: false
    },
  ];
  assert_equals(result.length, expected.length);
  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('');
}, `the access to the Encrypted Media API should be deferred until the
    prerendered page is activated`);
</script>
