<!doctype html>
<html>
<head>
  <meta charset='utf-8'>
  <title>SourceBuffer#abort() when readyState attribute is not in the "open"</title>
  <meta name="timeout" content="long">
  <script src="/resources/testharness.js"></script>
  <script src="/resources/testharnessreport.js"></script>
</head>
<body>
<div id="log"></div>

<script>
var contents = {'/media/white.webm': 'video/webm; codecs="vorbis,vp8"',
                '/media/white.mp4' : 'video/mp4'};

//check the browser supports the MIME used in this test
function isTypeSupported(mime) {
    if(!MediaSource.isTypeSupported(mime)) {
        this.step(function() {
            assert_unreached("Browser doesn't support the MIME used in this test: " + mime);
        });
        this.done();
        return false;
    }
    return true;
}
function GET(url, processBody) {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', url, true);
    xhr.responseType = 'arraybuffer';
    xhr.send();
    xhr.onload = function(e) {
        if (xhr.status != 200) {
            alert("Unexpected status code " + xhr.status + " for " + url);
            return false;
        }
        processBody(new Uint8Array(xhr.response));
    };
}
function mediaTest(file, mime) {
    async_test(function(t) {
        if(!isTypeSupported.bind(t)(mime)) {
            return;
        }
        GET(file, function(data) {
            var mediaSource = new MediaSource();
            var sourceBuffer = null;
            mediaSource.addEventListener('sourceopen', function(e) {
                sourceBuffer = mediaSource.addSourceBuffer(mime);
                mediaSource.endOfStream();
                assert_equals(mediaSource.readyState, 'ended',
                              'mediaSource.readyState is "ended" after endOfStream()');
            });
            mediaSource.addEventListener('sourceended', t.step_func_done(function(e) {
                assert_throws({name: 'InvalidStateError'}, function() {
                    sourceBuffer.abort();
                });
            }));
            var video = document.createElement('video');
            video.src = window.URL.createObjectURL(mediaSource);
        });
    }, 'SourceBuffer#abort() (' + mime + ') : If the readyState attribute ' +
       'of the parent media source is not in the "open" state then throw ' +
       'an INVALID_STATE_ERR exception and abort these steps.');
}
for(var file in contents) {
    mediaTest(file, contents[file]);
}
</script>
</body>
</html>
