| Index: LayoutTests/media/encrypted-media/encrypted-media-keystatuses-multiple-sessions.html
 | 
| diff --git a/LayoutTests/media/encrypted-media/encrypted-media-keystatuses-multiple-sessions.html b/LayoutTests/media/encrypted-media/encrypted-media-keystatuses-multiple-sessions.html
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..a2c61c3b52555e8283a36f3620a5acd4dba631c2
 | 
| --- /dev/null
 | 
| +++ b/LayoutTests/media/encrypted-media/encrypted-media-keystatuses-multiple-sessions.html
 | 
| @@ -0,0 +1,115 @@
 | 
| +<!DOCTYPE html>
 | 
| +<html>
 | 
| +    <head>
 | 
| +        <title>Verify MediaKeySession.keyStatuses with multiple sessions</title>
 | 
| +        <script src="encrypted-media-utils.js"></script>
 | 
| +        <script src="../../resources/testharness.js"></script>
 | 
| +        <script src="../../resources/testharnessreport.js"></script>
 | 
| +    </head>
 | 
| +    <body>
 | 
| +        <div id="log"></div>
 | 
| +        <script>
 | 
| +            var mediaKeySession1;
 | 
| +            var mediaKeySession2;
 | 
| +
 | 
| +            // Even though key ids are uint8, using printable values so that
 | 
| +            // they can be verified easily.
 | 
| +            var key1 = stringToUint8Array('123');
 | 
| +            var key2 = stringToUint8Array('4567890');
 | 
| +            var rawKey1 = new Uint8Array([0xeb, 0xdd, 0x62, 0xf1, 0x68, 0x14, 0xd2, 0x7b,
 | 
| +                                          0x68, 0xef, 0x12, 0x2a, 0xfc, 0xe4, 0xae, 0x3c]);
 | 
| +            var rawKey2 = new Uint8Array([0x3c, 0xae, 0xe4, 0xfc, 0x2a, 0x12, 0xef, 0x68,
 | 
| +                                          0x7b, 0xd2, 0x14, 0x68, 0xf1, 0x62, 0xdd, 0xeb]);
 | 
| +
 | 
| +            async_test(function(test)
 | 
| +            {
 | 
| +                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.
 | 
| +                    var jwkSet = stringToUint8Array(createJWKSet(createJWK(key1, rawKey1)));
 | 
| +                    mediaKeySession1.update(jwkSet).catch(function(error) {
 | 
| +                        forceTestFailureFromPromise(test, error);
 | 
| +                    });
 | 
| +                }
 | 
| +
 | 
| +                function processKeyStatusesChange1(event)
 | 
| +                {
 | 
| +                    // This should only be called for session1.
 | 
| +                    assert_equals(event.target, mediaKeySession1);
 | 
| +
 | 
| +                    // Check that keyStatuses contains the expected key1 only.
 | 
| +                    dumpKeyStatuses(mediaKeySession1.keyStatuses);
 | 
| +                    verifyKeyStatuses(mediaKeySession1.keyStatuses, { expected: [key1], unexpected: [key2] });
 | 
| +
 | 
| +                    // Now trigger a message event on session2.
 | 
| +                    var initDataType = getInitDataType();
 | 
| +                    mediaKeySession2.generateRequest(initDataType, getInitData(initDataType)).catch(function(error) {
 | 
| +                        forceTestFailureFromPromise(test, error);
 | 
| +                    });
 | 
| +                }
 | 
| +
 | 
| +                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.
 | 
| +                    var jwkSet = stringToUint8Array(createJWKSet(createJWK(key2, rawKey2)));
 | 
| +                    mediaKeySession2.update(jwkSet).catch(function(error) {
 | 
| +                        forceTestFailureFromPromise(test, error);
 | 
| +                    });
 | 
| +                }
 | 
| +
 | 
| +                function processKeyStatusesChange2(event)
 | 
| +                {
 | 
| +                    // This should only be called for session2.
 | 
| +                    assert_equals(event.target, mediaKeySession2);
 | 
| +
 | 
| +                    // Check that keyStatuses contains the expected key2 only.
 | 
| +                    dumpKeyStatuses(mediaKeySession2.keyStatuses);
 | 
| +                    verifyKeyStatuses(mediaKeySession2.keyStatuses, { expected: [key2], unexpected: [key1] });
 | 
| +
 | 
| +                    // session1 should still have 1 key.
 | 
| +                    verifyKeyStatuses(mediaKeySession1.keyStatuses, { expected: [key1], unexpected: [key2] });
 | 
| +
 | 
| +                    test.done();
 | 
| +                }
 | 
| +
 | 
| +                navigator.requestMediaKeySystemAccess('org.w3.clearkey').then(function(access) {
 | 
| +                    return access.createMediaKeys();
 | 
| +                }).then(function(mediaKeys) {
 | 
| +                    var initDataType = getInitDataType();
 | 
| +                    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(initDataType, getInitData(initDataType));
 | 
| +                }).catch(function(error) {
 | 
| +                    forceTestFailureFromPromise(test, error);
 | 
| +                });
 | 
| +            }, 'Verify MediaKeySession.keyStatuses with multiple sessions.');
 | 
| +        </script>
 | 
| +    </body>
 | 
| +</html>
 | 
| 
 |