<!DOCTYPE html>
<title>Test that we can add a track dynamically and it is displayed on the track selection menu.</title>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="../media-controls.js"></script>
<!-- Width should be large enough to display closed captions button. -->
<video controls style="width: 500px">
    <track src="captions-webvtt/captions.vtt" kind="captions" label="English" srclang="en" default>
</video>
<script>
async_test(function(t) {
    var trackCueText = "Bonjour";
    var video = document.querySelector("video");
    var track = document.querySelector("track");
    enableTestMode(video);

    track.oncuechange = t.step_func(function() {
        track.oncuechange = null;
        var new_track = video.addTextTrack("captions", "French", "fr");
        new_track.addCue(new VTTCue(0, 1, trackCueText));
        assert_true(isClosedCaptionsButtonEnabled(video));
        assert_equals(video.textTracks.length, 2);
        assert_equals(video.textTracks[0].mode, "showing");
        assert_equals(video.textTracks[1].mode, "hidden");

        // Verify the default track is being displayed.
        assert_equals(textTrackDisplayElement(video).innerText, "Lorem");

        // Click the newly added track.
        clickTextTrackAtIndex(video, 1, t.step_func_done(function() {
          assert_equals(video.textTracks[1].mode, "showing");
          assert_equals(video.textTracks[0].mode, "disabled");
          assert_equals(textTrackDisplayElement(video).innerText, trackCueText);
        }));
    });

    video.src = "../content/test.ogv";

    // Seek to a point in the middle of the first cue
    video.currentTime = 0.5;
})
</script>
