diff options
Diffstat (limited to 'testing/web-platform/tests/encrypted-media/scripts/keystatuses-multiple-sessions.js')
-rw-r--r-- | testing/web-platform/tests/encrypted-media/scripts/keystatuses-multiple-sessions.js | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/testing/web-platform/tests/encrypted-media/scripts/keystatuses-multiple-sessions.js b/testing/web-platform/tests/encrypted-media/scripts/keystatuses-multiple-sessions.js new file mode 100644 index 000000000..e9bf10e88 --- /dev/null +++ b/testing/web-platform/tests/encrypted-media/scripts/keystatuses-multiple-sessions.js @@ -0,0 +1,103 @@ +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 ); +} |