use wasm_bindgen::JsCast;
use web_sys::Element;
use web_sys::Node;
pub fn query_selector<T, E>(root: &E, selector: &str) -> Option<T>
where
T: JsCast,
E: AsRef<Element>,
{
root.as_ref()
.query_selector(selector)
.unwrap()
.map(|el| el.dyn_into::<T>().unwrap())
}
pub fn query_selector_all<T, E>(root: &E, selector: &str) -> Vec<T>
where
T: JsCast,
E: AsRef<Element>,
{
let list = root.as_ref().query_selector_all(selector).unwrap();
let mut out = Vec::with_capacity(list.length() as usize);
for i in 0..list.length() {
let node = list.item(i).unwrap();
out.push(node.dyn_into::<T>().unwrap());
}
out
}
pub fn append_child<E>(root: &E, child: &Node)
where
E: AsRef<Element>,
{
root.as_ref().append_child(child).unwrap();
}
pub fn clear_children<E>(root: &E)
where
E: AsRef<Element>,
{
let root = root.as_ref();
while let Some(child) = root.first_child() {
root.remove_child(&child).unwrap();
}
}
#[cfg(test)]
#[cfg(target_arch = "wasm32")]
mod tests {
use super::*;
use crate::prelude::*;
use crate::web_utils::document_ext as doc;
use web_sys::HtmlDivElement;
use web_sys::HtmlParagraphElement;
#[test]
#[ignore = "requires dom"]
fn works() {
let _ = doc::document();
let _ = doc::body();
let _ = doc::head();
}
#[ignore = "requires dom"]
#[crate::test]
async fn works_async() {
doc::clear_body();
let parent: HtmlDivElement = doc::create_div();
parent.set_id("root");
let p1: HtmlParagraphElement = doc::create_paragraph();
p1.set_class_name("child");
p1.set_inner_html("first");
let p2: HtmlParagraphElement = doc::create_paragraph();
p2.set_class_name("child");
p2.set_inner_html("second");
parent.append_child(&p1).unwrap();
parent.append_child(&p2).unwrap();
doc::append_child(&parent);
let first =
query_selector::<HtmlParagraphElement, _>(&parent, "p.child")
.unwrap();
first.inner_html().xpect_eq("first");
let all =
query_selector_all::<HtmlParagraphElement, _>(&parent, "p.child");
all.len().xpect_eq(2usize);
clear_children(&parent);
let remaining =
query_selector_all::<HtmlParagraphElement, _>(&parent, "p");
remaining.is_empty().xpect_true();
}
}