diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
commit | 36d22d82aa202bb199967e9512281e9a53db42c9 (patch) | |
tree | 105e8c98ddea1c1e4784a60a5a6410fa416be2de /browser/base/content/test/webrtc/get_user_media.html | |
parent | Initial commit. (diff) | |
download | firefox-esr-upstream.tar.xz firefox-esr-upstream.zip |
Adding upstream version 115.7.0esr.upstream/115.7.0esrupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'browser/base/content/test/webrtc/get_user_media.html')
-rw-r--r-- | browser/base/content/test/webrtc/get_user_media.html | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/browser/base/content/test/webrtc/get_user_media.html b/browser/base/content/test/webrtc/get_user_media.html new file mode 100644 index 0000000000..8003785e14 --- /dev/null +++ b/browser/base/content/test/webrtc/get_user_media.html @@ -0,0 +1,124 @@ +<!DOCTYPE html> +<html> +<head><meta charset="UTF-8"></head> +<body> +<div id="message"></div> +<script> +// Specifies whether we are using fake streams to run this automation +var useFakeStreams = true; +try { + var audioDevice = SpecialPowers.getCharPref("media.audio_loopback_dev"); + var videoDevice = SpecialPowers.getCharPref("media.video_loopback_dev"); + dump("TEST DEVICES: Using media devices:\n"); + dump("audio: " + audioDevice + "\nvideo: " + videoDevice + "\n"); + useFakeStreams = false; +} catch (e) { + dump("TEST DEVICES: No test devices found (in media.{audio,video}_loopback_dev, using fake streams.\n"); + useFakeStreams = true; +} + +function message(m) { + // eslint-disable-next-line no-unsanitized/property + document.getElementById("message").innerHTML += `${m}<br>`; + top.postMessage(m, "*"); +} + +var gStreams = []; +var gVideoEvents = []; +var gAudioEvents = []; + +async function requestDevice(aAudio, aVideo, aShare, aBadDevice = false) { + const opts = {video: aVideo, audio: aAudio}; + if (aShare) { + opts.video = { mediaSource: aShare }; + SpecialPowers.wrap(document).notifyUserGestureActivation(); + } + if (useFakeStreams) { + opts.fake = true; + } + + if (aVideo && aBadDevice) { + opts.video = { + deviceId: "bad device", + }; + opts.fake = true; + } + + if (aAudio && aBadDevice) { + opts.audio = { + deviceId: "bad device", + }; + opts.fake = true; + } + + try { + const stream = await navigator.mediaDevices.getUserMedia(opts) + gStreams.push(stream); + + const videoTrack = stream.getVideoTracks()[0]; + if (videoTrack) { + for (const name of ["mute", "unmute", "ended"]) { + videoTrack.addEventListener(name, () => gVideoEvents.push(name)); + } + } + + const audioTrack = stream.getAudioTracks()[0]; + if (audioTrack) { + for (const name of ["mute", "unmute", "ended"]) { + audioTrack.addEventListener(name, () => gAudioEvents.push(name)); + } + } + message("ok"); + } catch (err) { + message("error: " + err); + } +} + +let selectedAudioOutputId; +async function requestAudioOutput(options = {}) { + const audioOutputOptions = options.requestSameDevice && { + deviceId: selectedAudioOutputId, + }; + SpecialPowers.wrap(document).notifyUserGestureActivation(); + try { + ({ deviceId: selectedAudioOutputId } = + await navigator.mediaDevices.selectAudioOutput(audioOutputOptions)); + message("ok"); + } catch (err) { + message("error: " + err); + } +} + +message("pending"); + +function stopTracks(aKind) { + for (let stream of gStreams) { + for (let track of stream.getTracks()) { + if (track.kind == aKind) { + track.stop(); + stream.removeTrack(track); + } + } + } + gStreams = gStreams.filter(s => !!s.getTracks().length); + if (aKind == "video") { + gVideoEvents = []; + } else if (aKind == "audio") { + gAudioEvents = []; + } +} + +function closeStream() { + for (let stream of gStreams) { + for (let track of stream.getTracks()) { + track.stop(); + } + } + gStreams = []; + gVideoEvents = []; + gAudioEvents = []; + message("closed"); +} +</script> +</body> +</html> |