| OLD | NEW |
| (Empty) |
| 1 | |
| 2 var video = null; | |
| 3 var mediaElement = document; // If not set, an event from any element will trigg
er a waitForEvent() callback. | |
| 4 var consoleDiv = null; | |
| 5 var printFullTestDetails = true; // This is optionaly switched of by test whose
tested values can differ. (see disableFullTestDetailsPrinting()) | |
| 6 var Failed = false; | |
| 7 | |
| 8 var track = null; // Current TextTrack being tested. | |
| 9 var cues = null; // Current TextTrackCueList being tested. | |
| 10 var numberOfTrackTests = 0; | |
| 11 var numberOfTracksLoaded = 0; | |
| 12 | |
| 13 findMediaElement(); | |
| 14 logConsole(); | |
| 15 | |
| 16 if (window.testRunner) { | |
| 17 // Some track element rendering tests require text pixel dump. | |
| 18 if (typeof requirePixelDump == "undefined") | |
| 19 testRunner.dumpAsText(); | |
| 20 | |
| 21 testRunner.waitUntilDone(); | |
| 22 } | |
| 23 | |
| 24 function disableFullTestDetailsPrinting() | |
| 25 { | |
| 26 printFullTestDetails = false; | |
| 27 } | |
| 28 | |
| 29 function enableFullTestDetailsPrinting() | |
| 30 { | |
| 31 printFullTestDetails = true; | |
| 32 } | |
| 33 | |
| 34 function logConsole() | |
| 35 { | |
| 36 if (!consoleDiv && document.body) { | |
| 37 consoleDiv = document.createElement('div'); | |
| 38 document.body.appendChild(consoleDiv); | |
| 39 } | |
| 40 return consoleDiv; | |
| 41 } | |
| 42 | |
| 43 function findMediaElement() | |
| 44 { | |
| 45 try { | |
| 46 video = document.getElementsByTagName('video')[0]; | |
| 47 if (video) | |
| 48 mediaElement = video; | |
| 49 else { | |
| 50 audio = document.getElementsByTagName('audio')[0]; | |
| 51 if (audio) | |
| 52 mediaElement = audio; | |
| 53 } | |
| 54 } catch (ex) { } | |
| 55 } | |
| 56 | |
| 57 function testAndEnd(testFuncString) | |
| 58 { | |
| 59 test(testFuncString, true); | |
| 60 } | |
| 61 | |
| 62 function test(testFuncString, endit) | |
| 63 { | |
| 64 logResult(eval(testFuncString), "TEST(" + testFuncString + ")"); | |
| 65 if (endit) | |
| 66 endTest(); | |
| 67 } | |
| 68 | |
| 69 function testExpected(testFuncString, expected, comparison) | |
| 70 { | |
| 71 try { | |
| 72 var observed = eval(testFuncString); | |
| 73 } catch (ex) { | |
| 74 consoleWrite(ex); | |
| 75 return; | |
| 76 } | |
| 77 | |
| 78 if (comparison === undefined) | |
| 79 comparison = '=='; | |
| 80 | |
| 81 var success = false; | |
| 82 switch (comparison) | |
| 83 { | |
| 84 case '<': success = observed < expected; break; | |
| 85 case '<=': success = observed <= expected; break; | |
| 86 case '>': success = observed > expected; break; | |
| 87 case '>=': success = observed >= expected; break; | |
| 88 case '!=': success = observed != expected; break; | |
| 89 case '==': success = observed == expected; break; | |
| 90 case '===': success = observed === expected; break; | |
| 91 } | |
| 92 | |
| 93 reportExpected(success, testFuncString, comparison, expected, observed) | |
| 94 } | |
| 95 | |
| 96 function testArraysEqual(testFuncString, expected) | |
| 97 { | |
| 98 var observed; | |
| 99 try { | |
| 100 observed = eval(testFuncString); | |
| 101 } catch (ex) { | |
| 102 consoleWrite(ex); | |
| 103 return; | |
| 104 } | |
| 105 | |
| 106 testExpected(testFuncString + ".length", expected.length); | |
| 107 | |
| 108 for (var i = 0; i < observed.length; i++) { | |
| 109 testExpected(testFuncString + "[" + i + "]", expected[i]); | |
| 110 } | |
| 111 } | |
| 112 | |
| 113 var testNumber = 0; | |
| 114 | |
| 115 function reportExpected(success, testFuncString, comparison, expected, observed) | |
| 116 { | |
| 117 testNumber++; | |
| 118 | |
| 119 var msg = "Test " + testNumber; | |
| 120 | |
| 121 if (printFullTestDetails || !success) | |
| 122 msg = "EXPECTED (<em>" + testFuncString + " </em>" + comparison + " '<em
>" + expected + "</em>')"; | |
| 123 | |
| 124 if (!success) | |
| 125 msg += ", OBSERVED '<em>" + observed + "</em>'"; | |
| 126 | |
| 127 logResult(success, msg); | |
| 128 } | |
| 129 | |
| 130 function runSilently(testFuncString) | |
| 131 { | |
| 132 if (printFullTestDetails) | |
| 133 consoleWrite("RUN(" + testFuncString + ")"); | |
| 134 try { | |
| 135 eval(testFuncString); | |
| 136 } catch (ex) { | |
| 137 if (!printFullTestDetails) { | |
| 138 // No details were printed previous, give some now. | |
| 139 // This will be helpful in case of error. | |
| 140 logResult(Failed, "Error in RUN(" + testFuncString + "):"); | |
| 141 } | |
| 142 logResult(Failed, "<span style='color:red'>"+ex+"</span>"); | |
| 143 } | |
| 144 } | |
| 145 | |
| 146 function run(testFuncString) | |
| 147 { | |
| 148 consoleWrite("RUN(" + testFuncString + ")"); | |
| 149 try { | |
| 150 eval(testFuncString); | |
| 151 } catch (ex) { | |
| 152 consoleWrite(ex); | |
| 153 } | |
| 154 } | |
| 155 | |
| 156 function waitForEventOnce(eventName, func, endit, doNotLog) | |
| 157 { | |
| 158 waitForEvent(eventName, func, endit, true, null, doNotLog) | |
| 159 } | |
| 160 | |
| 161 function waitForEventAndEnd(eventName, funcString) | |
| 162 { | |
| 163 waitForEvent(eventName, funcString, true, false, null, false) | |
| 164 } | |
| 165 | |
| 166 function waitForEvent(eventName, func, endit, oneTimeOnly, element, doNotLog) | |
| 167 { | |
| 168 if (!element) | |
| 169 element = mediaElement; | |
| 170 | |
| 171 function _eventCallback(event) | |
| 172 { | |
| 173 if (oneTimeOnly) | |
| 174 element.removeEventListener(eventName, _eventCallback, true); | |
| 175 | |
| 176 if (!doNotLog) | |
| 177 consoleWrite("EVENT(" + eventName + ")"); | |
| 178 | |
| 179 if (func) | |
| 180 func(event); | |
| 181 | |
| 182 if (endit) | |
| 183 endTest(); | |
| 184 } | |
| 185 | |
| 186 element.addEventListener(eventName, _eventCallback, true); | |
| 187 } | |
| 188 | |
| 189 function waitForEventTestAndEnd(eventName, testFuncString) | |
| 190 { | |
| 191 waitForEventAndTest(eventName, testFuncString, true); | |
| 192 } | |
| 193 | |
| 194 function waitForEventAndFail(eventName) | |
| 195 { | |
| 196 waitForEventAndTest(eventName, "false", true); | |
| 197 } | |
| 198 | |
| 199 function waitForEventAndTest(eventName, testFuncString, endit) | |
| 200 { | |
| 201 function _eventCallback(event) | |
| 202 { | |
| 203 logResult(eval(testFuncString), "EVENT(" + eventName + ") TEST(" + testF
uncString + ")"); | |
| 204 if (endit) | |
| 205 endTest(); | |
| 206 } | |
| 207 | |
| 208 mediaElement.addEventListener(eventName, _eventCallback, true); | |
| 209 } | |
| 210 | |
| 211 function testDOMException(testString, exceptionString) | |
| 212 { | |
| 213 try { | |
| 214 eval(testString); | |
| 215 } catch (ex) { | |
| 216 var exception = ex; | |
| 217 } | |
| 218 logResult(exception instanceof DOMException && exception.code === eval(excep
tionString), | |
| 219 "TEST(" + testString + ") THROWS(" + exceptionString + ": " + exception.
message + ")"); | |
| 220 } | |
| 221 | |
| 222 function testException(testString, exceptionString) { | |
| 223 try { | |
| 224 eval(testString); | |
| 225 } catch (ex) { | |
| 226 var exception = ex; | |
| 227 } | |
| 228 logResult(exception !== undefined && exception == eval(exceptionString), | |
| 229 "TEST(" + testString + ") THROWS(" + exceptionString + ")"); | |
| 230 } | |
| 231 | |
| 232 var testEnded = false; | |
| 233 | |
| 234 function endTest() | |
| 235 { | |
| 236 consoleWrite("END OF TEST"); | |
| 237 testEnded = true; | |
| 238 if (window.testRunner) | |
| 239 testRunner.notifyDone(); | |
| 240 } | |
| 241 | |
| 242 function endTestLater() | |
| 243 { | |
| 244 setTimeout(endTest, 250); | |
| 245 } | |
| 246 | |
| 247 function failTestIn(ms) | |
| 248 { | |
| 249 setTimeout(function () { | |
| 250 consoleWrite("FAIL: did not end fast enough"); | |
| 251 endTest(); | |
| 252 }, ms); | |
| 253 } | |
| 254 | |
| 255 function failTest(text) | |
| 256 { | |
| 257 logResult(Failed, text); | |
| 258 endTest(); | |
| 259 } | |
| 260 | |
| 261 function logResult(success, text) | |
| 262 { | |
| 263 if (success) | |
| 264 consoleWrite(text + " <span style='color:green'>OK</span>"); | |
| 265 else | |
| 266 consoleWrite(text + " <span style='color:red'>FAIL</span>"); | |
| 267 } | |
| 268 | |
| 269 function consoleWrite(text) | |
| 270 { | |
| 271 if (testEnded) | |
| 272 return; | |
| 273 var span = document.createElement("span"); | |
| 274 logConsole().appendChild(span); | |
| 275 span.innerHTML = text + '<br>'; | |
| 276 } | |
| 277 | |
| 278 function relativeURL(url) | |
| 279 { | |
| 280 return url.substr(url.lastIndexOf('/media/')+7); | |
| 281 } | |
| 282 | |
| 283 | |
| 284 function isInTimeRanges(ranges, time) | |
| 285 { | |
| 286 var i = 0; | |
| 287 for (i = 0; i < ranges.length; ++i) { | |
| 288 if (time >= ranges.start(i) && time <= ranges.end(i)) { | |
| 289 return true; | |
| 290 } | |
| 291 } | |
| 292 return false; | |
| 293 } | |
| 294 | |
| 295 function testTracks(expected) | |
| 296 { | |
| 297 tracks = video.textTracks; | |
| 298 testExpected("tracks.length", expected.length); | |
| 299 | |
| 300 for (var i = 0; i < tracks.length; i++) { | |
| 301 consoleWrite("<br>*** Testing text track " + i); | |
| 302 | |
| 303 track = tracks[i]; | |
| 304 for (j = 0; j < expected.tests.length; j++) { | |
| 305 var test = expected.tests[j]; | |
| 306 testExpected("track." + test.property, test.values[i]); | |
| 307 } | |
| 308 } | |
| 309 } | |
| 310 | |
| 311 function testCues(index, expected) | |
| 312 { | |
| 313 consoleWrite("<br>*** Testing text track " + index); | |
| 314 | |
| 315 cues = video.textTracks[index].cues; | |
| 316 testExpected("cues.length", expected.length); | |
| 317 for (var i = 0; i < cues.length; i++) { | |
| 318 for (j = 0; j < expected.tests.length; j++) { | |
| 319 var test = expected.tests[j]; | |
| 320 testExpected("cues[" + i + "]." + test.property, test.values[i]); | |
| 321 } | |
| 322 } | |
| 323 } | |
| 324 | |
| 325 function allTestsEnded() | |
| 326 { | |
| 327 numberOfTrackTests--; | |
| 328 if (numberOfTrackTests == 0) | |
| 329 endTest(); | |
| 330 } | |
| 331 | |
| 332 function enableAllTextTracks() | |
| 333 { | |
| 334 findMediaElement(); | |
| 335 for (var i = 0; i < video.textTracks.length; i++) { | |
| 336 if (video.textTracks[i].mode == "disabled") | |
| 337 video.textTracks[i].mode = "hidden"; | |
| 338 } | |
| 339 } | |
| 340 | |
| 341 var requiredEvents = []; | |
| 342 | |
| 343 function waitForEventsAndCall(eventList, func) | |
| 344 { | |
| 345 function _eventCallback(event) | |
| 346 { | |
| 347 if (!requiredEvents.length) | |
| 348 return; | |
| 349 | |
| 350 var index = requiredEvents.indexOf(event.type); | |
| 351 if (index < 0) | |
| 352 return; | |
| 353 | |
| 354 requiredEvents.splice(index, 1); | |
| 355 if (requiredEvents.length) | |
| 356 return; | |
| 357 | |
| 358 func(); | |
| 359 } | |
| 360 | |
| 361 requiredEvents = []; | |
| 362 for (var i = 0; i < eventList.length; i++) { | |
| 363 requiredEvents[i] = eventList[i][1]; | |
| 364 eventList[i][0].addEventListener(requiredEvents[i], _eventCallback, true
); | |
| 365 } | |
| 366 } | |
| OLD | NEW |