test_eme_playback.html (6703B)
1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <title>Test Encrypted Media Extensions</title> 5 <script src="/tests/SimpleTest/SimpleTest.js"></script> 6 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> 7 <script type="text/javascript" src="manifest.js"></script> 8 <script type="text/javascript" src="https://example.com:443/tests/dom/media/test/eme.js"></script> 9 </head> 10 <body> 11 <pre id="test"> 12 <script class="testbody" type="text/javascript"> 13 /* import-globals-from eme.js */ 14 var manager = new MediaTestManager; 15 16 function ArrayBuffersEqual(a, b) { 17 if (a.byteLength != b.byteLength) { 18 return false; 19 } 20 var ua = new Uint8Array(a); 21 var ub = new Uint8Array(b); 22 for (var i = 0; i < ua.length; i++) { 23 if (ua[i] != ub[i]) { 24 return false; 25 } 26 } 27 return true; 28 } 29 30 function KeysChangeFunc(session, keys, token) { 31 session.keyIdsReceived = []; 32 for (var keyid in keys) { 33 Log(token, "Set " + keyid + " to false in session[" + session.sessionId + "].keyIdsReceived"); 34 session.keyIdsReceived[keyid] = false; 35 } 36 return function(ev) { 37 var s = ev.target; 38 s.gotKeysChanged = true; 39 40 var keyList = []; 41 var valueList = []; 42 var map = s.keyStatuses; 43 44 // Test that accessing keys not known to the CDM has expected behaviour. 45 var absentKey = new Uint8Array([0xeb, 0xdd, 0x62, 0xf1, 0x68, 0x14, 0xd2, 0x7b, 46 0x68, 0xef, 0x12, 0x2a, 0xfc, 0xe4, 0xae, 0x3c]); 47 is(map.has(absentKey), false, "Shouldn't have a key that's not in the media"); 48 is(map.get(absentKey), undefined, "Unknown keys should undefined status"); 49 50 // Verify known keys have expected status. 51 for (let [key, val] of map.entries()) { 52 is(key.constructor, ArrayBuffer, "keyId should be ArrayBuffer"); 53 ok(map.has(key), "MediaKeyStatusMap.has() should work."); 54 is(map.get(key), val, "MediaKeyStatusMap.get() should work."); 55 keyList.push(key); 56 valueList.push(val); 57 is(val, "usable", token + ": key status should be usable"); 58 var kid = Base64ToHex(window.btoa(ArrayBufferToString(key))); 59 ok(kid in s.keyIdsReceived, TimeStamp(token) + " session[" + s.sessionId + "].keyIdsReceived contained " + kid + " as expected."); 60 s.keyIdsReceived[kid] = true; 61 } 62 63 var index = 0; 64 for (var keyId of map.keys()) { 65 ok(ArrayBuffersEqual(keyId, keyList[index]), "MediaKeyStatusMap.keys() should correspond to entries"); 66 index++; 67 } 68 index = 0; 69 for (let val of map.values()) { 70 is(val, valueList[index], "MediaKeyStatusMap.values() should correspond to entries"); 71 index++; 72 } 73 } 74 } 75 76 function startTest(test, token) 77 { 78 manager.started(token); 79 80 var sessions = []; 81 82 function onSessionCreated(session) { 83 sessions.push(session); 84 session.addEventListener("keystatuseschange", KeysChangeFunc(session, test.keys, token)); 85 86 session.numKeystatuseschangeEvents = 0; 87 session.numOnkeystatuseschangeEvents = 0; 88 89 session.addEventListener("keystatuseschange", function() { 90 session.numKeystatuseschangeEvents += 1; 91 }); 92 session.onkeystatuseschange = function() { 93 session.numOnkeystatuseschangeEvents += 1; 94 }; 95 96 session.numMessageEvents = 0; 97 session.numOnMessageEvents = 0; 98 session.addEventListener("message", function() { 99 session.numMessageEvents += 1; 100 }); 101 session.onmessage = function() { 102 session.numOnMessageEvents += 1; 103 }; 104 } 105 106 let v = document.createElement("video"); 107 document.body.appendChild(v); 108 109 var gotEncrypted = 0; 110 let finish = new EMEPromise; 111 112 v.addEventListener("encrypted", function() { 113 gotEncrypted += 1; 114 }); 115 116 v.addEventListener("loadedmetadata", function() { 117 ok(SpecialPowers.do_lookupGetter(v, "isEncrypted").apply(v), 118 TimeStamp(token) + " isEncrypted should be true"); 119 is(v.isEncrypted, undefined, "isEncrypted should not be accessible from content"); 120 }); 121 122 v.addEventListener("ended", function() { 123 ok(true, TimeStamp(token) + " got ended event"); 124 125 is(gotEncrypted, test.sessionCount, 126 TimeStamp(token) + " encrypted events expected: " + test.sessionCount 127 + ", actual: " + gotEncrypted); 128 129 ok(Math.abs(test.duration - v.duration) < 0.1, 130 TimeStamp(token) + " Duration of video should be corrrect"); 131 ok(Math.abs(test.duration - v.currentTime) < 0.1, 132 TimeStamp(token) + " Current time should be same as duration"); 133 134 // Verify all sessions had all keys went sent to the CDM usable, and thus 135 // that we received keystatuseschange event(s). 136 is(sessions.length, test.sessionCount, TimeStamp(token) + " should have " 137 + test.sessionCount 138 + " session" + (test.sessionCount === 1 ? "" : "s")); 139 var keyIdsReceived = []; 140 for (var keyid in test.keys) { keyIdsReceived[keyid] = false; } 141 for (var i = 0; i < sessions.length; i++) { 142 var session = sessions[i]; 143 ok(session.gotKeysChanged, 144 TimeStamp(token) + " session[" + session.sessionId 145 + "] should have received at least one keychange event"); 146 for (let kid in session.keyIdsReceived) { 147 Log(token, "session[" + session.sessionId + "] key " + kid + " = " + (session.keyIdsReceived[kid] ? "true" : "false")); 148 if (session.keyIdsReceived[kid]) { keyIdsReceived[kid] = true; } 149 } 150 ok(session.numKeystatuseschangeEvents > 0, TimeStamp(token) + " should get key status changes"); 151 is(session.numKeystatuseschangeEvents, session.numOnkeystatuseschangeEvents, 152 TimeStamp(token) + " should have as many keystatuseschange event listener calls as event handler calls."); 153 154 ok(session.numMessageEvents > 0, TimeStamp(token) + " should get message events"); 155 is(session.numMessageEvents, session.numOnMessageEvents, 156 TimeStamp(token) + " should have as many message event listener calls as event handler calls."); 157 } 158 for (let kid in keyIdsReceived) { 159 ok(keyIdsReceived[kid], TimeStamp(token) + " key with id " + kid + " was usable as expected"); 160 } 161 162 CloseSessions(v, sessions).then(finish.resolve, finish.reject); 163 }); 164 165 Promise.all([ 166 LoadInitData(v, test, token), 167 CreateAndSetMediaKeys(v, test, token), 168 LoadTest(test, v, token)]) 169 .then(values => { 170 v.play(); 171 let initData = values[0]; 172 initData.map(ev => { 173 let session = v.mediaKeys.createSession(); 174 onSessionCreated(session); 175 MakeRequest(test, token, ev, session); 176 }); 177 return finish.promise; 178 }) 179 .catch(reason => ok(false, reason)) 180 .then(() => manager.finished(token)); 181 } 182 183 SimpleTest.waitForExplicitFinish(); 184 manager.runTests(gEMETests, startTest); 185 </script> 186 </pre> 187 </body> 188 </html>