<!DOCTYPE html> <!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). --> <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>