103 lines
4.3 KiB
JavaScript
103 lines
4.3 KiB
JavaScript
function runTest(config,qualifier)
|
|
{
|
|
var testname = testnamePrefix(qualifier, config.keysystem) + ', temporary, keystatuses, multiple sessions';
|
|
|
|
var configuration = getSimpleConfigurationForContent(config.content);
|
|
|
|
if (config.initDataType && config.initData) configuration.initDataTypes = [config.initDataType];
|
|
|
|
async_test(function(test)
|
|
{
|
|
var mediaKeySession1;
|
|
var mediaKeySession2;
|
|
|
|
// Even though key ids are uint8, using printable values so that
|
|
// they can be verified easily.
|
|
var key1 = new Uint8Array(config.content.keys[0].kid),
|
|
key2 = new Uint8Array(config.content.keys[1].kid),
|
|
variant1 = config.content.keys[0].variantId,
|
|
variant2 = config.content.keys[1].variantId;
|
|
|
|
function onFailure(error) {
|
|
forceTestFailureFromPromise(test,error);
|
|
}
|
|
|
|
function processMessage1(event)
|
|
{
|
|
// This should only be called for session1.
|
|
assert_equals(event.target, mediaKeySession1);
|
|
|
|
// No keys added yet.
|
|
verifyKeyStatuses(mediaKeySession1.keyStatuses, {expected: [], unexpected: [key1, key2]});
|
|
|
|
// Add key1 to session1.
|
|
config.messagehandler(event.messageType, event.message, {variantId:variant1}).then(function(response) {
|
|
return event.target.update(response);
|
|
}).catch(onFailure);
|
|
|
|
}
|
|
|
|
function processKeyStatusesChange1(event)
|
|
{
|
|
// This should only be called for session1.
|
|
assert_equals(event.target, mediaKeySession1);
|
|
|
|
// Check that keyStatuses contains the expected key1 only.
|
|
verifyKeyStatuses(mediaKeySession1.keyStatuses, {expected: [key1], unexpected: [key2]});
|
|
|
|
// Now trigger a message event on session2.
|
|
mediaKeySession2.generateRequest(config.initDataType, config.initData[1]).catch(onFailure);
|
|
}
|
|
|
|
function processMessage2(event)
|
|
{
|
|
// This should only be called for session2.
|
|
assert_equals(event.target, mediaKeySession2);
|
|
|
|
// session2 has no keys added yet.
|
|
verifyKeyStatuses(mediaKeySession2.keyStatuses, {expected: [], unexpected: [key1, key2]});
|
|
|
|
// session1 should still have 1 key.
|
|
verifyKeyStatuses(mediaKeySession1.keyStatuses, {expected: [key1], unexpected: [key2]});
|
|
|
|
// Add key2 to session2.
|
|
config.messagehandler(event.messageType, event.message, {variantId:variant2}).then(function(response) {
|
|
return event.target.update(response);
|
|
}).catch(onFailure);
|
|
}
|
|
|
|
function processKeyStatusesChange2(event)
|
|
{
|
|
// This should only be called for session2.
|
|
assert_equals(event.target, mediaKeySession2);
|
|
|
|
// Check that keyStatuses contains the expected key2 only.
|
|
verifyKeyStatuses(mediaKeySession2.keyStatuses, {expected: [key2], unexpected: [key1]});
|
|
|
|
// session1 should still have 1 key.
|
|
verifyKeyStatuses(mediaKeySession1.keyStatuses, {expected: [key1], unexpected: [key2]});
|
|
|
|
test.done();
|
|
}
|
|
|
|
navigator.requestMediaKeySystemAccess(config.keysystem, [configuration]).then(function(access) {
|
|
return access.createMediaKeys();
|
|
}).then(function(mediaKeys) {
|
|
mediaKeySession1 = mediaKeys.createSession();
|
|
mediaKeySession2 = mediaKeys.createSession();
|
|
|
|
// There should be no keys defined on either session.
|
|
verifyKeyStatuses(mediaKeySession1.keyStatuses, {expected: [], unexpected: [key1, key2]});
|
|
verifyKeyStatuses(mediaKeySession2.keyStatuses, {expected: [], unexpected: [key1, key2]});
|
|
|
|
// Bind all the event handlers now.
|
|
waitForEventAndRunStep('message', mediaKeySession1, processMessage1, test);
|
|
waitForEventAndRunStep('message', mediaKeySession2, processMessage2, test);
|
|
waitForEventAndRunStep('keystatuseschange', mediaKeySession1, processKeyStatusesChange1, test);
|
|
waitForEventAndRunStep('keystatuseschange', mediaKeySession2, processKeyStatusesChange2, test);
|
|
|
|
// Generate a request on session1.
|
|
return mediaKeySession1.generateRequest(config.initDataType, config.initData[0]);
|
|
}).catch(onFailure);
|
|
}, testname );
|
|
}
|