Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test gets skipped with pattern: os == 'linux' && os_version == '24.04' && arch == 'x86_64' && debug && verify-standalone
- Manifest: dom/base/test/mochitest.toml
<!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>