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