tor-browser

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

test_ondevicechange_resistfingerprinting.html (3203B)


      1 <!DOCTYPE html>
      2 <html>
      3  <head>
      4    <meta charset="utf-8" />
      5    <script type="application/javascript" src="mediaStreamPlayback.js"></script>
      6  </head>
      7  <body>
      8    <script type="application/javascript">
      9      "use strict";
     10 
     11      createHTML({
     12        title: "ondevicechange test with privacy.resistFingerprinting",
     13        bug: "1811836",
     14      });
     15 
     16      async function resolveOnEvent(target, name) {
     17        return new Promise(r =>
     18          target.addEventListener(name, r, { once: true })
     19        );
     20      }
     21      let eventCount = 0;
     22      async function triggerVideoDevicechange() {
     23        ++eventCount;
     24        // "media.getusermedia.fake-camera-name" specifies the name of the single
     25        // fake video camera.
     26        // Changing the pref imitates replacing one device with another.
     27        return pushPrefs([
     28          "media.getusermedia.fake-camera-name",
     29          `devicechange ${eventCount}`,
     30        ]);
     31      }
     32 
     33      runTest(async () => {
     34        const basePrefs = [
     35          // Use the fake video backend to trigger devicechange events.
     36          ["media.navigator.streams.fake", true],
     37          // Loopback would override fake.
     38          ["media.video_loopback_dev", ""],
     39          // Make fake devices count as real, permission-wise, or devicechange
     40          // events won't be exposed
     41          ["media.navigator.permission.fake", true],
     42          // For gUM.
     43          ["media.navigator.permission.disabled", true],
     44        ];
     45 
     46        await withPrefs(
     47          [
     48            ...basePrefs,
     49            // Enable privacy.resistFingerprinting to test the prevention of
     50            // device list changes.
     51            ["privacy.resistFingerprinting", true],
     52          ],
     53          async () => {
     54            const topDevices = navigator.mediaDevices;
     55            const topEventPromise1 = resolveOnEvent(topDevices, "devicechange");
     56            (await topDevices.getUserMedia({ video: true }))
     57              .getTracks()[0]
     58              .stop();
     59 
     60            await triggerVideoDevicechange(); // Pop pref list after this.
     61 
     62            const racer = {};
     63            is(
     64              await Promise.race([topEventPromise1, racer]),
     65              racer,
     66              "devicechange event is NOT fired in top window for replaced device when " +
     67                "privacy.resistFingerprinting is enabled"
     68            );
     69            await SpecialPowers.popPrefEnv();
     70          }
     71        );
     72 
     73        await withPrefs(
     74          [
     75            ...basePrefs,
     76            // Disable privacy.resistFingerprinting to test the exposure of device list
     77            // changes.
     78            ["privacy.resistFingerprinting", false],
     79          ],
     80          async () => {
     81            const topDevices = navigator.mediaDevices;
     82            const topEventPromise2 = resolveOnEvent(topDevices, "devicechange");
     83 
     84            await triggerVideoDevicechange();
     85 
     86            await topEventPromise2;
     87            ok(
     88              true,
     89              "devicechange event is fired in top window for replaced device when " +
     90                "privacy.resistFingerprinting is disabled"
     91            );
     92            await SpecialPowers.popPrefEnv();
     93          }
     94        );
     95      });
     96    </script>
     97  </body>
     98 </html>