Index: LayoutTests/media/encrypted-media/encrypted-media-lifetime-mediakeysession-release-noref.html |
diff --git a/LayoutTests/media/encrypted-media/encrypted-media-lifetime-mediakeysession-release-noref.html b/LayoutTests/media/encrypted-media/encrypted-media-lifetime-mediakeysession-release-noref.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..cd8df68a4a131bcc22ddc33ffe4df7eb2aa8af83 |
--- /dev/null |
+++ b/LayoutTests/media/encrypted-media/encrypted-media-lifetime-mediakeysession-release-noref.html |
@@ -0,0 +1,74 @@ |
+<!DOCTYPE html> |
+<html> |
+ <head> |
+ <title>Test MediaKeySession lifetime</title> |
+ <script src="../w3c-media-utils.js"></script> |
+ <script src="../../resources/testharness.js"></script> |
+ <script src="../../resources/testharnessreport.js"></script> |
+ <script src="../../resources/gc.js"></script> |
+ </head> |
+ <body> |
+ <div id="log"></div> |
+ <script> |
+ // Since MediaKeySession (but not 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 initData = new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7]); |
+ var startingActiveDOMObjectCount = window.internals.activeDOMObjectCount(document); |
+ |
+ function numActiveDOMObjectsCreated() |
+ { |
+ return window.internals.activeDOMObjectCount(document) - startingActiveDOMObjectCount; |
+ } |
+ |
+ // Create 2 sessions. |
+ var mediaKeys = new MediaKeys("org.w3.clearkey"); |
+ var mediaKeySession1 = mediaKeys.createSession('video/webm', initData); |
+ assert_equals(numActiveDOMObjectsCreated(), 1); |
+ var mediaKeySession2 = mediaKeys.createSession('video/webm', initData); |
+ assert_equals(numActiveDOMObjectsCreated(), 2); |
+ var openSessions = 2; |
+ |
+ // Release the sessions. Once the close() event is received, |
+ // they should get garbage collected as there are no JS |
+ // references to them. |
+ mediaKeySession1.release(); |
+ waitForEventAndRunStep("close", mediaKeySession1, onClose, test); |
+ mediaKeySession1 = null; |
+ mediaKeySession2.release(); |
+ waitForEventAndRunStep("close", mediaKeySession2, onClose, test); |
+ mediaKeySession2 = null; |
+ |
+ function onClose(event) |
+ { |
+ assert_equals(mediaKeySession1, null); |
+ assert_equals(mediaKeySession2, null); |
+ --openSessions; |
+ if (openSessions > 0) |
+ return; |
+ |
+ // Delay to give time for close to complete since |
+ // event.target is a reference to the MediaKeySession. |
+ setTimeout(finish, 1); |
+ } |
+ |
+ function finish() |
+ { |
+ // Since both sessions have been closed and there are no |
+ // JS references to them, they should be garbage-collected. |
+ gc(); |
+ assert_equals(openSessions, 0); |
ddorwin
2014/03/27 20:14:49
Shouldn't this come before gc()? It's validating a
jrummell
2014/03/27 20:45:15
Done. Moved gc() below the assumption checks.
|
+ assert_not_equals(mediaKeys, null); |
+ assert_equals(mediaKeySession1, null); |
+ assert_equals(mediaKeySession2, null); |
+ assert_equals(numActiveDOMObjectsCreated(), 0); |
+ test.done(); |
+ } |
+ }, "MediaKeySession lifetime after release() without references"); |
+ </script> |
+ </body> |
+</html> |