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; }
};
}