test_buffered.html (3441B)
1 <!DOCTYPE HTML> 2 <html> 3 <!-- 4 https://bugzilla.mozilla.org/show_bug.cgi?id=462957 5 --> 6 <head> 7 <title>Test for Bug 462957</title> 8 <script src="/tests/SimpleTest/SimpleTest.js"></script> 9 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> 10 <script type="text/javascript" src="manifest.js"></script> 11 </head> 12 <body> 13 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=462957">Mozilla Bug 462957</a> 14 15 <p id="display"></p> 16 <div id="content" style="display: none"> 17 18 </div> 19 <pre id="test"> 20 <script type="application/javascript"> 21 22 // Test for Bug 462957; HTMLMediaElement.buffered. 23 24 var manager = new MediaTestManager; 25 26 function testBuffered(e) { 27 var v = e.target; 28 29 // The whole media should be buffered... 30 var b = v.buffered; 31 is(b.length, 1, v._name + ": Should be buffered in one range"); 32 is(b.start(0), 0, v._name + ": First range start should be media start"); 33 ok(Math.abs(b.end(0) - v.duration) < 0.1, v._name + ": First range end should be media end"); 34 35 // Ensure INDEX_SIZE_ERR is thrown when we access outside the range 36 var caught = false; 37 try { 38 b.start(-1); 39 } catch (ex) { 40 caught = ex.name == "IndexSizeError" && ex.code == DOMException.INDEX_SIZE_ERR; 41 } 42 is(caught, true, v._name + ": Should throw INDEX_SIZE_ERR on under start bounds range"); 43 44 caught = false; 45 try { 46 b.end(-1); 47 } catch (ex) { 48 caught = ex.name == "IndexSizeError" && ex.code == DOMException.INDEX_SIZE_ERR; 49 } 50 is(caught, true, v._name + ": Should throw INDEX_SIZE_ERR on under end bounds range"); 51 52 caught = false; 53 try { 54 b.start(b.length); 55 } catch (ex) { 56 caught = ex.name == "IndexSizeError" && ex.code == DOMException.INDEX_SIZE_ERR; 57 } 58 is(caught, true, v._name + ": Should throw INDEX_SIZE_ERR on over start bounds range"); 59 60 caught = false; 61 try { 62 b.end(b.length); 63 } catch (ex) { 64 caught = ex.name == "IndexSizeError" && ex.code == DOMException.INDEX_SIZE_ERR; 65 } 66 is(caught, true, v._name + ": Should throw INDEX_SIZE_ERR on over end bounds range"); 67 68 removeNodeAndSource(v); 69 manager.finished(v._token); 70 } 71 72 function fetch(url, fetched_callback) { 73 var xhr = new XMLHttpRequest(); 74 xhr.open("GET", url, true); 75 xhr.responseType = "blob"; 76 77 var loaded = function () { 78 if (xhr.status == 200 || xhr.status == 206) { 79 ok(true, `${url}: Fetch succeeded, status=${xhr.status}`); 80 // Request fulfilled. Note sometimes we get 206... Presumably because either 81 // httpd.js or Necko cached the result. 82 fetched_callback(window.URL.createObjectURL(xhr.response)); 83 } else { 84 ok(false, `${url}: Fetch failed, headers=${xhr.getAllResponseHeaders()}`); 85 } 86 }; 87 88 xhr.addEventListener("load", loaded); 89 xhr.send(); 90 } 91 92 function startTest(test, token) { 93 // Fetch the media resource using XHR so we can be sure the entire 94 // resource is loaded before we test buffered ranges. This ensures 95 // we have deterministic behaviour. 96 var onfetched = function(uri) { 97 var v = document.createElement('video'); 98 v._token = token; 99 v.src = uri; 100 v._name = test.name; 101 v._test = test; 102 v.addEventListener("loadeddata", testBuffered, {once: true}); 103 document.body.appendChild(v); 104 }; 105 106 manager.started(token); 107 fetch(test.name, onfetched); 108 } 109 110 // Note: No need to set media test prefs, since we're using XHR to fetch 111 // media data. 112 manager.runTests(gSeekTests, startTest); 113 114 </script> 115 </pre> 116 </body> 117 </html>