Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / LayoutTests / media / encrypted-media / encrypted-media-lifetime-mediakeysession-reference.html
1 <!DOCTYPE html>
2 <html>
3     <head>
4         <title>Test MediaKeySession lifetime without release()</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         <div id="log"></div>
11         <script>
12             // Since MediaKeySession (but not MediaKeys) are ActiveDOMObjects,
13             // we can determine when they are garbage collected.
14             // MediaKeySessions remain as long as:
15             //   JavaScript has a reference to it
16             //   OR (MediaKeys is around
17             //       AND the session has not received a close() event)
18
19             async_test(function(test)
20             {
21                 var mediaKeys;
22                 var mediaKeySession1;
23                 var mediaKeySession2;
24                 var mediaKeySession3;
25                 var initDataType = getInitDataType();
26                 var initData = getInitData(initDataType);
27                 var startingActiveDOMObjectCount = window.internals.activeDOMObjectCount(document);
28
29                 function numActiveDOMObjectsCreated()
30                 {
31                     return window.internals.activeDOMObjectCount(document) - startingActiveDOMObjectCount;
32                 }
33
34                 MediaKeys.create('org.w3.clearkey').then(function(result) {
35                     mediaKeys = result;
36                     assert_equals(mediaKeys.keySystem, 'org.w3.clearkey');
37
38                     // Verify MediaKeys are not an ActiveDOMObject.
39                     assert_equals(numActiveDOMObjectsCreated(), 0, 'MediaKeys.create()');
40
41                     // Create 3 sessions.
42                     mediaKeySession1 = mediaKeys.createSession();
43                     return mediaKeySession1.generateRequest(initDataType, initData);
44                 }).then(function() {
45                     assert_true(mediaKeySession1.sessionId && mediaKeySession1.sessionId.length > 0);
46                     // Should be 1 MediaKeySession.
47                     assert_equals(numActiveDOMObjectsCreated(), 1, 'mediaKeys.createSession(1)');
48                     mediaKeySession2 = mediaKeys.createSession();
49                     return mediaKeySession2.generateRequest(initDataType, initData);
50                 }).then(function() {
51                     assert_true(mediaKeySession2.sessionId && mediaKeySession2.sessionId.length > 0);
52                     // Should be 2 MediaKeySessions.
53                     assert_equals(numActiveDOMObjectsCreated(), 2, 'mediaKeys.createSession(2)');
54                     mediaKeySession3 = mediaKeys.createSession();
55                     return mediaKeySession3.generateRequest(initDataType, initData);
56                 }).then(function() {
57                     assert_true(mediaKeySession3.sessionId && mediaKeySession3.sessionId.length > 0);
58                     // Should be 3 MediaKeySessions.
59                     assert_equals(numActiveDOMObjectsCreated(), 3, 'mediaKeys.createSession(3)');
60
61                     // Run gc(). All sessions should remain as we have a
62                     // reference to each one. However, running gc()
63                     // asynchronously should free up the last PromiseResolver.
64                     return createGCPromise();
65                 }).then(function(result) {
66                     assert_equals(numActiveDOMObjectsCreated(), 3, 'After gc()');
67
68                     // Now drop references to 2 of the sessions. Even though we
69                     // don't have a reference, MediaKeys is still around (and
70                     // the sessions aren't closed), so the objects won't be
71                     // collected.
72                     mediaKeySession1 = null;
73                     mediaKeySession2 = null;
74                     return createGCPromise();
75                 }).then(function(result) {
76                     return createGCPromise();
77                 }).then(function(result) {
78                     assert_equals(numActiveDOMObjectsCreated(), 3, 'After second gc()');
79
80                     // Now drop the reference to MediaKeys. It and the 2
81                     // unreferenced sessions should be collected. Since
82                     // MediaKeySessions remain alive as long as MediaKeys is
83                     // around, it is possible that gc() checks one or both
84                     // MediaKeySession objects first, and doesn't collect them
85                     // since MediaKeys hasn't been collected yet. Thus run gc()
86                     // twice, to ensure that the unreferenced MediaKeySession
87                     // objects get collected.
88                     mediaKeys = null;
89                     return createGCPromise();
90                 }).then(function(result) {
91                     return createGCPromise();
92                 }).then(function(result) {
93                     assert_equals(numActiveDOMObjectsCreated(), 1);
94
95                     // Drop the reference to the last session. It should get
96                     // collected now since MediaKeys is gone.
97                     mediaKeySession3 = null;
98                     return createGCPromise();
99                 }).then(function(result) {
100                     assert_equals(numActiveDOMObjectsCreated(), 0);
101                     test.done();
102                 }).catch(function(error) {
103                     forceTestFailureFromPromise(test, error);
104                 });
105             }, 'MediaKeySession lifetime without release()');
106         </script>
107     </body>
108 </html>