HTMLDocument
Represents an HTML document.
using AngleSharp.DOM.Collections;
using AngleSharp.Html;
using System;
using System.Collections.Generic;
using System.IO;
namespace AngleSharp.DOM.Html
{
[DOM("HTMLDocument")]
public sealed class HTMLDocument : Document, IHTMLDocument, IDocument, INode, IQueryElements
{
private bool _embedded;
private bool _scripting;
private HTMLLiveCollection<Element> _all;
private HTMLLiveCollection<HTMLFormElement> _forms;
private HTMLLiveCollection<HTMLScriptElement> _scripts;
private HTMLLiveCollection<HTMLImageElement> _images;
private HTMLLiveCollectionWithAttr<HTMLAnchorElement> _anchors;
private HTMLLiveCollection<HTMLEmbedElement, HTMLObjectElement, HTMLAppletElement> _embeds;
private HTMLLiveCollectionWithAttr<HTMLAnchorElement, HTMLAreaElement> _links;
public HTMLCollection All => _all;
[DOM("anchors")]
public HTMLCollection Anchors {
get {
return _anchors ?? new HTMLLiveCollectionWithAttr<HTMLAnchorElement>(this, "name");
}
}
public DirectionMode Dir {
get {
return base.DocumentElement?.Dir ?? DirectionMode.Ltr;
}
set {
Element documentElement = base.DocumentElement;
if (documentElement != null)
documentElement.Dir = value;
}
}
[DOM("forms")]
public HTMLCollection Forms {
get {
return _forms ?? (_forms = new HTMLLiveCollection<HTMLFormElement>(this, true));
}
}
[DOM("images")]
public HTMLCollection Images {
get {
return _images ?? (_images = new HTMLLiveCollection<HTMLImageElement>(this, true));
}
}
[DOM("scripts")]
public HTMLCollection Scripts {
get {
return _scripts ?? (_scripts = new HTMLLiveCollection<HTMLScriptElement>(this, true));
}
}
[DOM("embeds")]
public HTMLCollection Embeds {
get {
return _embeds ?? new HTMLLiveCollection<HTMLEmbedElement, HTMLObjectElement, HTMLAppletElement>(this, true);
}
}
[DOM("links")]
public HTMLCollection Links {
get {
return _links ?? new HTMLLiveCollectionWithAttr<HTMLAnchorElement, HTMLAreaElement>(this, "href");
}
}
[DOM("title")]
public string Title {
get {
HTMLTitleElement hTMLTitleElement = Document.FindChild<HTMLTitleElement>(Head);
if (hTMLTitleElement != null)
return hTMLTitleElement.Text;
return string.Empty;
}
set {
HTMLTitleElement hTMLTitleElement = Document.FindChild<HTMLTitleElement>(Head);
if (hTMLTitleElement == null) {
Element element = base.DocumentElement;
if (element == null) {
element = new HTMLHtmlElement();
AppendChild(element);
}
HTMLHeadElement hTMLHeadElement = Head;
if (hTMLHeadElement == null) {
hTMLHeadElement = new HTMLHeadElement();
element.AppendChild(hTMLHeadElement);
}
hTMLTitleElement = new HTMLTitleElement();
hTMLHeadElement.AppendChild(hTMLTitleElement);
}
hTMLTitleElement.Text = value;
}
}
[DOM("head")]
public HTMLHeadElement Head {
get {
return Document.FindChild<HTMLHeadElement>(base.DocumentElement);
}
}
[DOM("body")]
public HTMLBodyElement Body {
get {
return Document.FindChild<HTMLBodyElement>(base.DocumentElement);
}
}
[DOM("compatMode")]
public string CompatMode {
get {
if (base.QuirksMode != QuirksMode.On)
return "CSS1Compat";
return "BackCompat";
}
}
[DOM("cookie")]
public Cookie Cookie {
get {
return null;
}
set {
}
}
[DOM("domain")]
public string Domain {
get {
if (!string.IsNullOrEmpty(base.DocumentURI))
return new Uri(base.DocumentURI).Host;
return string.Empty;
}
}
[DOM("URL")]
public string URL {
get {
return base.DocumentURI;
}
}
internal bool IsEmbedded {
get {
return _embedded;
}
set {
_embedded = value;
}
}
internal bool IsScripting {
get {
return _scripting;
}
set {
_scripting = value;
}
}
internal int ScriptsWaiting => 0;
internal int ScriptsAsSoonAsPossible => 0;
internal bool IsLoadingDelayed => false;
internal bool IsInBrowsingContext => false;
internal bool IsToBePrinted { get; set; }
[DOM("onabort")]
internal event EventHandler OnAbort;
[DOM("onblur")]
internal event EventHandler OnBlur;
[DOM("oncanplay")]
internal event EventHandler OnCanPlay;
[DOM("oncanplaythrough")]
internal event EventHandler OnCanPlayThrough;
[DOM("onchange")]
internal event EventHandler OnChange;
[DOM("onclick")]
internal event EventHandler OnClick;
[DOM("oncontextmenu")]
internal event EventHandler OnContextMenu;
[DOM("oncopy")]
internal event EventHandler OnCopy;
[DOM("oncuechange")]
internal event EventHandler OnCueChange;
[DOM("oncut")]
internal event EventHandler OnCut;
[DOM("ondblclick")]
internal event EventHandler OnDblClick;
[DOM("onaondragbort")]
internal event EventHandler OnDrag;
[DOM("ondragend")]
internal event EventHandler OnDragEnd;
[DOM("ondragenter")]
internal event EventHandler OnDragEnter;
[DOM("ondragleave")]
internal event EventHandler OnDragLeave;
[DOM("ondragover")]
internal event EventHandler OnDragOver;
[DOM("ondragstart")]
internal event EventHandler OnDragStart;
[DOM("ondrop")]
internal event EventHandler OnDrop;
[DOM("ondurationchange")]
internal event EventHandler OnDurationChange;
[DOM("onemptied")]
internal event EventHandler OnEmptied;
[DOM("onended")]
internal event EventHandler OnEnded;
[DOM("onerror")]
internal event EventHandler OnError;
[DOM("onfocus")]
internal event EventHandler OnFocus;
[DOM("onfocusin")]
internal event EventHandler OnFocusIn;
[DOM("onfocusout")]
internal event EventHandler OnFocusOut;
[DOM("onfullscreenchange")]
internal event EventHandler OnFullScreenChange;
[DOM("onfullscreenerror")]
internal event EventHandler OnFullScreenError;
[DOM("oninput")]
internal event EventHandler OnInput;
[DOM("oninvalid")]
internal event EventHandler OnInvalid;
[DOM("onkeydown")]
internal event EventHandler OnKeyDown;
[DOM("onkeypress")]
internal event EventHandler OnKeyPress;
[DOM("onkeyup")]
internal event EventHandler OnKeyUp;
[DOM("onload")]
internal event EventHandler OnLoad;
[DOM("onloadeddata")]
internal event EventHandler OnLoadedData;
[DOM("onloadedmetadata")]
internal event EventHandler OnLoadedMetaData;
[DOM("onloadstart")]
internal event EventHandler OnLoadStart;
[DOM("onmousedown")]
internal event EventHandler OnMouseDown;
[DOM("onmousemove")]
internal event EventHandler OnMouseMove;
[DOM("onmouseout")]
internal event EventHandler OnMouseOut;
[DOM("onmouseover")]
internal event EventHandler OnMouseOver;
[DOM("onmouseup")]
internal event EventHandler OnMouseUp;
[DOM("onmousewheel")]
internal event EventHandler OnMouseWheel;
[DOM("onpaste")]
internal event EventHandler OnPaste;
[DOM("onpause")]
internal event EventHandler OnPause;
[DOM("onplay")]
internal event EventHandler OnPlay;
[DOM("onplaying")]
internal event EventHandler OnPlaying;
[DOM("onprogress")]
internal event EventHandler OnProgress;
[DOM("onratechange")]
internal event EventHandler OnRateChange;
[DOM("onreset")]
internal event EventHandler OnReset;
[DOM("onscroll")]
internal event EventHandler OnScroll;
[DOM("onseeked")]
internal event EventHandler OnSeeked;
[DOM("onseeking")]
internal event EventHandler OnSeeking;
[DOM("onselect")]
internal event EventHandler OnSelect;
[DOM("onstalled")]
internal event EventHandler OnStalled;
[DOM("onsubmit")]
internal event EventHandler OnSubmit;
[DOM("onsuspend")]
internal event EventHandler OnSuspend;
[DOM("ontimeout")]
internal event EventHandler OnTimeOut;
[DOM("ontimeupdate")]
internal event EventHandler OnTimeUpdate;
[DOM("ontouchcancel")]
internal event EventHandler OnTouchCancel;
[DOM("ontouchend")]
internal event EventHandler OnTouchEnd;
[DOM("ontouchmove")]
internal event EventHandler OnTouchMove;
[DOM("ontouchstart")]
internal event EventHandler OnTouchStart;
[DOM("onvolumechange")]
internal event EventHandler OnVolumeChange;
[DOM("onwaiting")]
internal event EventHandler OnWaiting;
internal HTMLDocument()
{
_contentType = MimeTypes.Xml;
_ns = Namespaces.Html;
_all = new HTMLLiveCollection<Element>(this, true);
}
public static HTMLDocument LoadFromURL(string url)
{
HTMLDocument hTMLDocument = new HTMLDocument();
return hTMLDocument.Load(url);
}
public static HTMLDocument LoadFromSource(string source)
{
return DocumentBuilder.Html(source);
}
[DOM("load")]
public HTMLDocument Load(string url)
{
_location = url;
Cookie = new Cookie();
for (int i = _children.Length - 1; i >= 0; i++) {
RemoveChild(_children[i]);
}
base.ReadyState = Readiness.Loading;
base.QuirksMode = QuirksMode.Off;
Stream stream = Builder.Stream(url);
SourceManager source = new SourceManager(stream);
HtmlParser htmlParser = new HtmlParser(this, source);
return htmlParser.Result;
}
[DOM("cloneNode")]
public override Node CloneNode(bool deep = true)
{
HTMLDocument hTMLDocument = new HTMLDocument();
Node.CopyProperties(this, hTMLDocument, deep);
Document.CopyDocumentProperties(this, hTMLDocument, deep);
hTMLDocument._embedded = _embedded;
hTMLDocument._scripting = _scripting;
return hTMLDocument;
}
[DOM("adoptNode")]
public Node AdoptNode(Node externalNode)
{
if (externalNode.OwnerDocument != null && externalNode.ParentNode != null)
externalNode.ParentNode.RemoveChild(externalNode);
externalNode.OwnerDocument = this;
return externalNode;
}
[DOM("open")]
public HTMLDocument Open()
{
return this;
}
[DOM("close")]
public HTMLDocument Close()
{
return this;
}
[DOM("write")]
public HTMLDocument Write(string content)
{
return this;
}
[DOM("writeln")]
public HTMLDocument WriteLn(string content)
{
return Write(content + '\n');
}
[DOM("createElement")]
public override Element CreateElement(string tagName)
{
HTMLElement hTMLElement = HTMLElement.Create(tagName.ToLower());
hTMLElement.OwnerDocument = this;
return hTMLElement;
}
[DOM("createCDATASection")]
public override CDATASection CreateCDATASection(string data)
{
throw new DOMException(ErrorCode.NotSupported);
}
[DOM("getElementsByName")]
public HTMLCollection GetElementsByName(string name)
{
List<Element> list = new List<Element>();
GetElementsByName(_children, name, list);
return new HTMLStaticCollection(list);
}
internal void SpinEventLoop()
{
}
internal void RaiseDomContentLoaded()
{
}
internal void RaiseLoadedEvent()
{
}
internal void QueueTask(Action action)
{
}
internal void Print()
{
}
private void GetElementsByName(NodeList children, string name, List<Element> result)
{
for (int i = 0; i < _children.Length; i++) {
if (children[i] is HTMLElement) {
HTMLElement hTMLElement = (HTMLElement)children[i];
if (hTMLElement.GetAttribute("name") == name)
result.Add(hTMLElement);
GetElementsByName(hTMLElement.ChildNodes, name, result);
}
}
}
}
}