mirror of
https://github.com/zebrajr/ladybird.git
synced 2025-12-06 12:20:00 +01:00
With this change we maintain a data structure that maps ids to corresponding elements. This allows us to avoid tree traversal in getElementById() in all cases except ones when lookup happens for unconnected elements.
40 lines
1.2 KiB
C++
40 lines
1.2 KiB
C++
/*
|
|
* Copyright (c) 2025, Aliaksandr Kalenik <kalenik.aliaksandr@gmail.com>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#include <LibWeb/DOM/ElementByIdMap.h>
|
|
|
|
namespace Web::DOM {
|
|
|
|
void ElementByIdMap::add(FlyString const& element_id, Element& element)
|
|
{
|
|
auto& elements_with_id = m_map.ensure(element_id, [] { return Vector<WeakPtr<Element>> {}; });
|
|
|
|
// Remove all elements that were deallocated.
|
|
elements_with_id.remove_all_matching([](WeakPtr<Element>& element) {
|
|
return !element.has_value();
|
|
});
|
|
|
|
VERIFY(!elements_with_id.contains_slow(element));
|
|
elements_with_id.insert_before_matching(element, [&](auto& another_element) {
|
|
return element.is_before(*another_element);
|
|
});
|
|
}
|
|
|
|
void ElementByIdMap::remove(FlyString const& element_id, Element& element)
|
|
{
|
|
auto maybe_elements_with_id = m_map.get(element_id);
|
|
if (!maybe_elements_with_id.has_value())
|
|
return;
|
|
auto& elements_with_id = *maybe_elements_with_id;
|
|
elements_with_id.remove_all_matching([&](auto& another_element) {
|
|
if (!another_element.has_value())
|
|
return true;
|
|
return &element == another_element.ptr();
|
|
});
|
|
}
|
|
|
|
}
|