gUM_support.js (3666B)
1 // Support script for test that use getUserMedia. This allows explicit 2 // configuration of prefs which affect gUM. See also 3 // `testing/mochitest/runtests.py` for how the harness configures values. 4 5 // Setup preconditions for tests using getUserMedia. This functions helps 6 // manage different prefs that affect gUM calls in tests and makes explicit 7 // the expected state before test runs. 8 async function pushGetUserMediaTestPrefs({ 9 fakeAudio = false, 10 fakeVideo = false, 11 loopbackAudio = false, 12 loopbackVideo = false, 13 }) { 14 // Make sure we have sensical arguments 15 if (!fakeAudio && !loopbackAudio) { 16 throw new Error( 17 "pushGetUserMediaTestPrefs: Should have fake or loopback audio!" 18 ); 19 } else if (fakeAudio && loopbackAudio) { 20 throw new Error( 21 "pushGetUserMediaTestPrefs: Should not have both fake and loopback audio!" 22 ); 23 } 24 if (!fakeVideo && !loopbackVideo) { 25 throw new Error( 26 "pushGetUserMediaTestPrefs: Should have fake or loopback video!" 27 ); 28 } else if (fakeVideo && loopbackVideo) { 29 throw new Error( 30 "pushGetUserMediaTestPrefs: Should not have both fake and loopback video!" 31 ); 32 } 33 34 let testPrefs = []; 35 if (fakeAudio) { 36 // Unset the loopback device so it doesn't take precedence 37 testPrefs.push(["media.audio_loopback_dev", ""]); 38 // Setup fake streams pref 39 testPrefs.push(["media.navigator.streams.fake", true]); 40 } 41 if (loopbackAudio) { 42 // If audio loopback is requested we expect the test harness to have set 43 // the loopback device pref, make sure it's set 44 let audioLoopDev = SpecialPowers.getCharPref( 45 "media.audio_loopback_dev", 46 "" 47 ); 48 if (!audioLoopDev) { 49 throw new Error( 50 "pushGetUserMediaTestPrefs: Loopback audio requested but " + 51 "media.audio_loopback_dev does not appear to be set!" 52 ); 53 } 54 } 55 if (fakeVideo) { 56 // Unset the loopback device so it doesn't take precedence 57 testPrefs.push(["media.video_loopback_dev", ""]); 58 // Setup fake streams pref 59 testPrefs.push(["media.navigator.streams.fake", true]); 60 } 61 if (loopbackVideo) { 62 // If video loopback is requested we expect the test harness to have set 63 // the loopback device pref, make sure it's set 64 let videoLoopDev = SpecialPowers.getCharPref( 65 "media.video_loopback_dev", 66 "" 67 ); 68 if (!videoLoopDev) { 69 throw new Error( 70 "pushGetUserMediaTestPrefs: Loopback video requested but " + 71 "media.video_loopback_dev does not appear to be set!" 72 ); 73 } 74 } 75 // Prevent presentation of the gUM permission prompt. 76 testPrefs.push(["media.navigator.permission.disabled", true]); 77 return SpecialPowers.pushPrefEnv({ set: testPrefs }); 78 } 79 80 // Setup preconditions for tests using getUserMedia. This function will 81 // configure prefs to select loopback device(s) if it can find loopback device 82 // names already set in the prefs. If no loopback device name can be found then 83 // prefs are setup such that a fake device is used. 84 async function setupGetUserMediaTestPrefs() { 85 let prefRequests = {}; 86 let audioLoopDev = SpecialPowers.getCharPref("media.audio_loopback_dev", ""); 87 if (audioLoopDev) { 88 prefRequests.fakeAudio = false; 89 prefRequests.loopbackAudio = true; 90 } else { 91 prefRequests.fakeAudio = true; 92 prefRequests.loopbackAudio = false; 93 } 94 let videoLoopDev = SpecialPowers.getCharPref("media.video_loopback_dev", ""); 95 if (videoLoopDev) { 96 prefRequests.fakeVideo = false; 97 prefRequests.loopbackVideo = true; 98 } else { 99 prefRequests.fakeVideo = true; 100 prefRequests.loopbackVideo = false; 101 } 102 return pushGetUserMediaTestPrefs(prefRequests); 103 }