diff --git a/examples/disabled.rs b/examples/disabled.rs index e4ca7d9ee..390a5550f 100644 --- a/examples/disabled.rs +++ b/examples/disabled.rs @@ -18,6 +18,11 @@ fn app(cx: Scope) -> Element { disabled: "{disabled}", "lower button" } + + input { + value: "false", + } + } }) } diff --git a/packages/desktop/src/index.js b/packages/desktop/src/index.js index 931eb7d32..75b838b02 100644 --- a/packages/desktop/src/index.js +++ b/packages/desktop/src/index.js @@ -1,3 +1,32 @@ +const bool_attrs = [ + "allowfullscreen", + "allowpaymentrequest", + "async", + "autofocus", + "autoplay", + "checked", + "controls", + "default", + "defer", + "disabled", + "formnovalidate", + "hidden", + "ismap", + "itemscope", + "loop", + "multiple", + "muted", + "nomodule", + "novalidate", + "open", + "playsinline", + "readonly", + "required", + "reversed", + "selected", + "truespeed", +] + function serialize_event(event) { switch (event.type) { case "copy": @@ -370,7 +399,7 @@ class Interpreter { break; default: // https://github.com/facebook/react/blob/8b88ac2592c5f555f315f9440cbb665dd1e7457a/packages/react-dom/src/shared/DOMProperty.js#L352-L364 - if (value == "false" && name != "capture" && name != "download") { + if (value == "false" && bool_attrs.indexOf(name)) { node.removeAttribute(name); } else { node.setAttribute(name, value); diff --git a/packages/web/src/dom.rs b/packages/web/src/dom.rs index e9cf66af2..364f1a1d7 100644 --- a/packages/web/src/dom.rs +++ b/packages/web/src/dom.rs @@ -349,9 +349,41 @@ impl WebsysDom { } _ => { // https://github.com/facebook/react/blob/8b88ac2592c5f555f315f9440cbb665dd1e7457a/packages/react-dom/src/shared/DOMProperty.js#L352-L364 - if value == "false" && ((name != "capture") && (name != "download")) { + if value == "false" { if let Some(el) = node.dyn_ref::() { - let _ = el.remove_attribute(name); + match name { + "allowfullscreen" + | "allowpaymentrequest" + | "async" + | "autofocus" + | "autoplay" + | "checked" + | "controls" + | "default" + | "defer" + | "disabled" + | "formnovalidate" + | "hidden" + | "ismap" + | "itemscope" + | "loop" + | "multiple" + | "muted" + | "nomodule" + | "novalidate" + | "open" + | "playsinline" + | "readonly" + | "required" + | "reversed" + | "selected" + | "truespeed" => { + let _ = el.remove_attribute(name); + } + _ => { + let _ = el.set_attribute(name, value); + } + }; } } else { fallback();