From 55c0e0997670c59c0892b7beb82054948571e88b Mon Sep 17 00:00:00 2001 From: Martin Molzer Date: Sat, 10 Dec 2022 13:45:22 +0100 Subject: [PATCH 1/2] assert there are no circular references the check is costly in release builds and should always fail note that the current PartialEq impl is *not* symmetric! should be fixed as well, with an improved design --- packages/yew/src/html/mod.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/yew/src/html/mod.rs b/packages/yew/src/html/mod.rs index 08c96a576ca..1962fbbd868 100644 --- a/packages/yew/src/html/mod.rs +++ b/packages/yew/src/html/mod.rs @@ -134,9 +134,10 @@ mod feat_csr { /// Link a downstream `NodeRef` pub(crate) fn link(&self, node_ref: Self) { // Avoid circular references - if self == &node_ref { - return; - } + debug_assert!( + self != &node_ref, + "no circular references allowed! Report this as a bug in yew" + ); let mut this = self.0.borrow_mut(); this.node = None; From 111cb96e3f8e725b826d0c405f1a9ca1c407f298 Mon Sep 17 00:00:00 2001 From: Martin Molzer Date: Sat, 10 Dec 2022 14:25:45 +0100 Subject: [PATCH 2/2] remove internal test for cyclic node refs wasm_bindgen does not yet support #[should_panic] see also https://github.com/rustwasm/wasm-bindgen/issues/2286 --- packages/yew/src/html/mod.rs | 27 --------------------------- 1 file changed, 27 deletions(-) diff --git a/packages/yew/src/html/mod.rs b/packages/yew/src/html/mod.rs index 1962fbbd868..28fa84af2b4 100644 --- a/packages/yew/src/html/mod.rs +++ b/packages/yew/src/html/mod.rs @@ -204,30 +204,3 @@ mod feat_hydration { pub fn create_portal(child: Html, host: Element) -> Html { VNode::VPortal(VPortal::new(child, host)) } - -#[cfg(target_arch = "wasm32")] -#[cfg(test)] -mod tests { - use gloo::utils::document; - use wasm_bindgen_test::{wasm_bindgen_test as test, wasm_bindgen_test_configure}; - - use super::*; - - wasm_bindgen_test_configure!(run_in_browser); - - #[test] - fn self_linking_node_ref() { - let node: Node = document().create_text_node("test node").into(); - let node_ref = NodeRef::new(node.clone()); - let node_ref_2 = NodeRef::new(node.clone()); - - // Link to self - node_ref.link(node_ref.clone()); - assert_eq!(node, node_ref.get().unwrap()); - - // Create cycle of two node refs - node_ref.link(node_ref_2.clone()); - node_ref_2.link(node_ref); - assert_eq!(node, node_ref_2.get().unwrap()); - } -}