HtmlElement
class HtmlElement : Element, IHtmlElement, IElement, INode, IEventTarget, IMarkupFormattable, IParentNode, IChildNode, INonDocumentTypeChildNode, IElementCssInlineStyle, IGlobalEventHandlers
Represents a standard HTML element in the node tree.
using AngleSharp.Dom.Collections;
using AngleSharp.Dom.Css;
using AngleSharp.Dom.Events;
using AngleSharp.Extensions;
using AngleSharp.Html;
using AngleSharp.Network;
using AngleSharp.Services;
using AngleSharp.Services.Scripting;
using System.Threading;
namespace AngleSharp.Dom.Html
{
internal class HtmlElement : Element, IHtmlElement, IElement, INode, IEventTarget, IMarkupFormattable, IParentNode, IChildNode, INonDocumentTypeChildNode, IElementCssInlineStyle, IGlobalEventHandlers
{
private StringMap _dataset;
private IHtmlMenuElement ;
private SettableTokenList _dropZone;
public bool IsHidden {
get {
return this.HasOwnAttribute(AttributeNames.Hidden);
}
set {
this.SetOwnAttribute(AttributeNames.Hidden, value ? string.Empty : null, false);
}
}
public IHtmlMenuElement ContextMenu {
get {
if (_menu == null) {
string ownAttribute = this.GetOwnAttribute(AttributeNames.ContextMenu);
if (!string.IsNullOrEmpty(ownAttribute))
return base.Owner.GetElementById(ownAttribute) as IHtmlMenuElement;
}
return _menu;
}
set {
_menu = value;
}
}
public ISettableTokenList DropZone {
get {
if (_dropZone == null) {
_dropZone = new SettableTokenList(this.GetOwnAttribute(AttributeNames.DropZone));
_dropZone.Changed += delegate(string value) {
UpdateAttribute(AttributeNames.DropZone, value);
};
}
return _dropZone;
}
}
public bool IsDraggable {
get {
return this.GetOwnAttribute(AttributeNames.Draggable).ToBoolean(false);
}
set {
this.SetOwnAttribute(AttributeNames.Draggable, value.ToString(), false);
}
}
public string AccessKey {
get {
return this.GetOwnAttribute(AttributeNames.AccessKey) ?? string.Empty;
}
set {
this.SetOwnAttribute(AttributeNames.AccessKey, value, false);
}
}
public string AccessKeyLabel => AccessKey;
public string Language {
get {
return this.GetOwnAttribute(AttributeNames.Lang) ?? GetDefaultLanguage();
}
set {
this.SetOwnAttribute(AttributeNames.Lang, value, false);
}
}
public string Title {
get {
return this.GetOwnAttribute(AttributeNames.Title);
}
set {
this.SetOwnAttribute(AttributeNames.Title, value, false);
}
}
public string Direction {
get {
return this.GetOwnAttribute(AttributeNames.Dir);
}
set {
this.SetOwnAttribute(AttributeNames.Dir, value, false);
}
}
public bool IsSpellChecked {
get {
return this.GetOwnAttribute(AttributeNames.Spellcheck).ToBoolean(false);
}
set {
this.SetOwnAttribute(AttributeNames.Spellcheck, value.ToString(), false);
}
}
public int TabIndex {
get {
return this.GetOwnAttribute(AttributeNames.TabIndex).ToInteger(0);
}
set {
this.SetOwnAttribute(AttributeNames.TabIndex, value.ToString(), false);
}
}
public IStringMap Dataset => _dataset ?? (_dataset = new StringMap("data-", this));
public string ContentEditable {
get {
return this.GetOwnAttribute(AttributeNames.ContentEditable);
}
set {
this.SetOwnAttribute(AttributeNames.ContentEditable, value, false);
}
}
public bool IsContentEditable {
get {
ContentEditableMode contentEditableMode = ContentEditable.ToEnum(ContentEditableMode.Inherited);
if (contentEditableMode != ContentEditableMode.True) {
IHtmlElement htmlElement = base.ParentElement as IHtmlElement;
if (contentEditableMode == ContentEditableMode.Inherited && htmlElement != null)
return htmlElement.IsContentEditable;
return false;
}
return true;
}
}
public bool IsTranslated {
get {
return this.GetOwnAttribute(AttributeNames.Translate).ToEnum(SimpleChoice.Yes) == SimpleChoice.Yes;
}
set {
this.SetOwnAttribute(AttributeNames.Translate, value ? Keywords.Yes : Keywords.No, false);
}
}
public event DomEventHandler Aborted {
add {
AddEventListener(EventNames.Abort, value, false);
}
remove {
RemoveEventListener(EventNames.Abort, value, false);
}
}
public event DomEventHandler Blurred {
add {
AddEventListener(EventNames.Blur, value, false);
}
remove {
RemoveEventListener(EventNames.Blur, value, false);
}
}
public event DomEventHandler Cancelled {
add {
AddEventListener(EventNames.Cancel, value, false);
}
remove {
RemoveEventListener(EventNames.Cancel, value, false);
}
}
public event DomEventHandler CanPlay {
add {
AddEventListener(EventNames.CanPlay, value, false);
}
remove {
RemoveEventListener(EventNames.CanPlay, value, false);
}
}
public event DomEventHandler CanPlayThrough {
add {
AddEventListener(EventNames.CanPlayThrough, value, false);
}
remove {
RemoveEventListener(EventNames.CanPlayThrough, value, false);
}
}
public event DomEventHandler Changed {
add {
AddEventListener(EventNames.Change, value, false);
}
remove {
RemoveEventListener(EventNames.Change, value, false);
}
}
public event DomEventHandler Clicked {
add {
AddEventListener(EventNames.Click, value, false);
}
remove {
RemoveEventListener(EventNames.Click, value, false);
}
}
public event DomEventHandler CueChanged {
add {
AddEventListener(EventNames.CueChange, value, false);
}
remove {
RemoveEventListener(EventNames.CueChange, value, false);
}
}
public event DomEventHandler DoubleClick {
add {
AddEventListener(EventNames.DblClick, value, false);
}
remove {
RemoveEventListener(EventNames.DblClick, value, false);
}
}
public event DomEventHandler Drag {
add {
AddEventListener(EventNames.Drag, value, false);
}
remove {
RemoveEventListener(EventNames.Drag, value, false);
}
}
public event DomEventHandler DragEnd {
add {
AddEventListener(EventNames.DragEnd, value, false);
}
remove {
RemoveEventListener(EventNames.DragEnd, value, false);
}
}
public event DomEventHandler DragEnter {
add {
AddEventListener(EventNames.DragEnter, value, false);
}
remove {
RemoveEventListener(EventNames.DragEnter, value, false);
}
}
public event DomEventHandler DragExit {
add {
AddEventListener(EventNames.DragExit, value, false);
}
remove {
RemoveEventListener(EventNames.DragExit, value, false);
}
}
public event DomEventHandler DragLeave {
add {
AddEventListener(EventNames.DragLeave, value, false);
}
remove {
RemoveEventListener(EventNames.DragLeave, value, false);
}
}
public event DomEventHandler DragOver {
add {
AddEventListener(EventNames.DragOver, value, false);
}
remove {
RemoveEventListener(EventNames.DragOver, value, false);
}
}
public event DomEventHandler DragStart {
add {
AddEventListener(EventNames.DragStart, value, false);
}
remove {
RemoveEventListener(EventNames.DragStart, value, false);
}
}
public event DomEventHandler Dropped {
add {
AddEventListener(EventNames.Drop, value, false);
}
remove {
RemoveEventListener(EventNames.Drop, value, false);
}
}
public event DomEventHandler DurationChanged {
add {
AddEventListener(EventNames.DurationChange, value, false);
}
remove {
RemoveEventListener(EventNames.DurationChange, value, false);
}
}
public event DomEventHandler Emptied {
add {
AddEventListener(EventNames.Emptied, value, false);
}
remove {
RemoveEventListener(EventNames.Emptied, value, false);
}
}
public event DomEventHandler Ended {
add {
AddEventListener(EventNames.Ended, value, false);
}
remove {
RemoveEventListener(EventNames.Ended, value, false);
}
}
public event DomEventHandler Error {
add {
AddEventListener(EventNames.Error, value, false);
}
remove {
RemoveEventListener(EventNames.Error, value, false);
}
}
public event DomEventHandler Focused {
add {
AddEventListener(EventNames.Focus, value, false);
}
remove {
RemoveEventListener(EventNames.Focus, value, false);
}
}
public event DomEventHandler Input {
add {
AddEventListener(EventNames.Input, value, false);
}
remove {
RemoveEventListener(EventNames.Input, value, false);
}
}
public event DomEventHandler Invalid {
add {
AddEventListener(EventNames.Invalid, value, false);
}
remove {
RemoveEventListener(EventNames.Invalid, value, false);
}
}
public event DomEventHandler KeyDown {
add {
AddEventListener(EventNames.Keydown, value, false);
}
remove {
RemoveEventListener(EventNames.Keydown, value, false);
}
}
public event DomEventHandler KeyPress {
add {
AddEventListener(EventNames.Keypress, value, false);
}
remove {
RemoveEventListener(EventNames.Keypress, value, false);
}
}
public event DomEventHandler KeyUp {
add {
AddEventListener(EventNames.Keyup, value, false);
}
remove {
RemoveEventListener(EventNames.Keyup, value, false);
}
}
public event DomEventHandler Loaded {
add {
AddEventListener(EventNames.Load, value, false);
}
remove {
RemoveEventListener(EventNames.Load, value, false);
}
}
public event DomEventHandler LoadedData {
add {
AddEventListener(EventNames.LoadedData, value, false);
}
remove {
RemoveEventListener(EventNames.LoadedData, value, false);
}
}
public event DomEventHandler LoadedMetadata {
add {
AddEventListener(EventNames.LoadedMetaData, value, false);
}
remove {
RemoveEventListener(EventNames.LoadedMetaData, value, false);
}
}
public event DomEventHandler Loading {
add {
AddEventListener(EventNames.LoadStart, value, false);
}
remove {
RemoveEventListener(EventNames.LoadStart, value, false);
}
}
public event DomEventHandler MouseDown {
add {
AddEventListener(EventNames.Mousedown, value, false);
}
remove {
RemoveEventListener(EventNames.Mousedown, value, false);
}
}
public event DomEventHandler MouseEnter {
add {
AddEventListener(EventNames.Mouseenter, value, false);
}
remove {
RemoveEventListener(EventNames.Mouseenter, value, false);
}
}
public event DomEventHandler MouseLeave {
add {
AddEventListener(EventNames.Mouseleave, value, false);
}
remove {
RemoveEventListener(EventNames.Mouseleave, value, false);
}
}
public event DomEventHandler MouseMove {
add {
AddEventListener(EventNames.Mousemove, value, false);
}
remove {
RemoveEventListener(EventNames.Mousemove, value, false);
}
}
public event DomEventHandler MouseOut {
add {
AddEventListener(EventNames.Mouseout, value, false);
}
remove {
RemoveEventListener(EventNames.Mouseout, value, false);
}
}
public event DomEventHandler MouseOver {
add {
AddEventListener(EventNames.Mouseover, value, false);
}
remove {
RemoveEventListener(EventNames.Mouseover, value, false);
}
}
public event DomEventHandler MouseUp {
add {
AddEventListener(EventNames.Mouseup, value, false);
}
remove {
RemoveEventListener(EventNames.Mouseup, value, false);
}
}
public event DomEventHandler MouseWheel {
add {
AddEventListener(EventNames.Wheel, value, false);
}
remove {
RemoveEventListener(EventNames.Wheel, value, false);
}
}
public event DomEventHandler Paused {
add {
AddEventListener(EventNames.Pause, value, false);
}
remove {
RemoveEventListener(EventNames.Pause, value, false);
}
}
public event DomEventHandler Played {
add {
AddEventListener(EventNames.Play, value, false);
}
remove {
RemoveEventListener(EventNames.Play, value, false);
}
}
public event DomEventHandler Playing {
add {
AddEventListener(EventNames.Playing, value, false);
}
remove {
RemoveEventListener(EventNames.Playing, value, false);
}
}
public event DomEventHandler Progress {
add {
AddEventListener(EventNames.Progress, value, false);
}
remove {
RemoveEventListener(EventNames.Progress, value, false);
}
}
public event DomEventHandler RateChanged {
add {
AddEventListener(EventNames.RateChange, value, false);
}
remove {
RemoveEventListener(EventNames.RateChange, value, false);
}
}
public event DomEventHandler Resetted {
add {
AddEventListener(EventNames.Reset, value, false);
}
remove {
RemoveEventListener(EventNames.Reset, value, false);
}
}
public event DomEventHandler Resized {
add {
AddEventListener(EventNames.Resize, value, false);
}
remove {
RemoveEventListener(EventNames.Resize, value, false);
}
}
public event DomEventHandler Scrolled {
add {
AddEventListener(EventNames.Scroll, value, false);
}
remove {
RemoveEventListener(EventNames.Scroll, value, false);
}
}
public event DomEventHandler Seeked {
add {
AddEventListener(EventNames.Seeked, value, false);
}
remove {
RemoveEventListener(EventNames.Seeked, value, false);
}
}
public event DomEventHandler Seeking {
add {
AddEventListener(EventNames.Seeking, value, false);
}
remove {
RemoveEventListener(EventNames.Seeking, value, false);
}
}
public event DomEventHandler Selected {
add {
AddEventListener(EventNames.Select, value, false);
}
remove {
RemoveEventListener(EventNames.Select, value, false);
}
}
public event DomEventHandler Shown {
add {
AddEventListener(EventNames.Show, value, false);
}
remove {
RemoveEventListener(EventNames.Show, value, false);
}
}
public event DomEventHandler Stalled {
add {
AddEventListener(EventNames.Stalled, value, false);
}
remove {
RemoveEventListener(EventNames.Stalled, value, false);
}
}
public event DomEventHandler Submitted {
add {
AddEventListener(EventNames.Submit, value, false);
}
remove {
RemoveEventListener(EventNames.Submit, value, false);
}
}
public event DomEventHandler Suspended {
add {
AddEventListener(EventNames.Suspend, value, false);
}
remove {
RemoveEventListener(EventNames.Suspend, value, false);
}
}
public event DomEventHandler TimeUpdated {
add {
AddEventListener(EventNames.TimeUpdate, value, false);
}
remove {
RemoveEventListener(EventNames.TimeUpdate, value, false);
}
}
public event DomEventHandler Toggled {
add {
AddEventListener(EventNames.Toggle, value, false);
}
remove {
RemoveEventListener(EventNames.Toggle, value, false);
}
}
public event DomEventHandler VolumeChanged {
add {
AddEventListener(EventNames.VolumeChange, value, false);
}
remove {
RemoveEventListener(EventNames.VolumeChange, value, false);
}
}
public event DomEventHandler Waiting {
add {
AddEventListener(EventNames.Waiting, value, false);
}
remove {
RemoveEventListener(EventNames.Waiting, value, false);
}
}
static HtmlElement()
{
Element.RegisterCallback(AttributeNames.Style, delegate(HtmlElement element, string value) {
element.UpdateStyle(value);
});
Element.RegisterCallback(AttributeNames.DropZone, delegate(HtmlElement element, string value) {
element._dropZone?.Update(value);
});
RegisterEventCallback<HtmlElement>(EventNames.Load);
RegisterEventCallback<HtmlElement>(EventNames.Abort);
RegisterEventCallback<HtmlElement>(EventNames.Blur);
RegisterEventCallback<HtmlElement>(EventNames.Cancel);
RegisterEventCallback<HtmlElement>(EventNames.CanPlay);
RegisterEventCallback<HtmlElement>(EventNames.CanPlayThrough);
RegisterEventCallback<HtmlElement>(EventNames.Change);
RegisterEventCallback<HtmlElement>(EventNames.Click);
RegisterEventCallback<HtmlElement>(EventNames.CueChange);
RegisterEventCallback<HtmlElement>(EventNames.DblClick);
RegisterEventCallback<HtmlElement>(EventNames.Drag);
RegisterEventCallback<HtmlElement>(EventNames.DragEnd);
RegisterEventCallback<HtmlElement>(EventNames.DragEnter);
RegisterEventCallback<HtmlElement>(EventNames.DragExit);
RegisterEventCallback<HtmlElement>(EventNames.DragLeave);
RegisterEventCallback<HtmlElement>(EventNames.DragOver);
RegisterEventCallback<HtmlElement>(EventNames.DragStart);
RegisterEventCallback<HtmlElement>(EventNames.Drop);
RegisterEventCallback<HtmlElement>(EventNames.DurationChange);
RegisterEventCallback<HtmlElement>(EventNames.Emptied);
RegisterEventCallback<HtmlElement>(EventNames.Ended);
RegisterEventCallback<HtmlElement>(EventNames.Error);
RegisterEventCallback<HtmlElement>(EventNames.Focus);
RegisterEventCallback<HtmlElement>(EventNames.Input);
RegisterEventCallback<HtmlElement>(EventNames.Invalid);
RegisterEventCallback<HtmlElement>(EventNames.Keydown);
RegisterEventCallback<HtmlElement>(EventNames.Keypress);
RegisterEventCallback<HtmlElement>(EventNames.Keyup);
RegisterEventCallback<HtmlElement>(EventNames.LoadedData);
RegisterEventCallback<HtmlElement>(EventNames.LoadedMetaData);
RegisterEventCallback<HtmlElement>(EventNames.LoadStart);
RegisterEventCallback<HtmlElement>(EventNames.Mousedown);
RegisterEventCallback<HtmlElement>(EventNames.Mouseup);
RegisterEventCallback<HtmlElement>(EventNames.Mouseenter);
RegisterEventCallback<HtmlElement>(EventNames.Mouseleave);
RegisterEventCallback<HtmlElement>(EventNames.Mouseover);
RegisterEventCallback<HtmlElement>(EventNames.Mousemove);
RegisterEventCallback<HtmlElement>(EventNames.Wheel);
RegisterEventCallback<HtmlElement>(EventNames.Pause);
RegisterEventCallback<HtmlElement>(EventNames.Play);
RegisterEventCallback<HtmlElement>(EventNames.Playing);
RegisterEventCallback<HtmlElement>(EventNames.Progress);
RegisterEventCallback<HtmlElement>(EventNames.RateChange);
RegisterEventCallback<HtmlElement>(EventNames.Reset);
RegisterEventCallback<HtmlElement>(EventNames.Resize);
RegisterEventCallback<HtmlElement>(EventNames.Scroll);
RegisterEventCallback<HtmlElement>(EventNames.Seeked);
RegisterEventCallback<HtmlElement>(EventNames.Seeking);
RegisterEventCallback<HtmlElement>(EventNames.Select);
RegisterEventCallback<HtmlElement>(EventNames.Show);
RegisterEventCallback<HtmlElement>(EventNames.Stalled);
RegisterEventCallback<HtmlElement>(EventNames.Submit);
RegisterEventCallback<HtmlElement>(EventNames.Suspend);
RegisterEventCallback<HtmlElement>(EventNames.TimeUpdate);
RegisterEventCallback<HtmlElement>(EventNames.Toggle);
RegisterEventCallback<HtmlElement>(EventNames.VolumeChange);
RegisterEventCallback<HtmlElement>(EventNames.Waiting);
}
public HtmlElement(Document owner, string localName, string prefix = null, NodeFlags flags = NodeFlags.None)
: base(owner, Combine(prefix, localName), localName, prefix, NamespaceNames.HtmlUri, flags | NodeFlags.HtmlMember)
{
}
public void DoSpellCheck()
{
base.Owner.Options.GetSpellCheck(Language);
}
public virtual void DoClick()
{
IsClickedCancelled();
}
public virtual void DoFocus()
{
}
public virtual void DoBlur()
{
}
public override INode Clone(bool deep = true)
{
HtmlElement htmlElement = base.Owner.Options.GetFactory<IHtmlElementFactory>().Create(base.Owner, base.LocalName, base.Prefix);
CloneElement(htmlElement, deep);
return htmlElement;
}
internal override void SetupElement()
{
base.SetupElement();
string ownAttribute = this.GetOwnAttribute(AttributeNames.Style);
if (ownAttribute != null)
UpdateStyle(ownAttribute);
}
protected bool IsClickedCancelled()
{
return this.Fire(delegate(MouseEvent m) {
m.Init(EventNames.Click, true, true, base.Owner.DefaultView, 0, 0, 0, 0, 0, false, false, false, false, MouseButton.Primary, this);
}, null);
}
protected IHtmlFormElement GetAssignedForm()
{
INode node = base.Parent;
while (node != null && !(node is IHtmlFormElement)) {
node = node.ParentElement;
}
if (node == null) {
string ownAttribute = this.GetOwnAttribute(AttributeNames.Form);
Document owner = base.Owner;
if (owner == null || node != null || string.IsNullOrEmpty(ownAttribute))
return null;
node = owner.GetElementById(ownAttribute);
}
return node as IHtmlFormElement;
}
protected static void RegisterEventCallback<TElement>(string eventName) where TElement : Element
{
string name = "on" + eventName;
Element.RegisterCallback(name, delegate(TElement element, string value) {
Document owner = element.Owner;
IScriptEngine scriptEngine = owner.Options.GetScriptEngine(MimeTypeNames.DefaultJavaScript);
if (scriptEngine != null) {
string function = "undefined";
if (!string.IsNullOrEmpty(value))
function = "function () { " + value + " }";
IResponse response = VirtualResponse.Create(delegate(VirtualResponse res) {
res.Content(string.Format("element.{0} = {1};", new object[2] {
name,
function
}));
});
ScriptOptions options = new ScriptOptions(owner);
scriptEngine.EvaluateScriptAsync(response, options, CancellationToken.None);
}
});
}
private string GetDefaultLanguage()
{
IHtmlElement htmlElement = base.ParentElement as IHtmlElement;
if (htmlElement == null)
return base.Owner.Options.GetLanguage();
return htmlElement.Language;
}
private static string Combine(string prefix, string localName)
{
return ((prefix != null) ? (prefix + ":" + localName) : localName).ToUpperInvariant();
}
}
}