tor-browser

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

MediaStreamTrackProcessor.worker.js (2499B)


      1 // META: title=MediaStreamTrackProcessor tests.
      2 
      3 importScripts("/resources/testharness.js");
      4 
      5 function makeVideoFrame(timestamp) {
      6  const canvas = new OffscreenCanvas(100, 100);
      7  const ctx = canvas.getContext('2d');
      8  return new VideoFrame(canvas, {timestamp});
      9 }
     10 
     11 promise_test(async t => {
     12  // The generator will be used as the source for the processor to
     13  // produce frames in a controlled manner.
     14  const generator = new VideoTrackGenerator();
     15  t.add_cleanup(() => generator.track.stop());
     16  // Use a larger maxBufferSize than the default to ensure no frames
     17  // will be dropped.
     18  const processor = new MediaStreamTrackProcessor({track: generator.track, maxBufferSize:10});
     19  const reader = processor.readable.getReader();
     20  const writer = generator.writable.getWriter();
     21 
     22  let numReads = 0;
     23  let resolve = null;
     24  const promise = new Promise(r => resolve = r);
     25 
     26  const numOperations = 4;
     27  // Issue reads without waiting for the frames to arrive.
     28  for (let i = 0; i < numOperations; i++) {
     29    reader.read().then(dv=> {
     30      dv.value.close();
     31      if (++numReads == numOperations)
     32        resolve();
     33    });
     34  }
     35 
     36  // Write video frames in different tasks to "slowly" settle the pending read
     37  // requests.
     38  for (let i = 0; i<numOperations; i++) {
     39     await writer.write(makeVideoFrame(i));
     40     await new Promise(r=>t.step_timeout(r,0));
     41  }
     42 
     43  return promise;
     44 
     45 }, "Tests that multiple read requests are eventually settled");
     46 
     47 promise_test(async t => {
     48  // The generator will be used as the source for the processor to
     49  // produce frames in a controlled manner.
     50  const generator = new VideoTrackGenerator();
     51  t.add_cleanup(() => generator.track.stop());
     52 
     53  generator.track.enabled = false;
     54  const processor = new MediaStreamTrackProcessor({track: generator.track, maxBufferSize:10});
     55  const reader = processor.readable.getReader();
     56  const writer = generator.writable.getWriter();
     57 
     58  await writer.write(makeVideoFrame(0));
     59  await writer.write(makeVideoFrame(1));
     60 
     61  let hasVideoFrame = false;
     62  const promise = reader.read().then(chunk => {
     63    hasVideoFrame = true;
     64    chunk.value.close();
     65  });
     66 
     67  await new Promise(resolve => t.step_timeout(resolve, 100));
     68  assert_false(hasVideoFrame, "test1");
     69 
     70  generator.track.enabled = true;
     71 
     72  await new Promise(resolve => t.step_timeout(resolve, 100));
     73  assert_false(hasVideoFrame, "test2");
     74 
     75  await writer.write(makeVideoFrame(2));
     76  await promise;
     77 }, "Tests that MediaStreamTrackProcess respects track.enabled");
     78 
     79 done();