diff --git a/Userland/Libraries/LibWeb/HTML/HTMLInputElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLInputElement.cpp
index 834d05a8be..1269c149be 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLInputElement.cpp
+++ b/Userland/Libraries/LibWeb/HTML/HTMLInputElement.cpp
@@ -70,6 +70,18 @@ void HTMLInputElement::set_checked(bool checked, ChangeSource change_source)
set_needs_style_update(true);
}
+void HTMLInputElement::set_checked_binding(bool checked)
+{
+ if (type() == "radio") {
+ if (checked)
+ set_checked_within_group();
+ else
+ set_checked(false, ChangeSource::Programmatic);
+ } else {
+ set_checked(checked, ChangeSource::Programmatic);
+ }
+}
+
// https://html.spec.whatwg.org/multipage/input.html#input-activation-behavior
void HTMLInputElement::run_input_activation_behavior()
{
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLInputElement.h b/Userland/Libraries/LibWeb/HTML/HTMLInputElement.h
index e0d22f363d..4a8794a000 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLInputElement.h
+++ b/Userland/Libraries/LibWeb/HTML/HTMLInputElement.h
@@ -69,6 +69,9 @@ public:
};
void set_checked(bool, ChangeSource = ChangeSource::Programmatic);
+ bool checked_binding() const { return checked(); }
+ void set_checked_binding(bool);
+
void did_edit_text_node(Badge);
virtual bool is_focusable() const override;
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLInputElement.idl b/Userland/Libraries/LibWeb/HTML/HTMLInputElement.idl
index e4f1b9083c..19c814c8dc 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLInputElement.idl
+++ b/Userland/Libraries/LibWeb/HTML/HTMLInputElement.idl
@@ -21,7 +21,7 @@ interface HTMLInputElement : HTMLElement {
[LegacyNullToEmptyString] attribute DOMString value;
- attribute boolean checked;
+ [ImplementedAs=checked_binding] attribute boolean checked;
[Reflect] attribute boolean disabled;
[Reflect=checked] attribute boolean defaultChecked;