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
This commit is contained in:
bzbarsky%mit.edu 2003-06-25 01:29:21 +00:00
parent e355b2283f
commit a60cd171ee
2 changed files with 38 additions and 8 deletions

View File

@ -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: <![endif]-->. 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;
}

View File

@ -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: <![endif]-->. 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;
}