playback-destroy-persistent-license.js (4392B)
1 function runTest(config,qualifier) { 2 3 var testname = testnamePrefix( qualifier, config.keysystem ) 4 + ', persistent-license, ' 5 + /video\/([^;]*)/.exec( config.videoType )[ 1 ] 6 + ', playback, destroy and acknowledge'; 7 8 var configuration = { initDataTypes: [ config.initDataType ], 9 audioCapabilities: [ { contentType: config.audioType } ], 10 videoCapabilities: [ { contentType: config.videoType } ], 11 sessionTypes: [ 'persistent-license' ] }; 12 13 async_test( function(test) { 14 15 var _video = config.video, 16 _mediaKeys, 17 _mediaKeySession, 18 _mediaSource, 19 _sessionId, 20 _startedReleaseSequence = false; 21 22 function onFailure(error) { 23 forceTestFailureFromPromise(test, error); 24 } 25 26 function onMessage(event) { 27 assert_equals(event.target, _mediaKeySession); 28 assert_true(event instanceof window.MediaKeyMessageEvent); 29 assert_equals(event.type, 'message'); 30 31 config.messagehandler(event.messageType, event.message).then(function(response) { 32 return _mediaKeySession.update(response); 33 }).catch(onFailure); 34 } 35 36 function onEncrypted(event) { 37 assert_equals(event.target, _video); 38 assert_true(event instanceof window.MediaEncryptedEvent); 39 assert_equals(event.type, 'encrypted'); 40 41 waitForEventAndRunStep('message', _mediaKeySession, onMessage, test); 42 _mediaKeySession.generateRequest( config.initData ? config.initDataType : event.initDataType, 43 config.initData || event.initData ).then( test.step_func(function() { 44 assert_not_equals( _mediaKeySession.sessionId, undefined, "SessionId should be defined" ); 45 _sessionId = _mediaKeySession.sessionId; 46 })).catch(onFailure); 47 } 48 49 function onTimeupdate(event) { 50 if (_video.currentTime > ( config.duration || 1 ) && !_startedReleaseSequence) { 51 _video.removeEventListener('timeupdate', onTimeupdate); 52 _video.pause(); 53 _video.removeAttribute('src'); 54 _video.load(); 55 56 _startedReleaseSequence = true; 57 _mediaKeySession.closed.then(onClosed); 58 _mediaKeySession.remove().catch(onFailure); 59 } 60 } 61 62 function onPlaying(event) { 63 // Not using waitForEventAndRunStep() to avoid too many 64 // EVENT(onTimeUpdate) logs. 65 _video.addEventListener('timeupdate', onTimeupdate, true); 66 } 67 68 function onClosed() { 69 // Try and reload and check this fails 70 var mediaKeySession = _mediaKeys.createSession( 'persistent-license' ); 71 mediaKeySession.load(_sessionId).then( test.step_func(function(success) { 72 assert_false( success, "Load of removed session shouold fail" ); 73 test.done(); 74 })).catch(onFailure); 75 } 76 77 navigator.requestMediaKeySystemAccess(config.keysystem, [configuration]).then(function(access) { 78 return access.createMediaKeys(); 79 }).then(function(mediaKeys) { 80 _mediaKeys = mediaKeys; 81 return _video.setMediaKeys(_mediaKeys); 82 }).then(function() { 83 _mediaKeySession = _mediaKeys.createSession('persistent-license'); 84 waitForEventAndRunStep('encrypted', _video, onEncrypted, test); 85 waitForEventAndRunStep('playing', _video, onPlaying, test); 86 return testmediasource(config); 87 }).then(function(source) { 88 _mediaSource = source; 89 _video.src = URL.createObjectURL(_mediaSource); 90 return source.done; 91 }).then(function(){ 92 _video.play(); 93 }).catch(function (error) { 94 if (error && error.name === 'NotSupportedError') { 95 // If persistent license is not supported, skip test as 96 // key systems are not required to support this session 97 // type. 98 test.done(); 99 } else { 100 onFailure(error); 101 } 102 }); 103 }, testname); 104 }