4 <title>Waiting for a key.</title>
5 <script src="encrypted-media-utils.js"></script>
6 <script src="../w3c-media-utils.js"></script>
7 <script src="../../resources/testharness.js"></script>
8 <script src="../../resources/testharnessreport.js"></script>
11 <video id="testVideo"></video>
14 async_test(function(test)
16 var video = document.getElementById("testVideo");
17 var mediaKeys = new MediaKeys("org.w3.clearkey");
18 var mediaKeySession = null;
19 var sessionReadyReceived = false;
22 var rawKey = new Uint8Array([0xeb, 0xdd, 0x62, 0xf1, 0x68, 0x14, 0xd2, 0x7b,
23 0x68, 0xef, 0x12, 0x2a, 0xfc, 0xe4, 0xae, 0x3c]);
25 function onNeedKey(event)
27 assert_equals(event.target, video);
28 assert_true(event instanceof window.MediaKeyNeededEvent);
29 assert_equals(event.type, "needkey");
31 // The same decryption key is shared by all streams so only create a shared session once.
32 if (mediaKeySession != null)
35 mediaKeySession = mediaKeys.createSession(event.contentType, event.initData);
36 waitForEventAndRunStep("message", mediaKeySession, onMessage, test);
39 function onMessage(event)
41 assert_true(event instanceof window.MediaKeyMessageEvent);
42 assert_equals(event.target, mediaKeySession);
43 assert_equals(event.type, "message");
45 keyId = event.message;
46 setTimeout(verifyWaitingForKey, 250);
49 function verifyWaitingForKey()
51 // Make sure the video is NOT paused and not progressing before the session is updated.
52 // TODO(xhwang): Check "waiting" event after it's implemented. See http://crbug.com/337975
53 assert_false(video.paused);
54 assert_equals(video.currentTime, 0);
59 function updateSession()
61 assert_not_equals(keyId, null);
62 var jwkSet = stringToUint8Array(createJWKSet(createJWK(keyId, rawKey)));
63 mediaKeySession.update(jwkSet);
64 waitForEventAndRunStep("ready", mediaKeySession, onReady, test);
67 function onReady(event)
69 assert_true(event instanceof window.Event);
70 assert_equals(event.target, mediaKeySession);
71 assert_equals(event.type, "ready");
72 sessionReadyReceived = true;
75 function onPlaying(event)
77 // Not using waitForEventAndRunStep() to avoid too many EVENT(onTimeUpdate) logs.
78 video.addEventListener("timeupdate", onTimeUpdate, true);
81 function onTimeUpdate(event)
83 if (event.target.currentTime < 0.5 || !sessionReadyReceived)
89 waitForEventAndRunStep("needkey", video, onNeedKey, test);
90 waitForEventAndRunStep("playing", video, onPlaying, test);
92 video.src = "../content/test-encrypted.webm";
93 video.setMediaKeys(mediaKeys);
95 }, "Waiting for a key.");