test_media_selection.html (4688B)
1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <title>Media test: media selection</title> 5 <script src="/tests/SimpleTest/SimpleTest.js"></script> 6 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> 7 <script type="application/javascript" src="manifest.js"></script> 8 </head> 9 <body> 10 <pre id="test"> 11 <script class="testbody" type="text/javascript"> 12 13 var manager = new MediaTestManager; 14 15 function maketest(attach_media, name, type, check_metadata) { 16 return function (token) { 17 var e = document.createElement('video'); 18 e.preload = "metadata"; 19 token = name + "-" + token; 20 manager.started(token); 21 var errorRun = false; 22 if (check_metadata) { 23 e.addEventListener('loadedmetadata', function () { 24 ok(e.readyState >= HTMLMediaElement.HAVE_METADATA, 25 'test ' + token + ' readyState ' + e.readyState + ' expected >= ' + HTMLMediaElement.HAVE_METADATA); 26 is(e.currentSrc.substring(e.currentSrc.length - name.length), name, 'test ' + token); 27 // The load can go idle due to cache size limits 28 ok(e.networkState >= HTMLMediaElement.NETWORK_IDLE, 29 'test ' + token + ' networkState = ' + e.networkState + ' expected >= ' + HTMLMediaElement.NETWORK_IDLE); 30 check_metadata(e); 31 removeNodeAndSource(e); 32 manager.finished(token); 33 }); 34 } else { 35 e.addEventListener('error', function onerror() { 36 is(errorRun, false, "error handler should run once only!"); 37 errorRun = true; 38 is(e.readyState, HTMLMediaElement.HAVE_NOTHING, 39 'test ' + token + ' readyState should be HAVE_NOTHING when load fails.'); 40 e.removeEventListener('error', onerror, true); 41 removeNodeAndSource(e); 42 manager.finished(token); 43 }, true); 44 } 45 attach_media(e, name, type); 46 } 47 } 48 49 function set_src(element, name) { 50 element.src = name; 51 document.body.appendChild(element); 52 } 53 54 function add_source(element, name, type) { 55 do_add_source(element, name, type); 56 document.body.appendChild(element); 57 } 58 59 function do_add_source(element, name, type) { 60 var source = document.createElement('source'); 61 if (type) { 62 source.type = type; 63 } 64 source.src = name; 65 element.appendChild(source); 66 } 67 68 function add_sources_last(element, name, type) { 69 do_add_source(element, name, 'unsupported/type'); 70 do_add_source(element, name, type); 71 document.body.appendChild(element); 72 } 73 74 function add_sources_first(element, name, type) { 75 do_add_source(element, name, type); 76 do_add_source(element, name, 'unsupported/type'); 77 document.body.appendChild(element); 78 } 79 80 function late_add_sources_last(element, name, type) { 81 document.body.appendChild(element); 82 do_add_source(element, name, 'unsupported/type'); 83 do_add_source(element, name, type); 84 } 85 86 function late_add_sources_first(element, name, type) { 87 document.body.appendChild(element); 88 do_add_source(element, name, type); 89 do_add_source(element, name, 'unsupported/type'); 90 } 91 92 var nextTest = 0; 93 var subtests = [ 94 maketest(add_source, 'unknown.raw', 'bogus/type', null) 95 ]; 96 97 var tmpVid = document.createElement('video'); 98 99 for (var i = 0; i < gSmallTests.length; ++i) { 100 var test = gSmallTests[i]; 101 var src = test.name; 102 var type = test.type; 103 104 if (!tmpVid.canPlayType(type)) 105 continue; 106 107 // The following nested function hack is to ensure that 'test' is correctly 108 // captured in the closure and we don't end up getting the value 'test' 109 // had in the last iteration of the loop. I blame Brendan. 110 var check = function(t) { return function (e) { 111 checkMetadata(t.name, e, t); 112 }}(test); 113 114 var otherType = type.match(/^video\//) ? "audio/x-wav" : "video/webm"; 115 subtests.push(maketest(set_src, src, null, check), 116 maketest(add_source, src, null, check), 117 maketest(add_source, src, type, check), 118 maketest(add_sources_last, src, null, check), 119 maketest(add_sources_first, src, type, check), 120 121 // type hint matches a decoder, actual type matches different decoder 122 maketest(add_source, src, otherType, check), 123 maketest(add_source, 'unknown.raw', type, null), 124 125 // should not start loading, type excludes it from media candiate list 126 maketest(add_source, src, 'bogus/type', null), 127 128 // element doesn't notice source children attached later, needs bug 462455 fixed 129 maketest(late_add_sources_last, src, type, check), 130 maketest(late_add_sources_first, src, type, check)); 131 } 132 133 function startTest(t, token) { 134 t(token); 135 } 136 137 manager.runTests(subtests, startTest); 138 139 </script> 140 </pre> 141 </body> 142 </html>