Upstream version 10.39.225.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>MediaKeySession lifetime after 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             async_test(function(test)
19             {
20                 var mediaKeys;
21                 var mediaKeySession1;
22                 var mediaKeySession2;
23                 var initDataType = getInitDataType();
24                 var initData = getInitData(initDataType);
25                 var startingActiveDOMObjectCount = window.internals.activeDOMObjectCount(document);
26
27                 function numActiveDOMObjectsCreated()
28                 {
29                     return window.internals.activeDOMObjectCount(document) - startingActiveDOMObjectCount;
30                 }
31
32                 // Create 2 sessions.
33                 MediaKeys.create('org.w3.clearkey').then(function(result) {
34                     mediaKeys = result;
35
36                     // Verify MediaKeys are not an ActiveDOMObject.
37                     assert_equals(numActiveDOMObjectsCreated(), 0, 'MediaKeys.create()');
38
39                     mediaKeySession1 = mediaKeys.createSession();
40                     return mediaKeySession1.generateRequest(initDataType, initData);
41                 }).then(function() {
42                     // Should be 1 MediaKeySession.
43                     assert_equals(numActiveDOMObjectsCreated(), 1, 'mediaKeys.createSession(1)');
44                     mediaKeySession2 = mediaKeys.createSession();
45                     return mediaKeySession2.generateRequest(initDataType, initData);
46                 }).then(function() {
47                     // Should be 2 MediaKeySessions.
48                     assert_equals(numActiveDOMObjectsCreated(), 2, 'mediaKeys.createSession(2)');
49
50                     // Release the sessions. Once completed, only the JS
51                     // reference to them keeps them around.
52                     return mediaKeySession1.release();
53                 }).then(function(result) {
54                     return mediaKeySession2.release();
55                 }).then(function(result) {
56                     // Since both sessions have been closed, dropping the
57                     // reference to them from JS will result in the session
58                     // being garbage-collected.
59                     // Should be 2 MediaKeySessions.
60                     assert_equals(numActiveDOMObjectsCreated(), 2);
61
62                     mediaKeySession1 = null;
63                     return createGCPromise();
64                 }).then(function(result) {
65                     // Only mediaKeySession2 should remain.
66                     assert_equals(numActiveDOMObjectsCreated(), 1, 'mediaKeySession1 not collected');
67
68                     mediaKeySession2 = null;
69                     return createGCPromise();
70                 }).then(function(result) {
71                     assert_equals(numActiveDOMObjectsCreated(), 0, 'mediaKeySession2 not collected');
72                     test.done();
73                 }).catch(function(error) {
74                     forceTestFailureFromPromise(test, error);
75                 });
76             }, 'MediaKeySession lifetime after release()');
77         </script>
78     </body>
79 </html>