<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="resources/testharness-helpers.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/test-helpers.sub.js"></script>
<script>

function sync_message(worker, message, transfer) {
  let wait = new Promise((res, rej) => {
    navigator.serviceWorker.addEventListener('message', function(e) {
        if (e.data === 'ACK') {
          res();
        } else {
          rej();
        }
      });
    });
  worker.postMessage(message, transfer);
  return wait;
}

function runTest(test, step, testBody) {
  var scope = './resources/' + step;
  var script = 'resources/extendable-event-async-waituntil.js?' + scope;
  return service_worker_unregister_and_register(test, script, scope)
    .then(function(registration) {
        test.add_cleanup(function() {
            return service_worker_unregister(test, scope);
          });

        let worker = registration.installing;
        var channel = new MessageChannel();
        var saw_message = new Promise(function(resolve) {
          channel.port1.onmessage = function(e) { resolve(e.data); }
        });

        return wait_for_state(test, worker, 'activated')
          .then(function() {
              return sync_message(worker, { step: 'init', port: channel.port2 },
                [channel.port2]);
            })
          .then(function() { return testBody(worker); })
          .then(function() { return saw_message; })
          .then(function(output) {
              assert_equals(output.result, output.expected);
            })
          .then(function() { return sync_message(worker, { step: 'done' }); });
      });
}

function msg_event_test(scope, test) {
  var testBody = function(worker) {
    return sync_message(worker, { step: scope });
  };
  return runTest(test, scope, testBody);
}

promise_test(msg_event_test.bind(this, 'no-current-extension-different-task'),
  'Test calling waitUntil in a different task without an existing extension throws');

promise_test(msg_event_test.bind(this, 'no-current-extension-different-microtask'),
  'Test calling waitUntil in a different microtask without an existing extension throws');

promise_test(msg_event_test.bind(this, 'current-extension-different-task'),
  'Test calling waitUntil in a different task with an existing extension succeeds');

promise_test(msg_event_test.bind(this, 'current-extension-expired-same-microtask-turn'),
  'Test calling waitUntil with an existing extension promise handler succeeds');

// The promise handler will queue a new microtask after the check for new
// extensions was performed.
promise_test(msg_event_test.bind(this, 'current-extension-expired-same-microtask-turn-extra'),
  'Test calling waitUntil at the end of the microtask turn throws');

promise_test(msg_event_test.bind(this, 'current-extension-expired-different-task'),
  'Test calling waitUntil after the current extension expired in a different task fails');

promise_test(msg_event_test.bind(this, 'script-extendable-event'),
  'Test calling waitUntil on a script constructed ExtendableEvent throws exception');

promise_test(function(t) {
    var testBody = function(worker) {
      return with_iframe('./resources/pending-respondwith-async-waituntil/dummy.html');
    }
    return runTest(t, 'pending-respondwith-async-waituntil', testBody);
  }, 'Test calling waitUntil asynchronously with pending respondWith promise.');

promise_test(function(t) {
    var testBody = function(worker) {
      return with_iframe('./resources/respondwith-microtask-sync-waituntil/dummy.html');
    }
    return runTest(t, 'respondwith-microtask-sync-waituntil', testBody);
  }, 'Test calling waitUntil synchronously inside microtask of respondWith promise.');

promise_test(function(t) {
    var testBody = function(worker) {
      return with_iframe('./resources/respondwith-microtask-async-waituntil/dummy.html');
    }
    return runTest(t, 'respondwith-microtask-async-waituntil', testBody);
  }, 'Test calling waitUntil asynchronously inside microtask of respondWith promise.');


</script>
