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