| <!doctype html> | |
| <meta charset=utf-8> | |
| <title>RTCRtpReceiver</title> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <script> | |
| 'use strict'; | |
| promise_test(async t => { | |
| const pc1 = new RTCPeerConnection(); | |
| t.add_cleanup(() => pc1.close()); | |
| const transceiver = pc1.addTransceiver('audio', { direction: 'recvonly' }); | |
| assert_equals(transceiver.receiver.transport, null); | |
| }, 'RTCRtpReceiver should have a null transport initially'); | |
| promise_test(async t => { | |
| const pc1 = new RTCPeerConnection(); | |
| t.add_cleanup(() => pc1.close()); | |
| const transceiver = pc1.addTransceiver('audio', { direction: 'recvonly' }); | |
| await pc1.setLocalDescription(); | |
| assert_true(transceiver.receiver.transport instanceof RTCDtlsTransport); | |
| }, 'RTCRtpReceiver should have a transport after sLD(offer)'); | |
| promise_test(async t => { | |
| const pc1 = new RTCPeerConnection(); | |
| t.add_cleanup(() => pc1.close()); | |
| const transceiver = pc1.addTransceiver('audio', { direction: 'recvonly' }); | |
| await pc1.setLocalDescription(); | |
| await pc1.setLocalDescription({type: 'rollback', sdp: ''}); | |
| assert_equals(transceiver.receiver.transport, null); | |
| }, 'RTCRtpReceiver should have a null transport after rollback of sLD(offer)'); | |
| promise_test(async t => { | |
| const pc1 = new RTCPeerConnection(); | |
| t.add_cleanup(() => pc1.close()); | |
| const pc2 = new RTCPeerConnection(); | |
| t.add_cleanup(() => pc2.close()); | |
| const receiver = pc1.addTransceiver('audio', { direction: 'recvonly' }); | |
| await pc2.setRemoteDescription(await pc1.createOffer()); | |
| const transceiver = pc2.getTransceivers()[0]; | |
| assert_equals(transceiver.receiver.transport, null); | |
| }, 'RTCRtpReceiver should have a null transport after sRD(offer)'); | |
| promise_test(async t => { | |
| const pc1 = new RTCPeerConnection(); | |
| t.add_cleanup(() => pc1.close()); | |
| const transceiver = pc1.addTransceiver('audio', { direction: 'recvonly' }); | |
| await pc1.setLocalDescription(); | |
| assert_true(transceiver.sender.transport instanceof RTCDtlsTransport); | |
| assert_true(transceiver.receiver.transport instanceof RTCDtlsTransport); | |
| assert_equals(transceiver.receiver.transport, transceiver.sender.transport); | |
| }, 'RTCRtpReceiver should have the same transport object as its corresponding RTCRtpSender'); | |
| promise_test(async t => { | |
| const pc1 = new RTCPeerConnection({bundlePolicy: 'max-bundle'}); | |
| t.add_cleanup(() => pc1.close()); | |
| const audioTransceiver = pc1.addTransceiver('audio', { direction: 'recvonly' }); | |
| const videoTransceiver = pc1.addTransceiver('video', { direction: 'recvonly' }); | |
| await pc1.setLocalDescription(); | |
| assert_equals(videoTransceiver.receiver.transport, audioTransceiver.receiver.transport); | |
| }, 'RTCRtpReceivers that share a bundle transport should have the same transport object'); | |
| promise_test(async t => { | |
| const pc1 = new RTCPeerConnection({bundlePolicy: 'max-compat'}); | |
| t.add_cleanup(() => pc1.close()); | |
| const pc2 = new RTCPeerConnection(); | |
| t.add_cleanup(() => pc2.close()); | |
| const audioTransceiver = pc1.addTransceiver('audio', { direction: 'recvonly' }); | |
| const videoTransceiver = pc1.addTransceiver('video', { direction: 'recvonly' }); | |
| await pc1.setLocalDescription(); | |
| assert_not_equals(videoTransceiver.receiver.transport, audioTransceiver.receiver.transport); | |
| await pc2.setRemoteDescription(pc1.localDescription); | |
| await pc1.setRemoteDescription(await pc2.createAnswer()); | |
| // pc2 will accept the bundle, so these should be the same now | |
| assert_equals(videoTransceiver.receiver.transport, audioTransceiver.receiver.transport); | |
| }, 'RTCRtpReceivers that do not necessarily share a bundle transport should not have the same transport object'); | |
| promise_test(async t => { | |
| const pc1 = new RTCPeerConnection(); | |
| t.add_cleanup(() => pc1.close()); | |
| const pc2 = new RTCPeerConnection(); | |
| t.add_cleanup(() => pc2.close()); | |
| const transceiver = pc1.addTransceiver('audio', { direction: 'recvonly' }); | |
| await pc1.setLocalDescription(); | |
| const transportBefore = transceiver.receiver.transport; | |
| await pc2.setRemoteDescription(pc1.localDescription); | |
| await pc1.setRemoteDescription(await pc2.createAnswer()); | |
| await pc1.setLocalDescription(await pc1.createOffer({iceRestart: true})); | |
| const transportAfter = transceiver.receiver.transport; | |
| assert_equals(transportAfter, transportBefore); | |
| }, 'RTCRtpReceiver should have the same transport object after an ICE restart'); | |
| </script> |