LibWeb: Update handling of "once" event listeners now that spec is fixed

https://github.com/whatwg/dom/issues/1323 was fixed, and the solution
ended up slightly different from what we had, so let's follow the spec.
This commit is contained in:
Andreas Kling 2024-11-18 19:03:18 +01:00 committed by Andreas Kling
parent 9f541c363d
commit e28e4f6700
Notes: github-actions[bot] 2024-11-18 19:21:51 +00:00
3 changed files with 2 additions and 14 deletions

View file

@ -56,9 +56,9 @@ bool EventDispatcher::inner_invoke(Event& event, Vector<GC::Root<DOM::DOMEventLi
if (phase == Event::Phase::BubblingPhase && listener->capture)
continue;
// 5. If listeners once is true, then remove listener from events currentTarget attribute values event listener list.
// 5. If listeners once is true, then remove an event listener given events currentTarget attribute value and listener.
if (listener->once)
event.current_target()->remove_from_event_listener_list(*listener);
event.current_target()->remove_an_event_listener(*listener);
// 6. Let global be listener callbacks associated Realms global object.
auto& callback = listener->callback->callback();

View file

@ -249,17 +249,6 @@ void EventTarget::remove_an_event_listener(DOMEventListener& listener)
m_data->event_listener_list.remove_first_matching([&](auto& entry) { return entry.ptr() == &listener; });
}
void EventTarget::remove_from_event_listener_list(DOMEventListener& listener)
{
if (!m_data)
return;
m_data->event_listener_list.remove_first_matching([&](auto& entry) { return entry.ptr() == &listener; });
// FIXME: Update this when the spec is updated.
// Spec bug: https://github.com/whatwg/dom/issues/1323
listener.removed = true;
}
// https://dom.spec.whatwg.org/#dom-eventtarget-dispatchevent
WebIDL::ExceptionOr<bool> EventTarget::dispatch_event_binding(Event& event)
{

View file

@ -42,7 +42,6 @@ public:
void add_an_event_listener(DOMEventListener&);
void remove_an_event_listener(DOMEventListener&);
void remove_from_event_listener_list(DOMEventListener&);
Vector<GC::Root<DOMEventListener>> event_listener_list();