diff --git a/Tests/LibWeb/Text/expected/HTML/HTMLInputElement-radio-groups.txt b/Tests/LibWeb/Text/expected/HTML/HTMLInputElement-radio-groups.txt
new file mode 100644
index 00000000000..ce6610b9466
--- /dev/null
+++ b/Tests/LibWeb/Text/expected/HTML/HTMLInputElement-radio-groups.txt
@@ -0,0 +1,4 @@
+Radio button 1 initial checkedness: true
+Radio button 2 initial checkedness: false
+Radio button 1 checkedness: false
+Radio button 2 checkedness: true
diff --git a/Tests/LibWeb/Text/input/HTML/HTMLInputElement-radio-groups.html b/Tests/LibWeb/Text/input/HTML/HTMLInputElement-radio-groups.html
new file mode 100644
index 00000000000..e92f2fdcbf1
--- /dev/null
+++ b/Tests/LibWeb/Text/input/HTML/HTMLInputElement-radio-groups.html
@@ -0,0 +1,23 @@
+
+
+
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLInputElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLInputElement.cpp
index a69101a3b3f..cd790e23ba7 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLInputElement.cpp
+++ b/Userland/Libraries/LibWeb/HTML/HTMLInputElement.cpp
@@ -1546,8 +1546,9 @@ static bool is_in_same_radio_button_group(HTML::HTMLInputElement const& a, HTML:
// other input elements b that fulfill all of the following conditions:
return (
// - Both a and b are in the same tree.
+ &a.root() == &b.root()
// - The input element b's type attribute is in the Radio Button state.
- a.type_state() == b.type_state()
+ && a.type_state() == b.type_state()
&& b.type_state() == HTMLInputElement::TypeAttributeState::RadioButton
// - Either a and b have the same form owner, or they both have no form owner.
&& a.form() == b.form()
@@ -1570,7 +1571,7 @@ void HTMLInputElement::set_checked_within_group()
if (!name().has_value() || name()->is_empty())
return;
- document().for_each_in_inclusive_subtree_of_type([&](auto& element) {
+ root().for_each_in_inclusive_subtree_of_type([&](auto& element) {
if (element.checked() && &element != this && is_in_same_radio_button_group(*this, element))
element.set_checked(false, ChangeSource::User);
return TraversalDecision::Continue;
@@ -1597,7 +1598,7 @@ void HTMLInputElement::legacy_pre_activation_behavior()
// has its checkedness set to true, if any, and then set this element's
// checkedness to true.
if (type_state() == TypeAttributeState::RadioButton) {
- document().for_each_in_inclusive_subtree_of_type([&](auto& element) {
+ root().for_each_in_inclusive_subtree_of_type([&](auto& element) {
if (element.checked() && is_in_same_radio_button_group(*this, element)) {
m_legacy_pre_activation_behavior_checked_element_in_group = &element;
return TraversalDecision::Break;