tor-browser

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

test_peerConnection_verifyDescriptions.html (6470B)


      1 <!DOCTYPE HTML>
      2 <html>
      3 <head>
      4  <script type="application/javascript" src="pc.js"></script>
      5 </head>
      6 <body>
      7 <pre id="test">
      8 <script type="application/javascript">
      9  createHTML({
     10    bug: "1264479",
     11    title: "PeerConnection verify current and pending descriptions in legacy mode"
     12  });
     13 
     14  // Mostly covered by WPT tests these days, except for in our legacy mode
     15 
     16  const isSimilarDescription = (d1, d2, msg) => {
     17    isnot(d1, d2, msg + " — not the same object");
     18    is(d1.type, d2.type, msg + " — but same type");
     19    is(d1.sdp, d2.sdp, msg + " — and same sdp");
     20  }
     21 
     22  const addIce = (pc, can, failed) => can && pc.addIceCandidate(can).catch(failed);
     23 
     24  const tests = [
     25    async function checkLegacyDescriptions() {
     26      await withPrefs([["media.peerconnection.description.legacy.enabled", true]],
     27        async () => {
     28          const pc1 = new RTCPeerConnection();
     29          const pc2 = new RTCPeerConnection();
     30 
     31          pc1.onicecandidate = e => addIce(pc2, e.candidate, generateErrorCallback());
     32          pc2.onicecandidate = e => addIce(pc1, e.candidate, generateErrorCallback());
     33 
     34          const v1 = createMediaElement('video', 'v1');
     35          const v2 = createMediaElement('video', 'v2');
     36 
     37          const stream = await navigator.mediaDevices.getUserMedia({
     38            video: true, audio: true
     39          });
     40          v1.srcObject = stream;
     41          for (const track of stream.getTracks()) {
     42            pc1.addTrack(track, stream);
     43          }
     44          await pc1.setLocalDescription();
     45          is(pc1.currentLocalDescription, null, "pc1 currentLocalDescription is null");
     46          ok(pc1.pendingLocalDescription, "pc1 pendingLocalDescription is set");
     47          ok(pc1.localDescription, "pc1 localDescription is set");
     48          isSimilarDescription(pc1.pendingLocalDescription, pc1.pendingLocalDescription, "pendingLocalDescription");
     49          isSimilarDescription(pc1.localDescription, pc1.localDescription, "localDescription");
     50          isSimilarDescription(pc1.localDescription, pc1.pendingLocalDescription, "local and pending");
     51 
     52          await pc2.setRemoteDescription(pc1.localDescription);
     53          is(pc2.currentRemoteDescription, null, "pc2 currentRemoteDescription is null");
     54          ok(pc2.pendingRemoteDescription, "pc2 pendingRemoteDescription is set");
     55          ok(pc2.remoteDescription, "pc2 remoteDescription is set");
     56          isSimilarDescription(pc2.pendingRemoteDescription, pc2.pendingRemoteDescription, "pendingRemoteDescription");
     57          isSimilarDescription(pc2.remoteDescription, pc2.remoteDescription, "remoteDescription");
     58          isSimilarDescription(pc2.remoteDescription, pc2.pendingRemoteDescription, "remote and pending");
     59 
     60          await pc2.setLocalDescription();
     61          ok(pc2.currentLocalDescription, "pc2 currentLocalDescription is set");
     62          is(pc2.pendingLocalDescription, null, "pc2 pendingLocalDescription is null");
     63          ok(pc2.localDescription, "pc2 localDescription is set");
     64          isSimilarDescription(pc2.currentLocalDescription, pc2.currentLocalDescription, "currentLocalDescription");
     65          isSimilarDescription(pc2.localDescription, pc2.localDescription, "localDescription");
     66          isSimilarDescription(pc2.localDescription, pc2.currentLocalDescription, "local and current");
     67 
     68          await pc1.setRemoteDescription(pc2.localDescription);
     69          ok(pc1.currentRemoteDescription, "pc1 currentRemoteDescription is set");
     70          is(pc1.pendingRemoteDescription, null, "pc1 pendingRemoteDescription is null");
     71          ok(pc1.remoteDescription, "pc1 remoteDescription is set");
     72          isSimilarDescription(pc1.currentRemoteDescription, pc1.currentRemoteDescription, "currentRemoteDescription");
     73          isSimilarDescription(pc1.remoteDescription, pc1.remoteDescription, "remoteDescription");
     74          isSimilarDescription(pc1.remoteDescription, pc1.currentRemoteDescription, "remote and current");
     75        }
     76      );
     77    },
     78 
     79    async function checkDuplicateFingerprintQuirk() {
     80      await withPrefs([["media.peerconnection.sdp.quirk.duplicate_fingerprint.allowlist", "example.com"]],
     81        async () => {
     82          const pc1 = new RTCPeerConnection();
     83          const pc2 = new RTCPeerConnection();
     84 
     85          pc1.onicecandidate = e => addIce(pc2, e.candidate, generateErrorCallback());
     86          pc2.onicecandidate = e => addIce(pc1, e.candidate, generateErrorCallback());
     87 
     88          const stream = await navigator.mediaDevices.getUserMedia({
     89            video: true, audio: true
     90          });
     91          v1.srcObject = stream;
     92          for (const track of stream.getTracks()) {
     93            pc1.addTrack(track, stream);
     94          }
     95 
     96          const fingerprints = ({sdp}) => sdp.match(/a=fingerprint/g).length;
     97 
     98          // with implicit offer and answer
     99          await pc1.setLocalDescription();
    100          is(fingerprints(pc1.localDescription), 3, "implicit pc1 local fingerprints");
    101          is(fingerprints(pc1.pendingLocalDescription), 3, "implicit pc1 pending fingerprints");
    102          await pc2.setRemoteDescription(pc1.localDescription);
    103          await pc2.setLocalDescription();
    104          is(fingerprints(pc2.localDescription), 3, "implicit pc2 local fingerprints");
    105          is(fingerprints(pc2.currentLocalDescription), 3, "implicit pc2 current fingerprints");
    106          await pc1.setRemoteDescription(pc2.localDescription);
    107 
    108          // with explicit offer and answer
    109          const offer = await pc1.createOffer();
    110          is(fingerprints(offer), 3, "offer fingerprints");
    111          await pc1.setLocalDescription(offer);
    112          is(fingerprints(pc1.localDescription), 3, "explicit pc1 local fingerprints");
    113          is(fingerprints(pc1.pendingLocalDescription), 3, "explicit pc1 pending fingerprints");
    114          await pc2.setRemoteDescription(pc1.localDescription);
    115          const answer = pc2.createAnswer();
    116          is(fingerprints(offer), 3, "answer fingerprints");
    117          await pc2.setLocalDescription(answer);
    118          is(fingerprints(pc2.localDescription), 3, "explicit pc2 fingerprints A");
    119          is(fingerprints(pc2.currentLocalDescription), 3, "explicit pc2 fingerprints B");
    120          await pc1.setRemoteDescription(pc2.localDescription);
    121        }
    122      );
    123    }
    124  ];
    125 
    126  runNetworkTest(async () => {
    127    for (const test of tests) {
    128      info(`Running test: ${test.name}`);
    129      await test();
    130      info(`Done running test: ${test.name}`);
    131    }
    132  });
    133 </script>
    134 </pre>
    135 </body>
    136 </html>