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;
}