blob: 9cd32a3bca13826e142de441108fa55c6da72dfa [file] [log] [blame]
<!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 = 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>