test_eme_autoplay.html (3536B)
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 var EMEmanifest = [ 17 { 18 name:"bipbop 10s", 19 tracks: [ 20 { 21 name:"video", 22 type:"video/mp4; codecs=\"avc1.4d4015\"", 23 fragments:[ "bipbop-cenc-video-10s.mp4", 24 ] 25 } 26 ], 27 keys: { 28 "7e571d037e571d037e571d037e571d11" : "7e5733337e5733337e5733337e573311", 29 }, 30 sessionType:"temporary", 31 sessionCount:1, 32 duration:10.01 33 }, 34 ]; 35 36 function startTest(test, token) 37 { 38 manager.started(token); 39 40 let v = document.createElement("video"); 41 v.controls = true; 42 v.autoplay = true; 43 44 document.body.appendChild(v); 45 46 var eventCounts = { play: 0, playing: 0}; 47 function ForbiddenEvents(e) { 48 var video = e.target; 49 ok(video.readyState >= video.HAVE_FUTURE_DATA, "Must not have received event too early"); 50 is(eventCounts[e.type], 0, "event should have only be fired once"); 51 eventCounts[e.type]++; 52 } 53 // Log events for debugging. 54 var events = ["suspend", "play", "canplay", "canplaythrough", "loadstart", "loadedmetadata", 55 "loadeddata", "playing", "ended", "error", "stalled", "emptied", "abort", 56 "waiting", "pause", "durationchange", "seeking", "seeked"]; 57 function logEvent(e) { 58 info("got " + e.type + " event"); 59 } 60 events.forEach(function(e) { 61 v.addEventListener(e, logEvent); 62 }); 63 v.addEventListener("play", ForbiddenEvents); 64 v.addEventListener("playing", ForbiddenEvents); 65 66 var gotWaitingForKey = 0; 67 68 let waitForKey = new EMEPromise; 69 v.addEventListener("waitingforkey", function() { 70 gotWaitingForKey += 1; 71 waitForKey.resolve(); 72 }); 73 74 v.addEventListener("loadedmetadata", function() { 75 ok(SpecialPowers.do_lookupGetter(v, "isEncrypted").apply(v), 76 TimeStamp(token) + " isEncrypted should be true"); 77 is(v.isEncrypted, undefined, "isEncrypted should not be accessible from content"); 78 }); 79 80 let finish = new EMEPromise; 81 v.addEventListener("playing", function() { 82 ok(true, TimeStamp(token) + " got playing event"); 83 // We expect only one waitingForKey as we delay until all sessions are ready. 84 // I.e. one waitingForKey should be fired, after which, we process all sessions, 85 // so it should not be possible to be blocked by a key after that point. 86 ok(gotWaitingForKey == 1, "Expected number 1 wait, got: " + gotWaitingForKey); 87 88 finish.resolve(); 89 }); 90 91 Promise.all([ 92 LoadInitData(v, test, token), 93 CreateAndSetMediaKeys(v, test, token), 94 LoadTest(test, v, token, false /* do not call endOfStream */), 95 waitForKey.promise]) 96 .then(values => { 97 let initData = values[0]; 98 return ProcessInitData(v, test, token, initData); 99 }) 100 .then(sessions => { 101 Log(token, "Updated all sessions, loading complete"); 102 finish.promise.then(() => CloseSessions(v, sessions)); 103 return finish.promise; 104 }) 105 .catch(reason => ok(false, reason)) 106 .then(() => manager.finished(token)); 107 } 108 109 SimpleTest.waitForExplicitFinish(); 110 manager.runTests(EMEmanifest, startTest); 111 112 </script> 113 </pre> 114 </body> 115 </html>