From ab0efe191c3cc087fb94ae8eaa8ca8febd6b695b Mon Sep 17 00:00:00 2001 From: "harishd%netscape.com" Date: Wed, 8 Sep 1999 18:58:34 +0000 Subject: [PATCH] Fix for bug#s 12184, 13170, 13171. git-svn-id: svn://10.0.0.236/trunk@46368 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/htmlparser/src/CNavDTD.cpp | 48 ++++++++++++++--------- mozilla/parser/htmlparser/src/CNavDTD.cpp | 48 ++++++++++++++--------- 2 files changed, 60 insertions(+), 36 deletions(-) diff --git a/mozilla/htmlparser/src/CNavDTD.cpp b/mozilla/htmlparser/src/CNavDTD.cpp index e00221c5cfc..09413001b87 100644 --- a/mozilla/htmlparser/src/CNavDTD.cpp +++ b/mozilla/htmlparser/src/CNavDTD.cpp @@ -583,15 +583,21 @@ nsresult CNavDTD::DidBuildModel(nsresult anErrorCode,PRBool aNotifySink,nsIParse if(aParser){ if(aNotifySink){ - if((NS_OK==anErrorCode) && (mBodyContext->GetCount()>0)) { - eHTMLTags theTarget; - while(mBodyContext->GetCount() > 0) { - theTarget = mBodyContext->Last(); - if(gHTMLElements[theTarget].HasSpecialProperty(kBadContentWatch)) - result = HandleSavedTokensAbove(theTarget); - CloseContainersTo(theTarget,PR_FALSE); - } - //result = CloseContainersTo(0,eHTMLTag_unknown,PR_FALSE); + if((NS_OK==anErrorCode) && (mBodyContext->GetCount()>0)) { + if(mSkipTarget) { + CHTMLToken* theEndToken=nsnull; + theEndToken=(CHTMLToken*)gRecycler->CreateTokenOfType(eToken_end,mSkipTarget); + if(theEndToken) result=HandleToken(theEndToken,mParser); + } + if(result==NS_OK) { + eHTMLTags theTarget; + while(mBodyContext->GetCount() > 0) { + theTarget = mBodyContext->Last(); + if(gHTMLElements[theTarget].HasSpecialProperty(kBadContentWatch)) + result = HandleSavedTokensAbove(theTarget); + CloseContainersTo(theTarget,PR_FALSE); + } + } } #ifdef RGESS_DEBUG @@ -1462,8 +1468,8 @@ nsresult CNavDTD::HandleEndToken(CToken* aToken) { else { if(kNotFound==GetIndexOfChildOrSynonym(mBodyContext->mStack,theChildTag)) { UpdateStyleStackForCloseTag(theChildTag,theChildTag); - if(nsHTMLElement::IsBlockCloser(theChildTag)) { - // Oh boy!! we found a "stray" block closer. Nav4.x and IE introduce line break in + if(gHTMLElements[theChildTag].IsMemberOf(kBlockEntity)) { + // Oh boy!! we found a "stray" block entity. Nav4.x and IE introduce line break in // such cases. So, let's simulate that effect for compatibility. // Ex. Hello

