EventTarget.cpp 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. /*
  2. * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibWeb/Bindings/ScriptExecutionContext.h>
  7. #include <LibWeb/DOM/Event.h>
  8. #include <LibWeb/DOM/EventListener.h>
  9. #include <LibWeb/DOM/EventTarget.h>
  10. namespace Web::DOM {
  11. EventTarget::EventTarget(Bindings::ScriptExecutionContext& script_execution_context)
  12. : m_script_execution_context(&script_execution_context)
  13. {
  14. }
  15. EventTarget::~EventTarget()
  16. {
  17. }
  18. // https://dom.spec.whatwg.org/#add-an-event-listener
  19. void EventTarget::add_event_listener(const FlyString& event_name, RefPtr<EventListener> listener)
  20. {
  21. if (listener.is_null())
  22. return;
  23. auto existing_listener = m_listeners.first_matching([&](auto& entry) {
  24. return entry.listener->type() == event_name && &entry.listener->function() == &listener->function() && entry.listener->capture() == listener->capture();
  25. });
  26. if (existing_listener.has_value())
  27. return;
  28. listener->set_type(event_name);
  29. m_listeners.append({ event_name, listener.release_nonnull() });
  30. }
  31. // https://dom.spec.whatwg.org/#remove-an-event-listener
  32. void EventTarget::remove_event_listener(const FlyString& event_name, RefPtr<EventListener> listener)
  33. {
  34. if (listener.is_null())
  35. return;
  36. m_listeners.remove_first_matching([&](auto& entry) {
  37. auto matches = entry.event_name == event_name && &entry.listener->function() == &listener->function() && entry.listener->capture() == listener->capture();
  38. if (matches)
  39. entry.listener->set_removed(true);
  40. return matches;
  41. });
  42. }
  43. void EventTarget::remove_from_event_listener_list(NonnullRefPtr<EventListener> listener)
  44. {
  45. m_listeners.remove_first_matching([&](auto& entry) {
  46. return entry.listener->type() == listener->type() && &entry.listener->function() == &listener->function() && entry.listener->capture() == listener->capture();
  47. });
  48. }
  49. // https://dom.spec.whatwg.org/#dom-eventtarget-dispatchevent
  50. ExceptionOr<bool> EventTarget::dispatch_event_binding(NonnullRefPtr<Event> event)
  51. {
  52. if (event->dispatched())
  53. return DOM::InvalidStateError::create("The event is already being dispatched.");
  54. if (!event->initialized())
  55. return DOM::InvalidStateError::create("Cannot dispatch an uninitialized event.");
  56. event->set_is_trusted(false);
  57. return dispatch_event(event);
  58. }
  59. }