Merge pull request #677 from Demonthos/native-core-list-mutation-bugfix

This commit is contained in:
Jon Kelley authored and GitHub committed 2022-12-24 13:06:23 -05:00
commit 6924dddb92
2 files changed
+23 -22

No files matched your search

+7 -7
View File
@@ -174,7 +174,7 @@ impl<S: State> RealDom<S> {
use dioxus_core::Mutation::*; use dioxus_core::Mutation::*;
match e { match e {
AppendChildren { id, m } => { AppendChildren { id, m } => {
let children = self.stack.split_off(m); let children = self.stack.split_off(self.stack.len() - m);
let parent = self.element_to_node_id(id); let parent = self.element_to_node_id(id);
for child in children { for child in children {
self.add_child(parent, child); self.add_child(parent, child);
@@ -222,10 +222,10 @@ impl<S: State> RealDom<S> {
self.stack.push(clone_id); self.stack.push(clone_id);
} }
ReplaceWith { id, m } => { ReplaceWith { id, m } => {
let new_nodes = self.stack.split_off(m); let new_nodes = self.stack.split_off(self.stack.len() - m);
let old_node_id = self.element_to_node_id(id); let old_node_id = self.element_to_node_id(id);
for new in new_nodes { for new in new_nodes {
self.tree.insert_after(old_node_id, new); self.tree.insert_before(old_node_id, new);
mark_dirty(new, NodeMask::ALL, &mut nodes_updated); mark_dirty(new, NodeMask::ALL, &mut nodes_updated);
} }
self.tree.remove(old_node_id); self.tree.remove(old_node_id);
@@ -234,21 +234,21 @@ impl<S: State> RealDom<S> {
let new_nodes = self.stack.split_off(self.stack.len() - m); let new_nodes = self.stack.split_off(self.stack.len() - m);
let old_node_id = self.load_child(path); let old_node_id = self.load_child(path);
for new in new_nodes { for new in new_nodes {
self.tree.insert_after(old_node_id, new); self.tree.insert_before(old_node_id, new);
mark_dirty(new, NodeMask::ALL, &mut nodes_updated); mark_dirty(new, NodeMask::ALL, &mut nodes_updated);
} }
self.tree.remove(old_node_id); self.tree.remove(old_node_id);
} }
InsertAfter { id, m } => { InsertAfter { id, m } => {
let new_nodes = self.stack.split_off(m); let new_nodes = self.stack.split_off(self.stack.len() - m);
let old_node_id = self.element_to_node_id(id); let old_node_id = self.element_to_node_id(id);
for new in new_nodes { for new in new_nodes.into_iter().rev() {
self.tree.insert_after(old_node_id, new); self.tree.insert_after(old_node_id, new);
mark_dirty(new, NodeMask::ALL, &mut nodes_updated); mark_dirty(new, NodeMask::ALL, &mut nodes_updated);
} }
} }
InsertBefore { id, m } => { InsertBefore { id, m } => {
let new_nodes = self.stack.split_off(m); let new_nodes = self.stack.split_off(self.stack.len() - m);
let old_node_id = self.element_to_node_id(id); let old_node_id = self.element_to_node_id(id);
for new in new_nodes { for new in new_nodes {
self.tree.insert_before(old_node_id, new); self.tree.insert_before(old_node_id, new);
@@ -73,11 +73,11 @@ impl PersistantElementIter {
.edits .edits
.iter() .iter()
.filter_map(|m| { .filter_map(|m| {
// nodes within templates will never be removedns // nodes within templates will never be removed
if let Mutation::Remove { id } = m { match m {
Some(rdom.element_to_node_id(*id)) Mutation::Remove { id } => Some(rdom.element_to_node_id(*id)),
} else { Mutation::ReplaceWith { id, .. } => Some(rdom.element_to_node_id(*id)),
None _ => None,
} }
}) })
.collect(); .collect();
@@ -358,12 +358,16 @@ fn persist_removes() {
let mut rdom: RealDom<Empty> = RealDom::new(); let mut rdom: RealDom<Empty> = RealDom::new();
let build = vdom.rebuild(); let build = vdom.rebuild();
println!("{:#?}", build);
let _to_update = rdom.apply_mutations(build); let _to_update = rdom.apply_mutations(build);
// this will end on the node that is removed // this will end on the node that is removed
let mut iter1 = PersistantElementIter::new(); let mut iter1 = PersistantElementIter::new();
// this will end on the after node that is removed // this will end on the after node that is removed
let mut iter2 = PersistantElementIter::new(); let mut iter2 = PersistantElementIter::new();
// root
iter1.next(&rdom).id();
iter2.next(&rdom).id();
// div // div
iter1.next(&rdom).id(); iter1.next(&rdom).id();
iter2.next(&rdom).id(); iter2.next(&rdom).id();
@@ -386,27 +390,24 @@ fn persist_removes() {
vdom.mark_dirty(ScopeId(0)); vdom.mark_dirty(ScopeId(0));
let update = vdom.render_immediate(); let update = vdom.render_immediate();
println!("{:#?}", update);
iter1.prune(&update, &rdom); iter1.prune(&update, &rdom);
iter2.prune(&update, &rdom); iter2.prune(&update, &rdom);
let _to_update = rdom.apply_mutations(update); let _to_update = rdom.apply_mutations(update);
let p_tag = "1".to_string(); let root_tag = "Root".to_string();
let idx = iter1.next(&rdom).id(); let idx = iter1.next(&rdom).id();
dbg!(&rdom[idx].node_data.node_type);
assert!(matches!( assert!(matches!(
&rdom[idx].node_data.node_type, &rdom[idx].node_data.node_type,
NodeType::Element { tag: p_tag, .. } NodeType::Element { tag: root_tag, .. }
)); ));
let text = "2".to_string();
let idx = iter1.next(&rdom).id();
assert!(matches!(
&rdom[idx].node_data.node_type,
NodeType::Text { text, .. }
));
let div_tag = "div".to_string();
let idx = iter2.next(&rdom).id(); let idx = iter2.next(&rdom).id();
dbg!(&rdom[idx].node_data.node_type);
assert!(matches!( assert!(matches!(
&rdom[idx].node_data.node_type, &rdom[idx].node_data.node_type,
NodeType::Element { tag: div_tag, .. } NodeType::Element { tag: root_tag, .. }
)); ));
} }