Fri, 16 Jan 2015 04:50:19 +0100
Replace accessor implementation with direct member state manipulation, by
request https://trac.torproject.org/projects/tor/ticket/9701#comment:32
michael@0 | 1 | <!DOCTYPE HTML> |
michael@0 | 2 | <html> |
michael@0 | 3 | <!-- |
michael@0 | 4 | https://bugzilla.mozilla.org/show_bug.cgi?id=548523 |
michael@0 | 5 | --> |
michael@0 | 6 | <head> |
michael@0 | 7 | <title>Test for Bug 548523</title> |
michael@0 | 8 | <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> |
michael@0 | 9 | <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> |
michael@0 | 10 | <script type="text/javascript" src="manifest.js"></script> |
michael@0 | 11 | </head> |
michael@0 | 12 | <body> |
michael@0 | 13 | <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=548523">Mozilla Bug 548523</a> |
michael@0 | 14 | <p id="display"></p> |
michael@0 | 15 | <div id="content" style="display: none"> |
michael@0 | 16 | |
michael@0 | 17 | </div> |
michael@0 | 18 | <!-- <button onClick="SimpleTest.finish();">Finish</button> --> |
michael@0 | 19 | <div>Tests complete: <span id="log" style="font-size: small;"></span></div> |
michael@0 | 20 | <pre id="test"> |
michael@0 | 21 | <script type="application/javascript"> |
michael@0 | 22 | |
michael@0 | 23 | /** Test for Bug 548523 **/ |
michael@0 | 24 | |
michael@0 | 25 | var manager = new MediaTestManager; |
michael@0 | 26 | |
michael@0 | 27 | manager.onFinished = function() { |
michael@0 | 28 | is(gotLoadEvent, true, "Should not have delayed the load event indefinitely"); |
michael@0 | 29 | }; |
michael@0 | 30 | |
michael@0 | 31 | var test = getPlayableVideo(gSeekTests); |
michael@0 | 32 | var baseName = test.name; |
michael@0 | 33 | var gTest = test; |
michael@0 | 34 | var bogusSrc = "bogus.duh"; |
michael@0 | 35 | var bogusType = "video/bogus"; |
michael@0 | 36 | var gotLoadEvent = false; |
michael@0 | 37 | var finished = false; |
michael@0 | 38 | |
michael@0 | 39 | addLoadEvent(function() {gotLoadEvent=true;}); |
michael@0 | 40 | |
michael@0 | 41 | function log(m) { |
michael@0 | 42 | var l = document.getElementById("log"); |
michael@0 | 43 | l.innerHTML += m; |
michael@0 | 44 | } |
michael@0 | 45 | |
michael@0 | 46 | function maybeFinish(v, n) { |
michael@0 | 47 | if (v._finished) { |
michael@0 | 48 | return; |
michael@0 | 49 | } |
michael@0 | 50 | v._finished = true; |
michael@0 | 51 | log(n + ","); |
michael@0 | 52 | removeNodeAndSource(v); |
michael@0 | 53 | manager.finished(v.token); |
michael@0 | 54 | } |
michael@0 | 55 | |
michael@0 | 56 | function filename(uri) { |
michael@0 | 57 | return uri.substr(uri.lastIndexOf("/")+1); |
michael@0 | 58 | } |
michael@0 | 59 | |
michael@0 | 60 | // Every test must have a setup(v) function, and must call maybeFinish() when test is complete. |
michael@0 | 61 | var tests = [ |
michael@0 | 62 | { |
michael@0 | 63 | // 1. Add preload:none video with src to document. Load should halt at NETWORK_IDLE and HAVE_NOTHING, |
michael@0 | 64 | // after receiving a suspend event. Should not receive loaded events until after we call load(). |
michael@0 | 65 | // Note the suspend event is explictly sent by our "stop the load" code, but other tests can't rely |
michael@0 | 66 | // on it for the preload:metadata case, as there can be multiple suspend events when loading metadata. |
michael@0 | 67 | suspend: |
michael@0 | 68 | function(e) { |
michael@0 | 69 | var v = e.target; |
michael@0 | 70 | is(v._gotLoadStart, true, "(1) Must get loadstart."); |
michael@0 | 71 | is(v._gotLoadedMetaData, false, "(1) Must not get loadedmetadata."); |
michael@0 | 72 | is(v.readyState, v.HAVE_NOTHING, "(1) ReadyState must be HAVE_NOTHING"); |
michael@0 | 73 | // bug 962949 |
michael@0 | 74 | // is(v.networkState, v.NETWORK_IDLE, "(1) NetworkState must be NETWORK_IDLE"); |
michael@0 | 75 | maybeFinish(v, 1); |
michael@0 | 76 | }, |
michael@0 | 77 | |
michael@0 | 78 | setup: |
michael@0 | 79 | function(v) { |
michael@0 | 80 | v._gotLoadStart = false; |
michael@0 | 81 | v._gotLoadedMetaData = false; |
michael@0 | 82 | v.preload = "none"; |
michael@0 | 83 | v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;}, false); |
michael@0 | 84 | v.addEventListener("loadstart", function(e){v._gotLoadStart = true;}, false); |
michael@0 | 85 | v.addEventListener("suspend", this.suspend, false); |
michael@0 | 86 | v.src = test.name; |
michael@0 | 87 | document.body.appendChild(v); // Causes implicit load, which will be halted due to preload:none. |
michael@0 | 88 | }, |
michael@0 | 89 | |
michael@0 | 90 | name: "test1", |
michael@0 | 91 | }, |
michael@0 | 92 | { |
michael@0 | 93 | // 2. Add preload:metadata video with src to document. Should halt with NETWORK_IDLE, HAVE_CURRENT_DATA |
michael@0 | 94 | // after suspend event and after loadedmetadata. |
michael@0 | 95 | loadeddata: |
michael@0 | 96 | function(e) { |
michael@0 | 97 | var v = e.target; |
michael@0 | 98 | is(v._gotLoadStart, true, "(2) Must get loadstart."); |
michael@0 | 99 | is(v._gotLoadedMetaData, true, "(2) Must get loadedmetadata."); |
michael@0 | 100 | ok(v.readyState >= v.HAVE_CURRENT_DATA, "(2) ReadyState must be >= HAVE_CURRENT_DATA"); |
michael@0 | 101 | // bug 962949 |
michael@0 | 102 | // is(v.networkState, v.NETWORK_IDLE, "(2) NetworkState must be NETWORK_IDLE"); |
michael@0 | 103 | maybeFinish(v, 2); |
michael@0 | 104 | }, |
michael@0 | 105 | |
michael@0 | 106 | setup: |
michael@0 | 107 | function(v) { |
michael@0 | 108 | v._gotLoadStart = false; |
michael@0 | 109 | v._gotLoadedMetaData = false; |
michael@0 | 110 | v.preload = "metadata"; |
michael@0 | 111 | v.addEventListener("loadstart", function(e){v._gotLoadStart = true;}, false); |
michael@0 | 112 | v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;}, false); |
michael@0 | 113 | v.addEventListener("loadeddata", this.loadeddata, false); |
michael@0 | 114 | v.src = test.name; |
michael@0 | 115 | document.body.appendChild(v); // Causes implicit load, which will be halted after |
michael@0 | 116 | // metadata due to preload:metadata. |
michael@0 | 117 | }, |
michael@0 | 118 | |
michael@0 | 119 | name: "test2", |
michael@0 | 120 | }, |
michael@0 | 121 | { |
michael@0 | 122 | // 3. Add preload:auto to document. Should receive canplaythrough eventually. |
michael@0 | 123 | canplaythrough: |
michael@0 | 124 | function(e) { |
michael@0 | 125 | var v = e.target; |
michael@0 | 126 | is(v._gotLoadStart, true, "(3) Must get loadstart."); |
michael@0 | 127 | is(v._gotLoadedMetaData, true, "(3) Must get loadedmetadata."); |
michael@0 | 128 | maybeFinish(v, 3); |
michael@0 | 129 | }, |
michael@0 | 130 | |
michael@0 | 131 | setup: |
michael@0 | 132 | function(v) { |
michael@0 | 133 | v._gotLoadStart = false; |
michael@0 | 134 | v._gotLoadedMetaData = false; |
michael@0 | 135 | v.preload = "auto"; |
michael@0 | 136 | v.addEventListener("loadstart", function(e){v._gotLoadStart = true;}, false); |
michael@0 | 137 | v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;}, false); |
michael@0 | 138 | v.addEventListener("canplaythrough", this.canplaythrough, false); |
michael@0 | 139 | v.src = test.name; // Causes implicit load. |
michael@0 | 140 | document.body.appendChild(v); |
michael@0 | 141 | }, |
michael@0 | 142 | |
michael@0 | 143 | name: "test3", |
michael@0 | 144 | }, |
michael@0 | 145 | { |
michael@0 | 146 | // 4. Add preload:none video to document. Call play(), should load then play through. |
michael@0 | 147 | suspend: |
michael@0 | 148 | function(e) { |
michael@0 | 149 | var v = e.target; |
michael@0 | 150 | if (v._gotSuspend) { |
michael@0 | 151 | return; // We can receive multiple suspend events, like the one after download completes. |
michael@0 | 152 | } |
michael@0 | 153 | v._gotSuspend = true; |
michael@0 | 154 | is(v._gotLoadStart, true, "(4) Must get loadstart."); |
michael@0 | 155 | is(v._gotLoadedMetaData, false, "(4) Must not get loadedmetadata."); |
michael@0 | 156 | is(v.readyState, v.HAVE_NOTHING, "(4) ReadyState must be HAVE_NOTHING"); |
michael@0 | 157 | // bug 962949 |
michael@0 | 158 | // is(v.networkState, v.NETWORK_IDLE, "(4) NetworkState must be NETWORK_IDLE"); |
michael@0 | 159 | v.play(); // Should load and play through. |
michael@0 | 160 | }, |
michael@0 | 161 | |
michael@0 | 162 | ended: |
michael@0 | 163 | function(e) { |
michael@0 | 164 | ok(true, "(4) Got playback ended"); |
michael@0 | 165 | maybeFinish(e.target, 4); |
michael@0 | 166 | }, |
michael@0 | 167 | |
michael@0 | 168 | setup: |
michael@0 | 169 | function(v) { |
michael@0 | 170 | v._gotLoadStart = false; |
michael@0 | 171 | v._gotLoadedMetaData = false; |
michael@0 | 172 | v._gotSuspend = false; |
michael@0 | 173 | v.preload = "none"; |
michael@0 | 174 | v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;}, false); |
michael@0 | 175 | v.addEventListener("loadstart", function(e){v._gotLoadStart = true;}, false); |
michael@0 | 176 | v.addEventListener("suspend", this.suspend, false); |
michael@0 | 177 | v.addEventListener("ended", this.ended, false); |
michael@0 | 178 | v.src = test.name; |
michael@0 | 179 | document.body.appendChild(v); |
michael@0 | 180 | }, |
michael@0 | 181 | |
michael@0 | 182 | name: "test4", |
michael@0 | 183 | }, |
michael@0 | 184 | { |
michael@0 | 185 | // 5. preload:none video without resource, add to document, will implicitly start a |
michael@0 | 186 | // preload:none load. Add a src, it shouldn't load. |
michael@0 | 187 | suspend: |
michael@0 | 188 | function(e) { |
michael@0 | 189 | var v = e.target; |
michael@0 | 190 | is(v._gotLoadStart, true, "(5) Must get loadstart."); |
michael@0 | 191 | is(v._gotLoadedMetaData, false, "(5) Must not get loadedmetadata."); |
michael@0 | 192 | is(v.readyState, v.HAVE_NOTHING, "(5) ReadyState must be HAVE_NOTHING"); |
michael@0 | 193 | // bug 962949 |
michael@0 | 194 | // is(v.networkState, v.NETWORK_IDLE, "(5) NetworkState must be NETWORK_IDLE"); |
michael@0 | 195 | maybeFinish(v, 5); |
michael@0 | 196 | }, |
michael@0 | 197 | |
michael@0 | 198 | setup: |
michael@0 | 199 | function(v) { |
michael@0 | 200 | v._gotLoadStart = false; |
michael@0 | 201 | v._gotLoadedMetaData = false; |
michael@0 | 202 | v.preload = "none"; |
michael@0 | 203 | v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;}, false); |
michael@0 | 204 | v.addEventListener("loadstart", function(e){v._gotLoadStart = true;}, false); |
michael@0 | 205 | v.addEventListener("suspend", this.suspend, false); |
michael@0 | 206 | document.body.appendChild(v); // Causes implicit load, which will be halted due to no resource. |
michael@0 | 207 | v.src = test.name; // Load should start, and halt at preload:none. |
michael@0 | 208 | }, |
michael@0 | 209 | |
michael@0 | 210 | name: "test5", |
michael@0 | 211 | }, |
michael@0 | 212 | { |
michael@0 | 213 | // 6. preload:none video without resource, add to document, will implicitly start a |
michael@0 | 214 | // preload:none load. Add a source, it shouldn't load. |
michael@0 | 215 | suspend: |
michael@0 | 216 | function(e) { |
michael@0 | 217 | var v = e.target; |
michael@0 | 218 | is(v._gotLoadStart, true, "(6) Must get loadstart."); |
michael@0 | 219 | is(v._gotLoadedMetaData, false, "(6) Must not get loadedmetadata."); |
michael@0 | 220 | is(v.readyState, v.HAVE_NOTHING, "(6) ReadyState must be HAVE_NOTHING"); |
michael@0 | 221 | // bug 962949 |
michael@0 | 222 | // is(v.networkState, v.NETWORK_IDLE, "(6) NetworkState must be NETWORK_IDLE"); |
michael@0 | 223 | maybeFinish(v, 6); |
michael@0 | 224 | }, |
michael@0 | 225 | |
michael@0 | 226 | setup: |
michael@0 | 227 | function(v) { |
michael@0 | 228 | v._gotLoadStart = false; |
michael@0 | 229 | v._gotLoadedMetaData = false; |
michael@0 | 230 | v.preload = "none"; |
michael@0 | 231 | v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;}, false); |
michael@0 | 232 | v.addEventListener("loadstart", function(e){v._gotLoadStart = true;}, false); |
michael@0 | 233 | v.addEventListener("suspend", this.suspend, false); |
michael@0 | 234 | document.body.appendChild(v); // Causes implicit load, which will be halted due to no resource. |
michael@0 | 235 | var s = document.createElement("source"); |
michael@0 | 236 | s.src = test.name; |
michael@0 | 237 | s.type = test.type; |
michael@0 | 238 | v.appendChild(s); // Load should start, and halt at preload:none. |
michael@0 | 239 | }, |
michael@0 | 240 | |
michael@0 | 241 | name: "test6", |
michael@0 | 242 | }, |
michael@0 | 243 | { |
michael@0 | 244 | // 7. create a preload:none document with multiple sources, the first of which is invalid. |
michael@0 | 245 | // Add to document, then play. It should load and play through the second source. |
michael@0 | 246 | suspend: |
michael@0 | 247 | function(e) { |
michael@0 | 248 | var v = e.target; |
michael@0 | 249 | if (v._gotSuspend) |
michael@0 | 250 | return; // We can receive multiple suspend events, like the one after download completes. |
michael@0 | 251 | v._gotSuspend = true; |
michael@0 | 252 | is(v._gotLoadStart, true, "(7) Must get loadstart."); |
michael@0 | 253 | is(v._gotLoadedMetaData, false, "(7) Must not get loadedmetadata."); |
michael@0 | 254 | is(v.readyState, v.HAVE_NOTHING, "(7) ReadyState must be HAVE_NOTHING"); |
michael@0 | 255 | // bug 962949 |
michael@0 | 256 | // is(v.networkState, v.NETWORK_IDLE, "(7) NetworkState must be NETWORK_IDLE"); |
michael@0 | 257 | v.play(); // Should load and play through. |
michael@0 | 258 | }, |
michael@0 | 259 | |
michael@0 | 260 | ended: |
michael@0 | 261 | function(e) { |
michael@0 | 262 | ok(true, "(7) Got playback ended"); |
michael@0 | 263 | var v = e.target; |
michael@0 | 264 | is(v._gotErrorEvent, true, "(7) Should get error event from first source load failure"); |
michael@0 | 265 | maybeFinish(v, 7); |
michael@0 | 266 | }, |
michael@0 | 267 | |
michael@0 | 268 | setup: |
michael@0 | 269 | function(v) { |
michael@0 | 270 | v._gotLoadStart = false; |
michael@0 | 271 | v._gotLoadedMetaData = false; |
michael@0 | 272 | v.preload = "none"; |
michael@0 | 273 | v._gotErrorEvent = false; |
michael@0 | 274 | v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;}, false); |
michael@0 | 275 | v.addEventListener("loadstart", function(e){v._gotLoadStart = true;}, false); |
michael@0 | 276 | v.addEventListener("suspend", this.suspend, false); |
michael@0 | 277 | v.addEventListener("ended", this.ended, false); |
michael@0 | 278 | var s1 = document.createElement("source"); |
michael@0 | 279 | s1.src = "not-a-real-file.404" |
michael@0 | 280 | s1.type = test.type; |
michael@0 | 281 | s1.addEventListener("error", function(e){v._gotErrorEvent = true;}, false); |
michael@0 | 282 | v.appendChild(s1); |
michael@0 | 283 | var s2 = document.createElement("source"); |
michael@0 | 284 | s2.src = test.name; |
michael@0 | 285 | s2.type = test.type; |
michael@0 | 286 | v.appendChild(s2); |
michael@0 | 287 | document.body.appendChild(v); // Causes implicit load, which will be halt at preload:none on the second resource. |
michael@0 | 288 | }, |
michael@0 | 289 | |
michael@0 | 290 | name: "test7", |
michael@0 | 291 | }, |
michael@0 | 292 | { |
michael@0 | 293 | // 8. Change preload value from none to metadata should cause metadata to be loaded. |
michael@0 | 294 | loadeddata: |
michael@0 | 295 | function(e) { |
michael@0 | 296 | var v = e.target; |
michael@0 | 297 | is(v._gotLoadedMetaData, true, "(8) Must get loadedmetadata."); |
michael@0 | 298 | ok(v.readyState >= v.HAVE_CURRENT_DATA, "(8) ReadyState must be >= HAVE_CURRENT_DATA on suspend."); |
michael@0 | 299 | // bug 962949 |
michael@0 | 300 | // is(v.networkState, v.NETWORK_IDLE, "(8) NetworkState must be NETWORK_IDLE when load is halted"); |
michael@0 | 301 | maybeFinish(v, 8); |
michael@0 | 302 | }, |
michael@0 | 303 | |
michael@0 | 304 | setup: |
michael@0 | 305 | function(v) { |
michael@0 | 306 | v._gotLoadedMetaData = false; |
michael@0 | 307 | v.preload = "none"; |
michael@0 | 308 | v.addEventListener("loadstart", function(e){v.preload = "metadata";}, false); |
michael@0 | 309 | v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;}, false); |
michael@0 | 310 | v.addEventListener("loadeddata", this.loadeddata, false); |
michael@0 | 311 | v.src = test.name; // Causes implicit load. |
michael@0 | 312 | document.body.appendChild(v); |
michael@0 | 313 | }, |
michael@0 | 314 | |
michael@0 | 315 | name: "test8", |
michael@0 | 316 | }, |
michael@0 | 317 | /*{ |
michael@0 | 318 | // 9. Change preload value from metadata to auto should cause entire media to be loaded. |
michael@0 | 319 | // For some reason we don't always receive the canplaythrough event, particuarly on this test. |
michael@0 | 320 | // We've disabled this test until bug 568402 is fixed. |
michael@0 | 321 | canplaythrough: |
michael@0 | 322 | function(e) { |
michael@0 | 323 | var v = e.target; |
michael@0 | 324 | is(v._gotLoadStart, true, "(9) Must get loadstart."); |
michael@0 | 325 | is(v._gotLoadedMetaData, true, "(9) Must get loadedmetadata."); |
michael@0 | 326 | maybeFinish(v, 9); |
michael@0 | 327 | }, |
michael@0 | 328 | |
michael@0 | 329 | setup: |
michael@0 | 330 | function(v) { |
michael@0 | 331 | v._gotLoadStart = false; |
michael@0 | 332 | v._gotLoadedMetaData = false; |
michael@0 | 333 | v.preload = "metadata"; |
michael@0 | 334 | v.addEventListener("loadstart", function(e){v._gotLoadStart = true;}, false); |
michael@0 | 335 | v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;}, false); |
michael@0 | 336 | v.addEventListener("loadeddata", function(){v.preload = "auto"}, false); |
michael@0 | 337 | v.addEventListener("canplaythrough", this.canplaythrough, false); |
michael@0 | 338 | v.src = test.name; // Causes implicit load. |
michael@0 | 339 | document.body.appendChild(v); |
michael@0 | 340 | }, |
michael@0 | 341 | },*/ |
michael@0 | 342 | { |
michael@0 | 343 | // 10. Change preload value from none to auto should cause entire media to be loaded. |
michael@0 | 344 | canplaythrough: |
michael@0 | 345 | function(e) { |
michael@0 | 346 | var v = e.target; |
michael@0 | 347 | is(v._gotLoadedMetaData, true, "(10) Must get loadedmetadata."); |
michael@0 | 348 | maybeFinish(v, 10); |
michael@0 | 349 | }, |
michael@0 | 350 | |
michael@0 | 351 | setup: |
michael@0 | 352 | function(v) { |
michael@0 | 353 | v._gotLoadedMetaData = false; |
michael@0 | 354 | v.preload = "none"; |
michael@0 | 355 | v.addEventListener("loadstart", function(e){v.preload = "auto";}, false); |
michael@0 | 356 | v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;}, false); |
michael@0 | 357 | v.addEventListener("canplaythrough", this.canplaythrough, false); |
michael@0 | 358 | v.src = test.name; // Causes implicit load. |
michael@0 | 359 | document.body.appendChild(v); |
michael@0 | 360 | }, |
michael@0 | 361 | |
michael@0 | 362 | name: "test10", |
michael@0 | 363 | }, |
michael@0 | 364 | { |
michael@0 | 365 | // 11. Change preload value from none to metadata should cause metadata to load. |
michael@0 | 366 | loadeddata: |
michael@0 | 367 | function(e) { |
michael@0 | 368 | var v = e.target; |
michael@0 | 369 | is(v._gotLoadedMetaData, true, "(11) Must get loadedmetadata."); |
michael@0 | 370 | ok(v.readyState >= v.HAVE_CURRENT_DATA, "(11) ReadyState must be >= HAVE_CURRENT_DATA."); |
michael@0 | 371 | // bug 962949 |
michael@0 | 372 | // is(v.networkState, v.NETWORK_IDLE, "(11) NetworkState must be NETWORK_IDLE."); |
michael@0 | 373 | maybeFinish(v, 11); |
michael@0 | 374 | }, |
michael@0 | 375 | |
michael@0 | 376 | setup: |
michael@0 | 377 | function(v) { |
michael@0 | 378 | v._gotLoadedMetaData = false; |
michael@0 | 379 | v.preload = "none"; |
michael@0 | 380 | v.addEventListener("loadstart", function(e){v.preload = "metadata";}, false); |
michael@0 | 381 | v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;}, false); |
michael@0 | 382 | v.addEventListener("loadeddata", this.loadeddata, false); |
michael@0 | 383 | v.src = test.name; // Causes implicit load. |
michael@0 | 384 | document.body.appendChild(v); |
michael@0 | 385 | }, |
michael@0 | 386 | |
michael@0 | 387 | name: "test11", |
michael@0 | 388 | }, |
michael@0 | 389 | /*{ |
michael@0 | 390 | // 12. Change preload value from auto to metadata after load started, |
michael@0 | 391 | // should still do full load, should not halt after metadata only. |
michael@0 | 392 | // disable this test since the spec is no longer found in the document |
michael@0 | 393 | // http://dev.w3.org/html5/spec-preview/media-elements.html |
michael@0 | 394 | canplaythrough: |
michael@0 | 395 | function(e) { |
michael@0 | 396 | var v = e.target; |
michael@0 | 397 | is(v._gotLoadedMetaData, true, "(12) Must get loadedmetadata."); |
michael@0 | 398 | is(v._gotLoadStart, true, "(12) Must get loadstart."); |
michael@0 | 399 | maybeFinish(v, 12); |
michael@0 | 400 | }, |
michael@0 | 401 | |
michael@0 | 402 | setup: |
michael@0 | 403 | function(v) { |
michael@0 | 404 | v._gotLoadStart = false; |
michael@0 | 405 | v._gotLoadedMetaData = false; |
michael@0 | 406 | v.preload = "auto"; |
michael@0 | 407 | v.addEventListener("loadstart", function(e){v._gotLoadStart = true;}, false); |
michael@0 | 408 | v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;}, false); |
michael@0 | 409 | v.addEventListener("canplaythrough", this.canplaythrough, false); |
michael@0 | 410 | v.src = test.name; // Causes implicit load. |
michael@0 | 411 | document.body.appendChild(v); |
michael@0 | 412 | v.preload = "metadata"; |
michael@0 | 413 | }, |
michael@0 | 414 | |
michael@0 | 415 | name: "test12", |
michael@0 | 416 | },*/ |
michael@0 | 417 | { |
michael@0 | 418 | // 13. Change preload value from auto to none after specifying a src |
michael@0 | 419 | // should load according to preload none, no buffering should have taken place |
michael@0 | 420 | suspend: |
michael@0 | 421 | function(e) { |
michael@0 | 422 | var v = e.target; |
michael@0 | 423 | is(v._gotLoadStart, true, "(13) Must get loadstart."); |
michael@0 | 424 | is(v._gotLoadedMetaData, false, "(13) Must not get loadedmetadata."); |
michael@0 | 425 | is(v.readyState, v.HAVE_NOTHING, "(13) ReadyState must be HAVE_NOTHING"); |
michael@0 | 426 | // bug 962949 |
michael@0 | 427 | // is(v.networkState, v.NETWORK_IDLE, "(13) NetworkState must be NETWORK_IDLE"); |
michael@0 | 428 | maybeFinish(v, 13); |
michael@0 | 429 | }, |
michael@0 | 430 | |
michael@0 | 431 | setup: |
michael@0 | 432 | function(v) { |
michael@0 | 433 | v._gotLoadStart = false; |
michael@0 | 434 | v._gotLoadedMetaData = false; |
michael@0 | 435 | v.preload = "auto"; |
michael@0 | 436 | v.src = test.name; |
michael@0 | 437 | v.preload = "none"; |
michael@0 | 438 | v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;}, false); |
michael@0 | 439 | v.addEventListener("loadstart", function(e){v._gotLoadStart = true;}, false); |
michael@0 | 440 | v.addEventListener("suspend", this.suspend, false); |
michael@0 | 441 | document.body.appendChild(v); // Causes implicit load, should load according to preload none |
michael@0 | 442 | var s = document.createElement("source"); |
michael@0 | 443 | }, |
michael@0 | 444 | |
michael@0 | 445 | name: "test13", |
michael@0 | 446 | }, |
michael@0 | 447 | { |
michael@0 | 448 | // 14. Add preload:metadata video with src to document. Play(), should play through. |
michael@0 | 449 | loadeddata: |
michael@0 | 450 | function(e) { |
michael@0 | 451 | var v = e.target; |
michael@0 | 452 | is(v._gotLoadStart, true, "(14) Must get loadstart."); |
michael@0 | 453 | is(v._gotLoadedMetaData, true, "(14) Must get loadedmetadata."); |
michael@0 | 454 | ok(v.readyState >= v.HAVE_CURRENT_DATA, "(14) ReadyState must be >= HAVE_CURRENT_DATA"); |
michael@0 | 455 | // bug 962949 |
michael@0 | 456 | // is(v.networkState, v.NETWORK_IDLE, "(14) NetworkState must be NETWORK_IDLE"); |
michael@0 | 457 | v.play(); |
michael@0 | 458 | }, |
michael@0 | 459 | |
michael@0 | 460 | ended: |
michael@0 | 461 | function(e) { |
michael@0 | 462 | ok(true, "(14) Got playback ended"); |
michael@0 | 463 | var v = e.target; |
michael@0 | 464 | maybeFinish(v, 14); |
michael@0 | 465 | }, |
michael@0 | 466 | |
michael@0 | 467 | setup: |
michael@0 | 468 | function(v) { |
michael@0 | 469 | v._gotLoadStart = false; |
michael@0 | 470 | v._gotLoadedMetaData = false; |
michael@0 | 471 | v.preload = "metadata"; |
michael@0 | 472 | v.addEventListener("loadstart", function(e){v._gotLoadStart = true;}, false); |
michael@0 | 473 | v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;}, false); |
michael@0 | 474 | v.addEventListener("ended", this.ended, false); |
michael@0 | 475 | v.addEventListener("loadeddata", this.loadeddata, false); |
michael@0 | 476 | v.src = test.name; |
michael@0 | 477 | document.body.appendChild(v); // Causes implicit load, which will be halted after |
michael@0 | 478 | // metadata due to preload:metadata. |
michael@0 | 479 | }, |
michael@0 | 480 | |
michael@0 | 481 | name: "test14", |
michael@0 | 482 | }, |
michael@0 | 483 | { |
michael@0 | 484 | // 15. Autoplay should override preload:none. |
michael@0 | 485 | ended: |
michael@0 | 486 | function(e) { |
michael@0 | 487 | ok(true, "(15) Got playback ended."); |
michael@0 | 488 | var v = e.target; |
michael@0 | 489 | maybeFinish(v, 15); |
michael@0 | 490 | }, |
michael@0 | 491 | |
michael@0 | 492 | setup: |
michael@0 | 493 | function(v) { |
michael@0 | 494 | v._gotLoadStart = false; |
michael@0 | 495 | v._gotLoadedMetaData = false; |
michael@0 | 496 | v.preload = "none"; |
michael@0 | 497 | v.autoplay = true; |
michael@0 | 498 | v.addEventListener("loadstart", function(e){v._gotLoadStart = true;}, false); |
michael@0 | 499 | v.addEventListener("loadedmetadata", function(e){v._gotLoadedMetaData = true;}, false); |
michael@0 | 500 | v.addEventListener("ended", this.ended, false); |
michael@0 | 501 | v.src = test.name; // Causes implicit load. |
michael@0 | 502 | document.body.appendChild(v); |
michael@0 | 503 | }, |
michael@0 | 504 | |
michael@0 | 505 | name: "test15", |
michael@0 | 506 | }, |
michael@0 | 507 | { |
michael@0 | 508 | // 16. Autoplay should override preload:metadata. |
michael@0 | 509 | ended: |
michael@0 | 510 | function(e) { |
michael@0 | 511 | ok(true, "(16) Got playback ended."); |
michael@0 | 512 | var v = e.target; |
michael@0 | 513 | maybeFinish(v, 16); |
michael@0 | 514 | }, |
michael@0 | 515 | |
michael@0 | 516 | setup: |
michael@0 | 517 | function(v) { |
michael@0 | 518 | v.preload = "metadata"; |
michael@0 | 519 | v.autoplay = true; |
michael@0 | 520 | v.addEventListener("ended", this.ended, false); |
michael@0 | 521 | v.src = test.name; // Causes implicit load. |
michael@0 | 522 | document.body.appendChild(v); |
michael@0 | 523 | }, |
michael@0 | 524 | |
michael@0 | 525 | name: "test16", |
michael@0 | 526 | }, |
michael@0 | 527 | { |
michael@0 | 528 | // 17. On a preload:none video, adding autoplay should disable preload none, i.e. don't break autoplay! |
michael@0 | 529 | ended: |
michael@0 | 530 | function(e) { |
michael@0 | 531 | ok(true, "(17) Got playback ended."); |
michael@0 | 532 | var v = e.target; |
michael@0 | 533 | maybeFinish(v, 17); |
michael@0 | 534 | }, |
michael@0 | 535 | |
michael@0 | 536 | setup: |
michael@0 | 537 | function(v) { |
michael@0 | 538 | v.addEventListener("ended", this.ended, false); |
michael@0 | 539 | v.preload = "none"; |
michael@0 | 540 | document.body.appendChild(v); // Causes implicit load, which will be halted due to preload:none. |
michael@0 | 541 | v.autoplay = true; |
michael@0 | 542 | v.src = test.name; |
michael@0 | 543 | }, |
michael@0 | 544 | |
michael@0 | 545 | name: "test17", |
michael@0 | 546 | }, |
michael@0 | 547 | { |
michael@0 | 548 | // 18. On a preload='none' video, call play() before load algorithms's sync |
michael@0 | 549 | // has run, the play() call should override preload='none'. |
michael@0 | 550 | ended: |
michael@0 | 551 | function(e) { |
michael@0 | 552 | ok(true, "(18) Got playback ended."); |
michael@0 | 553 | var v = e.target; |
michael@0 | 554 | maybeFinish(v, 18); |
michael@0 | 555 | }, |
michael@0 | 556 | |
michael@0 | 557 | setup: |
michael@0 | 558 | function(v) { |
michael@0 | 559 | v.addEventListener("ended", this.ended, false); |
michael@0 | 560 | v.preload = "none"; |
michael@0 | 561 | v.src = test.name; // Schedules async section to continue load algorithm. |
michael@0 | 562 | document.body.appendChild(v); |
michael@0 | 563 | v.play(); // Should cause preload:none to be overridden. |
michael@0 | 564 | }, |
michael@0 | 565 | |
michael@0 | 566 | name: "test18", |
michael@0 | 567 | }, |
michael@0 | 568 | { |
michael@0 | 569 | // 19. Set preload='auto' on first video source then switching preload='none' and swapping the video source to another. |
michael@0 | 570 | // The second video should not start playing as it's preload state has been changed to 'none' from 'auto' |
michael@0 | 571 | loadedmetadata: function(e) { |
michael@0 | 572 | var v = e.target; |
michael@0 | 573 | is(v.preload === "auto", true, "(19) preload is initially auto"); |
michael@0 | 574 | setTimeout(function() { |
michael@0 | 575 | // set preload state to none and switch video sources |
michael@0 | 576 | v.preload="none"; |
michael@0 | 577 | v.src = test.name + "?asdf"; |
michael@0 | 578 | setTimeout(function() { |
michael@0 | 579 | is(v.readyState === 0, true, "(19) no buffering has taken place"); |
michael@0 | 580 | maybeFinish(v, 19); |
michael@0 | 581 | }, 2000); |
michael@0 | 582 | }, 2000); |
michael@0 | 583 | |
michael@0 | 584 | }, |
michael@0 | 585 | |
michael@0 | 586 | setup: |
michael@0 | 587 | function(v) { |
michael@0 | 588 | var that = this; |
michael@0 | 589 | v.preload = "auto"; |
michael@0 | 590 | v.src = test.name; |
michael@0 | 591 | // add a listener for when the video has loaded, so we know preload auto has worked |
michael@0 | 592 | v.addEventListener( "loadedmetadata", this.loadedmetadata, false); |
michael@0 | 593 | document.body.appendChild(v); |
michael@0 | 594 | }, |
michael@0 | 595 | |
michael@0 | 596 | name: "test19", |
michael@0 | 597 | } |
michael@0 | 598 | ]; |
michael@0 | 599 | |
michael@0 | 600 | var iterationCount = 0; |
michael@0 | 601 | function startTest(test, token) { |
michael@0 | 602 | if (test == tests[0]) { |
michael@0 | 603 | ++iterationCount; |
michael@0 | 604 | info("iterationCount=" + iterationCount); |
michael@0 | 605 | } |
michael@0 | 606 | if (iterationCount == 2) { |
michael@0 | 607 | // Do this series of tests on logically different resources |
michael@0 | 608 | test.name = baseName + "?" + Math.floor(Math.random()*100000); |
michael@0 | 609 | } |
michael@0 | 610 | var v = document.createElement("video"); |
michael@0 | 611 | v.token = token; |
michael@0 | 612 | test.setup(v); |
michael@0 | 613 | manager.started(token); |
michael@0 | 614 | } |
michael@0 | 615 | |
michael@0 | 616 | var twiceTests = tests.concat(tests); |
michael@0 | 617 | SimpleTest.waitForExplicitFinish(); |
michael@0 | 618 | SpecialPowers.pushPrefEnv({"set": [["media.cache_size", 40000]]}, beginTest); |
michael@0 | 619 | function beginTest() { |
michael@0 | 620 | manager.runTests(twiceTests, startTest); |
michael@0 | 621 | } |
michael@0 | 622 | </script> |
michael@0 | 623 | </pre> |
michael@0 | 624 | </body> |
michael@0 | 625 | </html> |