diff --git a/Userland/Libraries/LibWeb/HTML/HTMLButtonElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLButtonElement.cpp
index b1926428bc..bd791c70d6 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLButtonElement.cpp
+++ b/Userland/Libraries/LibWeb/HTML/HTMLButtonElement.cpp
@@ -17,4 +17,37 @@ HTMLButtonElement::~HTMLButtonElement()
{
}
+String HTMLButtonElement::type() const
+{
+ auto value = attribute(HTML::AttributeNames::type);
+
+#define __ENUMERATE_HTML_BUTTON_TYPE_ATTRIBUTE(keyword, _) \
+ if (value.equals_ignoring_case(#keyword)) \
+ return #keyword;
+ ENUMERATE_HTML_BUTTON_TYPE_ATTRIBUTES
+#undef __ENUMERATE_HTML_BUTTON_TYPE_ATTRIBUTE
+
+ // The missing value default and invalid value default are the Submit Button state.
+ return "submit";
+}
+
+HTMLButtonElement::TypeAttributeState HTMLButtonElement::type_state() const
+{
+ auto value = attribute(HTML::AttributeNames::type);
+
+#define __ENUMERATE_HTML_BUTTON_TYPE_ATTRIBUTE(keyword, state) \
+ if (value.equals_ignoring_case(#keyword)) \
+ return HTMLButtonElement::TypeAttributeState::state;
+ ENUMERATE_HTML_BUTTON_TYPE_ATTRIBUTES
+#undef __ENUMERATE_HTML_BUTTON_TYPE_ATTRIBUTE
+
+ // The missing value default and invalid value default are the Submit Button state.
+ return HTMLButtonElement::TypeAttributeState::Submit;
+}
+
+void HTMLButtonElement::set_type(String const& type)
+{
+ set_attribute(HTML::AttributeNames::type, type);
+}
+
}
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLButtonElement.h b/Userland/Libraries/LibWeb/HTML/HTMLButtonElement.h
index dd6fbff687..93e6bc5e09 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLButtonElement.h
+++ b/Userland/Libraries/LibWeb/HTML/HTMLButtonElement.h
@@ -10,6 +10,11 @@
namespace Web::HTML {
+#define ENUMERATE_HTML_BUTTON_TYPE_ATTRIBUTES \
+ __ENUMERATE_HTML_BUTTON_TYPE_ATTRIBUTE(submit, Submit) \
+ __ENUMERATE_HTML_BUTTON_TYPE_ATTRIBUTE(reset, Reset) \
+ __ENUMERATE_HTML_BUTTON_TYPE_ATTRIBUTE(button, Button)
+
class HTMLButtonElement final : public FormAssociatedElement {
public:
using WrapperType = Bindings::HTMLButtonElementWrapper;
@@ -17,6 +22,16 @@ public:
HTMLButtonElement(DOM::Document&, DOM::QualifiedName);
virtual ~HTMLButtonElement() override;
+ enum class TypeAttributeState {
+#define __ENUMERATE_HTML_BUTTON_TYPE_ATTRIBUTE(_, state) state,
+ ENUMERATE_HTML_BUTTON_TYPE_ATTRIBUTES
+#undef __ENUMERATE_HTML_BUTTON_TYPE_ATTRIBUTE
+ };
+
+ String type() const;
+ TypeAttributeState type_state() const;
+ void set_type(String const&);
+
// ^FormAssociatedElement
// https://html.spec.whatwg.org/multipage/forms.html#category-listed
virtual bool is_listed() const override { return true; }
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLButtonElement.idl b/Userland/Libraries/LibWeb/HTML/HTMLButtonElement.idl
index f49a3be315..74bad1b1fa 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLButtonElement.idl
+++ b/Userland/Libraries/LibWeb/HTML/HTMLButtonElement.idl
@@ -6,5 +6,6 @@ interface HTMLButtonElement : HTMLElement {
[Reflect=formtarget] attribute DOMString formTarget;
[Reflect] attribute DOMString name;
[Reflect] attribute DOMString value;
+ [CEReactions] attribute DOMString type;
};