From ff14b7a0cff6f5185d3b47f01c81bffa694d48be Mon Sep 17 00:00:00 2001 From: "nisheeth%netscape.com" Date: Thu, 28 Oct 1999 01:50:37 +0000 Subject: [PATCH] r=nisheeth. Fix for bug 9781 submitted by Johnny Stenbeck (jst@citec.fi). Thanks Johnny. --- content/xml/document/src/nsXMLContentSink.cpp | 13 +++++- htmlparser/src/nsExpatTokenizer.cpp | 46 ++++++++++--------- htmlparser/src/nsExpatTokenizer.h | 2 + layout/xml/document/src/nsXMLContentSink.cpp | 13 +++++- parser/htmlparser/src/nsExpatTokenizer.cpp | 46 ++++++++++--------- parser/htmlparser/src/nsExpatTokenizer.h | 2 + 6 files changed, 76 insertions(+), 46 deletions(-) diff --git a/content/xml/document/src/nsXMLContentSink.cpp b/content/xml/document/src/nsXMLContentSink.cpp index ff712a17d9ce..302aa1daaebe 100644 --- a/content/xml/document/src/nsXMLContentSink.cpp +++ b/content/xml/document/src/nsXMLContentSink.cpp @@ -834,7 +834,18 @@ nsXMLContentSink::AddLeaf(const nsIParserNode& aNode) break; case eToken_cdatasection: - AddCDATASection(aNode); + /* + * If we're inside a tag we add the data as text so that + * the script can be processed. + * + * -- jst@citec.fi + */ + if (mInScript) { + AddText(aNode.GetText()); + } else { + AddCDATASection(aNode); + } + break; case eToken_entity: diff --git a/htmlparser/src/nsExpatTokenizer.cpp b/htmlparser/src/nsExpatTokenizer.cpp index 3dd2c827ba61..dacc83b4bd81 100644 --- a/htmlparser/src/nsExpatTokenizer.cpp +++ b/htmlparser/src/nsExpatTokenizer.cpp @@ -138,6 +138,9 @@ void nsExpatTokenizer::SetupExpatCallbacks(void) { XML_SetExternalEntityRefHandler(mExpatParser, HandleExternalEntityRef); XML_SetCommentHandler(mExpatParser, HandleComment); XML_SetUnknownEncodingHandler(mExpatParser, HandleUnknownEncoding, NULL); + XML_SetCdataSectionHandler(mExpatParser, HandleStartCdataSection, + HandleEndCdataSection); + XML_SetDoctypeDeclHandler(mExpatParser, HandleStartDoctypeDecl, HandleEndDoctypeDecl); } } @@ -399,31 +402,13 @@ void nsExpatTokenizer::HandleEndElement(void *userData, const XML_Char *name) { void nsExpatTokenizer::HandleCharacterData(void *userData, const XML_Char *s, int len) { CCDATASectionToken* currentCDataToken = (CCDATASectionToken*) userData; - PRBool StartOfCDataSection = (!currentCDataToken && len == 0); - PRBool EndOfCDataSection = (currentCDataToken && len == 0); - // Either create a new token (if not currently within a CDATA section) or add the - // current string from expat to the current CDATA token. - - if (StartOfCDataSection) { - // Set up state so that we know that we are within a CDATA section. - currentCDataToken = (CCDATASectionToken*) gTokenRecycler->CreateTokenOfType(eToken_cdatasection,eHTMLTag_unknown); - XML_SetUserData(gExpatParser, (void *) currentCDataToken); - } - else if (EndOfCDataSection) { - // We've reached the end of the current CDATA section. Push the current CDATA token - // onto the token queue and reset state to being outside a CDATA section. - CToken* tempCDATAToken = (CToken*) currentCDataToken; - AddToken(tempCDATAToken,NS_OK,*gTokenDeque,gTokenRecycler); - currentCDataToken = 0; - XML_SetUserData(gExpatParser, 0); - } - else if (currentCDataToken) { - // While there exists a current CDATA token, keep appending all strings from expat into it. + if (currentCDataToken) { + // While there exists a current CDATA token, keep appending all strings + // from expat into it. nsString& theString = currentCDataToken->GetStringValueXXX(); theString.Append((PRUnichar *) s,len); - } - else { + } else { CToken* newToken = 0; switch(s[0]){ @@ -462,6 +447,23 @@ void nsExpatTokenizer::HandleComment(void *userData, const XML_Char *name) { } } +void nsExpatTokenizer::HandleStartCdataSection(void *userData) { + CToken* cdataToken = gTokenRecycler->CreateTokenOfType(eToken_cdatasection, + eHTMLTag_unknown); + + XML_SetUserData(gExpatParser, (void *) cdataToken); +} + +void nsExpatTokenizer::HandleEndCdataSection(void *userData) { + CToken* currentCDataToken = (CToken*) userData; + + // We've reached the end of the current CDATA section. Push the current + // CDATA token onto the token queue + AddToken(currentCDataToken,NS_OK,*gTokenDeque,gTokenRecycler); + + XML_SetUserData(gExpatParser, nsnull); +} + void nsExpatTokenizer::HandleProcessingInstruction(void *userData, const XML_Char *target, const XML_Char *data){ CToken* theToken=gTokenRecycler->CreateTokenOfType(eToken_instruction,eHTMLTag_unknown); if(theToken) { diff --git a/htmlparser/src/nsExpatTokenizer.h b/htmlparser/src/nsExpatTokenizer.h index 6e0802fedc93..34f768a19448 100644 --- a/htmlparser/src/nsExpatTokenizer.h +++ b/htmlparser/src/nsExpatTokenizer.h @@ -102,6 +102,8 @@ protected: const XML_Char *target, const XML_Char *data); static void HandleDefault(void *userData, const XML_Char *s, int len); + static void HandleStartCdataSection(void *userData); + static void HandleEndCdataSection(void *userData); static void HandleUnparsedEntityDecl(void *userData, const XML_Char *entityName, const XML_Char *base, diff --git a/layout/xml/document/src/nsXMLContentSink.cpp b/layout/xml/document/src/nsXMLContentSink.cpp index ff712a17d9ce..302aa1daaebe 100644 --- a/layout/xml/document/src/nsXMLContentSink.cpp +++ b/layout/xml/document/src/nsXMLContentSink.cpp @@ -834,7 +834,18 @@ nsXMLContentSink::AddLeaf(const nsIParserNode& aNode) break; case eToken_cdatasection: - AddCDATASection(aNode); + /* + * If we're inside a tag we add the data as text so that + * the script can be processed. + * + * -- jst@citec.fi + */ + if (mInScript) { + AddText(aNode.GetText()); + } else { + AddCDATASection(aNode); + } + break; case eToken_entity: diff --git a/parser/htmlparser/src/nsExpatTokenizer.cpp b/parser/htmlparser/src/nsExpatTokenizer.cpp index 3dd2c827ba61..dacc83b4bd81 100644 --- a/parser/htmlparser/src/nsExpatTokenizer.cpp +++ b/parser/htmlparser/src/nsExpatTokenizer.cpp @@ -138,6 +138,9 @@ void nsExpatTokenizer::SetupExpatCallbacks(void) { XML_SetExternalEntityRefHandler(mExpatParser, HandleExternalEntityRef); XML_SetCommentHandler(mExpatParser, HandleComment); XML_SetUnknownEncodingHandler(mExpatParser, HandleUnknownEncoding, NULL); + XML_SetCdataSectionHandler(mExpatParser, HandleStartCdataSection, + HandleEndCdataSection); + XML_SetDoctypeDeclHandler(mExpatParser, HandleStartDoctypeDecl, HandleEndDoctypeDecl); } } @@ -399,31 +402,13 @@ void nsExpatTokenizer::HandleEndElement(void *userData, const XML_Char *name) { void nsExpatTokenizer::HandleCharacterData(void *userData, const XML_Char *s, int len) { CCDATASectionToken* currentCDataToken = (CCDATASectionToken*) userData; - PRBool StartOfCDataSection = (!currentCDataToken && len == 0); - PRBool EndOfCDataSection = (currentCDataToken && len == 0); - // Either create a new token (if not currently within a CDATA section) or add the - // current string from expat to the current CDATA token. - - if (StartOfCDataSection) { - // Set up state so that we know that we are within a CDATA section. - currentCDataToken = (CCDATASectionToken*) gTokenRecycler->CreateTokenOfType(eToken_cdatasection,eHTMLTag_unknown); - XML_SetUserData(gExpatParser, (void *) currentCDataToken); - } - else if (EndOfCDataSection) { - // We've reached the end of the current CDATA section. Push the current CDATA token - // onto the token queue and reset state to being outside a CDATA section. - CToken* tempCDATAToken = (CToken*) currentCDataToken; - AddToken(tempCDATAToken,NS_OK,*gTokenDeque,gTokenRecycler); - currentCDataToken = 0; - XML_SetUserData(gExpatParser, 0); - } - else if (currentCDataToken) { - // While there exists a current CDATA token, keep appending all strings from expat into it. + if (currentCDataToken) { + // While there exists a current CDATA token, keep appending all strings + // from expat into it. nsString& theString = currentCDataToken->GetStringValueXXX(); theString.Append((PRUnichar *) s,len); - } - else { + } else { CToken* newToken = 0; switch(s[0]){ @@ -462,6 +447,23 @@ void nsExpatTokenizer::HandleComment(void *userData, const XML_Char *name) { } } +void nsExpatTokenizer::HandleStartCdataSection(void *userData) { + CToken* cdataToken = gTokenRecycler->CreateTokenOfType(eToken_cdatasection, + eHTMLTag_unknown); + + XML_SetUserData(gExpatParser, (void *) cdataToken); +} + +void nsExpatTokenizer::HandleEndCdataSection(void *userData) { + CToken* currentCDataToken = (CToken*) userData; + + // We've reached the end of the current CDATA section. Push the current + // CDATA token onto the token queue + AddToken(currentCDataToken,NS_OK,*gTokenDeque,gTokenRecycler); + + XML_SetUserData(gExpatParser, nsnull); +} + void nsExpatTokenizer::HandleProcessingInstruction(void *userData, const XML_Char *target, const XML_Char *data){ CToken* theToken=gTokenRecycler->CreateTokenOfType(eToken_instruction,eHTMLTag_unknown); if(theToken) { diff --git a/parser/htmlparser/src/nsExpatTokenizer.h b/parser/htmlparser/src/nsExpatTokenizer.h index 6e0802fedc93..34f768a19448 100644 --- a/parser/htmlparser/src/nsExpatTokenizer.h +++ b/parser/htmlparser/src/nsExpatTokenizer.h @@ -102,6 +102,8 @@ protected: const XML_Char *target, const XML_Char *data); static void HandleDefault(void *userData, const XML_Char *s, int len); + static void HandleStartCdataSection(void *userData); + static void HandleEndCdataSection(void *userData); static void HandleUnparsedEntityDecl(void *userData, const XML_Char *entityName, const XML_Char *base,