diff --git a/Tests/LibWeb/Text/expected/form-requestSubmit.txt b/Tests/LibWeb/Text/expected/form-requestSubmit.txt
new file mode 100644
index 0000000000..328a18619c
--- /dev/null
+++ b/Tests/LibWeb/Text/expected/form-requestSubmit.txt
@@ -0,0 +1,4 @@
+ Submitter is null
+
+Exception: NotFoundError
+Exception: TypeError
diff --git a/Tests/LibWeb/Text/input/form-requestSubmit.html b/Tests/LibWeb/Text/input/form-requestSubmit.html
new file mode 100644
index 0000000000..6f01e4f43a
--- /dev/null
+++ b/Tests/LibWeb/Text/input/form-requestSubmit.html
@@ -0,0 +1,41 @@
+
+
+
+
+
+
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLFormElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLFormElement.cpp
index 418b8aad0e..86f762863c 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLFormElement.cpp
+++ b/Userland/Libraries/LibWeb/HTML/HTMLFormElement.cpp
@@ -319,6 +319,29 @@ WebIDL::ExceptionOr HTMLFormElement::submit()
return submit_form(*this, { .from_submit_binding = true });
}
+// https://html.spec.whatwg.org/multipage/forms.html#dom-form-requestsubmit
+WebIDL::ExceptionOr HTMLFormElement::request_submit(JS::GCPtr submitter)
+{
+ // 1. If submitter is not null, then:
+ if (submitter) {
+ // 1. If submitter is not a submit button, then throw a TypeError.
+ auto* form_associated_element = dynamic_cast(submitter.ptr());
+ if (!(form_associated_element && form_associated_element->is_submit_button()))
+ return WebIDL::SimpleException { WebIDL::SimpleExceptionType::TypeError, "The submitter is not a submit button"sv };
+
+ // 2. If submitter's form owner is not this form element, then throw a "NotFoundError" DOMException.
+ if (form_associated_element->form() != this)
+ return WebIDL::NotFoundError::create(realm(), "The submitter is not owned by this form element"_fly_string);
+ }
+ // 2. Otherwise, set submitter to this form element.
+ else {
+ submitter = this;
+ }
+
+ // 3. Submit this form element, from submitter.
+ return submit_form(static_cast(*submitter), {});
+}
+
// https://html.spec.whatwg.org/multipage/forms.html#dom-form-reset
void HTMLFormElement::reset()
{
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLFormElement.h b/Userland/Libraries/LibWeb/HTML/HTMLFormElement.h
index e8b719038f..016efb8bd6 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLFormElement.h
+++ b/Userland/Libraries/LibWeb/HTML/HTMLFormElement.h
@@ -65,6 +65,9 @@ public:
// NOTE: This is for the JS bindings. Use submit_form instead.
WebIDL::ExceptionOr submit();
+ // NOTE: This is for the JS bindings. Use submit_form instead.
+ WebIDL::ExceptionOr request_submit(JS::GCPtr submitter);
+
// NOTE: This is for the JS bindings. Use submit_form instead.
void reset();
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLFormElement.idl b/Userland/Libraries/LibWeb/HTML/HTMLFormElement.idl
index 44cca996ea..e413f38f4f 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLFormElement.idl
+++ b/Userland/Libraries/LibWeb/HTML/HTMLFormElement.idl
@@ -25,7 +25,7 @@ interface HTMLFormElement : HTMLElement {
getter (RadioNodeList or Element) (DOMString name);
undefined submit();
- // FIXME: undefined requestSubmit(optional HTMLElement? submitter = null);
+ undefined requestSubmit(optional HTMLElement? submitter = null);
[CEReactions] undefined reset();
boolean checkValidity();
boolean reportValidity();