Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / LayoutTests / media / encrypted-media / encrypted-media-playback-multiple-sessions.html
1 <!DOCTYPE html>
2 <html>
3     <head>
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>
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 with multiple sessions.</p>
13         <script>
14             async_test(function(test)
15             {
16                 var video = document.getElementById('testVideo');
17                 var audioMediaKeySession = null;
18                 var videoMediaKeySession = null;
19                 var audioKeyProvided = false;
20                 var videoKeyProvided = false;
21
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]);
29
30                 function onNeedKey(event)
31                 {
32                     var keyId = String.fromCharCode.apply(null, event.initData);
33
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;
40                         } else {
41                             assert_equals(keyId, audioKeyId);
42                             assert_equals(audioMediaKeySession, null);
43                             audioMediaKeySession = mediaKeySession;
44                         }
45                     }).catch(function(error) {
46                         forceTestFailureFromPromise(test, error);
47                     });
48                 }
49
50                 function onMessage(event)
51                 {
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);
60                         });
61                     } else {
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);
69                         });
70                     }
71                 }
72
73                 function onPlaying(event)
74                 {
75                     // Video should not start playing until both keys have been
76                     // provided.
77                     assert_true(videoKeyProvided);
78                     assert_true(audioKeyProvided);
79
80                     // Not using waitForEventAndRunStep() to avoid too many
81                     // EVENT(onTimeUpdate) logs.
82                     video.addEventListener('timeupdate', onTimeUpdate, true);
83                 }
84
85                 function onTimeUpdate(event)
86                 {
87                     if (event.target.currentTime < 0.2)
88                         return;
89
90                     test.done();
91                 }
92
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) {
99                     video.play();
100                 }).catch(function(error) {
101                     forceTestFailureFromPromise(test, error);
102                 });
103             }, 'Playback using Clear Key key system with multiple sessions.');
104         </script>
105     </body>
106 </html>