tor-browser

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

script-metadata-transform.https.html (13638B)


      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    </head>
     12    <body>
     13        <video id='video1' autoplay></video>
     14        <script src ='routines.js'></script>
     15        <script>
     16 async function waitForMessage(worker, data)
     17 {
     18    while (true) {
     19        const received = await new Promise(resolve => worker.onmessage = (event) => resolve(event.data));
     20        if (data === received)
     21            return;
     22    }
     23 }
     24 
     25 async function gatherMetadata(test, kind)
     26 {
     27    worker = new Worker('script-metadata-transform-worker.js');
     28    const data = await new Promise(resolve => worker.onmessage = (event) => resolve(event.data));
     29    assert_equals(data, 'registered');
     30 
     31    // Both audio and vido are needed at one time or another
     32    // so asking for both permissions
     33    await setMediaPermission();
     34    const localStream = await navigator.mediaDevices.getUserMedia({[kind]: true});
     35 
     36    let sender, receiver;
     37    const senderTransform = new RTCRtpScriptTransform(worker, {name:'sender'});
     38    const receiverTransform = new RTCRtpScriptTransform(worker, {name:'receiver'});
     39 
     40    await new Promise((resolve, reject) => {
     41        createConnections(test, (firstConnection) => {
     42            pc1 = firstConnection;
     43            sender = firstConnection.addTrack(localStream.getTracks()[0], localStream);
     44            sender.transform = senderTransform;
     45        }, (secondConnection) => {
     46            pc2 = secondConnection;
     47            secondConnection.ontrack = (trackEvent) => {
     48                receiver = trackEvent.receiver;
     49                receiver.transform = receiverTransform;
     50                resolve(trackEvent.streams[0]);
     51            };
     52        });
     53        test.step_timeout(() => reject('Test timed out'), 5000);
     54    });
     55 
     56    let senderBeforeWrite, senderAfterWrite, receiverBeforeWrite, receiverAfterWrite;
     57    while (true) {
     58        const {data} = await new Promise(r => worker.onmessage = r);
     59        if (data.name == 'sender') {
     60            senderBeforeWrite = data;
     61        } else if (data.name == 'receiver') {
     62            receiverBeforeWrite = data;
     63        } else if (data.name == 'sender after write') {
     64            senderAfterWrite = data;
     65        } else if (data.name == 'receiver after write') {
     66            receiverAfterWrite = data;
     67        }
     68        if (senderBeforeWrite &&
     69            senderAfterWrite &&
     70            receiverBeforeWrite &&
     71            receiverAfterWrite) {
     72            return {
     73              senderBeforeWrite,
     74              senderAfterWrite,
     75              receiverBeforeWrite,
     76              receiverAfterWrite
     77            };
     78        }
     79    }
     80 }
     81 
     82 promise_test(async (test) => {
     83    const data = await gatherMetadata(test, 'audio');
     84 
     85    assert_equals(typeof data.senderBeforeWrite.timestamp, 'number');
     86    assert_not_equals(data.senderBeforeWrite.timestamp, 0);
     87    assert_equals(data.senderBeforeWrite.timestamp,
     88      data.senderAfterWrite.timestamp,
     89      'timestamp matches (for sender before and after write)');
     90    assert_equals(data.senderBeforeWrite.timestamp,
     91      data.receiverBeforeWrite.timestamp,
     92      'timestamp matches (for sender and receiver)');
     93    assert_equals(data.receiverBeforeWrite.timestamp,
     94      data.receiverAfterWrite.timestamp,
     95      'timestamp matches (for receiver before and after write)');
     96 }, 'audio metadata: timestamp');
     97 
     98 promise_test(async (test) => {
     99    const data = await gatherMetadata(test, 'audio');
    100 
    101    assert_equals(typeof data.senderBeforeWrite.metadata.synchronizationSource, 'number');
    102    assert_not_equals(data.senderBeforeWrite.metadata.synchronizationSource, 0);
    103    assert_equals(data.senderBeforeWrite.metadata.synchronizationSource,
    104      data.senderAfterWrite.metadata.synchronizationSource,
    105      'ssrc matches (for sender before and after write)');
    106    assert_equals(data.senderBeforeWrite.metadata.synchronizationSource,
    107      data.receiverBeforeWrite.metadata.synchronizationSource,
    108      'ssrc matches (for sender and receiver)');
    109    assert_equals(data.senderBeforeWrite.metadata.synchronizationSource,
    110      data.receiverAfterWrite.metadata.synchronizationSource,
    111      'ssrc matches (for receiver before and after write)');
    112 }, 'audio metadata: synchronizationSource');
    113 
    114 promise_test(async (test) => {
    115    const data = await gatherMetadata(test, 'audio');
    116 
    117    assert_equals(typeof data.senderBeforeWrite.metadata.payloadType, 'number');
    118    assert_equals(data.senderBeforeWrite.metadata.payloadType,
    119      data.senderAfterWrite.metadata.payloadType,
    120      'payload type matches (for sender before and after write)');
    121    assert_equals(data.senderBeforeWrite.metadata.payloadType,
    122      data.receiverBeforeWrite.metadata.payloadType,
    123      'payload type matches (for sender and receiver)');
    124    assert_equals(data.senderBeforeWrite.metadata.payloadType,
    125      data.receiverAfterWrite.metadata.payloadType,
    126      'payload type matches (for receiver before and after write)');
    127 }, 'audio metadata: payloadType');
    128 
    129 promise_test(async (test) => {
    130    const data = await gatherMetadata(test, 'audio');
    131 
    132    assert_array_equals(data.senderBeforeWrite.metadata.contributingSources,
    133      data.senderAfterWrite.metadata.contributingSources,
    134      'csrcs are arrays, and match (for sender before and after write)');
    135    assert_array_equals(data.senderBeforeWrite.metadata.contributingSources,
    136      data.receiverBeforeWrite.metadata.contributingSources,
    137      'csrcs are arrays, and match');
    138    assert_array_equals(data.senderBeforeWrite.metadata.contributingSources,
    139      data.receiverAfterWrite.metadata.contributingSources,
    140      'csrcs are arrays, and match (for receiver before and after write)');
    141 }, 'audio metadata: contributingSources');
    142 
    143 promise_test(async (test) => {
    144    const data = await gatherMetadata(test, 'audio');
    145 
    146    assert_equals(typeof data.receiverBeforeWrite.metadata.sequenceNumber,
    147      'number');
    148    assert_equals(data.receiverBeforeWrite.metadata.sequenceNumber,
    149      data.receiverAfterWrite.metadata.sequenceNumber,
    150      'sequenceNumber matches (for receiver before and after write)');
    151    // spec says sequenceNumber exists only for incoming audio frames
    152    assert_equals(data.senderBeforeWrite.metadata.sequenceNumber, undefined);
    153    assert_equals(data.senderAfterWrite.metadata.sequenceNumber, undefined);
    154 }, 'audio metadata: sequenceNumber');
    155 
    156 promise_test(async (test) => {
    157    const data = await gatherMetadata(test, 'video');
    158 
    159    assert_equals(typeof data.senderBeforeWrite.timestamp, 'number');
    160    assert_equals(data.senderBeforeWrite.timestamp,
    161      data.senderAfterWrite.timestamp,
    162      'timestamp matches (for sender before and after write)');
    163    assert_equals(data.senderBeforeWrite.timestamp,
    164      data.receiverBeforeWrite.timestamp,
    165      'timestamp matches (for sender and receiver)');
    166    assert_equals(data.senderBeforeWrite.timestamp,
    167      data.receiverAfterWrite.timestamp,
    168      'timestamp matches (for receiver before and after write)');
    169 }, 'video metadata: timestamp');
    170 
    171 promise_test(async (test) => {
    172    const data = await gatherMetadata(test, 'video');
    173 
    174    assert_equals(typeof data.senderBeforeWrite.metadata.synchronizationSource,
    175      'number');
    176    assert_equals(data.senderBeforeWrite.metadata.synchronizationSource,
    177      data.senderAfterWrite.metadata.synchronizationSource,
    178      'ssrc matches (for sender before and after write)');
    179    assert_equals(data.senderBeforeWrite.metadata.synchronizationSource,
    180      data.receiverBeforeWrite.metadata.synchronizationSource,
    181      'ssrc matches (for sender and receiver)');
    182    assert_equals(data.senderBeforeWrite.metadata.synchronizationSource,
    183      data.receiverAfterWrite.metadata.synchronizationSource,
    184      'ssrc matches (for receiver before and after write)');
    185 }, 'video metadata: ssrc');
    186 
    187 promise_test(async (test) => {
    188    const data = await gatherMetadata(test, 'video');
    189 
    190    assert_array_equals(data.senderBeforeWrite.metadata.contributingSources,
    191      data.senderAfterWrite.metadata.contributingSources,
    192      'csrcs are arrays, and match (for sender before and after write)');
    193    assert_array_equals(data.senderBeforeWrite.metadata.contributingSources,
    194      data.receiverBeforeWrite.metadata.contributingSources,
    195      'csrcs are arrays, and match');
    196    assert_array_equals(data.senderBeforeWrite.metadata.contributingSources,
    197      data.receiverAfterWrite.metadata.contributingSources,
    198      'csrcs are arrays, and match (for receiver before and after write)');
    199 }, 'video metadata: csrcs');
    200 
    201 promise_test(async (test) => {
    202    const data = await gatherMetadata(test, 'video');
    203 
    204    assert_equals(typeof data.senderBeforeWrite.metadata.height, 'number');
    205    assert_equals(data.senderBeforeWrite.metadata.height,
    206      data.senderAfterWrite.metadata.height,
    207      'height matches (for sender before and after write)');
    208    assert_equals(data.senderBeforeWrite.metadata.height,
    209      data.receiverBeforeWrite.metadata.height,
    210      'height matches (for sender and receiver)');
    211    assert_equals(data.senderBeforeWrite.metadata.height,
    212      data.receiverAfterWrite.metadata.height,
    213      'height matches (for receiver before and after write)');
    214    assert_equals(typeof data.senderBeforeWrite.metadata.width, 'number');
    215    assert_equals(data.senderBeforeWrite.metadata.width,
    216      data.senderAfterWrite.metadata.width,
    217      'width matches (for sender before and after write)');
    218    assert_equals(data.senderBeforeWrite.metadata.width,
    219      data.receiverBeforeWrite.metadata.width,
    220      'width matches (for sender and receiver)');
    221    assert_equals(data.senderBeforeWrite.metadata.width,
    222      data.receiverAfterWrite.metadata.width,
    223      'width matches (for receiver before and after write)');
    224 }, 'video metadata: width and height');
    225 
    226 promise_test(async (test) => {
    227    const data = await gatherMetadata(test, 'video');
    228 
    229    assert_equals(typeof data.senderBeforeWrite.metadata.spatialIndex,
    230      'number');
    231    assert_equals(data.senderBeforeWrite.metadata.spatialIndex,
    232      data.senderAfterWrite.metadata.spatialIndex,
    233      'spatialIndex matches (for sender before and after write)');
    234    assert_equals(data.senderBeforeWrite.metadata.spatialIndex,
    235      data.receiverBeforeWrite.metadata.spatialIndex,
    236      'spatialIndex matches (for sender and receiver)');
    237    assert_equals(data.senderBeforeWrite.metadata.spatialIndex,
    238      data.receiverAfterWrite.metadata.spatialIndex,
    239      'spatialIndex matches (for receiver before and after write)');
    240    assert_equals(typeof data.senderBeforeWrite.metadata.temporalIndex,
    241      'number');
    242    assert_equals(data.senderBeforeWrite.metadata.temporalIndex,
    243      data.senderAfterWrite.metadata.temporalIndex,
    244      'temporalIndex matches (for sender before and after write)');
    245    assert_equals(data.senderBeforeWrite.metadata.temporalIndex,
    246      data.receiverBeforeWrite.metadata.temporalIndex,
    247      'temporalIndex matches (for sender and receiver)');
    248    assert_equals(data.senderBeforeWrite.metadata.temporalIndex,
    249      data.receiverAfterWrite.metadata.temporalIndex,
    250      'temporalIndex matches (for receiver before and after write)');
    251 }, 'video metadata: spatial and temporal index');
    252 
    253 promise_test(async (test) => {
    254    const data = await gatherMetadata(test, 'video');
    255 
    256    assert_array_equals(data.senderBeforeWrite.metadata.dependencies,
    257      data.senderAfterWrite.metadata.dependencies,
    258      'dependencies are arrays, and match (for sender before and after write)');
    259    assert_array_equals(data.senderBeforeWrite.metadata.dependencies,
    260      data.receiverBeforeWrite.metadata.dependencies,
    261      'dependencies are arrays, and match (for sender and receiver)');
    262    assert_array_equals(data.senderBeforeWrite.metadata.dependencies,
    263      data.receiverAfterWrite.metadata.dependencies,
    264      'dependencies are arrays, and match (for receiver before and after write)');
    265 }, 'video metadata: dependencies');
    266 
    267 promise_test(async (test) => {
    268    const data = await gatherMetadata(test, 'video');
    269 
    270    assert_equals(typeof data.senderBeforeWrite.metadata.frameId, 'number');
    271    assert_equals(data.senderBeforeWrite.metadata.frameId,
    272      data.senderAfterWrite.metadata.frameId,
    273      'frameId matches (for sender before and after write)');
    274 
    275    assert_true(data.senderBeforeWrite.metadata.frameId == data.receiverBeforeWrite.metadata.frameId ||
    276      data.receiverBeforeWrite.metadata.frameId == undefined,
    277      'frameId matches (for sender and receiver)');
    278    assert_equals(data.receiverBeforeWrite.metadata.frameId,
    279      data.receiverAfterWrite.metadata.frameId,
    280      'frameId matches (for receiver before and after write)');
    281 }, 'video metadata: frameId');
    282 
    283 promise_test(async (test) => {
    284    const data = await gatherMetadata(test, 'video');
    285 
    286    assert_equals(typeof data.senderBeforeWrite.type, 'string');
    287    assert_true(data.senderBeforeWrite.type == 'key' || data.senderBeforeWrite.type == 'delta');
    288    assert_equals(data.senderBeforeWrite.type,
    289      data.senderAfterWrite.type,
    290      'type matches (for sender before and after write)');
    291    assert_equals(data.senderBeforeWrite.type,
    292      data.receiverBeforeWrite.type,
    293      'type matches (for sender and receiver)');
    294    assert_equals(data.senderBeforeWrite.type,
    295      data.receiverAfterWrite.type,
    296      'type matches (for receiver before and after write)');
    297 }, 'video metadata: type');
    298 
    299        </script>
    300    </body>
    301 </html>