clearkey-retrieve-destroy-persistent-license.html (4347B)
1 <!doctype html> 2 <html> 3 <head> 4 <meta charset=utf-8> 5 <title>Encrypted Media Extensions: persistent-license, retrieve and destroy, ClearKey</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 Clear Key keysystem --> 14 <script src=/encrypted-media/util/clearkey-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( 'org.w3.clearkey')).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 messageevent.target.update( response ).catch(onFailure); 59 }); 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 </script> 104 </body> 105 </html>