Kaynağa Gözat

feat: bool attr white list

YuKun Liu 3 yıl önce
ebeveyn
işleme
8f4aa84
3 değiştirilmiş dosya ile 67 ekleme ve 2 silme
  1. 5 0
      examples/disabled.rs
  2. 31 1
      packages/desktop/src/index.js
  3. 31 1
      packages/web/src/dom.rs

+ 5 - 0
examples/disabled.rs

@@ -18,6 +18,11 @@ fn app(cx: Scope) -> Element {
                 disabled: "{disabled}",
                 "lower button"
             }
+
+            input {
+                value: "false",
+            }
+
         }
     })
 }

+ 31 - 1
packages/desktop/src/index.js

@@ -369,8 +369,38 @@ class Interpreter {
           node.innerHTML = value;
           break;
         default:
+
+          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",
+          ]
+
           // 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);

+ 31 - 1
packages/web/src/dom.rs

@@ -348,8 +348,38 @@ impl WebsysDom {
                     }
                 }
                 _ => {
+
+                    let bool_attrs = vec![
+                        "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",
+                    ];
+
                     // 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.contains(&name) {
                         if let Some(el) = node.dyn_ref::<Element>() {
                             let _ = el.remove_attribute(name);
                         }