From b7a3b1b81ed85c95ca8183407971aed724e3b9b2 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Sat, 27 Jan 2024 16:27:06 +0100 Subject: fix some bugs where a node was freed twice --- src/element.ts | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) (limited to 'src/element.ts') diff --git a/src/element.ts b/src/element.ts index 51bf42f..6f2a28d 100644 --- a/src/element.ts +++ b/src/element.ts @@ -76,30 +76,40 @@ function e_apply>(el: HT return () => { } } if (typeof c == "string") { - el.append(c) + const node = document.createTextNode(c) + el.insertBefore(node, redo?.before ?? null) return () => { - el.textContent = "" + const p = node.nextSibling as (HTMLElement | void); + el.removeChild(node) + return { before: p ?? undefined } } } else if (c instanceof HTMLElement) { el.insertBefore(c, redo?.before ?? null) return () => { const p = c.nextSibling as (HTMLElement | void); + //@ts-ignore wubbel const child_undo: undefined | (() => void) = c["jsh_undo"] + //@ts-ignore wubbel + c["jsh_undo"] = () => alert("double freeā„¢ detected") if (child_undo) child_undo() el.removeChild(c) + return { before: p ?? undefined } } } else if (c instanceof OVar) { let undo_last: () => RedoParams | void; // TODO if nested, this is a memory leak (only partially fixed) - return c.onchangeinit(val => { + const abort = c.onchangeinit(val => { let redo_param = undefined; if (undo_last) redo_param = undo_last() undo_last = e_apply(el, val, redo_param ?? undefined) }) + return () => { + abort(); undo_last() + } } else return apply_opts(el, c) ?? (() => { }) } -- cgit v1.2.3-70-g09d2