diff --git a/Tests/LibWeb/Text/expected/HTML/set-innerHTML-details.txt b/Tests/LibWeb/Text/expected/HTML/set-innerHTML-details.txt new file mode 100644 index 0000000000..d489e8ca64 --- /dev/null +++ b/Tests/LibWeb/Text/expected/HTML/set-innerHTML-details.txt @@ -0,0 +1 @@ +
diff --git a/Tests/LibWeb/Text/expected/HTML/set-innerHTML-input.txt b/Tests/LibWeb/Text/expected/HTML/set-innerHTML-input.txt new file mode 100644 index 0000000000..57b77fa2bb --- /dev/null +++ b/Tests/LibWeb/Text/expected/HTML/set-innerHTML-input.txt @@ -0,0 +1 @@ + diff --git a/Tests/LibWeb/Text/expected/HTML/set-innerHTML-textarea.txt b/Tests/LibWeb/Text/expected/HTML/set-innerHTML-textarea.txt new file mode 100644 index 0000000000..4c7361e8c1 --- /dev/null +++ b/Tests/LibWeb/Text/expected/HTML/set-innerHTML-textarea.txt @@ -0,0 +1 @@ + diff --git a/Tests/LibWeb/Text/input/HTML/set-innerHTML-details.html b/Tests/LibWeb/Text/input/HTML/set-innerHTML-details.html new file mode 100644 index 0000000000..921b0c7b00 --- /dev/null +++ b/Tests/LibWeb/Text/input/HTML/set-innerHTML-details.html @@ -0,0 +1,9 @@ +
+ + diff --git a/Tests/LibWeb/Text/input/HTML/set-innerHTML-input.html b/Tests/LibWeb/Text/input/HTML/set-innerHTML-input.html new file mode 100644 index 0000000000..32e9c29681 --- /dev/null +++ b/Tests/LibWeb/Text/input/HTML/set-innerHTML-input.html @@ -0,0 +1,9 @@ +
+ + diff --git a/Tests/LibWeb/Text/input/HTML/set-innerHTML-textarea.html b/Tests/LibWeb/Text/input/HTML/set-innerHTML-textarea.html new file mode 100644 index 0000000000..a9195fe0ed --- /dev/null +++ b/Tests/LibWeb/Text/input/HTML/set-innerHTML-textarea.html @@ -0,0 +1,9 @@ +
+ + diff --git a/Userland/Libraries/LibWeb/HTML/HTMLDetailsElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLDetailsElement.cpp index aa1b4dc399..23110e1ebc 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLDetailsElement.cpp +++ b/Userland/Libraries/LibWeb/HTML/HTMLDetailsElement.cpp @@ -39,8 +39,17 @@ void HTMLDetailsElement::initialize(JS::Realm& realm) { Base::initialize(realm); set_prototype(&Bindings::ensure_web_prototype(realm, "HTMLDetailsElement"_fly_string)); +} - create_shadow_tree(realm).release_value_but_fixme_should_propagate_errors(); +void HTMLDetailsElement::inserted() +{ + create_shadow_tree_if_needed().release_value_but_fixme_should_propagate_errors(); + update_shadow_tree_slots(); +} + +void HTMLDetailsElement::removed_from(DOM::Node*) +{ + set_shadow_root(nullptr); } void HTMLDetailsElement::attribute_changed(FlyString const& name, Optional const& value) @@ -107,8 +116,13 @@ void HTMLDetailsElement::queue_a_details_toggle_event_task(String old_state, Str } // https://html.spec.whatwg.org/#the-details-and-summary-elements -WebIDL::ExceptionOr HTMLDetailsElement::create_shadow_tree(JS::Realm& realm) +WebIDL::ExceptionOr HTMLDetailsElement::create_shadow_tree_if_needed() { + if (shadow_root_internal()) + return {}; + + auto& realm = this->realm(); + // The element is also expected to have an internal shadow tree with two slots. auto shadow_root = heap().allocate(realm, document(), *this, Bindings::ShadowRootMode::Closed); shadow_root->set_slot_assignment(Bindings::SlotAssignmentMode::Manual); @@ -130,6 +144,9 @@ WebIDL::ExceptionOr HTMLDetailsElement::create_shadow_tree(JS::Realm& real void HTMLDetailsElement::update_shadow_tree_slots() { + if (!shadow_root_internal()) + return; + Vector summary_assignment; Vector descendants_assignment; @@ -159,6 +176,9 @@ void HTMLDetailsElement::update_shadow_tree_slots() // https://html.spec.whatwg.org/#the-details-and-summary-elements:the-details-element-6 void HTMLDetailsElement::update_shadow_tree_style() { + if (!shadow_root_internal()) + return; + if (has_attribute(HTML::AttributeNames::open)) { MUST(m_descendants_slot->set_attribute(HTML::AttributeNames::style, R"~~~( display: block; diff --git a/Userland/Libraries/LibWeb/HTML/HTMLDetailsElement.h b/Userland/Libraries/LibWeb/HTML/HTMLDetailsElement.h index 0f18522475..2c4fb68b39 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLDetailsElement.h +++ b/Userland/Libraries/LibWeb/HTML/HTMLDetailsElement.h @@ -31,12 +31,14 @@ private: virtual void initialize(JS::Realm&) override; virtual void visit_edges(Cell::Visitor&) override; + virtual void inserted() override; + virtual void removed_from(DOM::Node*) override; virtual void children_changed() override; virtual void attribute_changed(FlyString const& name, Optional const& value) override; void queue_a_details_toggle_event_task(String old_state, String new_state); - WebIDL::ExceptionOr create_shadow_tree(JS::Realm&); + WebIDL::ExceptionOr create_shadow_tree_if_needed(); void update_shadow_tree_slots(); void update_shadow_tree_style(); diff --git a/Userland/Libraries/LibWeb/HTML/HTMLInputElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLInputElement.cpp index 9533cc6c13..e3113f8d3e 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLInputElement.cpp +++ b/Userland/Libraries/LibWeb/HTML/HTMLInputElement.cpp @@ -1003,6 +1003,11 @@ void HTMLInputElement::form_associated_element_was_inserted() create_shadow_tree_if_needed(); } +void HTMLInputElement::form_associated_element_was_removed(DOM::Node*) +{ + set_shadow_root(nullptr); +} + // https://html.spec.whatwg.org/multipage/input.html#radio-button-group static bool is_in_same_radio_button_group(HTML::HTMLInputElement const& a, HTML::HTMLInputElement const& b) { diff --git a/Userland/Libraries/LibWeb/HTML/HTMLInputElement.h b/Userland/Libraries/LibWeb/HTML/HTMLInputElement.h index 8ccaf0f751..2c381a9c51 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLInputElement.h +++ b/Userland/Libraries/LibWeb/HTML/HTMLInputElement.h @@ -139,6 +139,7 @@ public: virtual void reset_algorithm() override; virtual void form_associated_element_was_inserted() override; + virtual void form_associated_element_was_removed(DOM::Node*) override; // ^HTMLElement // https://html.spec.whatwg.org/multipage/forms.html#category-label diff --git a/Userland/Libraries/LibWeb/HTML/HTMLTextAreaElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLTextAreaElement.cpp index f671dce3e5..deb4e8da92 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLTextAreaElement.cpp +++ b/Userland/Libraries/LibWeb/HTML/HTMLTextAreaElement.cpp @@ -91,6 +91,11 @@ void HTMLTextAreaElement::form_associated_element_was_inserted() create_shadow_tree_if_needed(); } +void HTMLTextAreaElement::form_associated_element_was_removed(DOM::Node*) +{ + set_shadow_root(nullptr); +} + void HTMLTextAreaElement::create_shadow_tree_if_needed() { if (shadow_root_internal()) diff --git a/Userland/Libraries/LibWeb/HTML/HTMLTextAreaElement.h b/Userland/Libraries/LibWeb/HTML/HTMLTextAreaElement.h index aba64f05c4..6edb0d485e 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLTextAreaElement.h +++ b/Userland/Libraries/LibWeb/HTML/HTMLTextAreaElement.h @@ -62,6 +62,7 @@ public: virtual void reset_algorithm() override; virtual void form_associated_element_was_inserted() override; + virtual void form_associated_element_was_removed(DOM::Node*) override; virtual void children_changed() override;