Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / LayoutTests / media / encrypted-media / encrypted-media-lifetime-reload.html
1 <!DOCTYPE html>
2 <html>
3     <head>
4         <title>Reloading during encrypted media 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 reloading during encrypted media playback.</p>
13         <script>
14             async_test(function(test)
15             {
16                 var video = document.getElementById('testVideo');
17                 var mediaKeySession = null;
18                 var isSessionCreated = false;
19                 var sessionReadyReceived = false;
20
21                 var rawKey = new Uint8Array([0xeb, 0xdd, 0x62, 0xf1, 0x68, 0x14, 0xd2, 0x7b,
22                                              0x68, 0xef, 0x12, 0x2a, 0xfc, 0xe4, 0xae, 0x3c]);
23
24                 function onNeedKey(event)
25                 {
26                     assert_equals(event.target, video);
27                     assert_true(event instanceof window.MediaKeyNeededEvent);
28                     assert_equals(event.type, 'needkey');
29
30                     // The same decryption key is shared by all streams so only
31                     // create a shared session once.
32                     if (isSessionCreated)
33                         return;
34                     isSessionCreated = true;
35
36                     mediaKeySession = video.mediaKeys.createSession();
37                     waitForEventAndRunStep('message', mediaKeySession, onMessage, test);
38                     mediaKeySession.generateRequest(event.contentType, event.initData).catch(function(error) {
39                         forceTestFailureFromPromise(test, error);
40                     });
41                 }
42
43                 function onMessage(event)
44                 {
45                     assert_true(event instanceof window.MediaKeyMessageEvent);
46                     assert_equals(event.target, mediaKeySession);
47                     assert_equals(event.type, 'message');
48
49                     var keyId = extractSingleKeyIdFromMessage(event.message);
50                     var jwkSet = stringToUint8Array(createJWKSet(createJWK(keyId, rawKey)));
51                     mediaKeySession.update(jwkSet).then(function(result) {
52                         sessionReadyReceived = true;
53                     }).catch(function(error) {
54                         forceTestFailureFromPromise(test, error);
55                     });
56                 }
57
58                 function onPlaying(event)
59                 {
60                     // Not using waitForEventAndRunStep() to avoid too many
61                     // EVENT(onTimeUpdate) logs.
62                     video.addEventListener('timeupdate', onTimeUpdate, true);
63                 }
64
65                 function onTimeUpdate(event)
66                 {
67                     if (event.target.currentTime < 0.2 || !sessionReadyReceived)
68                         return;
69
70                     // Reload the page to catch any possible teardown issues.
71                     if (location.hash == '#x') {
72                         test.done();
73                         return;
74                     }
75
76                     location.hash += 'x';
77                     location.reload();
78                 }
79
80                 MediaKeys.create('org.w3.clearkey').then(function(mediaKeys) {
81                     waitForEventAndRunStep('needkey', video, onNeedKey, test);
82                     waitForEventAndRunStep('playing', video, onPlaying, test);
83                     video.src = '../content/test-encrypted.webm';
84                     return video.setMediaKeys(mediaKeys);
85                 }).then(function(result) {
86                     video.play();
87                 }).catch(function(error) {
88                     forceTestFailureFromPromise(test, error);
89                 });
90             }, 'Reloading during encrypted media playback.');
91         </script>
92     </body>
93 </html>