function ok(a, msg) { postMessage({ type: 'check', check: !!a, message: msg }); } function is(a, b, msg) { ok (a === b, msg); } function info(msg) { postMessage({ type: 'info', message: msg }); } function finish() { postMessage({ type: 'finish' }); } function basic() { var a = new MessageChannel(); ok(a, "MessageChannel created"); var port1 = a.port1; ok(port1, "MessageChannel.port1 exists"); is(port1, a.port1, "MessageChannel.port1 is port1"); var port2 = a.port2; ok(port2, "MessageChannel.port1 exists"); is(port2, a.port2, "MessageChannel.port2 is port2"); [ 'postMessage', 'start', 'close' ].forEach(function(e) { ok(e in port1, "MessagePort1." + e + " exists"); ok(e in port2, "MessagePort2." + e + " exists"); }); runTests(); } function sendMessages() { var a = new MessageChannel(); ok(a, "MessageChannel created"); a.port1.postMessage("Hello world!"); a.port1.onmessage = function(e) { is(e.data, "Hello world!", "The message is back!"); runTests(); } a.port2.onmessage = function(e) { a.port2.postMessage(e.data); } } function transferPort() { var a = new MessageChannel(); ok(a, "MessageChannel created"); a.port1.postMessage("Hello world!"); a.port1.onmessage = function(e) { is(e.data, "Hello world!", "The message is back!"); runTests(); } postMessage({ type: 'port' }, [a.port2]); } function transferPort2() { onmessage = function(evt) { is(evt.ports.length, 1, "A port has been received by the worker"); evt.ports[0].onmessage = function(e) { is(e.data, 42, "Data is 42!"); runTests(); } } postMessage({ type: 'newport' }); } var tests = [ basic, sendMessages, transferPort, transferPort2, ]; function runTests() { if (!tests.length) { finish(); return; } var t = tests.shift(); t(); } var subworker; onmessage = function(evt) { if (evt.data == 0) { runTests(); return; } if (!subworker) { info("Create a subworkers. ID: " + evt.data); subworker = new Worker('worker_messageChannel.js'); subworker.onmessage = function(e) { info("Proxy a message to the parent."); postMessage(e.data, e.ports); } subworker.postMessage(evt.data - 1); return; } info("Dispatch a message to the subworker."); subworker.postMessage(evt.data, evt.ports); }