From 8bdf297ed2a930be6d35a4ff58b8f6848343ccd5 Mon Sep 17 00:00:00 2001 From: "bzbarsky%mit.edu" Date: Fri, 20 Feb 2004 00:26:16 +0000 Subject: [PATCH] Bug 137315. Further fixes to make the line numbers the HTML tokenizer reports correct. This should be the last of it. r=choess, sr=jst git-svn-id: svn://10.0.0.236/trunk@152987 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/htmlparser/src/nsHTMLTokens.cpp | 52 +++++++++++++++---- .../parser/htmlparser/src/nsHTMLTokens.cpp | 52 +++++++++++++++---- 2 files changed, 86 insertions(+), 18 deletions(-) diff --git a/mozilla/htmlparser/src/nsHTMLTokens.cpp b/mozilla/htmlparser/src/nsHTMLTokens.cpp index eba2016464a..c96840fb715 100644 --- a/mozilla/htmlparser/src/nsHTMLTokens.cpp +++ b/mozilla/htmlparser/src/nsHTMLTokens.cpp @@ -747,7 +747,7 @@ PRInt32 CCDATASectionToken::GetTokenType(void) { */ nsresult CCDATASectionToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 aFlag) { static const PRUnichar theTerminalsChars[] = - { PRUnichar('\r'), PRUnichar(']'), PRUnichar(0) }; + { PRUnichar('\r'), PRUnichar('\n'), PRUnichar(']'), PRUnichar(0) }; static const nsReadEndCondition theEndCondition(theTerminalsChars); nsresult result=NS_OK; PRBool done=PR_FALSE; @@ -764,6 +764,7 @@ nsresult CCDATASectionToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt3 case kCR: result=aScanner.GetChar(aChar); //strip off the \r mTextValue.Append(NS_LITERAL_STRING("\n\n")); + mNewlineCount += 2; break; case kNewLine: //which means we saw \r\n, which becomes \n @@ -771,10 +772,16 @@ nsresult CCDATASectionToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt3 //now fall through on purpose... default: mTextValue.Append(NS_LITERAL_STRING("\n")); + mNewlineCount++; break; } //switch } //if } + else if (kNewLine == aChar) { + result=aScanner.GetChar(aChar); + mTextValue.Append(aChar); + ++mNewlineCount; + } else if (kRightSquareBracket == aChar) { result=aScanner.GetChar(aChar); //strip off the ] mTextValue.Append(aChar); @@ -1595,6 +1602,7 @@ nsresult ConsumeAttributeEntity(nsString& aString, */ static nsresult ConsumeAttributeValueText(nsString& aString, + PRInt32& aNewlineCount, nsScanner& aScanner, const nsReadEndCondition& aEndCondition, PRInt32 aFlag) @@ -1610,6 +1618,25 @@ nsresult ConsumeAttributeValueText(nsString& aString, if(ch == kAmpersand) { result = ConsumeAttributeEntity(aString,aScanner,aFlag); } + else if(ch == kCR) { + aScanner.GetChar(ch); + result = aScanner.Peek(ch); + if (NS_SUCCEEDED(result)) { + if(ch == kNewLine) { + aString.Append(NS_LITERAL_STRING("\r\n")); + aScanner.GetChar(ch); + } + else { + aString.Append(PRUnichar('\r')); + } + ++aNewlineCount; + } + } + else if(ch == kNewLine) { + aScanner.GetChar(ch); + aString.Append(PRUnichar('\n')); + ++aNewlineCount; + } else { done = PR_TRUE; } @@ -1630,16 +1657,19 @@ nsresult ConsumeAttributeValueText(nsString& aString, */ static nsresult ConsumeQuotedString(PRUnichar aChar, - nsString& aString, - nsScanner& aScanner, - PRInt32 aFlag) + nsString& aString, + PRInt32& aNewlineCount, + nsScanner& aScanner, + PRInt32 aFlag) { NS_ASSERTION(aChar==kQuote || aChar==kApostrophe,"char is neither quote nor apostrophe"); static const PRUnichar theTerminalCharsQuote[] = { - PRUnichar(kQuote), PRUnichar('&'), PRUnichar(0) }; + PRUnichar(kQuote), PRUnichar('&'), PRUnichar(kCR), + PRUnichar(kNewLine), PRUnichar(0) }; static const PRUnichar theTerminalCharsApostrophe[] = { - PRUnichar(kApostrophe), PRUnichar('&'), PRUnichar(0) }; + PRUnichar(kApostrophe), PRUnichar('&'), PRUnichar(kCR), + PRUnichar(kNewLine), PRUnichar(0) }; static const nsReadEndCondition theTerminateConditionQuote(theTerminalCharsQuote); static const nsReadEndCondition @@ -1654,7 +1684,8 @@ nsresult ConsumeQuotedString(PRUnichar aChar, nsScannerIterator theOffset; aScanner.CurrentPosition(theOffset); - result=ConsumeAttributeValueText(aString,aScanner,*terminateCondition,aFlag); + result=ConsumeAttributeValueText(aString,aNewlineCount,aScanner, + *terminateCondition,aFlag); if(NS_SUCCEEDED(result)) { result = aScanner.SkipOver(aChar); // aChar should be " or ' @@ -1669,7 +1700,8 @@ nsresult ConsumeQuotedString(PRUnichar aChar, theAttributeTerminator(kAttributeTerminalChars); aString.Truncate(); aScanner.SetPosition(theOffset, PR_FALSE, PR_TRUE); - result=ConsumeAttributeValueText(aString,aScanner,theAttributeTerminator,aFlag); + result=ConsumeAttributeValueText(aString,aNewlineCount,aScanner, + theAttributeTerminator,aFlag); } return result; } @@ -1743,7 +1775,8 @@ nsresult CAttributeToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 a if (NS_OK==result) { if ((kQuote==aChar) || (kApostrophe==aChar)) { aScanner.GetChar(aChar); - result=ConsumeQuotedString(aChar,mTextValue,aScanner,aFlag); + result=ConsumeQuotedString(aChar,mTextValue,mNewlineCount, + aScanner,aFlag); if (NS_SUCCEEDED(result) && (aFlag & NS_IPARSER_FLAG_VIEW_SOURCE)) { mTextValue.Insert(aChar,0); mTextValue.Append(aChar); @@ -1764,6 +1797,7 @@ nsresult CAttributeToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 a static const nsReadEndCondition theAttributeTerminator(kAttributeTerminalChars); result=ConsumeAttributeValueText(mTextValue, + mNewlineCount, aScanner, theAttributeTerminator, aFlag); diff --git a/mozilla/parser/htmlparser/src/nsHTMLTokens.cpp b/mozilla/parser/htmlparser/src/nsHTMLTokens.cpp index eba2016464a..c96840fb715 100644 --- a/mozilla/parser/htmlparser/src/nsHTMLTokens.cpp +++ b/mozilla/parser/htmlparser/src/nsHTMLTokens.cpp @@ -747,7 +747,7 @@ PRInt32 CCDATASectionToken::GetTokenType(void) { */ nsresult CCDATASectionToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 aFlag) { static const PRUnichar theTerminalsChars[] = - { PRUnichar('\r'), PRUnichar(']'), PRUnichar(0) }; + { PRUnichar('\r'), PRUnichar('\n'), PRUnichar(']'), PRUnichar(0) }; static const nsReadEndCondition theEndCondition(theTerminalsChars); nsresult result=NS_OK; PRBool done=PR_FALSE; @@ -764,6 +764,7 @@ nsresult CCDATASectionToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt3 case kCR: result=aScanner.GetChar(aChar); //strip off the \r mTextValue.Append(NS_LITERAL_STRING("\n\n")); + mNewlineCount += 2; break; case kNewLine: //which means we saw \r\n, which becomes \n @@ -771,10 +772,16 @@ nsresult CCDATASectionToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt3 //now fall through on purpose... default: mTextValue.Append(NS_LITERAL_STRING("\n")); + mNewlineCount++; break; } //switch } //if } + else if (kNewLine == aChar) { + result=aScanner.GetChar(aChar); + mTextValue.Append(aChar); + ++mNewlineCount; + } else if (kRightSquareBracket == aChar) { result=aScanner.GetChar(aChar); //strip off the ] mTextValue.Append(aChar); @@ -1595,6 +1602,7 @@ nsresult ConsumeAttributeEntity(nsString& aString, */ static nsresult ConsumeAttributeValueText(nsString& aString, + PRInt32& aNewlineCount, nsScanner& aScanner, const nsReadEndCondition& aEndCondition, PRInt32 aFlag) @@ -1610,6 +1618,25 @@ nsresult ConsumeAttributeValueText(nsString& aString, if(ch == kAmpersand) { result = ConsumeAttributeEntity(aString,aScanner,aFlag); } + else if(ch == kCR) { + aScanner.GetChar(ch); + result = aScanner.Peek(ch); + if (NS_SUCCEEDED(result)) { + if(ch == kNewLine) { + aString.Append(NS_LITERAL_STRING("\r\n")); + aScanner.GetChar(ch); + } + else { + aString.Append(PRUnichar('\r')); + } + ++aNewlineCount; + } + } + else if(ch == kNewLine) { + aScanner.GetChar(ch); + aString.Append(PRUnichar('\n')); + ++aNewlineCount; + } else { done = PR_TRUE; } @@ -1630,16 +1657,19 @@ nsresult ConsumeAttributeValueText(nsString& aString, */ static nsresult ConsumeQuotedString(PRUnichar aChar, - nsString& aString, - nsScanner& aScanner, - PRInt32 aFlag) + nsString& aString, + PRInt32& aNewlineCount, + nsScanner& aScanner, + PRInt32 aFlag) { NS_ASSERTION(aChar==kQuote || aChar==kApostrophe,"char is neither quote nor apostrophe"); static const PRUnichar theTerminalCharsQuote[] = { - PRUnichar(kQuote), PRUnichar('&'), PRUnichar(0) }; + PRUnichar(kQuote), PRUnichar('&'), PRUnichar(kCR), + PRUnichar(kNewLine), PRUnichar(0) }; static const PRUnichar theTerminalCharsApostrophe[] = { - PRUnichar(kApostrophe), PRUnichar('&'), PRUnichar(0) }; + PRUnichar(kApostrophe), PRUnichar('&'), PRUnichar(kCR), + PRUnichar(kNewLine), PRUnichar(0) }; static const nsReadEndCondition theTerminateConditionQuote(theTerminalCharsQuote); static const nsReadEndCondition @@ -1654,7 +1684,8 @@ nsresult ConsumeQuotedString(PRUnichar aChar, nsScannerIterator theOffset; aScanner.CurrentPosition(theOffset); - result=ConsumeAttributeValueText(aString,aScanner,*terminateCondition,aFlag); + result=ConsumeAttributeValueText(aString,aNewlineCount,aScanner, + *terminateCondition,aFlag); if(NS_SUCCEEDED(result)) { result = aScanner.SkipOver(aChar); // aChar should be " or ' @@ -1669,7 +1700,8 @@ nsresult ConsumeQuotedString(PRUnichar aChar, theAttributeTerminator(kAttributeTerminalChars); aString.Truncate(); aScanner.SetPosition(theOffset, PR_FALSE, PR_TRUE); - result=ConsumeAttributeValueText(aString,aScanner,theAttributeTerminator,aFlag); + result=ConsumeAttributeValueText(aString,aNewlineCount,aScanner, + theAttributeTerminator,aFlag); } return result; } @@ -1743,7 +1775,8 @@ nsresult CAttributeToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 a if (NS_OK==result) { if ((kQuote==aChar) || (kApostrophe==aChar)) { aScanner.GetChar(aChar); - result=ConsumeQuotedString(aChar,mTextValue,aScanner,aFlag); + result=ConsumeQuotedString(aChar,mTextValue,mNewlineCount, + aScanner,aFlag); if (NS_SUCCEEDED(result) && (aFlag & NS_IPARSER_FLAG_VIEW_SOURCE)) { mTextValue.Insert(aChar,0); mTextValue.Append(aChar); @@ -1764,6 +1797,7 @@ nsresult CAttributeToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 a static const nsReadEndCondition theAttributeTerminator(kAttributeTerminalChars); result=ConsumeAttributeValueText(mTextValue, + mNewlineCount, aScanner, theAttributeTerminator, aFlag);