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,