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 /testing/web-platform/tests/webrtc/RTCPeerConnection-relay-canvas.https.html | |
parent | Initial commit. (diff) | |
download | firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.tar.xz firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.zip |
Adding upstream version 115.7.0esr.upstream/115.7.0esr
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'testing/web-platform/tests/webrtc/RTCPeerConnection-relay-canvas.https.html')
-rw-r--r-- | testing/web-platform/tests/webrtc/RTCPeerConnection-relay-canvas.https.html | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/testing/web-platform/tests/webrtc/RTCPeerConnection-relay-canvas.https.html b/testing/web-platform/tests/webrtc/RTCPeerConnection-relay-canvas.https.html new file mode 100644 index 0000000000..78df2ee82d --- /dev/null +++ b/testing/web-platform/tests/webrtc/RTCPeerConnection-relay-canvas.https.html @@ -0,0 +1,84 @@ +<!doctype html> +<meta charset=utf-8> +<meta name="timeout" content="long"> +<title>Relay canvas via PeerConnections</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src="RTCPeerConnection-helper.js"></script> +<script> + 'use strict'; + +// This test checks that canvas capture works relayed between several peer connections. + +function GreenFrameWebGL(width, height) { + const canvas = + Object.assign(document.createElement('canvas'), {width, height}); + const ctx = canvas.getContext('webgl'); + assert_not_equals(ctx, null, "webgl is a prerequisite for this test"); + requestAnimationFrame(function draw () { + ctx.clearColor(0.0, 1.0, 0.0, 1.0); + ctx.clear(ctx.COLOR_BUFFER_BIT); + requestAnimationFrame(draw); + }); + return canvas.captureStream(); +} + + + +promise_test(async t => { + + // Build a chain + // canvas -track-> pc1 -network-> pcRelayIn -track-> + // pcRelayOut -network-> pc2 -track-> video + const pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close()); + const pcRelayIn = new RTCPeerConnection(); + t.add_cleanup(() => pcRelayIn.close()); + + const pcRelayOut = new RTCPeerConnection(); + t.add_cleanup(() => pcRelayOut.close()); + const pc2 = new RTCPeerConnection(); + t.add_cleanup(() => pc2.close()); + + // Attach canvas to pc1. + const stream = GreenFrameWebGL(640, 480); + const [track] = stream.getTracks(); + pc1.addTrack(track); + + const v = document.createElement('video'); + v.autoplay = true; + + // Setup pc1->pcRelayIn video stream. + const haveTrackEvent1 = new Promise(r => pcRelayIn.ontrack = r); + exchangeIceCandidates(pc1, pcRelayIn); + await pc1.setLocalDescription(); + await pcRelayIn.setRemoteDescription(pc1.localDescription); + await pcRelayIn.setLocalDescription(); + await pc1.setRemoteDescription(pcRelayIn.localDescription); + + // Plug output of pcRelayIn to pcRelayOut. + pcRelayOut.addTrack((await haveTrackEvent1).track); + + // Setup pcRelayOut->pc2 video stream. + const haveTrackEvent2 = new Promise(r => pc2.ontrack = r); + exchangeIceCandidates(pcRelayOut, pc2); + await pcRelayOut.setLocalDescription(); + await pc2.setRemoteDescription(pcRelayOut.localDescription); + await pc2.setLocalDescription(); + await pcRelayOut.setRemoteDescription(pc2.localDescription); + + // Display pc2 received track in video element. + v.srcObject = new MediaStream([(await haveTrackEvent2).track]); + await new Promise(r => v.onloadedmetadata = r); + + // Wait some time to ensure that frames got through. + await new Promise(resolve => t.step_timeout(resolve, 1000)); + + // Uses Helper.js GetVideoSignal to query |v| pixel value at a certain position. + const pixelValue = getVideoSignal(v); + + // Expected value computed based on GetVideoSignal code, which takes green pixel data + // with coefficient 0.72. + assert_approx_equals(pixelValue, 0.72*255, 3); + }, "Two PeerConnections relaying a canvas source"); +</script> |