WPT
wpt / webrtc / RTCPeerConnection-transceivers.https.html
Spec: WebRTC ↗
Runs: Chrome 155.0.8039.0 (wpt@6ec9fd59f, 2026-09-03) | Firefox 157.0a1 (wpt@6ec9fd59f, 2026-09-03) | Safari 251 preview (wpt@5ce815a83, 2026-08-27) | Ladybird 1.0-795e1 (wpt@7e3d005d7, 2026-09-03) | Servo Servo 0.6 (wpt@09159dcb3, 2026-09-02) | Blitz 188486089 (wpt@a95401e4e, 2026-09-02)
View on the Blitz WPT dashboard | Open test on wpt.live | wpt.fyi
| Chrome | Firefox | Safari | Ladybird | Servo | Blitz | |
|---|---|---|---|---|---|---|
| Total | 44/44 | 44/44 | 44/44 | 0/44 | 0/44 | NOT RUN |
| Subtest | Chrome | Firefox | Safari | Ladybird | Servo | Blitz |
|---|---|---|---|---|---|---|
| addTrack: creates a transceiver for the sender | PASS | PASS | PASS | FAIL | FAIL | — |
| addTrack: "transceiver == {sender,receiver}" | PASS | PASS | PASS | FAIL | FAIL | — |
| addTrack: transceiver.sender is associated with the track | PASS | PASS | PASS | FAIL | FAIL | — |
| addTrack: transceiver.receiver has its own track | PASS | PASS | PASS | FAIL | FAIL | — |
| addTrack: transceiver.receiver's track is muted | PASS | PASS | PASS | FAIL | FAIL | — |
| addTrack: transceiver is not associated with an m-section | PASS | PASS | PASS | FAIL | FAIL | — |
| addTrack: transceiver is not stopped | PASS | PASS | PASS | FAIL | FAIL | — |
| addTrack: transceiver's direction is sendrecv | PASS | PASS | PASS | FAIL | FAIL | — |
| addTrack: transceiver's currentDirection is null | PASS | PASS | PASS | FAIL | FAIL | — |
| setLocalDescription(offer): transceiver gets associated with an m-section | PASS | PASS | PASS | FAIL | FAIL | — |
| setLocalDescription(offer): transceiver.mid matches the offer SDP | PASS | PASS | PASS | FAIL | FAIL | — |
| setRemoteDescription(offer): ontrack fires with a track | PASS | PASS | PASS | FAIL | FAIL | — |
| setRemoteDescription(offer): ontrack's stream.id is the same as stream.id | PASS | PASS | PASS | FAIL | FAIL | — |
| setRemoteDescription(offer): ontrack fires with a transceiver. | PASS | PASS | PASS | FAIL | FAIL | — |
| setRemoteDescription(offer): transceiver.mid is the same on both ends | PASS | PASS | PASS | FAIL | FAIL | — |
| setRemoteDescription(offer): "transceiver == {sender,receiver}" | PASS | PASS | PASS | FAIL | FAIL | — |
| setRemoteDescription(offer): transceiver.direction is recvonly | PASS | PASS | PASS | FAIL | FAIL | — |
| setRemoteDescription(offer): transceiver.currentDirection is null | PASS | PASS | PASS | FAIL | FAIL | — |
| setRemoteDescription(offer): transceiver.stopped is false | PASS | PASS | PASS | FAIL | FAIL | — |
| setLocalDescription(answer): transceiver.currentDirection is recvonly | PASS | PASS | PASS | FAIL | FAIL | — |
| setLocalDescription(answer): transceiver.currentDirection is sendonly | PASS | PASS | PASS | FAIL | FAIL | — |
| addTransceiver(track): creates a transceiver for the track | PASS | PASS | PASS | FAIL | FAIL | — |
| addTransceiver(track): "transceiver == {sender,receiver}" | PASS | PASS | PASS | FAIL | FAIL | — |
| addTransceiver(track, init): initialize direction to inactive | PASS | PASS | PASS | FAIL | FAIL | — |
| addTransceiver(track, init): initialize sendEncodings[0].active to false | PASS | PASS | PASS | FAIL | FAIL | — |
| addTransceiver(0 streams): ontrack fires with no stream | PASS | PASS | PASS | FAIL | FAIL | — |
| addTransceiver(1 stream): ontrack fires with corresponding stream | PASS | PASS | PASS | FAIL | FAIL | — |
| addTransceiver(2 streams): ontrack fires with corresponding two streams | PASS | PASS | PASS | FAIL | FAIL | — |
| addTrack(0 streams): ontrack fires with no stream | PASS | PASS | PASS | FAIL | FAIL | — |
| addTrack(1 stream): ontrack fires with corresponding stream | PASS | PASS | PASS | FAIL | FAIL | — |
| addTrack(2 streams): ontrack fires with corresponding two streams | PASS | PASS | PASS | FAIL | FAIL | — |
| addTransceiver('audio'): creates a transceiver with direction sendrecv | PASS | PASS | PASS | FAIL | FAIL | — |
| addTransceiver('audio'): transceiver.receiver.track.kind == 'audio' | PASS | PASS | PASS | FAIL | FAIL | — |
| addTransceiver('video'): transceiver.receiver.track.kind == 'video' | PASS | PASS | PASS | FAIL | FAIL | — |
| addTransceiver('audio'): transceiver.sender.track == null | PASS | PASS | PASS | FAIL | FAIL | — |
| addTransceiver('audio'): transceiver.currentDirection is null | PASS | PASS | PASS | FAIL | FAIL | — |
| addTransceiver('audio'): transceiver.stopped is false | PASS | PASS | PASS | FAIL | FAIL | — |
| addTrack reuses reusable transceivers | PASS | PASS | PASS | FAIL | FAIL | — |
| addTransceiver does not reuse reusable transceivers | PASS | PASS | PASS | FAIL | FAIL | — |
| Can setup two-way call using a single transceiver | PASS | PASS | PASS | FAIL | FAIL | — |
| Closing the PC stops the transceivers | PASS | PASS | PASS | FAIL | FAIL | — |
| Changing transceiver direction to 'sendrecv' makes ontrack fire | PASS | PASS | PASS | FAIL | FAIL | — |
| transceiver.sender.track does not revert to an old state | PASS | PASS | PASS | FAIL | FAIL | — |
| transceiver.direction does not revert to an old state | PASS | PASS | PASS | FAIL | FAIL | — |