tor-browser

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

video-srcObject-change.html (2823B)


      1 <!DOCTYPE html>
      2 <meta charset="utf-8" />
      3 <script src="/resources/testharness.js"></script>
      4 <script src="/resources/testharnessreport.js"></script>
      5 <script src="/resources/testdriver.js"></script>
      6 <script src="/resources/testdriver-vendor.js"></script>
      7 <script src="/media-source/dedicated-worker/mediasource-message-util.js"></script>
      8 <script src="/soft-navigation-heuristics/resources/soft-navigation-test-helper.js"></script>
      9 
     10 <button id="navigateButton">Click here!</button>
     11 <video id="testVideo" style="height:500px;width:500px"></img>
     12 
     13 <script>
     14  // Based on /media-source/dedicated-worker/mediasource-worker-play.html.
     15  promise_test(async t => {
     16    // Fail fast if MSE-in-Workers is not supported.
     17    assert_implements(
     18        MediaSource.hasOwnProperty('canConstructInDedicatedWorker'),
     19        'MediaSource hasOwnProperty \'canConstructInDedicatedWorker\'');
     20    assert_implements(
     21        MediaSource.canConstructInDedicatedWorker,
     22        'MediaSource.canConstructInDedicatedWorker');
     23 
     24    t.add_cleanup(() => { testVideo.srcObject = null; });
     25 
     26    const url = '/video-srcobject-change-1';
     27    let worker;
     28 
     29    // Returns a promise that will be resolved with the MediaSource handle for
     30    // the video.
     31    function initVideoWorker() {
     32      return new Promise(resolve => {
     33        worker = new Worker('/media-source/dedicated-worker/mediasource-worker-play.js');
     34        worker.onerror = t.unreached_func('worker error');
     35        worker.onmessage = t.step_func(e => {
     36          let subject = e.data.subject;
     37          assert_true(subject != undefined, 'message must have a subject field');
     38          switch (subject) {
     39            case messageSubject.ERROR:
     40              assert_unreached('Worker error: ' + e.data.info);
     41              break;
     42            case messageSubject.HANDLE:
     43              resolve(e.data.info);
     44              break;
     45            default:
     46              assert_unreached('Unexpected message subject: ' + subject);
     47          }
     48        });
     49      });
     50    }
     51 
     52    navigateButton.addEventListener("click", async () => {
     53      history.pushState({}, '', url);
     54      let handle = await initVideoWorker();
     55      testVideo.srcObject = handle;
     56      testVideo.play();
     57    }, {once: true});
     58 
     59    const softNavPromise =
     60      SoftNavigationTestHelper.getPerformanceEntries("soft-navigation");
     61 
     62    if (test_driver) {
     63      test_driver.click(navigateButton);
     64    }
     65 
     66    const helper = new SoftNavigationTestHelper(t);
     67    const entries = await helper.withTimeoutMessage(
     68        softNavPromise, "Soft navigation entry never arrived.", 5000);
     69    assert_equals(entries.length, 1, 'Expected exactly one soft navigation.');
     70    assert_true(
     71        entries[0].name.endsWith(url),
     72        'Unexpected Soft Navigation URL.');
     73  }, 'Soft Navigation Detection supports HTMLVideoElment.srcObject');
     74 </script>