AngleSharp by AngleSharp

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

 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 IBrowsingContext _context; private IStyleEngine _engine; private IStyleSheet _sheet; public IStyleSheet Sheet => _sheet; private StyleSheetRequestProcessor(HtmlLinkElement link, IBrowsingContext context, IResourceLoader loader) : base(loader) { _link = link; _context = context; } internal static StyleSheetRequestProcessor Create(HtmlLinkElement element) { Document owner = element.Owner; IBrowsingContext context = owner.Context; IResourceLoader loader = owner.Loader; if (context == null || loader == null) return null; return new StyleSheetRequestProcessor(element, context, loader); } public override Task ProcessAsync(ResourceRequest request) { string type = _link.Type ?? MimeTypeNames.Css; IStyleEngine styleEngine = _context.Configuration.GetStyleEngine(type); if (styleEngine != null) { _engine = styleEngine; return base.ProcessAsync(request); } return null; } protected override async Task ProcessResponseAsync(IResponse response) { CancellationToken cancel = CancellationToken.None; StyleOptions options = new StyleOptions(_context) { Element = _link, IsDisabled = _link.IsDisabled, IsAlternate = _link.RelationList.Contains(Keywords.Alternate) }; Task<IStyleSheet> task = _engine.ParseStylesheetAsync(response, options, cancel); _sheet = await task.ConfigureAwait(false); _sheet.Media.MediaText = (_link.Media ?? string.Empty); } } }