diff --git a/lib/js/urweb.js b/lib/js/urweb.js
index 95fd6756..31e524d1 100644
--- a/lib/js/urweb.js
+++ b/lib/js/urweb.js
@@ -854,6 +854,16 @@ function runScripts(node) {
// Dynamic tree entry points
+function killDyns(node) {
+ var nodeIterator = document.createNodeIterator(node, NodeFilter.SHOW_ELEMENT, function (node) {
+ return node.dead !== undefined && node.dead === false
+ })
+ var node = nodeIterator.nextNode();
+ while (node) {
+ killScript(node);
+ node = nodeIterator.nextNode();
+ }
+}
function killScript(scr) {
scr.dead = true;
@@ -923,12 +933,7 @@ function dyn(pnode, s) {
for (var child = firstChild; child && child != x; child = next) {
next = child.nextSibling;
- killScript(child);
- if (child.getElementsByTagName) {
- var arr = child.getElementsByTagName("script");
- for (var i = 0; i < arr.length; ++i)
- killScript(arr[i]);
- }
+ killDyns(child)
if (child.parentNode)
child.parentNode.removeChild(child);
@@ -1050,11 +1055,9 @@ function setInnerHTML(node, html) {
for (var ls = x.closures; ls; ls = ls.next)
freeClosure(ls.data);
- if (node.getElementsByTagName) {
- var arr = node.getElementsByTagName("script");
- for (var i = 0; i < arr.length; ++i)
- killScript(arr[i]);
- }
+ var arr = node.childNodes;
+ for (var i = 0; i < arr.length; ++i)
+ killDyns(arr[i]);
} else {
x = document.createElement("script");
x.dead = false;
diff --git a/tests/memoryLeak.ur b/tests/memoryLeak.ur
new file mode 100644
index 00000000..302b2bb4
--- /dev/null
+++ b/tests/memoryLeak.ur
@@ -0,0 +1,34 @@
+fun main () =
+ visibleSource <- source True;
+ ctextboxSource <- source "";
+ ctextareaSource <- source "";
+ cselectSource <- source "";
+ let val signal =
+ visible <- signal visibleSource;
+ if visible then
+ return
+
+
+
+
+
+
+
+
+
+
+
+ else
+ return
+
+ in
+ return
+
+
+
+
+
+
+
+
+ end
diff --git a/tests/memoryLeak.urp b/tests/memoryLeak.urp
new file mode 100644
index 00000000..bbc90bd1
--- /dev/null
+++ b/tests/memoryLeak.urp
@@ -0,0 +1 @@
+memoryLeak
\ No newline at end of file
diff --git a/tests/memoryLeak.urs b/tests/memoryLeak.urs
new file mode 100644
index 00000000..10cb8025
--- /dev/null
+++ b/tests/memoryLeak.urs
@@ -0,0 +1 @@
+val main: unit -> transaction page
\ No newline at end of file