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"/>
11 <script type=
"text/javascript">
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();
23 await
waitUntilEnableTrackLoaded();
28 SimpleTest
.waitForExplicitFinish();
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
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;
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.
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
) {
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
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.
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]}'.`);