<!DOCTYPE html>
<html>
    <head>
        <title>Test that only BCP47 language tags are accepted as valid but still reflected</title>
        <script src="media-source-loader.js"></script>
        <script src="../video-test.js"></script>
        <script>
            var loader;
            var source;
            var sourceBuffer;

            function mediaDataLoadingFailed() {
                failTest('Media data loading failed');
            }

            function mediaDataLoaded() {
                source = new MediaSource();
                waitForEvent('sourceopen', sourceOpen, false, false, source);
                waitForEventAndFail('error');
                run('video.src = URL.createObjectURL(source)');
            }

            function sourceOpen() {
                run('source.duration = loader.duration()');
                run('sourceBuffer = source.addSourceBuffer(loader.type())');
                waitForEventOn(sourceBuffer, 'update', sourceInitialized, false, true);
                run('sourceBuffer.appendBuffer(loader.initSegment())');
            }

            function sourceInitialized() {
                waitForEventOn(sourceBuffer, 'update', startBCP74Test, false, true);
                consoleWrite('Append a partial media segment.')
                run('sourceBuffer.appendBuffer(loader.mediaSegment(0).slice(0, loader.mediaSegment(0).byteLength / 2))');
            }

            if (window.testRunner)
                testRunner.dumpAsText();

            var validLanguageTags = [
                // Grandfathered, irregular, https://tools.ietf.org/html/bcp47#section-2.1
                "en-GB-oed", "i-ami", "i-bnn", "i-default",
                "i-enochian", "i-hak", "i-klingon", "i-lux",
                "i-mingo", "i-navajo", "i-pwn", "i-tao",
                "i-tay", "i-tsu", "sgn-BE-FR", "sgn-BE-NL",
                "sgn-CH-DE",
                // Grandfathered, regular, https://tools.ietf.org/html/bcp47#section-2.1
                "art-lojban", "cel-gaulish", "no-bok", "no-nyn",
                "zh-guoyu", "zh-hakka", "zh-min", "zh-min-nan",
                "zh-xiang",
                // Other examples from the spec, mainly https://tools.ietf.org/html/bcp47#appendix-A
                "de", "fr", "ja", "zh-Hant",
                "zh-Han", "sr-Cyrl", "sr-Latn", "zh-cmn-Hans-CN",
                "cmn-Hans-CN", "zh-yue-HK", "yue-HK", "zh-Hans-CN",
                "sr-Latn-RS", "sl-rozaj", "sl-rozaj-biske", "sl-nedis",
                "de-CH-1901", "sl-IT-nedis", "hy-Latn-IT-arevela", "en-US",
                "es-419", "de-CH-x-phonebk", "az-Arab-x-AZE-derbend", "x-whatever",
                "qaa-Qaaa-QM-x-southern", "de-Qaaa", "sr-Latn-QM", "sr-Qaaa-RS",
                "zh-Hant-CN-x-private1-private2", "de-DE", "de-de", "de-Latn-DE",
                "de-Latf-DE", "de-DE-x-goethe", "de-Latn-DE-1996", "de-Deva-DE",
                "en-US-u-islamcal", "zh-CN-a-myext-x-private", "en-a-myext-b-another",
                "zh-Latn-CN-variant1-a-extend1-x-wadegile-private1"
            ];

            var invalidLanguageTags = [
                // Invalid length, less than 2 or over 100
                "a", "1", "ab-abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij",
                // Invalid first characters
                "1a", "-a",
                // Invalid second characters
                "a-", "a1",
                // Invalid third characters
                "aa1",
                // Invalid fourth characters
                "aaaa", "aaa1",
                // Invalid characters beyond the fourth
                "inv-alid-char space", "inv-alid-char–longDash", "inv-alid-char-Pålska",
                "inv-alid-char-*", "inv-alid-char-"
            ];

            var videoTrack;
            var audioTrack;
            var textTrack;
            function startBCP74Test () {
                videoTrack = video.videoTracks[0];
                audioTrack = video.audioTracks[0];
                // Access text track language through the element's srclang attribute
                // since the DOM property is read-only.
                textTrack = document.getElementById("textTrack");
                for (var i = 0; i < validLanguageTags.length; i++) {
                    videoTrack.language = validLanguageTags[i];
                    testExpected("videoTrack.language", validLanguageTags[i]);
                    textTrack.setAttribute("srclang", validLanguageTags[i]);
                    testExpected("textTrack.track.language", validLanguageTags[i]);
                    audioTrack.language = validLanguageTags[i];
                    testExpected("audioTrack.language", validLanguageTags[i]);
                }
                var notOverwritten = "not-overwritten";
                for (var i = 0; i < invalidLanguageTags.length; i++) {
                    // These are accepted in the web page layer but will produce console warnings
                    videoTrack.language = invalidLanguageTags[i];
                    testExpected("videoTrack.language", invalidLanguageTags[i]);
                    textTrack.setAttribute("srclang", invalidLanguageTags[i]);
                    testExpected("textTrack.track.language", invalidLanguageTags[i]);
                    audioTrack.language = invalidLanguageTags[i];
                    testExpected("audioTrack.language", invalidLanguageTags[i]);
                }
                endTest();
            }

            function runTest()
            {
                findMediaElement();

                loader = new MediaSourceLoader('content/test-fragmented-manifest.json');
                loader.onload = mediaDataLoaded;
                loader.onerror = mediaDataLoadingFailed;
            }
        </script>
    </head>

    <body onload="runTest()">
        <p>Test that only BCP47 language tags are accepted as valid but still reflected.</p>
        <video controls>
            <track id="textTrack" kind="captions" src="../track/captions-webvtt/captions-fast.vtt" />
        </video>
    </body>
</html>
