mirror of
https://github.com/fergalmoran/ladybird.git
synced 2026-01-04 15:45:25 +00:00
LibWeb: Make event dispatching spec-compliant
Specification: https://dom.spec.whatwg.org/#concept-event-dispatch This also introduces shadow roots due to it being a requirement of the event dispatcher. However, it does not introduce the full shadow DOM, that can be left for future work. This changes some event dispatches which require certain attributes to be initialised to a value.
This commit is contained in:
@@ -41,13 +41,29 @@ EventTarget::~EventTarget()
|
||||
|
||||
void EventTarget::add_event_listener(const FlyString& event_name, NonnullRefPtr<EventListener> listener)
|
||||
{
|
||||
auto existing_listener = m_listeners.first_matching([&](auto& entry) {
|
||||
return entry.listener->type() == event_name && &entry.listener->function() == &listener->function() && entry.listener->capture() == listener->capture();
|
||||
});
|
||||
if (existing_listener.has_value())
|
||||
return;
|
||||
listener->set_type(event_name);
|
||||
m_listeners.append({ event_name, move(listener) });
|
||||
}
|
||||
|
||||
void EventTarget::remove_event_listener(const FlyString& event_name, NonnullRefPtr<EventListener> listener)
|
||||
{
|
||||
m_listeners.remove_first_matching([&](auto& entry) {
|
||||
return entry.event_name == event_name && &entry.listener->function() == &listener->function();
|
||||
auto matches = entry.event_name == event_name && &entry.listener->function() == &listener->function() && entry.listener->capture() == listener->capture();
|
||||
if (matches)
|
||||
entry.listener->set_removed(true);
|
||||
return matches;
|
||||
});
|
||||
}
|
||||
|
||||
void EventTarget::remove_from_event_listener_list(NonnullRefPtr<EventListener> listener)
|
||||
{
|
||||
m_listeners.remove_first_matching([&](auto& entry) {
|
||||
return entry.listener->type() == listener->type() && &entry.listener->function() == &listener->function() && entry.listener->capture() == listener->capture();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user