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);
}
}
}