<!DOCTYPE html>
<script>
function fetch_url(url) {
  return new Promise(function(resolve, reject) {
      var request = new XMLHttpRequest();
      request.addEventListener('load', function(event) {
          resolve();
        });
      request.addEventListener('error', function(event) {
          reject();
        });
      request.open('GET', url);
      request.send();
    });
}

function make_test(testcase) {
  var name = testcase.name;
  return fetch_url(window.location.href + '?' + name)
    .then(
      function() {
          if (testcase.expect_load)
            return Promise.resolve();
          return Promise.reject(new Error(
              name + ': expected network error but loaded'));
        },
      function() {
          if (!testcase.expect_load)
            return Promise.resolve();
          return Promise.reject(new Error(
              name + ': expected to load but got network error'));
        });
}

function run_tests() {
  var tests = [
    { name: 'prevent-default-and-respond-with', expect_load: true },
    { name: 'prevent-default', expect_load: false },
    { name: 'reject', expect_load: false },
    { name: 'unused-body', expect_load: true },
    { name: 'used-body', expect_load: false },
    { name: 'unused-fetched-body', expect_load: true },
    { name: 'used-fetched-body', expect_load: false },
    { name: 'throw-exception', expect_load: true },
  ].map(make_test);

  Promise.all(tests)
    .then(function() {
        window.parent.notify_test_done('PASS');
      })
    .catch(function(error) {
        window.parent.notify_test_done('FAIL: ' + error.message);
      });
}

if (!navigator.serviceWorker.controller)
  window.parent.notify_test_done('FAIL: no controller');
else
  run_tests();
</script>
