4 <title>Clear Key Playback with Multiple Sessions</title>
5 <script src="encrypted-media-utils.js"></script>
6 <script src="../../resources/testharness.js"></script>
7 <script src="../../resources/testharnessreport.js"></script>
10 <video id="testVideo"></video>
12 <p>Test playback of encrypted media using Clear Key key system with multiple sessions.</p>
14 async_test(function(test)
16 var video = document.getElementById('testVideo');
17 var audioMediaKeySession = null;
18 var videoMediaKeySession = null;
19 var audioKeyProvided = false;
20 var videoKeyProvided = false;
22 // The 2 streams use different key ids and different keys.
23 var audioKeyId = '1234567890123456';
24 var audioKey = new Uint8Array([0x30, 0x30, 0x62, 0xF1, 0x68, 0x14, 0xD2, 0x7B,
25 0x68, 0xEF, 0x12, 0x2A, 0xFC, 0xE4, 0xAE, 0x0A]);
26 var videoKeyId = '0123456789012345';
27 var videoKey = new Uint8Array([0x7A, 0x7A, 0x62, 0xF1, 0x68, 0x14, 0xD2, 0x7B,
28 0x68, 0xEF, 0x12, 0x2A, 0xFC, 0xE4, 0xAE, 0x0A]);
30 function onNeedKey(event)
32 var keyId = String.fromCharCode.apply(null, event.initData);
34 var mediaKeySession = video.mediaKeys.createSession();
35 waitForEventAndRunStep('message', mediaKeySession, onMessage, test);
36 mediaKeySession.generateRequest(event.contentType, event.initData).then(function() {
37 if (keyId == videoKeyId) {
38 assert_equals(videoMediaKeySession, null);
39 videoMediaKeySession = mediaKeySession;
41 assert_equals(keyId, audioKeyId);
42 assert_equals(audioMediaKeySession, null);
43 audioMediaKeySession = mediaKeySession;
45 }).catch(function(error) {
46 forceTestFailureFromPromise(test, error);
50 function onMessage(event)
52 var keyId = extractSingleKeyIdFromMessage(event.message);
53 if (event.target == videoMediaKeySession) {
54 assert_equals(String.fromCharCode.apply(null, keyId), videoKeyId);
55 var jwkSet = stringToUint8Array(createJWKSet(createJWK(keyId, videoKey)));
56 videoMediaKeySession.update(jwkSet).then(function(result) {
57 videoKeyProvided = true;
58 }).catch(function(error) {
59 forceTestFailureFromPromise(test, error);
62 assert_equals(event.target, audioMediaKeySession);
63 assert_equals(String.fromCharCode.apply(null, keyId), audioKeyId);
64 var jwkSet = stringToUint8Array(createJWKSet(createJWK(keyId, audioKey)));
65 audioMediaKeySession.update(jwkSet).then(function(result) {
66 audioKeyProvided = true;
67 }).catch(function(error) {
68 forceTestFailureFromPromise(test, error);
73 function onPlaying(event)
75 // Video should not start playing until both keys have been
77 assert_true(videoKeyProvided);
78 assert_true(audioKeyProvided);
80 // Not using waitForEventAndRunStep() to avoid too many
81 // EVENT(onTimeUpdate) logs.
82 video.addEventListener('timeupdate', onTimeUpdate, true);
85 function onTimeUpdate(event)
87 if (event.target.currentTime < 0.2)
93 MediaKeys.create('org.w3.clearkey').then(function(mediaKeys) {
94 waitForEventAndRunStep('needkey', video, onNeedKey, test);
95 waitForEventAndRunStep('playing', video, onPlaying, test);
96 video.src = '../content/test-encrypted-different-av-keys.webm';
97 return video.setMediaKeys(mediaKeys);
98 }).then(function(result) {
100 }).catch(function(error) {
101 forceTestFailureFromPromise(test, error);
103 }, 'Playback using Clear Key key system with multiple sessions.');