Explorar o código

LibWeb: Do not assume grouped radio buttons have the same parent

For example:

    <div>
        <input type=radio name=group value=item1 />
    </div>
    <div>
        <input type=radio name=group value=item2 />
    </div>

Is a valid DOM and clicking on of these radio buttons should uncheck
the other.
Timothy Flynn %!s(int64=4) %!d(string=hai) anos
pai
achega
4f9e9c0715
Modificáronse 1 ficheiros con 5 adicións e 12 borrados
  1. 5 12
      Userland/Libraries/LibWeb/Layout/RadioButton.cpp

+ 5 - 12
Userland/Libraries/LibWeb/Layout/RadioButton.cpp

@@ -27,6 +27,7 @@
 #include <LibGUI/Event.h>
 #include <LibGfx/Painter.h>
 #include <LibGfx/StylePainter.h>
+#include <LibWeb/DOM/Document.h>
 #include <LibWeb/Layout/RadioButton.h>
 #include <LibWeb/Page/Frame.h>
 
@@ -105,20 +106,12 @@ void RadioButton::set_checked_within_group()
         return;
 
     dom_node().set_checked(true);
-
-    if (!parent())
-        return;
-
     String name = dom_node().name();
 
-    parent()->for_each_child_of_type<RadioButton>([&](auto& child) {
-        if (&child == this)
-            return;
-        if (!child.dom_node().checked())
-            return;
-
-        if (child.dom_node().name() == name)
-            child.dom_node().set_checked(false);
+    document().for_each_in_subtree_of_type<HTML::HTMLInputElement>([&](auto& element) {
+        if (element.checked() && (element.layout_node() != this) && (element.name() == name))
+            element.set_checked(false);
+        return IterationDecision::Continue;
     });
 }