<!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('DataCloneError',
                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('DataCloneError',
                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('DataCloneError',
                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>
