1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 16:37:35 +00:00

LibWeb: Allocate list of registered intersection observers on demand

This shrinks most DOM elements by 16 bytes.
This commit is contained in:
Andreas Kling 2023-11-19 21:37:40 +01:00
parent bdac94870c
commit ac8bb89f50
2 changed files with 12 additions and 6 deletions

View file

@ -97,8 +97,10 @@ void Element::visit_edges(Cell::Visitor& visitor)
for (auto& pseudo_element_layout_node : *m_pseudo_element_nodes) for (auto& pseudo_element_layout_node : *m_pseudo_element_nodes)
visitor.visit(pseudo_element_layout_node); visitor.visit(pseudo_element_layout_node);
} }
for (auto& registered_intersection_observers : m_registered_intersection_observers) if (m_registered_intersection_observers) {
visitor.visit(registered_intersection_observers.observer); for (auto& registered_intersection_observers : *m_registered_intersection_observers)
visitor.visit(registered_intersection_observers.observer);
}
} }
// https://dom.spec.whatwg.org/#dom-element-getattribute // 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::IntersectionObserver>, IntersectionObserver::IntersectionObserverRegistration registration) void Element::register_intersection_observer(Badge<IntersectionObserver::IntersectionObserver>, IntersectionObserver::IntersectionObserverRegistration registration)
{ {
m_registered_intersection_observers.append(move(registration)); if (!m_registered_intersection_observers)
m_registered_intersection_observers = make<Vector<IntersectionObserver::IntersectionObserverRegistration>>();
m_registered_intersection_observers->append(move(registration));
} }
void Element::unregister_intersection_observer(Badge<IntersectionObserver::IntersectionObserver>, JS::NonnullGCPtr<IntersectionObserver::IntersectionObserver> observer) void Element::unregister_intersection_observer(Badge<IntersectionObserver::IntersectionObserver>, JS::NonnullGCPtr<IntersectionObserver::IntersectionObserver> 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; return entry.observer == observer;
}); });
} }
IntersectionObserver::IntersectionObserverRegistration& Element::get_intersection_observer_registration(Badge<DOM::Document>, IntersectionObserver::IntersectionObserver const& observer) IntersectionObserver::IntersectionObserverRegistration& Element::get_intersection_observer_registration(Badge<DOM::Document>, 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; return entry.observer.ptr() == &observer;
}); });
VERIFY(!registration_iterator.is_end()); VERIFY(!registration_iterator.is_end());

View file

@ -429,7 +429,7 @@ private:
// https://www.w3.org/TR/intersection-observer/#dom-element-registeredintersectionobservers-slot // 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. // Element objects have an internal [[RegisteredIntersectionObservers]] slot, which is initialized to an empty list.
Vector<IntersectionObserver::IntersectionObserverRegistration> m_registered_intersection_observers; OwnPtr<Vector<IntersectionObserver::IntersectionObserverRegistration>> m_registered_intersection_observers;
Array<CSSPixelPoint, 3> m_scroll_offset; Array<CSSPixelPoint, 3> m_scroll_offset;
}; };