4 <title>Waiting for a key.</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>
13 async_test(function(test)
15 var video = document.getElementById('testVideo');
16 var mediaKeySession = null;
17 var sessionCreated = false;
18 var sessionReadyReceived = false;
21 var rawKey = new Uint8Array([0xeb, 0xdd, 0x62, 0xf1, 0x68, 0x14, 0xd2, 0x7b,
22 0x68, 0xef, 0x12, 0x2a, 0xfc, 0xe4, 0xae, 0x3c]);
24 function onNeedKey(event)
26 assert_equals(event.target, video);
27 assert_true(event instanceof window.MediaKeyNeededEvent);
28 assert_equals(event.type, 'needkey');
30 // The same decryption key is shared by all streams so only
31 // create a shared session once.
34 sessionCreated = true;
36 video.mediaKeys.createSession(event.contentType, event.initData).then(function(newSession) {
37 mediaKeySession = newSession;
38 waitForEventAndRunStep('message', mediaKeySession, onMessage, test);
39 }).catch(function(error) {
40 forceTestFailureFromPromise(test, error);
44 function onMessage(event)
46 assert_true(event instanceof window.MediaKeyMessageEvent);
47 assert_equals(event.target, mediaKeySession);
48 assert_equals(event.type, 'message');
50 keyId = extractSingleKeyIdFromMessage(event.message);
51 setTimeout(verifyWaitingForKey, 250);
54 function verifyWaitingForKey()
56 // Make sure the video is NOT paused and not progressing
57 // before the session is updated.
58 // TODO(xhwang): Check "waiting" event after it's
59 // implemented. See http://crbug.com/337975
60 assert_false(video.paused);
61 assert_equals(video.currentTime, 0);
66 function updateSession()
68 assert_not_equals(keyId, null);
69 var jwkSet = stringToUint8Array(createJWKSet(createJWK(keyId, rawKey)));
70 mediaKeySession.update(jwkSet).then(function(result) {
71 sessionReadyReceived = true;
72 }).catch(function(error) {
73 forceTestFailureFromPromise(test, error);
77 function onPlaying(event)
79 // Not using waitForEventAndRunStep() to avoid too many
80 // EVENT(onTimeUpdate) logs.
81 video.addEventListener('timeupdate', onTimeUpdate, true);
84 function onTimeUpdate(event)
86 if (event.target.currentTime < 0.5 || !sessionReadyReceived)
92 MediaKeys.create('org.w3.clearkey').then(function(mediaKeys) {
93 waitForEventAndRunStep('needkey', video, onNeedKey, test);
94 waitForEventAndRunStep('playing', video, onPlaying, test);
96 video.setMediaKeys(mediaKeys);
97 video.src = '../content/test-encrypted.webm';
99 }).catch(function(error) {
100 forceTestFailureFromPromise(test, error);
102 }, 'Waiting for a key.');