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>