AngleSharp by Florian Rappl

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

.NET API 1,171,968 bytes

 Document

Represents a document node.
using AngleSharp.Dom.Collections; using AngleSharp.Dom.Events; using AngleSharp.Dom.Html; using AngleSharp.Dom.Svg; using AngleSharp.Extensions; using AngleSharp.Html; using AngleSharp.Network; using AngleSharp.Parser.Html; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace AngleSharp.Dom { [DebuggerStepThrough] internal class Document : Node, IDocument, INode, IEventTarget, IParentNode, IGlobalEventHandlers, IDocumentStyle, INonElementParentNode, IDisposable { private static readonly string AboutBlank = "about:blank"; private readonly StyleSheetList _styleSheets; private readonly Queue<HtmlScriptElement> _scripts; private readonly List<WeakReference> _ranges; private readonly MutationHost _mutations; private readonly IBrowsingContext _context; private readonly IWindow _view; private QuirksMode _quirksMode; private Sandboxes _sandbox; private bool _designMode; private bool _shown; private bool _salvageable; private bool _firedUnload; private DocumentReadyState _ready; private TextSource _source; private string _referrer; private string _contentType; private string _lastStyleSheetSet; private string _preferredStyleSheetSet; private Location _location; private IElement _focus; public string DesignMode { get { if (!_designMode) return Keywords.Off; return Keywords.On; } set { _designMode = value.Equals(Keywords.On, StringComparison.OrdinalIgnoreCase); } } public IHtmlAllCollection All => new HtmlAllCollection(this); public IHtmlCollection Anchors => new HtmlCollection<IHtmlAnchorElement>(this, true, (IHtmlAnchorElement element) => element.Attributes.Any((IAttr m) => m.Name == AttributeNames.Name)); public int ChildElementCount => base.ChildNodes.OfType<Element>().Count(); public IHtmlCollection Children => new HtmlElementCollection(base.ChildNodes.OfType<Element>()); public IElement FirstElementChild { get { NodeList childNodes = base.ChildNodes; int length = childNodes.Length; for (int i = 0; i < length; i++) { IElement element = childNodes[i] as IElement; if (element != null) return element; } return null; } } public IElement LastElementChild { get { NodeList childNodes = base.ChildNodes; for (int num = childNodes.Length - 1; num >= 0; num--) { IElement element = childNodes[num] as IElement; if (element != null) return element; } return null; } } public bool IsAsync { get; set; } public IHtmlScriptElement CurrentScript { get { if (_scripts.Count <= 0) return null; return _scripts.Peek(); } } public IImplementation Implementation => new DomImplementation(this); public string LastModified { get; set; } public IDocumentType Doctype => this.FindChild<DocumentType>(); public string ContentType { get { return _contentType; } internal set { _contentType = value; } } public DocumentReadyState ReadyState { get { return _ready; } internal set { _ready = value; this.FireSimpleEvent(EventNames.ReadyStateChanged, false, false); } } public IStyleSheetList StyleSheets => _styleSheets; public IStringList StyleSheetSets => new StringList(from m in _styleSheets select m.Title); public string Referrer { get { return _referrer; } protected internal set { _referrer = value; } } public ILocation Location { get { return _location; } set { LoadHtml(value.Href); } } public string DocumentUri { get { return _location.Href; } internal set { _location.Changed -= LocationChanged; _location.Href = value; _location.Changed += LocationChanged; } } public Url DocumentUrl => _location.Original; public IWindow DefaultView => _view; public string Direction { get { return ((DocumentElement as IHtmlElement) ?? new HtmlHtmlElement(this)).Direction; } set { ((DocumentElement as IHtmlElement) ?? new HtmlHtmlElement(this)).Direction = value; } } public string CharacterSet => _source.CurrentEncoding.WebName; public IElement DocumentElement => this.FindChild<HtmlHtmlElement>(); public IElement ActiveElement { get; set; } public string CompatMode => _quirksMode.GetCompatiblity(); public string Url => _location.Href; public IHtmlCollection Forms => new HtmlCollection<IHtmlFormElement>(this, true, null); public IHtmlCollection Images => new HtmlCollection<IHtmlImageElement>(this, true, null); public IHtmlCollection Scripts => new HtmlCollection<IHtmlScriptElement>(this, true, null); public IHtmlCollection Plugins => new HtmlCollection<IHtmlEmbedElement>(this, true, null); public IHtmlCollection Commands => new HtmlElementCollection(this, true, delegate(IElement element) { if (!(element is IHtmlMenuItemElement) && !(element is IHtmlButtonElement)) return element is IHtmlAnchorElement; return true; }); public IHtmlCollection Links => new HtmlElementCollection(this, true, delegate(IElement element) { if (element is IHtmlAnchorElement || element is IHtmlAreaElement) return element.Attributes.Any((IAttr m) => m.Name == AttributeNames.Href); return false; }); public string Title { get { object element2; if (!(DocumentElement is ISvgSvgElement)) { IElement element = DocumentElement.FindDescendant<IHtmlTitleElement>(); element2 = element; } else { IElement element = DocumentElement.FindChild<ISvgTitleElement>(); element2 = element; } IElement element3 = (IElement)element2; if (element3 != null) return element3.TextContent.CollapseAndStrip(); return string.Empty; } set { if (DocumentElement is ISvgSvgElement) { ISvgTitleElement svgTitleElement = DocumentElement.FindChild<ISvgTitleElement>(); if (svgTitleElement == null) { svgTitleElement = new SvgTitleElement(this); DocumentElement.AppendChild(svgTitleElement); } svgTitleElement.TextContent = value; } else if (DocumentElement is IHtmlElement) { IHtmlTitleElement htmlTitleElement = DocumentElement.FindDescendant<IHtmlTitleElement>(); if (htmlTitleElement == null) { IHtmlHeadElement head = Head; if (head == null) return; htmlTitleElement = new HtmlTitleElement(this); head.AppendChild(htmlTitleElement); } htmlTitleElement.TextContent = value; } } } public IHtmlHeadElement Head => DocumentElement.FindChild<IHtmlHeadElement>(); public IHtmlElement Body { get { IElement documentElement = DocumentElement; if (documentElement != null) { foreach (INode childNode in documentElement.ChildNodes) { HtmlBodyElement htmlBodyElement = childNode as HtmlBodyElement; if (htmlBodyElement != null) return htmlBodyElement; HtmlFrameSetElement htmlFrameSetElement = childNode as HtmlFrameSetElement; if (htmlFrameSetElement != null) return htmlFrameSetElement; } } return null; } set { if (!(value is IHtmlBodyElement) && !(value is HtmlFrameSetElement)) throw new DomException(ErrorCode.HierarchyRequest); IHtmlElement body = Body; if (body != value) { if (body == null) { IElement documentElement = DocumentElement; if (documentElement == null) throw new DomException(ErrorCode.HierarchyRequest); documentElement.AppendChild(value); } else ReplaceChild(value, body); } } } public string Cookie { get { return Options.GetCookie(_location.Origin); } set { Options.SetCookie(_location.Origin, value); } } public string Domain { get { if (!string.IsNullOrEmpty(DocumentUri)) return new Uri(DocumentUri).Host; return string.Empty; } set { if (_location != null) _location.Host = value; } } public string Origin => _location.Origin; public string SelectedStyleSheetSet { get { IEnumerable<string> enabledStyleSheetSets = _styleSheets.GetEnabledStyleSheetSets(); string enabledName = enabledStyleSheetSets.FirstOrDefault(); IEnumerable<IStyleSheet> source = _styleSheets.Where(delegate(IStyleSheet m) { if (!string.IsNullOrEmpty(m.Title)) return !m.IsDisabled; return false; }); if (enabledStyleSheetSets.Count() == 1 && !source.Any((IStyleSheet m) => m.Title != enabledName)) return enabledName; if (source.Any()) return null; return string.Empty; } set { if (value != null) { _styleSheets.EnableStyleSheetSet(value); _lastStyleSheetSet = value; } } } public string LastStyleSheetSet => _lastStyleSheetSet; public string PreferredStyleSheetSet => _preferredStyleSheetSet; internal IEnumerable<AngleSharp.Dom.Collections.Range> Ranges => (from m in _ranges where m.IsAlive select m.Target).OfType<AngleSharp.Dom.Collections.Range>(); internal MutationHost Mutations => _mutations; internal TextSource Source => _source; internal IConfiguration Options => _context.Configuration; internal IBrowsingContext Context => _context; internal QuirksMode QuirksMode { get { return _quirksMode; } set { _quirksMode = value; } } internal Sandboxes ActiveSandboxing { get { return _sandbox; } set { _sandbox = value; } } internal bool IsInBrowsingContext => _context.Active != null; internal bool IsToBePrinted => false; internal IElement FocusElement => _focus; public event DomEventHandler ReadyStateChanged { add { AddEventListener(EventNames.ReadyStateChanged, value, false); } remove { RemoveEventListener(EventNames.ReadyStateChanged, value, false); } } public event DomEventHandler Aborted { add { AddEventListener(EventNames.Abort, value, false); } remove { RemoveEventListener(EventNames.Abort, value, false); } } public event DomEventHandler Blurred { add { AddEventListener(EventNames.Blur, value, false); } remove { RemoveEventListener(EventNames.Blur, value, false); } } public event DomEventHandler Cancelled { add { AddEventListener(EventNames.Cancel, value, false); } remove { RemoveEventListener(EventNames.Cancel, value, false); } } public event DomEventHandler CanPlay { add { AddEventListener(EventNames.CanPlay, value, false); } remove { RemoveEventListener(EventNames.CanPlay, value, false); } } public event DomEventHandler CanPlayThrough { add { AddEventListener(EventNames.CanPlayThrough, value, false); } remove { RemoveEventListener(EventNames.CanPlayThrough, value, false); } } public event DomEventHandler Changed { add { AddEventListener(EventNames.Change, value, false); } remove { RemoveEventListener(EventNames.Change, value, false); } } public event DomEventHandler Clicked { add { AddEventListener(EventNames.Click, value, false); } remove { RemoveEventListener(EventNames.Click, value, false); } } public event DomEventHandler CueChanged { add { AddEventListener(EventNames.CueChange, value, false); } remove { RemoveEventListener(EventNames.CueChange, value, false); } } public event DomEventHandler DoubleClick { add { AddEventListener(EventNames.DblClick, value, false); } remove { RemoveEventListener(EventNames.DblClick, value, false); } } public event DomEventHandler Drag { add { AddEventListener(EventNames.Drag, value, false); } remove { RemoveEventListener(EventNames.Drag, value, false); } } public event DomEventHandler DragEnd { add { AddEventListener(EventNames.DragEnd, value, false); } remove { RemoveEventListener(EventNames.DragEnd, value, false); } } public event DomEventHandler DragEnter { add { AddEventListener(EventNames.DragEnter, value, false); } remove { RemoveEventListener(EventNames.DragEnter, value, false); } } public event DomEventHandler DragExit { add { AddEventListener(EventNames.DragExit, value, false); } remove { RemoveEventListener(EventNames.DragExit, value, false); } } public event DomEventHandler DragLeave { add { AddEventListener(EventNames.DragLeave, value, false); } remove { RemoveEventListener(EventNames.DragLeave, value, false); } } public event DomEventHandler DragOver { add { AddEventListener(EventNames.DragOver, value, false); } remove { RemoveEventListener(EventNames.DragOver, value, false); } } public event DomEventHandler DragStart { add { AddEventListener(EventNames.DragStart, value, false); } remove { RemoveEventListener(EventNames.DragStart, value, false); } } public event DomEventHandler Dropped { add { AddEventListener(EventNames.Drop, value, false); } remove { RemoveEventListener(EventNames.Drop, value, false); } } public event DomEventHandler DurationChanged { add { AddEventListener(EventNames.DurationChange, value, false); } remove { RemoveEventListener(EventNames.DurationChange, value, false); } } public event DomEventHandler Emptied { add { AddEventListener(EventNames.Emptied, value, false); } remove { RemoveEventListener(EventNames.Emptied, value, false); } } public event DomEventHandler Ended { add { AddEventListener(EventNames.Ended, value, false); } remove { RemoveEventListener(EventNames.Ended, value, false); } } public event DomEventHandler Error { add { AddEventListener(EventNames.Error, value, false); } remove { RemoveEventListener(EventNames.Error, value, false); } } public event DomEventHandler Focused { add { AddEventListener(EventNames.Focus, value, false); } remove { RemoveEventListener(EventNames.Focus, value, false); } } public event DomEventHandler Input { add { AddEventListener(EventNames.Input, value, false); } remove { RemoveEventListener(EventNames.Input, value, false); } } public event DomEventHandler Invalid { add { AddEventListener(EventNames.Invalid, value, false); } remove { RemoveEventListener(EventNames.Invalid, value, false); } } public event DomEventHandler KeyDown { add { AddEventListener(EventNames.Keydown, value, false); } remove { RemoveEventListener(EventNames.Keydown, value, false); } } public event DomEventHandler KeyPress { add { AddEventListener(EventNames.Keypress, value, false); } remove { RemoveEventListener(EventNames.Keypress, value, false); } } public event DomEventHandler KeyUp { add { AddEventListener(EventNames.Keyup, value, false); } remove { RemoveEventListener(EventNames.Keyup, value, false); } } public event DomEventHandler Loaded { add { AddEventListener(EventNames.Load, value, false); } remove { RemoveEventListener(EventNames.Load, value, false); } } public event DomEventHandler LoadedData { add { AddEventListener(EventNames.LoadedData, value, false); } remove { RemoveEventListener(EventNames.LoadedData, value, false); } } public event DomEventHandler LoadedMetadata { add { AddEventListener(EventNames.LoadedMetaData, value, false); } remove { RemoveEventListener(EventNames.LoadedMetaData, value, false); } } public event DomEventHandler Loading { add { AddEventListener(EventNames.LoadStart, value, false); } remove { RemoveEventListener(EventNames.LoadStart, value, false); } } public event DomEventHandler MouseDown { add { AddEventListener(EventNames.Mousedown, value, false); } remove { RemoveEventListener(EventNames.Mousedown, value, false); } } public event DomEventHandler MouseEnter { add { AddEventListener(EventNames.Mouseenter, value, false); } remove { RemoveEventListener(EventNames.Mouseenter, value, false); } } public event DomEventHandler MouseLeave { add { AddEventListener(EventNames.Mouseleave, value, false); } remove { RemoveEventListener(EventNames.Mouseleave, value, false); } } public event DomEventHandler MouseMove { add { AddEventListener(EventNames.Mousemove, value, false); } remove { RemoveEventListener(EventNames.Mousemove, value, false); } } public event DomEventHandler MouseOut { add { AddEventListener(EventNames.Mouseout, value, false); } remove { RemoveEventListener(EventNames.Mouseout, value, false); } } public event DomEventHandler MouseOver { add { AddEventListener(EventNames.Mouseover, value, false); } remove { RemoveEventListener(EventNames.Mouseover, value, false); } } public event DomEventHandler MouseUp { add { AddEventListener(EventNames.Mouseup, value, false); } remove { RemoveEventListener(EventNames.Mouseup, value, false); } } public event DomEventHandler MouseWheel { add { AddEventListener(EventNames.Wheel, value, false); } remove { RemoveEventListener(EventNames.Wheel, value, false); } } public event DomEventHandler Paused { add { AddEventListener(EventNames.Pause, value, false); } remove { RemoveEventListener(EventNames.Pause, value, false); } } public event DomEventHandler Played { add { AddEventListener(EventNames.Play, value, false); } remove { RemoveEventListener(EventNames.Play, value, false); } } public event DomEventHandler Playing { add { AddEventListener(EventNames.Playing, value, false); } remove { RemoveEventListener(EventNames.Playing, value, false); } } public event DomEventHandler Progress { add { AddEventListener(EventNames.Progress, value, false); } remove { RemoveEventListener(EventNames.Progress, value, false); } } public event DomEventHandler RateChanged { add { AddEventListener(EventNames.RateChange, value, false); } remove { RemoveEventListener(EventNames.RateChange, value, false); } } public event DomEventHandler Resetted { add { AddEventListener(EventNames.Reset, value, false); } remove { RemoveEventListener(EventNames.Reset, value, false); } } public event DomEventHandler Resized { add { AddEventListener(EventNames.Resize, value, false); } remove { RemoveEventListener(EventNames.Resize, value, false); } } public event DomEventHandler Scrolled { add { AddEventListener(EventNames.Scroll, value, false); } remove { RemoveEventListener(EventNames.Scroll, value, false); } } public event DomEventHandler Seeked { add { AddEventListener(EventNames.Seeked, value, false); } remove { RemoveEventListener(EventNames.Seeked, value, false); } } public event DomEventHandler Seeking { add { AddEventListener(EventNames.Seeking, value, false); } remove { RemoveEventListener(EventNames.Seeking, value, false); } } public event DomEventHandler Selected { add { AddEventListener(EventNames.Select, value, false); } remove { RemoveEventListener(EventNames.Select, value, false); } } public event DomEventHandler Shown { add { AddEventListener(EventNames.Show, value, false); } remove { RemoveEventListener(EventNames.Show, value, false); } } public event DomEventHandler Stalled { add { AddEventListener(EventNames.Stalled, value, false); } remove { RemoveEventListener(EventNames.Stalled, value, false); } } public event DomEventHandler Submitted { add { AddEventListener(EventNames.Submit, value, false); } remove { RemoveEventListener(EventNames.Submit, value, false); } } public event DomEventHandler Suspended { add { AddEventListener(EventNames.Suspend, value, false); } remove { RemoveEventListener(EventNames.Suspend, value, false); } } public event DomEventHandler TimeUpdated { add { AddEventListener(EventNames.TimeUpdate, value, false); } remove { RemoveEventListener(EventNames.TimeUpdate, value, false); } } public event DomEventHandler Toggled { add { AddEventListener(EventNames.Toggle, value, false); } remove { RemoveEventListener(EventNames.Toggle, value, false); } } public event DomEventHandler VolumeChanged { add { AddEventListener(EventNames.VolumeChange, value, false); } remove { RemoveEventListener(EventNames.VolumeChange, value, false); } } public event DomEventHandler Waiting { add { AddEventListener(EventNames.Waiting, value, false); } remove { RemoveEventListener(EventNames.Waiting, value, false); } } internal Document(IBrowsingContext context = null) : this(context, new TextSource(string.Empty)) { } internal Document(IBrowsingContext context, TextSource source) : base(null, "#document", NodeType.Document, NodeFlags.None) { IsAsync = true; _context = (context ?? new SimpleBrowsingContext(Configuration.Default, Sandboxes.None)); _source = source; _referrer = string.Empty; _contentType = MimeTypes.ApplicationXml; _ready = DocumentReadyState.Loading; _styleSheets = new StyleSheetList(this); _mutations = new MutationHost(this); _preferredStyleSheetSet = string.Empty; _scripts = new Queue<HtmlScriptElement>(); _quirksMode = QuirksMode.Off; _designMode = false; _location = new Location(AboutBlank); _location.Changed += LocationChanged; _ranges = new List<WeakReference>(); _view = this.CreateWindow(); _firedUnload = false; _salvageable = true; _shown = false; _sandbox = Sandboxes.None; _context.NavigateTo(this); } internal void AddScript(HtmlScriptElement script) { _scripts.Enqueue(script); } public void Dispose() { ReplaceAll(null, true); _scripts.Clear(); if (_source != null) { _source.Dispose(); _source = null; } } public void EnableStyleSheetsForSet(string name) { if (name != null) _styleSheets.EnableStyleSheetSet(name); } public IWindow OpenNew(string url, string name, string features, string replace = null) { IWindow defaultView = DefaultView; if (defaultView == null) throw new DomException(ErrorCode.InvalidAccess); return defaultView.Open(url, name, features, replace); } public IDocument Open(string type = "text/html", string replace = null) { if (_contentType != MimeTypes.Html) throw new DomException(ErrorCode.InvalidState); if (IsInBrowsingContext && _context.Active != this) return null; bool flag = Keywords.Replace.Equals(replace, StringComparison.OrdinalIgnoreCase); if (_scripts.Count > 0) return this; if (flag) type = MimeTypes.Html; int num = type.IndexOf(';'); if (num >= 0) type = type.Substring(0, num); type = type.StripLeadingTailingSpaces(); _contentType = type; ReplaceAll(null, false); return this; } void IDocument.Close() { if (ReadyState == DocumentReadyState.Loading) FinishLoading(); } public void Write(string content) { if (ReadyState == DocumentReadyState.Complete) Open("text/html", null).Write(content); else _source.InsertText(content); } public void WriteLine(string content) { Write(content + '\n'); } public IHtmlCollection GetElementsByName(string name) { List<IElement> list = new List<IElement>(); base.ChildNodes.GetElementsByName(name, list); return new HtmlElementCollection(list); } public void LoadHtml(string url) { _location.Href = url; } public INode Import(INode externalNode, bool deep = true) { if (externalNode is IDocument) throw new DomException(ErrorCode.NotSupported); return externalNode.Clone(deep); } public INode Adopt(INode externalNode) { if (externalNode is IDocument) throw new DomException(ErrorCode.NotSupported); this.AdoptNode(externalNode); return externalNode; } public Event CreateEvent(string type) { Event event = Factory.Events.Create(type); if (event == null) throw new DomException(ErrorCode.NotSupported); return event; } public INodeIterator CreateNodeIterator(INode root, FilterSettings settings = FilterSettings.All, NodeFilter filter = null) { return new NodeIterator(root, settings, filter); } public ITreeWalker CreateTreeWalker(INode root, FilterSettings settings = FilterSettings.All, NodeFilter filter = null) { return new TreeWalker(root, settings, filter); } public IRange CreateRange() { AngleSharp.Dom.Collections.Range range = new AngleSharp.Dom.Collections.Range(this); _ranges.Add(new WeakReference(range)); return range; } public void Prepend(params INode[] nodes) { this.PrependNodes(nodes); } public void Append(params INode[] nodes) { this.AppendNodes(nodes); } public IElement CreateElement(string localName) { if (!localName.IsXmlName()) throw new DomException(ErrorCode.InvalidCharacter); return Factory.HtmlElements.Create(localName, this); } public IElement CreateElement(string namespaceUri, string qualifiedName) { if (string.IsNullOrEmpty(namespaceUri)) namespaceUri = null; if (!qualifiedName.IsXmlName()) throw new DomException(ErrorCode.InvalidCharacter); if (!qualifiedName.IsQualifiedName()) throw new DomException(ErrorCode.Namespace); string[] array = qualifiedName.Split(new char[1] { ':' }); string text = (array.Length == 2) ? array[0] : null; string text2 = (array.Length == 2) ? array[1] : qualifiedName; if (text == Namespaces.XmlPrefix && namespaceUri != Namespaces.XmlUri) throw new DomException(ErrorCode.Namespace); if ((qualifiedName == Namespaces.XmlNsPrefix || text == Namespaces.XmlNsPrefix) && namespaceUri != Namespaces.XmlNsUri) throw new DomException(ErrorCode.Namespace); if (namespaceUri == Namespaces.XmlNsUri && (qualifiedName != Namespaces.XmlNsPrefix || text != Namespaces.XmlNsPrefix)) throw new DomException(ErrorCode.Namespace); Element element = null; element = ((namespaceUri == Namespaces.HtmlUri) ? Factory.HtmlElements.Create(text2, this) : ((namespaceUri == Namespaces.SvgUri) ? Factory.SvgElements.Create(text2, this) : ((!(namespaceUri == Namespaces.MathMlUri)) ? new Element(this, text2, NodeFlags.None) { NamespaceUri = namespaceUri } : Factory.MathElements.Create(text2, this)))); element.Prefix = text; return element; } public IComment CreateComment(string data) { return new Comment(this, data); } public IDocumentFragment CreateDocumentFragment() { return new DocumentFragment(this); } public IProcessingInstruction CreateProcessingInstruction(string target, string data) { if (!target.IsXmlName() || data.Contains("?>")) throw new DomException(ErrorCode.InvalidCharacter); return new ProcessingInstruction(this, target) { Data = data }; } public IText CreateTextNode(string data) { return new TextNode(this, data); } public IElement GetElementById(string elementId) { return base.ChildNodes.GetElementById(elementId); } public IElement QuerySelector(string selectors) { return base.ChildNodes.QuerySelector(selectors); } public IHtmlCollection QuerySelectorAll(string selectors) { return base.ChildNodes.QuerySelectorAll(selectors); } public IHtmlCollection GetElementsByClassName(string classNames) { return base.ChildNodes.GetElementsByClassName(classNames); } public IHtmlCollection GetElementsByTagName(string tagName) { return base.ChildNodes.GetElementsByTagName(tagName); } public IHtmlCollection GetElementsByTagName(string namespaceURI, string tagName) { return base.ChildNodes.GetElementsByTagName(namespaceURI, tagName); } public override INode Clone(bool deep = true) { Document document = new Document(_context, new TextSource(Source.Text)); Node.CopyProperties(this, document, deep); CopyDocumentProperties(this, document, deep); return document; } public override string ToHtml() { return base.ChildNodes.ToHtml(); } public bool HasFocus() { return _context.Active == this; } internal void SetFocus(IElement element) { _focus = element; } internal bool IsWaitingForScript() { if (_scripts.Count > 0) return !_scripts.Peek().IsReady; return false; } internal void FinishLoading() { ReadyState = DocumentReadyState.Interactive; while (_scripts.Count > 0) { this.WaitForReady(); _scripts.Dequeue().Run(); } this.QueueTask(RaiseDomContentLoaded); this.QueueTask(RaiseLoadedEvent); if (IsInBrowsingContext) this.QueueTask(ShowPage); this.QueueTask(EmptyAppCache); if (IsToBePrinted) Print(); } internal Task<IDocument> LoadAsync(IResponse response, CancellationToken cancelToken) { _contentType = MimeTypes.Html; Open(response.Headers[HeaderNames.ContentType], null); DocumentUri = response.Address.Href; ReadyState = DocumentReadyState.Loading; _source = new TextSource(response.Content, Options.DefaultEncoding()); return new HtmlParser(this).ParseAsync(cancelToken); } internal void Unload(bool recycle, CancellationToken cancelToken) { EventTarget eventTarget = DefaultView as EventTarget; if (_shown) { _shown = false; this.Fire(delegate(PageTransitionEvent ev) { ev.Init(EventNames.PageHide, false, false, _salvageable); }, eventTarget); } if (!_firedUnload) eventTarget.FireSimpleEvent(EventNames.Unload, false, false); this.ReleaseStorageMutex(); if (eventTarget.HasEventListener(EventNames.Unload)) { _firedUnload = true; _salvageable = false; } } bool IDocument.ExecuteCommand(string commandId, bool showUserInterface, string value) { return Options.GetCommand(commandId)?.Execute(this, showUserInterface, value) ?? false; } bool IDocument.IsCommandEnabled(string commandId) { return Options.GetCommand(commandId)?.IsEnabled(this) ?? false; } bool IDocument.IsCommandIndeterminate(string commandId) { return Options.GetCommand(commandId)?.IsIndeterminate(this) ?? false; } bool IDocument.IsCommandExecuted(string commandId) { return Options.GetCommand(commandId)?.IsExecuted(this) ?? false; } bool IDocument.IsCommandSupported(string commandId) { return Options.GetCommand(commandId)?.IsSupported(this) ?? false; } string IDocument.GetCommandValue(string commandId) { return Options.GetCommand(commandId)?.GetValue(this); } private void RaiseDomContentLoaded() { this.FireSimpleEvent(EventNames.DomContentLoaded, false, false); } private void RaiseLoadedEvent() { ReadyState = DocumentReadyState.Complete; this.FireSimpleEvent(EventNames.Load, false, false); } private void EmptyAppCache() { } private void Print() { this.FireSimpleEvent(EventNames.BeforePrint, false, false); this.FireSimpleEvent(EventNames.AfterPrint, false, false); } private void ShowPage() { if (!_shown && _view != null) { _shown = true; this.Fire(delegate(PageTransitionEvent ev) { ev.Init(EventNames.PageShow, false, false, false); }, _view as EventTarget); } } private async void LocationChanged(object sender, Location.LocationChangedEventArgs e) { if (e.IsHashChanged) { HashChangedEvent hashChangedEvent = new HashChangedEvent(); hashChangedEvent.Init(EventNames.HashChange, false, false, e.PreviousLocation, e.CurrentLocation); hashChangedEvent.IsTrusted = true; hashChangedEvent.Dispatch(this); } else { Url url = new Url(e.CurrentLocation); IRequester requester = Options.GetRequester(url.Scheme); if (requester != null) { IResponse response = await requester.LoadAsync(url).ConfigureAwait(false); if (response != null) { await LoadAsync(response, CancellationToken.None).ConfigureAwait(false); response.Dispose(); } } } } protected sealed override string LocateNamespace(string prefix) { return DocumentElement.LocateNamespace(prefix); } protected sealed override string LocatePrefix(string namespaceUri) { return DocumentElement.LocatePrefix(namespaceUri); } protected static void CopyDocumentProperties(Document source, Document target, bool deep) { target._ready = source._ready; target._referrer = source._referrer; target._location.Href = source._location.Href; target._quirksMode = source._quirksMode; } } }