tor-browser

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

get_user_media_in_frame.html (2702B)


      1 <!DOCTYPE html>
      2 <html>
      3 <head><meta charset="UTF-8"></head>
      4 <body>
      5 <div id="message"></div>
      6 <script>
      7 // Specifies whether we are using fake streams to run this automation
      8 var useFakeStreams = true;
      9 try {
     10  var audioDevice = SpecialPowers.getCharPref("media.audio_loopback_dev");
     11  var videoDevice = SpecialPowers.getCharPref("media.video_loopback_dev");
     12  dump("TEST DEVICES: Using media devices:\n");
     13  dump("audio: " + audioDevice + "\nvideo: " + videoDevice + "\n");
     14  useFakeStreams = false;
     15 } catch (e) {
     16  dump("TEST DEVICES: No test devices found (in media.{audio,video}_loopback_dev, using fake streams.\n");
     17  useFakeStreams = true;
     18 }
     19 
     20 function message(m) {
     21  document.getElementById("message").innerHTML += `${m}<br>`;
     22  window.top.postMessage(m, "*");
     23 }
     24 
     25 var gStreams = [];
     26 
     27 function requestDevice(aAudio, aVideo, aShare) {
     28  var opts = {video: aVideo, audio: aAudio};
     29  if (aShare) {
     30    opts.video = { mediaSource: aShare };
     31  } else if (useFakeStreams) {
     32    opts.fake = true;
     33  }
     34 
     35  window.navigator.mediaDevices.getUserMedia(opts)
     36    .then(stream => {
     37      gStreams.push(stream);
     38      message("ok");
     39    }, err => message("error: " + err));
     40 }
     41 message("pending");
     42 
     43 function stopTracks(aKind) {
     44  for (let stream of gStreams) {
     45    for (let track of stream.getTracks()) {
     46      if (track.kind == aKind) {
     47        track.stop();
     48        stream.removeTrack(track);
     49      }
     50    }
     51  }
     52  gStreams = gStreams.filter(s => !!s.getTracks().length);
     53 }
     54 
     55 function closeStream() {
     56  for (let stream of gStreams) {
     57    for (let track of stream.getTracks()) {
     58      track.stop();
     59    }
     60  }
     61  gStreams = [];
     62  message("closed");
     63 }
     64 
     65 const query = document.location.search.substring(1);
     66 const params = new URLSearchParams(query);
     67 const origins = params.getAll("origin");
     68 const nested = params.getAll("nested");
     69 const gumpage = nested.length
     70  ? "get_user_media_in_frame.html"
     71  : "get_user_media.html";
     72 let id = 1;
     73 if (!origins.length) {
     74  for(let i = 0; i < 2; ++i) {
     75    const iframe = document.createElement("iframe");
     76    iframe.id = `frame${id++}`;
     77    iframe.src = gumpage;
     78    document.body.appendChild(iframe);
     79  }
     80 } else {
     81  for (let origin of origins) {
     82    const iframe = document.createElement("iframe");
     83    iframe.id = `frame${id++}`;
     84    const base = new URL("browser/browser/base/content/test/webrtc/", origin).href;
     85    const url = new URL(gumpage, base);
     86    for (let nestedOrigin of nested) {
     87      url.searchParams.append("origin", nestedOrigin);
     88    }
     89    iframe.src = url.href;
     90    iframe.allow = "camera;microphone";
     91    iframe.style = `width:${300 * Math.max(1, nested.length) + (nested.length ? 50 : 0)}px;`;
     92    document.body.appendChild(iframe);
     93  }
     94 }
     95 </script>
     96 </body>
     97 </html>