<!DOCTYPE html>
<html>
    <head>
        <title>Test that only BCP47 language tags are accepted as valid but still reflected</title>
        <!--
        <script src="media-controls.js"></script>
        <script src="media-file.js"></script>
        -->
        <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>
