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();