Remove "gopher" from list of special schemes in URLParser
[WebKit-https.git] / LayoutTests / imported / w3c / common / media.js
1 //\r
2 // Returns whether the 'relative' parameter, resolved to an absolute URI,\r
3 // is a match for the 'absolute' parameter\r
4 //\r
5 function isResolvedURI(absolute, relative)\r
6 {\r
7     // This regex matches if the target starts with the current protocol,\r
8     // contains the current host, and ends with 'relative'\r
9     var regex = new RegExp('^' + location.protocol + '\/\/' + '.*' +\r
10         location.hostname + '.*' + relative + '$', 'i');\r
11     \r
12     return absolute.match(regex);\r
13 }\r
14 \r
15 //\r
16 // Returns whether the given variable is a valid value for a 'preload' property\r
17 //\r
18 function isValidPreloadValue(preload)\r
19 {\r
20     preload = preload.toLowerCase();\r
21         return preload == "" || preload == "none" || preload == "metadata" ||\r
22                 preload == "auto";\r
23 }\r
24 \r
25 //\r
26 // Returns the URI of a supported video source based on the user agent\r
27 //\r
28 function getVideoURI(base)\r
29 {\r
30     var extension = '.mp4';\r
31
32     var videotag = document.createElement("video");
33 \r
34     if ( videotag.canPlayType  &&
35          videotag.canPlayType('video/ogg; codecs="theora, vorbis"') )\r
36     {\r
37         extension = '.ogv';\r
38     }\r
39 \r
40     return base + extension;\r
41 }\r
42 \r
43 //\r
44 // Returns the URI of a supported audio source based on the user agent\r
45 //\r
46 function getAudioURI(base)\r
47 {\r
48     var extension = '.mp3';\r
49
50     var audiotag = document.createElement("audio");
51 \r
52     if ( audiotag.canPlayType &&
53          audiotag.canPlayType('audio/ogg') )\r
54     {\r
55         extension = '.oga';\r
56     }\r
57 \r
58     return base + extension;\r
59 }\r
60 \r
61 //\r
62 // Returns the mime type (and codecs parameter) of a supported video source\r
63 // based on the user agent\r
64 //\r
65 function getVideoType(codecs)\r
66 {\r
67     var mime = 'video/mp4';\r
68     var codecs_param = 'avc1.42E01E, mp4a.40.2';\r
69
70     var videotag = document.createElement("video");
71     \r
72     if ( videotag.canPlayType  &&
73          videotag.canPlayType('video/ogg; codecs="theora, vorbis"') )\r
74     {\r
75         mime = 'video/ogg';\r
76         codecs_param = 'theora, vorbis';\r
77     }\r
78 \r
79     if ( codecs )\r
80     {\r
81         return mime + '; codecs="' + codecs_param + '"';\r
82     }\r
83     else\r
84     {\r
85         return mime;\r
86     }\r
87 }\r
88 \r
89 var result_timeout = 0;\r
90 \r
91 //\r
92 // Clear the result timeout so that the test will not automatically pass/fail\r
93 //\r
94 function clearResultTimeout()\r
95 {\r
96     if (result_timeout != 0)\r
97     {\r
98         window.clearTimeout(result_timeout);\r
99         result_timeout = 0;\r
100     }\r
101 }\r
102 \r
103 //\r
104 // Passes the test\r
105 //\r
106 function passTest()\r
107 {\r
108     document.getElementById("test_0_result").innerHTML = "PASS";\r
109     clearResultTimeout();\r
110 }\r
111 \r
112 //\r
113 // Fails the test\r
114 //\r
115 function failTest()\r
116 {\r
117     document.getElementById("test_0_result").innerHTML = "FAIL";\r
118     clearResultTimeout();\r
119 }\r
120 \r
121 //\r
122 // Signals that the pass condition in this test should be manually verified\r
123 //\r
124 function manualTest()\r
125 {\r
126     document.getElementById("test_0_result").innerHTML = "Manual";\r
127     clearResultTimeout();\r
128 }\r
129 \r
130 //\r
131 // Set the test to automatically fail after a timeout is reached\r
132 //\r
133 function setFailTimeout(milliseconds)\r
134 {\r
135     clearResultTimeout();\r
136     result_timeout = window.setTimeout("failTest();", milliseconds);\r
137 }\r
138 \r
139 //\r
140 // Set the test to automatically pass after a timeout is reached\r
141 //\r
142 function setPassTimeout(milliseconds)\r
143 {\r
144     clearResultTimeout();\r
145     result_timeout = window.setTimeout("passTest();", milliseconds);\r
146 }\r
147 \r
148 //\r
149 // Find an unbuffered time in the media resource\r
150 //\r
151 function findUnbufferedTime(media)\r
152 {\r
153     var max = 0;\r
154         \r
155     for (var i=0; i < media.buffered.length; i++)\r
156     {\r
157         if (media.buffered.end(i) > max)\r
158         {\r
159             max = media.buffered.end(i);\r
160         }\r
161     }\r
162 \r
163     if (max < media.duration)\r
164     {\r
165         return (max + media.duration) / 2;\r
166     }\r
167     else\r
168     {\r
169         return -1;\r
170     }\r
171 }\r
172 \r
173 //\r
174 // Returns whether the actual time is approximately the expected time (within a\r
175 // tolerance)\r
176 //\r
177 function isApprox(actual, expected, tolerance)\r
178 {\r
179     return ((expected - tolerance) < actual) && (actual < (expected + tolerance));\r
180 }\r
181 \r
182 var checkPlaybackRate_media = null;\r
183 var checkPlaybackRate_tolerance = -1;\r
184 var checkPlaybackRate_callback = function(result){};\r
185 var checkPlaybackRate_time = -1;\r
186 var checkPlaybackRate_timeout = 0;\r
187 var checkPlaybackRate_seconds = -1;\r
188 var checkPlaybackRate_playbackRate = 0;\r
189 \r
190 function checkPlaybackRate_check()\r
191 {\r
192     var rate = (checkPlaybackRate_media.currentTime - checkPlaybackRate_time) / checkPlaybackRate_seconds;\r
193 \r
194     checkPlaybackRate_callback(\r
195         isApprox(\r
196             rate, \r
197             checkPlaybackRate_playbackRate, \r
198             checkPlaybackRate_tolerance\r
199             )\r
200         );\r
201 }\r
202 \r
203 //\r
204 // Checks that the playback rate is a given value by estimating the actual rate\r
205 // over time\r
206 //\r
207 function checkPlaybackRate(media, playbackRate, seconds, tolerance, callback)\r
208 {\r
209     if (checkPlaybackRate_timeout != 0)\r
210     {\r
211         window.clearTimeout(checkPlaybackRate_timeout);\r
212         checkPlaybackRate_timeout = 0;\r
213     }\r
214 \r
215     checkPlaybackRate_media = media;\r
216     checkPlaybackRate_playbackRate = playbackRate;\r
217     checkPlaybackRate_seconds = seconds;\r
218     checkPlaybackRate_tolerance = tolerance;\r
219     checkPlaybackRate_callback = callback;\r
220     checkPlaybackRate_time = media.currentTime;\r
221     checkPlaybackRate_timeout = window.setTimeout("checkPlaybackRate_check();", 1000 * seconds);\r
222 }\r
223 \r
224 //\r
225 // Returns whether the given time has been buffered\r
226 //\r
227 function isTimeBuffered(media, time)\r
228 {\r
229     for (var i=0; i < media.buffered.length; i++)\r
230     {\r
231         if (media.buffered.start(i) <= time && time <= media.buffered.end(i))\r
232         {\r
233             return true;\r
234         }\r
235     }\r
236 \r
237     return false;\r
238 }\r
239 \r
240 var waitForTimeBuffered_media = null;\r
241 var waitForTimeBuffered_time = -1;\r
242 var waitForTimeBuffered_callback = function(){};\r
243 var waitForTimeBuffered_interval = 0;\r
244 \r
245 function waitForTimeBuffered_check()\r
246 {\r
247     if (isTimeBuffered(waitForTimeBuffered_media, waitForTimeBuffered_time))\r
248     {\r
249         window.clearInterval(waitForTimeBuffered_interval);\r
250         waitForTimeBuffered_interval = 0;\r
251         waitForTimeBuffered_callback();\r
252     }\r
253 }\r
254 \r
255 //\r
256 // Waits for a time to be buffered by polling\r
257 //\r
258 function waitForTimeBuffered(media, time, callback)\r
259 {\r
260     waitForTimeBuffered_media = media;\r
261     waitForTimeBuffered_time = time;\r
262     waitForTimeBuffered_callback = callback;\r
263 \r
264     if (waitForTimeBuffered_interval != 0)\r
265     {\r
266         window.clearInterval(waitForTimeBuffered_interval);\r
267         waitForTimeBuffered_interval = 0;\r
268     }\r
269 \r
270     waitForTimeBuffered_interval = setInterval("waitForTimeBuffered_check();", 250);\r
271 }\r
272 \r
273 //\r
274 // Makes sure that the media element is audible.  This is necessary because\r
275 // user agents may remember volume settings for media elements, on a per-domain\r
276 // basis or otherwise\r
277 //\r
278 function ensureAudible(media)\r
279 {\r
280     media.muted = false;\r
281     media.volume = 1.0;\r
282 }\r