diff --git a/packages/yew/Cargo.toml b/packages/yew/Cargo.toml index 07c095f9200..f7f4705cca9 100644 --- a/packages/yew/Cargo.toml +++ b/packages/yew/Cargo.toml @@ -54,6 +54,7 @@ features = [ "NodeList", "PointerEvent", "ProgressEvent", + "ShadowRoot", "Text", "TouchEvent", "TransitionEvent", @@ -81,7 +82,6 @@ trybuild = "1" [dev-dependencies.web-sys] version = "0.3" features = [ - "ShadowRoot", "ShadowRootInit", "ShadowRootMode", ] diff --git a/packages/yew/src/dom_bundle/subtree_root.rs b/packages/yew/src/dom_bundle/subtree_root.rs index 46c1a1ce767..6a2dbace540 100644 --- a/packages/yew/src/dom_bundle/subtree_root.rs +++ b/packages/yew/src/dom_bundle/subtree_root.rs @@ -9,7 +9,7 @@ use std::hash::{Hash, Hasher}; use std::rc::{Rc, Weak}; use std::sync::atomic::{AtomicBool, AtomicU32, Ordering}; use wasm_bindgen::{prelude::wasm_bindgen, JsCast}; -use web_sys::{Element, Event, EventTarget as HtmlEventTarget}; +use web_sys::{Element, Event, EventTarget as HtmlEventTarget, ShadowRoot}; /// DOM-Types that capture (bubbling) events. This generally includes event targets, /// but also subtree roots. @@ -239,6 +239,13 @@ struct BrandingSearchResult { closest_branded_ancestor: Element, } +fn shadow_aware_parent(el: &Element) -> Option { + match el.parent_element() { + s @ Some(_) => s, + None => el.parent_node()?.dyn_ref::().map(|h| h.host()), + } +} + /// Deduce the subtree an element is part of. This already partially starts the bubbling /// process, as long as no listeners are encountered. /// Subtree roots are always branded with their own subtree id. @@ -254,7 +261,7 @@ fn find_closest_branded_element(mut el: Element, do_bubble: bool) -> Option