| <!DOCTYPE html> |
| <html> |
| <head> |
| <title>Test Attaching a MediaSource to multiple HTMLMediaElements.</title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="mediasource-util.js"></script> |
| </head> |
| <body> |
| <div id="log"></div> |
| <script> |
| function twoMediaElementTest(testFunction, description) |
| { |
| media_test(function(test) |
| { |
| var firstMediaTag = document.createElement('video'); |
| var secondMediaTag = document.createElement('video'); |
| document.body.appendChild(firstMediaTag); |
| document.body.appendChild(secondMediaTag); |
| |
| // Overload done() so that elements added to the document can be |
| // removed. |
| var removeMediaElements = true; |
| var oldTestDone = test.done.bind(test); |
| test.done = function() |
| { |
| if (removeMediaElements) { |
| document.body.removeChild(secondMediaTag); |
| document.body.removeChild(firstMediaTag); |
| removeMediaElements = false; |
| } |
| oldTestDone(); |
| }; |
| |
| testFunction(test, firstMediaTag, secondMediaTag); |
| }, description); |
| } |
| |
| twoMediaElementTest(function(test, firstMediaTag, secondMediaTag) |
| { |
| // When attachment of mediaSource to two MediaElements is done |
| // without an intervening stable state, exactly one of the two |
| // MediaElements should successfully attach, and the other one |
| // should get error event due to mediaSource already in 'open' |
| // readyState. |
| var mediaSource = new MediaSource(); |
| var mediaSourceURL = URL.createObjectURL(mediaSource); |
| var gotSourceOpen = false; |
| var gotError = false; |
| var doneIfFinished = test.step_func(function() |
| { |
| if (gotSourceOpen && gotError) |
| test.done(); |
| }); |
| var errorHandler = test.step_func(function(e) |
| { |
| firstMediaTag.removeEventListener('error', errorHandler); |
| secondMediaTag.removeEventListener('error', errorHandler); |
| |
| var eventTarget = e.target; |
| var otherTarget; |
| if (eventTarget == firstMediaTag) { |
| otherTarget = secondMediaTag; |
| } else { |
| assert_equals(eventTarget, secondMediaTag, 'Error target check'); |
| otherTarget = firstMediaTag; |
| } |
| |
| assert_true(eventTarget.error != null, 'Error state on one tag'); |
| assert_equals(eventTarget.error.code, MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED, 'Expected error code'); |
| assert_equals(otherTarget.error, null, 'No error on other tag'); |
| |
| assert_equals(eventTarget.networkState, HTMLMediaElement.NETWORK_NO_SOURCE, |
| 'Tag with error state networkState'); |
| assert_equals(otherTarget.networkState, HTMLMediaElement.NETWORK_LOADING, |
| 'Tag without error state networkState'); |
| |
| gotError = true; |
| doneIfFinished(); |
| }); |
| |
| test.expectEvent(mediaSource, 'sourceopen', 'An attachment succeeded'); |
| firstMediaTag.addEventListener('error', errorHandler); |
| secondMediaTag.addEventListener('error', errorHandler); |
| |
| firstMediaTag.src = mediaSourceURL; |
| secondMediaTag.src = mediaSourceURL; |
| |
| test.waitForExpectedEvents(function() |
| { |
| assert_equals(mediaSource.readyState, 'open', 'Source is opened'); |
| gotSourceOpen = true; |
| doneIfFinished(); |
| }); |
| }, 'Test exactly one succeeds when two MediaElements attach to same MediaSource'); |
| |
| mediasource_test(function(test, mediaElement, mediaSource) { |
| assert_equals(mediaSource.readyState, 'open', 'Source open'); |
| // Set the tag's src attribute. This should close mediaSource, |
| // reattach it to the tag, and initiate source reopening. |
| test.expectEvent(mediaSource, 'sourceopen', 'Source attached again'); |
| mediaElement.src = URL.createObjectURL(mediaSource); |
| assert_equals(mediaSource.readyState, 'closed', 'Source closed'); |
| |
| test.waitForExpectedEvents(function() |
| { |
| assert_equals(mediaSource.readyState, 'open', 'Source reopened'); |
| test.done(); |
| }); |
| }, 'Test that MediaSource can reattach if closed first'); |
| </script> |
| </body> |
| </html> |