Bug 1452673 - trackless RTCRtpSender.getStats() returning unfiltered results draft
authorNico Grunbaum
Wed, 18 Apr 2018 00:16:27 -0700
changeset 784479 b1e719e1a99d3f0733bc449f4de246cef1baa7a9
parent 783746 5ded36cb383d3ccafd9b6c231c5120dcdae196a2
push id106944
push userna-g@nostrum.com
push dateWed, 18 Apr 2018 17:14:27 +0000
bugs1452673
milestone61.0a1
Bug 1452673 - trackless RTCRtpSender.getStats() returning unfiltered results MozReview-Commit-ID: 7JzZlBUqc0O
dom/media/PeerConnection.js
dom/media/tests/mochitest/mochitest.ini
dom/media/tests/mochitest/test_peerConnection_sender_and_receiver_stats.html
dom/media/tests/mochitest/test_peerConnection_trackless_sender_stats.html
--- 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