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