<!DOCTYPE html>
<title>Test WorkerGlobalScope.close functionality.</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
setup({ allow_uncaught_exception: true });

async_test(function(t) {
  var worker = new Worker('support/WorkerGlobalScope-close.js');
  worker.postMessage("typeofClose");
    worker.onmessage = t.step_func_done(function(evt) {
    assert_equals(evt.data, "typeof close: function");
    });
}, 'Test type of close function.');

async_test(function(t) {
  var worker = new Worker('support/WorkerGlobalScope-close.js');
  worker.postMessage("ping");
  worker.onmessage = t.step_func(function(evt) {
    assert_equals(evt.data, "pong");
    // Tell the worker to close, then send a followup message.
    worker.postMessage("close");

    // The worker may or may not be closing/closed by this call. If it is, the
    // message won't be enqueued on the worker's event loop. If it isn't, the
    // message will be enqueued but shouldn't be handled by the worker because
    // the prior postMessage will cause the worker to close. In either case,
    // the worker shouldn't postMessage back "pong".
    //
    // This also means that at this point we can't confidently test
    // postMessage-ing a worker that will close nor a worker that is already
    // closing/closed.
    worker.postMessage("ping");

    worker.onmessage = t.step_func(function(evt) {
      assert_not_equals(evt.data, "pong");

      // The worker should definitely be closed by now, so we can confidently
      // test postMessage-ing a closed worker. This postMessage shouldn't throw
      // or cause the worker to postMessage back "pong" (it shouldn't receive
      // any events after closing).
      worker.postMessage("ping");

      t.step_timeout(function() { t.done(); }, 500);
    });
  });
}, 'Test sending a message after closing.');

async_test(function(t) {
  var worker = new Worker('support/WorkerGlobalScope-close.js');
  worker.postMessage("closeWithError");
  worker.onerror = function(event) {
    t.done()
  };
}, 'Test errors are delivered after close.');

async_test(function(t) {
  var worker = new Worker('support/WorkerGlobalScope-close.js');
  worker.postMessage("closeWithPendingEvents");
  worker.onmessage = t.step_func(function(evt) {
    assert_unreached("Pending events should not fire: " + evt.data);
  });
  worker.onerror = t.step_func(function(evt) {
    assert_unreached("Pending events should not fire:" + evt.message);
  });
  t.step_timeout(function() { t.done(); }, 500);
}, 'Test workers do not deliver pending events.');

async_test(function(t) {
  var worker = new Worker('support/WorkerGlobalScope-close.js');
  worker.postMessage("close");
  worker.onmessage = function(evt) {
    assert_equals(evt.data, "Should be delivered");
    // Give worker a chance to close first, then terminate it.
    t.step_timeout(function() {
      worker.terminate();
      t.done();
    }, 500);
  };
}, 'Test terminating a worker after close.');
</script>
