AngleSharp by AngleSharp

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

 FrameRequestProcessor

using AngleSharp.Dom; using AngleSharp.Dom.Html; using System.Threading; using System.Threading.Tasks; namespace AngleSharp.Network.RequestProcessors { internal class FrameRequestProcessor : BaseRequestProcessor { private readonly HtmlFrameElementBase _element; private IDocument _document; public IDocument Document => _document; private FrameRequestProcessor(HtmlFrameElementBase element, IResourceLoader loader) : base(loader) { _element = element; } internal static FrameRequestProcessor Create(HtmlFrameElementBase element) { Document owner = element.Owner; IResourceLoader loader = owner.Loader; if (loader == null) return null; return new FrameRequestProcessor(element, loader); } public override Task ProcessAsync(ResourceRequest request) { string contentHtml = _element.GetContentHtml(); if (contentHtml != null) { string documentUri = _element.Owner.DocumentUri; return ProcessResponse(contentHtml, documentUri); } return base.ProcessAsync(request); } protected override Task ProcessResponseAsync(IResponse response) { CancellationToken none = CancellationToken.None; IBrowsingContext nestedContext = _element.NestedContext; Task<IDocument> task = nestedContext.OpenAsync(response, none); return WaitResponse(task); } private Task ProcessResponse(string response, string referer) { CancellationToken none = CancellationToken.None; IBrowsingContext nestedContext = _element.NestedContext; Task<IDocument> task = nestedContext.OpenAsync(delegate(VirtualResponse m) { m.Content(response).Address(referer); }, none); return WaitResponse(task); } private async Task WaitResponse(Task<IDocument> task) { _document = await task.ConfigureAwait(false); } } }