diff --git a/packages/yew/src/dom_bundle/bnode.rs b/packages/yew/src/dom_bundle/bnode.rs index 6fd4c3f67d6..825988796c7 100644 --- a/packages/yew/src/dom_bundle/bnode.rs +++ b/packages/yew/src/dom_bundle/bnode.rs @@ -1,5 +1,6 @@ //! This module contains the bundle version of an abstract node [BNode] +use fmt::Debug; use std::fmt; use web_sys::{Element, Node}; @@ -241,7 +242,7 @@ impl From for BNode { } } -impl fmt::Debug for BNode { +impl Debug for BNode { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match *self { Self::Tag(ref vtag) => vtag.fmt(f), @@ -251,7 +252,7 @@ impl fmt::Debug for BNode { Self::Ref(ref vref) => write!(f, "VRef ( \"{}\" )", crate::utils::print_node(vref)), Self::Portal(ref vportal) => vportal.fmt(f), Self::Suspense(ref bsusp) => bsusp.fmt(f), - Self::Raw(ref braw) => write!(f, "VRaw {{ {} }}", braw.html), + Self::Raw(ref braw) => braw.fmt(f), } } } diff --git a/packages/yew/src/dom_bundle/braw.rs b/packages/yew/src/dom_bundle/braw.rs index 8edda4fb318..97d7ed3d7fa 100644 --- a/packages/yew/src/dom_bundle/braw.rs +++ b/packages/yew/src/dom_bundle/braw.rs @@ -7,11 +7,12 @@ use crate::dom_bundle::utils::insert_node; use crate::dom_bundle::BSubtree; use crate::html::AnyScope; use crate::virtual_dom::VRaw; -use crate::{AttrValue, NodeRef}; +use crate::{NodeRef}; +#[derive(Debug)] pub struct BRaw { - pub html: AttrValue, reference: NodeRef, + children_count: usize } impl BRaw { @@ -30,9 +31,20 @@ impl BRaw { fn detach_bundle(&self, parent: &Element) { if let Some(node) = self.reference.cast::() { + let mut next_sibling = node.unchecked_ref::().next_sibling(); + parent .remove_child(&node) .expect("failed to remove braw node"); + let len = self.children_count - 1; + for _ in 0..len { + if let Some(node) = next_sibling { + next_sibling = node.clone().unchecked_ref::().next_sibling(); + parent + .remove_child(&node) + .expect("failed to remove braw node"); + } + } } } } @@ -73,13 +85,14 @@ impl Reconcilable for VRaw { return ( next_sibling.clone(), BRaw { - html: self.html, reference: next_sibling, + children_count: 0, }, ); } let node_ref = NodeRef::default(); + let count = elements.len(); let mut iter = elements.into_iter(); let first = iter.next().unwrap(); insert_node(&first, parent, next_sibling.get().as_ref()); @@ -90,8 +103,8 @@ impl Reconcilable for VRaw { ( node_ref.clone(), BRaw { - html: self.html, reference: node_ref, + children_count: count, }, ) } @@ -167,7 +180,7 @@ mod tests { fn braw_works_one_node_nested() { let (root, scope, parent) = setup_parent(); - const HTML: &str = r#"

one link more paragraph

"#; + const HTML: &str = r#"

one link more paragraph

here
"#; let elem = VNode::from_raw_html(HTML.into()); let (_, mut elem) = elem.attach(&root, &scope, &parent, NodeRef::default()); assert_braw(&mut elem); @@ -184,6 +197,19 @@ mod tests { assert_eq!(parent.inner_html(), HTML) } + #[test] + fn braw_detach_works() { + let (root, scope, parent) = setup_parent(); + + const HTML: &str = r#"

paragraph

link"#; + let elem = VNode::from_raw_html(HTML.into()); + let (_, mut elem) = elem.attach(&root, &scope, &parent, NodeRef::default()); + assert_braw(&mut elem); + assert_eq!(parent.inner_html(), HTML); + elem.detach(&root, &parent, false); + assert_eq!(parent.inner_html(), ""); + } + fn assert_braw(node: &mut BNode) -> &mut BRaw { if let BNode::Raw(braw) = node { return braw;