Bug 1452673 - trackless RTCRtpSender.getStats() returning unfiltered results
MozReview-Commit-ID: 7JzZlBUqc0O
--- a/dom/media/PeerConnection.js
+++ b/dom/media/PeerConnection.js
@@ -2028,18 +2028,23 @@ class RTCRtpSender {
}
setTrack(track) {
this._pc._replaceTrackNoRenegotiation(this._transceiverImpl, track);
this.track = track;
}
getStats() {
- return this._pc._async(
- async () => this._pc._getStats(this.track));
+ if (this.track) {
+ return this._pc._async(
+ async () => this._pc._getStats(this.track));
+ }
+ return this._pc._win.Promise.resolve().then(
+ () => this._pc._win.RTCStatsReport._create(this._pc._win, new Map())
+ );
}
checkWasCreatedByPc(pc) {
if (pc != this._pc.__DOM_IMPL__) {
throw new this._pc._win.DOMException(
"This sender was not created by this PeerConnection",
"InvalidAccessError");
}
--- a/dom/media/tests/mochitest/mochitest.ini
+++ b/dom/media/tests/mochitest/mochitest.ini
@@ -332,15 +332,17 @@ skip-if = (android_version == '18') # an
skip-if = (android_version == '18') # android(Bug 1189784, timeouts on 4.3 emulator)
[test_selftest.html]
# Bug 1227781: Crash with bogus TURN server.
[test_peerConnection_bug1227781.html]
[test_peerConnection_stats.html]
skip-if = toolkit == 'android' # android(Bug 1189784, timeouts on 4.3 emulator, Bug 1373858)
[test_peerConnection_sender_and_receiver_stats.html]
skip-if = (android_version == '18') # android(Bug 1189784, timeouts on 4.3 emulator)
+[test_peerConnection_trackless_sender_stats.html]
+skip-if = (android_version == '18') # android(Bug 1189784, timeouts on 4.3 emulator)
[test_peerConnection_verifyDescriptions.html]
skip-if = (android_version == '18')
[test_fingerprinting_resistance.html]
[test_getUserMedia_nonDefaultRate.html]
[test_peerConnection_nonDefaultRate.html]
skip-if = android_version == '18' # android(Bug 1189784, timeouts on 4.3 emulator)
[test_forceSampleRate.html]
--- a/dom/media/tests/mochitest/test_peerConnection_sender_and_receiver_stats.html
+++ b/dom/media/tests/mochitest/test_peerConnection_sender_and_receiver_stats.html
@@ -7,19 +7,19 @@
<pre id="test">
<script type="application/javascript">
createHTML({
bug: "1355220",
title: "RTCRtpSender.getStats() and RTCRtpReceiver.getStats()",
visible: true
});
- var test;
-
var checkStats = (sndReport, rcvReport, mediaType) => {
+ ok(sndReport instanceof window.RTCStatsReport, "sender stats are a RTCStatsReport");
+ ok(rcvReport instanceof window.RTCStatsReport, "receiver stats are a RTCStatsReport");
// Returns SSRCs and checks that the tracks are of the correct mediaType
let getSsrcs = (report, kind) => {
return [...report.values()]
.filter(stat => stat.type.endsWith("bound-rtp")).map(stat =>{
is(stat.mediaType, kind, "mediaType of " + stat.id
+ " is expected type " + kind);
return stat.ssrc;
}).sort().join("|");
new file mode 100644
--- /dev/null
+++ b/dom/media/tests/mochitest/test_peerConnection_trackless_sender_stats.html
@@ -0,0 +1,56 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1452673",
+ title: "Trackless RTCRtpSender.getStats()",
+ visible: true
+ });
+
+ // Calling getstats() on a trackless RTCRtpSender should yield an empty
+ // stats report. When track stats are added in the future, the stats
+ // for the removed tracks should continue to appear.
+
+ var test;
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ test.chain.removeAfter("PC_REMOTE_WAIT_FOR_MEDIA_FLOW");
+ test.chain.append(
+ async function PC_LOCAL_AND_REMOTE_TRACKLESS_SENDER_STATS(test) {
+ return Promise.all([test.pcLocal.waitForSyncedRtcp(),
+ test.pcRemote.waitForSyncedRtcp()])
+ .then(async () => {
+ let senders = test.pcLocal.getSenders();
+ let receivers = test.pcRemote.getReceivers();
+ is(senders.length, 2, "Have exactly two senders.");
+ is(receivers.length, 2, "Have exactly two receivers.");
+ for(let kind of ["audio", "video"]) {
+ is(senders.filter(s => s.track.kind == kind).length, 1,
+ "Exactly 1 sender of kind " + kind);
+ is(receivers.filter(r => r.track.kind == kind).length, 1,
+ "Exactly 1 receiver of kind " + kind);
+ }
+ // Remove tracks from senders
+ senders.forEach(async sender => {
+ await sender.replaceTrack(null);
+ is(sender.track, null, "Sender track removed");
+ let stats = await sender.getStats();
+ ok(stats instanceof window.RTCStatsReport, "Stats is instance of RTCStatsReport");
+ // Number of stats in the report. This should be 0.
+ is(stats.size, 0, "Trackless sender stats report is empty");
+ });
+ })
+ });
+ test.setMediaConstraints([{audio: true}, {video: true}], []);
+ test.run();
+ });
+
+</script>
+</pre>
+</body>
+</html>
\ No newline at end of file