<!DOCTYPE html>
<title>Access to the Battery Status 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);

  const gotMessage = new Promise(resolve => {
    bc.addEventListener('message', e => {
      resolve(e.data);
    }, {
      once: true
    });
  });
  const url = `resources/battery-status.https.html?uid=${uid}`;
  window.open(url, '_blank', 'noopener');

  const result = await gotMessage;
  const expected = [
    {event: 'started waiting navigator.getBattery',  prerendering: true},
    {event: 'prerendering change',                   prerendering: false},
    {event: 'finished waiting navigator.getBattery', 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}]`);
  }
  bc.close();

  // Send a close signal to PrerenderEventCollector on the prerendered page.
  new PrerenderChannel('close', uid).postMessage('');
}, `the access to the Battery Status API should be deferred until the
   prerendered page is activated`);
</script>
