<!DOCTYPE html>
<title>Test sending multiple ports through Worker.postMessage.</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
async_test(function(t) {
  var worker = new Worker("support/Worker-thread-multi-port.js");
  worker.onmessage = t.step_func_done(function(evt) {
    assert_true(evt.data.startsWith('PASS'));
  });
  worker.postMessage("noport");
}, 'Test postMessage with no port.');

async_test(function(t) {
  var worker = new Worker("support/Worker-thread-multi-port.js");
  worker.onmessage = t.step_func_done(function(evt) {
    assert_true(evt.data.startsWith('PASS'));
  });
  worker.postMessage("noargs");
}, 'Test postMessage with no arguments.');

async_test(function(t) {
  var worker = new Worker("support/Worker-thread-multi-port.js");
  worker.onmessage = t.step_func_done(function(evt) {
    assert_true(evt.data.startsWith('PASS'));
  });
  worker.postMessage("zero ports", []);
}, 'Test postMessage with no ports and empty array.');

async_test(function(t) {
  var worker = new Worker("support/Worker-thread-multi-port.js");
  var channel = new MessageChannel();
  worker.onmessage = t.step_func_done(function(evt) {
    assert_true(evt.data.startsWith('PASS'));
  });
  worker.postMessage("two ports", [channel.port1, channel.port2]);
}, 'Test postMessage with two ports.');

test(() => {
  var worker = new Worker("support/Worker-thread-multi-port.js");
  assert_throws(new TypeError(),
                function() { worker.postMessage(); },
                'Empty postMessage should throw exception.');
}, 'Test empty postMessage throws exception.');

test(() => {
  var worker = new Worker("support/Worker-thread-multi-port.js");
  var channel = new MessageChannel();
  assert_throws(new TypeError(),
                function() { worker.postMessage("null port",
                                                [channel.port1, null,
                                                 channel.port2]); },
                'postMessage with null ports should throw exception.');
}, 'Test postMessage with null ports throws exception.');

test(() => {
  var worker = new Worker("support/Worker-thread-multi-port.js")
  var channel = new MessageChannel();
  assert_throws(new TypeError(),
                function() { worker.postMessage("notAPort",
                                                [channel.port1, {},
                                                 channel.port2]); },
                'postMessage with incorrect ports should throw exception.');
}, 'Test postMessage with incorrect ports throws exception');

test(() => {
  var worker = new Worker("support/Worker-thread-multi-port.js");
  assert_throws(new TypeError(),
                function() { worker.postMessage("notASequence", [{length: 3}]) },
                'postMessage without sequence should throw exception.');
}, 'Test postMessage without sequence throws exception');

async_test(function(t) {
  var worker = new Worker("support/Worker-thread-multi-port.js");
  var channel = new MessageChannel();
  assert_throws(new TypeError(),
                function() { worker.postMessage("notAPort",
                                                [channel.port1, {},
                                                 channel.port2]); },
                'postMessage with incorrect ports should throw exception.');
  worker.onmessage = t.step_func_done(function(evt) {
    assert_true(evt.data.startsWith('PASS'));
  });
  worker.postMessage("failed ports", [channel.port1, channel.port2]);
}, 'Test postMessage on channel with previous failed postMessage calls.');
</script>
