tor-browser

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

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 }