drm-retrieve-destroy-persistent-license.html (4291B)
1 <!doctype html> 2 <html> 3 <head> 4 <meta charset=utf-8> 5 <title>Encrypted Media Extensions: persistent-license, retrieve and destroy, drm</title> 6 <link rel="help" href="https://w3c.github.io/encrypted-media/"> 7 8 <!-- Helper scripts for Encrypted Media Extensions tests --> 9 <script src=/encrypted-media/util/utils.js></script> 10 <script src=/encrypted-media/util/utf8.js></script> 11 <script src=/encrypted-media/util/testmediasource.js></script> 12 13 <!-- Message handler for DRM keysystem --> 14 <script src=/encrypted-media/util/drm-messagehandler.js></script> 15 16 </head> 17 <body> 18 <div id='log'></div> 19 20 <div id='video'> 21 <video id="videoelement" width="200px"></video> 22 </div> 23 24 <script> 25 // Wait for a message from the main window with details of our task 26 window.addEventListener('message', function(event) { 27 28 var config = event.data.config, 29 configuration = { initDataTypes: [config.initDataType], 30 audioCapabilities: [{contentType: config.audioType}], 31 videoCapabilities: [{contentType: config.videoType}], 32 sessionTypes: ['persistent-license']}, 33 assertions = []; 34 35 var _mediaKeys, 36 _mediaKeySession; 37 38 config.video = document.getElementById('videoelement'); 39 config.messagehandler = (new MessageHandler(config.keysystem, config.content, 'persistent-license')).messagehandler; 40 41 function onComplete() { 42 window.opener.postMessage({ testResult: assertions }, '*'); 43 } 44 45 function onFailure(error) { 46 assertions.push({actual: false, expected: true, message: error.toString()}); 47 onComplete(); 48 } 49 50 function onMessage( messageevent ) 51 { 52 assertions.push({expected: true, actual: messageevent instanceof window.MediaKeyMessageEvent, message: "event is of correct class"}); 53 assertions.push({expected: 'message', actual: messageevent.type, message: "event type is message"}); 54 assertions.push({expected: 'license-release', actual: messageevent.messageType, message: "message type is license-release"}); 55 56 config.messagehandler(messageevent.messageType, messageevent.message) 57 .then( function(response) { 58 return messageevent.target.update(response); 59 }).catch(onFailure); 60 } 61 62 function onTimeupdate(event) { 63 if (config.video.currentTime > (config.duration || 1)) { 64 config.video.pause(); 65 config.video.removeAttribute('src'); 66 config.video.load(); 67 _mediaKeySession.remove(); 68 } 69 } 70 71 function onClosed() { 72 // Try and reload and check this fails 73 var mediaKeySession = _mediaKeys.createSession('persistent-license'); 74 mediaKeySession.load(event.data.sessionId ).then( function(success) { 75 assertions.push({expected: false, actual: success, message: "Load of removed session should fail"}); 76 onComplete(); 77 }).catch(onFailure); 78 } 79 80 navigator.requestMediaKeySystemAccess(config.keysystem, [configuration] ) 81 .then(function(access) { 82 return access.createMediaKeys(); 83 }).then(function(mediaKeys) { 84 _mediaKeys = mediaKeys; 85 return config.video.setMediaKeys(mediaKeys); 86 }).then(function() { 87 config.video.addEventListener('timeupdate', onTimeupdate, true); 88 _mediaKeySession = _mediaKeys.createSession('persistent-license'); 89 _mediaKeySession.addEventListener('message', onMessage); 90 _mediaKeySession.closed.then(onClosed); 91 return _mediaKeySession.load(event.data.sessionId); 92 }).then(function(success) { 93 assertions.push({actual: success, expected: true, message: "Expect load session to succeed"}); 94 if (!success) throw new DOMException(); 95 return testmediasource(config); 96 }).then(function(source) { 97 config.video.src = URL.createObjectURL(source); 98 config.video.play(); 99 }) 100 .catch(onFailure); 101 } ); 102 103 104 </script> 105 </body> 106 </html>