4 <title>Clear Key Playback</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.</p>
14 async_test(function(test)
16 var video = document.getElementById('testVideo');
17 var isSessionCreated = false;
18 var isUpdatePromiseResolved = false;
20 var rawKey = new Uint8Array([0xeb, 0xdd, 0x62, 0xf1, 0x68, 0x14, 0xd2, 0x7b,
21 0x68, 0xef, 0x12, 0x2a, 0xfc, 0xe4, 0xae, 0x3c]);
23 function onNeedKey(event)
25 assert_equals(event.target, video);
26 assert_true(event instanceof window.MediaKeyNeededEvent);
27 assert_equals(event.type, 'needkey');
29 // The same decryption key is shared by all streams so only create a shared session once.
32 isSessionCreated = true;
34 var mediaKeySession = video.mediaKeys.createSession();
35 waitForEventAndRunStep('message', mediaKeySession, onMessage, test);
36 mediaKeySession.generateRequest(event.contentType, event.initData).catch(function(error) {
37 forceTestFailureFromPromise(test, error);
41 function onMessage(event)
43 assert_true(event instanceof window.MediaKeyMessageEvent);
44 assert_equals(event.type, 'message');
46 var keyId = extractSingleKeyIdFromMessage(event.message);
47 var jwkSet = stringToUint8Array(createJWKSet(createJWK(keyId, rawKey)));
48 event.target.update(jwkSet).then(function(result) {
49 isUpdatePromiseResolved = true;
50 }).catch(function(error) {
51 forceTestFailureFromPromise(test, error);
55 function onPlaying(event)
57 // Not using waitForEventAndRunStep() to avoid too many
58 // EVENT(onTimeUpdate) logs.
59 video.addEventListener('timeupdate', onTimeUpdate, true);
62 function onTimeUpdate(event)
64 if (event.target.currentTime < 0.2 || !isUpdatePromiseResolved)
70 MediaKeys.create('org.w3.clearkey').then(function(mediaKeys) {
72 waitForEventAndRunStep('needkey', video, onNeedKey, test);
73 waitForEventAndRunStep('playing', video, onPlaying, test);
75 return video.setMediaKeys(mediaKeys);
76 }).then(function(result) {
77 video.src = '../content/test-encrypted.webm';
79 }).catch(function(error) {
80 forceTestFailureFromPromise(test, error);
82 }, 'Playback using Clear Key key system, calling setMediaKeys() before setting src attribute.');