<!doctype html>
<html>
<head><title>Frozen Window</title></head>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/common/utils.js"></script>
<body>
<h1>This window will be frozen</h1>
<iframe id="child_frame" src="child.html"></iframe>
<script>

const freezingStepName = 'testOnFreeze';

function testFetch(keepalive) {
  var request_token = token();
  var name = 'testfetch' + (keepalive ? 'with' : 'without') + 'keepalive';
  window.opener.add_step(name);

  function handler() {
    window.opener.step_fail(name);
  }

  fetch('beacon.py?token=' + request_token, {
    keepalive: keepalive
  }).then(() => handler()).catch(() => handler());

  window.opener.poll_for_result(request_token, name, keepalive);
}

function testXHR(async) {
  var request_token = token();
  var name = 'test' + (async ? 'Async' : 'Sync') + 'XHR';
  window.opener.add_step(name);
  var xhr = new XMLHttpRequest();
  xhr.onreadystatechange = () => {
    if (xhr.readyState === 4) {
      if (xhr.status === 0)
        window.opener.step_success(name);
      else
        window.opener.step_fail(name);
    }
  }
  xhr.open('GET', 'beacon.py?token=' + request_token, async);
  try {
    xhr.send(null);
    if (async) {
      window.opener.poll_for_result(request_token, name, false);
    }
  } catch {
    window.opener.step_success(name);
  };
}

function testSendBeacon() {
  var request_token = token();
  var name = 'testSendBeacon';
  window.opener.add_step(name);
  if (navigator.sendBeacon("beacon.py?token=" + request_token, "")) {
    window.opener.poll_for_result(request_token, name, true);
  } else {
    window.opener.step_fail(name);
  }
}

window.document.addEventListener("freeze", () => {
  // Testing fetch, only fetch keepalive should succeed.
  testFetch(true /* keepalive */);
  testFetch(false /* keepalive */);
  // Testing XHR, both sync and async should fail.
  testXHR(true /* async */);
  testXHR(false /* sync */);
  // Testing navigator.sendBeacon, which should be allowed.
  testSendBeacon();
  window.opener.step_success(freezingStepName);
});

onload = function() {
  window.opener.add_step(freezingStepName);
  test_driver.freeze();
};

</script>
</body>
</html>
