diff --git a/mozilla/htmlparser/src/CNavDTD.cpp b/mozilla/htmlparser/src/CNavDTD.cpp index f2462fe16e1..351d853ebf6 100644 --- a/mozilla/htmlparser/src/CNavDTD.cpp +++ b/mozilla/htmlparser/src/CNavDTD.cpp @@ -145,7 +145,7 @@ static char gHeadingTags[]={ * @return PR_TRUE if parent can contain child */ PRBool CNavDTD::CanContainFormElement(PRInt32 aParent,PRInt32 aChild) const { - PRBool result=(mParser) ? mParser->HasOpenForm() : PR_FALSE; + PRBool result=(mParser) ? mParser->HasOpenContainer(eHTMLTag_form) : PR_FALSE; return result; } @@ -608,7 +608,7 @@ PRBool CNavDTD::CanOmit(PRInt32 aParent,PRInt32 aChild) const { case eHTMLTag_input: case eHTMLTag_isindex: case eHTMLTag_label: case eHTMLTag_legend: case eHTMLTag_select: case eHTMLTag_textarea: - if(PR_FALSE==mParser->HasOpenForm()) + if(PR_FALSE==mParser->HasOpenContainer(eHTMLTag_form)) result=PR_TRUE; break; @@ -631,7 +631,6 @@ PRBool CNavDTD::CanOmit(PRInt32 aParent,PRInt32 aChild) const { default: if(eHTMLTag_unknown==aParent) result=PR_FALSE; -// result=PRBool(eHTMLTag_html!=aChild); break; } //switch return result; @@ -672,7 +671,7 @@ PRBool CNavDTD::CanOmitEndTag(PRInt32 aParent,PRInt32 aChild) const { case eHTMLTag_input: case eHTMLTag_isindex: case eHTMLTag_label: case eHTMLTag_legend: case eHTMLTag_textarea: - if(PR_FALSE==mParser->HasOpenForm()) + if(PR_FALSE==mParser->HasOpenContainer(aChild)) result=PR_TRUE; break; @@ -693,8 +692,7 @@ PRBool CNavDTD::CanOmitEndTag(PRInt32 aParent,PRInt32 aChild) const { break; default: - if(aChild!=aParent) - result=PR_TRUE; + result=(!mParser->HasOpenContainer(aChild)); break; } //switch return result; diff --git a/mozilla/htmlparser/src/CNavDelegate.cpp b/mozilla/htmlparser/src/CNavDelegate.cpp index 58f9a83f14d..1110aefb8e5 100644 --- a/mozilla/htmlparser/src/CNavDelegate.cpp +++ b/mozilla/htmlparser/src/CNavDelegate.cpp @@ -27,7 +27,7 @@ // 1) If you see , simply treat it as a bad tag. // 2) If you see , treat it like a comment. // 3) If you see <> or <_ (< space) simply treat it as text. -// 4) If you see <~ (< followed by non-alpha), treat it as text. +// 4) If you see <[!a..z] (< followed by non-alpha), treat it as text. static char gIdentChars[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_"; diff --git a/mozilla/htmlparser/src/nsHTMLParser.cpp b/mozilla/htmlparser/src/nsHTMLParser.cpp index 1ae4b440993..c1d5aa54932 100644 --- a/mozilla/htmlparser/src/nsHTMLParser.cpp +++ b/mozilla/htmlparser/src/nsHTMLParser.cpp @@ -191,8 +191,17 @@ eHTMLTags nsHTMLParser::NodeAt(PRInt32 aPos) const { * @param * @return */ -PRBool nsHTMLParser::HasOpenForm() const { - return mHasOpenForm; +PRBool nsHTMLParser::HasOpenContainer(PRInt32 aContainer) const { + PRBool result=PR_FALSE; + + switch((eHTMLTags)aContainer) { + case eHTMLTag_form: + result=mHasOpenForm; break; + + default: + result=(kNotFound!=GetTopmostIndex((eHTMLTags)aContainer)); break; + } + return result; } /** @@ -789,8 +798,6 @@ PRBool nsHTMLParser::HandleEndToken(CToken* aToken) { nsCParserNode theNode((CHTMLToken*)aToken); switch(tokenTagType) { - case eHTMLTag_html: - result=CloseContainersTo(tokenTagType); break; case eHTMLTag_style: case eHTMLTag_link: @@ -798,6 +805,7 @@ PRBool nsHTMLParser::HandleEndToken(CToken* aToken) { case eHTMLTag_textarea: case eHTMLTag_title: case eHTMLTag_head: + case eHTMLTag_script: result=PR_TRUE; break; @@ -806,9 +814,6 @@ PRBool nsHTMLParser::HandleEndToken(CToken* aToken) { result=CloseHead(theNode); break; - case eHTMLTag_body: - result=CloseContainersTo(eHTMLTag_body); break; - case eHTMLTag_form: { nsCParserNode aNode((CHTMLToken*)aToken); @@ -816,12 +821,9 @@ PRBool nsHTMLParser::HandleEndToken(CToken* aToken) { } break; - case eHTMLTag_script: - result=PR_TRUE; break; - default: if(mDTD->IsContainer(tokenTagType)){ - result=CloseContainer(theNode); + result=CloseContainersTo(tokenTagType); } result=PR_TRUE; // diff --git a/mozilla/htmlparser/src/nsHTMLParser.h b/mozilla/htmlparser/src/nsHTMLParser.h index 755b4b4ccdd..448f4598dce 100644 --- a/mozilla/htmlparser/src/nsHTMLParser.h +++ b/mozilla/htmlparser/src/nsHTMLParser.h @@ -88,7 +88,7 @@ friend class CTokenHandler; virtual PRBool Parse(nsIURL* aURL,eParseMode aMode); virtual PRBool ResumeParse(); virtual PRInt32 GetStack(PRInt32* aStackPtr); - virtual PRBool HasOpenForm() const; + virtual PRBool HasOpenContainer(PRInt32 aContainer) const; PRBool HandleStartToken(CToken* aToken); diff --git a/mozilla/htmlparser/src/nsIParser.h b/mozilla/htmlparser/src/nsIParser.h index 4afaba60e15..9fd7280e2a3 100644 --- a/mozilla/htmlparser/src/nsIParser.h +++ b/mozilla/htmlparser/src/nsIParser.h @@ -55,7 +55,7 @@ class nsIParser : public nsISupports { virtual PRBool Parse(nsIURL* aURL)=0; virtual PRBool ResumeParse()=0; virtual PRInt32 GetStack(PRInt32* aStackPtr)=0; - virtual PRBool HasOpenForm() const=0; + virtual PRBool HasOpenContainer(PRInt32 aContainer) const=0; }; extern NS_HTMLPARS nsresult NS_NewHTMLParser(nsIParser** aInstancePtrResult); diff --git a/mozilla/parser/htmlparser/src/CNavDTD.cpp b/mozilla/parser/htmlparser/src/CNavDTD.cpp index f2462fe16e1..351d853ebf6 100644 --- a/mozilla/parser/htmlparser/src/CNavDTD.cpp +++ b/mozilla/parser/htmlparser/src/CNavDTD.cpp @@ -145,7 +145,7 @@ static char gHeadingTags[]={ * @return PR_TRUE if parent can contain child */ PRBool CNavDTD::CanContainFormElement(PRInt32 aParent,PRInt32 aChild) const { - PRBool result=(mParser) ? mParser->HasOpenForm() : PR_FALSE; + PRBool result=(mParser) ? mParser->HasOpenContainer(eHTMLTag_form) : PR_FALSE; return result; } @@ -608,7 +608,7 @@ PRBool CNavDTD::CanOmit(PRInt32 aParent,PRInt32 aChild) const { case eHTMLTag_input: case eHTMLTag_isindex: case eHTMLTag_label: case eHTMLTag_legend: case eHTMLTag_select: case eHTMLTag_textarea: - if(PR_FALSE==mParser->HasOpenForm()) + if(PR_FALSE==mParser->HasOpenContainer(eHTMLTag_form)) result=PR_TRUE; break; @@ -631,7 +631,6 @@ PRBool CNavDTD::CanOmit(PRInt32 aParent,PRInt32 aChild) const { default: if(eHTMLTag_unknown==aParent) result=PR_FALSE; -// result=PRBool(eHTMLTag_html!=aChild); break; } //switch return result; @@ -672,7 +671,7 @@ PRBool CNavDTD::CanOmitEndTag(PRInt32 aParent,PRInt32 aChild) const { case eHTMLTag_input: case eHTMLTag_isindex: case eHTMLTag_label: case eHTMLTag_legend: case eHTMLTag_textarea: - if(PR_FALSE==mParser->HasOpenForm()) + if(PR_FALSE==mParser->HasOpenContainer(aChild)) result=PR_TRUE; break; @@ -693,8 +692,7 @@ PRBool CNavDTD::CanOmitEndTag(PRInt32 aParent,PRInt32 aChild) const { break; default: - if(aChild!=aParent) - result=PR_TRUE; + result=(!mParser->HasOpenContainer(aChild)); break; } //switch return result; diff --git a/mozilla/parser/htmlparser/src/CNavDelegate.cpp b/mozilla/parser/htmlparser/src/CNavDelegate.cpp index 58f9a83f14d..1110aefb8e5 100644 --- a/mozilla/parser/htmlparser/src/CNavDelegate.cpp +++ b/mozilla/parser/htmlparser/src/CNavDelegate.cpp @@ -27,7 +27,7 @@ // 1) If you see , simply treat it as a bad tag. // 2) If you see , treat it like a comment. // 3) If you see <> or <_ (< space) simply treat it as text. -// 4) If you see <~ (< followed by non-alpha), treat it as text. +// 4) If you see <[!a..z] (< followed by non-alpha), treat it as text. static char gIdentChars[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_"; diff --git a/mozilla/parser/htmlparser/src/nsHTMLParser.cpp b/mozilla/parser/htmlparser/src/nsHTMLParser.cpp index 1ae4b440993..c1d5aa54932 100644 --- a/mozilla/parser/htmlparser/src/nsHTMLParser.cpp +++ b/mozilla/parser/htmlparser/src/nsHTMLParser.cpp @@ -191,8 +191,17 @@ eHTMLTags nsHTMLParser::NodeAt(PRInt32 aPos) const { * @param * @return */ -PRBool nsHTMLParser::HasOpenForm() const { - return mHasOpenForm; +PRBool nsHTMLParser::HasOpenContainer(PRInt32 aContainer) const { + PRBool result=PR_FALSE; + + switch((eHTMLTags)aContainer) { + case eHTMLTag_form: + result=mHasOpenForm; break; + + default: + result=(kNotFound!=GetTopmostIndex((eHTMLTags)aContainer)); break; + } + return result; } /** @@ -789,8 +798,6 @@ PRBool nsHTMLParser::HandleEndToken(CToken* aToken) { nsCParserNode theNode((CHTMLToken*)aToken); switch(tokenTagType) { - case eHTMLTag_html: - result=CloseContainersTo(tokenTagType); break; case eHTMLTag_style: case eHTMLTag_link: @@ -798,6 +805,7 @@ PRBool nsHTMLParser::HandleEndToken(CToken* aToken) { case eHTMLTag_textarea: case eHTMLTag_title: case eHTMLTag_head: + case eHTMLTag_script: result=PR_TRUE; break; @@ -806,9 +814,6 @@ PRBool nsHTMLParser::HandleEndToken(CToken* aToken) { result=CloseHead(theNode); break; - case eHTMLTag_body: - result=CloseContainersTo(eHTMLTag_body); break; - case eHTMLTag_form: { nsCParserNode aNode((CHTMLToken*)aToken); @@ -816,12 +821,9 @@ PRBool nsHTMLParser::HandleEndToken(CToken* aToken) { } break; - case eHTMLTag_script: - result=PR_TRUE; break; - default: if(mDTD->IsContainer(tokenTagType)){ - result=CloseContainer(theNode); + result=CloseContainersTo(tokenTagType); } result=PR_TRUE; // diff --git a/mozilla/parser/htmlparser/src/nsHTMLParser.h b/mozilla/parser/htmlparser/src/nsHTMLParser.h index 755b4b4ccdd..448f4598dce 100644 --- a/mozilla/parser/htmlparser/src/nsHTMLParser.h +++ b/mozilla/parser/htmlparser/src/nsHTMLParser.h @@ -88,7 +88,7 @@ friend class CTokenHandler; virtual PRBool Parse(nsIURL* aURL,eParseMode aMode); virtual PRBool ResumeParse(); virtual PRInt32 GetStack(PRInt32* aStackPtr); - virtual PRBool HasOpenForm() const; + virtual PRBool HasOpenContainer(PRInt32 aContainer) const; PRBool HandleStartToken(CToken* aToken); diff --git a/mozilla/parser/htmlparser/src/nsIParser.h b/mozilla/parser/htmlparser/src/nsIParser.h index 4afaba60e15..9fd7280e2a3 100644 --- a/mozilla/parser/htmlparser/src/nsIParser.h +++ b/mozilla/parser/htmlparser/src/nsIParser.h @@ -55,7 +55,7 @@ class nsIParser : public nsISupports { virtual PRBool Parse(nsIURL* aURL)=0; virtual PRBool ResumeParse()=0; virtual PRInt32 GetStack(PRInt32* aStackPtr)=0; - virtual PRBool HasOpenForm() const=0; + virtual PRBool HasOpenContainer(PRInt32 aContainer) const=0; }; extern NS_HTMLPARS nsresult NS_NewHTMLParser(nsIParser** aInstancePtrResult);