From 78733417a471a02567e5cb24506d4003110c44b1 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Tue, 20 Apr 2021 23:34:49 +0200 Subject: [PATCH] LibWeb: Register FormAssociatedElement with their owner form This will eventually allow us to implement HTMLFormControlsCollection. --- .../Libraries/LibWeb/HTML/FormAssociatedElement.cpp | 4 ++++ .../Libraries/LibWeb/HTML/FormAssociatedElement.h | 5 ++++- Userland/Libraries/LibWeb/HTML/HTMLFormElement.cpp | 12 +++++++++++- Userland/Libraries/LibWeb/HTML/HTMLFormElement.h | 5 +++++ Userland/Libraries/LibWeb/HTML/HTMLInputElement.h | 4 ++++ Userland/Libraries/LibWeb/HTML/HTMLSelectElement.h | 4 ++++ 6 files changed, 32 insertions(+), 2 deletions(-) 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; } }; }