summaryrefslogtreecommitdiffstats
path: root/js/xpconnect/tests/chrome/test_watchpoints.xul
diff options
context:
space:
mode:
Diffstat (limited to 'js/xpconnect/tests/chrome/test_watchpoints.xul')
-rw-r--r--js/xpconnect/tests/chrome/test_watchpoints.xul75
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 000000000..2262b1a90
--- /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>