/// <summary> /// References a child element (use when adding any child). /// </summary> /// <param name="node">The node to be added.</param> internal override void ReferenceNode(Node node) { base.ReferenceNode(node); if (node is Element) { if (node is HTMLFormElement) { var form = (HTMLFormElement)node; _forms.Add(form); } else if (node is HTMLImageElement) { var img = (HTMLImageElement)node; _images.Add(img); } else if (node is HTMLScriptElement) { var script = (HTMLScriptElement)node; _scripts.Add(script); } else if (_body == null && node is HTMLBodyElement) { _body = (HTMLBodyElement)node; } else if (_head == null && node is HTMLHeadElement) { _head = (HTMLHeadElement)node; } else if (_title == null && node is HTMLTitleElement) { _title = (HTMLTitleElement)node; } } }
/// <summary> /// Dereferences a child element (use when removing any child). /// </summary> /// <param name="node">The node to be removed.</param> internal override void DereferenceNode(Node node) { base.DereferenceNode(node); if (node is Element) { if (node is HTMLFormElement) { var form = (HTMLFormElement)node; _forms.Remove(form); } else if (node is HTMLImageElement) { var img = (HTMLImageElement)node; _images.Remove(img); } else if (node is HTMLScriptElement) { var script = (HTMLScriptElement)node; _scripts.Remove(script); } else if (_body == node) { _body = FindChild <HTMLBodyElement>(_documentElement); } else if (_head == node) { _head = FindChild <HTMLHeadElement>(_documentElement); } else if (_title == node) { _title = FindChild <HTMLTitleElement>(_head); } } }
/// <summary> /// References a child element (use when adding any child). /// </summary> /// <param name="node">The node to be added.</param> internal override void ReferenceNode(Node node) { base.ReferenceNode(node); if (node is Element) { if (node is HTMLFormElement) { var form = (HTMLFormElement)node; forms.Add(form); } else if (node is HTMLImageElement) { var img = (HTMLImageElement)node; images.Add(img); } else if (node is HTMLScriptElement) { var script = (HTMLScriptElement)node; scripts.Add(script); } else if (body == null && node is HTMLBodyElement) { body = (HTMLBodyElement)node; } else if (head == null && node is HTMLHeadElement) { head = (HTMLHeadElement)node; } else if (title == null && node is HTMLTitleElement) { title = (HTMLTitleElement)node; } } }
/// <summary> /// Dereferences a child element (use when removing any child). /// </summary> /// <param name="node">The node to be removed.</param> internal override void DereferenceNode(Node node) { base.DereferenceNode(node); if (node is Element) { if (node is HTMLFormElement) { var form = (HTMLFormElement)node; forms.Remove(form); } else if (node is HTMLImageElement) { var img = (HTMLImageElement)node; images.Remove(img); } else if (node is HTMLScriptElement) { var script = (HTMLScriptElement)node; scripts.Remove(script); } else if (body == node) { body = FindChild<HTMLBodyElement>(documentElement); } else if (head == node) { head = FindChild<HTMLHeadElement>(documentElement); } else if (title == node) { title = FindChild<HTMLTitleElement>(head); } } }
public void HtmlHasRightHeadElement() { var doc = new HTMLDocument(); var root = new HTMLHtmlElement(); doc.AppendChild(root); var head = new HTMLHeadElement(); root.AppendChild(head); Assert.AreEqual(head, doc.Head); }
/// <summary> /// See 8.2.5.4.3 The "before head" insertion mode. /// </summary> /// <param name="token">The passed token.</param> void BeforeHead(HtmlToken token) { if (token.Type == HtmlTokenType.Comment) { AddComment(CurrentNode, token); return; } else if (token.Type == HtmlTokenType.DOCTYPE) { RaiseErrorOccurred(ErrorCode.DoctypeTagInappropriate); return; } else if (token.Type == HtmlTokenType.StartTag && ((HtmlTagToken)token).Name == HTMLHtmlElement.Tag) { InBody(token); return; } else if (token.Type == HtmlTokenType.StartTag && ((HtmlTagToken)token).Name == HTMLHeadElement.Tag) { var element = new HTMLHeadElement(); AddElementToCurrentNode(element, token); insert = HtmlTreeMode.InHead; return; } else if (token.IsEndTagInv(HTMLHtmlElement.Tag, HTMLBodyElement.Tag, HTMLBRElement.Tag, HTMLHeadElement.Tag)) { RaiseErrorOccurred(ErrorCode.TagCannotEndHere); return; } else if(token.Type == HtmlTokenType.Character) { var chars = (HtmlCharacterToken)token; chars.TrimStart(); if (chars.IsEmpty) return; } BeforeHead(HtmlToken.OpenTag(HTMLHeadElement.Tag)); InHead(token); }
/// <summary> /// See 8.2.5.4.3 The "before head" insertion mode. /// </summary> /// <param name="token">The passed token.</param> void BeforeHead(HtmlToken token) { if (token.Type == HtmlTokenType.Comment) { AddComment(CurrentNode, token); } else if (token.Type == HtmlTokenType.DOCTYPE) { RaiseErrorOccurred(ErrorCode.DoctypeTagInappropriate); } else if (token.Type == HtmlTokenType.StartTag && ((HtmlTagToken)token).Name == HTMLHtmlElement.Tag) { InBody(token); } else if (token.Type == HtmlTokenType.StartTag && ((HtmlTagToken)token).Name == HTMLHeadElement.Tag) { var element = new HTMLHeadElement(); AddElementToCurrentNode(element, token); insert = HtmlTreeMode.InHead; } else if (token.Type == HtmlTokenType.EndTag && !(((HtmlTagToken)token).Name.IsHtmlBodyOrBreakRowElement(true))) { RaiseErrorOccurred(ErrorCode.TagCannotEndHere); } else if(!token.IsIgnorable) { BeforeHead(HtmlToken.OpenTag(HTMLHeadElement.Tag)); InHead(token); } }