Bug 1286810: [MSE] P5. Update webref MSE tests according to updated spec. r?jgraham draft
authorJean-Yves Avenard <jyavenard@mozilla.com>
Sat, 16 Jul 2016 10:45:28 +1000
changeset 388823 8d86667bb87742c0890e01cdc5791da3ad8a2d6b
parent 388822 a648521e6509d8d545c54ea7c66f1640a2877373
child 388824 19aff9dfeb099aa5f3cd382ffb54f71f9ca75f6d
push id23241
push userbmo:jyavenard@mozilla.com
push dateMon, 18 Jul 2016 02:31:08 +0000
reviewersjgraham
bugs1286810
milestone50.0a1
Bug 1286810: [MSE] P5. Update webref MSE tests according to updated spec. r?jgraham See w3c/MSE Issue 19, 20 & 26. Changing the duration now can never call the range removal algorithm. An explicit call to remove must be used for range removal. This spec change performed the following: - Require remove() for all Range Removals - Error on Duration Changes that need remove first - Error on abort() during Range Removals MozReview-Commit-ID: 1Xy8hi0tr7Q
testing/web-platform/tests/media-source/mediasource-config-changes.js
testing/web-platform/tests/media-source/mediasource-duration.html
testing/web-platform/tests/media-source/mediasource-getvideoplaybackquality.html
testing/web-platform/tests/media-source/mediasource-play.html
testing/web-platform/tests/media-source/mediasource-remove.html
--- a/testing/web-platform/tests/media-source/mediasource-config-changes.js
+++ b/testing/web-platform/tests/media-source/mediasource-config-changes.js
@@ -59,25 +59,35 @@ function mediaSourceConfigChangeTest(dir
                     sourceBuffer.timestampOffset = 1.5;
                     appendBuffer(test, sourceBuffer, dataB);
                     ++expectedResizeEventCount;
                 });
 
                 test.waitForExpectedEvents(function()
                 {
                     assert_false(sourceBuffer.updating, "updating");
+
+                    // Truncate the presentation to a duration of 2 seconds.
+                    sourceBuffer.remove(2, Infinity);
+
+                    assert_true(sourceBuffer.updating, "updating");
+                    test.expectEvent(sourceBuffer, 'updatestart', 'sourceBuffer');
+                    test.expectEvent(sourceBuffer, 'update', 'sourceBuffer');
+                    test.expectEvent(sourceBuffer, 'updateend', 'sourceBuffer');
+                });
+
+                test.waitForExpectedEvents(function()
+                {
+                    assert_false(sourceBuffer.updating, "updating");
                     assert_greater_than(mediaSource.duration, 2, "duration");
 
                     // Truncate the presentation to a duration of 2 seconds.
                     mediaSource.duration = 2;
 
-                    assert_true(sourceBuffer.updating, "updating");
-                    test.expectEvent(sourceBuffer, 'updatestart', 'sourceBuffer');
-                    test.expectEvent(sourceBuffer, 'update', 'sourceBuffer');
-                    test.expectEvent(sourceBuffer, 'updateend', 'sourceBuffer');
+                    test.expectEvent(mediaElement, "durationchange");
                 });
 
                 test.waitForExpectedEvents(function()
                 {
                     assert_false(sourceBuffer.updating, "updating");
 
                     mediaSource.endOfStream();
 
--- a/testing/web-platform/tests/media-source/mediasource-duration.html
+++ b/testing/web-platform/tests/media-source/mediasource-duration.html
@@ -36,31 +36,39 @@
                       test.expectEvent(mediaElement, 'seeked', 'seeked to seekTo');
                       mediaElement.currentTime = seekTo;
                       assert_true(mediaElement.seeking, 'mediaElement.seeking (to seekTo)');
                   });
 
                   test.waitForExpectedEvents(function()
                   {
                       assert_greater_than_equal(mediaElement.currentTime, seekTo, 'Playback time has reached seekTo');
+                      assert_false(mediaElement.seeking, 'mediaElement.seeking after seeked to seekTo');
+
+                      assert_false(sourceBuffer.updating, 'sourceBuffer.updating');
+
+                      sourceBuffer.remove(truncatedDuration, Infinity);;
+
+                      assert_true(sourceBuffer.updating, 'sourceBuffer.updating');
+                      test.expectEvent(sourceBuffer, 'updatestart', 'sourceBuffer');
+                      test.expectEvent(sourceBuffer, 'update', 'sourceBuffer');
+                      test.expectEvent(sourceBuffer, 'updateend', 'sourceBuffer');
+                  });
+
+                  test.waitForExpectedEvents(function()
+                  {
+                      assert_greater_than_equal(mediaElement.currentTime, seekTo, 'Playback time has reached seekTo');
                       assert_equals(mediaElement.duration, fullDuration, 'mediaElement fullDuration after seekTo');
                       assert_equals(mediaSource.duration, fullDuration, 'mediaSource fullDuration after seekTo');
-                      assert_false(mediaElement.seeking, 'mediaElement.seeking after seeked to seekTo');
-
                       test.expectEvent(mediaElement, 'seeking', 'Seeking to truncated duration');
 
                       assert_false(sourceBuffer.updating, 'sourceBuffer.updating');
 
                       mediaSource.duration = truncatedDuration;
 
-                      assert_true(sourceBuffer.updating, 'sourceBuffer.updating');
-                      test.expectEvent(sourceBuffer, 'updatestart', 'sourceBuffer');
-                      test.expectEvent(sourceBuffer, 'update', 'sourceBuffer');
-                      test.expectEvent(sourceBuffer, 'updateend', 'sourceBuffer');
-
                       assert_true(mediaElement.seeking, 'Seeking after setting truncatedDuration');
                   });
 
                   test.waitForExpectedEvents(function()
                   {
                       assert_equals(mediaElement.currentTime, truncatedDuration,
                                     'Playback time is truncatedDuration while seeking');
                       assert_true(mediaElement.seeking, 'mediaElement.seeking while seeking to truncatedDuration');
@@ -163,46 +171,62 @@
               sourceBuffer.appendBuffer(mediaData);
 
               test.waitForExpectedEvents(function()
               {
                   assert_equals(mediaElement.duration, fullDuration, 'mediaElement fullDuration');
                   assert_equals(mediaSource.duration, fullDuration, 'mediaSource fullDuration');
                   assert_less_than(mediaElement.currentTime, newDuration / 2, 'mediaElement currentTime');
 
-                  // Media load also fires 'durationchange' event, so only start counting them now.
-                  mediaElement.addEventListener('durationchange', durationchangeEventHandler);
-
                   assert_false(sourceBuffer.updating, "updating");
 
                   // Truncate duration. This should result in one 'durationchange' fired.
-                  mediaSource.duration = newDuration;
+                  sourceBuffer.remove(newDuration, Infinity);
 
                   assert_true(sourceBuffer.updating, "updating");
                   test.expectEvent(sourceBuffer, 'updatestart', 'sourceBuffer');
                   test.expectEvent(sourceBuffer, 'update', 'sourceBuffer');
                   test.expectEvent(sourceBuffer, 'updateend', 'sourceBuffer');
               });
 
               test.waitForExpectedEvents(function()
               {
+                  assert_equals(mediaElement.duration, fullDuration, 'mediaElement fullDuration');
+                  assert_equals(mediaSource.duration, fullDuration, 'mediaSource fullDuration');
+                  assert_less_than(mediaElement.currentTime, newDuration / 2, 'mediaElement currentTime');
+
+                  // Media load also fires 'durationchange' event, so only start counting them now.
+                  mediaElement.addEventListener('durationchange', durationchangeEventHandler);
+
                   assert_false(sourceBuffer.updating, "updating");
 
+                  // Truncate duration. This should result in one 'durationchange' fired.
+                  mediaSource.duration = newDuration;
+              });
+
+              test.waitForExpectedEvents(function()
+              {
+                  assert_false(sourceBuffer.updating, "updating");
+
+                  // Final duration may be greater than originally set as per MSE's 2.4.6 Duration change
+                  // Adjust newDuration accordingly.
+                  assert_true(newDuration <= mediaSource.duration, 'adjusted duration');
+                  newDuration = mediaSource.duration;
+
                   // Set duration again to make sure it does not trigger another 'durationchange' event.
                   mediaSource.duration = newDuration;
 
                   // Mark endOfStream so that playback can reach 'ended' at the new duration.
                   test.expectEvent(mediaSource, 'sourceended', 'endOfStream acknowledged');
                   mediaSource.endOfStream();
 
-                  // endOfStream can change duration downwards slightly.
+                  // endOfStream can change duration slightly.
                   // Allow for one more 'durationchange' event only in this case.
                   var currentDuration = mediaSource.duration;
                   if (currentDuration != newDuration) {
-                      assert_true(currentDuration > 0 && currentDuration < newDuration, 'adjusted duration');
                       newDuration = currentDuration;
                       ++expectedDurationChangeEventCount;
                   }
 
                   // Allow media to play to end while counting 'durationchange' events.
                   test.expectEvent(mediaElement, 'ended', 'Playback ended');
                   test.waitForExpectedEvents(function()
                   {
--- a/testing/web-platform/tests/media-source/mediasource-getvideoplaybackquality.html
+++ b/testing/web-platform/tests/media-source/mediasource-getvideoplaybackquality.html
@@ -38,28 +38,37 @@
               test.expectEvent(sourceBuffer, 'updatestart', 'sourceBuffer');
               test.expectEvent(sourceBuffer, 'update', 'sourceBuffer');
               test.expectEvent(sourceBuffer, 'updateend', 'sourceBuffer');
               sourceBuffer.appendBuffer(mediaData);
 
               test.waitForExpectedEvents(function()
               {
                   assert_false(sourceBuffer.updating, "updating");
-                  assert_greater_than(mediaSource.duration, 1, "duration");
 
-                  mediaSource.duration = 1;
+                  sourceBuffer.remove(1, Infinity);
 
                   assert_true(sourceBuffer.updating, "updating");
                   test.expectEvent(sourceBuffer, 'updatestart', 'sourceBuffer');
                   test.expectEvent(sourceBuffer, 'update', 'sourceBuffer');
                   test.expectEvent(sourceBuffer, 'updateend', 'sourceBuffer');
               });
 
               test.waitForExpectedEvents(function()
               {
+                  assert_false(sourceBuffer.updating, "updating");
+                  assert_greater_than(mediaSource.duration, 1, "duration");
+
+                  mediaSource.duration = 1;
+
+                  test.expectEvent(mediaElement, "durationchange");
+              });
+
+              test.waitForExpectedEvents(function()
+              {
                   mediaSource.endOfStream();
                   mediaElement.play();
                   test.expectEvent(mediaElement, 'ended', 'mediaElement');
               });
 
               test.waitForExpectedEvents(function()
               {
                   assert_greater_than(timeUpdateCount, 2, "timeUpdateCount");
--- a/testing/web-platform/tests/media-source/mediasource-play.html
+++ b/testing/web-platform/tests/media-source/mediasource-play.html
@@ -18,27 +18,36 @@
               test.expectEvent(sourceBuffer, 'update', 'sourceBuffer');
               test.expectEvent(sourceBuffer, 'updateend', 'sourceBuffer');
 
               sourceBuffer.appendBuffer(mediaData);
 
               test.waitForExpectedEvents(function()
               {
                   assert_false(sourceBuffer.updating, "updating");
-                  assert_greater_than(mediaSource.duration, 1, "duration");
 
-                  mediaSource.duration = 1;
+                  sourceBuffer.remove(1, Infinity);
 
                   assert_true(sourceBuffer.updating, "updating");
                   test.expectEvent(sourceBuffer, 'updatestart', 'sourceBuffer');
                   test.expectEvent(sourceBuffer, 'update', 'sourceBuffer');
                   test.expectEvent(sourceBuffer, 'updateend', 'sourceBuffer');
               });
 
               test.waitForExpectedEvents(function()
               {
+                  assert_false(sourceBuffer.updating, "updating");
+                  assert_greater_than(mediaSource.duration, 1, "duration");
+
+                  mediaSource.duration = 1;
+
+                  test.expectEvent(mediaElement, "durationchange");
+              });
+
+              test.waitForExpectedEvents(function()
+              {
                   mediaSource.endOfStream();
                   mediaElement.play();
               });
           }, "Test normal playback case with MediaSource API");
         </script>
     </body>
 </html>
--- a/testing/web-platform/tests/media-source/mediasource-remove.html
+++ b/testing/web-platform/tests/media-source/mediasource-remove.html
@@ -131,25 +131,28 @@
 
           mediasource_test(function(test, mediaElement, mediaSource)
           {
               var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_VIDEO_TYPE);
 
               mediaSource.duration = 10;
 
               test.expectEvent(sourceBuffer, "updatestart");
-              test.expectEvent(sourceBuffer, "abort");
+              test.expectEvent(sourceBuffer, "update");
               test.expectEvent(sourceBuffer, "updateend");
               sourceBuffer.remove(1, 2);
 
               assert_true(sourceBuffer.updating, "updating");
 
-              sourceBuffer.abort();
+              assert_throws("InvalidStateError", function()
+              {
+                  sourceBuffer.abort();
+              }, "abort");
 
-              assert_false(sourceBuffer.updating, "updating");
+              assert_true(sourceBuffer.updating, "updating");
 
               test.waitForExpectedEvents(function()
               {
                   test.done();
               });
           }, "Test aborting a remove operation.");
 
           mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)