AngleSharp by AngleSharp

<PackageReference Include="AngleSharp" Version="0.9.5" />

 StyleSheetRequestProcessor

using AngleSharp.Dom; using AngleSharp.Dom.Html; using AngleSharp.Extensions; using AngleSharp.Services.Styling; using System.Threading; using System.Threading.Tasks; namespace AngleSharp.Network.RequestProcessors { internal class StyleSheetRequestProcessor : BaseRequestProcessor { private readonly HtmlLinkElement _link; private readonly IConfiguration _options; private IStyleEngine _engine; private IStyleSheet _sheet; public IStyleSheet Sheet => _sheet; private StyleSheetRequestProcessor(HtmlLinkElement link, IConfiguration options, IResourceLoader loader) : base(loader) { _link = link; _options = options; } internal static StyleSheetRequestProcessor Create(HtmlLinkElement element) { Document owner = element.Owner; IConfiguration options = owner.Options; IResourceLoader loader = owner.Loader; if (options == null || loader == null) return null; return new StyleSheetRequestProcessor(element, options, loader); } public override Task Process(ResourceRequest request) { string type = _link.Type ?? MimeTypeNames.Css; IStyleEngine styleEngine = _options.GetStyleEngine(type); if (styleEngine != null) { _engine = styleEngine; return base.Process(request); } return null; } protected override async Task ProcessResponse(IResponse response) { CancellationToken cancel = CancellationToken.None; StyleOptions options = new StyleOptions { Element = _link, IsDisabled = _link.IsDisabled, IsAlternate = _link.RelationList.Contains(Keywords.Alternate), Configuration = _options }; Task<IStyleSheet> task = _engine.ParseStylesheetAsync(response, options, cancel); _sheet = await task.ConfigureAwait(false); _sheet.Media.MediaText = (_link.Media ?? string.Empty); } } }