use crate::*;
pub(crate) fn is_node_connected<T>(node: &T) -> bool
where
T: AsRef<Node>,
{
let node_ref: &Node = node.as_ref();
let result: Result<JsValue, JsValue> =
Reflect::get(node_ref.as_ref(), &JsValue::from_str(IS_CONNECTED));
match result {
Ok(value) => value.is_truthy(),
Err(_) => false,
}
}
pub(crate) fn is_boolean_property(name: &str) -> bool {
matches!(
name,
ATTR_CHECKED | ATTR_DISABLED | ATTR_SELECTED | ATTR_READONLY | ATTR_MULTIPLE
)
}
pub(crate) fn remove_dom_attribute_or_property(element: &Element, name: &str) {
if name == ATTR_VALUE {
if let Some(input) = element.dyn_ref::<HtmlInputElement>() {
input.set_value(EMPTY_STRING);
return;
}
if let Some(textarea) = element.dyn_ref::<HtmlTextAreaElement>() {
textarea.set_value(EMPTY_STRING);
return;
}
if let Some(select) = element.dyn_ref::<HtmlSelectElement>() {
select.set_value(EMPTY_STRING);
return;
}
}
if name == ATTR_CHECKED
&& let Some(input) = element.dyn_ref::<HtmlInputElement>()
{
input.set_checked(false);
return;
}
if name == ATTR_DISABLED {
if let Some(input) = element.dyn_ref::<HtmlInputElement>() {
input.set_disabled(false);
return;
}
if let Some(button) = element.dyn_ref::<HtmlButtonElement>() {
button.set_disabled(false);
return;
}
if let Some(select) = element.dyn_ref::<HtmlSelectElement>() {
select.set_disabled(false);
return;
}
if let Some(textarea) = element.dyn_ref::<HtmlTextAreaElement>() {
textarea.set_disabled(false);
return;
}
}
if name == ATTR_SELECTED
&& let Some(option) = element.dyn_ref::<HtmlOptionElement>()
{
option.set_selected(false);
return;
}
if name == ATTR_READONLY {
if let Some(input) = element.dyn_ref::<HtmlInputElement>() {
input.set_read_only(false);
return;
}
if let Some(textarea) = element.dyn_ref::<HtmlTextAreaElement>() {
textarea.set_read_only(false);
return;
}
}
if name == ATTR_MULTIPLE {
if let Some(input) = element.dyn_ref::<HtmlInputElement>() {
input.set_multiple(false);
return;
}
if let Some(select) = element.dyn_ref::<HtmlSelectElement>() {
select.set_multiple(false);
return;
}
}
let _ = element.remove_attribute(name);
}
pub(crate) fn set_dom_attribute_or_property(element: &Element, name: &str, value: &str) {
if name == ATTR_VALUE {
if let Some(input) = element.dyn_ref::<HtmlInputElement>() {
input.set_value(value);
return;
}
if let Some(textarea) = element.dyn_ref::<HtmlTextAreaElement>() {
textarea.set_value(value);
return;
}
if let Some(select) = element.dyn_ref::<HtmlSelectElement>() {
select.set_value(value);
return;
}
}
if name == ATTR_CHECKED
&& let Some(input) = element.dyn_ref::<HtmlInputElement>()
{
input.set_checked(value == BOOL_TRUE);
return;
}
if name == ATTR_DISABLED {
if let Some(input) = element.dyn_ref::<HtmlInputElement>() {
input.set_disabled(value == BOOL_TRUE);
return;
}
if let Some(button) = element.dyn_ref::<HtmlButtonElement>() {
button.set_disabled(value == BOOL_TRUE);
return;
}
if let Some(select) = element.dyn_ref::<HtmlSelectElement>() {
select.set_disabled(value == BOOL_TRUE);
return;
}
if let Some(textarea) = element.dyn_ref::<HtmlTextAreaElement>() {
textarea.set_disabled(value == BOOL_TRUE);
return;
}
}
if name == ATTR_SELECTED
&& let Some(option) = element.dyn_ref::<HtmlOptionElement>()
{
option.set_selected(value == BOOL_TRUE);
return;
}
if name == ATTR_READONLY {
if let Some(input) = element.dyn_ref::<HtmlInputElement>() {
input.set_read_only(value == BOOL_TRUE);
return;
}
if let Some(textarea) = element.dyn_ref::<HtmlTextAreaElement>() {
textarea.set_read_only(value == BOOL_TRUE);
return;
}
}
if name == ATTR_MULTIPLE {
if let Some(input) = element.dyn_ref::<HtmlInputElement>() {
input.set_multiple(value == BOOL_TRUE);
return;
}
if let Some(select) = element.dyn_ref::<HtmlSelectElement>() {
select.set_multiple(value == BOOL_TRUE);
return;
}
}
let _ = element.set_attribute(name, value);
}