keystatuses-multiple-sessions.js (4420B)
1 function runTest(config,qualifier) 2 { 3 var testname = testnamePrefix(qualifier, config.keysystem) + ', temporary, keystatuses, multiple sessions'; 4 5 var configuration = getSimpleConfigurationForContent(config.content); 6 7 if (config.initDataType && config.initData) configuration.initDataTypes = [config.initDataType]; 8 9 async_test(function(test) 10 { 11 var mediaKeySession1; 12 var mediaKeySession2; 13 14 // Even though key ids are uint8, using printable values so that 15 // they can be verified easily. 16 var key1 = new Uint8Array(config.content.keys[0].kid), 17 key2 = new Uint8Array(config.content.keys[1].kid), 18 variant1 = config.content.keys[0].variantId, 19 variant2 = config.content.keys[1].variantId; 20 21 function onFailure(error) { 22 forceTestFailureFromPromise(test,error); 23 } 24 25 function processMessage1(event) 26 { 27 // This should only be called for session1. 28 assert_equals(event.target, mediaKeySession1); 29 30 // No keys added yet. 31 verifyKeyStatuses(mediaKeySession1.keyStatuses, {expected: [], unexpected: [key1, key2]}); 32 33 // Add key1 to session1. 34 config.messagehandler(event.messageType, event.message, {variantId:variant1}).then(function(response) { 35 return event.target.update(response); 36 }).catch(onFailure); 37 38 } 39 40 function processKeyStatusesChange1(event) 41 { 42 // This should only be called for session1. 43 assert_equals(event.target, mediaKeySession1); 44 45 // Check that keyStatuses contains the expected key1 only. 46 verifyKeyStatuses(mediaKeySession1.keyStatuses, {expected: [key1], unexpected: [key2]}); 47 48 // Now trigger a message event on session2. 49 mediaKeySession2.generateRequest(config.initDataType, config.initData[1]).catch(onFailure); 50 } 51 52 function processMessage2(event) 53 { 54 // This should only be called for session2. 55 assert_equals(event.target, mediaKeySession2); 56 57 // session2 has no keys added yet. 58 verifyKeyStatuses(mediaKeySession2.keyStatuses, {expected: [], unexpected: [key1, key2]}); 59 60 // session1 should still have 1 key. 61 verifyKeyStatuses(mediaKeySession1.keyStatuses, {expected: [key1], unexpected: [key2]}); 62 63 // Add key2 to session2. 64 config.messagehandler(event.messageType, event.message, {variantId:variant2}).then(function(response) { 65 return event.target.update(response); 66 }).catch(onFailure); 67 } 68 69 function processKeyStatusesChange2(event) 70 { 71 // This should only be called for session2. 72 assert_equals(event.target, mediaKeySession2); 73 74 // Check that keyStatuses contains the expected key2 only. 75 verifyKeyStatuses(mediaKeySession2.keyStatuses, {expected: [key2], unexpected: [key1]}); 76 77 // session1 should still have 1 key. 78 verifyKeyStatuses(mediaKeySession1.keyStatuses, {expected: [key1], unexpected: [key2]}); 79 80 test.done(); 81 } 82 83 navigator.requestMediaKeySystemAccess(config.keysystem, [configuration]).then(function(access) { 84 return access.createMediaKeys(); 85 }).then(function(mediaKeys) { 86 mediaKeySession1 = mediaKeys.createSession(); 87 mediaKeySession2 = mediaKeys.createSession(); 88 89 // There should be no keys defined on either session. 90 verifyKeyStatuses(mediaKeySession1.keyStatuses, {expected: [], unexpected: [key1, key2]}); 91 verifyKeyStatuses(mediaKeySession2.keyStatuses, {expected: [], unexpected: [key1, key2]}); 92 93 // Bind all the event handlers now. 94 waitForEventAndRunStep('message', mediaKeySession1, processMessage1, test); 95 waitForEventAndRunStep('message', mediaKeySession2, processMessage2, test); 96 waitForEventAndRunStep('keystatuseschange', mediaKeySession1, processKeyStatusesChange1, test); 97 waitForEventAndRunStep('keystatuseschange', mediaKeySession2, processKeyStatusesChange2, test); 98 99 // Generate a request on session1. 100 return mediaKeySession1.generateRequest(config.initDataType, config.initData[0]); 101 }).catch(onFailure); 102 }, testname ); 103 }