From 335783e97998acb36df2f258e3777f5ec46e048d Mon Sep 17 00:00:00 2001 From: Martin Molzer Date: Wed, 20 Apr 2022 09:25:25 +0200 Subject: [PATCH] fixes bubbling of events originating in shadow dom 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