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>