diff --git a/Userland/Libraries/LibWeb/HTML/FormAssociatedElement.cpp b/Userland/Libraries/LibWeb/HTML/FormAssociatedElement.cpp index 5026c6067e..b08a4420d4 100644 --- a/Userland/Libraries/LibWeb/HTML/FormAssociatedElement.cpp +++ b/Userland/Libraries/LibWeb/HTML/FormAssociatedElement.cpp @@ -31,7 +31,11 @@ namespace Web::HTML { void FormAssociatedElement::set_form(HTMLFormElement* form) { + if (m_form) + m_form->remove_associated_element({}, form_associated_element_to_html_element()); m_form = form; + if (m_form) + m_form->add_associated_element({}, form_associated_element_to_html_element()); } } diff --git a/Userland/Libraries/LibWeb/HTML/FormAssociatedElement.h b/Userland/Libraries/LibWeb/HTML/FormAssociatedElement.h index 2e7a405adf..6b42a7c16e 100644 --- a/Userland/Libraries/LibWeb/HTML/FormAssociatedElement.h +++ b/Userland/Libraries/LibWeb/HTML/FormAssociatedElement.h @@ -39,7 +39,10 @@ public: void set_form(HTMLFormElement*); protected: - FormAssociatedElement() { } + FormAssociatedElement() = default; + virtual ~FormAssociatedElement() = default; + + virtual HTMLElement& form_associated_element_to_html_element() = 0; private: WeakPtr m_form; diff --git a/Userland/Libraries/LibWeb/HTML/HTMLFormElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLFormElement.cpp index 81e4beb453..fc5c699f3a 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLFormElement.cpp +++ b/Userland/Libraries/LibWeb/HTML/HTMLFormElement.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-2020, Andreas Kling + * Copyright (c) 2018-2021, Andreas Kling * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -148,4 +148,14 @@ void HTMLFormElement::submit() submit_form(this, true); } +void HTMLFormElement::add_associated_element(Badge, HTMLElement& element) +{ + m_associated_elements.append(element); +} + +void HTMLFormElement::remove_associated_element(Badge, HTMLElement& element) +{ + m_associated_elements.remove_first_matching([&](auto& entry) { return entry.ptr() == &element; }); +} + } diff --git a/Userland/Libraries/LibWeb/HTML/HTMLFormElement.h b/Userland/Libraries/LibWeb/HTML/HTMLFormElement.h index 0368880494..25fa515dff 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLFormElement.h +++ b/Userland/Libraries/LibWeb/HTML/HTMLFormElement.h @@ -46,8 +46,13 @@ public: // NOTE: This is for the JS bindings. Use submit_form instead. void submit(); + void add_associated_element(Badge, HTMLElement&); + void remove_associated_element(Badge, HTMLElement&); + private: bool m_firing_submission_events { false }; + + Vector> m_associated_elements; }; } diff --git a/Userland/Libraries/LibWeb/HTML/HTMLInputElement.h b/Userland/Libraries/LibWeb/HTML/HTMLInputElement.h index ff8cf6d8c7..53b3f51304 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLInputElement.h +++ b/Userland/Libraries/LibWeb/HTML/HTMLInputElement.h @@ -57,9 +57,13 @@ public: void did_click_button(Badge); private: + // ^DOM::Node virtual void inserted() override; virtual void removed_from(Node*) override; + // ^HTML::FormAssociatedElement + virtual HTMLElement& form_associated_element_to_html_element() override { return *this; } + void create_shadow_tree_if_needed(); RefPtr m_text_node; diff --git a/Userland/Libraries/LibWeb/HTML/HTMLSelectElement.h b/Userland/Libraries/LibWeb/HTML/HTMLSelectElement.h index 1ca77511ff..93bbe6f27f 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLSelectElement.h +++ b/Userland/Libraries/LibWeb/HTML/HTMLSelectElement.h @@ -42,8 +42,12 @@ public: virtual ~HTMLSelectElement() override; private: + // ^DOM::Node virtual void inserted() override; virtual void removed_from(DOM::Node*) override; + + // ^HTML::FormAssociatedElement + virtual HTMLElement& form_associated_element_to_html_element() override { return *this; } }; }