From 93405c2a409d09d8ecbfc58997483ee5430e0443 Mon Sep 17 00:00:00 2001 From: Jonathan Kelley Date: Mon, 4 Apr 2022 12:18:51 -0400 Subject: [PATCH] Fix: diffing should poproots too --- packages/core/src/diff.rs | 1 + packages/core/src/mutations.rs | 8 ++++++++ tests/diffing.rs | 1 + 3 files changed, 10 insertions(+) diff --git a/packages/core/src/diff.rs b/packages/core/src/diff.rs index a0be7fd3c..3d8b9082d 100644 --- a/packages/core/src/diff.rs +++ b/packages/core/src/diff.rs @@ -426,6 +426,7 @@ impl<'b> DiffState<'b> { self.mutations.push_root(root); let created = self.create_children(new.children); self.mutations.append_children(created as u32); + self.mutations.pop_root(); } (_, _) => self.diff_children(old.children, new.children), }; diff --git a/packages/core/src/mutations.rs b/packages/core/src/mutations.rs index 2d3a4505f..2d3115ce3 100644 --- a/packages/core/src/mutations.rs +++ b/packages/core/src/mutations.rs @@ -185,6 +185,9 @@ pub enum DomEdit<'bump> { /// The namespace of the attribute. ns: Option<&'bump str>, }, + + /// Manually pop a root node from the stack. + PopRoot {}, } use fxhash::FxHashSet; @@ -205,6 +208,11 @@ impl<'a> Mutations<'a> { self.edits.push(PushRoot { root: id }); } + // Navigation + pub(crate) fn pop_root(&mut self) { + self.edits.push(PopRoot {}); + } + pub(crate) fn replace_with(&mut self, root: ElementId, m: u32) { let root = root.as_u64(); self.edits.push(ReplaceWith { m, root }); diff --git a/tests/diffing.rs b/tests/diffing.rs index b8d5b3273..a876ffc03 100644 --- a/tests/diffing.rs +++ b/tests/diffing.rs @@ -752,6 +752,7 @@ fn add_nested_elements() { PushRoot { root: 1 }, CreateElement { root: 2, tag: "div" }, AppendChildren { many: 1 }, + PopRoot {}, ] ); }