MutationHost
Couples the mutation events to mutation observers and the event loop.
using AngleSharp.Browser;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
namespace AngleSharp.Dom
{
[System.Runtime.CompilerServices.NullableContext(1)]
[System.Runtime.CompilerServices.Nullable(0)]
internal sealed class MutationHost
{
private readonly List<MutationObserver> _observers;
private readonly IEventLoop _loop;
private bool _queued;
public IEnumerable<MutationObserver> Observers => _observers;
public MutationHost(IEventLoop loop)
{
_observers = new List<MutationObserver>();
_queued = false;
_loop = loop;
}
public void Register(MutationObserver observer)
{
if (!_observers.Contains(observer))
_observers.Add(observer);
}
public void Unregister(MutationObserver observer)
{
if (_observers.Contains(observer))
_observers.Remove(observer);
}
public void ScheduleCallback()
{
if (!_queued) {
_queued = true;
_loop.Enqueue(DispatchCallback, TaskPriority.Normal);
}
}
private void DispatchCallback()
{
MutationObserver[] array = _observers.ToArray();
_queued = false;
MutationObserver[] array2 = array;
foreach (MutationObserver object in array2) {
_loop.Enqueue(object.Trigger, TaskPriority.Microtask);
}
}
}
}