async_test(function(t) { var channel1 = new MessageChannel(); var channel2 = new MessageChannel(); // One, send a message. channel1.port1.postMessage(1); // Two, transfer both ports. channel2.port1.postMessage("transfer", [channel1.port1]); channel2.port1.postMessage("transfer", [channel1.port2]); var transfer_counter = 0; var sender; channel2.port2.onmessage = t.step_func(function (evt) { if (transfer_counter == 0) { sender = evt.ports[0]; transfer_counter = 1; } else { sender.postMessage(2); var counter = 0; evt.ports[0].onmessage = t.step_func(function (evt) { if (counter == 0) { assert_equals(evt.data, 1); counter = 1; } else if (counter == 1) { assert_equals(evt.data, 2); counter = 2; } else { assert_equals(evt.data, 3); t.done(); } }); sender.postMessage(3); } }); }, "An entangled port transferred to the same origin receives messages in order");