diff options
Diffstat (limited to 'js/xpconnect/tests/chrome/test_watchpoints.xul')
-rw-r--r-- | js/xpconnect/tests/chrome/test_watchpoints.xul | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/js/xpconnect/tests/chrome/test_watchpoints.xul b/js/xpconnect/tests/chrome/test_watchpoints.xul new file mode 100644 index 0000000000..2262b1a902 --- /dev/null +++ b/js/xpconnect/tests/chrome/test_watchpoints.xul @@ -0,0 +1,75 @@ +<?xml version="1.0"?> +<?xml-stylesheet type="text/css" href="chrome://global/skin"?> +<?xml-stylesheet type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"?> +<!-- +https://bugzilla.mozilla.org/show_bug.cgi?id=693527 +--> +<window title="Mozilla Bug " + xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> + <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/> + + <!-- test results are displayed in the html:body --> + <body xmlns="http://www.w3.org/1999/xhtml"> + <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=" + target="_blank">Mozilla Bug 693527</a> + </body> + + <!-- test code goes here --> + <script type="application/javascript"> + <![CDATA[ + /** Test for Bug 693527 **/ + + let Cu = Components.utils; + let Ci = Components.interfaces; + + /* Create a weak reference, with a single-element weak map. */ + let make_weak_ref = function (obj) { + let m = new WeakMap; + m.set(obj, {}); + return m; + }; + + /* Check to see if a weak reference is dead. */ + let weak_ref_dead = function (r) { + return ThreadSafeChromeUtils.nondeterministicGetWeakMapKeys(r).length == 0; + } + + + let make_cycle = function () { + var p = document.createElement("p"); + p.children.x = p; + var f = function() { }; + p.watch("y", f); + var d = document.createElement("div"); + d.appendChild(p); + f.loop = d; + f.bar = {}; // observing f directly makes the leak go away even without the CC somehow + return make_weak_ref(f.bar); + }; + + var cycle_ref = make_cycle(); + + + /* set up for running precise GC/CC then checking the results */ + + SimpleTest.waitForExplicitFinish(); + + Cu.schedulePreciseGC(function () { + window.QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIDOMWindowUtils) + .cycleCollect(); + window.QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIDOMWindowUtils) + .garbageCollect(); + window.QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIDOMWindowUtils) + .garbageCollect(); + + ok(weak_ref_dead(cycle_ref), "Garbage gray watchpoint cycle should be collected."); + + SimpleTest.finish(); + }); + + ]]> + </script> +</window> |