<!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">
<link rel='stylesheet' href='/resources/testharness.css' media='all'/>
</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 src="/common/vendor-prefix.js" data-prefixed-objects='[{"ancestors":["navigator"], "name":"getUserMedia"}]' data-prefixed-prototypes='[{"ancestors":["HTMLMediaElement"],"name":"srcObject"}]'></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.getUserMedia({video: true}, 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_equals(vid.played.end(0), vid.currentTime, "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");
       var time = vid.currentTime;
       assert_throws("INVALID_STATE_ERR", function() {
          vid.currentTime = 0;
       });
       assert_equals(vid.currentTime, time, "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, Infinity, " A MediaStream does not have a pre-defined duration. ");
    assert_equals(vid.startDate, NaN, " A MediaStream does not specify a timeline offset");
  }), function(error) {});
});
</script>
</body>
</html>
