tor-browser

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

mediasource-activesourcebuffers.html (13876B)


      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>Checks MediaSource.activeSourceBuffers and changes to selected/enabled track state</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          // Audio / Video files supported by the user agent under test
     14          var subType = MediaSourceUtil.getSubType(MediaSourceUtil.AUDIO_ONLY_TYPE);
     15          var manifestFilenameAudio = subType + "/test-a-128k-44100Hz-1ch-manifest.json";
     16          var manifestFilenameVideo = subType + "/test-v-128k-320x240-30fps-10kfr-manifest.json";
     17          var manifestFilenameAV = subType + "/test-av-384k-44100Hz-1ch-320x240-30fps-10kfr-manifest.json";
     18 
     19          mediasource_test(function(test, mediaElement, mediaSource)
     20          {
     21              mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
     22              MediaSourceUtil.fetchManifestAndData(test, manifestFilenameAudio, function (typeAudio, dataAudio)
     23              {
     24                  var sourceBuffer = mediaSource.addSourceBuffer(typeAudio);
     25                  assert_equals(mediaSource.sourceBuffers.length, 1,
     26                    "sourceBuffers list contains one SourceBuffer");
     27                  assert_equals(mediaSource.activeSourceBuffers.length, 0,
     28                    "activeSourceBuffers is empty to start with");
     29 
     30                  test.expectEvent(mediaSource.activeSourceBuffers, "addsourcebuffer");
     31                  test.expectEvent(mediaElement, "loadedmetadata");
     32                  sourceBuffer.appendBuffer(dataAudio);
     33 
     34                  test.waitForExpectedEvents(function()
     35                  {
     36                      assert_equals(mediaSource.activeSourceBuffers.length, 1,
     37                        "activeSourceBuffers updated when media element is loaded");
     38                      assert_equals(mediaSource.activeSourceBuffers[0], sourceBuffer,
     39                        "activeSourceBuffers contains sourceBuffer when media element is loaded");
     40                      test.done();
     41                  });
     42              });
     43          }, "SourceBuffer added to activeSourceBuffers list when its only audio track gets loaded (and thus becomes enabled).");
     44 
     45 
     46          mediasource_test(function(test, mediaElement, mediaSource)
     47          {
     48              mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
     49              MediaSourceUtil.fetchManifestAndData(test, manifestFilenameVideo, function (typeVideo, dataVideo)
     50              {
     51                  var sourceBuffer = mediaSource.addSourceBuffer(typeVideo);
     52                  assert_equals(mediaSource.sourceBuffers.length, 1,
     53                    "sourceBuffers list contains one SourceBuffer");
     54                  assert_equals(mediaSource.activeSourceBuffers.length, 0,
     55                    "activeSourceBuffers is empty to start with");
     56 
     57                  test.expectEvent(mediaSource.activeSourceBuffers, "addsourcebuffer");
     58                  test.expectEvent(mediaElement, "loadedmetadata");
     59                  sourceBuffer.appendBuffer(dataVideo);
     60 
     61                  test.waitForExpectedEvents(function()
     62                  {
     63                      assert_equals(mediaSource.activeSourceBuffers.length, 1,
     64                        "activeSourceBuffers updated when media element is loaded");
     65                      assert_equals(mediaSource.activeSourceBuffers[0], sourceBuffer,
     66                        "activeSourceBuffers contains sourceBuffer when media element is loaded");
     67                      test.done();
     68                  });
     69              });
     70          }, "SourceBuffer added to activeSourceBuffers list when its only video track gets loaded (and thus becomes selected).");
     71 
     72          function mediaSourceActiveSourceBufferOrderTest(addAudioFirst, appendAudioFirst)
     73          {
     74              mediasource_test(function(test, mediaElement, mediaSource)
     75              {
     76                  mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
     77                  MediaSourceUtil.fetchManifestAndData(test, manifestFilenameAudio, function (typeAudio, dataAudio)
     78                  {
     79                      MediaSourceUtil.fetchManifestAndData(test, manifestFilenameVideo, function (typeVideo, dataVideo)
     80                      {
     81                          var sourceBufferAudio, sourceBufferVideo, expectedFirstSB, expectedSecondSB;
     82                          if (addAudioFirst) {
     83                              expectedFirstSB = sourceBufferAudio = mediaSource.addSourceBuffer(typeAudio);
     84                              expectedSecondSB = sourceBufferVideo = mediaSource.addSourceBuffer(typeVideo);
     85                          } else {
     86                              expectedFirstSB = sourceBufferVideo = mediaSource.addSourceBuffer(typeVideo);
     87                              expectedSecondSB = sourceBufferAudio = mediaSource.addSourceBuffer(typeAudio);
     88                          }
     89 
     90                          assert_equals(mediaSource.activeSourceBuffers.length, 0,
     91                            "activeSourceBuffers is empty to start with");
     92                          assert_equals(mediaSource.sourceBuffers.length, 2,
     93                            "sourceBuffers list contains both SourceBuffers");
     94                          assert_equals(mediaSource.sourceBuffers[0], expectedFirstSB,
     95                            "first SourceBuffer matches expectation");
     96                          assert_equals(mediaSource.sourceBuffers[1], expectedSecondSB,
     97                            "second SourceBuffer matches expectation");
     98                          test.expectEvent(mediaSource.activeSourceBuffers, "addsourcebuffer");
     99                          test.expectEvent(mediaSource.activeSourceBuffers, "addsourcebuffer");
    100                          test.expectEvent(mediaElement, "loadedmetadata");
    101                          if (appendAudioFirst) {
    102                              sourceBufferAudio.appendBuffer(dataAudio);
    103                              sourceBufferVideo.appendBuffer(dataVideo);
    104                          } else {
    105                              sourceBufferVideo.appendBuffer(dataVideo);
    106                              sourceBufferAudio.appendBuffer(dataAudio);
    107                          }
    108 
    109                          test.waitForExpectedEvents(function()
    110                          {
    111                              assert_equals(mediaSource.activeSourceBuffers.length, 2,
    112                                "activeSourceBuffers list updated when tracks are loaded");
    113                              assert_equals(mediaSource.activeSourceBuffers[0], mediaSource.sourceBuffers[0],
    114                                "first active SourceBuffer matches first SourceBuffer");
    115                              assert_equals(mediaSource.activeSourceBuffers[1], mediaSource.sourceBuffers[1],
    116                                "second active SourceBuffer matches second SourceBuffer");
    117                              test.done();
    118                          });
    119                      });
    120                  });
    121              },
    122              "Active SourceBuffers must appear in the same order as they appear in the sourceBuffers attribute: " +
    123                (addAudioFirst ? "audio is first sourceBuffer" : "video is first sourceBuffer") + ", " +
    124                (appendAudioFirst ? "audio media appended first" : "video media appended first"));
    125          }
    126 
    127          mediaSourceActiveSourceBufferOrderTest(true, true);
    128          mediaSourceActiveSourceBufferOrderTest(true, false);
    129          mediaSourceActiveSourceBufferOrderTest(false, true);
    130          mediaSourceActiveSourceBufferOrderTest(false, false);
    131 
    132          mediasource_test(function(test, mediaElement, mediaSource)
    133          {
    134              mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
    135              MediaSourceUtil.fetchManifestAndData(test, manifestFilenameAudio, function (typeAudio, dataAudio)
    136              {
    137                  MediaSourceUtil.fetchManifestAndData(test, manifestFilenameVideo, function (typeVideo, dataVideo)
    138                  {
    139                      var sourceBufferAudio = mediaSource.addSourceBuffer(typeAudio);
    140                      var sourceBufferVideo = mediaSource.addSourceBuffer(typeVideo);
    141 
    142                      test.expectEvent(sourceBufferAudio.audioTracks, "addtrack");
    143                      test.expectEvent(sourceBufferVideo.videoTracks, "addtrack");
    144                      sourceBufferAudio.appendBuffer(dataAudio);
    145                      sourceBufferVideo.appendBuffer(dataVideo);
    146 
    147                      test.waitForExpectedEvents(function()
    148                      {
    149                          assert_equals(mediaSource.activeSourceBuffers.length, 2,
    150                            "activeSourceBuffers list updated when tracks are loaded");
    151                          assert_equals(sourceBufferAudio.audioTracks.length, 1,
    152                            "audio track list contains loaded audio track");
    153                          assert_equals(sourceBufferVideo.videoTracks.length, 1,
    154                            "video track list contains loaded video track");
    155 
    156                          test.expectEvent(mediaSource.activeSourceBuffers, "removesourcebuffer");
    157                          sourceBufferAudio.audioTracks[0].enabled = false;
    158                      });
    159 
    160                      test.waitForExpectedEvents(function()
    161                      {
    162                          assert_equals(mediaSource.activeSourceBuffers.length, 1,
    163                            "audio source buffer no longer in the activeSourceBuffers list");
    164                          assert_equals(mediaSource.activeSourceBuffers[0], sourceBufferVideo,
    165                            "activeSourceBuffers list only contains the video SourceBuffer");
    166 
    167                          test.expectEvent(mediaSource.activeSourceBuffers, "addsourcebuffer");
    168                          test.expectEvent(mediaSource.activeSourceBuffers, "removesourcebuffer");
    169                          sourceBufferAudio.audioTracks[0].enabled = true;
    170                          sourceBufferVideo.videoTracks[0].selected = false;
    171                      });
    172 
    173                      test.waitForExpectedEvents(function()
    174                      {
    175                          assert_equals(mediaSource.activeSourceBuffers.length, 1,
    176                            "video source buffer no longer in the activeSourceBuffers list");
    177                          assert_equals(mediaSource.activeSourceBuffers[0], sourceBufferAudio,
    178                            "activeSourceBuffers list only contains the audio SourceBuffer");
    179                          test.done();
    180                      });
    181                  });
    182              });
    183          }, "Active SourceBuffers list reflects changes to selected audio/video tracks associated with separate SourceBuffers.");
    184 
    185 
    186          mediasource_test(function(test, mediaElement, mediaSource)
    187          {
    188              mediaElement.addEventListener("error", test.unreached_func("Unexpected event 'error'"));
    189              MediaSourceUtil.fetchManifestAndData(test, manifestFilenameAV, function (typeAV, dataAV)
    190              {
    191                  var sourceBuffer = mediaSource.addSourceBuffer(typeAV);
    192 
    193                  test.expectEvent(sourceBuffer.audioTracks, "addtrack");
    194                  test.expectEvent(sourceBuffer.videoTracks, "addtrack");
    195                  sourceBuffer.appendBuffer(dataAV);
    196 
    197                  test.waitForExpectedEvents(function()
    198                  {
    199                      assert_equals(mediaSource.activeSourceBuffers.length, 1,
    200                        "activeSourceBuffers list updated when tracks are loaded");
    201                      assert_equals(sourceBuffer.audioTracks.length, 1,
    202                        "audio track list contains loaded audio track");
    203                      assert_equals(sourceBuffer.videoTracks.length, 1,
    204                        "video track list contains loaded video track");
    205 
    206                      mediaSource.activeSourceBuffers.addEventListener("removesourcebuffer", test.unreached_func(
    207                        "Unexpected removal from activeSourceBuffers list"));
    208                      mediaSource.activeSourceBuffers.addEventListener("addsourcebuffer", test.unreached_func(
    209                        "Unexpected insertion in activeSourceBuffers list"));
    210 
    211                      // Changes should only trigger events at the
    212                      // AudioTrack/VideoTrack instance
    213                      test.expectEvent(sourceBuffer.audioTracks, "change");
    214                      sourceBuffer.audioTracks[0].enabled = false;
    215                  });
    216 
    217                  test.waitForExpectedEvents(function()
    218                  {
    219                      assert_equals(mediaSource.activeSourceBuffers.length, 1,
    220                        "activeSourceBuffers list unchanged");
    221 
    222                      test.expectEvent(sourceBuffer.videoTracks, "change");
    223                      sourceBuffer.audioTracks[0].enabled = true;
    224                      sourceBuffer.videoTracks[0].selected = false;
    225                  });
    226 
    227                  test.waitForExpectedEvents(function()
    228                  {
    229                      assert_equals(mediaSource.activeSourceBuffers.length, 1,
    230                        "activeSourceBuffers list unchanged");
    231                      test.done();
    232                  });
    233              });
    234          }, "Active SourceBuffers list ignores changes to selected audio/video tracks " +
    235            "that do not affect the activation of the SourceBuffer.");
    236        </script>
    237    </body>
    238 </html>