// How long (in ms) these tests should wait before deciding no further messages // will be received. const time_to_wait_for_messages = 100; async_test(t => { const c = new MessageChannel(); c.port1.onmessage = t.unreached_func('Should not have delivered message'); c.port1.close(); c.port2.postMessage('TEST'); setTimeout(t.step_func_done(), time_to_wait_for_messages); }, 'Message sent to closed port should not arrive.'); async_test(t => { const c = new MessageChannel(); c.port1.onmessage = t.unreached_func('Should not have delivered message'); c.port2.close(); c.port2.postMessage('TEST'); setTimeout(t.step_func_done(), time_to_wait_for_messages); }, 'Message sent from closed port should not arrive.'); async_test(t => { const c = new MessageChannel(); c.port1.onmessage = t.unreached_func('Should not have delivered message'); c.port1.close(); const c2 = new MessageChannel(); c2.port1.onmessage = t.step_func(e => { e.ports[0].postMessage('TESTMSG'); setTimeout(t.step_func_done(), time_to_wait_for_messages); }); c2.port2.postMessage('TEST', [c.port2]); }, 'Message sent to closed port from transferred port should not arrive.'); async_test(t => { const c = new MessageChannel(); let isClosed = false; c.port1.onmessage = t.step_func_done(e => { assert_true(isClosed); assert_equals(e.data, 'TEST'); }); c.port2.postMessage('TEST'); c.port2.close(); isClosed = true; }, 'Inflight messages should be delivered even when sending port is closed afterwards.'); async_test(t => { const c = new MessageChannel(); c.port1.onmessage = t.step_func_done(e => { if (e.data == 'DONE') t.done(); assert_equals(e.data, 'TEST'); c.port1.close(); }); c.port2.postMessage('TEST'); c.port2.postMessage('DONE'); }, 'Close in onmessage should not cancel inflight messages.'); test(() => { const c1 = new MessageChannel(); const c2 = new MessageChannel(); c1.port1.close(); assert_throws_dom("DataCloneError", () => c2.port1.postMessage(null, [c1.port1])); c2.port1.postMessage(null, [c1.port2]); }, "close() detaches a MessagePort (but not the one its entangled with)");