Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / LayoutTests / media / encrypted-media / encrypted-media-lifetime-mediakeysession-release-noreference.html
1 <!DOCTYPE html>
2 <html>
3     <head>
4         <title>Test MediaKeySession lifetime after release() without references</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 initDataType = getInitDataType();
21                 var initData = getInitData(initDataType);
22                 var startingActiveDOMObjectCount = window.internals.activeDOMObjectCount(document);
23
24                 function numActiveDOMObjectsCreated()
25                 {
26                     return window.internals.activeDOMObjectCount(document) - startingActiveDOMObjectCount;
27                 }
28
29                 // Create 2 sessions.
30                 var mediaKeys;
31                 var mediaKeySession1;
32                 var mediaKeySession2;
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                     assert_true(mediaKeySession1.sessionId && mediaKeySession1.sessionId.length > 0);
43                     // Should be 1 MediaKeySession.
44                     assert_equals(numActiveDOMObjectsCreated(), 1, 'mediaKeys.createSession(1)');
45                     mediaKeySession2 = mediaKeys.createSession();
46                     return mediaKeySession2.generateRequest(initDataType, initData);
47                 }).then(function() {
48                     assert_true(mediaKeySession2.sessionId && mediaKeySession2.sessionId.length > 0);
49                     // Should be 2 MediaKeySessions.
50                     assert_equals(numActiveDOMObjectsCreated(), 2, 'mediaKeys.createSession(2)');
51                 }).then(function(result) {
52                     // Run gc(). All sessions should remain as we have a
53                     // reference to each one.
54                     return createGCPromise();
55                 }).then(function(result) {
56                     // Should be just the 2 MediaKeySessions.
57                     assert_equals(numActiveDOMObjectsCreated(), 2, 'After gc()');
58
59                     // Release the sessions. Once the close() event is received,
60                     // they should get garbage collected as there are no JS
61                     // references to them.
62                     var promise = mediaKeySession1.release();
63                     mediaKeySession1 = null;
64                     return promise;
65                 }).then(function(result) {
66                     // Give time so that the close event can be processed by
67                     // MediaKeySession.
68                     return delayToAllowEventProcessingPromise();
69                 }).then(function(result) {
70                     return createGCPromise();
71                 }).then(function(result) {
72                     // Should be just mediaKeySession2.
73                     assert_equals(numActiveDOMObjectsCreated(), 1);
74                     var promise = mediaKeySession2.release();
75                     mediaKeySession2 = null;
76                     return promise;
77                 }).then(function(result) {
78                     // Provide time for the mediaKeySession2 close event to be
79                     // handled.
80                     return delayToAllowEventProcessingPromise();
81                 }).then(function(result) {
82                     return createGCPromise();
83                 }).then(function(result) {
84                     assert_equals(numActiveDOMObjectsCreated(), 0);
85                     assert_not_equals(mediaKeys, null);
86                     test.done();
87                 }).catch(function(error) {
88                     forceTestFailureFromPromise(test, error);
89                 });
90             }, 'MediaKeySession lifetime after release() without references');
91         </script>
92     </body>
93 </html>