There CHTMLToken* theToken = (CHTMLToken*)gRecycler->CreateTokenOfType(eToken_start,theChildTag); @@ -1541,7 +1547,7 @@ nsresult CNavDTD::HandleSavedTokensAbove(eHTMLTags aTag) } theBadTokenCount--; } - result = HandleStartToken(theToken); + result=NavDispatchTokenHandler(theToken,this); } } theBadTokenCount--; @@ -1572,17 +1578,23 @@ nsresult CNavDTD::HandleSavedTokensAbove(eHTMLTags aTag) nsresult CNavDTD::HandleEntityToken(CToken* aToken) { NS_PRECONDITION(0!=aToken,kNullToken); - nsresult result=NS_OK; - - if(PR_FALSE==CanOmit(mBodyContext->Last(),eHTMLTag_entity)) { - nsCParserNode aNode((CHTMLToken*)aToken,mLineNumber); + nsresult result=NS_OK; + eHTMLTags theParentTag=mBodyContext->Last(); + + nsCParserNode aNode((CHTMLToken*)aToken,mLineNumber); + if(CanOmit(theParentTag,eHTMLTag_entity)) { + eHTMLTags theCurrTag=(eHTMLTags)aToken->GetTypeID(); + result=HandleOmittedTag(aToken,theCurrTag,theParentTag,aNode); + return result; + } + #ifdef RICKG_DEBUG WriteTokenToLog(aToken); #endif - result=AddLeaf(aNode); - } + result=AddLeaf(aNode); + return result; } diff --git a/mozilla/parser/htmlparser/src/CNavDTD.cpp b/mozilla/parser/htmlparser/src/CNavDTD.cpp index e00221c5cfc..09413001b87 100644 --- a/mozilla/parser/htmlparser/src/CNavDTD.cpp +++ b/mozilla/parser/htmlparser/src/CNavDTD.cpp @@ -583,15 +583,21 @@ nsresult CNavDTD::DidBuildModel(nsresult anErrorCode,PRBool aNotifySink,nsIParse if(aParser){ if(aNotifySink){ - if((NS_OK==anErrorCode) && (mBodyContext->GetCount()>0)) { - eHTMLTags theTarget; - while(mBodyContext->GetCount() > 0) { - theTarget = mBodyContext->Last(); - if(gHTMLElements[theTarget].HasSpecialProperty(kBadContentWatch)) - result = HandleSavedTokensAbove(theTarget); - CloseContainersTo(theTarget,PR_FALSE); - } - //result = CloseContainersTo(0,eHTMLTag_unknown,PR_FALSE); + if((NS_OK==anErrorCode) && (mBodyContext->GetCount()>0)) { + if(mSkipTarget) { + CHTMLToken* theEndToken=nsnull; + theEndToken=(CHTMLToken*)gRecycler->CreateTokenOfType(eToken_end,mSkipTarget); + if(theEndToken) result=HandleToken(theEndToken,mParser); + } + if(result==NS_OK) { + eHTMLTags theTarget; + while(mBodyContext->GetCount() > 0) { + theTarget = mBodyContext->Last(); + if(gHTMLElements[theTarget].HasSpecialProperty(kBadContentWatch)) + result = HandleSavedTokensAbove(theTarget); + CloseContainersTo(theTarget,PR_FALSE); + } + } } #ifdef RGESS_DEBUG @@ -1462,8 +1468,8 @@ nsresult CNavDTD::HandleEndToken(CToken* aToken) { else { if(kNotFound==GetIndexOfChildOrSynonym(mBodyContext->mStack,theChildTag)) { UpdateStyleStackForCloseTag(theChildTag,theChildTag); - if(nsHTMLElement::IsBlockCloser(theChildTag)) { - // Oh boy!! we found a "stray" block closer. Nav4.x and IE introduce line break in + if(gHTMLElements[theChildTag].IsMemberOf(kBlockEntity)) { + // Oh boy!! we found a "stray" block entity. Nav4.x and IE introduce line break in // such cases. So, let's simulate that effect for compatibility. // Ex. Hello

There CHTMLToken* theToken = (CHTMLToken*)gRecycler->CreateTokenOfType(eToken_start,theChildTag); @@ -1541,7 +1547,7 @@ nsresult CNavDTD::HandleSavedTokensAbove(eHTMLTags aTag) } theBadTokenCount--; } - result = HandleStartToken(theToken); + result=NavDispatchTokenHandler(theToken,this); } } theBadTokenCount--; @@ -1572,17 +1578,23 @@ nsresult CNavDTD::HandleSavedTokensAbove(eHTMLTags aTag) nsresult CNavDTD::HandleEntityToken(CToken* aToken) { NS_PRECONDITION(0!=aToken,kNullToken); - nsresult result=NS_OK; - - if(PR_FALSE==CanOmit(mBodyContext->Last(),eHTMLTag_entity)) { - nsCParserNode aNode((CHTMLToken*)aToken,mLineNumber); + nsresult result=NS_OK; + eHTMLTags theParentTag=mBodyContext->Last(); + + nsCParserNode aNode((CHTMLToken*)aToken,mLineNumber); + if(CanOmit(theParentTag,eHTMLTag_entity)) { + eHTMLTags theCurrTag=(eHTMLTags)aToken->GetTypeID(); + result=HandleOmittedTag(aToken,theCurrTag,theParentTag,aNode); + return result; + } + #ifdef RICKG_DEBUG WriteTokenToLog(aToken); #endif - result=AddLeaf(aNode); - } + result=AddLeaf(aNode); + return result; }