summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeysession-reference.html
blob: 4b8ad1b46dd8180db4452b01b6b283b1a031536a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
<!DOCTYPE html>
<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
<html>
    <head>
        <title>Test MediaKeySession lifetime without release()</title>
        <script src="encrypted-media-utils.js"></script>
<!--
        Test requires Chromium specific content and is being disabled.
        <script src="/resources/testharness.js"></script>
        <script src="/resources/testharnessreport.js"></script>
-->
    </head>
    <body>
        <div id="log"></div>
        <script>
            // Since MediaKeySession (and MediaKeys) are ActiveDOMObjects,
            // we can determine when they are garbage collected.
            // MediaKeySessions remain as long as:
            //   JavaScript has a reference to it
            //   OR (MediaKeys is around
            //       AND the session has not received a close() event)

            async_test(function(test)
            {
                var mediaKeys;
                var mediaKeySession1;
                var mediaKeySession2;
                var mediaKeySession3;
                var initDataType;
                var initData;
                var startingActiveDOMObjectCount = window.internals.activeDOMObjectCount(document);

                function numActiveDOMObjectsCreated()
                {
                    return window.internals.activeDOMObjectCount(document) - startingActiveDOMObjectCount;
                }

                navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) {
                    initDataType = access.getConfiguration().initDataTypes[0];
                    initData = getInitData(initDataType);
                    return access.createMediaKeys();
                }).then(function(result) {
                    mediaKeys = result;
                    assert_equals(typeof mediaKeys.createSession, 'function');

                    // Verify MediaKeys is an ActiveDOMObject.
                    // In non-Oilpan, numActiveDOMObjectsCreate() == 1.
                    // In Oilpan, numActiveDOMObjectsCreate() <= 4.
                    // (1 MediaKeys,
                    //  1 MediaKeysInitializer and
                    //  1 MediaKeySystemAccessInitializer (navigator.requestMediaKeySystemAccess() use above),
                    //  1 MediaKeySystemAccessInitializer (isInitDataSupported() (via getSupportedInitDataType())))
                    assert_between_inclusive(numActiveDOMObjectsCreated(), 1, 4, 'MediaKeys.create()');

                    // Create 3 sessions.
                    mediaKeySession1 = mediaKeys.createSession();
                    return mediaKeySession1.generateRequest(initDataType, initData);
                }).then(function() {
                    assert_true(mediaKeySession1.sessionId && mediaKeySession1.sessionId.length > 0);

                    // Should be 1 MediaKeys + 1 MediaKeySession.
                    // In non-Oilpan, numActiveDOMObjectsCreate() == 2.
                    // In Oilpan, numActiveDOMObjectsCreate() <= 6.
                    // (1 MediaKeys,
                    //  1 MediaKeysInitializer and
                    //  2 MediaKeySystemAccessInitializer,
                    //  1 ContentDecryptionModuleResultPromise and
                    //  1 MediaKeySession).
                    assert_between_inclusive(numActiveDOMObjectsCreated(), 2, 6, 'MediaKeys.createSession(1)');

                    mediaKeySession2 = mediaKeys.createSession();
                    return mediaKeySession2.generateRequest(initDataType, initData);
                }).then(function() {
                    assert_true(mediaKeySession2.sessionId && mediaKeySession2.sessionId.length > 0);

                    // Should be 1 MediaKeys + 2 MediaKeySessions.
                    // In non-Oilpan, numActiveDOMObjectsCreate() == 3.
                    // In Oilpan, numActiveDOMObjectsCreate() <= 8.
                    // (1 MediaKeys,
                    //  1 MediaKeysInitializer and
                    //  2 MediaKeySystemAccessInitializers,
                    //  2 ContentDecryptionModuleResultPromise and
                    //  2 MediaKeySession).
                    assert_between_inclusive(numActiveDOMObjectsCreated(), 3, 8, 'mediaKeys.createSession(2)');

                    mediaKeySession3 = mediaKeys.createSession();
                    return mediaKeySession3.generateRequest(initDataType, initData);
                }).then(function() {
                    assert_true(mediaKeySession3.sessionId && mediaKeySession3.sessionId.length > 0);

                    // Should be 1 MediaKeys + 3 MediaKeySessions.
                    // In non-Oilpan, numActiveDOMObjectsCreate() == 4.
                    // In Oilpan, numActiveDOMObjectsCreate() <= 10.
                    // (1 MediaKeys,
                    //  1 MediaKeysInitializer and
                    //  2 MediaKeySystemAccessInitializers,
                    //  3 ContentDecryptionModuleResultPromise and
                    //  3 MediaKeySession).
                    assert_between_inclusive(numActiveDOMObjectsCreated(), 4, 10, 'mediaKeys.createSession(3)');

                    // Run gc(). All sessions should remain as we have a
                    // reference to each one. However, running gc()
                    // asynchronously should free up the last PromiseResolver.
                    return createGCPromise();
                }).then(function(result) {
                    // Only MediaKeys + 3 MediaKeySessions should remain.
                    // In non-Oilpan, there is also something from createGCPromise().
                    assert_between_inclusive(numActiveDOMObjectsCreated(), 4, 5, 'After gc()');

                    // Now drop references to 2 of the sessions. Even though we
                    // don't have a reference, MediaKeys is still around (and
                    // the sessions aren't closed), so the objects won't be
                    // collected.
                    mediaKeySession1 = null;
                    mediaKeySession2 = null;
                    return createGCPromise();
                }).then(function(result) {
                    return createGCPromise();
                }).then(function(result) {
                    // MediaKeys + 3 MediaKeySessions should remain.
                    // In non-Oilpan, there is also something from createGCPromise().
                    assert_between_inclusive(numActiveDOMObjectsCreated(), 4, 5, 'After second gc()');

                    // Now drop the reference to MediaKeys. It and the 2
                    // unreferenced sessions should be collected. Since
                    // MediaKeySessions remain alive as long as MediaKeys is
                    // around, it is possible that gc() checks one or both
                    // MediaKeySession objects first, and doesn't collect them
                    // since MediaKeys hasn't been collected yet. Thus run gc()
                    // twice, to ensure that the unreferenced MediaKeySession
                    // objects get collected.
                    mediaKeys = null;
                    return createGCPromise();
                }).then(function(result) {
                    return createGCPromise();
                }).then(function(result) {
                    // Only 1 MediaKeySessions should remain.
                    // In non-Oilpan, there is also something from createGCPromise().
                    assert_between_inclusive(numActiveDOMObjectsCreated(), 1, 2, 'After mediaKeys = null');

                    // Drop the reference to the last session. It should get
                    // collected now since MediaKeys is gone.
                    mediaKeySession3 = null;
                    return createGCPromise();
                }).then(function(result) {
                    // No MediaKeySessions should remain.
                    // In non-Oilpan, there is also something from createGCPromise().
                    assert_between_inclusive(numActiveDOMObjectsCreated(), 0, 1, 'After final gc()');

                    test.done();
                }).catch(function(error) {
                    forceTestFailureFromPromise(test, error);
                });
            }, 'MediaKeySession lifetime without release()');
        </script>
    </body>
</html>