| <!DOCTYPE html> | |
| <title>Test that remove() succeeds on temporary sessions</title> | |
| // This test is similar to the layout test | |
| // encrypted-media-session-remove-temporary.html, but needs to run as a | |
| // browser test as it needs access to a license server (for Widevine). | |
| <div id="logs"></div> | |
| <script src='eme_player_js/app_loader.js' type='text/javascript'></script> | |
| <script type='text/javascript'> | |
| // This test only uses |keySystem| and |licenseServerURL|. | |
| var testConfig = new TestConfig(); | |
| testConfig.loadQueryParams(); | |
| // Use the default KEY_ID and KEY as specified in eme_player_js/globals.js. | |
| const keyId = KEY_ID; | |
| const key = KEY; | |
| // Code for using the Widevine key system. | |
| function WidevineKeySystemHelper() {} | |
| // Called when a 'message' event happens. Send the message to the license | |
| // server, and when the response is received, call update() and then call | |
| // |resolve| or |reject| as appropriate. | |
| WidevineKeySystemHelper.prototype.onMessage = function( | |
| event, resolve, reject) { | |
| var mediaKeySession = event.target; | |
| function onSuccess(response) { | |
| var key = new Uint8Array(response); | |
| Utils.timeLog('Calling update()'); | |
| mediaKeySession.update(key).then(resolve, reject); | |
| } | |
| Utils.sendRequest( | |
| 'POST', 'arraybuffer', Utils.convertToUint8Array(event.message), | |
| this.testConfig.licenseServerURL, onSuccess); | |
| }; | |
| // Code for using the ClearKey key system. | |
| function ClearKeyKeySystemHelper() {} | |
| // Called when a 'message' event happens. For ClearKey we know the key to be | |
| // used, so simply call update() and then call |resolve| or |reject| as | |
| // appropriate. | |
| ClearKeyKeySystemHelper.prototype.onMessage = function( | |
| event, resolve, reject) { | |
| var mediaKeySession = event.target; | |
| Utils.timeLog('Calling update()'); | |
| const jwkSet = Utils.createJWKData(keyId, key); | |
| mediaKeySession.update(jwkSet).then(resolve, reject); | |
| }; | |
| var keySystemHelper; | |
| if (testConfig.keySystem == WIDEVINE_KEYSYSTEM) { | |
| keySystemHelper = new WidevineKeySystemHelper(); | |
| } else if ( | |
| testConfig.keySystem == CLEARKEY || | |
| testConfig.keySystem == EXTERNAL_CLEARKEY) { | |
| keySystemHelper = new ClearKeyKeySystemHelper(); | |
| } else { | |
| Utils.timeLog('Unsupported key system ' + testConfig.keySystem); | |
| } | |
| // This test doesn't play any media, so no concern with specifying multiple | |
| // codecs. This is done to provide a set of codecs that should cover all | |
| // user agents. | |
| config = [{ | |
| initDataTypes: ['webm'], | |
| audioCapabilities: [ | |
| {contentType: 'audio/mp4; codecs="mp4a.40.2"'}, | |
| {contentType: 'audio/webm; codecs="opus"'}, | |
| ], | |
| persistentState: 'optional', | |
| sessionTypes: ['temporary'], | |
| }]; | |
| var mediaKeySession; | |
| navigator.requestMediaKeySystemAccess(testConfig.keySystem, config) | |
| .then(function(access) { | |
| Utils.timeLog( | |
| 'Supports initDataType ' + | |
| access.getConfiguration().initDataTypes[0]); | |
| return access.createMediaKeys(); | |
| }) | |
| .then(function(mediaKeys) { | |
| Utils.timeLog('Creating session'); | |
| mediaKeySession = mediaKeys.createSession(); | |
| // Register for the 'message' event before it happens. Although the | |
| // event shouldn't be generated until after the generateRequest() | |
| // promise is resolved, the handlers may be queued before the | |
| // JavaScript code runs (and thus be lost if an event handler is | |
| // not registered). | |
| // When the 'message' event occurs, keySystemHelper.onMessage() will | |
| // run. It will end up calling update(), and |waitForMessagePromise| | |
| // will be resolved or rejected with the result of calling update(). | |
| const waitForMessagePromise = Utils.waitForEvent( | |
| mediaKeySession, 'message', keySystemHelper.onMessage); | |
| // After update() is called, a 'keystatuseschange' event will occur. | |
| // Wait for it before checking the key statuses. Registering the event | |
| // handler now to ensure that the event gets caught. There is no need | |
| // to do anything in the event handler as the key statuses are on | |
| // |mediaKeySession|, and they can be checked after the promise is | |
| // resolved. | |
| const waitForKeyStatusChangePromise = | |
| Utils.waitForEvent(mediaKeySession, 'keystatuseschange'); | |
| // As this is using 'webm' initDataType, the data to generateRequest() | |
| // is simply the key ID. | |
| Utils.timeLog('Calling generateRequest()'); | |
| const generateRequestPromise = mediaKeySession.generateRequest( | |
| 'webm', Utils.convertToUint8Array(keyId)); | |
| // Can't tell what order the events happen, so simply wait for them all. | |
| return Promise.all([ | |
| generateRequestPromise, waitForMessagePromise, | |
| waitForKeyStatusChangePromise | |
| ]); | |
| }) | |
| .then(function() { | |
| // Session should have 1 usable key. | |
| Utils.timeLog('Checking for usable keyStatuses'); | |
| Utils.verifyKeyStatuses( | |
| mediaKeySession.keyStatuses, [{keyId: keyId, status: 'usable'}]); | |
| promises = []; | |
| // Once remove() is called, another 'keystatuseschange' event will | |
| // happen. | |
| promises.push(Utils.waitForEvent(mediaKeySession, 'keystatuseschange')); | |
| Utils.timeLog('Calling remove()'); | |
| promises.push(mediaKeySession.remove()); | |
| return Promise.all(promises); | |
| }) | |
| .then(function() { | |
| // After remove() all keys should be 'released'. | |
| Utils.timeLog('Checking for released keyStatuses'); | |
| Utils.verifyKeyStatuses( | |
| mediaKeySession.keyStatuses, [{keyId: keyId, status: 'released'}]); | |
| // After remove() the session expiry should be NaN. | |
| if (!isNaN(mediaKeySession.expiration)) { | |
| Utils.failTest('expiration is not Nan'); | |
| return; | |
| } | |
| Utils.timeLog('Calling close()'); | |
| return mediaKeySession.close(); | |
| }) | |
| .then(function() { | |
| // After close() there should be no keys. | |
| Utils.timeLog('Checking for empty keyStatuses'); | |
| Utils.verifyKeyStatuses(mediaKeySession.keyStatuses, []); | |
| Utils.setResultInTitle('ENDED'); | |
| }) | |
| .catch(function(error) { | |
| Utils.timeLog(error); | |
| Utils.failTest('Failed test.'); | |
| }); | |
| </script> | |
| </html> |