| <!DOCTYPE html> |
| <meta charset=utf-8> |
| <link rel="help" href="https://html.spec.whatwg.org/multipage/comms.html#dom-messageport-close"> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script> |
| // 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 c = new MessageChannel(); |
| c.port1.close(); |
| assert_throws("DataCloneError", () => self.postMessage(null, "*", [c.port1])); |
| self.postMessage(null, "*", [c.port2]); |
| }, "close() detaches a MessagePort (but not the one its entangled with)"); |
| </script> |