<!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. This message
    // should not be delivered, since that would require JS to invoke the
    //  onmessage handler, which does not happen after the JS fragment with
    // 'close()' in it exits. So, the 'ping' should not come back as 'pong'.
    worker.postMessage("close");
    worker.postMessage("ping");
      worker.onmessage = t.step_func(function(evt) {
      assert_not_equals(evt.data, "pong");
      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>
