<!doctype html>
<html>
<head>
<title>Test that mediastreamtrack are properly ended</title>
<link rel="author" title="Dominique Hazael-Massieux" href="mailto:dom@w3.org"/>
<link rel="help" href="http://w3c.github.io/mediacapture-main/getusermedia.html#mediastreamtrack">
</head>
<body>
<p class="instructions">When prompted, accept to share your video and audio
stream, and then revoke that permission.</p>
<h1 class="instructions">Description</h1>
<p class="instructions">This test checks that the video and audio tracks of
MediaStream object returned by the success callback in getUserMedia are
correctly set into inactive state when permission is revoked.</p>

<div id='log'></div>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script>
var t = async_test("Tests that the video MediaStreamTrack objects are properly ended on permission revocation");
t.step(function () {
  navigator.mediaDevices.getUserMedia({audio: true,video: true}).then(t.step_func(function (stream) {
    var vidTrack = stream.getVideoTracks()[0];
    assert_equals(vidTrack.readyState, "live", "The video track object is in live state");
    var audTrack = stream.getAudioTracks()[0];
    assert_equals(audTrack.readyState, "live", "The audio track object is in live state");
    vidTrack.onended = t.step_func(function () {
        assert_equals(vidTrack.readyState, "ended", "Video track has been ended as expected");
        assert_equals(audTrack.readyState, "ended", "Audio track has been ended as expected");
        assert_false(stream.active, "MediaStream has been inactive as expected");
        t.done();
      });
    }), function (error) {}
  );
});
</script>
</body>
</html>
