DefaultAttributeObserver
Represents the default attribute observer.
using AngleSharp.Dom.Html;
using AngleSharp.Dom.Svg;
using AngleSharp.Extensions;
using AngleSharp.Html;
using System;
using System.Collections.Generic;
namespace AngleSharp.Dom
{
public class DefaultAttributeObserver : IAttributeObserver
{
private readonly List<Action<IElement, string, string>> _actions;
public DefaultAttributeObserver()
{
_actions = new List<Action<IElement, string, string>>();
RegisterStandardObservers();
}
protected virtual void RegisterStandardObservers()
{
RegisterObserver(AttributeNames.Class, delegate(Element element, string value) {
element.UpdateClassList(value);
});
RegisterObserver(AttributeNames.DropZone, delegate(HtmlElement element, string value) {
element.UpdateDropZone(value);
});
RegisterObserver(AttributeNames.Style, delegate(HtmlElement element, string value) {
element.UpdateStyle(value);
});
RegisterObserver(AttributeNames.Href, delegate(HtmlBaseElement element, string value) {
element.UpdateUrl(value);
});
RegisterObserver(AttributeNames.Src, delegate(HtmlEmbedElement element, string value) {
element.UpdateSource(value);
});
RegisterObserver(AttributeNames.Sizes, delegate(HtmlLinkElement element, string value) {
element.UpdateSizes(value);
});
RegisterObserver(AttributeNames.Media, delegate(HtmlLinkElement element, string value) {
element.UpdateMedia(value);
});
RegisterObserver(AttributeNames.Disabled, delegate(HtmlLinkElement element, string value) {
element.UpdateDisabled(value);
});
RegisterObserver(AttributeNames.Href, delegate(HtmlLinkElement element, string value) {
element.UpdateSource(value);
});
RegisterObserver(AttributeNames.Rel, delegate(HtmlLinkElement element, string value) {
element.UpdateRelation(value);
});
RegisterObserver(AttributeNames.Rel, delegate(HtmlUrlBaseElement element, string value) {
element.UpdateRel(value);
});
RegisterObserver(AttributeNames.Ping, delegate(HtmlUrlBaseElement element, string value) {
element.UpdatePing(value);
});
RegisterObserver(AttributeNames.Headers, delegate(HtmlTableCellElement element, string value) {
element.UpdateHeaders(value);
});
RegisterObserver(AttributeNames.Media, delegate(HtmlStyleElement element, string value) {
element.UpdateMedia(value);
});
RegisterObserver(AttributeNames.Value, delegate(HtmlSelectElement element, string value) {
element.UpdateValue(value);
});
RegisterObserver(AttributeNames.For, delegate(HtmlOutputElement element, string value) {
element.UpdateFor(value);
});
RegisterObserver(AttributeNames.Data, delegate(HtmlObjectElement element, string value) {
element.UpdateSource(value);
});
RegisterObserver(AttributeNames.Src, delegate(HtmlAudioElement element, string value) {
element.UpdateSource(value);
});
RegisterObserver(AttributeNames.Src, delegate(HtmlVideoElement element, string value) {
element.UpdateSource(value);
});
RegisterObserver(AttributeNames.Src, delegate(HtmlImageElement element, string value) {
element.UpdateSource();
});
RegisterObserver(AttributeNames.SrcSet, delegate(HtmlImageElement element, string value) {
element.UpdateSource();
});
RegisterObserver(AttributeNames.Sizes, delegate(HtmlImageElement element, string value) {
element.UpdateSource();
});
RegisterObserver(AttributeNames.CrossOrigin, delegate(HtmlImageElement element, string value) {
element.UpdateSource();
});
RegisterObserver(AttributeNames.Sandbox, delegate(HtmlIFrameElement element, string value) {
element.UpdateSandbox(value);
});
RegisterObserver(AttributeNames.SrcDoc, delegate(HtmlIFrameElement element, string value) {
element.UpdateSource();
});
RegisterObserver(AttributeNames.Src, delegate(HtmlFrameElementBase element, string value) {
element.UpdateSource();
});
RegisterObserver(AttributeNames.Style, delegate(SvgElement element, string value) {
element.UpdateStyle(value);
});
RegisterObserver(AttributeNames.Type, delegate(HtmlInputElement element, string value) {
element.UpdateType(value);
});
}
public void RegisterObserver<TElement>(string expectedName, Action<TElement, string> callback) where TElement : IElement
{
_actions.Add((Action<IElement, string, string>)delegate(IElement element, string actualName, string value) {
if (element is TElement && actualName.Is(expectedName))
callback((TElement)element, value);
});
}
void IAttributeObserver.NotifyChange(IElement host, string name, string value)
{
foreach (Action<IElement, string, string> action in _actions) {
action(host, name, value);
}
}
}
}