diff --git a/mozilla/htmlparser/src/CNavDTD.cpp b/mozilla/htmlparser/src/CNavDTD.cpp
index 40fa3c64f62..f921264a22f 100644
--- a/mozilla/htmlparser/src/CNavDTD.cpp
+++ b/mozilla/htmlparser/src/CNavDTD.cpp
@@ -1001,6 +1001,88 @@ PRBool CNavDTD::CanContainFormElement(eHTMLTags aParent,eHTMLTags aChild) const
return result;
}
+ /***********************************************************************************
+ The following tables determine the set of elements each tag can contain...
+ ***********************************************************************************/
+
+static char gTagSet1[]={
+ eHTMLTag_a, eHTMLTag_acronym, eHTMLTag_address, eHTMLTag_applet,
+ eHTMLTag_blink, eHTMLTag_b, eHTMLTag_basefont, eHTMLTag_bdo,
+ eHTMLTag_big,
+ eHTMLTag_blockquote,eHTMLTag_br, eHTMLTag_button, eHTMLTag_center,
+ eHTMLTag_cite, eHTMLTag_code, eHTMLTag_dfn, eHTMLTag_dir,
+ eHTMLTag_div, eHTMLTag_dl, eHTMLTag_em, eHTMLTag_fieldset,
+ eHTMLTag_embed,
+ eHTMLTag_font, eHTMLTag_form, eHTMLTag_h1, eHTMLTag_h2,
+ eHTMLTag_h3, eHTMLTag_h4, eHTMLTag_h5, eHTMLTag_h6,
+ eHTMLTag_hr, eHTMLTag_i, eHTMLTag_iframe, eHTMLTag_img,
+ eHTMLTag_input, eHTMLTag_isindex,
+
+ eHTMLTag_kbd, eHTMLTag_label, eHTMLTag_li,
+ eHTMLTag_map, eHTMLTag_menu, eHTMLTag_newline, eHTMLTag_nobr,
+ eHTMLTag_noframes, eHTMLTag_noscript,
+ eHTMLTag_object, eHTMLTag_ol, eHTMLTag_p, eHTMLTag_pre,
+ eHTMLTag_q, eHTMLTag_s, eHTMLTag_strike,
+ eHTMLTag_samp, eHTMLTag_script, eHTMLTag_select, eHTMLTag_small,
+ eHTMLTag_spacer, eHTMLTag_span, eHTMLTag_strong,
+ eHTMLTag_sub, eHTMLTag_sup, eHTMLTag_table, eHTMLTag_text,
+
+ eHTMLTag_textarea, eHTMLTag_tt, eHTMLTag_u, eHTMLTag_ul,
+ eHTMLTag_userdefined, eHTMLTag_var, eHTMLTag_wbr,
+ eHTMLTag_whitespace,
+ 0};
+
+static char gTagSet2[]={
+ eHTMLTag_a, eHTMLTag_acronym, eHTMLTag_applet, eHTMLTag_blink,
+ eHTMLTag_b,
+ eHTMLTag_basefont, eHTMLTag_bdo, eHTMLTag_big, eHTMLTag_br,
+ eHTMLTag_button, eHTMLTag_cite, eHTMLTag_code, eHTMLTag_dfn,
+ eHTMLTag_div, eHTMLTag_em, eHTMLTag_font, eHTMLTag_hr,
+ eHTMLTag_embed,
+ eHTMLTag_i, eHTMLTag_iframe, eHTMLTag_img, eHTMLTag_input,
+ eHTMLTag_kbd,
+
+ eHTMLTag_label, eHTMLTag_map, eHTMLTag_newline, eHTMLTag_nobr,
+ eHTMLTag_object, eHTMLTag_p,
+ eHTMLTag_q, eHTMLTag_s, eHTMLTag_strike,
+ eHTMLTag_samp, eHTMLTag_script, eHTMLTag_select, eHTMLTag_small,
+ eHTMLTag_spacer, eHTMLTag_span, eHTMLTag_strong,
+ eHTMLTag_sub, eHTMLTag_sup, eHTMLTag_text, eHTMLTag_textarea,
+
+ eHTMLTag_table,// XXX kipp was here
+
+ eHTMLTag_tt, eHTMLTag_u, eHTMLTag_userdefined, eHTMLTag_var,
+ eHTMLTag_wbr, eHTMLTag_whitespace,
+ 0};
+
+static char gTagSet3[]={
+ eHTMLTag_a, eHTMLTag_acronym, eHTMLTag_applet, eHTMLTag_blink,
+ eHTMLTag_b,
+ eHTMLTag_bdo, eHTMLTag_big, eHTMLTag_br, eHTMLTag_blockquote,
+ eHTMLTag_body, eHTMLTag_caption, eHTMLTag_center, eHTMLTag_cite,
+ eHTMLTag_code, eHTMLTag_dd, eHTMLTag_del, eHTMLTag_dfn,
+ eHTMLTag_div, eHTMLTag_dt, eHTMLTag_em, eHTMLTag_fieldset,
+ eHTMLTag_embed,
+ eHTMLTag_font, eHTMLTag_form, eHTMLTag_h1, eHTMLTag_h2,
+ eHTMLTag_h3, eHTMLTag_h4, eHTMLTag_h5, eHTMLTag_h6,
+ eHTMLTag_i, eHTMLTag_iframe, eHTMLTag_ins, eHTMLTag_kbd,
+
+ eHTMLTag_label, eHTMLTag_legend, eHTMLTag_li, eHTMLTag_newline,
+
+ eHTMLTag_noframes,
+ eHTMLTag_noscript, eHTMLTag_object, eHTMLTag_p, eHTMLTag_pre,
+ eHTMLTag_q, eHTMLTag_s, eHTMLTag_strike,
+ eHTMLTag_samp, eHTMLTag_small, eHTMLTag_spacer,
+ eHTMLTag_span, eHTMLTag_strong, eHTMLTag_sub, eHTMLTag_sup,
+ eHTMLTag_td, eHTMLTag_text,
+
+ eHTMLTag_th, eHTMLTag_tt, eHTMLTag_u, eHTMLTag_userdefined,
+ eHTMLTag_var, eHTMLTag_wbr, eHTMLTag_whitespace,
+ 0};
+
+ /***********************************************************************************
+ The preceeding tables determine the set of elements each tag can contain...
+ ***********************************************************************************/
/**
* This method is called to determine whether or not a tag
@@ -1015,81 +1097,6 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) {
PRBool result=PR_FALSE;
- static char gTagSet1[]={
- eHTMLTag_a, eHTMLTag_acronym, eHTMLTag_address, eHTMLTag_applet,
- eHTMLTag_blink, eHTMLTag_b, eHTMLTag_basefont, eHTMLTag_bdo,
- eHTMLTag_big,
- eHTMLTag_blockquote,eHTMLTag_br, eHTMLTag_button, eHTMLTag_center,
- eHTMLTag_cite, eHTMLTag_code, eHTMLTag_dfn, eHTMLTag_dir,
- eHTMLTag_div, eHTMLTag_dl, eHTMLTag_em, eHTMLTag_fieldset,
- eHTMLTag_embed,
- eHTMLTag_font, eHTMLTag_form, eHTMLTag_h1, eHTMLTag_h2,
- eHTMLTag_h3, eHTMLTag_h4, eHTMLTag_h5, eHTMLTag_h6,
- eHTMLTag_hr, eHTMLTag_i, eHTMLTag_iframe, eHTMLTag_img,
- eHTMLTag_input, eHTMLTag_isindex,
-
- eHTMLTag_kbd, eHTMLTag_label, eHTMLTag_li,
- eHTMLTag_map, eHTMLTag_menu, eHTMLTag_newline, eHTMLTag_nobr,
- eHTMLTag_noframes, eHTMLTag_noscript,
- eHTMLTag_object, eHTMLTag_ol, eHTMLTag_p, eHTMLTag_pre,
- eHTMLTag_q, eHTMLTag_s, eHTMLTag_strike,
- eHTMLTag_samp, eHTMLTag_script, eHTMLTag_select, eHTMLTag_small,
- eHTMLTag_spacer, eHTMLTag_span, eHTMLTag_strong,
- eHTMLTag_sub, eHTMLTag_sup, eHTMLTag_table, eHTMLTag_text,
-
- eHTMLTag_textarea, eHTMLTag_tt, eHTMLTag_u, eHTMLTag_ul,
- eHTMLTag_userdefined, eHTMLTag_var,
- eHTMLTag_whitespace,
- 0};
-
- static char gTagSet2[]={
- eHTMLTag_a, eHTMLTag_acronym, eHTMLTag_applet, eHTMLTag_blink,
- eHTMLTag_b,
- eHTMLTag_basefont, eHTMLTag_bdo, eHTMLTag_big, eHTMLTag_br,
- eHTMLTag_button, eHTMLTag_cite, eHTMLTag_code, eHTMLTag_dfn,
- eHTMLTag_div, eHTMLTag_em, eHTMLTag_font, eHTMLTag_hr,
- eHTMLTag_embed,
- eHTMLTag_i, eHTMLTag_iframe, eHTMLTag_img, eHTMLTag_input,
- eHTMLTag_kbd,
-
- eHTMLTag_label, eHTMLTag_map, eHTMLTag_newline, eHTMLTag_nobr,
- eHTMLTag_object, eHTMLTag_p,
- eHTMLTag_q, eHTMLTag_s, eHTMLTag_strike,
- eHTMLTag_samp, eHTMLTag_script, eHTMLTag_select, eHTMLTag_small,
- eHTMLTag_spacer, eHTMLTag_span, eHTMLTag_strong,
- eHTMLTag_sub, eHTMLTag_sup, eHTMLTag_text, eHTMLTag_textarea,
-
- eHTMLTag_table,// XXX kipp was here
-
- eHTMLTag_tt, eHTMLTag_u, eHTMLTag_userdefined, eHTMLTag_var,
- eHTMLTag_whitespace,
- 0};
-
- static char gTagSet3[]={
- eHTMLTag_a, eHTMLTag_acronym, eHTMLTag_applet, eHTMLTag_blink,
- eHTMLTag_b,
- eHTMLTag_bdo, eHTMLTag_big, eHTMLTag_br, eHTMLTag_blockquote,
- eHTMLTag_body, eHTMLTag_caption, eHTMLTag_center, eHTMLTag_cite,
- eHTMLTag_code, eHTMLTag_dd, eHTMLTag_del, eHTMLTag_dfn,
- eHTMLTag_div, eHTMLTag_dt, eHTMLTag_em, eHTMLTag_fieldset,
- eHTMLTag_embed,
- eHTMLTag_font, eHTMLTag_form, eHTMLTag_h1, eHTMLTag_h2,
- eHTMLTag_h3, eHTMLTag_h4, eHTMLTag_h5, eHTMLTag_h6,
- eHTMLTag_i, eHTMLTag_iframe, eHTMLTag_ins, eHTMLTag_kbd,
-
- eHTMLTag_label, eHTMLTag_legend, eHTMLTag_li, eHTMLTag_newline,
-
- eHTMLTag_noframes,
- eHTMLTag_noscript, eHTMLTag_object, eHTMLTag_p, eHTMLTag_pre,
- eHTMLTag_q, eHTMLTag_s, eHTMLTag_strike,
- eHTMLTag_samp, eHTMLTag_small, eHTMLTag_spacer,
- eHTMLTag_span, eHTMLTag_strong, eHTMLTag_sub, eHTMLTag_sup,
- eHTMLTag_td, eHTMLTag_text,
-
- eHTMLTag_th, eHTMLTag_tt, eHTMLTag_u, eHTMLTag_userdefined,
- eHTMLTag_var, eHTMLTag_whitespace,
- 0};
-
//This hack code is here because we don't yet know what to do
//with userdefined tags... XXX Hack
if(eHTMLTag_userdefined==aChild) // XXX Hack: For now...
@@ -1150,7 +1157,16 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) {
case eHTMLTag_tt:
case eHTMLTag_u:
case eHTMLTag_var:
- result=PRBool(0!=strchr(gTagSet1,aChild));
+ {
+ static char listtags[]={eHTMLTag_li,0};
+
+ if(0!=strchr(listtags,aChild)) {
+ //This code was added to enforce the rule that listitems autoclose prior listitems.
+ //Stylistic tags (including ) that get in the way are simply out of luck.
+ result=false;
+ }
+ else result=PRBool(0!=strchr(gTagSet1,aChild));
+ }
break;
case eHTMLTag_blockquote:
@@ -1173,14 +1189,24 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) {
case eHTMLTag_colgroup:
break; //singletons can't contain anything...
- case eHTMLTag_dd:
case eHTMLTag_dt:
+ {
+ static char datalistTags[]={eHTMLTag_dt,eHTMLTag_dd,0};
+
+ if(0!=strchr(datalistTags,aChild)) {
+ result=PR_TRUE;
+ }
+ else result=PRBool(0!=strchr(gTagSet1,aChild)); break;
+ }
+ break;
+
+ case eHTMLTag_dd:
case eHTMLTag_div:
result=PRBool(0!=strchr(gTagSet1,aChild)); break;
case eHTMLTag_dl:
{
- char okTags[]={eHTMLTag_dd,eHTMLTag_dt,eHTMLTag_whitespace,eHTMLTag_newline,0};
+ char okTags[]={eHTMLTag_dd,eHTMLTag_dt,eHTMLTag_whitespace,eHTMLTag_newline,eHTMLTag_p,0};
result=PRBool(0!=strchr(okTags,aChild));
}
break;
@@ -1232,6 +1258,11 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) {
break;
case eHTMLTag_iframe:/* XXX wrong */
+ if(eHTMLTag_frame==aChild)
+ result=PR_FALSE;
+ else result=PRBool(0!=strchr(gTagSet1,aChild));
+ break;
+
case eHTMLTag_label:
case eHTMLTag_legend:/* XXX not sure */
result=PRBool(0!=strchr(gTagSet1,aChild)); break;
@@ -1284,9 +1315,18 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) {
result=PRBool(eHTMLTag_option!=aChild); break;
case eHTMLTag_p:
- if(eHTMLTag_p==aChild)
- result=PR_FALSE;
- else result=PRBool(0!=strchr(gTagSet2,aChild)); break;
+ {
+ static char datalistTags[]={eHTMLTag_dt,eHTMLTag_dd,0};
+
+ if(eHTMLTag_p==aChild)
+ result=PR_FALSE;
+ else if(0!=strchr(datalistTags,aChild)) {
+ //we now allow DT/DD inside a paragraph, so long as a DL is open...
+ if(PR_TRUE==HasOpenContainer(eHTMLTag_dl))
+ result=PR_TRUE;
+ }
+ else result=PRBool(0!=strchr(gTagSet2,aChild)); break;
+ }
break;
case eHTMLTag_object:
@@ -1456,7 +1496,7 @@ PRBool CNavDTD::CanOmit(eHTMLTags aParent,eHTMLTags aChild) const {
break;
case eHTMLTag_entity:
- switch((eHTMLTags)aParent) {
+ switch(aParent) {
case eHTMLTag_tr: case eHTMLTag_table:
case eHTMLTag_thead: case eHTMLTag_tfoot:
case eHTMLTag_tbody:
@@ -1466,6 +1506,11 @@ PRBool CNavDTD::CanOmit(eHTMLTags aParent,eHTMLTags aChild) const {
} //switch
break;
+ case eHTMLTag_frame:
+ if(eHTMLTag_iframe==aParent)
+ result=PR_TRUE;
+ break;
+
default:
if(eHTMLTag_unknown==aParent)
result=PR_FALSE;
@@ -2719,7 +2764,7 @@ CNavDTD::ConsumeContentToEndTag(const nsString& aString,
* @return new token or null
*/
-static char gSpecialTags[]={ eHTMLTag_script, eHTMLTag_style, eHTMLTag_title, eHTMLTag_textarea, 0};
+static char gSkippedContentTags[]={ eHTMLTag_script, eHTMLTag_style, eHTMLTag_title, eHTMLTag_textarea, 0};
nsresult
CNavDTD::ConsumeStartTag(PRUnichar aChar,CScanner& aScanner,CToken*& aToken) {
@@ -2741,7 +2786,7 @@ CNavDTD::ConsumeStartTag(PRUnichar aChar,CScanner& aScanner,CToken*& aToken) {
eHTMLTags theTag=(eHTMLTags)aToken->GetTypeID();
- if(0!=strchr(gSpecialTags,theTag)){
+ if(0!=strchr(gSkippedContentTags,theTag)){
//Do special case handling for