EventTarget
Event target base of all DOM nodes.
using AngleSharp.Dom.Events;
using AngleSharp.Html;
using AngleSharp.Text;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
namespace AngleSharp.Dom
{
[System.Runtime.CompilerServices.NullableContext(1)]
[System.Runtime.CompilerServices.Nullable(0)]
public abstract class EventTarget : IEventTarget
{
[System.Runtime.CompilerServices.Nullable(0)]
private readonly struct RegisteredEventListener
{
public readonly string Type;
public readonly DomEventHandler Callback;
public readonly bool IsCaptured;
public RegisteredEventListener(string type, DomEventHandler callback, bool isCaptured)
{
Type = type;
Callback = callback;
IsCaptured = isCaptured;
}
}
[System.Runtime.CompilerServices.Nullable(2)]
private List<RegisteredEventListener> _listeners;
private List<RegisteredEventListener> Listeners => _listeners ?? (_listeners = new List<RegisteredEventListener>());
internal bool HasEventListeners {
get {
if (_listeners != null)
return _listeners.Count > 0;
return false;
}
}
public void AddEventListener(string type, [System.Runtime.CompilerServices.Nullable(2)] DomEventHandler callback = null, bool capture = false)
{
if (callback != null)
Listeners.Add(new RegisteredEventListener(type, callback, capture));
}
public void RemoveEventListener(string type, [System.Runtime.CompilerServices.Nullable(2)] DomEventHandler callback = null, bool capture = false)
{
if (callback != null)
_listeners?.Remove(new RegisteredEventListener(type, callback, capture));
}
public void RemoveEventListeners()
{
if (_listeners != null)
_listeners.Clear();
}
public void InvokeEventListener(Event ev)
{
if (_listeners != null) {
string type = ev.Type;
RegisteredEventListener[] array = _listeners.ToArray();
IEventTarget currentTarget = ev.CurrentTarget;
EventPhase phase = ev.Phase;
RegisteredEventListener[] array2 = array;
foreach (RegisteredEventListener registeredEventListener in array2) {
if (_listeners.Contains(registeredEventListener) && registeredEventListener.Type.Is(type)) {
if ((ev.Flags & EventFlags.StopImmediatePropagation) == EventFlags.StopImmediatePropagation)
break;
if ((!registeredEventListener.IsCaptured || phase != EventPhase.Bubbling) && (registeredEventListener.IsCaptured || phase != EventPhase.Capturing))
registeredEventListener.Callback(currentTarget, ev);
}
}
}
}
public bool HasEventListener(string type)
{
if (_listeners != null) {
foreach (RegisteredEventListener listener in _listeners) {
if (listener.Type.Is(type))
return true;
}
}
return false;
}
public bool Dispatch(Event ev)
{
if (ev == null || (ev.Flags & EventFlags.Dispatch) == EventFlags.Dispatch || (ev.Flags & EventFlags.Initialized) != EventFlags.Initialized)
throw new DomException(DomError.InvalidState);
ev.IsTrusted = false;
return ev.Dispatch(this);
}
}
}