diff --git a/mozilla/htmlparser/src/CNavDTD.cpp b/mozilla/htmlparser/src/CNavDTD.cpp index a3a482d79f0..3143746ed36 100644 --- a/mozilla/htmlparser/src/CNavDTD.cpp +++ b/mozilla/htmlparser/src/CNavDTD.cpp @@ -701,7 +701,7 @@ nsresult CNavDTD::HandleToken(CToken* aToken,nsIParser* aParser){ static eHTMLTags passThru[]= { eHTMLTag_html,eHTMLTag_comment,eHTMLTag_newline, eHTMLTag_whitespace,eHTMLTag_script,eHTMLTag_noscript, - eHTMLTag_userdefined}; + eHTMLTag_nolayer,eHTMLTag_markupDecl,eHTMLTag_userdefined}; if(!FindTagInSet(theTag,passThru,sizeof(passThru)/sizeof(eHTMLTag_unknown))){ if(!gHTMLElements[eHTMLTag_html].SectionContains(theTag,PR_FALSE)) { if((!mHadBody) && (!mHadFrameset)){ @@ -1186,19 +1186,23 @@ nsresult CNavDTD::HandleOmittedTag(CToken* aToken,eHTMLTags aChildTag,eHTMLTags isNotWhiteSpace = mSaveBadTokens = PR_TRUE; } if(mSaveBadTokens) { + aToken->mRecycle=PR_FALSE; mBodyContext->SaveToken(aToken,theBCIndex); // If the token is attributed then save those attributes too. if(attrCount > 0) { nsCParserNode* theAttrNode = (nsCParserNode*)&aNode; while(attrCount > 0){ - mBodyContext->SaveToken(theAttrNode->PopAttributeToken(),theBCIndex); + CToken* theAttrToken=theAttrNode->PopAttributeToken(); + if(theAttrToken) { + mBodyContext->SaveToken(theAttrToken,theBCIndex); + theAttrToken->mRecycle=PR_FALSE; + } attrCount--; } } if(!IsContainer(aChildTag) && isNotWhiteSpace) { mSaveBadTokens = PR_FALSE; } - result=NS_ERROR_HTMLPARSER_MISPLACED; } } @@ -1297,8 +1301,9 @@ nsresult CNavDTD::HandleStartToken(CToken* aToken) { default: { - if(theHeadIsParent) + if(theHeadIsParent) { result=AddHeadLeaf(*theNode); + } else result=HandleDefaultStartToken(aToken,theChildTag,*theNode); } break; @@ -1553,7 +1558,7 @@ nsresult CNavDTD::HandleSavedTokensAbove(eHTMLTags aTag) } theBadTokenCount--; } - result=NavDispatchTokenHandler(theToken,this); + result=HandleToken(theToken,mParser); } } theBadTokenCount--; diff --git a/mozilla/htmlparser/src/nsDTDUtils.cpp b/mozilla/htmlparser/src/nsDTDUtils.cpp index 5fc888becf7..b421383f8d7 100644 --- a/mozilla/htmlparser/src/nsDTDUtils.cpp +++ b/mozilla/htmlparser/src/nsDTDUtils.cpp @@ -200,6 +200,18 @@ nsDTDContext::nsDTDContext() : mStack(), mSkipped(0), mStyles(0) { * @update gess9/10/98 */ nsDTDContext::~nsDTDContext() { + PRInt32 theSize=mSkipped.GetSize(); + if(theSize>0) { + CTokenDeallocator theDeallocator; + for(PRInt32 i=0;iGetSize()>0) theDeque->ForEach(theDeallocator); + delete theDeque; + theDeque=nsnull; + } + } + } } /** @@ -440,6 +452,7 @@ CTokenRecycler::~CTokenRecycler() { } } + class CTokenFinder: public nsDequeFunctor{ public: CTokenFinder(CToken* aToken) {mToken=aToken;} diff --git a/mozilla/htmlparser/src/nsElementTable.cpp b/mozilla/htmlparser/src/nsElementTable.cpp index 91eb74f5ba5..10548dc4cb0 100644 --- a/mozilla/htmlparser/src/nsElementTable.cpp +++ b/mozilla/htmlparser/src/nsElementTable.cpp @@ -1186,7 +1186,7 @@ nsHTMLElement gHTMLElements[] = { /*special props, prop-range*/ 0, kNoPropRange, /*special parents,kids,skip*/ 0,0,eHTMLTag_unknown}, - { /*tag*/ eHTMLTag_mdo, // Markup Declaration Open, i.e., " Markup Declaration Open. return; } @@ -966,7 +966,7 @@ void nsHTMLContentSinkStream::AddEndTag(const nsIParserNode& aNode) { tagName = "--"; } - else if(tag == eHTMLTag_mdo) + else if(tag == eHTMLTag_markupDecl) { // mod => Markup Declaration Open, i.e., "CreateTokenOfType(eToken_comment,eHTMLTag_comment); else - aToken = theRecycler->CreateTokenOfType(eToken_doctypeDecl,eHTMLTag_unknown); + aToken = theRecycler->CreateTokenOfType(eToken_doctypeDecl,eHTMLTag_markupDecl); if(aToken) { result=aToken->Consume(aChar,aScanner); diff --git a/mozilla/htmlparser/src/nsXIFDTD.cpp b/mozilla/htmlparser/src/nsXIFDTD.cpp index cf3f6d1f9f8..ced6481210c 100644 --- a/mozilla/htmlparser/src/nsXIFDTD.cpp +++ b/mozilla/htmlparser/src/nsXIFDTD.cpp @@ -85,7 +85,7 @@ nsXIFTagEntry gXIFTagTable[] = {"leaf", eXIFTag_leaf}, {"link", eXIFTag_link}, - {"markup_declaration", eXIFTag_mdo}, + {"markup_declaration", eXIFTag_markupDecl}, {"section", eXIFTag_section}, {"section_body", eXIFTag_section_body}, @@ -716,7 +716,7 @@ nsresult nsXIFDTD::HandleStartToken(CToken* aToken) { AddCSSDeclaration(node); break; - case eXIFTag_mdo: + case eXIFTag_markupDecl: mSink->OpenContainer(node); break; @@ -780,7 +780,7 @@ nsresult nsXIFDTD::HandleEndToken(CToken* aToken) { EndCSSDeclarationList(node); break; - case eXIFTag_mdo: + case eXIFTag_markupDecl: mSink->CloseContainer(node); default: diff --git a/mozilla/htmlparser/src/nsXIFDTD.h b/mozilla/htmlparser/src/nsXIFDTD.h index f13129b21d9..8a381b7f84f 100644 --- a/mozilla/htmlparser/src/nsXIFDTD.h +++ b/mozilla/htmlparser/src/nsXIFDTD.h @@ -83,9 +83,9 @@ enum eXIFTags eXIFTag_url, eXIFTag_xml, - eXIFTag_mdo = eHTMLTag_mdo, - eXIFTag_newline = eHTMLTag_newline, - eXIFTag_text = eHTMLTag_text, + eXIFTag_markupDecl = eHTMLTag_markupDecl, + eXIFTag_newline = eHTMLTag_newline, + eXIFTag_text = eHTMLTag_text, eXIFTag_whitespace = eHTMLTag_whitespace, eXIFTag_userdefined diff --git a/mozilla/parser/htmlparser/src/CNavDTD.cpp b/mozilla/parser/htmlparser/src/CNavDTD.cpp index a3a482d79f0..3143746ed36 100644 --- a/mozilla/parser/htmlparser/src/CNavDTD.cpp +++ b/mozilla/parser/htmlparser/src/CNavDTD.cpp @@ -701,7 +701,7 @@ nsresult CNavDTD::HandleToken(CToken* aToken,nsIParser* aParser){ static eHTMLTags passThru[]= { eHTMLTag_html,eHTMLTag_comment,eHTMLTag_newline, eHTMLTag_whitespace,eHTMLTag_script,eHTMLTag_noscript, - eHTMLTag_userdefined}; + eHTMLTag_nolayer,eHTMLTag_markupDecl,eHTMLTag_userdefined}; if(!FindTagInSet(theTag,passThru,sizeof(passThru)/sizeof(eHTMLTag_unknown))){ if(!gHTMLElements[eHTMLTag_html].SectionContains(theTag,PR_FALSE)) { if((!mHadBody) && (!mHadFrameset)){ @@ -1186,19 +1186,23 @@ nsresult CNavDTD::HandleOmittedTag(CToken* aToken,eHTMLTags aChildTag,eHTMLTags isNotWhiteSpace = mSaveBadTokens = PR_TRUE; } if(mSaveBadTokens) { + aToken->mRecycle=PR_FALSE; mBodyContext->SaveToken(aToken,theBCIndex); // If the token is attributed then save those attributes too. if(attrCount > 0) { nsCParserNode* theAttrNode = (nsCParserNode*)&aNode; while(attrCount > 0){ - mBodyContext->SaveToken(theAttrNode->PopAttributeToken(),theBCIndex); + CToken* theAttrToken=theAttrNode->PopAttributeToken(); + if(theAttrToken) { + mBodyContext->SaveToken(theAttrToken,theBCIndex); + theAttrToken->mRecycle=PR_FALSE; + } attrCount--; } } if(!IsContainer(aChildTag) && isNotWhiteSpace) { mSaveBadTokens = PR_FALSE; } - result=NS_ERROR_HTMLPARSER_MISPLACED; } } @@ -1297,8 +1301,9 @@ nsresult CNavDTD::HandleStartToken(CToken* aToken) { default: { - if(theHeadIsParent) + if(theHeadIsParent) { result=AddHeadLeaf(*theNode); + } else result=HandleDefaultStartToken(aToken,theChildTag,*theNode); } break; @@ -1553,7 +1558,7 @@ nsresult CNavDTD::HandleSavedTokensAbove(eHTMLTags aTag) } theBadTokenCount--; } - result=NavDispatchTokenHandler(theToken,this); + result=HandleToken(theToken,mParser); } } theBadTokenCount--; diff --git a/mozilla/parser/htmlparser/src/nsDTDUtils.cpp b/mozilla/parser/htmlparser/src/nsDTDUtils.cpp index 5fc888becf7..b421383f8d7 100644 --- a/mozilla/parser/htmlparser/src/nsDTDUtils.cpp +++ b/mozilla/parser/htmlparser/src/nsDTDUtils.cpp @@ -200,6 +200,18 @@ nsDTDContext::nsDTDContext() : mStack(), mSkipped(0), mStyles(0) { * @update gess9/10/98 */ nsDTDContext::~nsDTDContext() { + PRInt32 theSize=mSkipped.GetSize(); + if(theSize>0) { + CTokenDeallocator theDeallocator; + for(PRInt32 i=0;iGetSize()>0) theDeque->ForEach(theDeallocator); + delete theDeque; + theDeque=nsnull; + } + } + } } /** @@ -440,6 +452,7 @@ CTokenRecycler::~CTokenRecycler() { } } + class CTokenFinder: public nsDequeFunctor{ public: CTokenFinder(CToken* aToken) {mToken=aToken;} diff --git a/mozilla/parser/htmlparser/src/nsElementTable.cpp b/mozilla/parser/htmlparser/src/nsElementTable.cpp index 91eb74f5ba5..10548dc4cb0 100644 --- a/mozilla/parser/htmlparser/src/nsElementTable.cpp +++ b/mozilla/parser/htmlparser/src/nsElementTable.cpp @@ -1186,7 +1186,7 @@ nsHTMLElement gHTMLElements[] = { /*special props, prop-range*/ 0, kNoPropRange, /*special parents,kids,skip*/ 0,0,eHTMLTag_unknown}, - { /*tag*/ eHTMLTag_mdo, // Markup Declaration Open, i.e., " Markup Declaration Open. return; } @@ -966,7 +966,7 @@ void nsHTMLContentSinkStream::AddEndTag(const nsIParserNode& aNode) { tagName = "--"; } - else if(tag == eHTMLTag_mdo) + else if(tag == eHTMLTag_markupDecl) { // mod => Markup Declaration Open, i.e., "CreateTokenOfType(eToken_comment,eHTMLTag_comment); else - aToken = theRecycler->CreateTokenOfType(eToken_doctypeDecl,eHTMLTag_unknown); + aToken = theRecycler->CreateTokenOfType(eToken_doctypeDecl,eHTMLTag_markupDecl); if(aToken) { result=aToken->Consume(aChar,aScanner); diff --git a/mozilla/parser/htmlparser/src/nsXIFDTD.cpp b/mozilla/parser/htmlparser/src/nsXIFDTD.cpp index cf3f6d1f9f8..ced6481210c 100644 --- a/mozilla/parser/htmlparser/src/nsXIFDTD.cpp +++ b/mozilla/parser/htmlparser/src/nsXIFDTD.cpp @@ -85,7 +85,7 @@ nsXIFTagEntry gXIFTagTable[] = {"leaf", eXIFTag_leaf}, {"link", eXIFTag_link}, - {"markup_declaration", eXIFTag_mdo}, + {"markup_declaration", eXIFTag_markupDecl}, {"section", eXIFTag_section}, {"section_body", eXIFTag_section_body}, @@ -716,7 +716,7 @@ nsresult nsXIFDTD::HandleStartToken(CToken* aToken) { AddCSSDeclaration(node); break; - case eXIFTag_mdo: + case eXIFTag_markupDecl: mSink->OpenContainer(node); break; @@ -780,7 +780,7 @@ nsresult nsXIFDTD::HandleEndToken(CToken* aToken) { EndCSSDeclarationList(node); break; - case eXIFTag_mdo: + case eXIFTag_markupDecl: mSink->CloseContainer(node); default: diff --git a/mozilla/parser/htmlparser/src/nsXIFDTD.h b/mozilla/parser/htmlparser/src/nsXIFDTD.h index f13129b21d9..8a381b7f84f 100644 --- a/mozilla/parser/htmlparser/src/nsXIFDTD.h +++ b/mozilla/parser/htmlparser/src/nsXIFDTD.h @@ -83,9 +83,9 @@ enum eXIFTags eXIFTag_url, eXIFTag_xml, - eXIFTag_mdo = eHTMLTag_mdo, - eXIFTag_newline = eHTMLTag_newline, - eXIFTag_text = eHTMLTag_text, + eXIFTag_markupDecl = eHTMLTag_markupDecl, + eXIFTag_newline = eHTMLTag_newline, + eXIFTag_text = eHTMLTag_text, eXIFTag_whitespace = eHTMLTag_whitespace, eXIFTag_userdefined