commit d6f91bc97406921010f8604350ed19c6375276e6
parent 90f8b48286403e81d62e8b3f5c68f8fe3342c6a3
Author: Andreas Pehrson <apehrson@mozilla.com>
Date: Tue, 11 Nov 2025 08:20:24 +0000
Bug 1771789 - Test audio capture cloning independence. r=jib
Differential Revision: https://phabricator.services.mozilla.com/D266399
Diffstat:
2 files changed, 78 insertions(+), 1 deletion(-)
diff --git a/testing/web-platform/mozilla/meta/mediacapture-streams/MediaStreamTrack-independent-clones.https.html.ini b/testing/web-platform/mozilla/meta/mediacapture-streams/MediaStreamTrack-independent-clones.https.html.ini
@@ -1,2 +1,32 @@
[MediaStreamTrack-independent-clones.https.html]
- prefs: [media.getusermedia.camera.fake.force:true, media.navigator.streams.fake:false]
+ [gDM gets expected modes by {"resizeMode":"none","width":100} + (cloned) {"resizeMode":"none","height":500}]
+ expected:
+ if os == "android": FAIL
+ [gDM gets expected modes by {"resizeMode":"none","frameRate":50} + (cloned) {"resizeMode":"none","frameRate":1}]
+ expected:
+ if os == "android": FAIL
+ [gDM gets expected modes by {"resizeMode":"none"} + (cloned) {"resizeMode":"crop-and-scale"}]
+ expected:
+ if os == "android": FAIL
+ [gDM gets expected modes by {"resizeMode":"crop-and-scale"} + (cloned) {"resizeMode":"crop-and-scale","height":100}]
+ expected:
+ if os == "android": FAIL
+ [gDM gets expected modes by {"resizeMode":"crop-and-scale","height":100} + (cloned) {"resizeMode":"crop-and-scale"}]
+ expected:
+ if os == "android": FAIL
+ [gDM gets expected modes by {"resizeMode":"crop-and-scale","frameRate":5} + (cloned) {"resizeMode":"crop-and-scale","frameRate":50}]
+ expected:
+ if os == "android": FAIL
+ [gDM gets expected modes by {"resizeMode":"crop-and-scale","frameRate":50} + (cloned) {"resizeMode":"crop-and-scale","frameRate":5}]
+ expected:
+ if os == "android": FAIL
+ [gDM gets expected modes by {"resizeMode":"none"} + (cloned) {"resizeMode":"crop-and-scale","frameRate":5000}]
+ expected:
+ if os == "android": FAIL
+ [applyConstraints on gDM clone doesn't crop with only ideal dimensions]
+ expected:
+ if os == "android": FAIL
+ [applyConstraints on gDM clone doesn't crop with ideal and max dimensions]
+ expected:
+ if os == "android": FAIL
+ prefs: [media.getusermedia.camera.fake.force:true, media.navigator.streams.fake:false, media.cubeb.force_mock_context:true]
diff --git a/testing/web-platform/mozilla/tests/mediacapture-streams/MediaStreamTrack-independent-clones.https.html b/testing/web-platform/mozilla/tests/mediacapture-streams/MediaStreamTrack-independent-clones.https.html
@@ -91,6 +91,53 @@
`${JSON.stringify(cloneExpected)} by ${JSON.stringify(video)} ` +
`and ${JSON.stringify(cloneVideo)}`));
+ [
+ [
+ [{echoCancellation: true}, {echoCancellation: false, noiseSuppression: true, autoGainControl: true}],
+ [
+ {echoCancellation: true, noiseSuppression: true, autoGainControl: true},
+ {echoCancellation: false, noiseSuppression: true, autoGainControl: true},
+ ],
+ ],
+ [
+ [{echoCancellation: false, noiseSuppression: false, autoGainControl: false}, {}],
+ [
+ {echoCancellation: false, noiseSuppression: false, autoGainControl: false},
+ {echoCancellation: true, noiseSuppression: true, autoGainControl: true},
+ ],
+ ],
+ ].forEach(
+ ([
+ [audio, cloneAudio],
+ [expected, cloneExpected],
+ ]) => promise_test(async t => {
+ const stream = await navigator.mediaDevices.getUserMedia({audio});
+ const [track] = stream.getTracks();
+ const clone = track.clone();
+ t.add_cleanup(() => {
+ track.stop();
+ clone.stop();
+ });
+ let settings = track.getSettings();
+ let cloneSettings = clone.getSettings();
+ for (const key of Object.keys(expected)) {
+ assert_equals(settings[key], expected[key], `original: ${key}`);
+ assert_equals(cloneSettings[key], expected[key], `clone: ${key}`);
+ }
+ await clone.applyConstraints(cloneAudio);
+ settings = track.getSettings();
+ cloneSettings = clone.getSettings();
+ for (const key of Object.keys(expected)) {
+ assert_equals(settings[key], expected[key], `original-post: ${key}`);
+ }
+ for (const key of Object.keys(cloneExpected)) {
+ assert_equals(cloneSettings[key], cloneExpected[key], `clone-post: ${key}`);
+ }
+ }, `gUM gets ${JSON.stringify(expected)} + clone ` +
+ `${JSON.stringify(cloneExpected)} by ${JSON.stringify(audio)} ` +
+ `and ${JSON.stringify(cloneAudio)}`));
+
+
promise_test(async t => {
const stream = await navigator.mediaDevices.getUserMedia({video: true});