<!doctype html>
<!-- DO NOT EDIT! This file and support/regions-id.vtt are generated. -->
<!-- See /webvtt/parsing/file-parsing/README.md -->
<meta charset=utf-8>
<title>WebVTT parser test: regions, id</title>
<link rel="help" href="https://w3c.github.io/webvtt/#collect-webvtt-region-settings">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
var t = async_test('regions, id');
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/regions-id.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, 4);

var region1 = cues[0].region;
assert_equals(region1.lines, 2);

var region2 = cues[1].region;
assert_equals(region2.lines, 1);

var region3 = cues[2].region;
assert_equals(region3.lines, 3);

var region4 = cues[3].region;
assert_equals(region4.lines, 4);

    }
    this.done();
}

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