From 5e7987302b9e9f73d177dbf8eeb78c8f3d1f7eeb Mon Sep 17 00:00:00 2001 From: "harishd%netscape.com" Date: Fri, 10 Aug 2001 22:38:37 +0000 Subject: [PATCH] 91051 - Look for '<' or '>' which ever comes first to end DOCTYPE consumption. r=heikki sr=vidur. git-svn-id: svn://10.0.0.236/trunk@100835 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/htmlparser/src/nsHTMLTokens.cpp | 46 ++++++++++++++----- .../parser/htmlparser/src/nsHTMLTokens.cpp | 46 ++++++++++++++----- 2 files changed, 68 insertions(+), 24 deletions(-) diff --git a/mozilla/htmlparser/src/nsHTMLTokens.cpp b/mozilla/htmlparser/src/nsHTMLTokens.cpp index abc244e589e..2efdf2cf941 100644 --- a/mozilla/htmlparser/src/nsHTMLTokens.cpp +++ b/mozilla/htmlparser/src/nsHTMLTokens.cpp @@ -2338,21 +2338,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