tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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>