mirror of
https://github.com/servo/servo.git
synced 2025-10-04 02:29:12 +01:00
Update web-platform-tests to revision be959408023fe02cf79abe70f6018598a7004a88
This commit is contained in:
parent
a76777b115
commit
761c8bc2a9
171 changed files with 2434 additions and 907 deletions
|
@ -109,6 +109,7 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const transceiver = pc.addTransceiver('audio', {
|
||||
direction: 'recvonly'
|
||||
});
|
||||
|
@ -126,6 +127,7 @@
|
|||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const transceiver = pc.addTransceiver('audio', {
|
||||
direction: 'inactive'
|
||||
});
|
||||
|
@ -166,6 +168,7 @@
|
|||
let dtmfSender;
|
||||
let sender;
|
||||
let pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
return getTrackFromUserMedia('audio')
|
||||
.then(([track, mediaStream]) => {
|
||||
sender = pc.addTrack(track, mediaStream);
|
||||
|
|
|
@ -232,6 +232,7 @@
|
|||
*/
|
||||
async_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const transceiver = pc.addTransceiver('audio', { direction: 'sendrecv' });
|
||||
const dtmfSender = transceiver.sender.dtmf;
|
||||
|
||||
|
@ -279,7 +280,6 @@
|
|||
|
||||
dtmfSender.addEventListener('tonechange', onToneChange);
|
||||
dtmfSender.insertDTMF('ABCD', 100, 70);
|
||||
|
||||
}, `Setting transceiver.currentDirection to recvonly in the middle of tonechange events should stop future tonechange events from firing`);
|
||||
|
||||
/* Section 7.3 - Tone change event */
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
// have IDs set according to the rules in rtcweb-data-channel.
|
||||
promise_test(test => {
|
||||
const pc = new RTCPeerConnection;
|
||||
test.add_cleanup(() => pc.close());
|
||||
const channel = pc.createDataChannel('');
|
||||
return pc.createOffer()
|
||||
.then(offer => pc.setLocalDescription(offer))
|
||||
|
@ -35,6 +36,7 @@ promise_test(test => {
|
|||
|
||||
promise_test(test => {
|
||||
const pc = new RTCPeerConnection;
|
||||
test.add_cleanup(() => pc.close());
|
||||
const channel = pc.createDataChannel('');
|
||||
return pc.createOffer()
|
||||
.then(offer => pc.setLocalDescription(offer))
|
||||
|
|
|
@ -38,7 +38,9 @@
|
|||
*/
|
||||
async_test(t => {
|
||||
const pc1 = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc1.close());
|
||||
const pc2 = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc2.close());
|
||||
|
||||
pc1.createDataChannel('test');
|
||||
exchangeIceCandidates(pc1, pc2);
|
||||
|
|
|
@ -120,7 +120,9 @@
|
|||
|
||||
promise_test(t => {
|
||||
const pc1 = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc1.close());
|
||||
const pc2 = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc2.close());
|
||||
|
||||
return createDataChannelPair(pc1, pc2)
|
||||
.then(([channel1, channel2]) => {
|
||||
|
@ -165,7 +167,9 @@
|
|||
|
||||
promise_test(t => {
|
||||
const pc1 = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc1.close());
|
||||
const pc2 = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc2.close());
|
||||
pc1.createDataChannel('');
|
||||
|
||||
// setRemoteDescription(answer) without the other peer
|
||||
|
|
|
@ -142,6 +142,8 @@ a=rtcp-rsize
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.setRemoteDescription(sessionDesc)
|
||||
.then(() =>
|
||||
promise_rejects(t, new TypeError(),
|
||||
|
@ -157,6 +159,8 @@ a=rtcp-rsize
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return promise_rejects(t, 'InvalidStateError',
|
||||
pc.addIceCandidate({
|
||||
candidate: candidateStr1,
|
||||
|
@ -170,6 +174,8 @@ a=rtcp-rsize
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.setRemoteDescription(sessionDesc)
|
||||
.then(() => pc.addIceCandidate({
|
||||
candidate: candidateStr1,
|
||||
|
@ -180,6 +186,8 @@ a=rtcp-rsize
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.setRemoteDescription(sessionDesc)
|
||||
.then(() => pc.addIceCandidate(new RTCIceCandidate({
|
||||
candidate: candidateStr1,
|
||||
|
@ -190,6 +198,8 @@ a=rtcp-rsize
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.setRemoteDescription(sessionDesc)
|
||||
.then(() => pc.addIceCandidate({ sdpMid }));
|
||||
}, 'Add candidate with only valid sdpMid should succeed');
|
||||
|
@ -197,6 +207,8 @@ a=rtcp-rsize
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.setRemoteDescription(sessionDesc)
|
||||
.then(() => pc.addIceCandidate({ sdpMLineIndex }));
|
||||
}, 'Add candidate with only valid sdpMLineIndex should succeed');
|
||||
|
@ -212,6 +224,8 @@ a=rtcp-rsize
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.setRemoteDescription(sessionDesc)
|
||||
.then(() => pc.addIceCandidate({
|
||||
candidate: candidateStr1,
|
||||
|
@ -226,6 +240,8 @@ a=rtcp-rsize
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.setRemoteDescription(sessionDesc)
|
||||
.then(() => pc.addIceCandidate({
|
||||
candidate: candidateStr2,
|
||||
|
@ -242,6 +258,8 @@ a=rtcp-rsize
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.setRemoteDescription(sessionDesc)
|
||||
.then(() => pc.addIceCandidate({
|
||||
candidate: candidateStr1,
|
||||
|
@ -257,6 +275,8 @@ a=rtcp-rsize
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.setRemoteDescription(sessionDesc)
|
||||
.then(() => pc.addIceCandidate({
|
||||
candidate: candidateStr1,
|
||||
|
@ -291,6 +311,8 @@ a=rtcp-rsize
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.setRemoteDescription(sessionDesc)
|
||||
.then(() => pc.addIceCandidate({
|
||||
candidate: candidateStr1,
|
||||
|
@ -318,6 +340,8 @@ a=rtcp-rsize
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.setRemoteDescription(sessionDesc)
|
||||
.then(() =>
|
||||
promise_rejects(t, new TypeError(),
|
||||
|
@ -331,6 +355,8 @@ a=rtcp-rsize
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.setRemoteDescription(sessionDesc)
|
||||
.then(() =>
|
||||
promise_rejects(t, new TypeError(),
|
||||
|
@ -342,6 +368,8 @@ a=rtcp-rsize
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.setRemoteDescription(sessionDesc)
|
||||
.then(() =>
|
||||
promise_rejects(t, new TypeError(),
|
||||
|
@ -355,6 +383,8 @@ a=rtcp-rsize
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.setRemoteDescription(sessionDesc)
|
||||
.then(() =>
|
||||
promise_rejects(t, new TypeError(),
|
||||
|
@ -364,6 +394,8 @@ a=rtcp-rsize
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.setRemoteDescription(sessionDesc)
|
||||
.then(() =>
|
||||
promise_rejects(t, new TypeError(),
|
||||
|
@ -385,6 +417,8 @@ a=rtcp-rsize
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.setRemoteDescription(sessionDesc)
|
||||
.then(() =>
|
||||
promise_rejects(t, 'OperationError',
|
||||
|
@ -405,6 +439,8 @@ a=rtcp-rsize
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.setRemoteDescription(sessionDesc)
|
||||
.then(() =>
|
||||
promise_rejects(t, 'OperationError',
|
||||
|
@ -420,6 +456,8 @@ a=rtcp-rsize
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.setRemoteDescription(sessionDesc)
|
||||
.then(() => pc.addIceCandidate({
|
||||
candidate: candidateStr1,
|
||||
|
@ -432,6 +470,8 @@ a=rtcp-rsize
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.setRemoteDescription(sessionDesc)
|
||||
.then(() => pc.addIceCandidate({
|
||||
candidate: candidateStr2,
|
||||
|
@ -455,6 +495,8 @@ a=rtcp-rsize
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.setRemoteDescription(sessionDesc)
|
||||
.then(() =>
|
||||
promise_rejects(t, 'OperationError',
|
||||
|
@ -475,6 +517,8 @@ a=rtcp-rsize
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.setRemoteDescription(sessionDesc)
|
||||
.then(() =>
|
||||
promise_rejects(t, 'OperationError',
|
||||
|
@ -487,6 +531,8 @@ a=rtcp-rsize
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.setRemoteDescription(sessionDesc)
|
||||
.then(() =>
|
||||
promise_rejects(t, 'OperationError',
|
||||
|
|
|
@ -40,6 +40,8 @@
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return navigator.mediaDevices.getUserMedia({ audio: true })
|
||||
.then(mediaStream => {
|
||||
const tracks = mediaStream.getTracks();
|
||||
|
@ -67,6 +69,8 @@
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return navigator.mediaDevices.getUserMedia({ audio: true })
|
||||
.then(mediaStream => {
|
||||
const tracks = mediaStream.getTracks();
|
||||
|
@ -102,6 +106,8 @@
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return navigator.mediaDevices.getUserMedia({ audio: true })
|
||||
.then(mediaStream => {
|
||||
const tracks = mediaStream.getTracks();
|
||||
|
@ -122,6 +128,8 @@
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return navigator.mediaDevices.getUserMedia({ audio: true })
|
||||
.then(mediaStream => {
|
||||
const tracks = mediaStream.getTracks();
|
||||
|
@ -149,6 +157,8 @@
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return navigator.mediaDevices.getUserMedia({ audio: true })
|
||||
.then(mediaStream => {
|
||||
const tracks = mediaStream.getTracks();
|
||||
|
|
|
@ -38,6 +38,8 @@
|
|||
promise_test(function(t) {
|
||||
var pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.setRemoteDescription(new RTCSessionDescription({type: 'offer', sdp: sdp}))
|
||||
.then(function() {
|
||||
assert_true(pc.canTrickleIceCandidates, 'canTrickleIceCandidates property is true after setRemoteDescription');
|
||||
|
@ -47,6 +49,8 @@
|
|||
promise_test(function(t) {
|
||||
var pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.setRemoteDescription(new RTCSessionDescription({type: 'offer', sdp: sdp.replace('a=ice-options:trickle\r\n', '')}))
|
||||
.then(function() {
|
||||
assert_false(pc.canTrickleIceCandidates, 'canTrickleIceCandidates property is false after setRemoteDescription');
|
||||
|
|
|
@ -107,8 +107,11 @@
|
|||
*/
|
||||
async_test(t => {
|
||||
const pc1 = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc1.close());
|
||||
const pc2 = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc2.close());
|
||||
|
||||
const onConnectionStateChange = t.step_func(() => {
|
||||
const { connectionState } = pc1;
|
||||
if(connectionState === 'connected') {
|
||||
|
@ -136,7 +139,6 @@
|
|||
|
||||
exchangeIceCandidates(pc1, pc2);
|
||||
doSignalingHandshake(pc1, pc2);
|
||||
|
||||
}, 'connection with one data channel should eventually have connected connection state');
|
||||
|
||||
/*
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
return promise_rejects(t, 'InvalidStateError',
|
||||
pc.createAnswer());
|
||||
}, 'createAnswer() with null remoteDescription should reject with InvalidStateError');
|
||||
|
@ -36,6 +37,8 @@
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.createOffer({ offerToReceiveVideo: true })
|
||||
.then(offer => pc.setRemoteDescription(offer))
|
||||
.then(() => pc.createAnswer())
|
||||
|
@ -51,6 +54,8 @@
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return generateOffer({ pc, data: true })
|
||||
.then(offer => pc.setRemoteDescription(offer))
|
||||
.then(() => {
|
||||
|
|
|
@ -362,6 +362,7 @@ test(() => {
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const channel1 = pc.createDataChannel('channel');
|
||||
assert_equals(channel1.id, null,
|
||||
'Expect initial id to be null');
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
// Start testing
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const dummy = pc.createDataChannel('foo'); // Just to have something to offer
|
||||
|
||||
return pc.createOffer(offerToReceiveFalse)
|
||||
|
@ -33,6 +34,8 @@
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.createOffer(offerToReceiveTrue)
|
||||
.then(() => {
|
||||
assert_equals(pc.getTransceivers().length, 1,
|
||||
|
@ -47,6 +50,8 @@
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.createOffer(offerToReceiveTrue)
|
||||
.then(() => {
|
||||
assert_equals(pc.getTransceivers().length, 1,
|
||||
|
@ -67,6 +72,8 @@
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return getTrackFromUserMedia(kind)
|
||||
.then(([track, stream]) => {
|
||||
pc.addTrack(track, stream);
|
||||
|
@ -91,6 +98,8 @@
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return getTrackFromUserMedia(kind)
|
||||
.then(([track, stream]) => {
|
||||
pc.addTrack(track, stream);
|
||||
|
@ -110,6 +119,8 @@
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
pc.addTransceiver(kind, {direction: 'recvonly'});
|
||||
|
||||
return pc.createOffer(offerToReceiveFalse)
|
||||
|
@ -126,8 +137,11 @@
|
|||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const pc2 = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc2.close());
|
||||
|
||||
return getTrackFromUserMedia(kind)
|
||||
.then(([track, stream]) => {
|
||||
pc.addTrack(track, stream);
|
||||
|
@ -154,6 +168,8 @@
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.createOffer({ offerToReceiveAudio: true, offerToReceiveVideo: true })
|
||||
.then(() => {
|
||||
assert_equals(pc.getTransceivers().length, 2,
|
||||
|
|
|
@ -15,7 +15,6 @@
|
|||
// generateAnswer()
|
||||
// countAudioLine()
|
||||
// countVideoLine()
|
||||
// test_state_change_event()
|
||||
// assert_session_desc_equals()
|
||||
|
||||
/*
|
||||
|
@ -31,6 +30,8 @@
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection()
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.createOffer()
|
||||
.then(offer => {
|
||||
assert_equals(typeof offer, 'object',
|
||||
|
@ -43,7 +44,10 @@
|
|||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
test_state_change_event(t, pc, ['have-local-offer']);
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
const states = [];
|
||||
pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState));
|
||||
|
||||
return pc.createOffer({ offerToReceiveAudio: true })
|
||||
.then(offer =>
|
||||
|
@ -53,11 +57,14 @@
|
|||
assert_session_desc_equals(pc.localDescription, offer);
|
||||
assert_session_desc_equals(pc.pendingLocalDescription, offer);
|
||||
assert_equals(pc.currentLocalDescription, null);
|
||||
|
||||
assert_array_equals(states, ['have-local-offer']);
|
||||
}));
|
||||
}, 'createOffer() and then setLocalDescription() should succeed');
|
||||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
pc.close();
|
||||
|
||||
return promise_rejects(t, 'InvalidStateError',
|
||||
|
@ -78,6 +85,7 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const promise = pc.createOffer();
|
||||
|
||||
pc.addTransceiver('audio');
|
||||
|
@ -122,6 +130,8 @@
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.createOffer({ offerToReceiveAudio: true })
|
||||
.then(offer1 => {
|
||||
assert_equals(countAudioLine(offer1.sdp), 1,
|
||||
|
@ -149,6 +159,8 @@
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.createOffer({ offerToReceiveVideo: true })
|
||||
.then(offer1 => {
|
||||
assert_equals(countVideoLine(offer1.sdp), 1,
|
||||
|
@ -165,6 +177,8 @@
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.createOffer({
|
||||
offerToReceiveAudio: true,
|
||||
offerToReceiveVideo: false
|
||||
|
|
|
@ -41,11 +41,13 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
return pc.getStats();
|
||||
}, 'getStats() with no argument should succeed');
|
||||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
return pc.getStats(null);
|
||||
}, 'getStats(null) should succeed');
|
||||
|
||||
|
@ -59,6 +61,7 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
return getTrackFromUserMedia('audio')
|
||||
.then(([track, mediaStream]) => {
|
||||
return promise_rejects(t, 'InvalidAccessError', pc.getStats(track));
|
||||
|
@ -67,6 +70,7 @@
|
|||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
return getTrackFromUserMedia('audio')
|
||||
.then(([track, mediaStream]) => {
|
||||
pc.addTrack(track, mediaStream);
|
||||
|
@ -76,6 +80,7 @@
|
|||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const track = generateMediaStreamTrack();
|
||||
pc.addTransceiver(track);
|
||||
|
||||
|
@ -84,6 +89,7 @@
|
|||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
return getTrackFromUserMedia('audio')
|
||||
.then(([track, mediaStream]) => {
|
||||
// addTransceiver allows adding same track multiple times
|
||||
|
@ -100,6 +106,7 @@
|
|||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const transceiver1 = pc.addTransceiver('audio');
|
||||
|
||||
// Create another transceiver that resends what
|
||||
|
@ -117,6 +124,7 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
return pc.getStats()
|
||||
.then(statsReport => {
|
||||
validateStatsReport(statsReport);
|
||||
|
@ -126,6 +134,7 @@
|
|||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
return getTrackFromUserMedia('audio')
|
||||
.then(([track, mediaStream]) => {
|
||||
pc.addTrack(track, mediaStream);
|
||||
|
@ -140,6 +149,7 @@
|
|||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
return getTrackFromUserMedia('audio')
|
||||
.then(([track, mediaStream]) => {
|
||||
pc.addTrack(track);
|
||||
|
@ -162,6 +172,7 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
return getTrackFromUserMedia('audio')
|
||||
.then(([track, mediaStream]) => {
|
||||
pc.addTrack(track, mediaStream);
|
||||
|
@ -185,6 +196,7 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const transceiver = pc.addTransceiver('audio');
|
||||
|
||||
return pc.getStats(transceiver.receiver.track)
|
||||
|
|
|
@ -168,36 +168,6 @@ function generateAnswer(offer) {
|
|||
.then(() => pc.createAnswer());
|
||||
}
|
||||
|
||||
// Wait for peer connection to fire onsignalingstatechange
|
||||
// event, compare and make sure the new state is the same
|
||||
// as expected state. It accepts an RTCPeerConnection object
|
||||
// and an array of expected state changes. The test passes
|
||||
// if all expected state change events have been fired, and
|
||||
// fail if the new state is different from the expected state.
|
||||
//
|
||||
// Note that the promise is never resolved if no change
|
||||
// event is fired. To avoid confusion with the main test
|
||||
// getting timed out, this is done in parallel as a separate
|
||||
// test
|
||||
function test_state_change_event(parentTest, pc, expectedStates) {
|
||||
return async_test(t => {
|
||||
pc.onsignalingstatechange = t.step_func(() => {
|
||||
if(expectedStates.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
const newState = pc.signalingState;
|
||||
const expectedState = expectedStates.shift();
|
||||
|
||||
assert_equals(newState, expectedState, 'New signaling state is different from expected.');
|
||||
|
||||
if(expectedStates.length === 0) {
|
||||
t.done();
|
||||
}
|
||||
});
|
||||
}, `Test onsignalingstatechange event for ${parentTest.name}`);
|
||||
}
|
||||
|
||||
// Run a test function that return a promise that should
|
||||
// never be resolved. For lack of better options,
|
||||
// we wait for a time out and pass the test if the
|
||||
|
@ -418,16 +388,19 @@ function getUserMediaTracksAndStreams(count, type = 'audio') {
|
|||
});
|
||||
}
|
||||
|
||||
// Creates an offer for the caller, set it as the caller's local description and
|
||||
// then sets the callee's remote description to the offer. Returns the Promise
|
||||
// of the setRemoteDescription call.
|
||||
function performOffer(caller, callee) {
|
||||
let sessionDescription;
|
||||
return caller.createOffer()
|
||||
.then(offer => {
|
||||
sessionDescription = offer;
|
||||
return caller.setLocalDescription(offer);
|
||||
}).then(() => callee.setRemoteDescription(sessionDescription));
|
||||
async function exchangeOffer(caller, callee) {
|
||||
const offer = await caller.createOffer();
|
||||
await caller.setLocalDescription(offer);
|
||||
return callee.setRemoteDescription(offer);
|
||||
}
|
||||
async function exchangeAnswer(caller, callee) {
|
||||
const answer = await callee.createAnswer();
|
||||
await callee.setLocalDescription(answer);
|
||||
return caller.setRemoteDescription(answer);
|
||||
}
|
||||
async function exchangeOfferAnswer(caller, callee) {
|
||||
await exchangeOffer(caller, callee);
|
||||
return exchangeAnswer(caller, callee);
|
||||
}
|
||||
|
||||
|
||||
|
@ -445,3 +418,13 @@ class Resolver {
|
|||
this.reject = promiseReject;
|
||||
}
|
||||
}
|
||||
|
||||
function addEventListenerPromise(t, target, type, listener) {
|
||||
return new Promise((resolve, reject) => {
|
||||
target.addEventListener(type, t.step_func(e => {
|
||||
if (listener != undefined)
|
||||
e = listener(e);
|
||||
resolve(e);
|
||||
}));
|
||||
});
|
||||
}
|
||||
|
|
|
@ -104,8 +104,11 @@
|
|||
*/
|
||||
async_test(t => {
|
||||
const pc1 = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc1.close());
|
||||
const pc2 = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc2.close());
|
||||
|
||||
const onIceConnectionStateChange = t.step_func(() => {
|
||||
const { iceConnectionState } = pc1;
|
||||
|
||||
|
@ -138,7 +141,6 @@
|
|||
|
||||
exchangeIceCandidates(pc1, pc2);
|
||||
doSignalingHandshake(pc1, pc2);
|
||||
|
||||
}, 'connection with one data channel should eventually have connected connection state');
|
||||
|
||||
/*
|
||||
|
|
|
@ -57,6 +57,8 @@
|
|||
async_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
const onIceGatheringStateChange = t.step_func(() => {
|
||||
const { iceGatheringState } = pc;
|
||||
|
||||
|
@ -74,7 +76,6 @@
|
|||
.then(offer => pc.setLocalDescription(offer))
|
||||
.then(err => t.step_func(err =>
|
||||
assert_unreached(`Unhandled rejection ${err.name}: ${err.message}`)));
|
||||
|
||||
}, 'iceGatheringState should eventually become complete after setLocalDescription');
|
||||
|
||||
/*
|
||||
|
@ -97,8 +98,11 @@
|
|||
*/
|
||||
async_test(t => {
|
||||
const pc1 = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc1.close());
|
||||
const pc2 = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc2.close());
|
||||
|
||||
const onIceGatheringStateChange = t.step_func(() => {
|
||||
const { iceGatheringState } = pc2;
|
||||
|
||||
|
@ -131,7 +135,6 @@
|
|||
|
||||
exchangeIceCandidates(pc1, pc2);
|
||||
doSignalingHandshake(pc1, pc2);
|
||||
|
||||
}, 'connection with one data channel should eventually have connected connection state');
|
||||
|
||||
/*
|
||||
|
|
|
@ -36,8 +36,11 @@
|
|||
*/
|
||||
async_test(t => {
|
||||
const localPc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => localPc.close());
|
||||
const remotePc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => remotePc.close());
|
||||
|
||||
let eventCount = 0;
|
||||
|
||||
const onDataChannel = t.step_func_done(event => {
|
||||
|
@ -69,7 +72,6 @@
|
|||
remotePc.addEventListener('datachannel', onDataChannel);
|
||||
exchangeIceCandidates(localPc, remotePc);
|
||||
doSignalingHandshake(localPc, remotePc);
|
||||
|
||||
}, 'datachannel event should fire when new data channel is announced to the remote peer');
|
||||
|
||||
/*
|
||||
|
@ -98,8 +100,11 @@
|
|||
*/
|
||||
async_test(t => {
|
||||
const localPc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => localPc.close());
|
||||
const remotePc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => remotePc.close());
|
||||
|
||||
const onDataChannel = t.step_func_done(event => {
|
||||
const remoteChannel = event.channel;
|
||||
assert_true(remoteChannel instanceof RTCDataChannel,
|
||||
|
@ -145,8 +150,11 @@
|
|||
*/
|
||||
async_test(t => {
|
||||
const localPc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => localPc.close());
|
||||
const remotePc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => remotePc.close());
|
||||
|
||||
const onDataChannel = t.unreached_func('datachannel event should not be fired');
|
||||
|
||||
localPc.createDataChannel('test', {
|
||||
|
@ -158,7 +166,6 @@
|
|||
doSignalingHandshake(localPc, remotePc);
|
||||
|
||||
t.step_timeout(t.step_func_done(), 200);
|
||||
|
||||
}, 'Data channel created with negotiated set to true should not fire datachannel event on remote peer');
|
||||
|
||||
/*
|
||||
|
|
|
@ -82,6 +82,7 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const negotiated = awaitNegotiation(pc);
|
||||
|
||||
pc.createDataChannel('test');
|
||||
|
@ -114,6 +115,7 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const negotiated = awaitNegotiation(pc);
|
||||
|
||||
pc.addTransceiver('audio');
|
||||
|
@ -184,6 +186,8 @@
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return assert_first_promise_fulfill_after_second(
|
||||
awaitNegotiation(pc),
|
||||
pc.createOffer({ offerToReceiveAudio: true })
|
||||
|
|
|
@ -98,6 +98,8 @@
|
|||
async_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
// Fail the test if the ontrack event handler is not implemented
|
||||
assert_idl_attribute(pc, 'ontrack', 'Expect pc to have ontrack event handler attribute');
|
||||
|
||||
|
@ -151,6 +153,8 @@ a=ssrc:1001 cname:some
|
|||
async_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
assert_idl_attribute(pc, 'ontrack', 'Expect pc to have ontrack event handler attribute');
|
||||
|
||||
const sdp = `v=0
|
||||
|
@ -182,13 +186,15 @@ a=ssrc:1001 cname:some
|
|||
.then(t.step_func(() => {
|
||||
t.step_timeout(t.step_func_done(), 100);
|
||||
}));
|
||||
|
||||
}, 'setRemoteDescription() with m= line of recvonly direction should not trigger track event');
|
||||
|
||||
async_test(t => {
|
||||
const pc1 = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc1.close());
|
||||
const pc2 = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc2.close());
|
||||
|
||||
pc2.ontrack = t.step_func(trackEvent => {
|
||||
const { track } = trackEvent;
|
||||
|
||||
|
@ -210,13 +216,15 @@ a=ssrc:1001 cname:some
|
|||
.catch(t.step_func(err => {
|
||||
assert_unreached('Error ' + err.name + ': ' + err.message);
|
||||
}));
|
||||
|
||||
}, 'addTrack() should cause remote connection to fire ontrack when setRemoteDescription()');
|
||||
|
||||
async_test(t => {
|
||||
const pc1 = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc1.close());
|
||||
const pc2 = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc2.close());
|
||||
|
||||
pc2.ontrack = t.step_func(trackEvent => {
|
||||
const { track } = trackEvent;
|
||||
|
||||
|
@ -235,13 +243,15 @@ a=ssrc:1001 cname:some
|
|||
.catch(t.step_func(err => {
|
||||
assert_unreached('Error ' + err.name + ': ' + err.message);
|
||||
}));
|
||||
|
||||
}, `addTransceiver('video') should cause remote connection to fire ontrack when setRemoteDescription()`);
|
||||
|
||||
async_test(t => {
|
||||
const pc1 = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc1.close());
|
||||
const pc2 = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc2.close());
|
||||
|
||||
pc2.ontrack = t.step_func(trackEvent => {
|
||||
const { track } = trackEvent;
|
||||
|
||||
|
@ -264,7 +274,6 @@ a=ssrc:1001 cname:some
|
|||
.then(t.step_func(() => {
|
||||
t.step_timeout(t.step_func_done(), 100);
|
||||
}));
|
||||
|
||||
}, `addTransceiver() with inactive direction should not cause remote connection to fire ontrack when setRemoteDescription()`);
|
||||
|
||||
</script>
|
||||
|
|
|
@ -56,8 +56,11 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc1 = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc1.close());
|
||||
const pc2 = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc2.close());
|
||||
|
||||
const port = window.location.port;
|
||||
const [idpDomain] = getIdpDomains();
|
||||
const idpHost = hostString(idpDomain, port);
|
||||
|
@ -92,10 +95,13 @@
|
|||
const idpHost = hostString(idpDomain, port);
|
||||
|
||||
const pc1 = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc1.close());
|
||||
const pc2 = new RTCPeerConnection({
|
||||
peerIdentity: `bob@${idpDomain}`
|
||||
});
|
||||
|
||||
t.add_cleanup(() => pc2.close());
|
||||
|
||||
pc1.setIdentityProvider(idpHost, {
|
||||
protocol: 'mock-idp.js',
|
||||
usernameHint: `alice@${idpDomain}`
|
||||
|
@ -131,10 +137,13 @@
|
|||
const idpHost = hostString(idpDomain, port);
|
||||
|
||||
const pc1 = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc1.close());
|
||||
const pc2 = new RTCPeerConnection({
|
||||
peerIdentity: `alice@${idpDomain}`
|
||||
});
|
||||
|
||||
t.add_cleanup(() => pc2.close());
|
||||
|
||||
// Ask mockidp.js to return custom contents in validation result
|
||||
pc1.setIdentityProvider(idpHost, {
|
||||
protocol: 'mock-idp.js?validatorAction=return-custom-contents&contents=bogus',
|
||||
|
@ -167,10 +176,13 @@
|
|||
const idpHost1 = hostString(idpDomain1, port);
|
||||
|
||||
const pc1 = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc1.close());
|
||||
const pc2 = new RTCPeerConnection({
|
||||
peerIdentity: `alice@${idpDomain2}`
|
||||
});
|
||||
|
||||
t.add_cleanup(() => pc2.close());
|
||||
|
||||
// mock-idp.js will return assertion of domain2 identity
|
||||
// with domain1 in the idp.domain field
|
||||
pc1.setIdentityProvider(idpHost1, {
|
||||
|
@ -220,10 +232,13 @@
|
|||
const idpHost = hostString(idpDomain, port);
|
||||
|
||||
const pc1 = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc1.close());
|
||||
const pc2 = new RTCPeerConnection({
|
||||
peerIdentity: `alice@${idpDomain}`
|
||||
});
|
||||
|
||||
t.add_cleanup(() => pc2.close());
|
||||
|
||||
// Ask mock-idp.js to throw error during validation,
|
||||
// i.e. during pc2.setRemoteDescription()
|
||||
pc1.setIdentityProvider(idpHost, {
|
||||
|
@ -263,8 +278,11 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc1 = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc1.close());
|
||||
const pc2 = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc2.close());
|
||||
|
||||
const port = window.location.port;
|
||||
const [idpDomain] = getIdpDomains();
|
||||
const idpHost = hostString(idpDomain, port);
|
||||
|
|
|
@ -49,6 +49,8 @@
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return navigator.mediaDevices.getUserMedia({ audio: true })
|
||||
.then(mediaStream => {
|
||||
const tracks = mediaStream.getTracks();
|
||||
|
@ -78,6 +80,8 @@
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return navigator.mediaDevices.getUserMedia({ audio: true })
|
||||
.then(mediaStream => {
|
||||
const tracks = mediaStream.getTracks();
|
||||
|
@ -111,6 +115,8 @@
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return navigator.mediaDevices.getUserMedia({ audio: true })
|
||||
.then(mediaStream => {
|
||||
const tracks = mediaStream.getTracks();
|
||||
|
@ -149,6 +155,8 @@
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return navigator.mediaDevices.getUserMedia({ audio: true })
|
||||
.then(mediaStream => {
|
||||
const tracks = mediaStream.getTracks();
|
||||
|
@ -173,6 +181,7 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const track = generateMediaStreamTrack('audio');
|
||||
const transceiver = pc.addTransceiver(track);
|
||||
const { sender } = transceiver;
|
||||
|
@ -205,6 +214,7 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const track = generateMediaStreamTrack('audio');
|
||||
const transceiver = pc.addTransceiver(track, { direction: 'sendonly' });
|
||||
const { sender } = transceiver;
|
||||
|
@ -237,6 +247,7 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const track = generateMediaStreamTrack('audio');
|
||||
const transceiver = pc.addTransceiver(track, { direction: 'recvonly' });
|
||||
const { sender } = transceiver;
|
||||
|
@ -268,6 +279,7 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const track = generateMediaStreamTrack('audio');
|
||||
const transceiver = pc.addTransceiver(track, { direction: 'inactive' });
|
||||
const { sender } = transceiver;
|
||||
|
|
|
@ -66,6 +66,7 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const transceiver = pc.addTransceiver('audio');
|
||||
assert_equals(transceiver.mid, null);
|
||||
|
||||
|
@ -99,8 +100,11 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc1 = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc1.close());
|
||||
const pc2 = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc2.close());
|
||||
|
||||
const transceiver1 = pc1.addTransceiver('audio');
|
||||
assert_array_equals(pc1.getTransceivers(), [transceiver1]);
|
||||
assert_array_equals(pc2.getTransceivers(), []);
|
||||
|
@ -139,6 +143,7 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const transceiver = pc.addTransceiver('audio');
|
||||
assert_equals(transceiver.mid, null);
|
||||
|
||||
|
@ -159,6 +164,7 @@
|
|||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const transceiver1 = pc.addTransceiver('audio');
|
||||
assert_equals(transceiver1.mid, null);
|
||||
|
||||
|
@ -204,8 +210,11 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc1 = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc1.close());
|
||||
const pc2 = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc2.close());
|
||||
|
||||
pc1.addTransceiver('audio');
|
||||
|
||||
return pc1.createOffer()
|
||||
|
|
|
@ -14,7 +14,6 @@
|
|||
// generateOffer
|
||||
// generateAnswer
|
||||
// assert_session_desc_equals
|
||||
// test_state_change_event
|
||||
|
||||
/*
|
||||
4.3.2. Interface Definition
|
||||
|
@ -61,7 +60,10 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
test_state_change_event(t, pc, ['have-remote-offer', 'stable']);
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
const states = [];
|
||||
pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState));
|
||||
|
||||
return pc.createOffer({ offerToReceiveVideo: true })
|
||||
.then(offer =>
|
||||
|
@ -79,6 +81,8 @@
|
|||
|
||||
assert_equals(pc.pendingLocalDescription, null);
|
||||
assert_equals(pc.pendingRemoteDescription, null);
|
||||
|
||||
assert_array_equals(states, ['have-remote-offer', 'stable']);
|
||||
})));
|
||||
}, 'setLocalDescription() with valid answer should succeed');
|
||||
|
||||
|
@ -91,6 +95,8 @@
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.createOffer({ offerToReceiveVideo: true })
|
||||
.then(offer =>
|
||||
pc.setRemoteDescription(offer)
|
||||
|
@ -120,6 +126,8 @@
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.createOffer({ offerToReceiveVideo: true })
|
||||
.then(offer =>
|
||||
pc.setRemoteDescription(offer)
|
||||
|
@ -142,16 +150,19 @@
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.createOffer()
|
||||
.then(offer =>
|
||||
promise_rejects(t, 'InvalidStateError',
|
||||
pc.setLocalDescription({ type: 'answer', sdp: offer.sdp })));
|
||||
|
||||
}, 'Calling setLocalDescription(answer) from stable state should reject with InvalidStateError');
|
||||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.createOffer()
|
||||
.then(offer =>
|
||||
pc.setLocalDescription(offer)
|
||||
|
|
|
@ -14,7 +14,6 @@
|
|||
// generateOffer
|
||||
// assert_session_desc_not_equals
|
||||
// assert_session_desc_equals
|
||||
// test_state_change_event
|
||||
|
||||
/*
|
||||
4.3.2. Interface Definition
|
||||
|
@ -58,7 +57,10 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
test_state_change_event(t, pc, ['have-local-offer']);
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
const states = [];
|
||||
pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState));
|
||||
|
||||
return pc.createOffer({ offerToReceiveAudio: true })
|
||||
.then(offer =>
|
||||
|
@ -68,6 +70,8 @@
|
|||
assert_session_desc_equals(pc.localDescription, offer);
|
||||
assert_session_desc_equals(pc.pendingLocalDescription, offer);
|
||||
assert_equals(pc.currentLocalDescription, null);
|
||||
|
||||
assert_array_equals(states, ['have-local-offer']);
|
||||
}));
|
||||
}, 'setLocalDescription with valid offer should succeed');
|
||||
|
||||
|
@ -79,6 +83,7 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
return pc.createOffer({ offerToReceiveAudio: true })
|
||||
.then(offer =>
|
||||
pc.setLocalDescription({ type: 'offer' })
|
||||
|
@ -99,8 +104,11 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const pc2 = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc2.close());
|
||||
|
||||
return generateOffer({ pc, data: true })
|
||||
.then(offer =>
|
||||
promise_rejects(t, 'InvalidModificationError',
|
||||
|
@ -113,6 +121,7 @@
|
|||
// last offer, setLocalDescription would reject when setting
|
||||
// with the first offer
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
return pc.createOffer({ offerToReceiveAudio: true })
|
||||
.then(offer1 =>
|
||||
pc.createOffer({ offerToReceiveVideo: true })
|
||||
|
@ -125,9 +134,10 @@
|
|||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
// Only one state change event should be fired
|
||||
test_state_change_event(t, pc, ['have-local-offer']);
|
||||
const states = [];
|
||||
pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState));
|
||||
|
||||
return pc.createOffer({ offerToReceiveAudio: true })
|
||||
.then(offer1 =>
|
||||
|
@ -142,6 +152,8 @@
|
|||
assert_session_desc_equals(pc.localDescription, offer2);
|
||||
assert_session_desc_equals(pc.pendingLocalDescription, offer2);
|
||||
assert_equals(pc.currentLocalDescription, null);
|
||||
|
||||
assert_array_equals(states, ['have-local-offer']);
|
||||
}))));
|
||||
}, 'Creating and setting offer multiple times should succeed');
|
||||
|
||||
|
|
|
@ -14,7 +14,6 @@
|
|||
// generateOffer
|
||||
// generateAnswer
|
||||
// assert_session_desc_equals
|
||||
// test_state_change_event
|
||||
|
||||
/*
|
||||
4.3.2. Interface Definition
|
||||
|
@ -64,11 +63,12 @@
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.createOffer()
|
||||
.then(offer =>
|
||||
promise_rejects(t, 'InvalidStateError',
|
||||
pc.setLocalDescription({ type: 'pranswer', sdp: offer.sdp })));
|
||||
|
||||
}, 'setLocalDescription(pranswer) from stable state should reject with InvalidStateError');
|
||||
|
||||
/*
|
||||
|
@ -81,7 +81,10 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
test_state_change_event(t, pc, ['have-remote-offer', 'have-local-pranswer']);
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
const states = [];
|
||||
pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState));
|
||||
|
||||
return pc.createOffer({ offerToReceiveVideo: true })
|
||||
.then(offer =>
|
||||
|
@ -103,13 +106,18 @@
|
|||
assert_equals(pc.currentLocalDescription, null);
|
||||
|
||||
assert_equals(pc.pendingRemoteDescription, null);
|
||||
|
||||
assert_array_equals(states, ['have-remote-offer', 'have-local-pranswer']);
|
||||
});
|
||||
}));
|
||||
}, 'setLocalDescription(pranswer) should succeed');
|
||||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
test_state_change_event(t, pc, ['have-remote-offer', 'have-local-pranswer']);
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
const states = [];
|
||||
pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState));
|
||||
|
||||
return pc.createOffer({ offerToReceiveVideo: true })
|
||||
.then(offer =>
|
||||
|
@ -119,13 +127,19 @@
|
|||
const pranswer = { type: 'pranswer', sdp: answer.sdp };
|
||||
|
||||
return pc.setLocalDescription(pranswer)
|
||||
.then(() => pc.setLocalDescription(pranswer));
|
||||
.then(() => pc.setLocalDescription(pranswer))
|
||||
.then(() => {
|
||||
assert_array_equals(states, ['have-remote-offer', 'have-local-pranswer']);
|
||||
});
|
||||
}));
|
||||
}, 'setLocalDescription(pranswer) can be applied multiple times while still in have-local-pranswer');
|
||||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
test_state_change_event(t, pc, ['have-remote-offer', 'have-local-pranswer', 'stable']);
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
const states = [];
|
||||
pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState));
|
||||
|
||||
return pc.createOffer({ offerToReceiveVideo: true })
|
||||
.then(offer =>
|
||||
|
@ -146,6 +160,8 @@
|
|||
|
||||
assert_equals(pc.pendingLocalDescription, null);
|
||||
assert_equals(pc.pendingRemoteDescription, null);
|
||||
|
||||
assert_array_equals(states, ['have-remote-offer', 'have-local-pranswer', 'stable']);
|
||||
});
|
||||
}));
|
||||
}, 'setLocalDescription(answer) from have-local-pranswer state should succeed');
|
||||
|
|
|
@ -12,7 +12,6 @@
|
|||
|
||||
// The following helper functions are called from RTCPeerConnection-helper.js:
|
||||
// assert_session_desc_equals
|
||||
// test_state_change_event
|
||||
|
||||
/*
|
||||
4.3.2. Interface Definition
|
||||
|
@ -58,8 +57,10 @@
|
|||
*/
|
||||
promise_test(t=> {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
test_state_change_event(t, pc, ['have-local-offer', 'stable']);
|
||||
const states = [];
|
||||
pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState));
|
||||
|
||||
return pc.createOffer()
|
||||
.then(offer => pc.setLocalDescription(offer))
|
||||
|
@ -76,6 +77,8 @@
|
|||
assert_equals(pc.localDescription, null);
|
||||
assert_equals(pc.pendingLocalDescription, null);
|
||||
assert_equals(pc.currentLocalDescription, null);
|
||||
|
||||
assert_array_equals(states, ['have-local-offer', 'stable']);
|
||||
});
|
||||
}, 'setLocalDescription(rollback) from have-local-offer state should reset back to stable state');
|
||||
|
||||
|
@ -94,12 +97,14 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
return promise_rejects(t, 'InvalidStateError',
|
||||
pc.setLocalDescription({ type: 'rollback' }));
|
||||
}, `setLocalDescription(rollback) from stable state should reject with InvalidStateError`);
|
||||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
return pc.createOffer({ offerToReceiveAudio: true })
|
||||
.then(offer =>
|
||||
pc.setRemoteDescription(offer)
|
||||
|
@ -113,6 +118,7 @@
|
|||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
return pc.createOffer()
|
||||
.then(offer => pc.setLocalDescription(offer))
|
||||
.then(() => pc.setLocalDescription({
|
||||
|
|
|
@ -14,7 +14,6 @@
|
|||
// generateOffer
|
||||
// assert_session_desc_not_equals
|
||||
// assert_session_desc_equals
|
||||
// test_state_change_event
|
||||
|
||||
/*
|
||||
4.3.2. Interface Definition
|
||||
|
@ -46,7 +45,10 @@
|
|||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
test_state_change_event(t, pc, ['have-local-offer', 'stable', 'have-local-offer']);
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
const states = [];
|
||||
pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState));
|
||||
|
||||
return pc.createOffer({ offerToReceiveAudio: true })
|
||||
.then(offer1 =>
|
||||
|
@ -65,13 +67,17 @@
|
|||
assert_session_desc_equals(pc.localDescription, offer2);
|
||||
assert_session_desc_equals(pc.currentLocalDescription, offer1);
|
||||
assert_session_desc_equals(pc.pendingLocalDescription, offer2);
|
||||
|
||||
assert_array_equals(states, ['have-local-offer', 'stable', 'have-local-offer']);
|
||||
})));
|
||||
}, 'Calling createOffer() and setLocalDescription() again after one round of local-offer/remote-answer should succeed');
|
||||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
test_state_change_event(t, pc,
|
||||
['have-remote-offer', 'stable', 'have-local-offer']);
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
const states = [];
|
||||
pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState));
|
||||
|
||||
return generateOffer({ pc, data: true })
|
||||
.then(offer => pc.setRemoteDescription(offer))
|
||||
|
@ -86,10 +92,26 @@
|
|||
assert_session_desc_equals(pc.localDescription, offer);
|
||||
assert_session_desc_equals(pc.currentLocalDescription, answer);
|
||||
assert_session_desc_equals(pc.pendingLocalDescription, offer);
|
||||
})));
|
||||
|
||||
assert_array_equals(states, ['have-remote-offer', 'stable', 'have-local-offer']);
|
||||
})));
|
||||
}, 'Switching role from answerer to offerer after going back to stable state should succeed');
|
||||
|
||||
promise_test(async t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
const offer = await pc.createOffer();
|
||||
let eventSequence = '';
|
||||
const signalingstatechangeResolver = new Resolver();
|
||||
pc.onsignalingstatechange = () => {
|
||||
eventSequence += 'onsignalingstatechange;';
|
||||
signalingstatechangeResolver.resolve();
|
||||
};
|
||||
await pc.setLocalDescription(offer);
|
||||
eventSequence += 'setLocalDescription;';
|
||||
await signalingstatechangeResolver.promise;
|
||||
assert_equals(eventSequence, 'onsignalingstatechange;setLocalDescription;');
|
||||
}, 'onsignalingstatechange fires before setLocalDescription resolves');
|
||||
|
||||
/*
|
||||
TODO
|
||||
4.3.2. setLocalDescription
|
||||
|
|
|
@ -14,7 +14,6 @@
|
|||
// generateOffer()
|
||||
// generateAnswer()
|
||||
// assert_session_desc_equals()
|
||||
// test_state_change_event()
|
||||
|
||||
/*
|
||||
4.3.2. Interface Definition
|
||||
|
@ -60,7 +59,10 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
test_state_change_event(t, pc, ['have-local-offer', 'stable']);
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
const states = [];
|
||||
pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState));
|
||||
|
||||
return pc.createOffer({ offerToReceiveVideo: true })
|
||||
.then(offer =>
|
||||
|
@ -79,6 +81,8 @@
|
|||
|
||||
assert_equals(pc.pendingLocalDescription, null);
|
||||
assert_equals(pc.pendingRemoteDescription, null);
|
||||
|
||||
assert_array_equals(states, ['have-local-offer', 'stable']);
|
||||
})));
|
||||
}, 'setRemoteDescription() with valid state and answer should succeed');
|
||||
|
||||
|
@ -95,6 +99,8 @@
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.createOffer()
|
||||
.then(offer =>
|
||||
promise_rejects(t, 'InvalidStateError',
|
||||
|
@ -104,6 +110,8 @@
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.createOffer()
|
||||
.then(offer =>
|
||||
pc.setRemoteDescription(offer)
|
||||
|
@ -111,7 +119,6 @@
|
|||
.then(answer =>
|
||||
promise_rejects(t, 'InvalidStateError',
|
||||
pc.setRemoteDescription(answer)));
|
||||
|
||||
}, 'Calling setRemoteDescription(answer) from have-remote-offer state should reject with InvalidStateError');
|
||||
|
||||
</script>
|
||||
|
|
|
@ -12,7 +12,6 @@
|
|||
|
||||
// The following helper functions are called from RTCPeerConnection-helper.js:
|
||||
// assert_session_desc_equals()
|
||||
// test_state_change_event()
|
||||
|
||||
/*
|
||||
4.3.2. Interface Definition
|
||||
|
@ -52,11 +51,14 @@
|
|||
|
||||
promise_test(t => {
|
||||
const pc1 = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc1.close());
|
||||
pc1.createDataChannel('datachannel');
|
||||
|
||||
const pc2 = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc2.close());
|
||||
|
||||
test_state_change_event(t, pc2, ['have-remote-offer']);
|
||||
const states = [];
|
||||
pc2.addEventListener('signalingstatechange', () => states.push(pc2.signalingState));
|
||||
|
||||
return pc1.createOffer()
|
||||
.then(offer => {
|
||||
|
@ -66,18 +68,22 @@
|
|||
assert_session_desc_equals(pc2.remoteDescription, offer);
|
||||
assert_session_desc_equals(pc2.pendingRemoteDescription, offer);
|
||||
assert_equals(pc2.currentRemoteDescription, null);
|
||||
|
||||
assert_array_equals(states, ['have-remote-offer']);
|
||||
});
|
||||
});
|
||||
}, 'setRemoteDescription with valid offer should succeed');
|
||||
}, 'setRemoteDescription with valid offer should succeed');
|
||||
|
||||
promise_test(t => {
|
||||
const pc1 = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc1.close());
|
||||
pc1.createDataChannel('datachannel');
|
||||
|
||||
const pc2 = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc2.close());
|
||||
|
||||
// have-remote-offer event should only fire once
|
||||
test_state_change_event(t, pc2, ['have-remote-offer']);
|
||||
const states = [];
|
||||
pc2.addEventListener('signalingstatechange', () => states.push(pc2.signalingState));
|
||||
|
||||
return pc1.createOffer()
|
||||
.then(offer => {
|
||||
|
@ -88,18 +94,22 @@
|
|||
assert_session_desc_equals(pc2.remoteDescription, offer);
|
||||
assert_session_desc_equals(pc2.pendingRemoteDescription, offer);
|
||||
assert_equals(pc2.currentRemoteDescription, null);
|
||||
|
||||
assert_array_equals(states, ['have-remote-offer']);
|
||||
});
|
||||
});
|
||||
}, 'setRemoteDescription multiple times should succeed');
|
||||
|
||||
promise_test(t => {
|
||||
const pc1 = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc1.close());
|
||||
pc1.createDataChannel('datachannel');
|
||||
|
||||
const pc2 = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc2.close());
|
||||
|
||||
// have-remote-offer event should only fire once
|
||||
test_state_change_event(t, pc2, ['have-remote-offer']);
|
||||
const states = [];
|
||||
pc2.addEventListener('signalingstatechange', () => states.push(pc2.signalingState));
|
||||
|
||||
return pc1.createOffer()
|
||||
.then(offer1 => {
|
||||
|
@ -116,6 +126,8 @@
|
|||
assert_session_desc_equals(pc2.remoteDescription, offer2);
|
||||
assert_session_desc_equals(pc2.pendingRemoteDescription, offer2);
|
||||
assert_equals(pc2.currentRemoteDescription, null);
|
||||
|
||||
assert_array_equals(states, ['have-remote-offer']);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -132,6 +144,8 @@
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.setRemoteDescription({
|
||||
type: 'offer',
|
||||
sdp: 'Invalid SDP'
|
||||
|
@ -159,6 +173,7 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
return pc.createOffer()
|
||||
.then(offer => {
|
||||
return pc.setLocalDescription(offer)
|
||||
|
|
|
@ -14,7 +14,6 @@
|
|||
// generateOffer
|
||||
// generateAnswer
|
||||
// assert_session_desc_equals
|
||||
// test_state_change_event
|
||||
|
||||
/*
|
||||
4.3.2. Interface Definition
|
||||
|
@ -64,6 +63,8 @@
|
|||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
return pc.createOffer()
|
||||
.then(offer =>
|
||||
promise_rejects(t, 'InvalidStateError',
|
||||
|
@ -80,7 +81,10 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
test_state_change_event(t, pc, ['have-local-offer', 'have-remote-pranswer']);
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
const states = [];
|
||||
pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState));
|
||||
|
||||
return pc.createOffer({ offerToReceiveVideo: true })
|
||||
.then(offer =>
|
||||
|
@ -100,13 +104,18 @@
|
|||
assert_session_desc_equals(pc.remoteDescription, pranswer);
|
||||
assert_session_desc_equals(pc.pendingRemoteDescription, pranswer);
|
||||
assert_equals(pc.currentRemoteDescription, null);
|
||||
|
||||
assert_array_equals(states, ['have-local-offer', 'have-remote-pranswer']);
|
||||
});
|
||||
}));
|
||||
}, 'setRemoteDescription(pranswer) from have-local-offer state should succeed');
|
||||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
test_state_change_event(t, pc, ['have-local-offer', 'have-remote-pranswer']);
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
const states = [];
|
||||
pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState));
|
||||
|
||||
return pc.createOffer({ offerToReceiveVideo: true })
|
||||
.then(offer =>
|
||||
|
@ -116,13 +125,19 @@
|
|||
const pranswer = { type: 'pranswer', sdp: answer.sdp };
|
||||
|
||||
return pc.setRemoteDescription(pranswer)
|
||||
.then(() => pc.setRemoteDescription(pranswer));
|
||||
.then(() => pc.setRemoteDescription(pranswer))
|
||||
.then(() => {
|
||||
assert_array_equals(states, ['have-local-offer', 'have-remote-pranswer']);
|
||||
});
|
||||
}));
|
||||
}, 'setRemoteDescription(pranswer) multiple times should succeed');
|
||||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
test_state_change_event(t, pc, ['have-local-offer', 'have-remote-pranswer', 'stable']);
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
const states = [];
|
||||
pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState));
|
||||
|
||||
return pc.createOffer({ offerToReceiveVideo: true })
|
||||
.then(offer =>
|
||||
|
@ -143,6 +158,8 @@
|
|||
assert_session_desc_equals(pc.remoteDescription, answer);
|
||||
assert_session_desc_equals(pc.currentRemoteDescription, answer);
|
||||
assert_equals(pc.pendingRemoteDescription, null);
|
||||
|
||||
assert_array_equals(states, ['have-local-offer', 'have-remote-pranswer', 'stable']);
|
||||
});
|
||||
}));
|
||||
}, 'setRemoteDescription(answer) from have-remote-pranswer state should succeed');
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
|
||||
async_test(t => {
|
||||
const caller = new RTCPeerConnection();
|
||||
t.add_cleanup(() => caller.close());
|
||||
return getUserMediaTracksAndStreams(2)
|
||||
.then(t.step_func(([tracks, streams]) => {
|
||||
const sender = caller.addTrack(tracks[0], streams[0]);
|
||||
|
@ -28,6 +29,7 @@
|
|||
|
||||
async_test(t => {
|
||||
const caller = new RTCPeerConnection();
|
||||
t.add_cleanup(() => caller.close());
|
||||
return getUserMediaTracksAndStreams(1)
|
||||
.then(t.step_func(([tracks, streams]) => {
|
||||
const sender = caller.addTrack(tracks[0], streams[0]);
|
||||
|
@ -44,6 +46,7 @@
|
|||
|
||||
async_test(t => {
|
||||
const caller = new RTCPeerConnection();
|
||||
t.add_cleanup(() => caller.close());
|
||||
return getUserMediaTracksAndStreams(2)
|
||||
.then(t.step_func(([tracks, streams]) => {
|
||||
const sender = caller.addTrack(tracks[0], streams[0]);
|
||||
|
@ -62,6 +65,7 @@
|
|||
async_test(t => {
|
||||
const expectedException = 'InvalidStateError';
|
||||
const caller = new RTCPeerConnection();
|
||||
t.add_cleanup(() => caller.close());
|
||||
return getUserMediaTracksAndStreams(2)
|
||||
.then(t.step_func(([tracks, streams]) => {
|
||||
const sender = caller.addTrack(tracks[0], streams[0]);
|
||||
|
@ -84,6 +88,7 @@
|
|||
async_test(t => {
|
||||
const expectedException = 'InvalidModificationError';
|
||||
const caller = new RTCPeerConnection();
|
||||
t.add_cleanup(() => caller.close());
|
||||
return getUserMediaTracksAndStreams(2)
|
||||
.then(t.step_func(([tracks, streams]) => {
|
||||
const sender = caller.addTrack(tracks[0], streams[0]);
|
||||
|
@ -108,6 +113,7 @@
|
|||
async_test(t => {
|
||||
const expectedException = 'InvalidModificationError';
|
||||
const caller = new RTCPeerConnection();
|
||||
t.add_cleanup(() => caller.close());
|
||||
return getUserMediaTracksAndStreams(2)
|
||||
.then(t.step_func(([tracks, streams]) => {
|
||||
const sender = caller.addTrack(tracks[0], streams[0]);
|
||||
|
|
|
@ -13,7 +13,6 @@
|
|||
// The following helper functions are called from RTCPeerConnection-helper.js:
|
||||
// generateOffer
|
||||
// assert_session_desc_equals
|
||||
// test_state_change_event
|
||||
|
||||
/*
|
||||
4.3.2. Interface Definition
|
||||
|
@ -59,8 +58,10 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
test_state_change_event(t, pc, ['have-remote-offer', 'stable']);
|
||||
const states = [];
|
||||
pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState));
|
||||
|
||||
return generateOffer({ data: true })
|
||||
.then(offer => pc.setRemoteDescription(offer))
|
||||
|
@ -77,6 +78,8 @@
|
|||
assert_equals(pc.remoteDescription, null);
|
||||
assert_equals(pc.pendingRemoteDescription, null);
|
||||
assert_equals(pc.currentRemoteDescription, null);
|
||||
|
||||
assert_array_equals(states, ['have-remote-offer', 'stable']);
|
||||
});
|
||||
}, 'setRemoteDescription(rollback) in have-remote-offer state should revert to stable state');
|
||||
|
||||
|
@ -94,12 +97,14 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
return promise_rejects(t, 'InvalidStateError',
|
||||
pc.setRemoteDescription({ type: 'rollback' }));
|
||||
}, `setRemoteDescription(rollback) from stable state should reject with InvalidStateError`);
|
||||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
return pc.createOffer({ offerToReceiveAudio: true })
|
||||
.then(offer => pc.setRemoteDescription(offer))
|
||||
.then(() => pc.setRemoteDescription({
|
||||
|
|
|
@ -7,420 +7,348 @@
|
|||
<script>
|
||||
'use strict';
|
||||
|
||||
// Test is based on the following editor draft:
|
||||
// https://w3c.github.io/webrtc-pc/archives/20171002/webrtc.html
|
||||
|
||||
// The following helper functions are called from RTCPeerConnection-helper.js:
|
||||
// getUserMediaTracksAndStreams
|
||||
// performOffer
|
||||
// addEventListenerPromise
|
||||
// exchangeOffer
|
||||
// exchangeOfferAnswer
|
||||
// Resolver
|
||||
|
||||
// These tests are concerned with the observable consequences of processing
|
||||
// the addition or removal of remote tracks, including events firing and the
|
||||
// states of RTCPeerConnection, MediaStream and MediaStreamTrack.
|
||||
|
||||
async_test(t => {
|
||||
promise_test(async t => {
|
||||
const caller = new RTCPeerConnection();
|
||||
t.add_cleanup(() => caller.close());
|
||||
const callee = new RTCPeerConnection();
|
||||
return getUserMediaTracksAndStreams(1)
|
||||
.then(t.step_func(([tracks, streams]) => {
|
||||
const localTrack = tracks[0];
|
||||
caller.addTrack(localTrack);
|
||||
const offerPromise = performOffer(caller, callee);
|
||||
callee.ontrack = t.step_func(trackEvent => {
|
||||
const remoteTrack = trackEvent.track;
|
||||
assert_equals(remoteTrack.id, localTrack.id,
|
||||
'Expected local and remote track IDs to match.');
|
||||
assert_equals(trackEvent.streams.length, 0,
|
||||
'Expected remote track not to belong to a stream.');
|
||||
t.done();
|
||||
});
|
||||
return offerPromise;
|
||||
}))
|
||||
.catch(t.step_func(reason => {
|
||||
assert_unreached(reason);
|
||||
}));
|
||||
t.add_cleanup(() => callee.close());
|
||||
const localStream =
|
||||
await navigator.mediaDevices.getUserMedia({audio: true});
|
||||
caller.addTrack(localStream.getTracks()[0]);
|
||||
const ontrackPromise = addEventListenerPromise(t, callee, 'track', e => {
|
||||
assert_equals(e.track.id, localStream.getTracks()[0].id,
|
||||
'Local and remote track IDs match.');
|
||||
assert_equals(e.streams.length, 0, 'No remote stream created.');
|
||||
});
|
||||
await exchangeOffer(caller, callee);
|
||||
await ontrackPromise;
|
||||
}, 'addTrack() with a track and no stream makes ontrack fire with a track and no stream.');
|
||||
|
||||
async_test(t => {
|
||||
promise_test(async t => {
|
||||
const caller = new RTCPeerConnection();
|
||||
t.add_cleanup(() => caller.close());
|
||||
const callee = new RTCPeerConnection();
|
||||
return getUserMediaTracksAndStreams(1)
|
||||
.then(t.step_func(([tracks, streams]) => {
|
||||
const localTrack = tracks[0];
|
||||
const localStream = streams[0];
|
||||
caller.addTrack(localTrack, localStream);
|
||||
const offerPromise = performOffer(caller, callee);
|
||||
callee.ontrack = t.step_func(trackEvent => {
|
||||
assert_equals(trackEvent.streams.length, 1,
|
||||
'Expected track event to fire with a single stream.');
|
||||
const remoteTrack = trackEvent.track;
|
||||
const remoteStream = trackEvent.streams[0];
|
||||
assert_equals(remoteTrack.id, localTrack.id,
|
||||
'Expected local and remote track IDs to match.');
|
||||
assert_equals(remoteStream.id, localStream.id,
|
||||
'Expected local and remote stream IDs to match.');
|
||||
assert_array_equals(remoteStream.getTracks(), [remoteTrack],
|
||||
'Expected the remote stream\'s tracks to be the remote track.');
|
||||
t.done();
|
||||
});
|
||||
return offerPromise;
|
||||
}))
|
||||
.catch(t.step_func(reason => {
|
||||
assert_unreached(reason);
|
||||
}));
|
||||
t.add_cleanup(() => callee.close());
|
||||
const localStream =
|
||||
await navigator.mediaDevices.getUserMedia({audio: true});
|
||||
caller.addTrack(localStream.getTracks()[0], localStream);
|
||||
const ontrackPromise = addEventListenerPromise(t, callee, 'track', e => {
|
||||
assert_equals(e.track.id, localStream.getTracks()[0].id,
|
||||
'Local and remote track IDs match.');
|
||||
assert_equals(e.streams.length, 1, 'Created a single remote stream.');
|
||||
assert_equals(e.streams[0].id, localStream.id,
|
||||
'Local and remote stream IDs match.');
|
||||
assert_array_equals(e.streams[0].getTracks(), [e.track],
|
||||
'The remote stream contains the remote track.');
|
||||
});
|
||||
await exchangeOffer(caller, callee);
|
||||
await ontrackPromise;
|
||||
}, 'addTrack() with a track and a stream makes ontrack fire with a track and a stream.');
|
||||
|
||||
async_test(t => {
|
||||
promise_test(async t => {
|
||||
const caller = new RTCPeerConnection();
|
||||
t.add_cleanup(() => caller.close());
|
||||
const callee = new RTCPeerConnection();
|
||||
t.add_cleanup(() => callee.close());
|
||||
let eventSequence = '';
|
||||
return getUserMediaTracksAndStreams(1)
|
||||
.then(t.step_func(([tracks, streams]) => {
|
||||
const ontrackResolver = new Resolver();
|
||||
callee.ontrack = () => {
|
||||
eventSequence += 'ontrack;';
|
||||
ontrackResolver.resolve();
|
||||
}
|
||||
caller.addTrack(tracks[0]);
|
||||
return Promise.all([
|
||||
ontrackResolver.promise,
|
||||
performOffer(caller, callee).then(() => {
|
||||
eventSequence += 'setRemoteDescription;';
|
||||
})
|
||||
]);
|
||||
}))
|
||||
.then(t.step_func(() => {
|
||||
assert_equals(eventSequence, 'ontrack;setRemoteDescription;');
|
||||
t.done();
|
||||
}))
|
||||
.catch(t.step_func(reason => {
|
||||
assert_unreached(reason);
|
||||
}));
|
||||
const localStream =
|
||||
await navigator.mediaDevices.getUserMedia({audio: true});
|
||||
caller.addTrack(localStream.getTracks()[0], localStream);
|
||||
const ontrackPromise = addEventListenerPromise(t, callee, 'track', e => {
|
||||
eventSequence += 'ontrack;';
|
||||
});
|
||||
await exchangeOffer(caller, callee);
|
||||
eventSequence += 'setRemoteDescription;';
|
||||
await ontrackPromise;
|
||||
assert_equals(eventSequence, 'ontrack;setRemoteDescription;');
|
||||
}, 'ontrack fires before setRemoteDescription resolves.');
|
||||
|
||||
async_test(t => {
|
||||
promise_test(async t => {
|
||||
const caller = new RTCPeerConnection();
|
||||
t.add_cleanup(() => caller.close());
|
||||
const callee = new RTCPeerConnection();
|
||||
return getUserMediaTracksAndStreams(2)
|
||||
.then(t.step_func(([tracks, streams]) => {
|
||||
const localTrack1 = tracks[0];
|
||||
const localTrack2 = tracks[1];
|
||||
const localStream = streams[0];
|
||||
caller.addTrack(localTrack1, localStream);
|
||||
caller.addTrack(localTrack2, localStream);
|
||||
const offerPromise = performOffer(caller, callee);
|
||||
callee.ontrack = t.step_func(trackEvent => {
|
||||
assert_equals(trackEvent.streams.length, 1,
|
||||
'Expected track event to fire with a single stream.');
|
||||
const remoteTrack1 = trackEvent.track;
|
||||
const remoteStream = trackEvent.streams[0];
|
||||
assert_equals(remoteTrack1.id, localTrack1.id,
|
||||
'Expected first remote track ID to match first local track ID.');
|
||||
assert_equals(remoteStream.getTracks().length, 2,
|
||||
'Expected the remote stream to contain two tracks.');
|
||||
callee.ontrack = t.step_func(trackEvent => {
|
||||
assert_equals(trackEvent.streams.length, 1,
|
||||
'Expected track event to fire with a single stream.');
|
||||
const remoteTrack2 = trackEvent.track;
|
||||
assert_equals(trackEvent.streams[0], remoteStream,
|
||||
'Expected both track events to fire with the same remote stream.');
|
||||
assert_equals(remoteTrack2.id, localTrack2.id,
|
||||
'Expected second remote track ID to match second local track ID.');
|
||||
assert_equals(remoteStream.getTracks().length, 2,
|
||||
'Expected the remote stream to contain two tracks.');
|
||||
assert_array_equals(remoteStream.getTracks(), [remoteTrack1, remoteTrack2],
|
||||
'Expected the remote stream\'s tracks to be the [first, second] remote tracks.');
|
||||
t.done();
|
||||
});
|
||||
});
|
||||
return offerPromise;
|
||||
}))
|
||||
.catch(t.step_func(reason => {
|
||||
assert_unreached(reason);
|
||||
}));
|
||||
t.add_cleanup(() => callee.close());
|
||||
const localStreams = await Promise.all([
|
||||
navigator.mediaDevices.getUserMedia({audio: true}),
|
||||
navigator.mediaDevices.getUserMedia({audio: true}),
|
||||
]);
|
||||
caller.addTrack(localStreams[0].getTracks()[0], localStreams[0]);
|
||||
caller.addTrack(localStreams[1].getTracks()[0], localStreams[0]);
|
||||
let ontrackEventsFired = 0;
|
||||
const ontrackEventResolvers = [ new Resolver(), new Resolver() ];
|
||||
callee.ontrack = t.step_func(e => {
|
||||
ontrackEventResolvers[ontrackEventsFired++].resolve(e);
|
||||
});
|
||||
await exchangeOffer(caller, callee);
|
||||
let firstTrackEvent = await ontrackEventResolvers[0].promise;
|
||||
assert_equals(firstTrackEvent.track.id,
|
||||
localStreams[0].getTracks()[0].id,
|
||||
'First ontrack\'s track ID matches first local track.');
|
||||
assert_equals(firstTrackEvent.streams.length, 1,
|
||||
'First ontrack fires with a single stream.');
|
||||
assert_equals(firstTrackEvent.streams[0].id,
|
||||
localStreams[0].id,
|
||||
'First ontrack\'s stream ID matches local stream.');
|
||||
let secondTrackEvent = await ontrackEventResolvers[1].promise;
|
||||
assert_equals(secondTrackEvent.track.id,
|
||||
localStreams[1].getTracks()[0].id,
|
||||
'Second ontrack\'s track ID matches second local track.');
|
||||
assert_equals(secondTrackEvent.streams.length, 1,
|
||||
'Second ontrack fires with a single stream.');
|
||||
assert_equals(secondTrackEvent.streams[0].id,
|
||||
localStreams[0].id,
|
||||
'Second ontrack\'s stream ID matches local stream.');
|
||||
assert_array_equals(firstTrackEvent.streams, secondTrackEvent.streams,
|
||||
'ontrack was fired with the same streams both times.');
|
||||
assert_array_equals(firstTrackEvent.streams[0].getTracks(),
|
||||
[firstTrackEvent.track, secondTrackEvent.track],
|
||||
'The remote stream == [first track, second track].');
|
||||
assert_equals(ontrackEventsFired, 2, 'Unexpected number of track events.');
|
||||
}, 'addTrack() with two tracks and one stream makes ontrack fire twice with the tracks and shared stream.');
|
||||
|
||||
async_test(t => {
|
||||
promise_test(async t => {
|
||||
const caller = new RTCPeerConnection();
|
||||
t.add_cleanup(() => caller.close());
|
||||
const callee = new RTCPeerConnection();
|
||||
return getUserMediaTracksAndStreams(2)
|
||||
.then(t.step_func(([tracks, streams]) => {
|
||||
const localTracks = tracks;
|
||||
const localStream = streams[0];
|
||||
caller.addTrack(localTracks[0], localStream);
|
||||
const offerPromise = performOffer(caller, callee);
|
||||
callee.ontrack = t.step_func(trackEvent => {
|
||||
assert_equals(trackEvent.streams.length, 1,
|
||||
'Expected track event to fire with a single stream.');
|
||||
const remoteTracks = [ trackEvent.track ];
|
||||
const remoteStream = trackEvent.streams[0];
|
||||
assert_equals(remoteTracks[0].id, localTracks[0].id, 'Remote track ID.');
|
||||
assert_equals(remoteStream.id, localStream.id, 'Remote stream ID.');
|
||||
assert_array_equals(remoteStream.getTracks(), remoteTracks,
|
||||
'Expected the remote stream\'s tracks to be the remote track.');
|
||||
caller.addTrack(localTracks[1], localStream);
|
||||
performOffer(caller, callee);
|
||||
remoteStream.onaddtrack = t.step_func(trackEvent => {
|
||||
remoteTracks.push(trackEvent.track);
|
||||
assert_equals(remoteTracks[1].id, localTracks[1].id, 'Remote track ID.');
|
||||
assert_array_equals(remoteStream.getTracks(), remoteTracks,
|
||||
'Expected the remote stream\'s tracks to be the remote tracks.');
|
||||
t.done();
|
||||
});
|
||||
});
|
||||
return offerPromise;
|
||||
}))
|
||||
.catch(t.step_func(reason => {
|
||||
assert_unreached(reason);
|
||||
}));
|
||||
t.add_cleanup(() => callee.close());
|
||||
let eventSequence = '';
|
||||
const localStreams = await Promise.all([
|
||||
navigator.mediaDevices.getUserMedia({audio: true}),
|
||||
navigator.mediaDevices.getUserMedia({audio: true}),
|
||||
]);
|
||||
caller.addTrack(localStreams[0].getTracks()[0], localStreams[0]);
|
||||
const remoteStreams = [];
|
||||
callee.ontrack = e => {
|
||||
if (!remoteStreams.includes(e.streams[0]))
|
||||
remoteStreams.push(e.streams[0]);
|
||||
};
|
||||
await exchangeOfferAnswer(caller, callee);
|
||||
assert_equals(remoteStreams.length, 1, 'One remote stream created.');
|
||||
assert_equals(remoteStreams[0].getTracks()[0].id,
|
||||
localStreams[0].getTracks()[0].id,
|
||||
'First local and remote tracks have the same ID.');
|
||||
const onaddtrackPromise =
|
||||
addEventListenerPromise(t, remoteStreams[0], 'addtrack', e => {
|
||||
assert_equals(e.track.id, localStreams[1].getTracks()[0].id,
|
||||
'Second local and remote tracks have the same ID.');
|
||||
});
|
||||
caller.addTrack(localStreams[1].getTracks()[0], localStreams[0]);
|
||||
await exchangeOffer(caller, callee);
|
||||
await onaddtrackPromise;
|
||||
assert_equals(remoteStreams.length, 1, 'Still a single remote stream.');
|
||||
}, 'addTrack() for an existing stream makes stream.onaddtrack fire.');
|
||||
|
||||
async_test(t => {
|
||||
promise_test(async t => {
|
||||
const caller = new RTCPeerConnection();
|
||||
t.add_cleanup(() => caller.close());
|
||||
const callee = new RTCPeerConnection();
|
||||
t.add_cleanup(() => callee.close());
|
||||
let eventSequence = '';
|
||||
return getUserMediaTracksAndStreams(2)
|
||||
.then(t.step_func(([tracks, streams]) => {
|
||||
const localTracks = tracks;
|
||||
const localStream = streams[0];
|
||||
caller.addTrack(localTracks[0], localStream);
|
||||
const offerPromise = performOffer(caller, callee);
|
||||
callee.ontrack = t.step_func(trackEvent => {
|
||||
callee.ontrack = null;
|
||||
const remoteStream = trackEvent.streams[0];
|
||||
const onaddtrackResolver = new Resolver();
|
||||
remoteStream.onaddtrack = () => {
|
||||
eventSequence += 'stream.onaddtrack;';
|
||||
onaddtrackResolver.resolve();
|
||||
}
|
||||
caller.addTrack(localTracks[1], localStream);
|
||||
Promise.all([
|
||||
onaddtrackResolver.promise,
|
||||
performOffer(caller, callee).then(() => {
|
||||
eventSequence += 'setRemoteDescription;';
|
||||
})
|
||||
]).then(t.step_func(() => {
|
||||
assert_equals(eventSequence, 'stream.onaddtrack;setRemoteDescription;');
|
||||
t.done();
|
||||
}));
|
||||
});
|
||||
return offerPromise;
|
||||
}))
|
||||
.catch(t.step_func(reason => {
|
||||
assert_unreached(reason);
|
||||
}));
|
||||
const localStreams = await Promise.all([
|
||||
navigator.mediaDevices.getUserMedia({audio: true}),
|
||||
navigator.mediaDevices.getUserMedia({audio: true}),
|
||||
]);
|
||||
caller.addTrack(localStreams[0].getTracks()[0], localStreams[0]);
|
||||
const remoteStreams = [];
|
||||
callee.ontrack = e => {
|
||||
if (!remoteStreams.includes(e.streams[0]))
|
||||
remoteStreams.push(e.streams[0]);
|
||||
};
|
||||
await exchangeOfferAnswer(caller, callee);
|
||||
assert_equals(remoteStreams.length, 1, 'One remote stream created.');
|
||||
const onaddtrackPromise =
|
||||
addEventListenerPromise(t, remoteStreams[0], 'addtrack', e => {
|
||||
eventSequence += 'stream.onaddtrack;';
|
||||
});
|
||||
caller.addTrack(localStreams[1].getTracks()[0], localStreams[0]);
|
||||
await exchangeOffer(caller, callee);
|
||||
eventSequence += 'setRemoteDescription;';
|
||||
await onaddtrackPromise;
|
||||
assert_equals(remoteStreams.length, 1, 'Still a single remote stream.');
|
||||
assert_equals(eventSequence, 'stream.onaddtrack;setRemoteDescription;');
|
||||
}, 'stream.onaddtrack fires before setRemoteDescription resolves.');
|
||||
|
||||
async_test(t => {
|
||||
promise_test(async t => {
|
||||
const caller = new RTCPeerConnection();
|
||||
t.add_cleanup(() => caller.close());
|
||||
const callee = new RTCPeerConnection();
|
||||
return getUserMediaTracksAndStreams(2)
|
||||
.then(t.step_func(([tracks, streams]) => {
|
||||
const localTrack = tracks[0];
|
||||
const localStreams = streams;
|
||||
caller.addTrack(localTrack, localStreams[0], localStreams[1]);
|
||||
const performOffer = performOffer(caller, callee);
|
||||
callee.ontrack = t.step_func(trackEvent => {
|
||||
assert_equals(trackEvent.streams.length, 2,
|
||||
'Expected the track event to fire with two streams.');
|
||||
const remoteTrack = trackEvent.track;
|
||||
const remoteStreams = trackEvent.streams;
|
||||
assert_equals(remoteTrack.id, localTrack.id,
|
||||
'Expected local and remote track IDs to match.');
|
||||
assert_equals(remoteStreams[0].id, localStreams[0].id,
|
||||
'Expected the first remote stream ID to match the first local stream ID.');
|
||||
assert_equals(remoteStreams[1].id, localStreams[1].id,
|
||||
'Expected the second remote stream ID to match the second local stream ID.');
|
||||
assert_array_equals(remoteStreams[0].getTracks(), [remoteTrack],
|
||||
'Expected the remote stream\'s tracks to be the remote track.');
|
||||
assert_array_equals(remoteStreams[1].getTracks(), [remoteTrack],
|
||||
'Expected the remote stream\'s tracks to be the remote track.');
|
||||
t.done();
|
||||
});
|
||||
return performOffer;
|
||||
}))
|
||||
.catch(t.step_func(reason => {
|
||||
assert_unreached(reason);
|
||||
}));
|
||||
t.add_cleanup(() => callee.close());
|
||||
const localStreams = await Promise.all([
|
||||
navigator.mediaDevices.getUserMedia({audio: true}),
|
||||
navigator.mediaDevices.getUserMedia({audio: true}),
|
||||
]);
|
||||
caller.addTrack(localStreams[0].getTracks()[0],
|
||||
localStreams[0], localStreams[1]);
|
||||
const ontrackPromise = addEventListenerPromise(t, callee, 'track', e => {
|
||||
assert_equals(e.track.id, localStreams[0].getTracks()[0].id,
|
||||
'Local and remote track IDs match.');
|
||||
assert_equals(e.streams.length, 2, 'Two remote stream created.');
|
||||
assert_array_equals(e.streams[0].getTracks(), [e.track],
|
||||
'First remote stream == [remote track].');
|
||||
assert_array_equals(e.streams[1].getTracks(), [e.track],
|
||||
'Second remote stream == [remote track].');
|
||||
assert_equals(e.streams[0].id, localStreams[0].id,
|
||||
'First local and remote stream IDs match.');
|
||||
assert_equals(e.streams[1].id, localStreams[1].id,
|
||||
'Second local and remote stream IDs match.');
|
||||
});
|
||||
await exchangeOffer(caller, callee);
|
||||
await ontrackPromise;
|
||||
}, 'addTrack() with a track and two streams makes ontrack fire with a track and two streams.');
|
||||
|
||||
async_test(t => {
|
||||
promise_test(async t => {
|
||||
const caller = new RTCPeerConnection();
|
||||
t.add_cleanup(() => caller.close());
|
||||
const callee = new RTCPeerConnection();
|
||||
return getUserMediaTracksAndStreams(1)
|
||||
.then(t.step_func(([tracks, streams]) => {
|
||||
caller.addTrack(tracks[0]);
|
||||
const offerPromise = performOffer(caller, callee);
|
||||
callee.ontrack = t.step_func(trackEvent => {
|
||||
assert_array_equals(callee.getReceivers(), [trackEvent.receiver]);
|
||||
t.done();
|
||||
});
|
||||
return offerPromise;
|
||||
}))
|
||||
.catch(t.step_func(reason => {
|
||||
assert_unreached(reason);
|
||||
}));
|
||||
t.add_cleanup(() => callee.close());
|
||||
const localStream =
|
||||
await navigator.mediaDevices.getUserMedia({audio: true});
|
||||
caller.addTrack(localStream.getTracks()[0]);
|
||||
const ontrackPromise = addEventListenerPromise(t, callee, 'track', e => {
|
||||
assert_array_equals(callee.getReceivers(), [e.receiver],
|
||||
'getReceivers() == [e.receiver].');
|
||||
});
|
||||
await exchangeOffer(caller, callee);
|
||||
await ontrackPromise;
|
||||
}, 'ontrack\'s receiver matches getReceivers().');
|
||||
|
||||
async_test(t => {
|
||||
promise_test(async t => {
|
||||
const caller = new RTCPeerConnection();
|
||||
t.add_cleanup(() => caller.close());
|
||||
const callee = new RTCPeerConnection();
|
||||
return getUserMediaTracksAndStreams(1)
|
||||
.then(t.step_func(([tracks, streams]) => {
|
||||
const sender = caller.addTrack(tracks[0]);
|
||||
assert_not_equals(sender, null);
|
||||
const offerPromise = performOffer(caller, callee);
|
||||
callee.ontrack = t.step_func(trackEvent => {
|
||||
const receivers = callee.getReceivers();
|
||||
assert_equals(receivers.length, 1,
|
||||
'Expected getReceivers() to be the track event\'s receiver.');
|
||||
caller.removeTrack(sender);
|
||||
performOffer(caller, callee)
|
||||
.then(t.step_func(() => {
|
||||
assert_array_equals(callee.getReceivers(), receivers,
|
||||
'Expected the set of receivers to remain the same.');
|
||||
t.done();
|
||||
}));
|
||||
});
|
||||
return offerPromise;
|
||||
}))
|
||||
.catch(t.step_func(reason => {
|
||||
assert_unreached(reason);
|
||||
}));
|
||||
t.add_cleanup(() => callee.close());
|
||||
const localStream =
|
||||
await navigator.mediaDevices.getUserMedia({audio: true});
|
||||
const sender = caller.addTrack(localStream.getTracks()[0]);
|
||||
const ontrackPromise = addEventListenerPromise(t, callee, 'track');
|
||||
await exchangeOfferAnswer(caller, callee);
|
||||
await ontrackPromise;
|
||||
assert_equals(callee.getReceivers().length, 1, 'One receiver created.');
|
||||
caller.removeTrack(sender);
|
||||
await exchangeOffer(caller, callee);
|
||||
assert_equals(callee.getReceivers().length, 1, 'Receiver not removed.');
|
||||
}, 'removeTrack() does not remove the receiver.');
|
||||
|
||||
async_test(t => {
|
||||
promise_test(async t => {
|
||||
const caller = new RTCPeerConnection();
|
||||
t.add_cleanup(() => caller.close());
|
||||
const callee = new RTCPeerConnection();
|
||||
return getUserMediaTracksAndStreams(1)
|
||||
.then(t.step_func(([tracks, streams]) => {
|
||||
const sender = caller.addTrack(tracks[0], streams[0]);
|
||||
assert_not_equals(sender, null);
|
||||
const offerPromise = performOffer(caller, callee);
|
||||
callee.ontrack = t.step_func(trackEvent => {
|
||||
assert_not_equals(trackEvent.track, null);
|
||||
assert_equals(trackEvent.streams.length, 1);
|
||||
assert_true(trackEvent.streams[0].getTracks().includes(trackEvent.track));
|
||||
caller.removeTrack(sender);
|
||||
performOffer(caller, callee);
|
||||
trackEvent.streams[0].onremovetrack = t.step_func(removeEvent => {
|
||||
assert_equals(removeEvent.track, trackEvent.track);
|
||||
assert_false(trackEvent.streams[0].getTracks().includes(trackEvent.track));
|
||||
t.done();
|
||||
});
|
||||
});
|
||||
return offerPromise;
|
||||
}))
|
||||
.catch(t.step_func(reason => {
|
||||
assert_unreached(reason);
|
||||
}));
|
||||
t.add_cleanup(() => callee.close());
|
||||
const localStream =
|
||||
await navigator.mediaDevices.getUserMedia({audio: true});
|
||||
const sender = caller.addTrack(localStream.getTracks()[0], localStream);
|
||||
const ontrackPromise = addEventListenerPromise(t, callee, 'track', e => {
|
||||
assert_equals(e.streams.length, 1);
|
||||
return e.streams[0];
|
||||
});
|
||||
await exchangeOfferAnswer(caller, callee);
|
||||
const remoteStream = await ontrackPromise;
|
||||
const remoteTrack = remoteStream.getTracks()[0];
|
||||
const onremovetrackPromise =
|
||||
addEventListenerPromise(t, remoteStream, 'removetrack', e => {
|
||||
assert_equals(e.track, remoteTrack);
|
||||
assert_equals(remoteStream.getTracks().length, 0,
|
||||
'Remote stream emptied of tracks.');
|
||||
});
|
||||
caller.removeTrack(sender);
|
||||
await exchangeOffer(caller, callee);
|
||||
await onremovetrackPromise;
|
||||
}, 'removeTrack() makes stream.onremovetrack fire and the track to be removed from the stream.');
|
||||
|
||||
async_test(t => {
|
||||
promise_test(async t => {
|
||||
const caller = new RTCPeerConnection();
|
||||
t.add_cleanup(() => caller.close());
|
||||
const callee = new RTCPeerConnection();
|
||||
t.add_cleanup(() => callee.close());
|
||||
let eventSequence = '';
|
||||
return getUserMediaTracksAndStreams(1)
|
||||
.then(t.step_func(([tracks, streams]) => {
|
||||
const sender = caller.addTrack(tracks[0], streams[0]);
|
||||
assert_not_equals(sender, null);
|
||||
const offerPromise = performOffer(caller, callee);
|
||||
callee.ontrack = t.step_func(trackEvent => {
|
||||
const remoteStream = trackEvent.streams[0];
|
||||
const onremovetrackResolver = new Resolver();
|
||||
remoteStream.onremovetrack = t.step_func(removeEvent => {
|
||||
eventSequence += 'stream.onremovetrack;';
|
||||
onremovetrackResolver.resolve();
|
||||
});
|
||||
caller.removeTrack(sender);
|
||||
return Promise.all([
|
||||
onremovetrackResolver.promise,
|
||||
performOffer(caller, callee).then(() => {
|
||||
eventSequence += 'setRemoteDescription;';
|
||||
})
|
||||
]).then(t.step_func(() => {
|
||||
assert_equals(eventSequence, 'stream.onremovetrack;setRemoteDescription;');
|
||||
t.done();
|
||||
}));
|
||||
});
|
||||
return offerPromise;
|
||||
}))
|
||||
.catch(t.step_func(reason => {
|
||||
assert_unreached(reason);
|
||||
}));
|
||||
const localStream =
|
||||
await navigator.mediaDevices.getUserMedia({audio: true});
|
||||
const sender = caller.addTrack(localStream.getTracks()[0], localStream);
|
||||
const ontrackPromise = addEventListenerPromise(t, callee, 'track', e => {
|
||||
assert_equals(e.streams.length, 1);
|
||||
return e.streams[0];
|
||||
});
|
||||
await exchangeOfferAnswer(caller, callee);
|
||||
const remoteStream = await ontrackPromise;
|
||||
const remoteTrack = remoteStream.getTracks()[0];
|
||||
const onremovetrackPromise =
|
||||
addEventListenerPromise(t, remoteStream, 'removetrack', e => {
|
||||
eventSequence += 'stream.onremovetrack;';
|
||||
});
|
||||
caller.removeTrack(sender);
|
||||
await exchangeOffer(caller, callee);
|
||||
eventSequence += 'setRemoteDescription;';
|
||||
await onremovetrackPromise;
|
||||
assert_equals(eventSequence, 'stream.onremovetrack;setRemoteDescription;');
|
||||
}, 'stream.onremovetrack fires before setRemoteDescription resolves.');
|
||||
|
||||
async_test(t => {
|
||||
promise_test(async t => {
|
||||
const caller = new RTCPeerConnection();
|
||||
t.add_cleanup(() => caller.close());
|
||||
const callee = new RTCPeerConnection();
|
||||
return getUserMediaTracksAndStreams(1)
|
||||
.then(t.step_func(([tracks, streams]) => {
|
||||
const sender = caller.addTrack(tracks[0]);
|
||||
assert_not_equals(sender, null);
|
||||
const offerPromise = performOffer(caller, callee);
|
||||
callee.ontrack = t.step_func(trackEvent => {
|
||||
const remoteTrack = trackEvent.track;
|
||||
caller.removeTrack(sender);
|
||||
performOffer(caller, callee);
|
||||
remoteTrack.onmute = t.step_func(() => {
|
||||
assert_true(trackEvent.track.muted);
|
||||
t.done();
|
||||
});
|
||||
});
|
||||
return offerPromise;
|
||||
}))
|
||||
.catch(t.step_func(reason => {
|
||||
assert_unreached(reason);
|
||||
}));
|
||||
t.add_cleanup(() => callee.close());
|
||||
const localStream =
|
||||
await navigator.mediaDevices.getUserMedia({audio: true});
|
||||
const sender = caller.addTrack(localStream.getTracks()[0], localStream);
|
||||
const ontrackPromise = addEventListenerPromise(t, callee, 'track', e => {
|
||||
assert_equals(e.streams.length, 1);
|
||||
return e.streams[0];
|
||||
});
|
||||
await exchangeOfferAnswer(caller, callee);
|
||||
const remoteStream = await ontrackPromise;
|
||||
const remoteTrack = remoteStream.getTracks()[0];
|
||||
const onmutePromise =
|
||||
addEventListenerPromise(t, remoteTrack, 'mute', () => {
|
||||
assert_true(remoteTrack.muted);
|
||||
});
|
||||
caller.removeTrack(sender);
|
||||
await exchangeOffer(caller, callee);
|
||||
await onmutePromise;
|
||||
}, 'removeTrack() makes track.onmute fire and the track to be muted.');
|
||||
|
||||
async_test(t => {
|
||||
promise_test(async t => {
|
||||
const caller = new RTCPeerConnection();
|
||||
t.add_cleanup(() => caller.close());
|
||||
const callee = new RTCPeerConnection();
|
||||
t.add_cleanup(() => callee.close());
|
||||
let eventSequence = '';
|
||||
return getUserMediaTracksAndStreams(1)
|
||||
.then(t.step_func(([tracks, streams]) => {
|
||||
const sender = caller.addTrack(tracks[0]);
|
||||
assert_not_equals(sender, null);
|
||||
const offerPromise = performOffer(caller, callee);
|
||||
callee.ontrack = t.step_func(trackEvent => {
|
||||
const remoteTrack = trackEvent.track;
|
||||
const onmuteResolver = new Resolver();
|
||||
remoteTrack.onmute = t.step_func(() => {
|
||||
eventSequence += 'track.onmute;';
|
||||
onmuteResolver.resolve();
|
||||
});
|
||||
caller.removeTrack(sender);
|
||||
return Promise.all([
|
||||
onmuteResolver.promise,
|
||||
performOffer(caller, callee).then(() => {
|
||||
eventSequence += 'setRemoteDescription;';
|
||||
})
|
||||
]).then(t.step_func(() => {
|
||||
assert_equals(eventSequence, 'track.onmute;setRemoteDescription;');
|
||||
t.done();
|
||||
}));
|
||||
});
|
||||
return offerPromise;
|
||||
}))
|
||||
.catch(t.step_func(reason => {
|
||||
assert_unreached(reason);
|
||||
}));
|
||||
const localStream =
|
||||
await navigator.mediaDevices.getUserMedia({audio: true});
|
||||
const sender = caller.addTrack(localStream.getTracks()[0], localStream);
|
||||
const ontrackPromise = addEventListenerPromise(t, callee, 'track', e => {
|
||||
assert_equals(e.streams.length, 1);
|
||||
return e.streams[0];
|
||||
});
|
||||
await exchangeOfferAnswer(caller, callee);
|
||||
const remoteStream = await ontrackPromise;
|
||||
const remoteTrack = remoteStream.getTracks()[0];
|
||||
const onmutePromise =
|
||||
addEventListenerPromise(t, remoteTrack, 'mute', () => {
|
||||
eventSequence += 'track.onmute;';
|
||||
});
|
||||
caller.removeTrack(sender);
|
||||
await exchangeOffer(caller, callee);
|
||||
eventSequence += 'setRemoteDescription;';
|
||||
await onmutePromise;
|
||||
assert_equals(eventSequence, 'track.onmute;setRemoteDescription;');
|
||||
}, 'track.onmute fires before setRemoteDescription resolves.');
|
||||
|
||||
async_test(t => {
|
||||
promise_test(async t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
return getUserMediaTracksAndStreams(1)
|
||||
.then(t.step_func(([tracks, streams]) => {
|
||||
const sender = pc.addTrack(tracks[0]);
|
||||
assert_not_equals(sender, null);
|
||||
pc.removeTrack(sender);
|
||||
pc.removeTrack(sender);
|
||||
t.done();
|
||||
}))
|
||||
.catch(t.step_func(reason => {
|
||||
assert_unreached(reason);
|
||||
}));
|
||||
t.add_cleanup(() => pc.close());
|
||||
const stream = await navigator.mediaDevices.getUserMedia({audio: true});
|
||||
const sender = pc.addTrack(stream.getTracks()[0]);
|
||||
pc.removeTrack(sender);
|
||||
pc.removeTrack(sender);
|
||||
}, 'removeTrack() twice is safe.');
|
||||
</script>
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
|
||||
async_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
let track;
|
||||
return getUserMediaTracksAndStreams(1)
|
||||
.then(t.step_func(([tracks, streams]) => {
|
||||
|
@ -43,6 +44,7 @@
|
|||
|
||||
async_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
let stream;
|
||||
return getUserMediaTracksAndStreams(1)
|
||||
.then(t.step_func(([tracks, streams]) => {
|
||||
|
@ -64,6 +66,7 @@
|
|||
|
||||
async_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
let track;
|
||||
return getUserMediaTracksAndStreams(1)
|
||||
.then(t.step_func(([tracks, streams]) => {
|
||||
|
@ -90,6 +93,7 @@
|
|||
|
||||
async_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
let stream;
|
||||
return getUserMediaTracksAndStreams(1)
|
||||
.then(t.step_func(([tracks, streams]) => {
|
||||
|
@ -117,6 +121,7 @@
|
|||
|
||||
async_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
let track;
|
||||
let stream;
|
||||
return getUserMediaTracksAndStreams(1)
|
||||
|
@ -155,6 +160,7 @@
|
|||
// https://github.com/w3c/webrtc-pc/issues/1125
|
||||
async_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
let track;
|
||||
let stream;
|
||||
return getUserMediaTracksAndStreams(1)
|
||||
|
@ -189,7 +195,9 @@
|
|||
|
||||
async_test(t => {
|
||||
const caller = new RTCPeerConnection();
|
||||
t.add_cleanup(() => caller.close());
|
||||
const callee = new RTCPeerConnection();
|
||||
t.add_cleanup(() => callee.close());
|
||||
let sendingTrack;
|
||||
return getUserMediaTracksAndStreams(1)
|
||||
.then(t.step_func(([tracks, streams]) => {
|
||||
|
@ -217,7 +225,9 @@
|
|||
|
||||
async_test(t => {
|
||||
const caller = new RTCPeerConnection();
|
||||
t.add_cleanup(() => caller.close());
|
||||
const callee = new RTCPeerConnection();
|
||||
t.add_cleanup(() => callee.close());
|
||||
let receivingTrack;
|
||||
callee.ontrack = trackEvent => {
|
||||
assert_true(receivingTrack == undefined, 'ontrack has not fired before');
|
||||
|
@ -249,7 +259,9 @@
|
|||
|
||||
async_test(t => {
|
||||
const caller = new RTCPeerConnection();
|
||||
t.add_cleanup(() => caller.close());
|
||||
const callee = new RTCPeerConnection();
|
||||
t.add_cleanup(() => callee.close());
|
||||
let sendingTrack1;
|
||||
let sendingTrack2;
|
||||
let sender;
|
||||
|
@ -276,7 +288,9 @@
|
|||
|
||||
async_test(t => {
|
||||
const caller = new RTCPeerConnection();
|
||||
t.add_cleanup(() => caller.close());
|
||||
const callee = new RTCPeerConnection();
|
||||
t.add_cleanup(() => callee.close());
|
||||
let sendingTrack1;
|
||||
let sendingTrack2;
|
||||
let sender;
|
||||
|
@ -285,7 +299,7 @@
|
|||
sendingTrack1 = tracks[0];
|
||||
sendingTrack2 = tracks[1];
|
||||
sender = caller.addTrack(sendingTrack1);
|
||||
return performOffer(caller, callee);
|
||||
return exchangeOffer(caller, callee);
|
||||
}))
|
||||
.then(t.step_func(() => {
|
||||
return sender.replaceTrack(sendingTrack2);
|
||||
|
@ -311,7 +325,9 @@
|
|||
|
||||
async_test(t => {
|
||||
const caller = new RTCPeerConnection();
|
||||
t.add_cleanup(() => caller.close());
|
||||
const callee = new RTCPeerConnection();
|
||||
t.add_cleanup(() => callee.close());
|
||||
let sendingTrack1;
|
||||
let sendingTrack2;
|
||||
let sender;
|
||||
|
@ -345,7 +361,9 @@
|
|||
|
||||
async_test(t => {
|
||||
const caller = new RTCPeerConnection();
|
||||
t.add_cleanup(() => caller.close());
|
||||
const callee = new RTCPeerConnection();
|
||||
t.add_cleanup(() => callee.close());
|
||||
let sendingTrack1;
|
||||
let sendingTrack2;
|
||||
let sender;
|
||||
|
@ -380,7 +398,9 @@
|
|||
|
||||
promise_test(async t => {
|
||||
const caller = new RTCPeerConnection();
|
||||
t.add_cleanup(() => caller.close());
|
||||
const callee = new RTCPeerConnection();
|
||||
t.add_cleanup(() => callee.close());
|
||||
let [tracks, streams] = await getUserMediaTracksAndStreams(2);
|
||||
let sender = caller.addTrack(tracks[0], streams[0]);
|
||||
callee.addTrack(tracks[1], streams[1]);
|
||||
|
@ -426,7 +446,9 @@
|
|||
|
||||
promise_test(async t => {
|
||||
const caller = new RTCPeerConnection();
|
||||
t.add_cleanup(() => caller.close());
|
||||
const callee = new RTCPeerConnection();
|
||||
t.add_cleanup(() => callee.close());
|
||||
let [tracks, streams] = await getUserMediaTracksAndStreams(2);
|
||||
let sender = caller.addTrack(tracks[0], streams[0]);
|
||||
callee.addTrack(tracks[1], streams[1]);
|
||||
|
@ -472,7 +494,9 @@
|
|||
|
||||
promise_test(async t => {
|
||||
const caller = new RTCPeerConnection();
|
||||
t.add_cleanup(() => caller.close());
|
||||
const callee = new RTCPeerConnection();
|
||||
t.add_cleanup(() => callee.close());
|
||||
let [tracks, streams] = await getUserMediaTracksAndStreams(2);
|
||||
let sender = caller.addTrack(tracks[0], streams[0]);
|
||||
callee.addTrack(tracks[1], streams[1]);
|
||||
|
@ -497,7 +521,9 @@
|
|||
|
||||
promise_test(async t => {
|
||||
const caller = new RTCPeerConnection();
|
||||
t.add_cleanup(() => caller.close());
|
||||
const callee = new RTCPeerConnection();
|
||||
t.add_cleanup(() => callee.close());
|
||||
let [tracks, streams] = await getUserMediaTracksAndStreams(2);
|
||||
let sender = caller.addTrack(tracks[0], streams[0]);
|
||||
callee.addTrack(tracks[1], streams[1]);
|
||||
|
@ -523,6 +549,7 @@
|
|||
|
||||
promise_test(async t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
let [tracks, streams] = await getUserMediaTracksAndStreams(1);
|
||||
await promise_rejects(t, 'InvalidAccessError', pc.getStats(tracks[0]));
|
||||
}, 'RTCPeerConnection.getStats(track) throws InvalidAccessError when there ' +
|
||||
|
@ -530,6 +557,7 @@
|
|||
|
||||
promise_test(async t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
let [tracks, streams] = await getUserMediaTracksAndStreams(2);
|
||||
let sender1 = pc.addTrack(tracks[0]);
|
||||
let sender2 = pc.addTrack(tracks[1]);
|
||||
|
|
|
@ -82,6 +82,7 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const { sender } = pc.addTransceiver('audio');
|
||||
const param = sender.getParameters();
|
||||
validateSenderRtpParameters(param);
|
||||
|
@ -96,11 +97,11 @@
|
|||
|
||||
return promise_rejects(t, 'InvalidModificationError',
|
||||
sender.setParameters(param));
|
||||
|
||||
}, 'setParameters() with codec.payloadType modified should reject with InvalidModificationError');
|
||||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const { sender } = pc.addTransceiver('audio');
|
||||
const param = sender.getParameters();
|
||||
validateSenderRtpParameters(param);
|
||||
|
@ -115,11 +116,11 @@
|
|||
|
||||
return promise_rejects(t, 'InvalidModificationError',
|
||||
sender.setParameters(param));
|
||||
|
||||
}, 'setParameters() with codec.mimeType modified should reject with InvalidModificationError');
|
||||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const { sender } = pc.addTransceiver('audio');
|
||||
const param = sender.getParameters();
|
||||
validateSenderRtpParameters(param);
|
||||
|
@ -134,11 +135,11 @@
|
|||
|
||||
return promise_rejects(t, 'InvalidModificationError',
|
||||
sender.setParameters(param));
|
||||
|
||||
}, 'setParameters() with codec.clockRate modified should reject with InvalidModificationError');
|
||||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const { sender } = pc.addTransceiver('audio');
|
||||
const param = sender.getParameters();
|
||||
validateSenderRtpParameters(param);
|
||||
|
@ -153,12 +154,12 @@
|
|||
|
||||
return promise_rejects(t, 'InvalidModificationError',
|
||||
sender.setParameters(param));
|
||||
|
||||
}, 'setParameters() with codec.channels modified should reject with InvalidModificationError');
|
||||
|
||||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const { sender } = pc.addTransceiver('audio');
|
||||
const param = sender.getParameters();
|
||||
validateSenderRtpParameters(param);
|
||||
|
@ -173,12 +174,12 @@
|
|||
|
||||
return promise_rejects(t, 'InvalidModificationError',
|
||||
sender.setParameters(param));
|
||||
|
||||
}, 'setParameters() with codec.sdpFmtpLine modified should reject with InvalidModificationError');
|
||||
|
||||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const { sender } = pc.addTransceiver('audio');
|
||||
const param = sender.getParameters();
|
||||
validateSenderRtpParameters(param);
|
||||
|
@ -194,11 +195,11 @@
|
|||
|
||||
return promise_rejects(t, 'InvalidModificationError',
|
||||
sender.setParameters(param));
|
||||
|
||||
}, 'setParameters() with new codecs inserted should reject with InvalidModificationError');
|
||||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const { sender } = pc.addTransceiver('audio');
|
||||
const param = sender.getParameters();
|
||||
validateSenderRtpParameters(param);
|
||||
|
@ -213,11 +214,11 @@
|
|||
}
|
||||
|
||||
return sender.setParameters(param);
|
||||
|
||||
}, 'setParameters with reordered codecs should succeed');
|
||||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const { sender } = pc.addTransceiver('audio');
|
||||
const param = sender.getParameters();
|
||||
validateSenderRtpParameters(param);
|
||||
|
@ -227,7 +228,6 @@
|
|||
param.codecs = codecs.slice(1);
|
||||
|
||||
return sender.setParameters(param);
|
||||
|
||||
}, 'setParameters with dropped codec should succeed');
|
||||
|
||||
</script>
|
||||
|
|
|
@ -42,6 +42,7 @@
|
|||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const { sender } = pc.addTransceiver('audio');
|
||||
|
||||
const param = sender.getParameters();
|
||||
|
@ -63,6 +64,7 @@
|
|||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const { sender } = pc.addTransceiver('audio');
|
||||
|
||||
const param = sender.getParameters();
|
||||
|
|
|
@ -192,6 +192,7 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const { sender } = pc.addTransceiver('audio');
|
||||
const param = sender.getParameters();
|
||||
validateSenderRtpParameters(param);
|
||||
|
@ -205,11 +206,11 @@
|
|||
|
||||
return promise_rejects(t, 'InvalidModificationError',
|
||||
sender.setParameters(param));
|
||||
|
||||
}, `sender.setParameters() with mismatch number of encodings should reject with InvalidModificationError`);
|
||||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const { sender } = pc.addTransceiver('audio');
|
||||
const param = sender.getParameters();
|
||||
validateSenderRtpParameters(param);
|
||||
|
@ -218,11 +219,11 @@
|
|||
|
||||
return promise_rejects(t, 'InvalidModificationError',
|
||||
sender.setParameters(param));
|
||||
|
||||
}, `sender.setParameters() with encodings unset should reject with InvalidModificationError`);
|
||||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const { sender } = pc.addTransceiver('audio');
|
||||
|
||||
const param = sender.getParameters();
|
||||
|
@ -240,11 +241,11 @@
|
|||
|
||||
return promise_rejects(t, 'InvalidModificationError',
|
||||
sender.setParameters(param));
|
||||
|
||||
}, `setParameters() with modified encoding.ssrc field should reject with InvalidModificationError`);
|
||||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const { sender } = pc.addTransceiver('audio');
|
||||
|
||||
const param = sender.getParameters();
|
||||
|
@ -262,11 +263,11 @@
|
|||
|
||||
return promise_rejects(t, 'InvalidModificationError',
|
||||
sender.setParameters(param));
|
||||
|
||||
}, `setParameters() with modified encoding.rtx field should reject with InvalidModificationError`);
|
||||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const { sender } = pc.addTransceiver('audio');
|
||||
|
||||
const param = sender.getParameters();
|
||||
|
@ -284,11 +285,11 @@
|
|||
|
||||
return promise_rejects(t, 'InvalidModificationError',
|
||||
sender.setParameters(param));
|
||||
|
||||
}, `setParameters() with modified encoding.fec field should reject with InvalidModificationError`);
|
||||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const { sender } = pc.addTransceiver('audio', {
|
||||
sendEncodings: [{ rid: 'foo' }],
|
||||
});
|
||||
|
@ -302,7 +303,6 @@
|
|||
encoding.rid = 'bar';
|
||||
return promise_rejects(t, 'InvalidModificationError',
|
||||
sender.setParameters(param));
|
||||
|
||||
}, `setParameters() with modified encoding.rid field should reject with InvalidModificationError`);
|
||||
|
||||
/*
|
||||
|
@ -313,6 +313,7 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const { sender } = pc.addTransceiver('audio');
|
||||
|
||||
const param = sender.getParameters();
|
||||
|
@ -322,11 +323,11 @@
|
|||
encoding.scaleResolutionDownBy = 0.5;
|
||||
return promise_rejects(t, 'RangeError',
|
||||
sender.setParameters(param));
|
||||
|
||||
}, `setParameters() with encoding.scaleResolutionDownBy field set to less than 1.0 should reject with RangeError`);
|
||||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const { sender } = pc.addTransceiver('audio');
|
||||
|
||||
const param = sender.getParameters();
|
||||
|
@ -342,13 +343,13 @@
|
|||
|
||||
assert_approx_equals(encoding.scaleResolutionDownBy, 1.5, 0.01);
|
||||
});
|
||||
|
||||
}, `setParameters() with encoding.scaleResolutionDownBy field set to greater than 1.0 should succeed`);
|
||||
|
||||
// Helper function to test that modifying an encoding field should succeed
|
||||
function test_modified_encoding(field, value1, value2, desc) {
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const { sender } = pc.addTransceiver('audio', {
|
||||
sendEncodings: [{
|
||||
[field]: value1
|
||||
|
|
|
@ -57,6 +57,7 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const { sender } = pc.addTransceiver('audio');
|
||||
const param = sender.getParameters();
|
||||
validateSenderRtpParameters(param);
|
||||
|
@ -69,7 +70,6 @@
|
|||
|
||||
return promise_rejects(t, 'InvalidModificationError',
|
||||
sender.setParameters(param));
|
||||
|
||||
}, `setParameters() with modified headerExtensions should reject with InvalidModificationError`);
|
||||
|
||||
</script>
|
||||
|
|
|
@ -56,6 +56,7 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const { sender } = pc.addTransceiver('audio');
|
||||
|
||||
const param = sender.getParameters();
|
||||
|
@ -75,11 +76,11 @@
|
|||
|
||||
return promise_rejects(t, 'InvalidModificationError',
|
||||
sender.setParameters(param));
|
||||
|
||||
}, `setParameters() with modified rtcp.cname should reject with InvalidModificationError`);
|
||||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const { sender } = pc.addTransceiver('audio');
|
||||
|
||||
const param = sender.getParameters();
|
||||
|
@ -99,7 +100,6 @@
|
|||
|
||||
return promise_rejects(t, 'InvalidModificationError',
|
||||
sender.setParameters(param));
|
||||
|
||||
}, `setParameters() with modified rtcp.reducedSize should reject with InvalidModificationError`);
|
||||
|
||||
</script>
|
||||
|
|
|
@ -85,6 +85,7 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const { sender } = pc.addTransceiver('audio');
|
||||
|
||||
const param = sender.getParameters();
|
||||
|
@ -95,11 +96,11 @@
|
|||
|
||||
return promise_rejects(t, 'InvalidModificationError',
|
||||
sender.setParameters(param));
|
||||
|
||||
}, `sender.setParameters() with transaction ID different from last getParameters() should reject with InvalidModificationError`);
|
||||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const { sender } = pc.addTransceiver('audio');
|
||||
|
||||
const param = sender.getParameters();
|
||||
|
@ -109,11 +110,11 @@
|
|||
|
||||
return promise_rejects(t, 'InvalidModificationError',
|
||||
sender.setParameters(param));
|
||||
|
||||
}, `sender.setParameters() with transaction ID unset should reject with InvalidModificationError`);
|
||||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const { sender } = pc.addTransceiver('audio');
|
||||
|
||||
const param = sender.getParameters();
|
||||
|
@ -123,11 +124,11 @@
|
|||
.then(() =>
|
||||
promise_rejects(t, 'InvalidModificationError',
|
||||
sender.setParameters(param)));
|
||||
|
||||
}, `setParameters() twice with the same parameters should reject with InvalidModificationError`);
|
||||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const { sender } = pc.addTransceiver('audio');
|
||||
|
||||
const param1 = sender.getParameters();
|
||||
|
@ -140,7 +141,6 @@
|
|||
|
||||
return promise_rejects(t, 'InvalidModificationError',
|
||||
sender.setParameters(param1));
|
||||
|
||||
}, `setParameters() with parameters older than last getParameters() should reject with InvalidModificationError`);
|
||||
|
||||
</script>
|
||||
|
|
|
@ -40,8 +40,11 @@
|
|||
|
||||
promise_test(t => {
|
||||
const pc1 = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc1.close());
|
||||
const pc2 = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc2.close());
|
||||
|
||||
const ontrackPromise = new Promise(resolve => {
|
||||
pc2.addEventListener('track', trackEvent => {
|
||||
const { receiver } = trackEvent;
|
||||
|
|
|
@ -46,7 +46,9 @@
|
|||
|
||||
promise_test(async t => {
|
||||
const caller = new RTCPeerConnection();
|
||||
t.add_cleanup(() => caller.close());
|
||||
const callee = new RTCPeerConnection();
|
||||
t.add_cleanup(() => callee.close());
|
||||
const { receiver } = caller.addTransceiver('audio');
|
||||
|
||||
await doSignalingHandshake(caller, callee);
|
||||
|
@ -57,7 +59,9 @@
|
|||
|
||||
promise_test(async t => {
|
||||
const caller = new RTCPeerConnection();
|
||||
t.add_cleanup(() => caller.close());
|
||||
const callee = new RTCPeerConnection();
|
||||
t.add_cleanup(() => callee.close());
|
||||
const stream = await navigator.mediaDevices.getUserMedia({audio:true});
|
||||
const [track] = stream.getTracks();
|
||||
caller.addTrack(track, stream);
|
||||
|
|
|
@ -27,8 +27,11 @@
|
|||
|
||||
promise_test(t => {
|
||||
const pc1 = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc1.close());
|
||||
const pc2 = new RTCPeerConnection();
|
||||
|
||||
t.add_cleanup(() => pc2.close());
|
||||
|
||||
const ontrackPromise = new Promise(resolve => {
|
||||
pc2.addEventListener('track', trackEvent => {
|
||||
const { receiver } = trackEvent;
|
||||
|
|
|
@ -41,7 +41,9 @@
|
|||
|
||||
promise_test(async t => {
|
||||
const caller = new RTCPeerConnection();
|
||||
t.add_cleanup(() => caller.close());
|
||||
const callee = new RTCPeerConnection();
|
||||
t.add_cleanup(() => callee.close());
|
||||
const { sender } = caller.addTransceiver('audio');
|
||||
|
||||
await doSignalingHandshake(caller, callee);
|
||||
|
@ -52,7 +54,9 @@
|
|||
|
||||
promise_test(async t => {
|
||||
const caller = new RTCPeerConnection();
|
||||
t.add_cleanup(() => caller.close());
|
||||
const callee = new RTCPeerConnection();
|
||||
t.add_cleanup(() => callee.close());
|
||||
const stream = await navigator.mediaDevices.getUserMedia({audio:true});
|
||||
const [track] = stream.getTracks();
|
||||
const sender = caller.addTrack(track, stream);
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const track = generateMediaStreamTrack('audio');
|
||||
|
||||
const transceiver = pc.addTransceiver('audio');
|
||||
|
@ -41,7 +42,6 @@
|
|||
|
||||
return promise_rejects(t, 'InvalidStateError',
|
||||
sender.replaceTrack(track));
|
||||
|
||||
}, 'Calling replaceTrack on closed connection should reject with InvalidStateError');
|
||||
|
||||
/*
|
||||
|
@ -52,6 +52,7 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const track = generateMediaStreamTrack('video');
|
||||
|
||||
const transceiver = pc.addTransceiver('audio');
|
||||
|
@ -59,7 +60,6 @@
|
|||
|
||||
return promise_rejects(t, new TypeError(),
|
||||
sender.replaceTrack(track));
|
||||
|
||||
}, 'Calling replaceTrack with track of different kind should reject with TypeError');
|
||||
|
||||
/*
|
||||
|
@ -69,6 +69,7 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const track = generateMediaStreamTrack('audio');
|
||||
|
||||
const transceiver = pc.addTransceiver('audio');
|
||||
|
@ -77,7 +78,6 @@
|
|||
|
||||
return promise_rejects(t, 'InvalidStateError',
|
||||
sender.replaceTrack(track));
|
||||
|
||||
}, 'Calling replaceTrack on stopped sender should reject with InvalidStateError');
|
||||
|
||||
/*
|
||||
|
@ -88,6 +88,7 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const track = generateMediaStreamTrack('audio');
|
||||
|
||||
const transceiver = pc.addTransceiver('audio');
|
||||
|
@ -102,6 +103,7 @@
|
|||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const track1 = generateMediaStreamTrack('audio');
|
||||
const track2 = generateMediaStreamTrack('audio');
|
||||
|
||||
|
@ -118,6 +120,7 @@
|
|||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const track = generateMediaStreamTrack('audio');
|
||||
|
||||
const transceiver = pc.addTransceiver(track);
|
||||
|
@ -144,6 +147,7 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const track = generateMediaStreamTrack('audio');
|
||||
|
||||
const transceiver = pc.addTransceiver(track);
|
||||
|
@ -173,6 +177,7 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const track1 = generateMediaStreamTrack('audio');
|
||||
const track2 = generateMediaStreamTrack('audio');
|
||||
|
||||
|
@ -204,6 +209,7 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const track1 = generateMediaStreamTrack('audio');
|
||||
const track2 = generateMediaStreamTrack('audio');
|
||||
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
*/
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const transceiver = pc.addTransceiver('audio');
|
||||
const { sender } = transceiver;
|
||||
|
||||
|
@ -24,7 +25,6 @@
|
|||
|
||||
return promise_rejects(t, 'InvalidStateError',
|
||||
sender.setParameters(param));
|
||||
|
||||
}, `setParameters() when transceiver is stopped should reject with InvalidStateError`);
|
||||
|
||||
</script>
|
||||
|
|
|
@ -56,6 +56,7 @@
|
|||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const transceiver = pc.addTransceiver('audio', { direction: 'recvonly' });
|
||||
assert_equals(transceiver.direction, 'recvonly');
|
||||
assert_equals(transceiver.currentDirection, null);
|
||||
|
|
|
@ -41,6 +41,7 @@
|
|||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
assert_equals(pc.sctp, null);
|
||||
pc.createDataChannel('test');
|
||||
|
||||
|
@ -65,6 +66,7 @@
|
|||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
assert_equals(pc.sctp, null);
|
||||
|
||||
return generateOffer({ pc, data: true })
|
||||
|
|
|
@ -45,6 +45,7 @@ const remoteValue2 = 2;
|
|||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
assert_equals(pc.sctp, null);
|
||||
let maxMessageSize;
|
||||
|
||||
|
@ -69,6 +70,7 @@ promise_test(t => {
|
|||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
assert_equals(pc.sctp, null);
|
||||
|
||||
return generateOffer({ pc, data: true })
|
||||
|
@ -97,6 +99,7 @@ promise_test(t => {
|
|||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
assert_equals(pc.sctp, null);
|
||||
|
||||
return generateOffer({ pc, data: true })
|
||||
|
@ -118,6 +121,7 @@ promise_test(t => {
|
|||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
assert_equals(pc.sctp, null);
|
||||
|
||||
return generateOffer({ pc, data: true })
|
||||
|
@ -152,6 +156,7 @@ promise_test(t => {
|
|||
|
||||
promise_test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
assert_equals(pc.sctp, null);
|
||||
const largerThanCanSendSize = canSendSize + 1;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue