| 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 ); |
| } |