diff --git a/mozilla/htmlparser/src/nsHTMLTokens.cpp b/mozilla/htmlparser/src/nsHTMLTokens.cpp index f6a5aa1aff7..bb5ad096af3 100644 --- a/mozilla/htmlparser/src/nsHTMLTokens.cpp +++ b/mozilla/htmlparser/src/nsHTMLTokens.cpp @@ -2342,21 +2342,43 @@ CDoctypeDeclToken::CDoctypeDeclToken(const nsAReadableString& aString,eHTMLTags */ nsresult CDoctypeDeclToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 aFlag) { - nsresult result =NS_OK; - - nsReadingIterator theCurrOffset, endPos; - aScanner.CurrentPosition(theCurrOffset); - aScanner.EndReading(endPos); - FindCharInReadable(PRUnichar(kLessThan), theCurrOffset, endPos); + static const PRUnichar terminalChars[] = + { PRUnichar('>'), PRUnichar('<'), + PRUnichar(0) + }; - mTextValue.AssignWithConversion(" start, end; + + aScanner.CurrentPosition(start); + aScanner.EndReading(end); + + nsresult result=aScanner.ReadUntil(start, end, terminals,PR_FALSE); + + if (NS_SUCCEEDED(result)) { + PRUnichar ch; + aScanner.Peek(ch); + if (ch == kGreaterThan) { + // Include '>' but not '<' since '<' + // could belong to another tag. + aScanner.GetChar(ch); + end.advance(1); + } } - else { - result=aScanner.ReadUntil(mTextValue,'>',PR_TRUE); + else if (!aScanner.IsIncremental()) { + // We have reached the document end but haven't + // found either a '<' or a '>'. Therefore use + // whatever we have. + result = NS_OK; } + + if (NS_SUCCEEDED(result)) { + start.advance(-2); // Make sure to consume theCurrOffset, endPos; - aScanner.CurrentPosition(theCurrOffset); - aScanner.EndReading(endPos); - FindCharInReadable(PRUnichar(kLessThan), theCurrOffset, endPos); + static const PRUnichar terminalChars[] = + { PRUnichar('>'), PRUnichar('<'), + PRUnichar(0) + }; - mTextValue.AssignWithConversion(" start, end; + + aScanner.CurrentPosition(start); + aScanner.EndReading(end); + + nsresult result=aScanner.ReadUntil(start, end, terminals,PR_FALSE); + + if (NS_SUCCEEDED(result)) { + PRUnichar ch; + aScanner.Peek(ch); + if (ch == kGreaterThan) { + // Include '>' but not '<' since '<' + // could belong to another tag. + aScanner.GetChar(ch); + end.advance(1); + } } - else { - result=aScanner.ReadUntil(mTextValue,'>',PR_TRUE); + else if (!aScanner.IsIncremental()) { + // We have reached the document end but haven't + // found either a '<' or a '>'. Therefore use + // whatever we have. + result = NS_OK; } + + if (NS_SUCCEEDED(result)) { + start.advance(-2); // Make sure to consume