From e11bc6808cb2827e07ef31e0a103c49c6b69e217 Mon Sep 17 00:00:00 2001 From: "bzbarsky%mit.edu" Date: Wed, 25 Jun 2003 01:29:21 +0000 Subject: [PATCH] Fix CDATA tokenization in view-source mode end the CDATA section on "]>", not ']' (as it needs to do for normal parsing mode). Bug 209485, r=harishd, sr=jst git-svn-id: svn://10.0.0.236/trunk@144130 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/htmlparser/src/nsHTMLTokens.cpp | 23 +++++++++++++++---- .../parser/htmlparser/src/nsHTMLTokens.cpp | 23 +++++++++++++++---- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/mozilla/htmlparser/src/nsHTMLTokens.cpp b/mozilla/htmlparser/src/nsHTMLTokens.cpp index 42a556241a3..bada5595a7f 100644 --- a/mozilla/htmlparser/src/nsHTMLTokens.cpp +++ b/mozilla/htmlparser/src/nsHTMLTokens.cpp @@ -781,7 +781,7 @@ nsresult CCDATASectionToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt3 } //switch } //if } - else if (']'==aChar) { + else if (kRightSquareBracket == aChar) { result=aScanner.GetChar(aChar); //strip off the ] mTextValue.Append(aChar); result=aScanner.Peek(aChar); //then see what's next. @@ -789,9 +789,24 @@ nsresult CCDATASectionToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt3 result=aScanner.GetChar(aChar); //strip off the second ] mTextValue.Append(aChar); } - nsAutoString dummy; // skip any bad data - result=aScanner.ReadUntil(dummy,kGreaterThan,PR_FALSE); - if (NS_OK==result) { + // The goal here is to not lose data from the page when encountering + // markup like: . This means that in normal parsing, we + // allow ']' to end the marked section and just drop everything between + // it an the '>'. In view-source mode, we cannot drop things on the + // floor like that. In fact, to make view-source of XML with script in + // CDATA sections at all bearable, we need to somewhat enforce the ']>' + // terminator for marked sections. So make the tokenization somewhat + // different when in view-source _and_ dealing with a CDATA section. + PRBool inCDATA = (aFlag & NS_IPARSER_FLAG_VIEW_SOURCE) && + StringBeginsWith(mTextValue, NS_LITERAL_STRING("[CDATA[")); + if (inCDATA) { + result = aScanner.Peek(aChar); + } else { + nsAutoString dummy; // skip any bad data + result=aScanner.ReadUntil(dummy,kGreaterThan,PR_FALSE); + } + if (NS_OK==result && + (!inCDATA || kGreaterThan == aChar)) { result=aScanner.GetChar(aChar); //strip off the > done=PR_TRUE; } diff --git a/mozilla/parser/htmlparser/src/nsHTMLTokens.cpp b/mozilla/parser/htmlparser/src/nsHTMLTokens.cpp index 42a556241a3..bada5595a7f 100644 --- a/mozilla/parser/htmlparser/src/nsHTMLTokens.cpp +++ b/mozilla/parser/htmlparser/src/nsHTMLTokens.cpp @@ -781,7 +781,7 @@ nsresult CCDATASectionToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt3 } //switch } //if } - else if (']'==aChar) { + else if (kRightSquareBracket == aChar) { result=aScanner.GetChar(aChar); //strip off the ] mTextValue.Append(aChar); result=aScanner.Peek(aChar); //then see what's next. @@ -789,9 +789,24 @@ nsresult CCDATASectionToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt3 result=aScanner.GetChar(aChar); //strip off the second ] mTextValue.Append(aChar); } - nsAutoString dummy; // skip any bad data - result=aScanner.ReadUntil(dummy,kGreaterThan,PR_FALSE); - if (NS_OK==result) { + // The goal here is to not lose data from the page when encountering + // markup like: . This means that in normal parsing, we + // allow ']' to end the marked section and just drop everything between + // it an the '>'. In view-source mode, we cannot drop things on the + // floor like that. In fact, to make view-source of XML with script in + // CDATA sections at all bearable, we need to somewhat enforce the ']>' + // terminator for marked sections. So make the tokenization somewhat + // different when in view-source _and_ dealing with a CDATA section. + PRBool inCDATA = (aFlag & NS_IPARSER_FLAG_VIEW_SOURCE) && + StringBeginsWith(mTextValue, NS_LITERAL_STRING("[CDATA[")); + if (inCDATA) { + result = aScanner.Peek(aChar); + } else { + nsAutoString dummy; // skip any bad data + result=aScanner.ReadUntil(dummy,kGreaterThan,PR_FALSE); + } + if (NS_OK==result && + (!inCDATA || kGreaterThan == aChar)) { result=aScanner.GetChar(aChar); //strip off the > done=PR_TRUE; }