test_eme_detach_reattach_same_mediakeys_during_playback.html (3761B)
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 <video id="v" controls></video> 13 <script class="testbody" type="text/javascript"> 14 /* import-globals-from eme.js */ 15 var manager = new MediaTestManager; 16 17 var EMEmanifest = [ 18 { 19 name:"bipbop 10s", 20 tracks: [ 21 { 22 name:"video", 23 type:"video/mp4; codecs=\"avc1.4d4015\"", 24 fragments:[ "bipbop-cenc-video-10s.mp4", 25 ] 26 } 27 ], 28 keys: { 29 "7e571d037e571d037e571d037e571d11" : "7e5733337e5733337e5733337e573311", 30 }, 31 sessionType:"temporary", 32 sessionCount:1, 33 duration:10.01 34 }, 35 ]; 36 37 function sleep(time) { 38 return new Promise((resolve) => setTimeout(resolve, time)); 39 } 40 41 // To check if playback can be blocked and resumed correctly after 42 // detaching original mediakeys and reattach it back. 43 function startTest(test, token) 44 { 45 manager.started(token); 46 47 var mk_ori; 48 let finish = new EMEPromise; 49 50 let v = document.getElementById("v"); 51 let sessions = []; 52 function onSessionCreated(session) { 53 sessions.push(session); 54 } 55 56 function closeSessions() { 57 let p = new EMEPromise; 58 Promise.all(sessions.map(s => s.close())) 59 .then(p.resolve, p.reject); 60 return p.promise; 61 } 62 63 function setMediaKeysToElement(mk, solve, reject) { 64 v.setMediaKeys(mk).then(solve, reject); 65 } 66 67 function ReattachOriMediaKeys() { 68 function onOriMediaKeysSetOK() { 69 ok(true, TimeStamp(token) + " (ENCRYPTED) Set original MediaKeys back OK!"); 70 } 71 function onOriMediaKeysSetFailed() { 72 ok(false, " Failed to set original mediakeys back."); 73 } 74 75 function onCanPlayAgain() { 76 Promise.all([closeSessions()]) 77 .then(() => { 78 ok(true, " (ENCRYPTED) Playback can be resumed."); 79 manager.finished(token); 80 }, () => { 81 ok(false, TimeStamp(token) + " Sessions are closed incorrectly."); 82 manager.finished(token); 83 }); 84 } 85 86 once(v, "canplay", onCanPlayAgain); 87 setMediaKeysToElement(mk_ori, onOriMediaKeysSetOK, onOriMediaKeysSetFailed) 88 } 89 90 function triggerSeek() { 91 v.currentTime = v.duration / 2; 92 } 93 94 function onCanPlay() { 95 function onSetMediaKeysToNullOK() { 96 ok(true, TimeStamp(token) + " Set MediaKeys to null. OK!"); 97 98 triggerSeek(); 99 100 SimpleTest.requestFlakyTimeout("To reattach mediakeys back again in 5s."); 101 sleep(5000).then(ReattachOriMediaKeys); 102 } 103 function onSetMediaKeysToNullFailed() { 104 ok(false, TimeStamp(token) + " Set MediaKeys to null. FAILED!"); 105 } 106 107 SimpleTest.requestFlakyTimeout("To detach mediakeys after receiving 'canplay' event in 2s"); 108 sleep(2000).then(() => { 109 setMediaKeysToElement(null, onSetMediaKeysToNullOK, onSetMediaKeysToNullFailed); 110 }); 111 } 112 113 once(v, "canplay", onCanPlay); 114 115 var p1 = LoadInitData(v, test, token); 116 var p2 = CreateAndSetMediaKeys(v, test, token); 117 var p3 = LoadTest(test, v, token); 118 Promise.all([p1, p2, p3]) 119 .then(values => { 120 let initData = values[0]; 121 // stash the mediakeys 122 mk_ori = v.mediaKeys; 123 initData.map(ev => { 124 let session = v.mediaKeys.createSession(); 125 onSessionCreated(session); 126 MakeRequest(test, token, ev, session); 127 }); 128 }) 129 .then(() => { 130 return finish.promise; 131 }) 132 .catch(reason => ok(false, reason)) 133 } 134 135 SimpleTest.waitForExplicitFinish(); 136 manager.runTests(EMEmanifest, startTest); 137 138 </script> 139 </pre> 140 </body> 141 </html>