<!doctype html>
<html>
<head>
<title>Assigning mediastream to a video element</title>
<link rel="author" title="Dominique Hazael-Massieux" href="mailto:dom@w3.org"/>
<link rel="help" href="http://dev.w3.org/2011/webrtc/editor/getusermedia.html#navigatorusermedia">
</head>
<body>
<p class="instructions">When prompted, accept to share your video stream.</p>
<h1 class="instructions">Description</h1>
<p class="instructions">This test checks that the MediaStream object returned by
the success callback in getUserMedia can be properly assigned to a video element
via the <code>srcObject</code> attribute.</p>

<video id="vid"></video>

<div id='log'></div>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script>
var vid = document.getElementById("vid");
var t = async_test("Tests that a MediaStream can be assigned to a video element with srcObject", {timeout: 10000});
t.step(function() {
  navigator.mediaDevices.getUserMedia({video: true})
    .then(t.step_func(function (stream) {
      var testOncePlaying = function() {
         assert_equals(vid.played.length, 1, "A MediaStream's timeline always consists of a single range");
         assert_equals(vid.played.start(0), 0, "A MediaStream's timeline always consists of a single range");
         assert_approx_equals(vid.played.end(0), vid.currentTime, 0.0001, "A MediaStream's timeline always consists of a single range");
         assert_equals(vid.readyState, vid.HAVE_ENOUGH_DATA, "Upon selecting a media stream, the UA sets readyState to HAVE_ENOUGH_DATA");
         assert_equals(vid.duration, Infinity, " A MediaStream does not have a pre-defined duration. ");
         var time = vid.currentTime;

         assert_approx_equals(vid.currentTime, time, 0.0001, "The UA MUST ignore attempts to set the currentTime attribute");
         // TODO add test that duration must be set to currentTime
         // when mediastream is destroyed
         vid.removeEventListener("timeupdate", testOncePlaying, false);
         t.done();
      }
      vid.addEventListener("timeupdate", t.step_func(testOncePlaying), false);
      vid.srcObject = stream;
      vid.play();
      assert_true(!vid.seeking, "A MediaStream is not seekable");
      assert_equals(vid.seekable.length, 0, "A MediaStream is not seekable");
      assert_equals(vid.defaultPlaybackRate, 1, "playback rate is always 1");
      assert_equals(vid.playbackRate, 1, "playback rate is always 1");
      assert_equals(vid.buffered.length, 0, "A MediaStream cannot be preloaded.  Therefore, there is no buffered timeranges");
      assert_equals(vid.duration, vid.readyState == vid.HAVE_NOTHING ? NaN : Infinity, " A MediaStream does not have a pre-defined duration. ");
    }), function(error) {});
});
</script>
</body>
</html>
