chromium/third_party/blink/web_tests/media/encrypted-media/encrypted-media-playback-two-videos.html

<!DOCTYPE html>
<html>
    <head>
        <title>Clear Key Play Two Videos At Same Time</title>
        <script src="encrypted-media-utils.js"></script>
        <script src="../../resources/testharness.js"></script>
        <script src="../../resources/testharnessreport.js"></script>
    </head>
    <body>
        <video id="testVideo"></video>
        <video id="secondVideo"></video>
        <script>
            // As this code doesn't wait for the 'message' event to simplify
            // the code, specify the key ID and key used by the encrypted
            // content.
            var keyId = stringToUint8Array('0123456789012345');
            var rawKey = new Uint8Array([0xeb, 0xdd, 0x62, 0xf1, 0x68, 0x14, 0xd2, 0x7b,
                                         0x68, 0xef, 0x12, 0x2a, 0xfc, 0xe4, 0xae, 0x3c]);
            var content = '../content/test-encrypted.webm';

            promise_test(function(test)
            {
                var promises = [
                    play_video_as_promise(document.getElementById('testVideo'), content),
                    play_video_as_promise(document.getElementById('secondVideo'), content)
                ];
                return Promise.all(promises);
            }, 'Play two videos at the same time.');

            function play_video_as_promise(video, content)
            {
                return navigator.requestMediaKeySystemAccess('org.w3.clearkey', getConfigurationForFile(content)).then(function(access) {
                    return access.createMediaKeys();
                }).then(function(mediaKeys) {
                    return video.setMediaKeys(mediaKeys);
                }).then(function(result) {
                    video.src = content;
                    video.play();
                    return wait_for_encrypted_message(video);
                }).then(function(result) {
                    return wait_for_timeupdate_message(video);
                });
            };

            function wait_for_encrypted_message(video)
            {
                var encryptedEventCount = 0;
                return new Promise(function(resolve) {
                    video.addEventListener('encrypted', function listener(e) {
                        // The same decryption key is used by both the audio
                        // and the video streams so only create a session once.
                        // Create the session on the second event. This also
                        // ensures we see both events.
                        if (++encryptedEventCount != 2)
                            return;
                        video.removeEventListener('encrypted', listener);

                        var mediaKeySession = video.mediaKeys.createSession();
                        mediaKeySession.generateRequest(e.initDataType, e.initData).then(function(result) {
                            // Don't bother waiting for the 'message' event.
                            // Just call update() since we know the keyId
                            // needed.
                            var jwkSet = stringToUint8Array(createJWKSet(createJWK(keyId, rawKey)));
                            return mediaKeySession.update(jwkSet);
                        }).then(function(result) {
                            resolve(result);
                        });
                    });
                });
            };

            function wait_for_timeupdate_message(video)
            {
                return new Promise(function(resolve) {
                    video.addEventListener('timeupdate', function listener(e) {
                        if (e.target.currentTime < 0.2)
                            return;
                        video.removeEventListener('timeupdate', listener);
                        resolve(e);
                    });
                });
            };
        </script>
    </body>
</html>