Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / LayoutTests / media / encrypted-media / encrypted-media-lifetime-mediakeysession-release.html
1 <!DOCTYPE html>
2 <html>
3     <head>
4         <title>Test MediaKeySession lifetime</title>
5         <script src="../w3c-media-utils.js"></script>
6         <script src="../../resources/testharness.js"></script>
7         <script src="../../resources/testharnessreport.js"></script>
8         <script src="../../resources/gc.js"></script>
9     </head>
10     <body>
11         <div id="log"></div>
12         <script>
13             // Since MediaKeySession (but not MediaKeys) are ActiveDOMObjects,
14             // we can determine when they are garbage collected.
15             // MediaKeySessions remain as long as:
16             //   JavaScript has a reference to it
17             //   OR (MediaKeys is around AND the session has not received a close() event)
18             async_test(function(test)
19             {
20                 var initData = new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7]);
21
22                 gc();
23                 var startingActiveDOMObjectCount = window.internals.activeDOMObjectCount(document);
24
25                 function numActiveDOMObjectsCreated()
26                 {
27                     gc();
28                     return window.internals.activeDOMObjectCount(document) - startingActiveDOMObjectCount;
29                 }
30
31                 // Create 2 sessions.
32                 var mediaKeys = new MediaKeys("org.w3.clearkey");
33                 var mediaKeySession1 = mediaKeys.createSession('video/webm', initData);
34                 assert_equals(numActiveDOMObjectsCreated(), 1);
35                 var mediaKeySession2 = mediaKeys.createSession('video/webm', initData);
36                 assert_equals(numActiveDOMObjectsCreated(), 2);
37                 var openSessions = 2;
38
39                 // Release the sessions. Once the close() event is received,
40                 // only the JS reference to them keeps them around.
41                 mediaKeySession1.release();
42                 waitForEventAndRunStep("close", mediaKeySession1, onClose, test);
43                 mediaKeySession2.release();
44                 waitForEventAndRunStep("close", mediaKeySession2, onClose, test);
45
46                 function onClose(event)
47                 {
48                     --openSessions;
49                     if (openSessions > 0)
50                         return;
51
52                     // Delay to give time for close to complete since
53                     // event.target is a reference to the MediaKeySession.
54                     setTimeout(finish, 1);
55                 }
56
57                 function finish()
58                 {
59                     // Since both sessions have been closed, dropping the
60                     // reference to them from JS will result in the session
61                     // being garbage-collected.
62                     assert_equals(openSessions, 0);
63                     assert_not_equals(mediaKeys, null);
64                     assert_equals(numActiveDOMObjectsCreated(), 2);
65
66                     mediaKeySession1 = null;
67                     gc();
68                     assert_equals(numActiveDOMObjectsCreated(), 1, "mediaKeySession1 not collected");
69
70                     mediaKeySession2 = null;
71                     gc();
72                     assert_equals(numActiveDOMObjectsCreated(), 0, "mediaKeySession2 not collected");
73
74                     test.done();
75                 }
76             }, "MediaKeySession lifetime after release()");
77         </script>
78     </body>
79 </html>