From 07ae71cf35197fce427c2ff7d166f0e7d4c825ef Mon Sep 17 00:00:00 2001 From: Pauan Date: Mon, 4 May 2020 23:28:09 +0200 Subject: [PATCH] Adding in shadow_root! macro --- Cargo.toml | 3 +++ src/dom.rs | 31 +++++++++++++++++++++++++++++-- src/lib.rs | 1 + src/macros.rs | 10 ++++++++++ 4 files changed, 43 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 129a720..3a832cd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -53,6 +53,9 @@ features = [ "Location", "MouseEvent", "Node", + "ShadowRoot", + "ShadowRootInit", + "ShadowRootMode", "StyleSheet", "SvgElement", "Text", diff --git a/src/dom.rs b/src/dom.rs index b1b6062..3c323cb 100644 --- a/src/dom.rs +++ b/src/dom.rs @@ -11,7 +11,7 @@ use futures_util::FutureExt; use futures_channel::oneshot; use discard::{Discard, DiscardOnDrop}; use wasm_bindgen::{JsValue, UnwrapThrowExt, JsCast, intern}; -use web_sys::{HtmlElement, Node, EventTarget, Element, CssStyleSheet, CssStyleDeclaration}; +use web_sys::{HtmlElement, Node, EventTarget, Element, CssStyleSheet, CssStyleDeclaration, ShadowRoot, ShadowRootMode, ShadowRootInit}; use crate::bindings; use crate::callbacks::Callbacks; @@ -393,6 +393,14 @@ impl DomBuilder where A: JsCast { } impl DomBuilder { + #[inline] + #[doc(hidden)] + pub fn __internal_transfer_callbacks(mut self, mut shadow: DomBuilder) -> Self { + self.callbacks.after_insert.append(&mut shadow.callbacks.after_insert); + self.callbacks.after_remove.append(&mut shadow.callbacks.after_remove); + self + } + #[inline] pub fn new(value: A) -> Self { Self { @@ -567,7 +575,7 @@ impl DomBuilder where A: AsRef { // TODO figure out how to make this owned rather than &mut #[inline] - pub fn children<'a, B: BorrowMut, C: IntoIterator>(mut self, children: C) -> Self { + pub fn children, C: IntoIterator>(mut self, children: C) -> Self { self.check_children(); operations::insert_children_iter(self.element.as_ref(), &mut self.callbacks, children); self @@ -625,6 +633,13 @@ impl DomBuilder where A: AsRef { } impl DomBuilder where A: AsRef { + #[inline] + #[doc(hidden)] + pub fn __internal_shadow_root(&self, mode: ShadowRootMode) -> DomBuilder { + let shadow = self.element.as_ref().attach_shadow(&ShadowRootInit::new(mode)).unwrap_throw(); + DomBuilder::new(shadow) + } + #[inline] pub fn attribute(self, name: B, value: &str) -> Self where B: MultiStr { let element = self.element.as_ref(); @@ -1155,6 +1170,7 @@ pub mod __internal { #[cfg(test)] mod tests { use super::{DomBuilder, text_signal, RefFn}; + use crate::{html, shadow_root, ShadowRootMode}; use futures_signals::signal::{always, SignalExt}; use lazy_static::lazy_static; use web_sys::HtmlElement; @@ -1289,4 +1305,15 @@ mod tests { .style_signal(["-moz-foo", "-webkit-foo", "foo"], always("bar".to_owned()).map(|x| Some(RefFn::new(x, |x| x.as_str())))) ; } + + #[test] + fn shadow_root() { + let _a = html!("div", { + .shadow_root!(ShadowRootMode::Closed => { + .children(&mut [ + html!("span") + ]) + }) + }); + } } diff --git a/src/lib.rs b/src/lib.rs index d824b9c..99b024a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -10,6 +10,7 @@ mod callbacks; mod operations; mod dom; +pub use web_sys::ShadowRootMode; pub use dom::*; pub mod traits; pub mod animation; diff --git a/src/macros.rs b/src/macros.rs index ca0c3c8..30c056d 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -44,6 +44,16 @@ macro_rules! with_node { } +#[macro_export] +macro_rules! shadow_root { + ($this:ident, $mode:expr => { $($methods:tt)* }) => {{ + let shadow = $crate::DomBuilder::__internal_shadow_root(&$this, $mode); + let shadow = $crate::apply_methods!(shadow, { $($methods)* }); + $crate::DomBuilder::__internal_transfer_callbacks($this, shadow) + }}; +} + + #[macro_export] macro_rules! html { ($($args:tt)+) => {