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>
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)
23 var initDataType = getInitDataType();
24 var initData = getInitData(initDataType);
25 var startingActiveDOMObjectCount = window.internals.activeDOMObjectCount(document);
27 function numActiveDOMObjectsCreated()
29 return window.internals.activeDOMObjectCount(document) - startingActiveDOMObjectCount;
33 MediaKeys.create('org.w3.clearkey').then(function(result) {
36 // Verify MediaKeys are not an ActiveDOMObject.
37 assert_equals(numActiveDOMObjectsCreated(), 0, 'MediaKeys.create()');
39 mediaKeySession1 = mediaKeys.createSession();
40 return mediaKeySession1.generateRequest(initDataType, initData);
42 // Should be 1 MediaKeySession.
43 assert_equals(numActiveDOMObjectsCreated(), 1, 'mediaKeys.createSession(1)');
44 mediaKeySession2 = mediaKeys.createSession();
45 return mediaKeySession2.generateRequest(initDataType, initData);
47 // Should be 2 MediaKeySessions.
48 assert_equals(numActiveDOMObjectsCreated(), 2, 'mediaKeys.createSession(2)');
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);
62 mediaKeySession1 = null;
63 return createGCPromise();
64 }).then(function(result) {
65 // Only mediaKeySession2 should remain.
66 assert_equals(numActiveDOMObjectsCreated(), 1, 'mediaKeySession1 not collected');
68 mediaKeySession2 = null;
69 return createGCPromise();
70 }).then(function(result) {
71 assert_equals(numActiveDOMObjectsCreated(), 0, 'mediaKeySession2 not collected');
73 }).catch(function(error) {
74 forceTestFailureFromPromise(test, error);
76 }, 'MediaKeySession lifetime after release()');