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

var valid_sizes = [
    100,
    2,
    0,
    0,
    100,
    50,
    1.5,
];
valid_sizes.forEach(function(valid, index) {
    assert_equals(cues[index].size, valid, 'Failed with cue ' + index);
});

for (var i = 0; i < 9; i++) {
    var index = valid_sizes.length + i;

    assert_equals(cues[index].size, 100, 'Failed with cue ' + index);
}

    }
    this.done();
}

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