<!DOCTYPE HTML>
<html>
<head>
  <title>Test for postMessages cloning/transferring objects</title>
  <script src="/tests/SimpleTest/SimpleTest.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
  <script src="common_postMessages.js"></script>
</head>

<body>
<input id="fileList" type="file"></input>
<script type="application/javascript">

// PostMessage for MessagePort
tests.push(function test_messagePort() {
  info("Testing messagePort");

  var mc = new MessageChannel();
  var resolve;

  function resolvePromise(data) {
    if (!resolve) {
      ok(false, "Unexpected message!");
      return;
    }

    let tmp = resolve;
    resolve = null;
    tmp(data);
  }

  mc.port2.onmessage = function(e) {
    resolvePromise({ data: e.data, ports: e.ports, error: false });
  }

  mc.port2.onmessageerror = function(e) {
    resolvePromise({ error: true });
  }

  runTests({
    clonableObjectsEveryWhere: true,
    clonableObjectsSameProcess: true,
    transferableObjects: true,
    send(what, ports) {
      return new Promise(function(r, rr) {
        resolve = r;
        try {
          mc.port1.postMessage(what, ports);
        } catch(e) {
          resolve = null;
          rr();
        }
      });
    },

    finished() {
      next();
    }
  });
});

// PostMessage for MessagePort in Workers
tests.push(function test_messagePort_inWorkers() {
  info("Testing messagePort in workers");

  var mc = new MessageChannel();
  var resolve;

  var w = new Worker('worker_postMessages.js');
  w.postMessage('messagePort', [ mc.port2 ]);
  w.onmessage = function(e) {
    is(e.data, 'ok', "Worker ready!");

    w.onmessage = function(e1) {
      if (!resolve) {
        ok(false, "Unexpected message!");
        return;
      }

      let tmp = resolve;
      resolve = null;
      tmp({ data: e1.data, ports: e1.ports, error: e1.data === "error" });
    }

    runTests({
      clonableObjectsEveryWhere: true,
      clonableObjectsSameProcess: true,
      transferableObjects: true,
      send(what, ports) {
        return new Promise(function(r, rr) {
          resolve = r;
          try {
            mc.port1.postMessage(what, ports);
          } catch(ex) {
            resolve = null;
            rr();
          }
        });
      },

      finished() {
        w.terminate();
        next();
      }
    });
  }
});

SimpleTest.waitForExplicitFinish();
next();

</script>
</body>
</html>
