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

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}&target_hint=${getTargetHint()}`;
  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>
