Bug 1943761 - Add class alignment to the mozsearch analysis file. r=asuth
[gecko.git] / dom / media / webvtt / test / mochitest / test_texttrack.html
blob69c4f24becc0dc84a303db92c3ace8c8561c6fdc
1 <!DOCTYPE HTML>
2 <html>
3 <head>
4 <title>Test for Bug 833386 - TextTrackList</title>
5 <script src="/tests/SimpleTest/SimpleTest.js"></script>
6 <script type="text/javascript" src="manifest.js"></script>
7 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
8 </head>
9 <body>
10 <video id="v">
11 <script type="text/javascript">
12 /**
13 * This test is used to check different things.
14 * (1) the default value of track element's attributes
15 * (2) readonly attributes can't be modifted
16 * (3) the order of tracks in the media element's track list
18 var enabledTrackElement = null;
20 async function runTest() {
21 addFourTextTrackElementsToVideo();
22 startLoadingVideo();
23 await waitUntilEnableTrackLoaded();
24 checkTracksStatus();
25 SimpleTest.finish();
28 SimpleTest.waitForExplicitFinish();
29 onload = runTest;
31 /**
32 * The following are test helper functions.
34 function addFourTextTrackElementsToVideo() {
35 let video = document.getElementById("v");
36 isnot(video.textTracks, undefined,
37 "HTMLMediaElement::TextTrack() property should be available.")
39 let trackList = video.textTracks;
40 is(trackList.length, 0, "Length should be 0.");
42 ok(typeof video.addTextTrack == "function",
43 "HTMLMediaElement::AddTextTrack() function should be available.")
45 // Insert some tracks in an order that is not sorted, we will test if they
46 // are sorted later.
47 info(`- Add a track element with label 'third' -`);
48 video.addTextTrack("subtitles", "third", "en-CA");
49 is(trackList.length, 1, "Length should be 1.");
51 let textTrack = video.textTracks[0];
52 checkAttributesDefaultValue(textTrack);
53 checkTextTrackMode(textTrack);
54 checkReadOnlyAttributes(textTrack);
56 info(`- Add a track element with label 'first' -`);
57 let trackOne = document.createElement("track");
58 video.appendChild(trackOne);
59 trackOne.label = "first";
60 trackOne.src = "basic.vtt";
61 trackOne.default = true;
62 trackOne.id = "2";
63 // The automatic track selection would choose the first track element with
64 // `default` attribute, so this track would be enable later.
65 enabledTrackElement = trackOne;
67 info(`- Add a track element with label 'fourth' -`);
68 video.addTextTrack("subtitles", "fourth", "en-CA");
70 info(`- Add a track element with label 'second' -`);
71 let trackTwo = document.createElement("track");
72 video.appendChild(trackTwo);
73 trackTwo.label = "second";
74 trackTwo.src = "basic.vtt";
75 // Although this track has `default` attribute as well, it won't be enable by
76 // the automatic track selection because it's not the first default track in
77 // the media element's track list.
78 trackTwo.default = true;
81 function checkAttributesDefaultValue(track) {
82 is(track.label, "third", "Label should be set to third.");
83 is(track.language, "en-CA", "Language should be en-CA.");
84 is(track.kind, "subtitles", "Default kind should be subtitles.");
85 is(track.mode, "hidden", "Default mode should be hidden.");
88 function checkTextTrackMode(track) {
89 // Mode should not allow a bogus value.
90 track.mode = 'bogus';
91 is(track.mode, 'hidden', "Mode should be not allow a bogus value.");
93 // Should allow all these values for mode.
94 changeTextTrackMode("showing");
95 changeTextTrackMode("disabled");
96 changeTextTrackMode("hidden");
98 function changeTextTrackMode(mode) {
99 track.mode = mode;
100 is(track.mode, mode, `Mode should allow \"${mode}\"`);
104 function checkReadOnlyAttributes(track) {
105 // All below are read-only properties and so should not allow setting.
106 track.label = "French subtitles";
107 is(track.label, "third", "Label is read-only so should still be \"label\".");
108 track.language = "en";
109 is(track.language, "en-CA", "Language is read-only so should still be \"en-CA\".");
110 track.kind = "captions";
111 is(track.kind, "subtitles", "Kind is read-only so should still be \"subtitles\"");
114 function startLoadingVideo() {
115 let video = document.getElementById("v");
116 video.src = "seek.webm";
117 video.preload = "metadata";
120 async function waitUntilEnableTrackLoaded() {
121 info(`wait until the enabled track finishes loading`);
122 await once(enabledTrackElement, "load");
123 is(enabledTrackElement.readyState, 2, "Track::ReadyState should be set to LOADED.");
126 function checkTracksStatus() {
127 // We're testing two things here,
128 // (1) the tracks created from a track element have a default mode 'disabled'
129 // and tracks created from 'addTextTrack' method have a default
130 // mode of 'hidden'.
131 // (2) we're testing that the tracks are sorted properly. For the tracks to
132 // be sorted the first two tracks, added through a TrackElement, must occupy
133 // the first two indexes in their TrackElement tree order. The second two
134 // tracks, added through the 'addTextTrack' method, will occupy the last two
135 // indexes in the order that they were added in.
136 let trackData = [
137 { label: "first", mode: "showing", id: "2" },
138 { label: "second", mode: "disabled", id: "" },
139 { label: "third", mode: "hidden", id: "" },
140 { label: "fourth", mode: "hidden", id: "" }
142 let video = document.getElementById("v");
143 is(video.textTracks.length, trackData.length,
144 `TextTracks length should be ${trackData.length}`);
145 for (let i = 0; i < trackData.length; i++) {
146 let track = video.textTracks[i];
147 isnot(track, null, `Video should have a text track at index ${i}`);
148 let info = trackData[i];
149 for (let key in info) {
150 is(track[key], info[key],
151 `Track at index ${i} should have a '${key}' property with a value of '${info[key]}'.`);
156 </script>
157 </body>
158 </html>