fixed containment bugs, which corrects problems with www.majorleaguebaseball.com

This commit is contained in:
rickg%netscape.com 1998-11-21 21:06:29 +00:00
Родитель f4fa3f7761
Коммит 26b91f6d09
2 изменённых файлов: 458 добавлений и 298 удалений

Просмотреть файл

@ -78,12 +78,14 @@ static eHTMLTags gStyleTags[]={
static eHTMLTags gNonContainers[]={
eHTMLTag_area, eHTMLTag_base, eHTMLTag_basefont,
eHTMLTag_br, eHTMLTag_col, eHTMLTag_embed,
eHTMLTag_frame, eHTMLTag_hr, eHTMLTag_whitespace,
eHTMLTag_input, eHTMLTag_link, eHTMLTag_isindex,
eHTMLTag_bgsound, eHTMLTag_br, eHTMLTag_col,
eHTMLTag_embed, eHTMLTag_frame, eHTMLTag_img,
eHTMLTag_keygen, eHTMLTag_hr, eHTMLTag_input,
eHTMLTag_link, eHTMLTag_isindex,
eHTMLTag_meta, eHTMLTag_param, eHTMLTag_plaintext,
eHTMLTag_style, eHTMLTag_spacer, eHTMLTag_wbr,
eHTMLTag_newline, eHTMLTag_text, eHTMLTag_img,
eHTMLTag_sound, eHTMLTag_style, eHTMLTag_spacer,
eHTMLTag_wbr,
eHTMLTag_newline, eHTMLTag_text, eHTMLTag_whitespace,
eHTMLTag_unknown, eHTMLTag_xmp};
static eHTMLTags gTableTags[]={
@ -94,6 +96,178 @@ static eHTMLTags gWhitespaceTags[]={
eHTMLTag_newline, eHTMLTag_whitespace};
static eHTMLTags gBlockParentTags []={
eHTMLTag_applet, eHTMLTag_basefont, eHTMLTag_blockquote,
eHTMLTag_body, eHTMLTag_center, eHTMLTag_dd,
eHTMLTag_div, eHTMLTag_embed, eHTMLTag_fieldset,
eHTMLTag_form, eHTMLTag_iframe, eHTMLTag_layer,
eHTMLTag_li, eHTMLTag_listing, eHTMLTag_multicol,
eHTMLTag_noembed, eHTMLTag_noframes, eHTMLTag_nolayer,
eHTMLTag_noscript, eHTMLTag_object, eHTMLTag_plaintext,
eHTMLTag_pre, eHTMLTag_td, eHTMLTag_th,
eHTMLTag_ul,
eHTMLTag_xmp,
};
static eHTMLTags gBlockChildTags []={
eHTMLTag_a, eHTMLTag_abbr, eHTMLTag_acronym, eHTMLTag_address, eHTMLTag_applet,
eHTMLTag_b, eHTMLTag_basefont, eHTMLTag_bdo, eHTMLTag_bgsound, eHTMLTag_big,
eHTMLTag_blink, eHTMLTag_blockquote, eHTMLTag_br, eHTMLTag_button,
eHTMLTag_center, eHTMLTag_cite, eHTMLTag_code,
eHTMLTag_del, eHTMLTag_dfn, eHTMLTag_dir, eHTMLTag_div, eHTMLTag_dl,
eHTMLTag_em, eHTMLTag_embed,
eHTMLTag_fieldset, eHTMLTag_font, eHTMLTag_form,
eHTMLTag_h1, eHTMLTag_h2, eHTMLTag_h3,
eHTMLTag_h4, eHTMLTag_h5, eHTMLTag_h6,
eHTMLTag_hr,
eHTMLTag_i, eHTMLTag_iframe, eHTMLTag_ilayer, eHTMLTag_img,
eHTMLTag_ins, eHTMLTag_isindex, eHTMLTag_input,
eHTMLTag_kbd,
eHTMLTag_label, eHTMLTag_layer, eHTMLTag_listing,
eHTMLTag_map, /*eHTMLTag_marque,*/ eHTMLTag_menu, eHTMLTag_multicol,
eHTMLTag_nobr, eHTMLTag_noembed, eHTMLTag_noframes, eHTMLTag_nolayer, eHTMLTag_noscript,
eHTMLTag_object, eHTMLTag_ol,
eHTMLTag_p, eHTMLTag_plaintext, eHTMLTag_pre,
eHTMLTag_q,
eHTMLTag_s, eHTMLTag_samp, eHTMLTag_script, eHTMLTag_select, eHTMLTag_small,
eHTMLTag_sound, eHTMLTag_spacer, eHTMLTag_span, eHTMLTag_strike, eHTMLTag_strong,
eHTMLTag_sub, eHTMLTag_sup,
eHTMLTag_table, eHTMLTag_textarea, eHTMLTag_tt,
eHTMLTag_u, eHTMLTag_ul, eHTMLTag_userdefined,
eHTMLTag_var, eHTMLTag_wbr, eHTMLTag_xmp,
//a few special cases...
eHTMLTag_newline,
eHTMLTag_whitespace,
};
static eHTMLTags gInlineParentTags []={
eHTMLTag_a, eHTMLTag_abbr, eHTMLTag_address,
eHTMLTag_b, eHTMLTag_bdo, eHTMLTag_big,
eHTMLTag_blink, eHTMLTag_button, eHTMLTag_caption,
eHTMLTag_cite, eHTMLTag_code, eHTMLTag_dfn,
eHTMLTag_dt, eHTMLTag_em, eHTMLTag_font,
eHTMLTag_h1, eHTMLTag_h2, eHTMLTag_h3,
eHTMLTag_h4, eHTMLTag_h5, eHTMLTag_h6,
eHTMLTag_i, eHTMLTag_ilayer, eHTMLTag_kbd,
eHTMLTag_label, eHTMLTag_legend, /*eHTMLTag_marquee,*/
eHTMLTag_nobr, eHTMLTag_ol, eHTMLTag_p,
eHTMLTag_q,
eHTMLTag_s, eHTMLTag_samp, eHTMLTag_small,
eHTMLTag_span, eHTMLTag_strike, eHTMLTag_strong,
eHTMLTag_sub, eHTMLTag_sup,
eHTMLTag_td, eHTMLTag_th, eHTMLTag_tt,
eHTMLTag_u, eHTMLTag_ul, eHTMLTag_var
};
static eHTMLTags gInlineChildTags []={
eHTMLTag_a, eHTMLTag_abbr, eHTMLTag_acronym, eHTMLTag_applet,
eHTMLTag_b, eHTMLTag_bdo, eHTMLTag_bgsound, eHTMLTag_big, eHTMLTag_blink,
eHTMLTag_br, eHTMLTag_button,
eHTMLTag_cite, eHTMLTag_code,
eHTMLTag_dfn,
eHTMLTag_em, eHTMLTag_embed,
eHTMLTag_font,
eHTMLTag_i, eHTMLTag_iframe, eHTMLTag_ilayer, eHTMLTag_img, eHTMLTag_input,
eHTMLTag_kbd,
eHTMLTag_label, eHTMLTag_li,
eHTMLTag_map,
eHTMLTag_nobr,
eHTMLTag_object,
eHTMLTag_p,
eHTMLTag_pre,
eHTMLTag_q,
eHTMLTag_s, eHTMLTag_samp, eHTMLTag_script, eHTMLTag_select, eHTMLTag_small,
eHTMLTag_sound, eHTMLTag_spacer, eHTMLTag_span, eHTMLTag_strike, eHTMLTag_strong,
eHTMLTag_sub, eHTMLTag_sup,
eHTMLTag_textarea,eHTMLTag_tt,
eHTMLTag_u,
eHTMLTag_var,
eHTMLTag_wbr,
eHTMLTag_text,
eHTMLTag_newline,
eHTMLTag_whitespace,
};
//This is a convenience set, which combines block AND inline child lists...
static eHTMLTags gBlockAndInlineChildTags []={
eHTMLTag_a, eHTMLTag_abbr, eHTMLTag_acronym, eHTMLTag_address, eHTMLTag_applet,
eHTMLTag_b, eHTMLTag_basefont, eHTMLTag_bdo, eHTMLTag_bgsound, eHTMLTag_big,
eHTMLTag_blink, eHTMLTag_blockquote, eHTMLTag_br, eHTMLTag_button,
eHTMLTag_center, eHTMLTag_cite, eHTMLTag_code,
eHTMLTag_dfn, eHTMLTag_del, eHTMLTag_dir, eHTMLTag_div, eHTMLTag_dl,
eHTMLTag_em, eHTMLTag_embed,
eHTMLTag_fieldset, eHTMLTag_font, eHTMLTag_form,
eHTMLTag_h1, eHTMLTag_h2, eHTMLTag_h3,
eHTMLTag_h4, eHTMLTag_h5, eHTMLTag_h6,
eHTMLTag_hr,
eHTMLTag_i, eHTMLTag_iframe, eHTMLTag_ilayer, eHTMLTag_img,
eHTMLTag_ins, eHTMLTag_isindex, eHTMLTag_input,
eHTMLTag_kbd,
eHTMLTag_label, eHTMLTag_layer, eHTMLTag_li, eHTMLTag_listing,
eHTMLTag_map, /*eHTMLTag_marque,*/ eHTMLTag_menu, eHTMLTag_multicol,
eHTMLTag_nobr, eHTMLTag_noembed, eHTMLTag_noframes, eHTMLTag_nolayer, eHTMLTag_noscript,
eHTMLTag_object, eHTMLTag_ol,
eHTMLTag_p, eHTMLTag_plaintext, eHTMLTag_pre,
eHTMLTag_q,
eHTMLTag_s, eHTMLTag_samp, eHTMLTag_script, eHTMLTag_select, eHTMLTag_small,
eHTMLTag_sound, eHTMLTag_spacer, eHTMLTag_span, eHTMLTag_strike, eHTMLTag_strong,
eHTMLTag_sub, eHTMLTag_sup,
eHTMLTag_table, eHTMLTag_textarea,
eHTMLTag_tt, eHTMLTag_u, eHTMLTag_ul, eHTMLTag_userdefined,
eHTMLTag_var, eHTMLTag_wbr, eHTMLTag_xmp,
//a few special cases...
eHTMLTag_text,
eHTMLTag_newline,
eHTMLTag_whitespace,
};
static eHTMLTags gPREChildTags []={
eHTMLTag_a, eHTMLTag_abbr, eHTMLTag_acronym,
eHTMLTag_b, eHTMLTag_bdo, eHTMLTag_bgsound,
eHTMLTag_br, eHTMLTag_button,
eHTMLTag_cite, eHTMLTag_code, eHTMLTag_dfn,
eHTMLTag_em, eHTMLTag_embed,
eHTMLTag_i, eHTMLTag_ilayer, eHTMLTag_input,
eHTMLTag_kbd, eHTMLTag_label, eHTMLTag_li,
eHTMLTag_map, eHTMLTag_q,
eHTMLTag_s, eHTMLTag_samp, eHTMLTag_script, eHTMLTag_select,
eHTMLTag_sound, eHTMLTag_spacer, eHTMLTag_span, eHTMLTag_strike, eHTMLTag_strong,
eHTMLTag_textarea,eHTMLTag_tt,
eHTMLTag_u, eHTMLTag_var, eHTMLTag_wbr,
eHTMLTag_text, eHTMLTag_newline, eHTMLTag_whitespace,
};
static eHTMLTags gHeadChildTags []={
eHTMLTag_base, eHTMLTag_bgsound, eHTMLTag_isindex,
eHTMLTag_link, eHTMLTag_meta, /*eHTMLTag_nextid,*/
eHTMLTag_script, eHTMLTag_sound, eHTMLTag_style,
eHTMLTag_title
};
static eHTMLTags gFormChildTags []={
eHTMLTag_button, eHTMLTag_input, eHTMLTag_keygen,
eHTMLTag_label, eHTMLTag_select, eHTMLTag_textarea
};
static CTokenRecycler gTokenRecycler;
@ -1196,7 +1370,9 @@ static eHTMLTags gTagSet3[]={
*/
PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const {
PRBool result=!IsContainer(aParent);
PRBool result=PR_FALSE;
if(!IsContainer(aParent))
return result;
/***************************************************************************
@ -1232,18 +1408,24 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const {
result=PR_FALSE;
}
else
result=FindTagInSet(aChild,gTagSet1,sizeof(gTagSet1)/sizeof(eHTMLTag_unknown));
result=FindTagInSet(aChild,gBlockAndInlineChildTags,sizeof(gBlockAndInlineChildTags)/sizeof(eHTMLTag_unknown));
}
else {
switch((eHTMLTags)aParent) {
case eHTMLTag_abbr:
if(aParent!=aChild)
result=FindTagInSet(aChild,gInlineChildTags,sizeof(gInlineChildTags)/sizeof(eHTMLTag_unknown));
break;
case eHTMLTag_blockquote:
case eHTMLTag_body:
case eHTMLTag_ilayer:
case eHTMLTag_layer:
if(eHTMLTag_userdefined==aChild)
result=PR_TRUE;
else
result=FindTagInSet(aChild,gTagSet1,sizeof(gTagSet1)/sizeof(eHTMLTag_unknown));
result=FindTagInSet(aChild,gBlockAndInlineChildTags,sizeof(gBlockAndInlineChildTags)/sizeof(eHTMLTag_unknown));
break;
case eHTMLTag_button:
@ -1257,11 +1439,11 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const {
case eHTMLTag_menu: case eHTMLTag_noscript:
case eHTMLTag_ol: case eHTMLTag_ul:
case eHTMLTag_embed: case eHTMLTag_noembed:
result=FindTagInSet(aChild,gTagSet1,sizeof(gTagSet1)/sizeof(eHTMLTag_unknown));
result=FindTagInSet(aChild,gBlockAndInlineChildTags,sizeof(gBlockAndInlineChildTags)/sizeof(eHTMLTag_unknown));
break;
case eHTMLTag_dd:
result=(eHTMLTag_dt==aChild) ? PR_FALSE: FindTagInSet(aChild,gTagSet1,sizeof(gTagSet1)/sizeof(eHTMLTag_unknown));
result=(eHTMLTag_dt==aChild) ? PR_FALSE: FindTagInSet(aChild,gBlockAndInlineChildTags,sizeof(gBlockAndInlineChildTags)/sizeof(eHTMLTag_unknown));
break;
case eHTMLTag_colgroup:
@ -1272,7 +1454,7 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const {
{
if(eHTMLTag_dt==aChild)
result=PR_TRUE;
else result=FindTagInSet(aChild,gTagSet1,sizeof(gTagSet1)/sizeof(eHTMLTag_unknown));
else result=FindTagInSet(aChild,gBlockAndInlineChildTags,sizeof(gBlockAndInlineChildTags)/sizeof(eHTMLTag_unknown));
}
break;
@ -1288,7 +1470,7 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const {
if(eHTMLTag_legend==aChild)
result=PR_TRUE;
else
result=FindTagInSet(aChild,gTagSet1,sizeof(gTagSet1)/sizeof(eHTMLTag_unknown));
result=FindTagInSet(aChild,gBlockAndInlineChildTags,sizeof(gBlockAndInlineChildTags)/sizeof(eHTMLTag_unknown));
break;
case eHTMLTag_frameset:
@ -1305,7 +1487,7 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const {
{
if(FindTagInSet(aChild,gHeadingTags,sizeof(gHeadingTags)/sizeof(eHTMLTag_unknown)))
result=PR_FALSE;
else result=FindTagInSet(aChild,gTagSet1,sizeof(gTagSet1)/sizeof(eHTMLTag_unknown));
else result=FindTagInSet(aChild,gBlockAndInlineChildTags,sizeof(gBlockAndInlineChildTags)/sizeof(eHTMLTag_unknown));
}
break;
@ -1329,7 +1511,7 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const {
if(eHTMLTag_frame==aChild)
result=PR_FALSE;
else
result=FindTagInSet(aChild,gTagSet1,sizeof(gTagSet1)/sizeof(eHTMLTag_unknown));
result=FindTagInSet(aChild,gBlockAndInlineChildTags,sizeof(gBlockAndInlineChildTags)/sizeof(eHTMLTag_unknown));
break;
case eHTMLTag_li:
@ -1346,11 +1528,23 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const {
}
break;
case eHTMLTag_multicol:
if(aParent!=aChild) {
result=FindTagInSet(aChild,gInlineChildTags,sizeof(gInlineChildTags)/sizeof(eHTMLTag_unknown));
if(PR_FALSE==result)
result=FindTagInSet(aChild,gBlockChildTags,sizeof(gBlockChildTags)/sizeof(eHTMLTag_unknown));
}
break;
case eHTMLTag_nolayer:
result=FindTagInSet(aChild,gBlockAndInlineChildTags,sizeof(gBlockAndInlineChildTags)/sizeof(eHTMLTag_unknown));
break;
case eHTMLTag_noframes:
if(eHTMLTag_body==aChild)
result=PR_TRUE;
else
result=FindTagInSet(aChild,gTagSet1,sizeof(gTagSet1)/sizeof(eHTMLTag_unknown));
result=FindTagInSet(aChild,gBlockAndInlineChildTags,sizeof(gBlockAndInlineChildTags)/sizeof(eHTMLTag_unknown));
break;
case eHTMLTag_option:
@ -1358,6 +1552,11 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const {
result=PRBool(eHTMLTag_option!=aChild);
break;
case eHTMLTag_optgroup:
//for now, allow an optgroup to hold itself and options...
result=PRBool((eHTMLTag_option==aChild) || (aParent==aChild));
break;
case eHTMLTag_p:
{
static eHTMLTags datalistTags[]={eHTMLTag_dt,eHTMLTag_dd};
@ -1392,6 +1591,11 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const {
result=FindTagInSet(aChild,gTagSet2,sizeof(gTagSet2)/sizeof(eHTMLTag_unknown));
break;
case eHTMLTag_script:
//for now, allow an optgroup to hold itself and options...
result=PRBool((eHTMLTag_text==aChild) || (eHTMLTag_comment==aChild));
break;
case eHTMLTag_table:
{
static eHTMLTags okTags[]={
@ -1412,13 +1616,21 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const {
}
break;
case eHTMLTag_title:
case eHTMLTag_textarea:
{
static eHTMLTags okTags[]={eHTMLTag_text,eHTMLTag_whitespace,eHTMLTag_newline};
result=FindTagInSet(aChild,okTags,sizeof(okTags)/sizeof(eHTMLTag_unknown));
}
break;
case eHTMLTag_th:
case eHTMLTag_td:
{
static eHTMLTags okTags[]={eHTMLTag_newline,eHTMLTag_map};
result=FindTagInSet(aChild,okTags,sizeof(okTags)/sizeof(eHTMLTag_unknown));
if(PR_FALSE==result)
result=FindTagInSet(aChild,gTagSet1,sizeof(gTagSet1)/sizeof(eHTMLTag_unknown));
result=FindTagInSet(aChild,gBlockAndInlineChildTags,sizeof(gBlockAndInlineChildTags)/sizeof(eHTMLTag_unknown));
}
break;
@ -1455,138 +1667,6 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const {
return result;
}
static eHTMLTags gBlockParentTags []={
eHTMLTag_applet, eHTMLTag_basefont, eHTMLTag_blockquote,
eHTMLTag_body, eHTMLTag_center, eHTMLTag_dd,
eHTMLTag_div, eHTMLTag_embed, eHTMLTag_fieldset,
eHTMLTag_form, eHTMLTag_iframe, eHTMLTag_layer,
eHTMLTag_li, eHTMLTag_listing, eHTMLTag_multicol,
eHTMLTag_noembed, eHTMLTag_noframes, eHTMLTag_nolayer,
eHTMLTag_noscript, eHTMLTag_object, eHTMLTag_plaintext,
eHTMLTag_pre, eHTMLTag_td, eHTMLTag_th,
eHTMLTag_ul,
eHTMLTag_xmp,
};
static eHTMLTags gBlockChildTags []={
eHTMLTag_a, eHTMLTag_abbr, eHTMLTag_acronym, eHTMLTag_address, eHTMLTag_applet,
eHTMLTag_b, eHTMLTag_basefont, eHTMLTag_bdo, eHTMLTag_bgsound, eHTMLTag_big,
eHTMLTag_blink, eHTMLTag_blockquote, eHTMLTag_br, eHTMLTag_button,
eHTMLTag_center, eHTMLTag_cite, eHTMLTag_code,
eHTMLTag_dfn, eHTMLTag_dir, eHTMLTag_div, eHTMLTag_dl,
eHTMLTag_em, eHTMLTag_embed,
eHTMLTag_fieldset, eHTMLTag_font, eHTMLTag_form,
eHTMLTag_h1, eHTMLTag_h2, eHTMLTag_h3,
eHTMLTag_h4, eHTMLTag_h5, eHTMLTag_h6,
eHTMLTag_hr,
eHTMLTag_i, eHTMLTag_iframe, eHTMLTag_ilayer, eHTMLTag_img,
eHTMLTag_isindex, eHTMLTag_input,
eHTMLTag_kbd,
eHTMLTag_label, eHTMLTag_layer, eHTMLTag_listing,
eHTMLTag_map, /*eHTMLTag_marque,*/ eHTMLTag_menu, eHTMLTag_multicol,
eHTMLTag_nobr, eHTMLTag_noembed, eHTMLTag_noframes, eHTMLTag_nolayer, eHTMLTag_noscript,
eHTMLTag_object, eHTMLTag_ol,
eHTMLTag_p, eHTMLTag_plaintext, eHTMLTag_pre,
eHTMLTag_q,
eHTMLTag_s, eHTMLTag_samp, eHTMLTag_script, eHTMLTag_select, eHTMLTag_small,
eHTMLTag_sound, eHTMLTag_spacer, eHTMLTag_span, eHTMLTag_strike, eHTMLTag_strong,
eHTMLTag_sub, eHTMLTag_sup,
eHTMLTag_table, eHTMLTag_textarea, eHTMLTag_tt,
eHTMLTag_u, eHTMLTag_ul,
eHTMLTag_var, eHTMLTag_wbr, eHTMLTag_xmp,
//a few special cases...
eHTMLTag_newline,
eHTMLTag_whitespace,
};
static eHTMLTags gInlineParentTags []={
eHTMLTag_a, eHTMLTag_abbr, eHTMLTag_address,
eHTMLTag_b, eHTMLTag_bdo, eHTMLTag_big,
eHTMLTag_blink, eHTMLTag_button, eHTMLTag_caption,
eHTMLTag_cite, eHTMLTag_code, eHTMLTag_dfn,
eHTMLTag_dt, eHTMLTag_em, eHTMLTag_font,
eHTMLTag_h1, eHTMLTag_h2, eHTMLTag_h3,
eHTMLTag_h4, eHTMLTag_h5, eHTMLTag_h6,
eHTMLTag_i, eHTMLTag_ilayer, eHTMLTag_kbd,
eHTMLTag_label, eHTMLTag_legend, /*eHTMLTag_marquee,*/
eHTMLTag_nobr, eHTMLTag_ol, eHTMLTag_p,
eHTMLTag_q,
eHTMLTag_s, eHTMLTag_samp, eHTMLTag_small,
eHTMLTag_span, eHTMLTag_strike, eHTMLTag_strong,
eHTMLTag_sub, eHTMLTag_sup,
eHTMLTag_td, eHTMLTag_th, eHTMLTag_tt,
eHTMLTag_u, eHTMLTag_ul, eHTMLTag_var
};
static eHTMLTags gInlineChildTags []={
eHTMLTag_a, eHTMLTag_abbr, eHTMLTag_acronym, eHTMLTag_applet,
eHTMLTag_b, eHTMLTag_bdo, eHTMLTag_bgsound, eHTMLTag_big, eHTMLTag_blink,
eHTMLTag_br, eHTMLTag_button,
eHTMLTag_cite, eHTMLTag_code,
eHTMLTag_dfn,
eHTMLTag_em, eHTMLTag_embed,
eHTMLTag_font,
eHTMLTag_i, eHTMLTag_iframe, eHTMLTag_ilayer, eHTMLTag_img, eHTMLTag_input,
eHTMLTag_kbd,
eHTMLTag_label, eHTMLTag_li,
eHTMLTag_map,
eHTMLTag_nobr,
eHTMLTag_object,
eHTMLTag_p,
eHTMLTag_pre,
eHTMLTag_q,
eHTMLTag_s, eHTMLTag_samp, eHTMLTag_script, eHTMLTag_select, eHTMLTag_small,
eHTMLTag_sound, eHTMLTag_spacer, eHTMLTag_span, eHTMLTag_strike, eHTMLTag_strong,
eHTMLTag_sub, eHTMLTag_sup,
eHTMLTag_textarea,eHTMLTag_tt,
eHTMLTag_u,
eHTMLTag_var,
eHTMLTag_wbr,
eHTMLTag_text,
eHTMLTag_newline,
eHTMLTag_whitespace,
};
static eHTMLTags gPREChildTags []={
eHTMLTag_a, eHTMLTag_abbr, eHTMLTag_acronym,
eHTMLTag_b, eHTMLTag_bdo, eHTMLTag_bgsound,
eHTMLTag_br, eHTMLTag_button,
eHTMLTag_cite, eHTMLTag_code, eHTMLTag_dfn,
eHTMLTag_em, eHTMLTag_embed,
eHTMLTag_i, eHTMLTag_ilayer, eHTMLTag_input,
eHTMLTag_kbd, eHTMLTag_label, eHTMLTag_li,
eHTMLTag_map, eHTMLTag_q,
eHTMLTag_s, eHTMLTag_samp, eHTMLTag_script, eHTMLTag_select,
eHTMLTag_sound, eHTMLTag_spacer, eHTMLTag_span, eHTMLTag_strike, eHTMLTag_strong,
eHTMLTag_textarea,eHTMLTag_tt,
eHTMLTag_u, eHTMLTag_var, eHTMLTag_wbr,
eHTMLTag_text, eHTMLTag_newline, eHTMLTag_whitespace,
};
static eHTMLTags gHeadChildTags []={
eHTMLTag_base, eHTMLTag_bgsound, eHTMLTag_isindex,
eHTMLTag_link, eHTMLTag_meta, /*eHTMLTag_nextid,*/
eHTMLTag_script, eHTMLTag_sound, eHTMLTag_style,
eHTMLTag_title
};
static eHTMLTags gFormChildTags []={
eHTMLTag_button, eHTMLTag_input, eHTMLTag_keygen,
eHTMLTag_label, eHTMLTag_select, eHTMLTag_textarea
};
/**
* This method is called to determine whether or not a tag
* of one type can contain a tag of another type.
@ -1856,7 +1936,7 @@ PRBool CNavDTD::CanOmit(eHTMLTags aParent,eHTMLTags aChild) const {
//begin with some simple (and obvious) cases...
switch(aParent) {
case eHTMLTag_table:
if(eHTMLTag_form==aChild)
if((eHTMLTag_form==aChild) || (eHTMLTag_table==aChild))
result=PR_FALSE;
else if(FindTagInSet(aChild,gFormElementTags,sizeof(gFormElementTags)/sizeof(eHTMLTag_unknown)))
result=!HasOpenContainer(eHTMLTag_form);

Просмотреть файл

@ -78,12 +78,14 @@ static eHTMLTags gStyleTags[]={
static eHTMLTags gNonContainers[]={
eHTMLTag_area, eHTMLTag_base, eHTMLTag_basefont,
eHTMLTag_br, eHTMLTag_col, eHTMLTag_embed,
eHTMLTag_frame, eHTMLTag_hr, eHTMLTag_whitespace,
eHTMLTag_input, eHTMLTag_link, eHTMLTag_isindex,
eHTMLTag_bgsound, eHTMLTag_br, eHTMLTag_col,
eHTMLTag_embed, eHTMLTag_frame, eHTMLTag_img,
eHTMLTag_keygen, eHTMLTag_hr, eHTMLTag_input,
eHTMLTag_link, eHTMLTag_isindex,
eHTMLTag_meta, eHTMLTag_param, eHTMLTag_plaintext,
eHTMLTag_style, eHTMLTag_spacer, eHTMLTag_wbr,
eHTMLTag_newline, eHTMLTag_text, eHTMLTag_img,
eHTMLTag_sound, eHTMLTag_style, eHTMLTag_spacer,
eHTMLTag_wbr,
eHTMLTag_newline, eHTMLTag_text, eHTMLTag_whitespace,
eHTMLTag_unknown, eHTMLTag_xmp};
static eHTMLTags gTableTags[]={
@ -94,6 +96,178 @@ static eHTMLTags gWhitespaceTags[]={
eHTMLTag_newline, eHTMLTag_whitespace};
static eHTMLTags gBlockParentTags []={
eHTMLTag_applet, eHTMLTag_basefont, eHTMLTag_blockquote,
eHTMLTag_body, eHTMLTag_center, eHTMLTag_dd,
eHTMLTag_div, eHTMLTag_embed, eHTMLTag_fieldset,
eHTMLTag_form, eHTMLTag_iframe, eHTMLTag_layer,
eHTMLTag_li, eHTMLTag_listing, eHTMLTag_multicol,
eHTMLTag_noembed, eHTMLTag_noframes, eHTMLTag_nolayer,
eHTMLTag_noscript, eHTMLTag_object, eHTMLTag_plaintext,
eHTMLTag_pre, eHTMLTag_td, eHTMLTag_th,
eHTMLTag_ul,
eHTMLTag_xmp,
};
static eHTMLTags gBlockChildTags []={
eHTMLTag_a, eHTMLTag_abbr, eHTMLTag_acronym, eHTMLTag_address, eHTMLTag_applet,
eHTMLTag_b, eHTMLTag_basefont, eHTMLTag_bdo, eHTMLTag_bgsound, eHTMLTag_big,
eHTMLTag_blink, eHTMLTag_blockquote, eHTMLTag_br, eHTMLTag_button,
eHTMLTag_center, eHTMLTag_cite, eHTMLTag_code,
eHTMLTag_del, eHTMLTag_dfn, eHTMLTag_dir, eHTMLTag_div, eHTMLTag_dl,
eHTMLTag_em, eHTMLTag_embed,
eHTMLTag_fieldset, eHTMLTag_font, eHTMLTag_form,
eHTMLTag_h1, eHTMLTag_h2, eHTMLTag_h3,
eHTMLTag_h4, eHTMLTag_h5, eHTMLTag_h6,
eHTMLTag_hr,
eHTMLTag_i, eHTMLTag_iframe, eHTMLTag_ilayer, eHTMLTag_img,
eHTMLTag_ins, eHTMLTag_isindex, eHTMLTag_input,
eHTMLTag_kbd,
eHTMLTag_label, eHTMLTag_layer, eHTMLTag_listing,
eHTMLTag_map, /*eHTMLTag_marque,*/ eHTMLTag_menu, eHTMLTag_multicol,
eHTMLTag_nobr, eHTMLTag_noembed, eHTMLTag_noframes, eHTMLTag_nolayer, eHTMLTag_noscript,
eHTMLTag_object, eHTMLTag_ol,
eHTMLTag_p, eHTMLTag_plaintext, eHTMLTag_pre,
eHTMLTag_q,
eHTMLTag_s, eHTMLTag_samp, eHTMLTag_script, eHTMLTag_select, eHTMLTag_small,
eHTMLTag_sound, eHTMLTag_spacer, eHTMLTag_span, eHTMLTag_strike, eHTMLTag_strong,
eHTMLTag_sub, eHTMLTag_sup,
eHTMLTag_table, eHTMLTag_textarea, eHTMLTag_tt,
eHTMLTag_u, eHTMLTag_ul, eHTMLTag_userdefined,
eHTMLTag_var, eHTMLTag_wbr, eHTMLTag_xmp,
//a few special cases...
eHTMLTag_newline,
eHTMLTag_whitespace,
};
static eHTMLTags gInlineParentTags []={
eHTMLTag_a, eHTMLTag_abbr, eHTMLTag_address,
eHTMLTag_b, eHTMLTag_bdo, eHTMLTag_big,
eHTMLTag_blink, eHTMLTag_button, eHTMLTag_caption,
eHTMLTag_cite, eHTMLTag_code, eHTMLTag_dfn,
eHTMLTag_dt, eHTMLTag_em, eHTMLTag_font,
eHTMLTag_h1, eHTMLTag_h2, eHTMLTag_h3,
eHTMLTag_h4, eHTMLTag_h5, eHTMLTag_h6,
eHTMLTag_i, eHTMLTag_ilayer, eHTMLTag_kbd,
eHTMLTag_label, eHTMLTag_legend, /*eHTMLTag_marquee,*/
eHTMLTag_nobr, eHTMLTag_ol, eHTMLTag_p,
eHTMLTag_q,
eHTMLTag_s, eHTMLTag_samp, eHTMLTag_small,
eHTMLTag_span, eHTMLTag_strike, eHTMLTag_strong,
eHTMLTag_sub, eHTMLTag_sup,
eHTMLTag_td, eHTMLTag_th, eHTMLTag_tt,
eHTMLTag_u, eHTMLTag_ul, eHTMLTag_var
};
static eHTMLTags gInlineChildTags []={
eHTMLTag_a, eHTMLTag_abbr, eHTMLTag_acronym, eHTMLTag_applet,
eHTMLTag_b, eHTMLTag_bdo, eHTMLTag_bgsound, eHTMLTag_big, eHTMLTag_blink,
eHTMLTag_br, eHTMLTag_button,
eHTMLTag_cite, eHTMLTag_code,
eHTMLTag_dfn,
eHTMLTag_em, eHTMLTag_embed,
eHTMLTag_font,
eHTMLTag_i, eHTMLTag_iframe, eHTMLTag_ilayer, eHTMLTag_img, eHTMLTag_input,
eHTMLTag_kbd,
eHTMLTag_label, eHTMLTag_li,
eHTMLTag_map,
eHTMLTag_nobr,
eHTMLTag_object,
eHTMLTag_p,
eHTMLTag_pre,
eHTMLTag_q,
eHTMLTag_s, eHTMLTag_samp, eHTMLTag_script, eHTMLTag_select, eHTMLTag_small,
eHTMLTag_sound, eHTMLTag_spacer, eHTMLTag_span, eHTMLTag_strike, eHTMLTag_strong,
eHTMLTag_sub, eHTMLTag_sup,
eHTMLTag_textarea,eHTMLTag_tt,
eHTMLTag_u,
eHTMLTag_var,
eHTMLTag_wbr,
eHTMLTag_text,
eHTMLTag_newline,
eHTMLTag_whitespace,
};
//This is a convenience set, which combines block AND inline child lists...
static eHTMLTags gBlockAndInlineChildTags []={
eHTMLTag_a, eHTMLTag_abbr, eHTMLTag_acronym, eHTMLTag_address, eHTMLTag_applet,
eHTMLTag_b, eHTMLTag_basefont, eHTMLTag_bdo, eHTMLTag_bgsound, eHTMLTag_big,
eHTMLTag_blink, eHTMLTag_blockquote, eHTMLTag_br, eHTMLTag_button,
eHTMLTag_center, eHTMLTag_cite, eHTMLTag_code,
eHTMLTag_dfn, eHTMLTag_del, eHTMLTag_dir, eHTMLTag_div, eHTMLTag_dl,
eHTMLTag_em, eHTMLTag_embed,
eHTMLTag_fieldset, eHTMLTag_font, eHTMLTag_form,
eHTMLTag_h1, eHTMLTag_h2, eHTMLTag_h3,
eHTMLTag_h4, eHTMLTag_h5, eHTMLTag_h6,
eHTMLTag_hr,
eHTMLTag_i, eHTMLTag_iframe, eHTMLTag_ilayer, eHTMLTag_img,
eHTMLTag_ins, eHTMLTag_isindex, eHTMLTag_input,
eHTMLTag_kbd,
eHTMLTag_label, eHTMLTag_layer, eHTMLTag_li, eHTMLTag_listing,
eHTMLTag_map, /*eHTMLTag_marque,*/ eHTMLTag_menu, eHTMLTag_multicol,
eHTMLTag_nobr, eHTMLTag_noembed, eHTMLTag_noframes, eHTMLTag_nolayer, eHTMLTag_noscript,
eHTMLTag_object, eHTMLTag_ol,
eHTMLTag_p, eHTMLTag_plaintext, eHTMLTag_pre,
eHTMLTag_q,
eHTMLTag_s, eHTMLTag_samp, eHTMLTag_script, eHTMLTag_select, eHTMLTag_small,
eHTMLTag_sound, eHTMLTag_spacer, eHTMLTag_span, eHTMLTag_strike, eHTMLTag_strong,
eHTMLTag_sub, eHTMLTag_sup,
eHTMLTag_table, eHTMLTag_textarea,
eHTMLTag_tt, eHTMLTag_u, eHTMLTag_ul, eHTMLTag_userdefined,
eHTMLTag_var, eHTMLTag_wbr, eHTMLTag_xmp,
//a few special cases...
eHTMLTag_text,
eHTMLTag_newline,
eHTMLTag_whitespace,
};
static eHTMLTags gPREChildTags []={
eHTMLTag_a, eHTMLTag_abbr, eHTMLTag_acronym,
eHTMLTag_b, eHTMLTag_bdo, eHTMLTag_bgsound,
eHTMLTag_br, eHTMLTag_button,
eHTMLTag_cite, eHTMLTag_code, eHTMLTag_dfn,
eHTMLTag_em, eHTMLTag_embed,
eHTMLTag_i, eHTMLTag_ilayer, eHTMLTag_input,
eHTMLTag_kbd, eHTMLTag_label, eHTMLTag_li,
eHTMLTag_map, eHTMLTag_q,
eHTMLTag_s, eHTMLTag_samp, eHTMLTag_script, eHTMLTag_select,
eHTMLTag_sound, eHTMLTag_spacer, eHTMLTag_span, eHTMLTag_strike, eHTMLTag_strong,
eHTMLTag_textarea,eHTMLTag_tt,
eHTMLTag_u, eHTMLTag_var, eHTMLTag_wbr,
eHTMLTag_text, eHTMLTag_newline, eHTMLTag_whitespace,
};
static eHTMLTags gHeadChildTags []={
eHTMLTag_base, eHTMLTag_bgsound, eHTMLTag_isindex,
eHTMLTag_link, eHTMLTag_meta, /*eHTMLTag_nextid,*/
eHTMLTag_script, eHTMLTag_sound, eHTMLTag_style,
eHTMLTag_title
};
static eHTMLTags gFormChildTags []={
eHTMLTag_button, eHTMLTag_input, eHTMLTag_keygen,
eHTMLTag_label, eHTMLTag_select, eHTMLTag_textarea
};
static CTokenRecycler gTokenRecycler;
@ -1196,7 +1370,9 @@ static eHTMLTags gTagSet3[]={
*/
PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const {
PRBool result=!IsContainer(aParent);
PRBool result=PR_FALSE;
if(!IsContainer(aParent))
return result;
/***************************************************************************
@ -1232,18 +1408,24 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const {
result=PR_FALSE;
}
else
result=FindTagInSet(aChild,gTagSet1,sizeof(gTagSet1)/sizeof(eHTMLTag_unknown));
result=FindTagInSet(aChild,gBlockAndInlineChildTags,sizeof(gBlockAndInlineChildTags)/sizeof(eHTMLTag_unknown));
}
else {
switch((eHTMLTags)aParent) {
case eHTMLTag_abbr:
if(aParent!=aChild)
result=FindTagInSet(aChild,gInlineChildTags,sizeof(gInlineChildTags)/sizeof(eHTMLTag_unknown));
break;
case eHTMLTag_blockquote:
case eHTMLTag_body:
case eHTMLTag_ilayer:
case eHTMLTag_layer:
if(eHTMLTag_userdefined==aChild)
result=PR_TRUE;
else
result=FindTagInSet(aChild,gTagSet1,sizeof(gTagSet1)/sizeof(eHTMLTag_unknown));
result=FindTagInSet(aChild,gBlockAndInlineChildTags,sizeof(gBlockAndInlineChildTags)/sizeof(eHTMLTag_unknown));
break;
case eHTMLTag_button:
@ -1257,11 +1439,11 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const {
case eHTMLTag_menu: case eHTMLTag_noscript:
case eHTMLTag_ol: case eHTMLTag_ul:
case eHTMLTag_embed: case eHTMLTag_noembed:
result=FindTagInSet(aChild,gTagSet1,sizeof(gTagSet1)/sizeof(eHTMLTag_unknown));
result=FindTagInSet(aChild,gBlockAndInlineChildTags,sizeof(gBlockAndInlineChildTags)/sizeof(eHTMLTag_unknown));
break;
case eHTMLTag_dd:
result=(eHTMLTag_dt==aChild) ? PR_FALSE: FindTagInSet(aChild,gTagSet1,sizeof(gTagSet1)/sizeof(eHTMLTag_unknown));
result=(eHTMLTag_dt==aChild) ? PR_FALSE: FindTagInSet(aChild,gBlockAndInlineChildTags,sizeof(gBlockAndInlineChildTags)/sizeof(eHTMLTag_unknown));
break;
case eHTMLTag_colgroup:
@ -1272,7 +1454,7 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const {
{
if(eHTMLTag_dt==aChild)
result=PR_TRUE;
else result=FindTagInSet(aChild,gTagSet1,sizeof(gTagSet1)/sizeof(eHTMLTag_unknown));
else result=FindTagInSet(aChild,gBlockAndInlineChildTags,sizeof(gBlockAndInlineChildTags)/sizeof(eHTMLTag_unknown));
}
break;
@ -1288,7 +1470,7 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const {
if(eHTMLTag_legend==aChild)
result=PR_TRUE;
else
result=FindTagInSet(aChild,gTagSet1,sizeof(gTagSet1)/sizeof(eHTMLTag_unknown));
result=FindTagInSet(aChild,gBlockAndInlineChildTags,sizeof(gBlockAndInlineChildTags)/sizeof(eHTMLTag_unknown));
break;
case eHTMLTag_frameset:
@ -1305,7 +1487,7 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const {
{
if(FindTagInSet(aChild,gHeadingTags,sizeof(gHeadingTags)/sizeof(eHTMLTag_unknown)))
result=PR_FALSE;
else result=FindTagInSet(aChild,gTagSet1,sizeof(gTagSet1)/sizeof(eHTMLTag_unknown));
else result=FindTagInSet(aChild,gBlockAndInlineChildTags,sizeof(gBlockAndInlineChildTags)/sizeof(eHTMLTag_unknown));
}
break;
@ -1329,7 +1511,7 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const {
if(eHTMLTag_frame==aChild)
result=PR_FALSE;
else
result=FindTagInSet(aChild,gTagSet1,sizeof(gTagSet1)/sizeof(eHTMLTag_unknown));
result=FindTagInSet(aChild,gBlockAndInlineChildTags,sizeof(gBlockAndInlineChildTags)/sizeof(eHTMLTag_unknown));
break;
case eHTMLTag_li:
@ -1346,11 +1528,23 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const {
}
break;
case eHTMLTag_multicol:
if(aParent!=aChild) {
result=FindTagInSet(aChild,gInlineChildTags,sizeof(gInlineChildTags)/sizeof(eHTMLTag_unknown));
if(PR_FALSE==result)
result=FindTagInSet(aChild,gBlockChildTags,sizeof(gBlockChildTags)/sizeof(eHTMLTag_unknown));
}
break;
case eHTMLTag_nolayer:
result=FindTagInSet(aChild,gBlockAndInlineChildTags,sizeof(gBlockAndInlineChildTags)/sizeof(eHTMLTag_unknown));
break;
case eHTMLTag_noframes:
if(eHTMLTag_body==aChild)
result=PR_TRUE;
else
result=FindTagInSet(aChild,gTagSet1,sizeof(gTagSet1)/sizeof(eHTMLTag_unknown));
result=FindTagInSet(aChild,gBlockAndInlineChildTags,sizeof(gBlockAndInlineChildTags)/sizeof(eHTMLTag_unknown));
break;
case eHTMLTag_option:
@ -1358,6 +1552,11 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const {
result=PRBool(eHTMLTag_option!=aChild);
break;
case eHTMLTag_optgroup:
//for now, allow an optgroup to hold itself and options...
result=PRBool((eHTMLTag_option==aChild) || (aParent==aChild));
break;
case eHTMLTag_p:
{
static eHTMLTags datalistTags[]={eHTMLTag_dt,eHTMLTag_dd};
@ -1392,6 +1591,11 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const {
result=FindTagInSet(aChild,gTagSet2,sizeof(gTagSet2)/sizeof(eHTMLTag_unknown));
break;
case eHTMLTag_script:
//for now, allow an optgroup to hold itself and options...
result=PRBool((eHTMLTag_text==aChild) || (eHTMLTag_comment==aChild));
break;
case eHTMLTag_table:
{
static eHTMLTags okTags[]={
@ -1412,13 +1616,21 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const {
}
break;
case eHTMLTag_title:
case eHTMLTag_textarea:
{
static eHTMLTags okTags[]={eHTMLTag_text,eHTMLTag_whitespace,eHTMLTag_newline};
result=FindTagInSet(aChild,okTags,sizeof(okTags)/sizeof(eHTMLTag_unknown));
}
break;
case eHTMLTag_th:
case eHTMLTag_td:
{
static eHTMLTags okTags[]={eHTMLTag_newline,eHTMLTag_map};
result=FindTagInSet(aChild,okTags,sizeof(okTags)/sizeof(eHTMLTag_unknown));
if(PR_FALSE==result)
result=FindTagInSet(aChild,gTagSet1,sizeof(gTagSet1)/sizeof(eHTMLTag_unknown));
result=FindTagInSet(aChild,gBlockAndInlineChildTags,sizeof(gBlockAndInlineChildTags)/sizeof(eHTMLTag_unknown));
}
break;
@ -1455,138 +1667,6 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const {
return result;
}
static eHTMLTags gBlockParentTags []={
eHTMLTag_applet, eHTMLTag_basefont, eHTMLTag_blockquote,
eHTMLTag_body, eHTMLTag_center, eHTMLTag_dd,
eHTMLTag_div, eHTMLTag_embed, eHTMLTag_fieldset,
eHTMLTag_form, eHTMLTag_iframe, eHTMLTag_layer,
eHTMLTag_li, eHTMLTag_listing, eHTMLTag_multicol,
eHTMLTag_noembed, eHTMLTag_noframes, eHTMLTag_nolayer,
eHTMLTag_noscript, eHTMLTag_object, eHTMLTag_plaintext,
eHTMLTag_pre, eHTMLTag_td, eHTMLTag_th,
eHTMLTag_ul,
eHTMLTag_xmp,
};
static eHTMLTags gBlockChildTags []={
eHTMLTag_a, eHTMLTag_abbr, eHTMLTag_acronym, eHTMLTag_address, eHTMLTag_applet,
eHTMLTag_b, eHTMLTag_basefont, eHTMLTag_bdo, eHTMLTag_bgsound, eHTMLTag_big,
eHTMLTag_blink, eHTMLTag_blockquote, eHTMLTag_br, eHTMLTag_button,
eHTMLTag_center, eHTMLTag_cite, eHTMLTag_code,
eHTMLTag_dfn, eHTMLTag_dir, eHTMLTag_div, eHTMLTag_dl,
eHTMLTag_em, eHTMLTag_embed,
eHTMLTag_fieldset, eHTMLTag_font, eHTMLTag_form,
eHTMLTag_h1, eHTMLTag_h2, eHTMLTag_h3,
eHTMLTag_h4, eHTMLTag_h5, eHTMLTag_h6,
eHTMLTag_hr,
eHTMLTag_i, eHTMLTag_iframe, eHTMLTag_ilayer, eHTMLTag_img,
eHTMLTag_isindex, eHTMLTag_input,
eHTMLTag_kbd,
eHTMLTag_label, eHTMLTag_layer, eHTMLTag_listing,
eHTMLTag_map, /*eHTMLTag_marque,*/ eHTMLTag_menu, eHTMLTag_multicol,
eHTMLTag_nobr, eHTMLTag_noembed, eHTMLTag_noframes, eHTMLTag_nolayer, eHTMLTag_noscript,
eHTMLTag_object, eHTMLTag_ol,
eHTMLTag_p, eHTMLTag_plaintext, eHTMLTag_pre,
eHTMLTag_q,
eHTMLTag_s, eHTMLTag_samp, eHTMLTag_script, eHTMLTag_select, eHTMLTag_small,
eHTMLTag_sound, eHTMLTag_spacer, eHTMLTag_span, eHTMLTag_strike, eHTMLTag_strong,
eHTMLTag_sub, eHTMLTag_sup,
eHTMLTag_table, eHTMLTag_textarea, eHTMLTag_tt,
eHTMLTag_u, eHTMLTag_ul,
eHTMLTag_var, eHTMLTag_wbr, eHTMLTag_xmp,
//a few special cases...
eHTMLTag_newline,
eHTMLTag_whitespace,
};
static eHTMLTags gInlineParentTags []={
eHTMLTag_a, eHTMLTag_abbr, eHTMLTag_address,
eHTMLTag_b, eHTMLTag_bdo, eHTMLTag_big,
eHTMLTag_blink, eHTMLTag_button, eHTMLTag_caption,
eHTMLTag_cite, eHTMLTag_code, eHTMLTag_dfn,
eHTMLTag_dt, eHTMLTag_em, eHTMLTag_font,
eHTMLTag_h1, eHTMLTag_h2, eHTMLTag_h3,
eHTMLTag_h4, eHTMLTag_h5, eHTMLTag_h6,
eHTMLTag_i, eHTMLTag_ilayer, eHTMLTag_kbd,
eHTMLTag_label, eHTMLTag_legend, /*eHTMLTag_marquee,*/
eHTMLTag_nobr, eHTMLTag_ol, eHTMLTag_p,
eHTMLTag_q,
eHTMLTag_s, eHTMLTag_samp, eHTMLTag_small,
eHTMLTag_span, eHTMLTag_strike, eHTMLTag_strong,
eHTMLTag_sub, eHTMLTag_sup,
eHTMLTag_td, eHTMLTag_th, eHTMLTag_tt,
eHTMLTag_u, eHTMLTag_ul, eHTMLTag_var
};
static eHTMLTags gInlineChildTags []={
eHTMLTag_a, eHTMLTag_abbr, eHTMLTag_acronym, eHTMLTag_applet,
eHTMLTag_b, eHTMLTag_bdo, eHTMLTag_bgsound, eHTMLTag_big, eHTMLTag_blink,
eHTMLTag_br, eHTMLTag_button,
eHTMLTag_cite, eHTMLTag_code,
eHTMLTag_dfn,
eHTMLTag_em, eHTMLTag_embed,
eHTMLTag_font,
eHTMLTag_i, eHTMLTag_iframe, eHTMLTag_ilayer, eHTMLTag_img, eHTMLTag_input,
eHTMLTag_kbd,
eHTMLTag_label, eHTMLTag_li,
eHTMLTag_map,
eHTMLTag_nobr,
eHTMLTag_object,
eHTMLTag_p,
eHTMLTag_pre,
eHTMLTag_q,
eHTMLTag_s, eHTMLTag_samp, eHTMLTag_script, eHTMLTag_select, eHTMLTag_small,
eHTMLTag_sound, eHTMLTag_spacer, eHTMLTag_span, eHTMLTag_strike, eHTMLTag_strong,
eHTMLTag_sub, eHTMLTag_sup,
eHTMLTag_textarea,eHTMLTag_tt,
eHTMLTag_u,
eHTMLTag_var,
eHTMLTag_wbr,
eHTMLTag_text,
eHTMLTag_newline,
eHTMLTag_whitespace,
};
static eHTMLTags gPREChildTags []={
eHTMLTag_a, eHTMLTag_abbr, eHTMLTag_acronym,
eHTMLTag_b, eHTMLTag_bdo, eHTMLTag_bgsound,
eHTMLTag_br, eHTMLTag_button,
eHTMLTag_cite, eHTMLTag_code, eHTMLTag_dfn,
eHTMLTag_em, eHTMLTag_embed,
eHTMLTag_i, eHTMLTag_ilayer, eHTMLTag_input,
eHTMLTag_kbd, eHTMLTag_label, eHTMLTag_li,
eHTMLTag_map, eHTMLTag_q,
eHTMLTag_s, eHTMLTag_samp, eHTMLTag_script, eHTMLTag_select,
eHTMLTag_sound, eHTMLTag_spacer, eHTMLTag_span, eHTMLTag_strike, eHTMLTag_strong,
eHTMLTag_textarea,eHTMLTag_tt,
eHTMLTag_u, eHTMLTag_var, eHTMLTag_wbr,
eHTMLTag_text, eHTMLTag_newline, eHTMLTag_whitespace,
};
static eHTMLTags gHeadChildTags []={
eHTMLTag_base, eHTMLTag_bgsound, eHTMLTag_isindex,
eHTMLTag_link, eHTMLTag_meta, /*eHTMLTag_nextid,*/
eHTMLTag_script, eHTMLTag_sound, eHTMLTag_style,
eHTMLTag_title
};
static eHTMLTags gFormChildTags []={
eHTMLTag_button, eHTMLTag_input, eHTMLTag_keygen,
eHTMLTag_label, eHTMLTag_select, eHTMLTag_textarea
};
/**
* This method is called to determine whether or not a tag
* of one type can contain a tag of another type.
@ -1856,7 +1936,7 @@ PRBool CNavDTD::CanOmit(eHTMLTags aParent,eHTMLTags aChild) const {
//begin with some simple (and obvious) cases...
switch(aParent) {
case eHTMLTag_table:
if(eHTMLTag_form==aChild)
if((eHTMLTag_form==aChild) || (eHTMLTag_table==aChild))
result=PR_FALSE;
else if(FindTagInSet(aChild,gFormElementTags,sizeof(gFormElementTags)/sizeof(eHTMLTag_unknown)))
result=!HasOpenContainer(eHTMLTag_form);