tor-browser

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

RTCPeerConnection-insertable-streams-worker.https.html (7689B)


      1 <!DOCTYPE html>
      2 <html>
      3 <head>
      4 <title>RTCPeerConnection Insertable Streams - Worker</title>
      5 <script src="/resources/testharness.js"></script>
      6 <script src="/resources/testharnessreport.js"></script>
      7 <script src=/resources/testdriver.js></script>
      8 <script src=/resources/testdriver-vendor.js></script>
      9 <script src='../../mediacapture-streams/permission-helper.js'></script>
     10 <script src="../../webrtc/RTCPeerConnection-helper.js"></script>
     11 <script src="./RTCPeerConnection-insertable-streams.js"></script>
     12 <script src="./helper.js"></script>
     13 </head>
     14 <body>
     15 <script>
     16 promise_test(async t => {
     17  const caller = new RTCPeerConnection({encodedInsertableStreams:true});
     18  t.add_cleanup(() => caller.close());
     19  const callee = new RTCPeerConnection();
     20  t.add_cleanup(() => callee.close());
     21 
     22  // Video is used in a later test, so we ask for both permissions
     23  await setMediaPermission();
     24  const stream = await navigator.mediaDevices.getUserMedia({audio:true});
     25  const track = stream.getTracks()[0];
     26  t.add_cleanup(() => track.stop());
     27 
     28  const sender = caller.addTrack(track)
     29  const senderStreams = sender.createEncodedStreams();
     30 
     31  const senderWorker = new Worker('RTCPeerConnection-sender-worker-single-frame.js')
     32  t.add_cleanup(() => senderWorker.terminate());
     33  senderWorker.postMessage(
     34    {readableStream: senderStreams.readable},
     35    [senderStreams.readable]);
     36 
     37  let expectedFrameData = null;
     38  let verifiedFrameData = false;
     39  let numVerifiedFrames = 0;
     40  const onmessagePromise = new Promise(resolve => {
     41    senderWorker.onmessage = t.step_func(message => {
     42      if (!(message.data instanceof RTCEncodedAudioFrame)) {
     43        // This is the first message sent from the Worker to the test.
     44        // It contains an object (not an RTCEncodedAudioFrame) with the same
     45        // fields as the RTCEncodedAudioFrame to be sent in follow-up messages.
     46        // These serve as expected values to validate that the
     47        // RTCEncodedAudioFrame is sent correctly back to the test in the next
     48        // message.
     49        expectedFrameData = message.data;
     50      } else {
     51        // This is the frame sent by the Worker after reading it from the
     52        // readable stream. The Worker sends it twice after sending the
     53        // verification message.
     54        assert_equals(message.data.type, expectedFrameData.type);
     55        assert_equals(message.data.timestamp, expectedFrameData.timestamp);
     56        assert_true(areArrayBuffersEqual(message.data.data, expectedFrameData.data));
     57        if (++numVerifiedFrames == 2)
     58          resolve();
     59      }
     60    });
     61  });
     62 
     63  exchangeIceCandidates(caller, callee);
     64  await exchangeOfferAnswer(caller, callee);
     65 
     66  return onmessagePromise;
     67 }, 'RTCRtpSender readable stream transferred to a Worker and the Worker sends an RTCEncodedAudioFrame back');
     68 
     69 promise_test(async t => {
     70  const caller = new RTCPeerConnection({encodedInsertableStreams:true});
     71  t.add_cleanup(() => caller.close());
     72  const callee = new RTCPeerConnection();
     73  t.add_cleanup(() => callee.close());
     74 
     75  const stream = await navigator.mediaDevices.getUserMedia({video:true});
     76  const videoTrack = stream.getVideoTracks()[0];
     77  t.add_cleanup(() => videoTrack.stop());
     78 
     79  const videoSender = caller.addTrack(videoTrack)
     80  const senderStreams = videoSender.createEncodedStreams();
     81 
     82  const senderWorker = new Worker('RTCPeerConnection-sender-worker-single-frame.js')
     83  t.add_cleanup(() => senderWorker.terminate());
     84  senderWorker.postMessage(
     85    {readableStream: senderStreams.readable},
     86    [senderStreams.readable]);
     87 
     88  let expectedFrameData = null;
     89  let verifiedFrameData = false;
     90  let numVerifiedFrames = 0;
     91  const onmessagePromise = new Promise(resolve => {
     92    senderWorker.onmessage = t.step_func(message => {
     93      if (!(message.data instanceof RTCEncodedVideoFrame)) {
     94        // This is the first message sent from the Worker to the test.
     95        // It contains an object (not an RTCEncodedVideoFrame) with the same
     96        // fields as the RTCEncodedVideoFrame to be sent in follow-up messages.
     97        // These serve as expected values to validate that the
     98        // RTCEncodedVideoFrame is sent correctly back to the test in the next
     99        // message.
    100        expectedFrameData = message.data;
    101      } else {
    102        // This is the frame sent by the Worker after reading it from the
    103        // readable stream. The Worker sends it twice after sending the
    104        // verification message.
    105        assert_equals(message.data.type, expectedFrameData.type);
    106        assert_equals(message.data.timestamp, expectedFrameData.timestamp);
    107        assert_true(areArrayBuffersEqual(message.data.data, expectedFrameData.data));
    108        assert_equals(message.data.getMetadata().synchronizationSource, expectedFrameData.metadata.synchronizationSource);
    109        if (++numVerifiedFrames == 2)
    110          resolve();
    111      }
    112    });
    113  });
    114 
    115  exchangeIceCandidates(caller, callee);
    116  await exchangeOfferAnswer(caller, callee);
    117 
    118  return onmessagePromise;
    119 }, 'RTCRtpSender readable stream transferred to a Worker and the Worker sends an RTCEncodedVideoFrame back');
    120 
    121 promise_test(async t => {
    122  const caller = new RTCPeerConnection({encodedInsertableStreams:true});
    123  t.add_cleanup(() => caller.close());
    124  const callee = new RTCPeerConnection();
    125  t.add_cleanup(() => callee.close());
    126 
    127  const stream = await navigator.mediaDevices.getUserMedia({video:true});
    128  const videoTrack = stream.getVideoTracks()[0];
    129  t.add_cleanup(() => videoTrack.stop());
    130 
    131  const videoSender = caller.addTrack(videoTrack)
    132  const senderStreams = videoSender.createEncodedStreams();
    133 
    134  const senderWorker = new Worker('RTCPeerConnection-worker-transform.js')
    135  t.add_cleanup(() => senderWorker.terminate());
    136  senderWorker.postMessage(
    137    {
    138      readableStream: senderStreams.readable,
    139      writableStream: senderStreams.writable,
    140      insertError: true
    141    },
    142    [senderStreams.readable, senderStreams.writable]);
    143 
    144  const onmessagePromise = new Promise(resolve => {
    145    senderWorker.onmessage = t.step_func(message => {
    146      assert_false(message.data.success);
    147      assert_true(message.data.error instanceof TypeError);
    148      resolve();
    149    });
    150  });
    151 
    152  exchangeIceCandidates(caller, callee);
    153  await exchangeOfferAnswer(caller, callee);
    154 
    155  return onmessagePromise;
    156 }, 'Video RTCRtpSender insertable streams transferred to a worker, which tries to write an invalid frame');
    157 
    158 promise_test(async t => {
    159  const caller = new RTCPeerConnection({encodedInsertableStreams:true});
    160  t.add_cleanup(() => caller.close());
    161  const callee = new RTCPeerConnection();
    162  t.add_cleanup(() => callee.close());
    163 
    164  const stream = await navigator.mediaDevices.getUserMedia({audio:true});
    165  const audioTrack = stream.getAudioTracks()[0];
    166  t.add_cleanup(() => audioTrack.stop());
    167 
    168  const audioSender = caller.addTrack(audioTrack)
    169  const senderStreams = audioSender.createEncodedStreams();
    170 
    171  const senderWorker = new Worker('RTCPeerConnection-worker-transform.js')
    172  t.add_cleanup(() => senderWorker.terminate());
    173  senderWorker.postMessage(
    174    {
    175      readableStream: senderStreams.readable,
    176      writableStream: senderStreams.writable,
    177      insertError: true
    178    },
    179    [senderStreams.readable, senderStreams.writable]);
    180 
    181  const onmessagePromise = new Promise(resolve => {
    182    senderWorker.onmessage = t.step_func(message => {
    183      assert_false(message.data.success);
    184      assert_true(message.data.error instanceof TypeError);
    185      resolve();
    186    });
    187  });
    188 
    189  exchangeIceCandidates(caller, callee);
    190  await exchangeOfferAnswer(caller, callee);
    191 
    192  return onmessagePromise;
    193 }, 'Audio RTCRtpSender insertable streams transferred to a worker, which tries to write an invalid frame');
    194 
    195 </script>
    196 </body>
    197 </html>