From c2b2f2cf2dedc1cfb1e3280d291bae303d2bf32b Mon Sep 17 00:00:00 2001 From: WorldSEnder Date: Wed, 20 Apr 2022 13:33:52 +0200 Subject: [PATCH] fixes bubbling of events originating in shadow dom (#2627) when we not explicitly portaling into the shadow, we should bubble up to the host element and continue. This fixes custom elements internally using open SD --- packages/yew/Cargo.toml | 2 +- packages/yew/src/dom_bundle/subtree_root.rs | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) 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