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 dtmf RTCRtpSender.dtmf exists on audio senders PASS dtmf RTCRtpSender.dtmf does not exist on video senders PASS dtmf inserts DTMF when using addStream PASS dtmf inserts DTMF when using addTrack PASS getUserMedia navigator.getUserMedia exists PASS getUserMedia navigator.getUserMedia calls the callback PASS getUserMedia navigator.mediaDevices.getUserMedia exists PASS getUserMedia navigator.mediaDevices.getUserMedia fulfills the promise PASS MediaStream window.MediaStream exists PASS track event RTCPeerConnection.prototype.ontrack exists 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 removeTrack allows removeTrack twice 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 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 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 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 remain PASS removeTrack after addTrack for an audio/video track after removing all tracks no local streams remain PASS RTCIceCandidate window.RTCIceCandidate exists PASS RTCPeerConnection window.RTCPeerConnection exists PASS RTCPeerConnection constructor works PASS RTCPeerConnection getSenders exists PASS RTCSessionDescription window.RTCSessionDescription exists 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)