1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
|
<!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(sentSize < 20 * 1024 * 1024) {
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(sentSize < 20 * 1024 * 1024) {
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(sentSize < 20 * 1024 * 1024) {
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>
|