diff options
Diffstat (limited to 'dom/media/webrtc/tests/mochitests/test_peerConnection_renderAfterRenegotiation.html')
-rw-r--r-- | dom/media/webrtc/tests/mochitests/test_peerConnection_renderAfterRenegotiation.html | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/dom/media/webrtc/tests/mochitests/test_peerConnection_renderAfterRenegotiation.html b/dom/media/webrtc/tests/mochitests/test_peerConnection_renderAfterRenegotiation.html new file mode 100644 index 0000000000..07443431d2 --- /dev/null +++ b/dom/media/webrtc/tests/mochitests/test_peerConnection_renderAfterRenegotiation.html @@ -0,0 +1,92 @@ +<!DOCTYPE HTML> +<html> +<head> + <script type="application/javascript" src="pc.js"></script> + <script type="application/javascript" src="/tests/dom/canvas/test/captureStream_common.js"></script> +</head> +<body> +<pre id="test"> +<script type="application/javascript"> + createHTML({ + bug: "1273652", + title: "Video receiver still renders after renegotiation", + visible: true + }); + + var pc1 = new RTCPeerConnection(); + var pc2 = new RTCPeerConnection(); + + var add = (pc, can, failed) => can && pc.addIceCandidate(can).catch(failed); + pc1.onicecandidate = e => add(pc2, e.candidate, generateErrorCallback()); + pc2.onicecandidate = e => add(pc1, e.candidate, generateErrorCallback()); + + var v1, v2; + var delivered = new Promise(resolve => pc2.ontrack = e => { + // Test RTCTrackEvent here. + ok(e.streams.length > 0, "has streams"); + ok(e.streams[0].getTrackById(e.track.id), "has track"); + ok(pc2.getReceivers().some(receiver => receiver == e.receiver), "has receiver"); + if (e.streams[0].getTracks().length == 1) { + // Test RTCTrackEvent required args here. + mustThrowWith("RTCTrackEvent wo/required args", + "TypeError", () => new RTCTrackEvent("track", {})); + v2.srcObject = e.streams[0]; + resolve(); + } + }); + + runNetworkTest(async () => { + // [TODO] re-enable HW decoder after bug 1526207 is fixed. + if (navigator.userAgent.includes("Android")) { + await pushPrefs(["media.navigator.mediadatadecoder_vpx_enabled", false]); + await pushPrefs(["media.webrtc.hw.h264.enabled", false]); + } + + v2 = createMediaElement('video', 'v2'); + is(v2.currentTime, 0, "v2.currentTime is zero at outset"); + + const emitter = new VideoFrameEmitter(CaptureStreamTestHelper.prototype.blue, + CaptureStreamTestHelper.prototype.green, + 10, 10); + emitter.start(); + emitter.stream().getTracks().forEach(t => pc1.addTrack(t, emitter.stream())); + let h = emitter.helper(); + + pc1.createOffer({}) + .then(offer => pc1.setLocalDescription(offer)) + .then(() => pc2.setRemoteDescription(pc1.localDescription)) + .then(() => pc2.createAnswer({})) // check that createAnswer accepts arg. + .then(answer => pc2.setLocalDescription(answer)) + .then(() => pc1.setRemoteDescription(pc2.localDescription)) + + // re-negotiate to trigger the race condition in the jitter buffer + .then(() => pc1.createOffer({})) // check that createOffer accepts arg. + .then(offer => pc1.setLocalDescription(offer)) + .then(() => pc2.setRemoteDescription(pc1.localDescription)) + .then(() => pc2.createAnswer({})) + .then(answer => pc2.setLocalDescription(answer)) + .then(() => pc1.setRemoteDescription(pc2.localDescription)) + .then(() => delivered) + + // now verify that actually something gets rendered into the remote video + // element. + .then(() => h.pixelMustBecome(v2, h.blue, { + threshold: 128, + infoString: "pcRemote's video should become blue", + })) + // This will verify that new changes to the canvas propagate through + // the peerconnection + .then(() => { + emitter.colors(h.red, h.green) + }) + .then(() => h.pixelMustBecome(v2, h.red, { + threshold: 128, + infoString: "pcRemote's video should become red", + })) + .catch(reason => ok(false, "unexpected failure: " + reason)) + .then(networkTestFinished); + }); +</script> +</pre> +</body> +</html> |