tor-browser

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

RTCRtpScriptTransform-encoded-transform.https.html (7784B)


      1 <!doctype html>
      2 <html>
      3 <head>
      4 <meta charset="utf-8">
      5 <meta name="timeout" content="long">
      6 <script src="/resources/testharness.js"></script>
      7 <script src="/resources/testharnessreport.js"></script>
      8 <script src=/resources/testdriver.js></script>
      9 <script src=/resources/testdriver-vendor.js></script>
     10 <script src='../mediacapture-streams/permission-helper.js'></script>
     11 <script src ="routines.js"></script>
     12 </head>
     13 <body>
     14 <video id="video" autoplay controls playsinline></video>
     15 <script>
     16 promise_test(async (test) => {
     17    const worker = new Worker('RTCRtpScriptTransform-encoded-transform-worker.js');
     18    let sender, receiver;
     19    const senderTransform = new RTCRtpScriptTransform(worker, {name:'sender'});
     20    const receiverTransform = new RTCRtpScriptTransform(worker, {name:'receiver'});
     21 
     22    const pc = new RTCPeerConnection();
     23    const transceiver1 = pc.addTransceiver("audio");
     24    const transceiver2 = pc.addTransceiver("audio");
     25 
     26    transceiver1.sender.transform = senderTransform;
     27    transceiver1.receiver.transform = receiverTransform;
     28 
     29    transceiver1.sender.transform = senderTransform;
     30    transceiver1.receiver.transform = receiverTransform;
     31 
     32    assert_throws_dom("InvalidStateError", () => transceiver2.sender.transform = senderTransform, "set a used transform 1");
     33    assert_throws_dom("InvalidStateError", () => transceiver2.receiver.transform = receiverTransform, "set a used transform 2");
     34 
     35    transceiver1.sender.transform = null;
     36    transceiver1.receiver.transform = null;
     37 
     38    assert_throws_dom("InvalidStateError", () => transceiver2.sender.transform = senderTransform, "set a used transform 3");
     39    assert_throws_dom("InvalidStateError", () => transceiver2.receiver.transform = receiverTransform, "set a used transform 4");
     40 }, "Once a transform has been attached, it cannot be reused elsewhere.");
     41 
     42 promise_test(async (test) => {
     43    const worker = new Worker('RTCRtpScriptTransform-encoded-transform-worker.js');
     44    const data = await new Promise(resolve => worker.onmessage = (event) => resolve(event.data));
     45    assert_equals(data, "registered");
     46 
     47    await setMediaPermission("granted", ["camera"]);
     48    const localStream = await navigator.mediaDevices.getUserMedia({video: true});
     49 
     50    let sender, receiver;
     51    const senderTransform = new RTCRtpScriptTransform(worker, {name:'sender'});
     52    const receiverTransform = new RTCRtpScriptTransform(worker, {name:'receiver'});
     53 
     54    const stream = await new Promise((resolve, reject) => {
     55        createConnections(test, (firstConnection) => {
     56            sender = firstConnection.addTrack(localStream.getVideoTracks()[0], localStream);
     57            sender.transform = senderTransform;
     58        }, (secondConnection) => {
     59            secondConnection.ontrack = (trackEvent) => {
     60                receiver = trackEvent.receiver;
     61                receiver.transform = receiverTransform;
     62                resolve(trackEvent.streams[0]);
     63            };
     64        });
     65    });
     66 
     67    video.srcObject = stream;
     68    const playingPromise = new Promise(r => video.onplaying = r);
     69    await video.play();
     70 
     71    const updatePromise = new Promise(resolve => worker.onmessage = (event) => resolve(event.data));
     72    assert_equals(await updatePromise, "got expected");
     73 
     74    await playingPromise;
     75 
     76 }, "Receiver and sender read, modifiy and write video frames.");
     77 
     78 promise_test(async (test) => {
     79    const worker = new Worker('RTCRtpScriptTransform-encoded-transform-worker.js');
     80    const data = await new Promise(resolve => worker.onmessage = (event) => resolve(event.data));
     81    assert_equals(data, "registered");
     82 
     83    await setMediaPermission("granted", ["microphone"]);
     84    const localStream = await navigator.mediaDevices.getUserMedia({audio: true});
     85    let sender, receiver;
     86    const senderTransform = new RTCRtpScriptTransform(worker, {name:'sender'});
     87    const receiverTransform = new RTCRtpScriptTransform(worker, {name:'receiver'});
     88 
     89    const stream = await new Promise((resolve, reject) => {
     90        createConnections(test, (firstConnection) => {
     91            sender = firstConnection.addTrack(localStream.getAudioTracks()[0], localStream);
     92            sender.transform = senderTransform;
     93        }, (secondConnection) => {
     94            secondConnection.ontrack = (trackEvent) => {
     95                receiver = trackEvent.receiver;
     96                receiver.transform = receiverTransform;
     97                resolve(trackEvent.streams[0]);
     98            };
     99        });
    100    });
    101 
    102    video.srcObject = stream;
    103    const playingPromise = new Promise(r => video.onplaying = r);
    104    await video.play();
    105 
    106    const updatePromise = new Promise(resolve => worker.onmessage = (event) => resolve(event.data));
    107    assert_equals(await updatePromise, "got expected");
    108 
    109    await playingPromise;
    110 
    111 }, "Receiver and sender read, modifiy and write audio frames.");
    112 
    113 promise_test(async (test) => {
    114    const worker = new Worker('RTCRtpScriptTransform-encoded-transform-no-write-worker.js');
    115    const data = await new Promise(resolve => worker.onmessage = (event) => resolve(event.data));
    116    assert_equals(data, "registered");
    117 
    118    await setMediaPermission("granted", ["camera"]);
    119    const localStream = await navigator.mediaDevices.getUserMedia({video: true});
    120 
    121    let sender, receiver;
    122    const senderTransform = new RTCRtpScriptTransform(worker, {name:'sender'});
    123    const receiverTransform = new RTCRtpScriptTransform(worker, {name:'receiver'});
    124 
    125    const stream = await new Promise((resolve, reject) => {
    126        createConnections(test, (firstConnection) => {
    127            sender = firstConnection.addTrack(localStream.getVideoTracks()[0], localStream);
    128            sender.transform = senderTransform;
    129        }, (secondConnection) => {
    130            secondConnection.ontrack = (trackEvent) => {
    131                receiver = trackEvent.receiver;
    132                receiver.transform = receiverTransform;
    133                resolve(trackEvent.streams[0]);
    134            };
    135        });
    136    });
    137 
    138    video.srcObject = stream;
    139 
    140    // As the receiver doesn't get any frames, it won't post a success
    141    // message back and it will cause an expected timeout.
    142    return new Promise((resolve, reject) => {
    143        worker.onmessage = (event) => {reject()};
    144        test.step_timeout(resolve, 500);
    145    });
    146 
    147 }, "Sender reads frames but doesn't write them back. Receiver doesn't receive any frames.");
    148 
    149 promise_test(async (test) => {
    150    const worker = new Worker('RTCRtpScriptTransform-encoded-transform-drop-frames-worker.js');
    151    const data = await new Promise(resolve => worker.onmessage = (event) => resolve(event.data));
    152    assert_equals(data, "registered");
    153 
    154    await setMediaPermission("granted", ["camera"]);
    155    const localStream = await navigator.mediaDevices.getUserMedia({video: true});
    156 
    157    let sender, receiver;
    158    const senderTransform = new RTCRtpScriptTransform(worker, {name:'sender'});
    159    const receiverTransform = new RTCRtpScriptTransform(worker, {name:'receiver'});
    160 
    161    const stream = await new Promise((resolve, reject) => {
    162        createConnections(test, (firstConnection) => {
    163            sender = firstConnection.addTrack(localStream.getVideoTracks()[0], localStream);
    164            sender.transform = senderTransform;
    165        }, (secondConnection) => {
    166            secondConnection.ontrack = (trackEvent) => {
    167                receiver = trackEvent.receiver;
    168                receiver.transform = receiverTransform;
    169                resolve(trackEvent.streams[0]);
    170            };
    171        });
    172    });
    173 
    174    video.srcObject = stream;
    175 
    176    const updatePromise = new Promise(resolve => worker.onmessage = (event) => resolve(event.data));
    177    assert_equals(await updatePromise, "got expected");
    178 
    179 }, "Sender skips some frames and only writes one back. Receiver only receives that frame.");
    180 
    181        </script>
    182    </body>
    183 </html>