blob: f5da3b30b61fc0913ab5d1476591959847fadc0a [file] [log] [blame]
<!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>