<!doctype html>
<html>
<head>
  <meta charset='utf-8'>
  <title>SourceBuffer#mode with generate timestamps flag true</title>
  <script src="/resources/testharness.js"></script>
  <script src="/resources/testharnessreport.js"></script>
</head>
<body>
<div id="log"></div>

<script>
var mimes = ['audio/aac', 'audio/mpeg'];

//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 mediaTest(mime) {
    async_test(function(t) {
        if(!isTypeSupported.bind(t)(mime)) {
            return;
        }
        var mediaSource = new MediaSource();
        mediaSource.addEventListener('sourceopen', t.step_func_done(function(e) {
            var sourceBuffer = mediaSource.addSourceBuffer(mime);
            assert_equals(sourceBuffer.updating, false, "SourceBuffer.updating is false");
            assert_throws_js(TypeError,
                             function() {
                                 sourceBuffer.mode = "segments";
                             },
                             'SourceBuffer#mode with generate timestamps flag true');
        }), false);
        var video = document.createElement('video');
        video.src = window.URL.createObjectURL(mediaSource);
    }, mime + ' : ' +
       'If generate timestamps flag equals true and new mode equals "segments", ' +
       'then throw a TypeError exception and abort these steps.');
}
mimes.forEach(function(mime) {
    mediaTest(mime);
});
</script>
</body>
</html>
