WEB-28886 Unclosed p tag wreaks havoc

GitOrigin-RevId: 9b05040dc393fbb8706629c15086aa6268dbb4ef
This commit is contained in:
Piotr Tomiak
2020-12-14 12:54:08 +01:00
committed by intellij-monorepo-bot
parent da8fff0771
commit 7bb460c319
8 changed files with 2733 additions and 2662 deletions

View File

@@ -101,4 +101,11 @@ public class HtmlParsingTest extends XmlParsingTest {
"<textarea>this {{text}} {area} &nbsp; <is></cool></textarea>");
}
public void testPAutoClose() throws Exception {
doTestHtml("<div>\n" +
"<p><br/><div><span><p></p></span></div>\n" +
"<P><table></table>\n" +
"</div>\n");
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,58 @@
HtmlFile:test.html
PsiElement(HTML_DOCUMENT)
PsiElement(XML_PROLOG)
<empty list>
HtmlTag:div
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('div')
XmlToken:XML_TAG_END('>')
XmlText
PsiWhiteSpace('\n')
HtmlTag:p
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('p')
XmlToken:XML_TAG_END('>')
HtmlTag:br
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('br')
XmlToken:XML_EMPTY_ELEMENT_END('/>')
HtmlTag:div
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('div')
XmlToken:XML_TAG_END('>')
HtmlTag:span
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('span')
XmlToken:XML_TAG_END('>')
HtmlTag:p
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('p')
XmlToken:XML_TAG_END('>')
XmlToken:XML_END_TAG_START('</')
XmlToken:XML_NAME('p')
XmlToken:XML_TAG_END('>')
XmlToken:XML_END_TAG_START('</')
XmlToken:XML_NAME('span')
XmlToken:XML_TAG_END('>')
XmlToken:XML_END_TAG_START('</')
XmlToken:XML_NAME('div')
XmlToken:XML_TAG_END('>')
XmlText
PsiWhiteSpace('\n')
HtmlTag:P
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('P')
XmlToken:XML_TAG_END('>')
HtmlTag:table
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('table')
XmlToken:XML_TAG_END('>')
XmlToken:XML_END_TAG_START('</')
XmlToken:XML_NAME('table')
XmlToken:XML_TAG_END('>')
XmlText
PsiWhiteSpace('\n')
XmlToken:XML_END_TAG_START('</')
XmlToken:XML_NAME('div')
XmlToken:XML_TAG_END('>')
PsiWhiteSpace('\n')

View File

@@ -30,213 +30,213 @@ HtmlFile:test.html
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('BR')
XmlToken:XML_TAG_END('>')
HtmlTag:CENTER
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('CENTER')
XmlToken:XML_TAG_END('>')
HtmlTag:BR
HtmlTag:CENTER
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('BR')
XmlToken:XML_TAG_END('>')
HtmlTag:BR
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('BR')
XmlToken:XML_TAG_END('>')
HtmlTag:BR
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('BR')
XmlToken:XML_TAG_END('>')
HtmlTag:BR
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('BR')
XmlToken:XML_TAG_END('>')
HtmlTag:BR
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('BR')
XmlToken:XML_TAG_END('>')
HtmlTag:BR
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('BR')
XmlToken:XML_TAG_END('>')
HtmlTag:BR
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('BR')
XmlToken:XML_TAG_END('>')
XmlText
PsiWhiteSpace('\n')
HtmlTag:FORM
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('FORM')
PsiWhiteSpace(' ')
PsiElement(XML_ATTRIBUTE)
XmlToken:XML_NAME('onSubmit')
XmlToken:XML_EQ('=')
PsiElement(XML_ATTRIBUTE_VALUE)
XmlToken:XML_ATTRIBUTE_VALUE_START_DELIMITER('"')
XmlToken:XML_ATTRIBUTE_VALUE_END_DELIMITER('"')
XmlToken:XML_NAME('CENTER')
XmlToken:XML_TAG_END('>')
HtmlTag:BR
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('BR')
XmlToken:XML_TAG_END('>')
HtmlTag:BR
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('BR')
XmlToken:XML_TAG_END('>')
HtmlTag:BR
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('BR')
XmlToken:XML_TAG_END('>')
HtmlTag:BR
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('BR')
XmlToken:XML_TAG_END('>')
HtmlTag:BR
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('BR')
XmlToken:XML_TAG_END('>')
HtmlTag:BR
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('BR')
XmlToken:XML_TAG_END('>')
HtmlTag:BR
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('BR')
XmlToken:XML_TAG_END('>')
XmlText
PsiWhiteSpace('\n')
HtmlTag:FONT
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('FONT')
PsiWhiteSpace(' ')
PsiElement(XML_ATTRIBUTE)
XmlToken:XML_NAME('COLOR')
XmlToken:XML_EQ('=')
PsiElement(XML_ATTRIBUTE_VALUE)
XmlToken:XML_ATTRIBUTE_VALUE_TOKEN('DARKBLUE')
PsiWhiteSpace(' ')
PsiElement(XML_ATTRIBUTE)
XmlToken:XML_NAME('SIZE')
XmlToken:XML_EQ('=')
PsiElement(XML_ATTRIBUTE_VALUE)
XmlToken:XML_ATTRIBUTE_VALUE_TOKEN('4')
XmlToken:XML_TAG_END('>')
XmlText
XmlToken:XML_DATA_CHARACTERS('Enter')
PsiWhiteSpace(' ')
XmlToken:XML_DATA_CHARACTERS('the')
PsiWhiteSpace(' ')
XmlToken:XML_DATA_CHARACTERS('User')
PsiWhiteSpace(' ')
XmlToken:XML_DATA_CHARACTERS('Name')
PsiWhiteSpace('\n')
HtmlTag:BR
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('BR')
XmlToken:XML_TAG_END('>')
XmlText
PsiWhiteSpace('\n')
HtmlTag:INPUT
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('INPUT')
PsiWhiteSpace(' ')
PsiElement(XML_ATTRIBUTE)
XmlToken:XML_NAME('TYPE')
XmlToken:XML_EQ('=')
PsiElement(XML_ATTRIBUTE_VALUE)
XmlToken:XML_ATTRIBUTE_VALUE_TOKEN('text')
PsiWhiteSpace(' ')
PsiElement(XML_ATTRIBUTE)
XmlToken:XML_NAME('NAME')
XmlToken:XML_EQ('=')
PsiElement(XML_ATTRIBUTE_VALUE)
XmlToken:XML_ATTRIBUTE_VALUE_TOKEN('whichUser')
PsiWhiteSpace(' ')
PsiElement(XML_ATTRIBUTE)
XmlToken:XML_NAME('MAXLENGTH')
XmlToken:XML_EQ('=')
PsiElement(XML_ATTRIBUTE_VALUE)
XmlToken:XML_ATTRIBUTE_VALUE_TOKEN('30')
XmlToken:XML_TAG_END('>')
XmlText
PsiWhiteSpace('\n')
HtmlTag:BR
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('BR')
XmlToken:XML_TAG_END('>')
HtmlTag:BR
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('BR')
XmlToken:XML_TAG_END('>')
XmlText
PsiWhiteSpace('\n')
HtmlTag:INPUT
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('INPUT')
PsiWhiteSpace(' ')
PsiElement(XML_ATTRIBUTE)
XmlToken:XML_NAME('TYPE')
XmlToken:XML_EQ('=')
PsiElement(XML_ATTRIBUTE_VALUE)
XmlToken:XML_ATTRIBUTE_VALUE_TOKEN('SUBMIT')
PsiWhiteSpace(' ')
PsiElement(XML_ATTRIBUTE)
XmlToken:XML_NAME('VALUE')
XmlToken:XML_EQ('=')
PsiElement(XML_ATTRIBUTE_VALUE)
XmlToken:XML_ATTRIBUTE_VALUE_START_DELIMITER('"')
XmlToken:XML_ATTRIBUTE_VALUE_TOKEN('Submit')
XmlToken:XML_ATTRIBUTE_VALUE_END_DELIMITER('"')
XmlToken:XML_TAG_END('>')
XmlText
PsiWhiteSpace('\n ')
HtmlTag:BR
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('BR')
XmlToken:XML_TAG_END('>')
HtmlTag:BR
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('BR')
XmlToken:XML_TAG_END('>')
XmlText
PsiWhiteSpace('\n ')
HtmlTag:TABLE
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('TABLE')
PsiWhiteSpace(' ')
PsiElement(XML_ATTRIBUTE)
XmlToken:XML_NAME('BORDER')
XmlToken:XML_EQ('=')
PsiElement(XML_ATTRIBUTE_VALUE)
XmlToken:XML_ATTRIBUTE_VALUE_TOKEN('1')
PsiWhiteSpace(' ')
PsiElement(XML_ATTRIBUTE)
XmlToken:XML_NAME('BGCOLOR')
XmlToken:XML_EQ('=')
PsiElement(XML_ATTRIBUTE_VALUE)
XmlToken:XML_ATTRIBUTE_VALUE_TOKEN('BLACK')
XmlToken:XML_TAG_END('>')
XmlText
PsiWhiteSpace('\n ')
HtmlTag:TD
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('TD')
XmlToken:XML_TAG_END('>')
HtmlTag:FONT
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('FONT')
PsiWhiteSpace(' ')
PsiElement(XML_ATTRIBUTE)
XmlToken:XML_NAME('COLOR')
XmlToken:XML_EQ('=')
PsiElement(XML_ATTRIBUTE_VALUE)
XmlToken:XML_ATTRIBUTE_VALUE_TOKEN('RED')
PsiWhiteSpace(' ')
PsiElement(XML_ATTRIBUTE)
XmlToken:XML_NAME('SIZE')
XmlToken:XML_EQ('=')
PsiElement(XML_ATTRIBUTE_VALUE)
XmlToken:XML_ATTRIBUTE_VALUE_TOKEN('4')
XmlToken:XML_TAG_END('>')
HtmlTag:B
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('B')
XmlToken:XML_TAG_END('>')
XmlText
PsiWhiteSpace('\n ')
PsiErrorElement:Element B is not closed
<empty list>
XmlToken:XML_END_TAG_START('</')
XmlToken:XML_NAME('TD')
XmlToken:XML_TAG_END('>')
XmlText
PsiWhiteSpace('\n ')
XmlToken:XML_END_TAG_START('</')
XmlToken:XML_NAME('TABLE')
XmlToken:XML_TAG_END('>')
XmlText
PsiWhiteSpace('\n')
PsiErrorElement:Element FONT is not closed
<empty list>
XmlToken:XML_END_TAG_START('</')
XmlToken:XML_NAME('FORM')
XmlToken:XML_TAG_END('>')
PsiErrorElement:Element CENTER is not closed
<empty list>
HtmlTag:FORM
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('FORM')
PsiWhiteSpace(' ')
PsiElement(XML_ATTRIBUTE)
XmlToken:XML_NAME('onSubmit')
XmlToken:XML_EQ('=')
PsiElement(XML_ATTRIBUTE_VALUE)
XmlToken:XML_ATTRIBUTE_VALUE_START_DELIMITER('"')
XmlToken:XML_ATTRIBUTE_VALUE_END_DELIMITER('"')
XmlToken:XML_TAG_END('>')
XmlText
PsiWhiteSpace('\n')
PsiErrorElement:Element CENTER is not closed
<empty list>
HtmlTag:FONT
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('FONT')
PsiWhiteSpace(' ')
PsiElement(XML_ATTRIBUTE)
XmlToken:XML_NAME('COLOR')
XmlToken:XML_EQ('=')
PsiElement(XML_ATTRIBUTE_VALUE)
XmlToken:XML_ATTRIBUTE_VALUE_TOKEN('DARKBLUE')
PsiWhiteSpace(' ')
PsiElement(XML_ATTRIBUTE)
XmlToken:XML_NAME('SIZE')
XmlToken:XML_EQ('=')
PsiElement(XML_ATTRIBUTE_VALUE)
XmlToken:XML_ATTRIBUTE_VALUE_TOKEN('4')
XmlToken:XML_TAG_END('>')
XmlText
XmlToken:XML_DATA_CHARACTERS('Enter')
PsiWhiteSpace(' ')
XmlToken:XML_DATA_CHARACTERS('the')
PsiWhiteSpace(' ')
XmlToken:XML_DATA_CHARACTERS('User')
PsiWhiteSpace(' ')
XmlToken:XML_DATA_CHARACTERS('Name')
PsiWhiteSpace('\n')
HtmlTag:BR
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('BR')
XmlToken:XML_TAG_END('>')
XmlText
PsiWhiteSpace('\n')
HtmlTag:INPUT
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('INPUT')
PsiWhiteSpace(' ')
PsiElement(XML_ATTRIBUTE)
XmlToken:XML_NAME('TYPE')
XmlToken:XML_EQ('=')
PsiElement(XML_ATTRIBUTE_VALUE)
XmlToken:XML_ATTRIBUTE_VALUE_TOKEN('text')
PsiWhiteSpace(' ')
PsiElement(XML_ATTRIBUTE)
XmlToken:XML_NAME('NAME')
XmlToken:XML_EQ('=')
PsiElement(XML_ATTRIBUTE_VALUE)
XmlToken:XML_ATTRIBUTE_VALUE_TOKEN('whichUser')
PsiWhiteSpace(' ')
PsiElement(XML_ATTRIBUTE)
XmlToken:XML_NAME('MAXLENGTH')
XmlToken:XML_EQ('=')
PsiElement(XML_ATTRIBUTE_VALUE)
XmlToken:XML_ATTRIBUTE_VALUE_TOKEN('30')
XmlToken:XML_TAG_END('>')
XmlText
PsiWhiteSpace('\n')
HtmlTag:BR
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('BR')
XmlToken:XML_TAG_END('>')
HtmlTag:BR
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('BR')
XmlToken:XML_TAG_END('>')
XmlText
PsiWhiteSpace('\n')
HtmlTag:INPUT
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('INPUT')
PsiWhiteSpace(' ')
PsiElement(XML_ATTRIBUTE)
XmlToken:XML_NAME('TYPE')
XmlToken:XML_EQ('=')
PsiElement(XML_ATTRIBUTE_VALUE)
XmlToken:XML_ATTRIBUTE_VALUE_TOKEN('SUBMIT')
PsiWhiteSpace(' ')
PsiElement(XML_ATTRIBUTE)
XmlToken:XML_NAME('VALUE')
XmlToken:XML_EQ('=')
PsiElement(XML_ATTRIBUTE_VALUE)
XmlToken:XML_ATTRIBUTE_VALUE_START_DELIMITER('"')
XmlToken:XML_ATTRIBUTE_VALUE_TOKEN('Submit')
XmlToken:XML_ATTRIBUTE_VALUE_END_DELIMITER('"')
XmlToken:XML_TAG_END('>')
XmlText
PsiWhiteSpace('\n ')
HtmlTag:BR
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('BR')
XmlToken:XML_TAG_END('>')
HtmlTag:BR
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('BR')
XmlToken:XML_TAG_END('>')
XmlText
PsiWhiteSpace('\n ')
HtmlTag:TABLE
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('TABLE')
PsiWhiteSpace(' ')
PsiElement(XML_ATTRIBUTE)
XmlToken:XML_NAME('BORDER')
XmlToken:XML_EQ('=')
PsiElement(XML_ATTRIBUTE_VALUE)
XmlToken:XML_ATTRIBUTE_VALUE_TOKEN('1')
PsiWhiteSpace(' ')
PsiElement(XML_ATTRIBUTE)
XmlToken:XML_NAME('BGCOLOR')
XmlToken:XML_EQ('=')
PsiElement(XML_ATTRIBUTE_VALUE)
XmlToken:XML_ATTRIBUTE_VALUE_TOKEN('BLACK')
XmlToken:XML_TAG_END('>')
XmlText
PsiWhiteSpace('\n ')
HtmlTag:TD
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('TD')
XmlToken:XML_TAG_END('>')
HtmlTag:FONT
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('FONT')
PsiWhiteSpace(' ')
PsiElement(XML_ATTRIBUTE)
XmlToken:XML_NAME('COLOR')
XmlToken:XML_EQ('=')
PsiElement(XML_ATTRIBUTE_VALUE)
XmlToken:XML_ATTRIBUTE_VALUE_TOKEN('RED')
PsiWhiteSpace(' ')
PsiElement(XML_ATTRIBUTE)
XmlToken:XML_NAME('SIZE')
XmlToken:XML_EQ('=')
PsiElement(XML_ATTRIBUTE_VALUE)
XmlToken:XML_ATTRIBUTE_VALUE_TOKEN('4')
XmlToken:XML_TAG_END('>')
HtmlTag:B
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('B')
XmlToken:XML_TAG_END('>')
XmlText
PsiWhiteSpace('\n ')
PsiErrorElement:Element B is not closed
<empty list>
XmlToken:XML_END_TAG_START('</')
XmlToken:XML_NAME('TD')
XmlToken:XML_TAG_END('>')
XmlText
PsiWhiteSpace('\n ')
XmlToken:XML_END_TAG_START('</')
XmlToken:XML_NAME('TABLE')
XmlToken:XML_TAG_END('>')
XmlText
PsiWhiteSpace('\n')
PsiErrorElement:Element FONT is not closed
<empty list>
XmlToken:XML_END_TAG_START('</')
XmlToken:XML_NAME('FORM')
XmlToken:XML_TAG_END('>')
XmlText
PsiWhiteSpace('\n')
PsiErrorElement:Closing tag matches nothing
XmlToken:XML_END_TAG_START('</')
XmlToken:XML_NAME('P')

View File

@@ -39,7 +39,7 @@ HtmlFile:test.html
XmlToken:XML_START_TAG_START('<')
XmlToken:XML_NAME('TITLE')
XmlToken:XML_TAG_END('>')
XmlText
HtmlRawText
PsiWhiteSpace('\n')
XmlToken:XML_DATA_CHARACTERS('Index')
PsiWhiteSpace(' ')

View File

@@ -159,6 +159,9 @@ public class HtmlParsing {
String tagName = StringUtil.toLowerCase(originalTagName);
while (childTerminatesParentInStack(tagName)) {
IElementType tagElementType = getHtmlTagElementType();
if (!HtmlUtil.isOptionalEndForHtmlTagL(myTagNamesStack.peek())) {
tag.precede().errorBefore(XmlPsiBundle.message("xml.parsing.named.element.is.not.closed", myOriginalTagNamesStack.peek()), tag);
}
PsiBuilder.Marker top = closeTag();
top.doneBefore(tagElementType, tag);
}

View File

@@ -58,12 +58,12 @@ public final class HTMLControls {
ArrayList<Control> controls = new ArrayList<>();
for (Element child : element.getChildren()) {
if ("control".equals(child.getName())) {
Control control = new Control();
control.name = child.getAttributeValue("name");
control.startTag = TagState.valueOf(StringUtil.toUpperCase(child.getAttributeValue("startTag")));
control.endTag = TagState.valueOf(StringUtil.toUpperCase(child.getAttributeValue("endTag")));
control.emptyAllowed = "true".equalsIgnoreCase(child.getAttributeValue("emptyAllowed"));
control.autoClosedBy = autoClosed(child.getAttributeValue("autoClosedBy"));
Control control = new Control(
child.getAttributeValue("name"),
TagState.valueOf(StringUtil.toUpperCase(child.getAttributeValue("startTag"))),
TagState.valueOf(StringUtil.toUpperCase(child.getAttributeValue("endTag"))),
"true".equalsIgnoreCase(child.getAttributeValue("emptyAllowed")),
autoClosed(child.getAttributeValue("autoClosedBy")));
controls.add(control);
}
}
@@ -79,13 +79,21 @@ public final class HTMLControls {
return result;
}
public enum TagState { REQUIRED, OPTIONAL, FORBIDDEN }
public enum TagState {REQUIRED, OPTIONAL, FORBIDDEN}
public static class Control {
public String name;
public TagState startTag;
public TagState endTag;
public boolean emptyAllowed;
public Set<String> autoClosedBy = Collections.emptySet();
public final String name;
public final TagState startTag;
public final TagState endTag;
public final boolean emptyAllowed;
public final Set<String> autoClosedBy;
public Control(String name, TagState startTag, TagState endTag, boolean emptyAllowed, Set<String> autoClosedBy) {
this.name = name;
this.endTag = endTag;
this.startTag = startTag;
this.emptyAllowed = emptyAllowed;
this.autoClosedBy = autoClosedBy;
}
}
}

View File

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8" ?>
<?xml version="1.0" encoding="utf-8" ?>
<htmlControls namespace="System.Web.UI.HtmlControls">
<control name="A" type="HtmlAnchor" startTag="required" endTag="Required" emptyAllowed="false">
<attribute name="href" type="%URL" />
@@ -25,14 +25,14 @@
<control name="body" type="HtmlGenericControl" startTag="optional" endTag="optional" emptyAllowed="false" onlyOnce="true" />
<control name="br" type="HtmlGenericControl" startTag="required" endTag="forbidden" emptyAllowed="true"/>
<control name="button" type="HtmlButton" startTag="required" endTag="required" emptyAllowed="false"/>
<control name="Caption" type="HtmlGenericControl" startTag="required" endTag="required" emptyAllowed="false"/>
<control name="center" type="HtmlGenericControl" startTag="required" endTag="required" emptyAllowed="false"/>
<control name="cite" type="HtmlGenericControl" startTag="required" endTag="required" emptyAllowed="false"/>
<control name="code" type="HtmlGenericControl" startTag="required" endTag="required" emptyAllowed="false"/>
<control name="col" type="HtmlGenericControl" startTag="required" endTag="forbidden" emptyAllowed="true"/>
<control name="colGroup" type="HtmlGenericControl" startTag="required" endTag="optional" emptyAllowed="false" autoClosedBy="colGroup,thead,tbody,tfoot"/>
<control name="DD" type="HtmlGenericControl" startTag="required" endTag="optional" emptyAllowed="false" autoClosedBy="dt, dd"/>
<control name="del" type="HtmlGenericControl" startTag="required" endTag="required" emptyAllowed="false">
<attribute name="cite" type="%URL" />
@@ -42,7 +42,7 @@
<control name="div" type="HtmlGenericControl" startTag="required" endTag="required" emptyAllowed="false"/>
<control name="dl" type="HtmlGenericControl" startTag="required" endTag="required" emptyAllowed="false"/>
<control name="dt" type="HtmlGenericControl" startTag="required" endTag="optional" emptyAllowed="false" autoClosedBy="dt, dd"/>
<control name="EM" type="HtmlGenericControl" startTag="required" endTag="required" emptyAllowed="false"/>
<control name="embed" type="HtmlGenericControl" startTag="required" endTag="forbidden" emptyAllowed="true" />
<control name="FieldSet" type="HtmlGenericControl" startTag="required" endTag="required" emptyAllowed="false"/>
@@ -54,19 +54,19 @@
<attribute name="src" type="%URL" />
</control>
<control name="frameSet" type="HtmlGenericControl" startTag="required" endTag="required" emptyAllowed="false"/>
<control name="H1" type="HtmlGenericControl" startTag="required" endTag="required" emptyAllowed="false"/>
<control name="H2" type="HtmlGenericControl" startTag="required" endTag="required" emptyAllowed="false"/>
<control name="H3" type="HtmlGenericControl" startTag="required" endTag="required" emptyAllowed="false"/>
<control name="H4" type="HtmlGenericControl" startTag="required" endTag="required" emptyAllowed="false"/>
<control name="H5" type="HtmlGenericControl" startTag="required" endTag="required" emptyAllowed="false"/>
<control name="H6" type="HtmlGenericControl" startTag="required" endTag="required" emptyAllowed="false"/>
<control name="H6" type="HtmlGenericControl" startTag="required" endTag="required" emptyAllowed="false"/>
<control name="head" type="HtmlHead" startTag="optional" endTag="optional" emptyAllowed="false" onlyOnce="true" autoClosedBy="body">
<attribute name="profile" type="%URL" />
</control>
<control name="hr" type="HtmlGenericControl" startTag="required" endTag="forbidden" emptyAllowed="true"/>
<control name="html" type="HtmlGenericControl" startTag="optional" endTag="optional" emptyAllowed="false" onlyOnce="true" />
<control name="I" type="HtmlGenericControl" startTag="required" endTag="required" emptyAllowed="false"/>
<control name="IFrame" type="HtmlGenericControl" startTag="required" endTag="required" emptyAllowed="false">
<attribute name="src" type="%URL" />
@@ -88,9 +88,9 @@
<attribute name="cite" type="%URL" />
</control>
<control name="isIndex" type="HtmlGenericControl" startTag="required" endTag="forbidden" emptyAllowed="true"/>
<control name="KBD" type="HtmlGenericControl" startTag="required" endTag="required" emptyAllowed="false"/>
<control name="Label" type="HtmlGenericControl" startTag="required" endTag="required" emptyAllowed="false"/>
<control name="legend" type="HtmlGenericControl" startTag="required" endTag="required" emptyAllowed="false"/>
<control name="li" type="HtmlGenericControl" startTag="required" endTag="optional" emptyAllowed="false" autoClosedBy="li"/>
@@ -106,7 +106,7 @@
<control name="NoFrames" type="HtmlGenericControl" startTag="required" endTag="required" emptyAllowed="false"/>
<control name="noScript" type="HtmlGenericControl" startTag="required" endTag="required" emptyAllowed="false"/>
<control name="nobr" type="HtmlGenericControl" startTag="required" endTag="required" emptyAllowed="false"/>
<control name="Object" type="HtmlGenericControl" startTag="required" endTag="required" emptyAllowed="false">
<attribute name="classid" type="%URL" />
<attribute name="codebase" type="%URL" />
@@ -116,11 +116,12 @@
</control>
<control name="ol" type="HtmlGenericControl" startTag="required" endTag="required" emptyAllowed="false"/>
<control name="option" type="HtmlGenericControl" startTag="required" endTag="optional" emptyAllowed="false" autoClosedBy="option,optgroup"/>
<control name="P" type="HtmlGenericControl" startTag="required" endTag="optional" emptyAllowed="false" autoClosedBy="p"/>
<control name="P" type="HtmlGenericControl" startTag="required" endTag="optional" emptyAllowed="false"
autoClosedBy="address,article,aside,blockquote,details,div,dl,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,hr,main,menu,nav,ol,p,pre,section,table,ul"/>
<control name="param" type="HtmlGenericControl" startTag="required" endTag="forbidden" emptyAllowed="true"/>
<control name="pre" type="HtmlGenericControl" startTag="required" endTag="required" emptyAllowed="false"/>
<control name="Q" type="HtmlGenericControl" startTag="required" endTag="required" emptyAllowed="false">
<attribute name="cite" type="%URL" />
</control>
@@ -139,7 +140,7 @@
<control name="style" type="HtmlGenericControl" startTag="required" endTag="required" emptyAllowed="false"/>
<control name="sub" type="HtmlGenericControl" startTag="required" endTag="required" emptyAllowed="false"/>
<control name="sup" type="HtmlGenericControl" startTag="required" endTag="required" emptyAllowed="false"/>
<control name="Table" type="HtmlTable" startTag="required" endTag="required" emptyAllowed="false"/>
<control name="tbody" type="HtmlGenericControl" startTag="optional" endTag="optional" emptyAllowed="false" autoClosedBy="tfoot, thead, tbody"/>
<control name="td" type="HtmlTableCell" startTag="required" endTag="optional" emptyAllowed="false" autoClosedBy="td, th"/>
@@ -151,10 +152,10 @@
<control name="tr" type="HtmlTableRow" startTag="required" endTag="optional" emptyAllowed="false" autoClosedBy="tr"/>
<control name="track" type="HtmlGenericControl" startTag="required" endTag="forbidden" emptyAllowed="true" />
<control name="tt" type="HtmlGenericControl" startTag="required" endTag="required" emptyAllowed="false"/>
<control name="U" type="HtmlGenericControl" startTag="required" endTag="required" emptyAllowed="false"/>
<control name="UL" type="HtmlGenericControl" startTag="required" endTag="required" emptyAllowed="false"/>
<control name="VAR" type="HtmlGenericControl" startTag="required" endTag="required" emptyAllowed="false"/>
<control name="wbr" type="HtmlGenericControl" startTag="required" endTag="forbidden" emptyAllowed="true"/>
</htmlControls>