PASS addIceCandidate after setRemoteDescription resolves when called with null PASS addIceCandidate after setRemoteDescription resolves when called with undefined PASS addTrack throws an exception if the track has already been added PASS addTrack throws an exception if the track has already been added via addStream PASS addTrack throws an exception if addStream is called with a stream containing a track already added PASS addTrack throws an exception if the peerconnection has been closed already PASS addTrack and getSenders creates a sender PASS addTrack and getLocalStreams returns a stream with audio and video even if just an audio track was added PASS addTrack and getLocalStreams adds another track to the same stream PASS addTrack and getLocalStreams plays together nicely PASS window.adapter exists PASS window.adapter browserDetails exists PASS window.adapter browserDetails detects a browser type PASS window.adapter browserDetails detects a browser version PASS establishes a connection with legacy callbacks PASS establishes a connection with promises PASS establishes a connection with streams in both directions PASS establishes a connection with no explicit end-of-candidates PASS establishes a connection and calls the video loadedmetadata PASS establishes a connection with addTrack and all tracks of a stream PASS establishes a connection with addTrack but only the audio track of an av stream PASS establishes a connection with addTrack as two streams PASS establishes a connection with datachannel establishes a connection PASS URL.createObjectURL shim works for audio using src= PASS URL.createObjectURL shim works for audio using setAttribute PASS URL.createObjectURL shim works for video using src= PASS URL.createObjectURL shim works for video using setAttribute PASS dtmf RTCRtpSender.dtmf exists on audio senders PASS dtmf RTCRtpSender.dtmf does not exist on video senders PASS dtmf inserts DTMF when using addStream ERR dtmf inserts DTMF when using addTrack timeout PASS getStats returns a Promise PASS getStats resolves the Promise with a Map(like) PASS getUserMedia navigator.getUserMedia exists PASS getUserMedia navigator.getUserMedia calls the callback PASS maxMessageSize sctp attribute exists PASS maxMessageSize sctp attribute is null before offer/answer PASS maxMessageSize sctp attribute is null if SCTP not negotiated PASS maxMessageSize sctp and maxMessageSize set if SCTP negotiated PASS maxMessageSize send largest possible single message PASS maxMessageSize throws an exception if the message is too large PASS maxMessageSize throws an exception if the message is too large (using a secondary data channel) PASS maxMessageSize is as expected for chrome>=0 and chrome>=0 -> 65536 PASS maxMessageSize is as expected for chrome>=0 and firefox<=56 -> 65536 PASS maxMessageSize is as expected for chrome>=0 and firefox>=57 -> 65536 PASS maxMessageSize is as expected for chrome>=0 and 64 KiB -> 65536 PASS maxMessageSize is as expected for chrome>=0 and 1.5 GiB -> 65536 PASS maxMessageSize is as expected for chrome>=0 and 2 GiB -> 65536 PASS maxMessageSize is as expected for chrome>=0 and Unlimited -> 65536 PASS navigator.mediaDevices exists PASS navigator.mediaDevices is an EventTarget PASS navigator.mediaDevices implements the devicechange event PASS navigator.mediaDevices getUserMedia exists PASS navigator.mediaDevices getUserMedia fulfills the promise PASS navigator.mediaDevices enumerateDevices exists PASS navigator.mediaDevices enumerateDevices returns an array of devices PASS navigator.mediaDevices enumerateDevices returns some audioinput devices PASS navigator.mediaDevices enumerateDevices returns some videoinput devices PASS navigator.mediaDevices enumerateDevices returns some audiooutput devices PASS MediaStream window.MediaStream exists PASS MSID signals stream ids PASS MSID puts the track msid attribute into the localDescription PASS track event RTCPeerConnection.prototype.ontrack exists PASS track event is called when setRemoteDescription adds a new track to an existing stream PASS track event is called by setRemoteDescription track event PASS track event is called by setRemoteDescription ontrack PASS track event the event has a track PASS track event the event has a set of streams PASS track event the event has a receiver that is contained in the set of receivers PASS track event the event has a transceiver that has a receiver PASS removeTrack allows removeTrack twice PASS removeTrack throws an exception if the argument is a track, not a sender PASS removeTrack throws an exception if the sender does not belong to the peerconnection PASS removeTrack throws an exception if the peerconnection has been closed already PASS removeTrack after addStream for an audio/video track after removing a single track only a single sender with a track remains PASS removeTrack after addStream for an audio/video track after removing a single track the local stream remains untouched PASS removeTrack after addStream for an audio/video track after removing all tracks no senders with tracks remain PASS removeTrack after addStream for an audio/video track after removing all tracks no local streams remain PASS removeTrack after addTrack for an audio/video track after removing a single track only a single sender with a track remains PASS removeTrack after addTrack for an audio/video track after removing a single track the local stream remains untouched PASS removeTrack after addTrack for an audio/video track after removing all tracks no senders with tracks remain PASS removeTrack after addTrack for an audio/video track after removing all tracks no local streams remain PASS RTCIceCandidate window.RTCIceCandidate exists PASS RTCIceCandidate is augmented in the onicecandidate callback PASS RTCIceCandidate is augmented in the icecandidate event ERR RTCIceCandidate with empty candidate.candidate does not throw AssertionError PASS RTCIceCandidate icecandidate eventlistener can be removed PASS RTCPeerConnection window.RTCPeerConnection exists PASS RTCPeerConnection constructor works PASS RTCPeerConnection getSenders exists PASS RTCPeerConnection generateCertificate is a static method PASS RTCPeerConnection icegatheringstatechange fires the event PASS RTCPeerConnection icegatheringstatechange calls the event handler PASS RTCSessionDescription window.RTCSessionDescription exists PASS srcObject setting from another object works PASS srcObject setter triggers loadedmetadata (audio) PASS srcObject getter returns the stream (audio) PASS srcObject setter triggers loadedmetadata (video) PASS srcObject getter returns the stream (video)