tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 3573bf613ad51e114c28548ee185753aac041e48
parent 556e42ef986205b7734fcdaee09395238c4a30b1
Author: Andreas Pehrson <apehrson@mozilla.com>
Date:   Wed, 22 Oct 2025 05:15:20 +0000

Bug 1995517 - In sdpUtils et al. fix "all but" munging functions. r=bwc

Differential Revision: https://phabricator.services.mozilla.com/D269481

Diffstat:
Mdom/media/webrtc/tests/mochitests/sdpUtils.js | 36+++++++++++++++++++++++++++++++-----
Mdom/media/webrtc/tests/mochitests/templates.js | 14++++++--------
Mdom/media/webrtc/tests/mochitests/test_peerConnection_audioCodecs.html | 16++--------------
Mdom/media/webrtc/tests/mochitests/test_peerConnection_basicScreenshare.html | 4++++
Mdom/media/webrtc/tests/mochitests/test_peerConnection_scaleResolution.html | 4+---
Mdom/media/webrtc/tests/mochitests/test_peerConnection_scaleResolution_oldSetParameters.html | 4+---
6 files changed, 45 insertions(+), 33 deletions(-)

diff --git a/dom/media/webrtc/tests/mochitests/sdpUtils.js b/dom/media/webrtc/tests/mochitests/sdpUtils.js @@ -197,11 +197,37 @@ var sdputils = { return updated_sdp; }, - removeAllButPayloadType(sdp, pt) { - return sdp.replace( - new RegExp("m=(\\w+ \\w+) UDP/TLS/RTP/SAVPF .*" + pt + ".*\\r\\n", "gi"), - "m=$1 UDP/TLS/RTP/SAVPF " + pt + "\r\n" - ); + // Returns an array of objects with keys {pt, codec}. + enumerateCodecs(sdp) { + const codecs = []; + const regex = /a=rtpmap:(\d+)\s+([^\/]+)\/[0-9\/]+/gi; + let match; + while ((match = regex.exec(sdp))) { + if (match.length < 3) { + continue; + } + const pt = parseInt(match[1]); + if (isNaN(pt)) { + continue; + } + const codec = match[2]; + codecs.push({ pt, codec }); + } + return codecs; + }, + + removeAllButPayloadType(sdp, payloadType) { + const codecs = this.enumerateCodecs(sdp); + const pts = codecs.map(({ pt }) => pt).filter(pt => pt != payloadType); + return this.removeCodecs(sdp, pts); + }, + + removeAllButCodec(sdp, codecToKeep) { + const codecs = this.enumerateCodecs(sdp); + const pts = codecs + .filter(({ codec }) => codec.toLowerCase() != codecToKeep.toLowerCase()) + .map(({ pt }) => pt); + return this.removeCodecs(sdp, pts); }, removeRtpMapForPayloadType(sdp, pt) { diff --git a/dom/media/webrtc/tests/mochitests/templates.js b/dom/media/webrtc/tests/mochitests/templates.js @@ -567,9 +567,9 @@ function PC_LOCAL_REMOVE_ALL_BUT_H264_FROM_OFFER(test) { -1, "H.264 should be present in the SDP offer" ); - test.originalOffer.sdp = sdputils.removeCodecs( + test.originalOffer.sdp = sdputils.removeAllButCodec( test.originalOffer.sdp, - [120, 121, 97] + "H264" ); info("Updated H264 only offer: " + JSON.stringify(test.originalOffer)); } @@ -580,12 +580,10 @@ function PC_LOCAL_REMOVE_ALL_BUT_AV1_FROM_OFFER(test) { -1, "AV1 should be present in the SDP offer" ); - for (const codec of [103, 105, 120, 121, 126, 97]) { - test.originalOffer.sdp = sdputils.removeCodec( - test.originalOffer.sdp, - codec - ); - } + test.originalOffer.sdp = sdputils.removeAllButCodec( + test.originalOffer.sdp, + "AV1" + ); info("Updated AV1 only offer: " + JSON.stringify(test.originalOffer)); } diff --git a/dom/media/webrtc/tests/mochitests/test_peerConnection_audioCodecs.html b/dom/media/webrtc/tests/mochitests/test_peerConnection_audioCodecs.html @@ -26,28 +26,16 @@ test.chain.insertBefore("PC_LOCAL_SET_LOCAL_DESCRIPTION", [ function PC_LOCAL_FILTER_OUT_CODECS() { let otherCodec = codecs.find(c => c != codec); + let id = sdputils.findCodecId(test.originalOffer.sdp, codec); let otherId = sdputils.findCodecId(test.originalOffer.sdp, otherCodec); - let id = sdputils.findCodecId(test.originalOffer.sdp, codec); test.originalOffer.sdp = - sdputils.removeAllButPayloadType(test.originalOffer.sdp, id); + sdputils.removeAllButCodec(test.originalOffer.sdp, codec); ok(!test.originalOffer.sdp.match(new RegExp(`m=.*UDP/TLS/RTP/SAVPF.* ${otherId}[^0-9]`, "gi")), `Other codec ${otherId} should be removed after filtering`); ok(test.originalOffer.sdp.match(new RegExp(`m=.*UDP/TLS/RTP/SAVPF.* ${id}[^0-9]`, "gi")), `Tested codec ${id} should remain after filtering`); - - for (let c of codecs.filter(c => c != codec)) { - // Remove rtpmaps for the other codecs so sdp sanity tests pass. - let id = sdputils.findCodecId(test.originalOffer.sdp, c); - test.originalOffer.sdp = - sdputils.removeRtpMapForPayloadType(test.originalOffer.sdp, id); - } - - ok(!test.originalOffer.sdp.match(new RegExp(`a=rtpmap:${otherId}.*\\r\\n`, "gi")), - `Rtpmap of other codec ${otherId} should be removed after filtering`); - ok(test.originalOffer.sdp.match(new RegExp(`a=rtpmap:${id}.*\\r\\n`, "gi")), - `Rtpmap of tested codec should remain after filtering`); }, ]); diff --git a/dom/media/webrtc/tests/mochitests/test_peerConnection_basicScreenshare.html b/dom/media/webrtc/tests/mochitests/test_peerConnection_basicScreenshare.html @@ -32,6 +32,10 @@ `payload types, like RTX, are removed too.`); test.originalOffer.sdp = sdputils.removeAllButPayloadType(test.originalOffer.sdp, payloadType); + ok(test.originalOffer.sdp.match(new RegExp(`m=.*UDP/TLS/RTP/SAVPF.* ${payloadType}[^0-9]`, "gi")), + `Tested codec ${payloadType} should remain after filtering`); + ok(test.originalOffer.sdp.match(new RegExp(`a=rtpmap:${payloadType}[^0-9]`, "gi")), + `Tested codec ${payloadType} rtpmap should remain after filtering`); }, ]); await test.run(); diff --git a/dom/media/webrtc/tests/mochitests/test_peerConnection_scaleResolution.html b/dom/media/webrtc/tests/mochitests/test_peerConnection_scaleResolution.html @@ -60,9 +60,7 @@ is(parameters.encodings[0].maxBitrate, 60000, "Should be able to set maxBitrate"); let offer = await pc1.createOffer(); - if (codec == "H264") { - offer.sdp = sdputils.removeAllButPayloadType(offer.sdp, 126); - } + offer.sdp = sdputils.removeAllButCodec(offer.sdp, codec); await pc1.setLocalDescription(offer); await pc2.setRemoteDescription(pc1.localDescription); diff --git a/dom/media/webrtc/tests/mochitests/test_peerConnection_scaleResolution_oldSetParameters.html b/dom/media/webrtc/tests/mochitests/test_peerConnection_scaleResolution_oldSetParameters.html @@ -63,9 +63,7 @@ scaleResolutionDownBy: 2 }] }); let offer = await pc1.createOffer(); - if (codec == "H264") { - offer.sdp = sdputils.removeAllButPayloadType(offer.sdp, 126); - } + offer.sdp = sdputils.removeAllButCodec(offer.sdp, codec); await pc1.setLocalDescription(offer); await pc2.setRemoteDescription(pc1.localDescription);