<!doctype html>
<!-- DO NOT EDIT! This file and support/nulls.vtt are generated. -->
<!-- See /webvtt/parsing/file-parsing/README.md -->
<meta charset=utf-8>
<title>WebVTT parser test: nulls</title>
<link rel="help" href="https://w3c.github.io/webvtt/#webvtt-parser-algorithm">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
var t = async_test('nulls');
t.step(function(){
    var video = document.createElement('video');
    var track = document.createElement('track');
    assert_true('src' in track, 'track element not supported');
    track.src = 'support/nulls.vtt';
    track['default'] = true;
    track.kind = 'subtitles';
    track.onload = this.step_func(trackLoaded);
    track.onerror = this.step_func(trackError);
    video.appendChild(track);
    document.body.appendChild(video);
});

function trackLoaded(event) {
    var track = event.target;
    var video = track.parentNode;
    var cues = video.textTracks[0].cues;
    {
assert_equals(cues.length, 7, cues);

assert_equals(cues[0].id, "");
assert_equals(cues[0].text, "text0");

assert_equals(cues[1].id, "\uFFFD (null in id)");
assert_equals(cues[1].text, "text1");

assert_equals(cues[2].id, "\uFFFD (null in cue data)");
assert_equals(cues[2].text, "\uFFFDtext\uFFFD2");

assert_equals(cues[3].align, "center");
assert_equals(cues[3].text, "text3");

assert_equals(cues[4].align, "center");
assert_equals(cues[4].text, "text4");

assert_equals(cues[5].align, "center");
assert_equals(cues[5].text, "text5");

assert_equals(cues[6].align, "end");
assert_equals(cues[6].text, "text6");

    }
    this.done();
}

function trackError(e) {
    assert_unreached('got unexpected error event');
}
</script>
