HtmlStyleElement
sealed class HtmlStyleElement : HtmlElement, IHtmlStyleElement, IHtmlElement, IElement, INode, IEventTarget, IMarkupFormattable, IParentNode, IChildNode, INonDocumentTypeChildNode, IElementCssInlineStyle, ILinkStyle
Represents the HTML style element.
using AngleSharp.Dom.Css;
using AngleSharp.Extensions;
using AngleSharp.Html;
using AngleSharp.Network;
using AngleSharp.Services.Styling;
using System.Threading;
using System.Threading.Tasks;
namespace AngleSharp.Dom.Html
{
internal sealed class HtmlStyleElement : HtmlElement, IHtmlStyleElement, IHtmlElement, IElement, INode, IEventTarget, IMarkupFormattable, IParentNode, IChildNode, INonDocumentTypeChildNode, IElementCssInlineStyle, ILinkStyle
{
private IStyleSheet _sheet;
public bool IsScoped {
get {
return this.HasOwnAttribute(AttributeNames.Scoped);
}
set {
this.SetOwnAttribute(AttributeNames.Scoped, value ? string.Empty : null);
}
}
public IStyleSheet Sheet => _sheet;
public bool IsDisabled {
get {
return this.GetOwnAttribute(AttributeNames.Disabled).ToBoolean(false);
}
set {
this.SetOwnAttribute(AttributeNames.Disabled, value ? string.Empty : null);
if (_sheet != null)
_sheet.IsDisabled = value;
}
}
public string Media {
get {
return this.GetOwnAttribute(AttributeNames.Media);
}
set {
this.SetOwnAttribute(AttributeNames.Media, value);
}
}
public string Type {
get {
return this.GetOwnAttribute(AttributeNames.Type);
}
set {
this.SetOwnAttribute(AttributeNames.Type, value);
}
}
public HtmlStyleElement(Document owner, string prefix = null)
: base(owner, TagNames.Style, prefix, NodeFlags.Special | NodeFlags.LiteralText)
{
}
internal override void SetupElement()
{
base.SetupElement();
this.GetOwnAttribute(AttributeNames.Media);
RegisterAttributeObserver(AttributeNames.Media, UpdateMedia);
UpdateSheet();
}
internal override void NodeIsInserted(Node newNode)
{
base.NodeIsInserted(newNode);
UpdateSheet();
}
internal override void NodeIsRemoved(Node removedNode, Node oldPreviousSibling)
{
base.NodeIsRemoved(removedNode, oldPreviousSibling);
UpdateSheet();
}
private void UpdateMedia(string value)
{
if (_sheet != null)
_sheet.Media.MediaText = value;
}
private void UpdateSheet()
{
Document owner = base.Owner;
if (owner != null) {
IConfiguration options = owner.Options;
string type = Type ?? MimeTypeNames.Css;
IStyleEngine styleEngine = options.GetStyleEngine(type);
if (styleEngine != null) {
Task task = CreateSheetAsync(styleEngine, options);
owner.DelayLoad(task);
}
}
}
private async Task CreateSheetAsync(IStyleEngine engine, IConfiguration config)
{
CancellationToken cancel = CancellationToken.None;
IResponse response = VirtualResponse.Create(delegate(VirtualResponse res) {
res.Content(TextContent).Address((Url)null);
});
StyleOptions options = new StyleOptions {
Element = this,
IsDisabled = IsDisabled,
IsAlternate = false,
Configuration = config
};
Task<IStyleSheet> task = engine.ParseStylesheetAsync(response, options, cancel);
_sheet = await task.ConfigureAwait(false);
}
}
}