Automatic update from web-platform-tests peerconnection: Fire data channel events synchronously When message events are dispatched asynchronously, it is possible to receive some of those after the state change events are dispatched. This causes some messages to disappear when a data channel is closing. Tests are added to verify that all messages sent are received properly by the remote side as mandated by the specification. Bug: chromium:40072842 Change-Id: I196cd5b6cae4ea443369b2d9bc98dad474162b23 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5397720 Commit-Queue: Guido Urdaneta <guidou@chromium.org> Auto-Submit: Florent Castelli <orphis@chromium.org> Reviewed-by: Guido Urdaneta <guidou@chromium.org> Cr-Commit-Position: refs/heads/main@{#1279016} -- wpt-commits: 4c286eb7e69b65dbc3757e282d3d89bf611959e7 wpt-pr: 45357
124 lines
3.6 KiB
HTML
124 lines
3.6 KiB
HTML
<!doctype html>
|
|
<meta charset=utf-8>
|
|
<meta name="timeout" content="long">
|
|
<title>RTCDataChannel.prototype.send</title>
|
|
<script src="/resources/testharness.js"></script>
|
|
<script src="/resources/testharnessreport.js"></script>
|
|
<script src="RTCPeerConnection-helper.js"></script>
|
|
<script>
|
|
'use strict';
|
|
|
|
const largeString = " ".repeat(64 * 1024);
|
|
const largeArrayBuffer = new TextEncoder("utf-8").encode(largeString);
|
|
const largeBlob = new Blob([" ".repeat(64 * 1024)]);
|
|
|
|
for (const options of [{}, {negotiated: true, id: 0}]) {
|
|
const mode = `${options.negotiated? "Negotiated d" : "D"}atachannel`;
|
|
|
|
promise_test(async t => {
|
|
let [channel1, channel2] = await createDataChannelPair(t, options);
|
|
let receivedSize = 0, sentSize = 0;
|
|
|
|
channel2.binaryType = 'arraybuffer';
|
|
channel2.onmessage = e => {
|
|
if (typeof e.data === 'string')
|
|
receivedSize += e.data.length;
|
|
else
|
|
receivedSize += e.data.byteLength;
|
|
}
|
|
|
|
let closePromiseResolve;
|
|
let closePromise = new Promise((resolve, reject) => {
|
|
closePromiseResolve = resolve;
|
|
});
|
|
channel2.onclose = e => {
|
|
closePromiseResolve();
|
|
}
|
|
|
|
try {
|
|
while(true) {
|
|
channel1.send(largeString);
|
|
sentSize += largeString.length;
|
|
}
|
|
} catch(error) {
|
|
assert_true(error instanceof DOMException);
|
|
assert_equals(error.name, 'OperationError');
|
|
}
|
|
channel1.close();
|
|
|
|
await closePromise;
|
|
assert_equals(receivedSize, sentSize, 'All the pending sent messages are received after calling close()');
|
|
}, `${mode} should be able to send and receive all string messages on close`);
|
|
|
|
promise_test(async t => {
|
|
let [channel1, channel2] = await createDataChannelPair(t, options);
|
|
let receivedSize = 0, sentSize = 0;
|
|
|
|
channel2.binaryType = 'arraybuffer';
|
|
channel2.onmessage = e => {
|
|
if (typeof e.data === 'string')
|
|
receivedSize += e.data.length;
|
|
else
|
|
receivedSize += e.data.byteLength;
|
|
}
|
|
|
|
let closePromiseResolve;
|
|
let closePromise = new Promise((resolve, reject) => {
|
|
closePromiseResolve = resolve;
|
|
});
|
|
channel2.onclose = e => {
|
|
closePromiseResolve();
|
|
}
|
|
|
|
try {
|
|
while(true) {
|
|
channel1.send(largeArrayBuffer);
|
|
sentSize += largeArrayBuffer.length;
|
|
}
|
|
} catch(error) {
|
|
assert_true(error instanceof DOMException);
|
|
assert_equals(error.name, 'OperationError');
|
|
}
|
|
channel1.close();
|
|
|
|
await closePromise;
|
|
assert_equals(receivedSize, sentSize, 'All the pending sent messages are received after calling close()');
|
|
}, `${mode} should be able to send and receive all arraybuffer messages on close`);
|
|
|
|
promise_test(async t => {
|
|
let [channel1, channel2] = await createDataChannelPair(t, options);
|
|
let receivedSize = 0, sentSize = 0;
|
|
|
|
channel2.binaryType = 'arraybuffer';
|
|
channel2.onmessage = e => {
|
|
if (typeof e.data === 'string')
|
|
receivedSize += e.data.length;
|
|
else
|
|
receivedSize += e.data.byteLength;
|
|
}
|
|
|
|
let closePromiseResolve;
|
|
let closePromise = new Promise((resolve, reject) => {
|
|
closePromiseResolve = resolve;
|
|
});
|
|
channel2.onclose = e => {
|
|
closePromiseResolve();
|
|
}
|
|
|
|
try {
|
|
while(true) {
|
|
channel1.send(largeBlob);
|
|
sentSize += largeBlob.size;
|
|
}
|
|
} catch(error) {
|
|
assert_true(error instanceof DOMException);
|
|
assert_equals(error.name, 'OperationError');
|
|
}
|
|
channel1.close();
|
|
|
|
await closePromise;
|
|
assert_equals(receivedSize, sentSize, 'All the pending sent messages are received after calling close()');
|
|
}, `${mode} should be able to send and receive all blob messages on close`);
|
|
}
|
|
</script>
|