diff --git a/htmlparser/src/CNavDTD.cpp b/htmlparser/src/CNavDTD.cpp index 898f46a77035..d8cd06113ac8 100644 --- a/htmlparser/src/CNavDTD.cpp +++ b/htmlparser/src/CNavDTD.cpp @@ -485,7 +485,7 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const { { static char okTags[]={ eHTMLTag_caption, eHTMLTag_col, eHTMLTag_colgroup,eHTMLTag_tbody, - eHTMLTag_tfoot, eHTMLTag_tr, eHTMLTag_thead, 0}; + eHTMLTag_tfoot, /* eHTMLTag_tr,*/ eHTMLTag_thead, 0}; result=PRBool(0!=strchr(okTags,aChild)); } break; @@ -626,6 +626,17 @@ PRBool CNavDTD::CanOmit(PRInt32 aParent,PRInt32 aChild) const { } //switch break; + case eHTMLTag_entity: + switch((eHTMLTags)aParent) { + case eHTMLTag_tr: case eHTMLTag_table: + case eHTMLTag_thead: case eHTMLTag_tfoot: + case eHTMLTag_tbody: case eHTMLTag_col: + result=PR_TRUE; + default: + break; + } //switch + break; + default: if(eHTMLTag_unknown==aParent) result=PR_FALSE; @@ -848,6 +859,15 @@ PRBool CNavDTD::ForwardPropagate(nsString& aVector,PRInt32 aParentTag,PRInt32 aC switch(aParentTag) { case eHTMLTag_table: + { + static char tableTags[]={eHTMLTag_tr,eHTMLTag_td,0}; + if(strchr(tableTags,aChildTag)) { + //if you're here, we know we can correctly backward propagate. + result=BackwardPropagate(aVector,aParentTag,aChildTag); + } + } + break; + case eHTMLTag_tr: if(PR_TRUE==CanContain(eHTMLTag_td,aChildTag)) { aVector.Append((PRUnichar)eHTMLTag_td); diff --git a/htmlparser/src/nsHTMLParser.cpp b/htmlparser/src/nsHTMLParser.cpp index 4e3f39a79929..57f932ff70df 100644 --- a/htmlparser/src/nsHTMLParser.cpp +++ b/htmlparser/src/nsHTMLParser.cpp @@ -769,7 +769,7 @@ PRInt32 nsHTMLParser::CollectAttributes(nsCParserNode& aNode,PRInt32 aCount){ } else (*mCurrentPos)--; } - else kInterrupted; + else return kInterrupted; } else return kInterrupted; } @@ -1023,10 +1023,15 @@ PRInt32 nsHTMLParser::HandleEndToken(CToken* aToken) { */ PRInt32 nsHTMLParser::HandleEntityToken(CToken* aToken) { NS_PRECONDITION(0!=aToken,kNullToken); - CEntityToken* et = (CEntityToken*)(aToken); - PRInt32 result=kNoError; - nsCParserNode aNode((CHTMLToken*)aToken); - result=AddLeaf(aNode); + + CEntityToken* et = (CEntityToken*)(aToken); + PRInt32 result=kNoError; + eHTMLTags tokenTagType=et->GetHTMLTag(); + + if(PR_FALSE==mDTD->CanOmit(GetTopNode(),tokenTagType)) { + nsCParserNode aNode((CHTMLToken*)aToken); + result=AddLeaf(aNode); + } return result; } diff --git a/htmlparser/src/nsHTMLTokens.cpp b/htmlparser/src/nsHTMLTokens.cpp index 791846a81f8f..9e9ab3c745da 100644 --- a/htmlparser/src/nsHTMLTokens.cpp +++ b/htmlparser/src/nsHTMLTokens.cpp @@ -129,6 +129,7 @@ HTMLTagEntry gHTMLTagTable[] = {"DT", eHTMLTag_dt}, {"EM", eHTMLTag_em}, {"EMBED", eHTMLTag_embed}, + {"ENTITY", eHTMLTag_entity}, //a pseudo tag {"FIELDSET", eHTMLTag_fieldset}, {"FONT", eHTMLTag_font}, {"FOOTER", eHTMLTag_footer}, {"FORM", eHTMLTag_form}, @@ -968,6 +969,7 @@ PRInt32 CWhitespaceToken::Consume(PRUnichar aChar, CScanner& aScanner) { */ CEntityToken::CEntityToken(const nsString& aName) : CHTMLToken(aName) { mOrdinalValue=eToken_entity; + mTagType=eHTMLTag_entity; #ifdef VERBOSE_DEBUG if(!VerifyEntityTable()) { cout<<"Entity table is invalid!" << endl; diff --git a/htmlparser/src/nsHTMLTokens.h b/htmlparser/src/nsHTMLTokens.h index 4c6c2af6e33f..d1083cd6afab 100644 --- a/htmlparser/src/nsHTMLTokens.h +++ b/htmlparser/src/nsHTMLTokens.h @@ -61,7 +61,7 @@ enum eHTMLTags eHTMLTag_code, eHTMLTag_col, eHTMLTag_colgroup, eHTMLTag_comment, eHTMLTag_dd, eHTMLTag_del, eHTMLTag_dfn, eHTMLTag_dir, eHTMLTag_div, eHTMLTag_dl, eHTMLTag_dt, - eHTMLTag_em, eHTMLTag_embed, + eHTMLTag_em, eHTMLTag_embed, eHTMLTag_entity, eHTMLTag_fieldset, eHTMLTag_font, eHTMLTag_footer, eHTMLTag_form, eHTMLTag_frame, eHTMLTag_frameset, //39 eHTMLTag_h1, eHTMLTag_h2, eHTMLTag_h3, eHTMLTag_h4, diff --git a/parser/htmlparser/src/CNavDTD.cpp b/parser/htmlparser/src/CNavDTD.cpp index 898f46a77035..d8cd06113ac8 100644 --- a/parser/htmlparser/src/CNavDTD.cpp +++ b/parser/htmlparser/src/CNavDTD.cpp @@ -485,7 +485,7 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const { { static char okTags[]={ eHTMLTag_caption, eHTMLTag_col, eHTMLTag_colgroup,eHTMLTag_tbody, - eHTMLTag_tfoot, eHTMLTag_tr, eHTMLTag_thead, 0}; + eHTMLTag_tfoot, /* eHTMLTag_tr,*/ eHTMLTag_thead, 0}; result=PRBool(0!=strchr(okTags,aChild)); } break; @@ -626,6 +626,17 @@ PRBool CNavDTD::CanOmit(PRInt32 aParent,PRInt32 aChild) const { } //switch break; + case eHTMLTag_entity: + switch((eHTMLTags)aParent) { + case eHTMLTag_tr: case eHTMLTag_table: + case eHTMLTag_thead: case eHTMLTag_tfoot: + case eHTMLTag_tbody: case eHTMLTag_col: + result=PR_TRUE; + default: + break; + } //switch + break; + default: if(eHTMLTag_unknown==aParent) result=PR_FALSE; @@ -848,6 +859,15 @@ PRBool CNavDTD::ForwardPropagate(nsString& aVector,PRInt32 aParentTag,PRInt32 aC switch(aParentTag) { case eHTMLTag_table: + { + static char tableTags[]={eHTMLTag_tr,eHTMLTag_td,0}; + if(strchr(tableTags,aChildTag)) { + //if you're here, we know we can correctly backward propagate. + result=BackwardPropagate(aVector,aParentTag,aChildTag); + } + } + break; + case eHTMLTag_tr: if(PR_TRUE==CanContain(eHTMLTag_td,aChildTag)) { aVector.Append((PRUnichar)eHTMLTag_td); diff --git a/parser/htmlparser/src/nsHTMLParser.cpp b/parser/htmlparser/src/nsHTMLParser.cpp index 4e3f39a79929..57f932ff70df 100644 --- a/parser/htmlparser/src/nsHTMLParser.cpp +++ b/parser/htmlparser/src/nsHTMLParser.cpp @@ -769,7 +769,7 @@ PRInt32 nsHTMLParser::CollectAttributes(nsCParserNode& aNode,PRInt32 aCount){ } else (*mCurrentPos)--; } - else kInterrupted; + else return kInterrupted; } else return kInterrupted; } @@ -1023,10 +1023,15 @@ PRInt32 nsHTMLParser::HandleEndToken(CToken* aToken) { */ PRInt32 nsHTMLParser::HandleEntityToken(CToken* aToken) { NS_PRECONDITION(0!=aToken,kNullToken); - CEntityToken* et = (CEntityToken*)(aToken); - PRInt32 result=kNoError; - nsCParserNode aNode((CHTMLToken*)aToken); - result=AddLeaf(aNode); + + CEntityToken* et = (CEntityToken*)(aToken); + PRInt32 result=kNoError; + eHTMLTags tokenTagType=et->GetHTMLTag(); + + if(PR_FALSE==mDTD->CanOmit(GetTopNode(),tokenTagType)) { + nsCParserNode aNode((CHTMLToken*)aToken); + result=AddLeaf(aNode); + } return result; } diff --git a/parser/htmlparser/src/nsHTMLTokens.cpp b/parser/htmlparser/src/nsHTMLTokens.cpp index 791846a81f8f..9e9ab3c745da 100644 --- a/parser/htmlparser/src/nsHTMLTokens.cpp +++ b/parser/htmlparser/src/nsHTMLTokens.cpp @@ -129,6 +129,7 @@ HTMLTagEntry gHTMLTagTable[] = {"DT", eHTMLTag_dt}, {"EM", eHTMLTag_em}, {"EMBED", eHTMLTag_embed}, + {"ENTITY", eHTMLTag_entity}, //a pseudo tag {"FIELDSET", eHTMLTag_fieldset}, {"FONT", eHTMLTag_font}, {"FOOTER", eHTMLTag_footer}, {"FORM", eHTMLTag_form}, @@ -968,6 +969,7 @@ PRInt32 CWhitespaceToken::Consume(PRUnichar aChar, CScanner& aScanner) { */ CEntityToken::CEntityToken(const nsString& aName) : CHTMLToken(aName) { mOrdinalValue=eToken_entity; + mTagType=eHTMLTag_entity; #ifdef VERBOSE_DEBUG if(!VerifyEntityTable()) { cout<<"Entity table is invalid!" << endl; diff --git a/parser/htmlparser/src/nsHTMLTokens.h b/parser/htmlparser/src/nsHTMLTokens.h index 4c6c2af6e33f..d1083cd6afab 100644 --- a/parser/htmlparser/src/nsHTMLTokens.h +++ b/parser/htmlparser/src/nsHTMLTokens.h @@ -61,7 +61,7 @@ enum eHTMLTags eHTMLTag_code, eHTMLTag_col, eHTMLTag_colgroup, eHTMLTag_comment, eHTMLTag_dd, eHTMLTag_del, eHTMLTag_dfn, eHTMLTag_dir, eHTMLTag_div, eHTMLTag_dl, eHTMLTag_dt, - eHTMLTag_em, eHTMLTag_embed, + eHTMLTag_em, eHTMLTag_embed, eHTMLTag_entity, eHTMLTag_fieldset, eHTMLTag_font, eHTMLTag_footer, eHTMLTag_form, eHTMLTag_frame, eHTMLTag_frameset, //39 eHTMLTag_h1, eHTMLTag_h2, eHTMLTag_h3, eHTMLTag_h4,