From 87edc4cdb9ac9de6ec50b4cd19bb1ce6e503a3f5 Mon Sep 17 00:00:00 2001 From: Andreas Rumpf Date: Wed, 7 Mar 2018 11:52:25 +0100 Subject: [PATCH] fixes overly aggressive text node reuse DOM diff'ing bug --- karax/karax.nim | 5 +++-- tests/difftest.nim | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/karax/karax.nim b/karax/karax.nim index 0871422..19a7dfb 100644 --- a/karax/karax.nim +++ b/karax/karax.nim @@ -233,7 +233,7 @@ proc eq(a, b: VNode): EqResult = if a.kind == VNodeKind.text: if a.text != b.text: when defined(profileKarax): inc reasons[deText] - return similar + return different # similar elif a.kind == VNodeKind.vthunk or a.kind == VNodeKind.dthunk: if a.text != b.text: return different if a.len != b.len: return different @@ -648,7 +648,8 @@ proc setRenderer*(renderer: proc (): VNode, root: cstring = "ROOT", clientPostRenderCallback: proc () = nil): KaraxInstance {.discardable.} = ## Setup Karax. Usually the return value can be ignored. proc wrapRenderer(data: RouterData): VNode = result = renderer() - proc wrapPostRender(data: RouterData) = clientPostRenderCallback() + proc wrapPostRender(data: RouterData) = + if clientPostRenderCallback != nil: clientPostRenderCallback() setRenderer(wrapRenderer, root, wrapPostRender) proc setInitializer*(renderer: proc (data: RouterData): VNode, root: cstring = "ROOT", diff --git a/tests/difftest.nim b/tests/difftest.nim index 3318f24..fca3391 100644 --- a/tests/difftest.nim +++ b/tests/difftest.nim @@ -156,14 +156,14 @@ proc testWild() = let a = createEntries(entries) entries = @[cstring("0"), cstring("1"), cstring("2"), cstring("3"), cstring("4"), cstring("5")] let b = createEntries(entries) - doDiff(a, b, "pkDetach button 7", "pkRemove nil", "pkDetach div 5", "pkRemove nil") + doDiff(a, b, "pkDetach button 7", "pkRemove nil", "pkDetach div 7", "pkRemove nil") proc testWildInsert() = var entries = @[cstring("0"), cstring("1"), cstring("2"), cstring("3"), cstring("4"), cstring("5")] let a = createEntries(entries) entries = @[cstring("0"), cstring("1"), cstring("2"), cstring("3"), cstring("4"), cstring"7", cstring("5")] let b = createEntries(entries) - doDiff(a, b, "pkInsertBefore button 7", "pkAppend div 5") + doDiff(a, b, "pkInsertBefore button 7", "pkInsertBefore div 7") kxi = KaraxInstance(rootId: cstring"ROOT", renderer: proc (data: RouterData): VNode = discard, byId: newJDict[cstring, VNode]())