diff --git a/htmlparser/src/nsHTMLTokens.cpp b/htmlparser/src/nsHTMLTokens.cpp
index fbda22d3cf97..d49b253e2521 100644
--- a/htmlparser/src/nsHTMLTokens.cpp
+++ b/htmlparser/src/nsHTMLTokens.cpp
@@ -520,6 +520,8 @@ nsresult CTextToken::ConsumeUntil(PRUnichar aChar,PRBool aIgnoreComments,nsScann
//target endtag, or the start of another comment.
static nsAutoString theWhitespace2("\b\t ");
+ static nsAutoString theTerminals("\"\'<");
+
PRInt32 termStrLen=aTerminalString.Length();
while((!done) && (NS_OK==result)) {
result=aScanner.GetChar(aChar);
@@ -543,6 +545,13 @@ nsresult CTextToken::ConsumeUntil(PRUnichar aChar,PRBool aIgnoreComments,nsScann
result=aScanner.ReadUntil(temp,kGreaterThan,PR_TRUE);
}
}
+ else if((NS_OK==result) && ((kQuote==aChar) || kApostrophe==aChar)) {
+ static nsAutoString theEndings("\n\"\'");
+ temp += aChar;
+ result=aScanner.ReadUntil(temp,theEndings,PR_TRUE,PR_FALSE);
+ result=aScanner.GetChar(aChar);
+ if(result==NS_OK) temp += aChar; // consume the character that stopped the scan
+ }
else if(0<=theWhitespace2.BinarySearch(aChar)) {
static CWhitespaceToken theWS;
result=theWS.Consume(aChar,aScanner);
@@ -552,7 +561,7 @@ nsresult CTextToken::ConsumeUntil(PRUnichar aChar,PRBool aIgnoreComments,nsScann
}
else {
temp+=aChar;
- result=aScanner.ReadUntil(temp,kLessThan,PR_FALSE);
+ result=aScanner.ReadUntil(temp,theTerminals,PR_TRUE,PR_FALSE);
}
temp.Right(theRight,termStrLen+10); //first, get a wad of chars from the temp string
rpos=theRight.RFind('<'); //now scan for the '<'
@@ -1202,6 +1211,14 @@ nsresult CAttributeToken::Consume(PRUnichar aChar, nsScanner& aScanner) {
else if(kGreaterThan==aChar){
result=aScanner.PutBack(aChar);
}
+ else if(kAmpersand==aChar) {
+ mTextValue=aChar;
+ result=aScanner.GetChar(aChar);
+ if(NS_OK==result) {
+ mTextValue += aChar;
+ result=CEntityToken::ConsumeEntity(aChar,mTextValue,aScanner);
+ }
+ }
else {
mTextValue=aChar; //it's an alphanum attribute...
result=ConsumeAttributeValueText(aChar,mTextValue,aScanner);
@@ -1400,18 +1417,23 @@ PRInt32 CEntityToken::ConsumeEntity(PRUnichar aChar,nsString& aString,nsScanner&
PRUnichar theChar=0;
PRInt32 result=aScanner.Peek(theChar);
if(NS_OK==result) {
- if(kLeftBrace==theChar) {
+ if(kLeftBrace==aChar) {
//you're consuming a script entity...
- static nsAutoString terminals("}>");
- result=aScanner.ReadUntil(aString,terminals,PR_FALSE,PR_FALSE);
+ PRInt32 rightBraceCount = 0;
+ PRInt32 leftBraceCount = 1;
+ while(leftBraceCount!=rightBraceCount) {
+ result=aScanner.GetChar(aChar);
+ if(NS_OK!=result) return result;
+ aString += aChar;
+ if(aChar==kRightBrace)
+ rightBraceCount++;
+ else if(aChar==kLeftBrace)
+ leftBraceCount++;
+ }
+ result=aScanner.ReadUntil(aString,kSemicolon,PR_FALSE);
if(NS_OK==result) {
- result=aScanner.Peek(theChar);
- if(NS_OK==result) {
- if(kRightBrace==theChar) {
- aString+=kRightBrace; //append rightbrace, and...
- result=aScanner.GetChar(theChar);//yank the closing right-brace
- }
- }
+ result=aScanner.GetChar(aChar); // This character should be a semicolon
+ if(NS_OK==result) aString += aChar;
}
} //if
else {
diff --git a/parser/htmlparser/src/nsHTMLTokens.cpp b/parser/htmlparser/src/nsHTMLTokens.cpp
index fbda22d3cf97..d49b253e2521 100644
--- a/parser/htmlparser/src/nsHTMLTokens.cpp
+++ b/parser/htmlparser/src/nsHTMLTokens.cpp
@@ -520,6 +520,8 @@ nsresult CTextToken::ConsumeUntil(PRUnichar aChar,PRBool aIgnoreComments,nsScann
//target endtag, or the start of another comment.
static nsAutoString theWhitespace2("\b\t ");
+ static nsAutoString theTerminals("\"\'<");
+
PRInt32 termStrLen=aTerminalString.Length();
while((!done) && (NS_OK==result)) {
result=aScanner.GetChar(aChar);
@@ -543,6 +545,13 @@ nsresult CTextToken::ConsumeUntil(PRUnichar aChar,PRBool aIgnoreComments,nsScann
result=aScanner.ReadUntil(temp,kGreaterThan,PR_TRUE);
}
}
+ else if((NS_OK==result) && ((kQuote==aChar) || kApostrophe==aChar)) {
+ static nsAutoString theEndings("\n\"\'");
+ temp += aChar;
+ result=aScanner.ReadUntil(temp,theEndings,PR_TRUE,PR_FALSE);
+ result=aScanner.GetChar(aChar);
+ if(result==NS_OK) temp += aChar; // consume the character that stopped the scan
+ }
else if(0<=theWhitespace2.BinarySearch(aChar)) {
static CWhitespaceToken theWS;
result=theWS.Consume(aChar,aScanner);
@@ -552,7 +561,7 @@ nsresult CTextToken::ConsumeUntil(PRUnichar aChar,PRBool aIgnoreComments,nsScann
}
else {
temp+=aChar;
- result=aScanner.ReadUntil(temp,kLessThan,PR_FALSE);
+ result=aScanner.ReadUntil(temp,theTerminals,PR_TRUE,PR_FALSE);
}
temp.Right(theRight,termStrLen+10); //first, get a wad of chars from the temp string
rpos=theRight.RFind('<'); //now scan for the '<'
@@ -1202,6 +1211,14 @@ nsresult CAttributeToken::Consume(PRUnichar aChar, nsScanner& aScanner) {
else if(kGreaterThan==aChar){
result=aScanner.PutBack(aChar);
}
+ else if(kAmpersand==aChar) {
+ mTextValue=aChar;
+ result=aScanner.GetChar(aChar);
+ if(NS_OK==result) {
+ mTextValue += aChar;
+ result=CEntityToken::ConsumeEntity(aChar,mTextValue,aScanner);
+ }
+ }
else {
mTextValue=aChar; //it's an alphanum attribute...
result=ConsumeAttributeValueText(aChar,mTextValue,aScanner);
@@ -1400,18 +1417,23 @@ PRInt32 CEntityToken::ConsumeEntity(PRUnichar aChar,nsString& aString,nsScanner&
PRUnichar theChar=0;
PRInt32 result=aScanner.Peek(theChar);
if(NS_OK==result) {
- if(kLeftBrace==theChar) {
+ if(kLeftBrace==aChar) {
//you're consuming a script entity...
- static nsAutoString terminals("}>");
- result=aScanner.ReadUntil(aString,terminals,PR_FALSE,PR_FALSE);
+ PRInt32 rightBraceCount = 0;
+ PRInt32 leftBraceCount = 1;
+ while(leftBraceCount!=rightBraceCount) {
+ result=aScanner.GetChar(aChar);
+ if(NS_OK!=result) return result;
+ aString += aChar;
+ if(aChar==kRightBrace)
+ rightBraceCount++;
+ else if(aChar==kLeftBrace)
+ leftBraceCount++;
+ }
+ result=aScanner.ReadUntil(aString,kSemicolon,PR_FALSE);
if(NS_OK==result) {
- result=aScanner.Peek(theChar);
- if(NS_OK==result) {
- if(kRightBrace==theChar) {
- aString+=kRightBrace; //append rightbrace, and...
- result=aScanner.GetChar(theChar);//yank the closing right-brace
- }
- }
+ result=aScanner.GetChar(aChar); // This character should be a semicolon
+ if(NS_OK==result) aString += aChar;
}
} //if
else {