OLD | NEW |
1 <html> | 1 <html> |
2 <head> | 2 <head> |
| 3 <script src="../resources/testharness.js"></script> |
| 4 <script src="../resources/testharnessreport.js"></script> |
3 <script src=media-file.js></script> | 5 <script src=media-file.js></script> |
4 <script src=video-test.js></script> | |
5 | 6 |
6 <script> | 7 <script> |
7 // This is testing the behavior of play() with regards to the returned | 8 // This is testing the behavior of play() with regards to the returned |
8 // promise. This test file is creating a small framework in order to be able | 9 // promise. This test file is creating a small framework in order to be able |
9 // to test different cases easily and independently of each other. | 10 // to test different cases easily and independently of each other. |
10 // | 11 // |
11 // All tests have to be part of the TESTS array. When the page is loaded, | 12 // All tests have to be part of the TESTS array. When the page is loaded, |
12 // first function in the array is ran. A test is considered done when the | 13 // first function in the array is ran. A test is considered done when the |
13 // promise returned by mediaElement.play() is resolved or rejected. Each | 14 // promise returned by mediaElement.play() is resolved or rejected. Each |
14 // test then needs to call play() once which wraps this logic. When a test | 15 // test then needs to call play() once which wraps this logic. When a test |
15 // is finished, the next test in the array is ran until the entire array | 16 // is finished, the next test in the array is ran until the entire array |
16 // was processed. | 17 // was processed. |
17 // | 18 // |
18 // Each test should start by prting its name in order to facilitate reading | 19 // Each test should start by prting its name in order to facilitate reading |
19 // the output. | 20 // the output. |
20 | 21 |
| 22 // This is initialized during the test setup. |
| 23 var gMediaElement = null; |
| 24 |
21 function runNextTestOrFinish() | 25 function runNextTestOrFinish() |
22 { | 26 { |
23 currentTest++; | 27 currentTestIndex++; |
24 if (currentTest >= TESTS.length) { | 28 if (currentTestIndex >= TESTS.length) { |
25 endTest(); | 29 currentTest.done(); |
26 return; | 30 return; |
27 } | 31 } |
28 | 32 |
29 consoleWrite(""); | 33 var previousTest = currentTest; |
30 TESTS[currentTest](); | 34 |
| 35 var test = TESTS[currentTestIndex]; |
| 36 currentTest = async_test(test.description); |
| 37 if (previousTest) |
| 38 previousTest.done(); |
| 39 test.run(currentTest); |
31 } | 40 } |
32 | 41 |
33 function play() | 42 function play() |
34 { | 43 { |
35 return mediaElement.play().then(function() { | 44 // TODO: see if possible to do something like that in a clean fashion. |
36 consoleWrite("Promise Resolved"); | 45 |
37 }, function(e) { | 46 // return mediaElement.play().then(function() { |
38 consoleWrite("Promise Failed with " + e.name); | 47 // consoleWrite("Promise Resolved"); |
39 }).then(runNextTestOrFinish); | 48 // }, function(e) { |
| 49 // consoleWrite("Promise Failed with " + e.name); |
| 50 // }).then(runNextTestOrFinish); |
40 } | 51 } |
41 | 52 |
42 function playWithUserGesture() | 53 function playWithUserGesture() |
43 { | 54 { |
| 55 // TODO: convert to work as a manual test. |
| 56 |
44 if (!window.eventSender) { | 57 if (!window.eventSender) { |
45 failTest("No window.eventSender"); | 58 failTest("No window.eventSender"); |
46 return; | 59 return; |
47 } | 60 } |
48 | 61 |
49 var target = document.querySelector("p"); | 62 var target = document.querySelector("p"); |
50 target.onclick = function() { | 63 target.onclick = function() { |
51 play(); | 64 play(); |
52 target.onclick = null; | 65 target.onclick = null; |
53 }; | 66 }; |
54 | 67 |
55 var boundingRect = target.getBoundingClientRect(); | 68 var boundingRect = target.getBoundingClientRect(); |
56 var x = boundingRect.left + (boundingRect.width / 2); | 69 var x = boundingRect.left + (boundingRect.width / 2); |
57 var y = boundingRect.top + (boundingRect.height / 2); | 70 var y = boundingRect.top + (boundingRect.height / 2); |
58 | 71 |
59 eventSender.mouseMoveTo(x, y); | 72 eventSender.mouseMoveTo(x, y); |
60 eventSender.mouseDown(); | 73 eventSender.mouseDown(); |
61 eventSender.mouseUp(); | 74 eventSender.mouseUp(); |
62 } | 75 } |
63 | 76 |
64 var currentTest = -1; | 77 var currentTestIndex = -1; |
| 78 var currentTest = null; |
65 | 79 |
66 var TESTS = [ | 80 var TESTS = [ |
67 // Test that play() on an element that is currently loading returns a | |
68 // promise which resolves successfuly. | |
69 function playLoading() | |
70 { | 81 { |
71 consoleWrite("playLoading()"); | 82 description: "Test that play() on an element that is currently loadi
ng returns a promise which resolves successfuly.", |
72 internals.settings.setMediaPlaybackRequiresUserGesture(false); | 83 run: |
73 | 84 function playLoading(t) |
74 run("mediaElement = document.createElement('audio')"); | 85 { |
75 var mediaFile = findMediaFile("audio", "content/test"); | 86 var mediaElement = document.createElement('audio'); |
76 run("mediaElement.src = '" + mediaFile + "'"); | 87 mediaElement.src = findMediaFile("audio", "content/test"); |
77 | 88 |
78 waitForEvent('playing'); | 89 // TODO: add test checking the order between playing and the pro
mise. |
79 play(); | 90 |
| 91 mediaElement.play().then(function() { |
| 92 }, function(e) { |
| 93 assert_unreached("Promise should be successful.") |
| 94 }).then(runNextTestOrFinish); |
| 95 } |
80 }, | 96 }, |
81 | 97 |
82 // Test that play() on an element that is already loaded returns a | |
83 // promise which which resolves successfuly. | |
84 function playLoaded() | |
85 { | 98 { |
86 consoleWrite("playLoaded()"); | 99 description: "Test that play() on an element that is already loaded
returns a promise which which resolves successfuly.", |
87 internals.settings.setMediaPlaybackRequiresUserGesture(false); | 100 run: |
88 | 101 function playLoaded(t) |
89 run("mediaElement = document.createElement('audio')"); | 102 { |
90 var mediaFile = findMediaFile("audio", "content/test"); | 103 var mediaElement = document.createElement('audio'); |
91 run("mediaElement.src = '" + mediaFile + "'"); | 104 mediaElement.src = findMediaFile("audio", "content/test"); |
92 | 105 |
93 waitForEvent('playing'); | 106 mediaElement.addEventListener('canplaythrough', t.step_func(func
tion() { |
94 | 107 assert_equals(mediaElement.readyState, HTMLMediaElement.HAVE
_ENOUGH_DATA); |
95 waitForEvent('canplaythrough', function() { | 108 assert_true(mediaElement.paused); |
96 testExpected(HTMLMediaElement.HAVE_ENOUGH_DATA, mediaElement.rea
dyState); | 109 |
97 testExpected(true, mediaElement.paused) | 110 // TODO: refactor |
98 | 111 mediaElement.play().then(function() { |
99 play(); | 112 }, function(e) { |
100 }); | 113 assert_unreached("Promise should be successful.") |
101 | 114 }).then(runNextTestOrFinish); |
102 mediaElement.load(); | 115 })); |
| 116 |
| 117 mediaElement.load(); |
| 118 }, |
103 }, | 119 }, |
104 | 120 |
105 // Test that play() on an element when media playback requires a gesture | 121 // // Test that play() on an element that is already loaded returns a |
106 // returns a rejected promise if there is no user gesture. | 122 // // promise which which resolves successfuly. |
107 function playRequiresUserGestureAndHasIt() | 123 // function playLoaded() |
108 { | 124 // { |
109 consoleWrite("playRequiresUserGestureAndHasIt()"); | 125 // consoleWrite("playLoaded()"); |
110 internals.settings.setMediaPlaybackRequiresUserGesture(true); | 126 // internals.settings.setMediaPlaybackRequiresUserGesture(false); |
111 | 127 // |
112 run("mediaElement = document.createElement('audio')"); | 128 // run("mediaElement = document.createElement('audio')"); |
113 var mediaFile = findMediaFile("audio", "content/test"); | 129 // var mediaFile = findMediaFile("audio", "content/test"); |
114 run("mediaElement.src = '" + mediaFile + "'"); | 130 // run("mediaElement.src = '" + mediaFile + "'"); |
115 | 131 // |
116 waitForEvent('playing'); | 132 // waitForEvent('playing'); |
117 playWithUserGesture(); | 133 // |
118 }, | 134 // waitForEvent('canplaythrough', function() { |
119 | 135 // testExpected(HTMLMediaElement.HAVE_ENOUGH_DATA, mediaElement.
readyState); |
120 // Test that play() on an element when media playback requires a gesture | 136 // testExpected(true, mediaElement.paused) |
121 // returns a resolved promise if there is a user gesture. | 137 // |
122 function playRequiresUserGestureAndDoesNotHaveIt() | 138 // play(); |
123 { | 139 // }); |
124 consoleWrite("playRequiresUserGestureAndDoesNotHaveIt()"); | 140 // |
125 internals.settings.setMediaPlaybackRequiresUserGesture(true); | 141 // mediaElement.load(); |
126 | 142 // }, |
127 run("mediaElement = document.createElement('audio')"); | 143 // |
128 var mediaFile = findMediaFile("audio", "content/test"); | 144 // // Test that play() on an element when media playback requires a gest
ure |
129 run("mediaElement.src = '" + mediaFile + "'"); | 145 // // returns a rejected promise if there is no user gesture. |
130 | 146 // function playRequiresUserGestureAndHasIt() |
131 waitForEvent('playing'); | 147 // { |
132 play(); | 148 // consoleWrite("playRequiresUserGestureAndHasIt()"); |
133 }, | 149 // internals.settings.setMediaPlaybackRequiresUserGesture(true); |
134 | 150 // |
135 // Test that play() on an element with an unsupported content will | 151 // run("mediaElement = document.createElement('audio')"); |
136 // return a rejected promise. | 152 // var mediaFile = findMediaFile("audio", "content/test"); |
137 function playNotSupportedContent() | 153 // run("mediaElement.src = '" + mediaFile + "'"); |
138 { | 154 // |
139 consoleWrite("playNotSupportedContent()"); | 155 // waitForEvent('playing'); |
140 internals.settings.setMediaPlaybackRequiresUserGesture(false); | 156 // playWithUserGesture(); |
141 | 157 // }, |
142 run("mediaElement = document.createElement('audio')"); | 158 // |
143 var mediaFile = findMediaFile("audio", "content/garbage"); | 159 // // Test that play() on an element when media playback requires a gest
ure |
144 run("mediaElement.src = '" + mediaFile + "'"); | 160 // // returns a resolved promise if there is a user gesture. |
145 | 161 // function playRequiresUserGestureAndDoesNotHaveIt() |
146 waitForEvent('playing'); | 162 // { |
147 waitForEvent('error', function() { | 163 // consoleWrite("playRequiresUserGestureAndDoesNotHaveIt()"); |
148 testExpected("mediaElement.error", "[object MediaError]"); | 164 // internals.settings.setMediaPlaybackRequiresUserGesture(true); |
149 testExpected("mediaElement.error.code", MediaError.MEDIA_ERR_SRC
_NOT_SUPPORTED); | 165 // |
150 }); | 166 // run("mediaElement = document.createElement('audio')"); |
151 play(); | 167 // var mediaFile = findMediaFile("audio", "content/test"); |
152 }, | 168 // run("mediaElement.src = '" + mediaFile + "'"); |
153 | 169 // |
154 // Test that play() returns a resolved promise if called after the | 170 // waitForEvent('playing'); |
155 // element suffered from a decode error. | 171 // play(); |
156 function playDecodeError() | 172 // }, |
157 { | 173 // |
158 consoleWrite("playDecodeError()"); | 174 // // Test that play() on an element with an unsupported content will |
159 internals.settings.setMediaPlaybackRequiresUserGesture(false); | 175 // // return a rejected promise. |
160 | 176 // function playNotSupportedContent() |
161 run("mediaElement = document.createElement('audio')"); | 177 // { |
162 var mediaFile = findMediaFile("audio", "content/test"); | 178 // consoleWrite("playNotSupportedContent()"); |
163 run("mediaElement.src = '" + mediaFile + "'"); | 179 // internals.settings.setMediaPlaybackRequiresUserGesture(false); |
164 | 180 // |
165 waitForEvent('playing'); | 181 // run("mediaElement = document.createElement('audio')"); |
166 waitForEvent('error', function() { | 182 // var mediaFile = findMediaFile("audio", "content/garbage"); |
167 testExpected("mediaElement.error", "[object MediaError]"); | 183 // run("mediaElement.src = '" + mediaFile + "'"); |
168 testExpected("mediaElement.error.code", MediaError.MEDIA_ERR_DEC
ODE); | 184 // |
169 }); | 185 // waitForEvent('playing'); |
170 | 186 // waitForEvent('error', function() { |
171 // The setMediaElementNetworkState() method requires metadata to be | 187 // testExpected("mediaElement.error", "[object MediaError]"); |
172 // available. | 188 // testExpected("mediaElement.error.code", MediaError.MEDIA_ERR_
SRC_NOT_SUPPORTED); |
173 waitForEvent('loadedmetadata', function() { | 189 // }); |
174 internals.setMediaElementNetworkState(mediaElement, 6 /* NetworkSt
ateDecodeError */); | 190 // play(); |
175 play(); | 191 // }, |
176 }); | 192 // |
177 }, | 193 // // Test that play() returns a resolved promise if called after the |
178 | 194 // // element suffered from a decode error. |
179 // Test that play() returns a resolved promise if called after the | 195 // function playDecodeError() |
180 // element suffered from a network error. | 196 // { |
181 function playNetworkError() | 197 // consoleWrite("playDecodeError()"); |
182 { | 198 // internals.settings.setMediaPlaybackRequiresUserGesture(false); |
183 consoleWrite("playNetworkError()"); | 199 // |
184 internals.settings.setMediaPlaybackRequiresUserGesture(false); | 200 // run("mediaElement = document.createElement('audio')"); |
185 | 201 // var mediaFile = findMediaFile("audio", "content/test"); |
186 run("mediaElement = document.createElement('audio')"); | 202 // run("mediaElement.src = '" + mediaFile + "'"); |
187 var mediaFile = findMediaFile("audio", "content/test"); | 203 // |
188 run("mediaElement.src = '" + mediaFile + "'"); | 204 // waitForEvent('playing'); |
189 | 205 // waitForEvent('error', function() { |
190 waitForEvent('playing'); | 206 // testExpected("mediaElement.error", "[object MediaError]"); |
191 waitForEvent('error', function() { | 207 // testExpected("mediaElement.error.code", MediaError.MEDIA_ERR_
DECODE); |
192 testExpected("mediaElement.error", "[object MediaError]"); | 208 // }); |
193 testExpected("mediaElement.error.code", MediaError.MEDIA_ERR_NET
WORK); | 209 // |
194 }); | 210 // // The setMediaElementNetworkState() method requires metadata to
be |
195 | 211 // // available. |
196 // The setMediaElementNetworkState() method requires metadata to be | 212 // waitForEvent('loadedmetadata', function() { |
197 // available. | 213 // internals.setMediaElementNetworkState(mediaElement, 6 /* Networ
kStateDecodeError */); |
198 waitForEvent('loadedmetadata', function() { | 214 // play(); |
199 internals.setMediaElementNetworkState(mediaElement, 5 /* NetworkSt
ateNetworkError */); | 215 // }); |
200 play(); | 216 // }, |
201 }); | 217 // |
202 }, | 218 // // Test that play() returns a resolved promise if called after the |
203 | 219 // // element suffered from a network error. |
204 // Test that play() returns a rejected promise if the element is | 220 // function playNetworkError() |
205 // suferring from a not supported error. | 221 // { |
206 function playWithErrorAlreadySet() | 222 // consoleWrite("playNetworkError()"); |
207 { | 223 // internals.settings.setMediaPlaybackRequiresUserGesture(false); |
208 consoleWrite("playWithErrorAlreadySet()"); | 224 // |
209 internals.settings.setMediaPlaybackRequiresUserGesture(false); | 225 // run("mediaElement = document.createElement('audio')"); |
210 | 226 // var mediaFile = findMediaFile("audio", "content/test"); |
211 run("mediaElement = document.createElement('audio')"); | 227 // run("mediaElement.src = '" + mediaFile + "'"); |
212 var mediaFile = findMediaFile("audio", "content/garbage"); | 228 // |
213 run("mediaElement.src = '" + mediaFile + "'"); | 229 // waitForEvent('playing'); |
214 | 230 // waitForEvent('error', function() { |
215 run("mediaElement.load()"); | 231 // testExpected("mediaElement.error", "[object MediaError]"); |
216 | 232 // testExpected("mediaElement.error.code", MediaError.MEDIA_ERR_
NETWORK); |
217 waitForEvent('playing'); | 233 // }); |
218 waitForEvent('error', function() { | 234 // |
219 testExpected("mediaElement.error", "[object MediaError]"); | 235 // // The setMediaElementNetworkState() method requires metadata to
be |
220 testExpected("mediaElement.error.code", MediaError.MEDIA_ERR_SRC
_NOT_SUPPORTED); | 236 // // available. |
221 play(); | 237 // waitForEvent('loadedmetadata', function() { |
222 }); | 238 // internals.setMediaElementNetworkState(mediaElement, 5 /* Networ
kStateNetworkError */); |
223 }, | 239 // play(); |
224 | 240 // }); |
225 // Test that play() returns a resolved promise if the element had its | 241 // }, |
226 // source changed after suffering from an error. | 242 // |
227 function playSrcChangedAfterError() | 243 // // Test that play() returns a rejected promise if the element is |
228 { | 244 // // suferring from a not supported error. |
229 consoleWrite("playSrcChangedAfterError()"); | 245 // function playWithErrorAlreadySet() |
230 internals.settings.setMediaPlaybackRequiresUserGesture(false); | 246 // { |
231 | 247 // consoleWrite("playWithErrorAlreadySet()"); |
232 run("mediaElement = document.createElement('audio')"); | 248 // internals.settings.setMediaPlaybackRequiresUserGesture(false); |
233 var mediaFile = findMediaFile("audio", "content/garbage"); | 249 // |
234 run("mediaElement.src = '" + mediaFile + "'"); | 250 // run("mediaElement = document.createElement('audio')"); |
235 | 251 // var mediaFile = findMediaFile("audio", "content/garbage"); |
236 run("mediaElement.load()"); | 252 // run("mediaElement.src = '" + mediaFile + "'"); |
237 | 253 // |
238 waitForEvent('error', function() { | 254 // run("mediaElement.load()"); |
239 testExpected("mediaElement.error", "[object MediaError]"); | 255 // |
240 testExpected("mediaElement.error.code", MediaError.MEDIA_ERR_SRC
_NOT_SUPPORTED); | 256 // waitForEvent('playing'); |
241 | 257 // waitForEvent('error', function() { |
242 mediaFile = findMediaFile("audio", "content/test"); | 258 // testExpected("mediaElement.error", "[object MediaError]"); |
243 run("mediaElement.src = '" + mediaFile + "'"); | 259 // testExpected("mediaElement.error.code", MediaError.MEDIA_ERR_
SRC_NOT_SUPPORTED); |
244 | 260 // play(); |
245 waitForEvent('playing'); | 261 // }); |
246 waitForEvent('loadedmetadata', function() { | 262 // }, |
247 play(); | 263 // |
248 }); | 264 // // Test that play() returns a resolved promise if the element had its |
249 }); | 265 // // source changed after suffering from an error. |
250 }, | 266 // function playSrcChangedAfterError() |
251 | 267 // { |
252 // Test that play() returns a rejected promise if the element had an | 268 // consoleWrite("playSrcChangedAfterError()"); |
253 // error and just changed its source. | 269 // internals.settings.setMediaPlaybackRequiresUserGesture(false); |
254 function playRaceWithSrcChangeError() | 270 // |
255 { | 271 // run("mediaElement = document.createElement('audio')"); |
256 consoleWrite("playRaceWithSrcChangeError()"); | 272 // var mediaFile = findMediaFile("audio", "content/garbage"); |
257 internals.settings.setMediaPlaybackRequiresUserGesture(false); | 273 // run("mediaElement.src = '" + mediaFile + "'"); |
258 | 274 // |
259 run("mediaElement = document.createElement('audio')"); | 275 // run("mediaElement.load()"); |
260 var mediaFile = findMediaFile("audio", "content/garbage"); | 276 // |
261 run("mediaElement.src = '" + mediaFile + "'"); | 277 // waitForEvent('error', function() { |
262 | 278 // testExpected("mediaElement.error", "[object MediaError]"); |
263 run("mediaElement.load()"); | 279 // testExpected("mediaElement.error.code", MediaError.MEDIA_ERR_
SRC_NOT_SUPPORTED); |
264 | 280 // |
265 waitForEvent('error', function() { | 281 // mediaFile = findMediaFile("audio", "content/test"); |
266 testExpected("mediaElement.error", "[object MediaError]"); | 282 // run("mediaElement.src = '" + mediaFile + "'"); |
267 testExpected("mediaElement.error.code", MediaError.MEDIA_ERR_SRC
_NOT_SUPPORTED); | 283 // |
268 | 284 // waitForEvent('playing'); |
269 mediaFile = findMediaFile("audio", "content/test"); | 285 // waitForEvent('loadedmetadata', function() { |
270 run("mediaElement.src = '" + mediaFile + "'"); | 286 // play(); |
271 | 287 // }); |
272 // TODO(mlamouri): if we print the 'playing' event, it seems | 288 // }); |
273 // that it actually happens later. It's unclear why. | 289 // }, |
274 play(); | 290 // |
275 }); | 291 // // Test that play() returns a rejected promise if the element had an |
276 }, | 292 // // error and just changed its source. |
277 | 293 // function playRaceWithSrcChangeError() |
278 // Test that play() returns a resolved promise when calling play() then | 294 // { |
279 // pause() on an element that already has enough data to play. In other | 295 // consoleWrite("playRaceWithSrcChangeError()"); |
280 // words, pause() doesn't cancel play() because it was resolved | 296 // internals.settings.setMediaPlaybackRequiresUserGesture(false); |
281 // immediately. | 297 // |
282 function playFollowedByPauseWhenLoaded() | 298 // run("mediaElement = document.createElement('audio')"); |
283 { | 299 // var mediaFile = findMediaFile("audio", "content/garbage"); |
284 consoleWrite("playFollowedByPauseWhenLoaded()"); | 300 // run("mediaElement.src = '" + mediaFile + "'"); |
285 internals.settings.setMediaPlaybackRequiresUserGesture(false); | 301 // |
286 | 302 // run("mediaElement.load()"); |
287 run("mediaElement = document.createElement('audio')"); | 303 // |
288 var mediaFile = findMediaFile("audio", "content/test"); | 304 // waitForEvent('error', function() { |
289 run("mediaElement.src = '" + mediaFile + "'"); | 305 // testExpected("mediaElement.error", "[object MediaError]"); |
290 | 306 // testExpected("mediaElement.error.code", MediaError.MEDIA_ERR_
SRC_NOT_SUPPORTED); |
291 run("mediaElement.load()"); | 307 // |
292 | 308 // mediaFile = findMediaFile("audio", "content/test"); |
293 waitForEvent('canplaythrough', function() { | 309 // run("mediaElement.src = '" + mediaFile + "'"); |
294 waitForEvent('playing'); | 310 // |
295 testExpected("mediaElement.readyState", HTMLMediaElement.HAVE_EN
OUGH_DATA); | 311 // // TODO(mlamouri): if we print the 'playing' event, it seems |
296 play(); | 312 // // that it actually happens later. It's unclear why. |
297 testExpected("mediaElement.paused", false); | 313 // play(); |
298 mediaElement.pause(); | 314 // }); |
299 testExpected("mediaElement.paused", true); | 315 // }, |
300 }); | 316 // |
301 }, | 317 // // Test that play() returns a resolved promise when calling play() th
en |
302 | 318 // // pause() on an element that already has enough data to play. In oth
er |
303 // Test that play() returns a rejected promise when calling play() then | 319 // // words, pause() doesn't cancel play() because it was resolved |
304 // pause() on an element that doesn't have enough data to play. In other | 320 // // immediately. |
305 // words, pause() cancels play() before it can be resolved. | 321 // function playFollowedByPauseWhenLoaded() |
306 function playFollowedByPauseWhenLoading() | 322 // { |
307 { | 323 // consoleWrite("playFollowedByPauseWhenLoaded()"); |
308 consoleWrite("playFollowedByPauseWhenLoaded()"); | 324 // internals.settings.setMediaPlaybackRequiresUserGesture(false); |
309 internals.settings.setMediaPlaybackRequiresUserGesture(false); | 325 // |
310 | 326 // run("mediaElement = document.createElement('audio')"); |
311 run("mediaElement = document.createElement('audio')"); | 327 // var mediaFile = findMediaFile("audio", "content/test"); |
312 var mediaFile = findMediaFile("audio", "content/test"); | 328 // run("mediaElement.src = '" + mediaFile + "'"); |
313 run("mediaElement.src = '" + mediaFile + "'"); | 329 // |
314 | 330 // run("mediaElement.load()"); |
315 waitForEvent('playing'); | 331 // |
316 testExpected("mediaElement.readyState", HTMLMediaElement.HAVE_NOTHIN
G); | 332 // waitForEvent('canplaythrough', function() { |
317 play(); | 333 // waitForEvent('playing'); |
318 testExpected("mediaElement.paused", false); | 334 // testExpected("mediaElement.readyState", HTMLMediaElement.HAVE
_ENOUGH_DATA); |
319 mediaElement.pause(); | 335 // play(); |
320 testExpected("mediaElement.paused", true); | 336 // testExpected("mediaElement.paused", false); |
321 }, | 337 // mediaElement.pause(); |
322 | 338 // testExpected("mediaElement.paused", true); |
323 // Test that load() rejects all the pending play() promises. | 339 // }); |
324 function loadRejectPendingPromises() | 340 // }, |
325 { | 341 // |
326 consoleWrite("loadRejectPendingPromises()"); | 342 // // Test that play() returns a rejected promise when calling play() th
en |
327 internals.settings.setMediaPlaybackRequiresUserGesture(false); | 343 // // pause() on an element that doesn't have enough data to play. In ot
her |
328 | 344 // // words, pause() cancels play() before it can be resolved. |
329 run("mediaElement = document.createElement('audio')"); | 345 // function playFollowedByPauseWhenLoading() |
330 | 346 // { |
331 play(); // the promise will be left pending. | 347 // consoleWrite("playFollowedByPauseWhenLoaded()"); |
332 | 348 // internals.settings.setMediaPlaybackRequiresUserGesture(false); |
333 waitForEvent('playing'); | 349 // |
334 run("mediaElement.load()"); | 350 // run("mediaElement = document.createElement('audio')"); |
335 }, | 351 // var mediaFile = findMediaFile("audio", "content/test"); |
336 | 352 // run("mediaElement.src = '" + mediaFile + "'"); |
337 // Test that changing the src rejects the pending play() promises. | 353 // |
338 function newSrcRejectPendingPromises() | 354 // waitForEvent('playing'); |
339 { | 355 // testExpected("mediaElement.readyState", HTMLMediaElement.HAVE_NOT
HING); |
340 consoleWrite("newSrcRejectPendingPromises()"); | 356 // play(); |
341 internals.settings.setMediaPlaybackRequiresUserGesture(false); | 357 // testExpected("mediaElement.paused", false); |
342 | 358 // mediaElement.pause(); |
343 run("mediaElement = document.createElement('audio')"); | 359 // testExpected("mediaElement.paused", true); |
344 | 360 // }, |
345 play(); // the promise will be left pending. | 361 // |
346 | 362 // // Test that load() rejects all the pending play() promises. |
347 var mediaFile = findMediaFile("audio", "content/test"); | 363 // function loadRejectPendingPromises() |
348 run("mediaElement.src = '" + mediaFile + "'"); | 364 // { |
349 }, | 365 // consoleWrite("loadRejectPendingPromises()"); |
350 | 366 // internals.settings.setMediaPlaybackRequiresUserGesture(false); |
351 // Test ordering of events and promises. | 367 // |
352 // This is testing a bug in Blink, see https://crbug.com/587871 | 368 // run("mediaElement = document.createElement('audio')"); |
353 function testEventAndPromiseOrdering() | 369 // |
354 { | 370 // play(); // the promise will be left pending. |
355 consoleWrite("testEventAndPromiseOrdering"); | 371 // |
356 internals.settings.setMediaPlaybackRequiresUserGesture(false); | 372 // waitForEvent('playing'); |
357 | 373 // run("mediaElement.load()"); |
358 var promiseResolver = null; | 374 // }, |
359 var p = new Promise(function(resolve, reject) { | 375 // |
360 promiseResolver = resolve; | 376 // // Test that changing the src rejects the pending play() promises. |
361 }); | 377 // function newSrcRejectPendingPromises() |
362 p.then(function() { | 378 // { |
363 consoleWrite("Should be after the play() promise is resolved"); | 379 // consoleWrite("newSrcRejectPendingPromises()"); |
364 }); | 380 // internals.settings.setMediaPlaybackRequiresUserGesture(false); |
365 | 381 // |
366 run("mediaElement = document.createElement('audio')"); | 382 // run("mediaElement = document.createElement('audio')"); |
367 var mediaFile = findMediaFile("audio", "content/test"); | 383 // |
368 run("mediaElement.src = '" + mediaFile + "'"); | 384 // play(); // the promise will be left pending. |
369 | 385 // |
370 play(); | 386 // var mediaFile = findMediaFile("audio", "content/test"); |
371 waitForEvent('playing', function() { | 387 // run("mediaElement.src = '" + mediaFile + "'"); |
372 promiseResolver(); | 388 // }, |
373 }); | 389 // |
374 } | 390 // // Test ordering of events and promises. |
| 391 // // This is testing a bug in Blink, see https://crbug.com/587871 |
| 392 // function testEventAndPromiseOrdering() |
| 393 // { |
| 394 // consoleWrite("testEventAndPromiseOrdering"); |
| 395 // internals.settings.setMediaPlaybackRequiresUserGesture(false); |
| 396 // |
| 397 // var promiseResolver = null; |
| 398 // var p = new Promise(function(resolve, reject) { |
| 399 // promiseResolver = resolve; |
| 400 // }); |
| 401 // p.then(function() { |
| 402 // consoleWrite("Should be after the play() promise is resolved"
); |
| 403 // }); |
| 404 // |
| 405 // run("mediaElement = document.createElement('audio')"); |
| 406 // var mediaFile = findMediaFile("audio", "content/test"); |
| 407 // run("mediaElement.src = '" + mediaFile + "'"); |
| 408 // |
| 409 // play(); |
| 410 // waitForEvent('playing', function() { |
| 411 // promiseResolver(); |
| 412 // }); |
| 413 // } |
375 ]; | 414 ]; |
376 | 415 |
| 416 function requestUserGesture() |
| 417 { |
| 418 // TODO: the goal here is to call load() on gMediaElement so it will be |
| 419 // registered as getting user gesture and play() and load() will work. |
| 420 } |
| 421 |
377 function start() | 422 function start() |
378 { | 423 { |
379 runNextTestOrFinish(); | 424 var gMediaElement = document.createElement('audio'); |
| 425 gMediaElement.src = findMediaFile("audio", "content/test"); |
| 426 |
| 427 gMediaElement.play().then(function() { |
| 428 }, function() { |
| 429 if ('internals' in window) |
| 430 internals.settings.setMediaPlaybackRequiresUserGesture(false); |
| 431 else |
| 432 return requestUserGesture(); |
| 433 }).then(runNextTestOrFinish); |
380 } | 434 } |
381 | 435 |
382 </script> | 436 </script> |
383 </head> | 437 </head> |
384 | 438 |
385 <body onload="start()"> | 439 <body onload="start()"> |
386 | 440 |
387 <p>Test the play() behaviour with regards to the returned promise for media elem
ents.</p> | 441 <p>Test the play() behaviour with regards to the returned promise for media elem
ents.</p> |
388 | 442 |
389 </body> | 443 </body> |
390 </html> | 444 </html> |
OLD | NEW |