getUserMedia-audio-disabled-clone.https.html (1680B)
1 <!doctype html> 2 <title>Test clone of disabled audio track from getUserMedia()</title> 3 <script src=/resources/testharness.js></script> 4 <script src=/resources/testharnessreport.js></script> 5 <body></body> 6 <script> 7 'use strict'; 8 9 async function promise_is_track_silent(track) { 10 const ctx = new AudioContext(); 11 const sourceNode = 12 new MediaStreamTrackAudioSourceNode(ctx, {mediaStreamTrack: track}); 13 const processor = ctx.createScriptProcessor(8192, 1, 0); 14 sourceNode.connect(processor); 15 const e = await new Promise(resolve => processor.onaudioprocess = resolve); 16 ctx.close(); 17 const input = e.inputBuffer.getChannelData(0); 18 for (const sample of input) { 19 if (sample != 0.0) { 20 return false; 21 } 22 } 23 return true; 24 } 25 26 promise_test(async t => { 27 const stream = await navigator.mediaDevices.getUserMedia({audio: true}); 28 const [track] = stream.getTracks(); 29 track.enabled = false; 30 // media.getusermedia.microphone.off_while_disabled.delay_ms is 0. 31 // Allow some events to be processed for DeviceListener::SetDeviceEnabled() 32 // to change mDeviceState.mDeviceEnabled. 33 for (const i of Array(2).keys()) { 34 await new Promise(resolve => t.step_timeout(resolve, 0)); 35 } 36 const clone = track.clone(); 37 assert_false(clone.enabled, 'clone.enabled'); 38 assert_true(await promise_is_track_silent(clone), 39 'clone silent before enabled'); 40 clone.enabled = true; 41 assert_false(await promise_is_track_silent(clone), 42 'clone silent after enabled'); 43 assert_false(track.enabled, 'track.enabled'); 44 assert_true(await promise_is_track_silent(track), 'track silent'); 45 }, 'clone of disabled getUserMedia() audio track'); 46 </script>