EventTarget
Event target base of all DOM nodes.
using AngleSharp.Dom.Events;
using AngleSharp.Html;
using System.Collections.Generic;
namespace AngleSharp.Dom
{
public abstract class EventTarget : IEventTarget
{
private struct RegisteredEventListener
{
public string Type;
public DomEventHandler Callback;
public bool IsCaptured;
}
private readonly List<RegisteredEventListener> _listeners;
public EventTarget()
{
_listeners = new List<RegisteredEventListener>();
}
public void AddEventListener(string type, DomEventHandler callback = null, bool capture = false)
{
if (callback != null)
_listeners.Add(new RegisteredEventListener {
Type = type,
Callback = callback,
IsCaptured = capture
});
}
public void RemoveEventListener(string type, DomEventHandler callback = null, bool capture = false)
{
if (callback != null)
_listeners.Remove(new RegisteredEventListener {
Type = type,
Callback = callback,
IsCaptured = capture
});
}
internal void CallEventListener(Event ev)
{
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 != type)) {
if (ev.Flags.HasFlag(EventFlags.StopImmediatePropagation))
break;
if ((!registeredEventListener.IsCaptured || phase != EventPhase.Bubbling) && (registeredEventListener.IsCaptured || phase != EventPhase.Capturing))
registeredEventListener.Callback(currentTarget, ev);
}
}
}
internal bool HasEventListener(string type)
{
foreach (RegisteredEventListener listener in _listeners) {
if (listener.Type == type)
return true;
}
return false;
}
public bool Dispatch(Event ev)
{
if (ev == null || ev.Flags.HasFlag(EventFlags.Dispatch) || !ev.Flags.HasFlag(EventFlags.Initialized))
throw new DomException(ErrorCode.InvalidState);
ev.IsTrusted = false;
return ev.Dispatch(this);
}
}
}