HtmlImageElement
sealed class HtmlImageElement : HtmlElement, IHtmlImageElement, IHtmlElement, IElement, INode, IEventTarget, IParentNode, IChildNode, INonDocumentTypeChildNode, IElementCssInlineStyle, IDisposable
Represents the image element.
using AngleSharp.Dom.Css;
using AngleSharp.Extensions;
using AngleSharp.Html;
using AngleSharp.Services.Media;
using System;
using System.Threading;
using System.Threading.Tasks;
namespace AngleSharp.Dom.Html
{
internal sealed class HtmlImageElement : HtmlElement, IHtmlImageElement, IHtmlElement, IElement, INode, IEventTarget, IParentNode, IChildNode, INonDocumentTypeChildNode, IElementCssInlineStyle, IDisposable
{
private CancellationTokenSource _cts;
private Task<IImageInfo> _imageTask;
public string ActualSource => Source;
public string SourceSet {
get {
return GetAttribute(AttributeNames.SrcSet);
}
set {
SetAttribute(AttributeNames.SrcSet, value);
}
}
public string Sizes {
get {
return GetAttribute(AttributeNames.Sizes);
}
set {
SetAttribute(AttributeNames.Sizes, value);
}
}
public string Source {
get {
return GetAttribute(AttributeNames.Src);
}
set {
SetAttribute(AttributeNames.Src, value);
}
}
public string AlternativeText {
get {
return GetAttribute(AttributeNames.Alt);
}
set {
SetAttribute(AttributeNames.Alt, value);
}
}
public string CrossOrigin {
get {
return GetAttribute(AttributeNames.CrossOrigin);
}
set {
SetAttribute(AttributeNames.CrossOrigin, value);
}
}
public string UseMap {
get {
return GetAttribute(AttributeNames.UseMap);
}
set {
SetAttribute(AttributeNames.UseMap, value);
}
}
public int DisplayWidth {
get {
return GetAttribute(AttributeNames.Width).ToInteger(OriginalWidth);
}
set {
SetAttribute(AttributeNames.Width, value.ToString());
}
}
public int DisplayHeight {
get {
return GetAttribute(AttributeNames.Height).ToInteger(OriginalHeight);
}
set {
SetAttribute(AttributeNames.Height, value.ToString());
}
}
public int OriginalWidth {
get {
if (_imageTask == null)
return 0;
if (!_imageTask.IsCompleted || _imageTask.Result == null)
return 0;
return _imageTask.Result.Width;
}
}
public int OriginalHeight {
get {
if (_imageTask == null)
return 0;
if (!_imageTask.IsCompleted || _imageTask.Result == null)
return 0;
return _imageTask.Result.Height;
}
}
public bool IsCompleted {
get {
if (_imageTask != null)
return _imageTask.IsCompleted;
return true;
}
}
public bool IsMap {
get {
return GetAttribute(AttributeNames.IsMap) != null;
}
set {
SetAttribute(AttributeNames.IsMap, value ? string.Empty : null);
}
}
public HtmlImageElement(Document owner)
: base(owner, Tags.Img, NodeFlags.SelfClosing | NodeFlags.Special)
{
RegisterAttributeObserver(AttributeNames.Src, UpdateSource);
}
public void Dispose()
{
if (_cts != null)
_cts.Cancel();
_cts = null;
_imageTask = null;
}
private void UpdateSource(string value)
{
if (_cts != null)
_cts.Cancel();
if (!string.IsNullOrEmpty(value)) {
Url image = this.HyperReference(value);
_cts = new CancellationTokenSource();
_imageTask = LoadAsync(image, _cts.Token);
}
}
private async Task<IImageInfo> LoadAsync(Url image, CancellationToken cancel)
{
IImageInfo result = await Owner.Options.LoadResource<IImageInfo>(image, cancel).ConfigureAwait(false);
this.FireSimpleEvent(EventNames.Load, false, false);
return result;
}
}
}