From ac8bb89f507f5010d4b3c177103dd9aea3ef11c0 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 19 Nov 2023 21:37:40 +0100 Subject: [PATCH] LibWeb: Allocate list of registered intersection observers on demand This shrinks most DOM elements by 16 bytes. --- Userland/Libraries/LibWeb/DOM/Element.cpp | 16 +++++++++++----- Userland/Libraries/LibWeb/DOM/Element.h | 2 +- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Userland/Libraries/LibWeb/DOM/Element.cpp b/Userland/Libraries/LibWeb/DOM/Element.cpp index da2908ea9c..39c193cb04 100644 --- a/Userland/Libraries/LibWeb/DOM/Element.cpp +++ b/Userland/Libraries/LibWeb/DOM/Element.cpp @@ -97,8 +97,10 @@ void Element::visit_edges(Cell::Visitor& visitor) for (auto& pseudo_element_layout_node : *m_pseudo_element_nodes) visitor.visit(pseudo_element_layout_node); } - for (auto& registered_intersection_observers : m_registered_intersection_observers) - visitor.visit(registered_intersection_observers.observer); + if (m_registered_intersection_observers) { + for (auto& registered_intersection_observers : *m_registered_intersection_observers) + visitor.visit(registered_intersection_observers.observer); + } } // https://dom.spec.whatwg.org/#dom-element-getattribute @@ -2068,19 +2070,23 @@ bool Element::id_reference_exists(DeprecatedString const& id_reference) const void Element::register_intersection_observer(Badge, IntersectionObserver::IntersectionObserverRegistration registration) { - m_registered_intersection_observers.append(move(registration)); + if (!m_registered_intersection_observers) + m_registered_intersection_observers = make>(); + m_registered_intersection_observers->append(move(registration)); } void Element::unregister_intersection_observer(Badge, JS::NonnullGCPtr observer) { - m_registered_intersection_observers.remove_first_matching([&observer](IntersectionObserver::IntersectionObserverRegistration const& entry) { + VERIFY(m_registered_intersection_observers); + m_registered_intersection_observers->remove_first_matching([&observer](IntersectionObserver::IntersectionObserverRegistration const& entry) { return entry.observer == observer; }); } IntersectionObserver::IntersectionObserverRegistration& Element::get_intersection_observer_registration(Badge, IntersectionObserver::IntersectionObserver const& observer) { - auto registration_iterator = m_registered_intersection_observers.find_if([&observer](IntersectionObserver::IntersectionObserverRegistration const& entry) { + VERIFY(m_registered_intersection_observers); + auto registration_iterator = m_registered_intersection_observers->find_if([&observer](IntersectionObserver::IntersectionObserverRegistration const& entry) { return entry.observer.ptr() == &observer; }); VERIFY(!registration_iterator.is_end()); diff --git a/Userland/Libraries/LibWeb/DOM/Element.h b/Userland/Libraries/LibWeb/DOM/Element.h index f36daf0e2f..75db7d60e2 100644 --- a/Userland/Libraries/LibWeb/DOM/Element.h +++ b/Userland/Libraries/LibWeb/DOM/Element.h @@ -429,7 +429,7 @@ private: // https://www.w3.org/TR/intersection-observer/#dom-element-registeredintersectionobservers-slot // Element objects have an internal [[RegisteredIntersectionObservers]] slot, which is initialized to an empty list. - Vector m_registered_intersection_observers; + OwnPtr> m_registered_intersection_observers; Array m_scroll_offset; };