Merge Chromium + Blink git repositories
[chromium-blink-merge.git] / third_party / WebKit / LayoutTests / media / video-test.js
blob5391c462874a61a73564e84ea3c185d60977a0ce
2 var video = null;
3 var mediaElement = document; // If not set, an event from any element will trigger 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;
8 var track = null; // Current TextTrack being tested.
9 var cues = null; // Current TextTrackCueList being tested.
10 var numberOfTrackTests = 0;
11 var numberOfTracksLoaded = 0;
13 findMediaElement();
14 logConsole();
16 if (window.testRunner) {
17     // Some track element rendering tests require text pixel dump.
18     if (typeof requirePixelDump == "undefined")
19         testRunner.dumpAsText();
21     testRunner.waitUntilDone();
24 function disableFullTestDetailsPrinting()
26     printFullTestDetails = false;
29 function enableFullTestDetailsPrinting()
31     printFullTestDetails = true;
34 function logConsole()
36     if (!consoleDiv && document.body) {
37         consoleDiv = document.createElement('div');
38         document.body.appendChild(consoleDiv);
39     }
40     return consoleDiv;
43 function findMediaElement()
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) { }
57 function testAndEnd(testFuncString)
59     test(testFuncString, true);
62 function test(testFuncString, endit)
64     logResult(eval(testFuncString), "TEST(" + testFuncString + ")");
65     if (endit)
66         endTest();
69 function testExpected(testFuncString, expected, comparison)
71     try {
72         var observed = eval(testFuncString);
73     } catch (ex) {
74         consoleWrite(ex);
75         return;
76     }
78     if (comparison === undefined)
79         comparison = '==';
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     }
93     reportExpected(success, testFuncString, comparison, expected, observed)
96 function testArraysEqual(testFuncString, expected)
98     var observed;
99     try {
100         observed = eval(testFuncString);
101     } catch (ex) {
102         consoleWrite(ex);
103         return;
104     }
106     testExpected(testFuncString + ".length", expected.length);
108     for (var i = 0; i < observed.length; i++) {
109         testExpected(testFuncString + "[" + i + "]", expected[i]);
110     }
113 var testNumber = 0;
115 function reportExpected(success, testFuncString, comparison, expected, observed)
117     testNumber++;
119     var msg = "Test " + testNumber;
121     if (printFullTestDetails || !success)
122         msg = "EXPECTED (<em>" + testFuncString + " </em>" + comparison + " '<em>" + expected + "</em>')";
124     if (!success)
125         msg +=  ", OBSERVED '<em>" + observed + "</em>'";
127     logResult(success, msg);
130 function runSilently(testFuncString)
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     }
146 function run(testFuncString)
148     consoleWrite("RUN(" + testFuncString + ")");
149     try {
150         eval(testFuncString);
151     } catch (ex) {
152         consoleWrite(ex);
153     }
156 function waitForEventOnce(eventName, func, endit, doNotLog)
158     waitForEvent(eventName, func, endit, true, null, doNotLog)
161 function waitForEventAndEnd(eventName, funcString)
163     waitForEvent(eventName, funcString, true, false, null, false)
166 function waitForEvent(eventName, func, endit, oneTimeOnly, element, doNotLog)
168     if (!element)
169         element = mediaElement;
171     function _eventCallback(event)
172     {
173         if (oneTimeOnly)
174             element.removeEventListener(eventName, _eventCallback, true);
176         if (!doNotLog)
177           consoleWrite("EVENT(" + eventName + ")");
179         if (func)
180             func(event);
182         if (endit)
183             endTest();
184     }
186     element.addEventListener(eventName, _eventCallback, true);
189 function waitForEventTestAndEnd(eventName, testFuncString)
191     waitForEventAndTest(eventName, testFuncString, true);
194 function waitForEventAndFail(eventName)
196     waitForEventAndTest(eventName, "false", true);
199 function waitForEventAndTest(eventName, testFuncString, endit)
201     function _eventCallback(event)
202     {
203         logResult(eval(testFuncString), "EVENT(" + eventName + ") TEST(" + testFuncString + ")");
204         if (endit)
205             endTest();
206     }
208     mediaElement.addEventListener(eventName, _eventCallback, true);
211 function testDOMException(testString, exceptionString)
213     try {
214         eval(testString);
215     } catch (ex) {
216         var exception = ex;
217     }
218     logResult(exception instanceof DOMException && exception.code === eval(exceptionString),
219         "TEST(" + testString + ") THROWS(" + exceptionString + ": " + exception.message + ")");
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 + ")");
232 var testEnded = false;
234 function endTest()
236     consoleWrite("END OF TEST");
237     testEnded = true;
238     if (window.testRunner)
239         testRunner.notifyDone();
242 function endTestLater()
244     setTimeout(endTest, 250);
247 function failTestIn(ms)
249     setTimeout(function () {
250         consoleWrite("FAIL: did not end fast enough");
251         endTest();
252     }, ms);
255 function failTest(text)
257     logResult(Failed, text);
258     endTest();
261 function logResult(success, text)
263     if (success)
264         consoleWrite(text + " <span style='color:green'>OK</span>");
265     else
266         consoleWrite(text + " <span style='color:red'>FAIL</span>");
269 function consoleWrite(text)
271     if (testEnded)
272         return;
273     var span = document.createElement("span");
274     logConsole().appendChild(span);
275     span.innerHTML = text + '<br>';
278 function relativeURL(url)
280     return url.substr(url.lastIndexOf('/media/')+7);
284 function isInTimeRanges(ranges, time)
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;
295 function testTracks(expected)
297     tracks = video.textTracks;
298     testExpected("tracks.length", expected.length);
300     for (var i = 0; i < tracks.length; i++) {
301         consoleWrite("<br>*** Testing text track " + i);
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     }
311 function testCues(index, expected)
313     consoleWrite("<br>*** Testing text track " + index);
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     }
325 function allTestsEnded()
327     numberOfTrackTests--;
328     if (numberOfTrackTests == 0)
329         endTest();
332 function enableAllTextTracks()
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     }
341 var requiredEvents = [];
343 function waitForEventsAndCall(eventList, func)
345     function _eventCallback(event)
346     {
347         if (!requiredEvents.length)
348             return;
350         var index = requiredEvents.indexOf(event.type);
351         if (index < 0)
352             return;
354         requiredEvents.splice(index, 1);
355         if (requiredEvents.length)
356             return;
358         func();
359     }
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     }