blob: 84a11fbe566c7cbea107c7c71737440b20559238 [file] [log] [blame]
<!DOCTYPE html>
<title>Test running different types of CDM in the system</title>
<div id="console"></div>
<script src='eme_player_js/app_loader.js' type='text/javascript'></script>
<script type='text/javascript'>
function log(message) {
let consoleElement = document.getElementById('console');
let entry = document.createElement('div');
entry.appendChild(document.createTextNode(message));
consoleElement.appendChild(entry);
console.log(message);
}
const EXTERNAL_CLEARKEY_DIFFERENTGUID
= 'org.chromium.externalclearkey.differentguid';
const crashKeyId = 'crash';
const normalJwkSet = Utils.createJWKData(KEY_ID, KEY);
const crashJwkSet = Utils.createJWKData(crashKeyId, KEY);
var config = {
initDataTypes : [ 'keyids' ],
videoCapabilities: [{contentType: 'video/webm; codecs="vp8"'}],
persistentState: 'optional',
sessionTypes: ['temporary'],
};
function createMediaKeySession(key_system) {
var mediaKeySession;
return navigator.requestMediaKeySystemAccess(key_system, [config])
.then(function(access) {
initDataType = access.getConfiguration().initDataTypes[0];
initData = Utils.createKeyIdsInitializationData(KEY_ID)
return access.createMediaKeys();
}).then(function(result) {
log('CDM created');
var mediaKeys = result;
mediaKeySession = mediaKeys.createSession();
return mediaKeySession.generateRequest(initDataType, initData);
}).then(function() {
mediaKeySession.update(normalJwkSet);
}).then(function() {
return mediaKeySession;
});
}
log('Start test');
// Using EXTERNAL_CLEARKEY
var session1;
// Both using EXTERNAL_CLEARKEY_DIFFERENTGUID
var session2;
var session3;
// The following creates 3 MediaKeys instances each with a MediaKeySession.
// MediaKeys using different CDM GUID will run in different processes.
// |session1| uses EXTERNAL_CLEARKEY that is registered with the default GUID
// for Clear Key CDM. |session2/3| use EXTERNAL_CLEARKEY_DIFFERENTGUID that is
// registered with a different GUID. So |session1| will run in process1, and
// |session2/3| will run in process2.
//
// Then we send a special response |crashJwkSet| to session2 which will cause
// the process2 to crash. This will close both |session2/3| as they run in the
// same process. |session1| should not be affected. Then we try to create
// another MediaKeySession using EXTERNAL_CLEARKEY_DIFFERENTGUID, and the
// creation should work as a new process should be started.
createMediaKeySession(EXTERNAL_CLEARKEY).then(function(session) {
log('Session1 created');
session1 = session;
return createMediaKeySession(EXTERNAL_CLEARKEY_DIFFERENTGUID);
}).then(function(session) {
log('Session2 created');
session2 = session;
return createMediaKeySession(EXTERNAL_CLEARKEY_DIFFERENTGUID);
}).then(function(session) {
log('Session3 created');
session3 = session;
log('Crash session2');
return session.update(crashJwkSet);
}).finally(function() {
// Due to the crash, the update() above could resolve or reject.
// So use "finally" so that we continue the test regardless.
log('Session2 crashed');
return session2.closed;
}).then(function() {
log('Session2 closed');
return session3.closed;
}).then(function() {
log('Session3 also closed');
return session1.update(normalJwkSet);
}).then(function() {
log('Session1 still works');
return createMediaKeySession(EXTERNAL_CLEARKEY_DIFFERENTGUID);
}).then(function(session) {
log('Can still create a session after crash');
Utils.setResultInTitle('ENDED');
}).catch(function(error) {
log('Error: ' + error);
Utils.failTest('Test failed: ' + error);
});
</script>
</html>