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>
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)
20 var initDataType = getInitDataType();
21 var initData = getInitData(initDataType);
22 var startingActiveDOMObjectCount = window.internals.activeDOMObjectCount(document);
24 function numActiveDOMObjectsCreated()
26 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 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);
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()');
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;
65 }).then(function(result) {
66 // Give time so that the close event can be processed by
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;
77 }).then(function(result) {
78 // Provide time for the mediaKeySession2 close event to be
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);
87 }).catch(function(error) {
88 forceTestFailureFromPromise(test, error);
90 }, 'MediaKeySession lifetime after release() without references');