<!doctype html> <!-- This test creates a data channel between two local PeerConnection instances and ensures that an empty string sent by one is received by the second. --> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>RTCPeerConnection Data Channel Empty String Test</title> </head> <body> <div id="log"></div> <h2>Messages exchanged</h2> <div id="msg"></div> <!-- These files are in place when executing on W3C. --> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script type="text/javascript"> var test = async_test('Can send empty strings across a WebRTC data channel.'); var gFirstConnection = null; var gSecondConnection = null; var sendChannel = null; var receiveChannel = null; var onReceiveChannel = function (event) { receiveChannel = event.channel; receiveChannel.onmessage = onReceiveMessage; }; // When the data channel is open, send an empty string message // followed by a message that contains the string "done". var onSendChannelOpen = test.step_func(function (event) { var msgEl = document.getElementById('msg'); sendChannel.send(''); msgEl.innerHTML += 'Sent: [empty string]<br>'; sendChannel.send('done'); msgEl.innerHTML += 'Sent: "done"<br>'; }); // Check the messages received on the other side. // There should be an empty string message followed by a message that // contains the string "done". // Pass/Fail the test according to the messages received var emptyMessageReceived = false; var onReceiveMessage = test.step_func(function (event) { var msgEl = document.getElementById('msg'); msgEl.innerHTML += 'Received: ' + (event.data ? '"' + event.data + '"' : '[empty string]') + '<br>'; if (emptyMessageReceived) { assert_equals(event.data, 'done', 'The "done" message was not received'); test.done(); } else { assert_equals(event.data, '', 'Empty message not received'); emptyMessageReceived = true; } }); function exchangeIce(pc) { return function(e) { if (e.candidate) { pc.addIceCandidate(e.candidate); } }; } function exchangeDescription(pc1, pc2) { return function() { return pc1.setRemoteDescription(pc2.localDescription); }; } test.step(function() { gFirstConnection = new RTCPeerConnection(null); gSecondConnection = new RTCPeerConnection(null); gFirstConnection.onicecandidate = exchangeIce(gSecondConnection); gSecondConnection.onicecandidate = exchangeIce(gFirstConnection); gSecondConnection.ondatachannel = onReceiveChannel; // Note the data channel will preserve the order of messages // exchanged over it by default. sendChannel = gFirstConnection.createDataChannel('sendDataChannel'); sendChannel.onopen = onSendChannelOpen; gFirstConnection.createOffer() .then(gFirstConnection.setLocalDescription.bind(gFirstConnection)) .then(exchangeDescription(gSecondConnection, gFirstConnection)) .then(function() { return gSecondConnection.createAnswer(); }) .then(gSecondConnection.setLocalDescription.bind(gSecondConnection)) .then(exchangeDescription(gFirstConnection, gSecondConnection)) .catch(test.step_func(function(e) { assert_unreached('Error ' + e.name + ': ' + e.message); })); }); </script> </body> </html>