<!DOCTYPE html>
<title>Test that pages and workers can send MessagePorts to one another.</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
async_test(function(t) {
  var worker = new Worker("support/Worker-messageport.js");

  // Send messages with and without ports to the worker to make sure it gets them.
  worker.postMessage("noport");
  worker.onmessage = t.step_func_done(evt => {
    assert_equals(evt.data, "PASS: evt.ports = [] as expected");
  });
}, 'Test sending messages to workers with no port.');

async_test(function(t) {
  var worker = new Worker("support/Worker-messageport.js");
  var channel = new MessageChannel();

  worker.postMessage("port", [channel.port1]);
  worker.onmessage = t.step_func(evt => {
    assert_equals(evt.data, "PASS: Received message port");
  });

  // Send a message on the new port to make sure it gets to the worker.
  channel.port2.postMessage("ping");

  // Wait for the response.
  channel.port2.onmessage = t.step_func_done(evt => {
    assert_equals(evt.data, "pong");
  });
  channel.port2.start();
}, 'Test sending message to a worker on a port.');

async_test(function(t) {
  var worker = new Worker("support/Worker-messageport.js");
  var channel = new MessageChannel();

  worker.onmessage = t.step_func(evt => {
    assert_equals(evt.data, "port");
    assert_equals(String(evt.ports), "[object MessagePort]");
    assert_equals(evt.ports.length, 1);
    evt.ports[0].postMessage("ping");
    evt.ports[0].onmessage = t.step_func_done(evt => {
      assert_equals(evt.data, "pong");
    });
    evt.ports[0].start();
  });
  worker.postMessage("getport");
}, 'Test getting messages from a worker on a port.');

async_test(function(t) {
  var worker = new Worker("support/Worker-messageport.js");
  var channel = new MessageChannel();
  worker.onmessage = t.step_func(evt => { gotSpam(channel.port1); });
  worker.postMessage("spam", [channel.port2]);

  function gotSpam(port) {
    var spamCount = 0;
    port.onmessage = t.step_func(evt => {
      assert_equals(evt.data, spamCount);
      spamCount++;
      if (spamCount == 1000) {
        t.done();
      }
    });
  }
}, 'Test sending many messages to workers using ports.');
</script>
