test_peerConnection_renderAfterRenegotiation.html (3300B)
1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <script type="application/javascript" src="pc.js"></script> 5 <script type="application/javascript" src="/tests/dom/canvas/test/captureStream_common.js"></script> 6 </head> 7 <body> 8 <pre id="test"> 9 <script type="application/javascript"> 10 createHTML({ 11 bug: "1273652", 12 title: "Video receiver still renders after renegotiation", 13 visible: true 14 }); 15 16 var pc1 = new RTCPeerConnection(); 17 var pc2 = new RTCPeerConnection(); 18 19 var add = (pc, can, failed) => can && pc.addIceCandidate(can).catch(failed); 20 pc1.onicecandidate = e => add(pc2, e.candidate, generateErrorCallback()); 21 pc2.onicecandidate = e => add(pc1, e.candidate, generateErrorCallback()); 22 23 var v1, v2; 24 var delivered = new Promise(resolve => pc2.ontrack = e => { 25 // Test RTCTrackEvent here. 26 ok(e.streams.length, "has streams"); 27 ok(e.streams[0].getTrackById(e.track.id), "has track"); 28 ok(pc2.getReceivers().some(receiver => receiver == e.receiver), "has receiver"); 29 if (e.streams[0].getTracks().length == 1) { 30 // Test RTCTrackEvent required args here. 31 mustThrowWith("RTCTrackEvent wo/required args", 32 "TypeError", () => new RTCTrackEvent("track", {})); 33 v2.srcObject = e.streams[0]; 34 resolve(); 35 } 36 }); 37 38 runNetworkTest(async () => { 39 // [TODO] re-enable HW decoder after bug 1526207 is fixed. 40 if (navigator.userAgent.includes("Android")) { 41 await pushPrefs(["media.navigator.mediadatadecoder_vpx_enabled", false]); 42 await pushPrefs(["media.webrtc.hw.h264.enabled", false]); 43 } 44 45 v2 = createMediaElement('video', 'v2'); 46 is(v2.currentTime, 0, "v2.currentTime is zero at outset"); 47 48 const emitter = new VideoFrameEmitter(CaptureStreamTestHelper.prototype.blue, 49 CaptureStreamTestHelper.prototype.green, 50 16, 16); 51 emitter.start(); 52 emitter.stream().getTracks().forEach(t => pc1.addTrack(t, emitter.stream())); 53 let h = emitter.helper(); 54 55 let offer = await pc1.createOffer({}); 56 await pc1.setLocalDescription(offer); 57 await pc2.setRemoteDescription(pc1.localDescription); 58 // check that createAnswer accepts arg. 59 let answer = await pc2.createAnswer({}); 60 await pc2.setLocalDescription(answer); 61 await pc1.setRemoteDescription(pc2.localDescription); 62 63 // re-negotiate to trigger the race condition in the jitter buffer 64 offer = await pc1.createOffer({}); // check that createOffer accepts arg. 65 await pc1.setLocalDescription(offer); 66 await pc2.setRemoteDescription(pc1.localDescription); 67 answer = await pc2.createAnswer({}); 68 await pc2.setLocalDescription(answer); 69 await pc1.setRemoteDescription(pc2.localDescription); 70 await delivered; 71 72 // now verify that actually something gets rendered into the remote video 73 // element. 74 await h.pixelMustBecome(v2, h.blue, { 75 threshold: 128, 76 infoString: "pcRemote's video should become blue", 77 }); 78 // This will verify that new changes to the canvas propagate through 79 // the peerconnection 80 emitter.colors(h.red, h.green) 81 await h.pixelMustBecome(v2, h.red, { 82 threshold: 128, 83 infoString: "pcRemote's video should become red", 84 }); 85 }); 86 </script> 87 </pre> 88 </body> 89 </html>