tor-browser

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

mediasource-multiple-attach.html (5245B)


      1 <!DOCTYPE html>
      2 <!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
      3 <html>
      4    <head>
      5        <title>Test Attaching a MediaSource to multiple HTMLMediaElements.</title>
      6        <script src="/resources/testharness.js"></script>
      7        <script src="/resources/testharnessreport.js"></script>
      8        <script src="mediasource-util.js"></script>
      9    </head>
     10    <body>
     11        <div id="log"></div>
     12        <script>
     13          function twoMediaElementTest(testFunction, description)
     14          {
     15              media_test(function(test)
     16              {
     17                  var firstMediaTag = document.createElement('video');
     18                  var secondMediaTag = document.createElement('video');
     19                  document.body.appendChild(firstMediaTag);
     20                  document.body.appendChild(secondMediaTag);
     21 
     22                  // Overload done() so that elements added to the document can be
     23                  // removed.
     24                  var removeMediaElements = true;
     25                  var oldTestDone = test.done.bind(test);
     26                  test.done = function()
     27                  {
     28                      if (removeMediaElements) {
     29                          document.body.removeChild(secondMediaTag);
     30                          document.body.removeChild(firstMediaTag);
     31                          removeMediaElements = false;
     32                      }
     33                      oldTestDone();
     34                  };
     35 
     36                  testFunction(test, firstMediaTag, secondMediaTag);
     37              }, description);
     38          }
     39 
     40          twoMediaElementTest(function(test, firstMediaTag, secondMediaTag)
     41          {
     42              // When attachment of mediaSource to two MediaElements is done
     43              // without an intervening stable state, exactly one of the two
     44              // MediaElements should successfully attach, and the other one
     45              // should get error event due to mediaSource already in 'open'
     46              // readyState.
     47              var mediaSource = new MediaSource();
     48              var mediaSourceURL = URL.createObjectURL(mediaSource);
     49              var gotSourceOpen = false;
     50              var gotError = false;
     51              var doneIfFinished = test.step_func(function()
     52              {
     53                  if (gotSourceOpen && gotError)
     54                      test.done();
     55              });
     56              var errorHandler = test.step_func(function(e)
     57              {
     58                  firstMediaTag.removeEventListener('error', errorHandler);
     59                  secondMediaTag.removeEventListener('error', errorHandler);
     60 
     61                  var eventTarget = e.target;
     62                  var otherTarget;
     63                  if (eventTarget == firstMediaTag) {
     64                      otherTarget = secondMediaTag;
     65                  } else {
     66                      assert_equals(eventTarget, secondMediaTag, 'Error target check');
     67                      otherTarget = firstMediaTag;
     68                  }
     69 
     70                  assert_true(eventTarget.error != null, 'Error state on one tag');
     71                  assert_equals(eventTarget.error.code, MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED, 'Expected error code');
     72                  assert_equals(otherTarget.error, null, 'No error on other tag');
     73 
     74                  assert_equals(eventTarget.networkState, HTMLMediaElement.NETWORK_NO_SOURCE,
     75                                'Tag with error state networkState');
     76                  assert_equals(otherTarget.networkState, HTMLMediaElement.NETWORK_LOADING,
     77                                'Tag without error state networkState');
     78 
     79                  gotError = true;
     80                  doneIfFinished();
     81              });
     82 
     83              test.expectEvent(mediaSource, 'sourceopen', 'An attachment succeeded');
     84              firstMediaTag.addEventListener('error', errorHandler);
     85              secondMediaTag.addEventListener('error', errorHandler);
     86 
     87              firstMediaTag.src = mediaSourceURL;
     88              secondMediaTag.src = mediaSourceURL;
     89 
     90              test.waitForExpectedEvents(function()
     91              {
     92                  assert_equals(mediaSource.readyState, 'open', 'Source is opened');
     93                  gotSourceOpen = true;
     94                  doneIfFinished();
     95              });
     96          }, 'Test exactly one succeeds when two MediaElements attach to same MediaSource');
     97 
     98          mediasource_test(function(test, mediaElement, mediaSource) {
     99              assert_equals(mediaSource.readyState, 'open', 'Source open');
    100              // Set the tag's src attribute.  This should close mediaSource,
    101              // reattach it to the tag, and initiate source reopening.
    102              test.expectEvent(mediaSource, 'sourceopen', 'Source attached again');
    103              mediaElement.src = URL.createObjectURL(mediaSource);
    104              assert_equals(mediaSource.readyState, 'closed', 'Source closed');
    105 
    106              test.waitForExpectedEvents(function()
    107              {
    108                  assert_equals(mediaSource.readyState, 'open', 'Source reopened');
    109                  test.done();
    110              });
    111          }, 'Test that MediaSource can reattach if closed first');
    112        </script>
    113    </body>
    114 </html>