Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / LayoutTests / media / encrypted-media / encrypted-media-playback-setmediakeys-before-src.html
1 <!DOCTYPE html>
2 <html>
3     <head>
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>
8     </head>
9     <body>
10         <video id="testVideo"></video>
11         <div id="log"></div>
12         <p>Test playback of encrypted media using Clear Key key system.</p>
13         <script>
14             async_test(function(test)
15             {
16                 var video = document.getElementById('testVideo');
17                 var isSessionCreated = false;
18                 var isUpdatePromiseResolved = false;
19
20                 var rawKey = new Uint8Array([0xeb, 0xdd, 0x62, 0xf1, 0x68, 0x14, 0xd2, 0x7b,
21                                              0x68, 0xef, 0x12, 0x2a, 0xfc, 0xe4, 0xae, 0x3c]);
22
23                 function onNeedKey(event)
24                 {
25                     assert_equals(event.target, video);
26                     assert_true(event instanceof window.MediaKeyNeededEvent);
27                     assert_equals(event.type, 'needkey');
28
29                     // The same decryption key is shared by all streams so only create a shared session once.
30                     if (isSessionCreated)
31                         return;
32                     isSessionCreated = true;
33
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);
38                     });
39                 }
40
41                 function onMessage(event)
42                 {
43                     assert_true(event instanceof window.MediaKeyMessageEvent);
44                     assert_equals(event.type, 'message');
45
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);
52                     });
53                 }
54
55                 function onPlaying(event)
56                 {
57                     // Not using waitForEventAndRunStep() to avoid too many
58                     // EVENT(onTimeUpdate) logs.
59                     video.addEventListener('timeupdate', onTimeUpdate, true);
60                 }
61
62                 function onTimeUpdate(event)
63                 {
64                     if (event.target.currentTime < 0.2 || !isUpdatePromiseResolved)
65                         return;
66
67                     test.done();
68                 }
69
70                 MediaKeys.create('org.w3.clearkey').then(function(mediaKeys) {
71
72                     waitForEventAndRunStep('needkey', video, onNeedKey, test);
73                     waitForEventAndRunStep('playing', video, onPlaying, test);
74
75                     return video.setMediaKeys(mediaKeys);
76                 }).then(function(result) {
77                     video.src = '../content/test-encrypted.webm';
78                     video.play();
79                 }).catch(function(error) {
80                     forceTestFailureFromPromise(test, error);
81                 });
82             }, 'Playback using Clear Key key system, calling setMediaKeys() before setting src attribute.');
83         </script>
84     </body>
85 </html>