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