diff --git a/Userland/Libraries/LibWeb/HTML/HTMLFormElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLFormElement.cpp
index a40da14126..c4310bb0b0 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLFormElement.cpp
+++ b/Userland/Libraries/LibWeb/HTML/HTMLFormElement.cpp
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2018-2021, Andreas Kling
+ * Copyright (c) 2023, Kenneth Myhra
*
* SPDX-License-Identifier: BSD-2-Clause
*/
@@ -247,4 +248,30 @@ unsigned HTMLFormElement::length() const
return elements()->length();
}
+// https://html.spec.whatwg.org/multipage/forms.html#category-submit
+ErrorOr>> HTMLFormElement::get_submittable_elements()
+{
+ Vector> submittable_elements = {};
+ for (size_t i = 0; i < elements()->length(); i++) {
+ auto* element = elements()->item(i);
+ TRY(populate_vector_with_submittable_elements_in_tree_order(*element, submittable_elements));
+ }
+ return submittable_elements;
+}
+
+ErrorOr HTMLFormElement::populate_vector_with_submittable_elements_in_tree_order(JS::NonnullGCPtr element, Vector>& elements)
+{
+ if (auto* form_associated_element = dynamic_cast(element.ptr())) {
+ if (form_associated_element->is_submittable())
+ TRY(elements.try_append(element));
+ }
+
+ for (size_t i = 0; i < element->children()->length(); i++) {
+ auto* child = element->children()->item(i);
+ TRY(populate_vector_with_submittable_elements_in_tree_order(*child, elements));
+ }
+
+ return {};
+}
+
}
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLFormElement.h b/Userland/Libraries/LibWeb/HTML/HTMLFormElement.h
index 3673ba8038..b9440be779 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLFormElement.h
+++ b/Userland/Libraries/LibWeb/HTML/HTMLFormElement.h
@@ -34,6 +34,8 @@ public:
void add_associated_element(Badge, HTMLElement&);
void remove_associated_element(Badge, HTMLElement&);
+ ErrorOr>> get_submittable_elements();
+
JS::NonnullGCPtr elements() const;
unsigned length() const;
@@ -46,6 +48,8 @@ private:
virtual JS::ThrowCompletionOr initialize(JS::Realm&) override;
virtual void visit_edges(Cell::Visitor&) override;
+ ErrorOr populate_vector_with_submittable_elements_in_tree_order(JS::NonnullGCPtr element, Vector>& elements);
+
bool m_firing_submission_events { false };
// https://html.spec.whatwg.org/multipage/forms.html#locked-for-reset