| <!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> |