DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
<!DOCTYPE HTML>
<html>
<head>
  <script src="mediaStreamPlayback.js"></script>
</head>
<body>
<pre id="test">
<script type="application/javascript">
createHTML({ title: "Test getUserMedia in iframes", bug: "1371741" });
/**
  Tests covering enumerateDevices API and deviceId constraint. Exercise code.
*/

// Call gUM in iframe.
async function iframeGum(dict, iframe = document.createElement("iframe")) {
  Object.assign(iframe, dict);
  if (dict.src) {
    info(`<iframe src="${dict.src}" sandbox="${dict.sandbox}">`);
  } else {
    info(`<iframe srcdoc sandbox="${dict.sandbox}">`);
  }
  document.documentElement.appendChild(iframe);

  const once = (t, msg) => new Promise(r => t.addEventListener(msg, r, { once: true }));
  const haveMessage = once(window, "message");
  await new Promise(resolve => iframe.onload = resolve);
  return (await haveMessage).data;
};

runTest(async () => {
  const path = "/tests/dom/media/tests/mochitest/test_getUserMedia_permission_iframe.html";

  async function sourceFn() {
    try {
      const gUM = c => navigator.mediaDevices.getUserMedia(c);
      let message;
      let stream;
      try {
        stream = await gUM({ video: true });
        message = 'success';
      } catch(e) {
        message = e.name;
      }
      parent.postMessage(message, 'https://example.com:443');

      if (message == "success") {
        stream.getTracks().forEach(track => track.stop());
      }
    } catch (e) {
      setTimeout(() => { throw e; });
    }
  }

  const source = `<html\><script\>(${sourceFn.toString()})()</script\></html\>`;

  // Test gUM in sandboxed vs. regular iframe.

  for (const origin of ["https://example.com", "https://test1.example.com"]) {
    const src = origin + path;
    is(await iframeGum({ src, sandbox: "allow-scripts" }),
       "NotAllowedError", "gUM fails in sandboxed iframe " + origin);
    is(await iframeGum({ src, sandbox: "allow-scripts allow-same-origin " + origin }),
       "success", "gUM works in regular iframe");
  }

  // Test gUM in sandboxed vs regular srcdoc iframe

  const iframeSrcdoc = document.createElement("iframe");
  iframeSrcdoc.srcdoc = source;
  is(await iframeGum({ sandbox: "allow-scripts" }, iframeSrcdoc),
     "NotAllowedError", "gUM fails in sandboxed srcdoc iframe");
  is(await iframeGum({ sandbox: "allow-scripts allow-same-origin" }, iframeSrcdoc),
     "success", "gUM works in regular srcdoc iframe");

  // Test gUM in sandboxed vs regular blob iframe

  const blob = new Blob([source], {type : "text/html"});
	let src = URL.createObjectURL(blob);
  is(await iframeGum({ src, sandbox: "allow-scripts" }),
     "NotAllowedError", "gUM fails in sandboxed blob iframe");
  is(await iframeGum({ src, sandbox: "allow-scripts allow-same-origin"}),
     "success", "gUM works in regular blob iframe");
  URL.revokeObjectURL(src);

  // data iframes always have null-principals

  src = `data:text/html;base64,${btoa(source)}`;
  is(await iframeGum({ src, sandbox: "allow-scripts" }),
     "TypeError", "navigator.mediaDevices undefined in sandboxed data iframe");
  is(await iframeGum({ src, sandbox: "allow-scripts allow-same-origin"}),
     "TypeError", "navigator.mediaDevices undefined in regular data iframe");
});
</script>
</pre>
</body>
</html>