From 79823f0388a34b568d51643ff8ffb98128d8aab8 Mon Sep 17 00:00:00 2001 From: rickg Date: Sat, 30 May 1998 03:14:55 +0000 Subject: [PATCH] added support for NOBR and fixed MAP and AREA behavior --- htmlparser/src/CNavDTD.cpp | 16 ++++++++++------ htmlparser/src/nsHTMLParser.cpp | 24 +++++++++++++++--------- htmlparser/src/nsHTMLTokens.cpp | 2 +- htmlparser/src/nsHTMLTokens.h | 1 + parser/htmlparser/src/CNavDTD.cpp | 16 ++++++++++------ parser/htmlparser/src/nsHTMLParser.cpp | 24 +++++++++++++++--------- parser/htmlparser/src/nsHTMLTokens.cpp | 2 +- parser/htmlparser/src/nsHTMLTokens.h | 1 + 8 files changed, 54 insertions(+), 32 deletions(-) diff --git a/htmlparser/src/CNavDTD.cpp b/htmlparser/src/CNavDTD.cpp index d8cd06113ac8..9778116fb116 100644 --- a/htmlparser/src/CNavDTD.cpp +++ b/htmlparser/src/CNavDTD.cpp @@ -163,7 +163,7 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const { PRBool result=PR_FALSE; - //tagset1 has 64 members... + //tagset1 has 65 members... static char gTagSet1[]={ eHTMLTag_a, eHTMLTag_acronym, eHTMLTag_address, eHTMLTag_applet, eHTMLTag_bold, eHTMLTag_basefont, eHTMLTag_bdo, eHTMLTag_big, @@ -176,7 +176,7 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const { eHTMLTag_input, eHTMLTag_isindex, eHTMLTag_kbd, eHTMLTag_label, - eHTMLTag_map, eHTMLTag_menu, eHTMLTag_newline, //JUST ADDED! + eHTMLTag_map, eHTMLTag_menu, eHTMLTag_newline, eHTMLTag_nobr, eHTMLTag_noframes, eHTMLTag_noscript, eHTMLTag_object, eHTMLTag_ol, eHTMLTag_paragraph, eHTMLTag_pre, eHTMLTag_quotation, eHTMLTag_strike, eHTMLTag_samp, eHTMLTag_script, @@ -188,7 +188,7 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const { eHTMLTag_whitespace, //JUST ADDED! 0}; - //tagset2 has 43 members... + //tagset2 has 44 members... static char gTagSet2[]={ eHTMLTag_a, eHTMLTag_acronym, eHTMLTag_applet, eHTMLTag_bold, eHTMLTag_basefont, eHTMLTag_bdo, eHTMLTag_big, eHTMLTag_br, @@ -196,7 +196,7 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const { eHTMLTag_em, eHTMLTag_font, eHTMLTag_hr, eHTMLTag_italic, eHTMLTag_iframe, eHTMLTag_img, eHTMLTag_input, eHTMLTag_kbd, - eHTMLTag_label, eHTMLTag_map, eHTMLTag_newline, //JUST ADDED! + eHTMLTag_label, eHTMLTag_map, eHTMLTag_newline, eHTMLTag_nobr, eHTMLTag_object, eHTMLTag_paragraph, eHTMLTag_quotation, eHTMLTag_strike, eHTMLTag_samp, eHTMLTag_script, eHTMLTag_select, eHTMLTag_small, eHTMLTag_span, eHTMLTag_strong, @@ -424,6 +424,9 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const { // XXX kipp was here result=PRBool(!strchr(gHeadingTags,aChild)); break; + case eHTMLTag_nobr: + result=PR_TRUE; break; + case eHTMLTag_noframes: if(eHTMLTag_body==aChild) result=PR_TRUE; @@ -439,7 +442,8 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const { result=PRBool(0!=strchr(gTagSet2,aChild)); break; case eHTMLTag_option: - result=PR_TRUE; break; //for now, allow select to contain anything... + //for now, allow an option to contain anything but another option... + result=PRBool(eHTMLTag_option!=aChild); break; case eHTMLTag_paragraph: if(eHTMLTag_paragraph==aChild) @@ -630,7 +634,7 @@ PRBool CNavDTD::CanOmit(PRInt32 aParent,PRInt32 aChild) const { switch((eHTMLTags)aParent) { case eHTMLTag_tr: case eHTMLTag_table: case eHTMLTag_thead: case eHTMLTag_tfoot: - case eHTMLTag_tbody: case eHTMLTag_col: + case eHTMLTag_tbody: result=PR_TRUE; default: break; diff --git a/htmlparser/src/nsHTMLParser.cpp b/htmlparser/src/nsHTMLParser.cpp index 57f932ff70df..675f17c92448 100644 --- a/htmlparser/src/nsHTMLParser.cpp +++ b/htmlparser/src/nsHTMLParser.cpp @@ -934,16 +934,24 @@ PRInt32 nsHTMLParser::HandleStartToken(CToken* aToken) { result=HandleScriptToken(st); break; - case eHTMLTag_map: - // Put map into the head section - result=OpenHead(attrNode); - if(kNoError==result) - result=OpenContainer(attrNode); - break; - case eHTMLTag_head: break; //ignore head tags... + case eHTMLTag_base: + result=OpenHead(attrNode); + if(kNoError==result) { + result=AddLeaf(attrNode); + if(kNoError==result) + result=CloseHead(attrNode); + } + break; + + case eHTMLTag_nobr: + result=PR_TRUE; + + case eHTMLTag_map: + result=PR_TRUE; + default: result=HandleDefaultStartToken(aToken,tokenTagType,attrNode); break; @@ -992,8 +1000,6 @@ PRInt32 nsHTMLParser::HandleEndToken(CToken* aToken) { case eHTMLTag_map: result=CloseContainer(theNode); - if(kNoError==result) - result=CloseHead(theNode); break; case eHTMLTag_form: diff --git a/htmlparser/src/nsHTMLTokens.cpp b/htmlparser/src/nsHTMLTokens.cpp index 9e9ab3c745da..a40aece2237b 100644 --- a/htmlparser/src/nsHTMLTokens.cpp +++ b/htmlparser/src/nsHTMLTokens.cpp @@ -156,7 +156,7 @@ HTMLTagEntry gHTMLTagTable[] = {"MATH", eHTMLTag_math}, {"MENU", eHTMLTag_menu}, {"META", eHTMLTag_meta}, - {"NEWLINE", eHTMLTag_newline}, + {"NEWLINE", eHTMLTag_newline}, {"NOBR", eHTMLTag_nobr}, {"NOEMBED", eHTMLTag_noembed}, {"NOFRAMES", eHTMLTag_noframes}, {"NOLAYER", eHTMLTag_nolayer}, {"NOSCRIPT", eHTMLTag_noscript}, diff --git a/htmlparser/src/nsHTMLTokens.h b/htmlparser/src/nsHTMLTokens.h index d1083cd6afab..7137fc621851 100644 --- a/htmlparser/src/nsHTMLTokens.h +++ b/htmlparser/src/nsHTMLTokens.h @@ -73,6 +73,7 @@ enum eHTMLTags eHTMLTag_label, eHTMLTag_layer, eHTMLTag_legend, eHTMLTag_listitem, eHTMLTag_link, eHTMLTag_listing, eHTMLTag_map, eHTMLTag_marquee, eHTMLTag_math, eHTMLTag_menu, eHTMLTag_meta, eHTMLTag_newline, + eHTMLTag_nobr, eHTMLTag_noembed, eHTMLTag_noframes, eHTMLTag_nolayer, eHTMLTag_noscript, //74 eHTMLTag_note, eHTMLTag_object, eHTMLTag_ol, eHTMLTag_option, eHTMLTag_paragraph, eHTMLTag_param, eHTMLTag_plaintext, diff --git a/parser/htmlparser/src/CNavDTD.cpp b/parser/htmlparser/src/CNavDTD.cpp index d8cd06113ac8..9778116fb116 100644 --- a/parser/htmlparser/src/CNavDTD.cpp +++ b/parser/htmlparser/src/CNavDTD.cpp @@ -163,7 +163,7 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const { PRBool result=PR_FALSE; - //tagset1 has 64 members... + //tagset1 has 65 members... static char gTagSet1[]={ eHTMLTag_a, eHTMLTag_acronym, eHTMLTag_address, eHTMLTag_applet, eHTMLTag_bold, eHTMLTag_basefont, eHTMLTag_bdo, eHTMLTag_big, @@ -176,7 +176,7 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const { eHTMLTag_input, eHTMLTag_isindex, eHTMLTag_kbd, eHTMLTag_label, - eHTMLTag_map, eHTMLTag_menu, eHTMLTag_newline, //JUST ADDED! + eHTMLTag_map, eHTMLTag_menu, eHTMLTag_newline, eHTMLTag_nobr, eHTMLTag_noframes, eHTMLTag_noscript, eHTMLTag_object, eHTMLTag_ol, eHTMLTag_paragraph, eHTMLTag_pre, eHTMLTag_quotation, eHTMLTag_strike, eHTMLTag_samp, eHTMLTag_script, @@ -188,7 +188,7 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const { eHTMLTag_whitespace, //JUST ADDED! 0}; - //tagset2 has 43 members... + //tagset2 has 44 members... static char gTagSet2[]={ eHTMLTag_a, eHTMLTag_acronym, eHTMLTag_applet, eHTMLTag_bold, eHTMLTag_basefont, eHTMLTag_bdo, eHTMLTag_big, eHTMLTag_br, @@ -196,7 +196,7 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const { eHTMLTag_em, eHTMLTag_font, eHTMLTag_hr, eHTMLTag_italic, eHTMLTag_iframe, eHTMLTag_img, eHTMLTag_input, eHTMLTag_kbd, - eHTMLTag_label, eHTMLTag_map, eHTMLTag_newline, //JUST ADDED! + eHTMLTag_label, eHTMLTag_map, eHTMLTag_newline, eHTMLTag_nobr, eHTMLTag_object, eHTMLTag_paragraph, eHTMLTag_quotation, eHTMLTag_strike, eHTMLTag_samp, eHTMLTag_script, eHTMLTag_select, eHTMLTag_small, eHTMLTag_span, eHTMLTag_strong, @@ -424,6 +424,9 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const { // XXX kipp was here result=PRBool(!strchr(gHeadingTags,aChild)); break; + case eHTMLTag_nobr: + result=PR_TRUE; break; + case eHTMLTag_noframes: if(eHTMLTag_body==aChild) result=PR_TRUE; @@ -439,7 +442,8 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const { result=PRBool(0!=strchr(gTagSet2,aChild)); break; case eHTMLTag_option: - result=PR_TRUE; break; //for now, allow select to contain anything... + //for now, allow an option to contain anything but another option... + result=PRBool(eHTMLTag_option!=aChild); break; case eHTMLTag_paragraph: if(eHTMLTag_paragraph==aChild) @@ -630,7 +634,7 @@ PRBool CNavDTD::CanOmit(PRInt32 aParent,PRInt32 aChild) const { switch((eHTMLTags)aParent) { case eHTMLTag_tr: case eHTMLTag_table: case eHTMLTag_thead: case eHTMLTag_tfoot: - case eHTMLTag_tbody: case eHTMLTag_col: + case eHTMLTag_tbody: result=PR_TRUE; default: break; diff --git a/parser/htmlparser/src/nsHTMLParser.cpp b/parser/htmlparser/src/nsHTMLParser.cpp index 57f932ff70df..675f17c92448 100644 --- a/parser/htmlparser/src/nsHTMLParser.cpp +++ b/parser/htmlparser/src/nsHTMLParser.cpp @@ -934,16 +934,24 @@ PRInt32 nsHTMLParser::HandleStartToken(CToken* aToken) { result=HandleScriptToken(st); break; - case eHTMLTag_map: - // Put map into the head section - result=OpenHead(attrNode); - if(kNoError==result) - result=OpenContainer(attrNode); - break; - case eHTMLTag_head: break; //ignore head tags... + case eHTMLTag_base: + result=OpenHead(attrNode); + if(kNoError==result) { + result=AddLeaf(attrNode); + if(kNoError==result) + result=CloseHead(attrNode); + } + break; + + case eHTMLTag_nobr: + result=PR_TRUE; + + case eHTMLTag_map: + result=PR_TRUE; + default: result=HandleDefaultStartToken(aToken,tokenTagType,attrNode); break; @@ -992,8 +1000,6 @@ PRInt32 nsHTMLParser::HandleEndToken(CToken* aToken) { case eHTMLTag_map: result=CloseContainer(theNode); - if(kNoError==result) - result=CloseHead(theNode); break; case eHTMLTag_form: diff --git a/parser/htmlparser/src/nsHTMLTokens.cpp b/parser/htmlparser/src/nsHTMLTokens.cpp index 9e9ab3c745da..a40aece2237b 100644 --- a/parser/htmlparser/src/nsHTMLTokens.cpp +++ b/parser/htmlparser/src/nsHTMLTokens.cpp @@ -156,7 +156,7 @@ HTMLTagEntry gHTMLTagTable[] = {"MATH", eHTMLTag_math}, {"MENU", eHTMLTag_menu}, {"META", eHTMLTag_meta}, - {"NEWLINE", eHTMLTag_newline}, + {"NEWLINE", eHTMLTag_newline}, {"NOBR", eHTMLTag_nobr}, {"NOEMBED", eHTMLTag_noembed}, {"NOFRAMES", eHTMLTag_noframes}, {"NOLAYER", eHTMLTag_nolayer}, {"NOSCRIPT", eHTMLTag_noscript}, diff --git a/parser/htmlparser/src/nsHTMLTokens.h b/parser/htmlparser/src/nsHTMLTokens.h index d1083cd6afab..7137fc621851 100644 --- a/parser/htmlparser/src/nsHTMLTokens.h +++ b/parser/htmlparser/src/nsHTMLTokens.h @@ -73,6 +73,7 @@ enum eHTMLTags eHTMLTag_label, eHTMLTag_layer, eHTMLTag_legend, eHTMLTag_listitem, eHTMLTag_link, eHTMLTag_listing, eHTMLTag_map, eHTMLTag_marquee, eHTMLTag_math, eHTMLTag_menu, eHTMLTag_meta, eHTMLTag_newline, + eHTMLTag_nobr, eHTMLTag_noembed, eHTMLTag_noframes, eHTMLTag_nolayer, eHTMLTag_noscript, //74 eHTMLTag_note, eHTMLTag_object, eHTMLTag_ol, eHTMLTag_option, eHTMLTag_paragraph, eHTMLTag_param, eHTMLTag_plaintext,