diff --git a/htmlparser/src/nsElementTable.cpp b/htmlparser/src/nsElementTable.cpp
index 25fc6c22406a..c548de5d26ed 100644
--- a/htmlparser/src/nsElementTable.cpp
+++ b/htmlparser/src/nsElementTable.cpp
@@ -465,7 +465,7 @@ nsHTMLElement gHTMLElements[] = {
{ /*tag*/ eHTMLTag_embed,
/*rootnodes,endrootnodes*/ &gRootTags,&gRootTags,
/*autoclose starttags and endtags*/ 0,0,0,
- /*parent,incl,exclgroups*/ kFlow, kInline, kNone,
+ /*parent,incl,exclgroups*/ kFlow, kNone, kNone,
/*special properties*/ 0,
/*special parents,kids,skip*/ 0,&gContainsParam,eHTMLTag_unknown},
@@ -1095,7 +1095,7 @@ PRBool nsHTMLElement::IsContainer(eHTMLTags aChild) {
static eHTMLTags gNonContainers[]={
eHTMLTag_unknown,
eHTMLTag_area, eHTMLTag_base, eHTMLTag_basefont,
- eHTMLTag_br, eHTMLTag_col,
+ eHTMLTag_br, eHTMLTag_col, eHTMLTag_embed,
eHTMLTag_frame, eHTMLTag_hr, eHTMLTag_whitespace,
eHTMLTag_input, eHTMLTag_link, eHTMLTag_isindex,
eHTMLTag_meta, eHTMLTag_param, eHTMLTag_plaintext,
diff --git a/htmlparser/src/nsHTMLTokenizer.cpp b/htmlparser/src/nsHTMLTokenizer.cpp
index 4279baf16f83..b1ffb51816d7 100644
--- a/htmlparser/src/nsHTMLTokenizer.cpp
+++ b/htmlparser/src/nsHTMLTokenizer.cpp
@@ -532,7 +532,7 @@ nsresult nsHTMLTokenizer::ConsumeEntity(PRUnichar aChar,CToken*& aToken,nsScanne
}
else if(kHashsign==theChar) {
aToken = theRecycler->CreateTokenOfType(eToken_entity,eHTMLTag_entity);
- result=aToken->Consume(0,aScanner);
+ result=aToken->Consume(theChar,aScanner);
}
else {
//oops, we're actually looking at plain text...
@@ -544,7 +544,7 @@ nsresult nsHTMLTokenizer::ConsumeEntity(PRUnichar aChar,CToken*& aToken,nsScanne
char cbuf[30];
nsString& theStr=aToken->GetStringValueXXX();
theStr.ToCString(cbuf, sizeof(cbuf)-1);
- if(-1==NS_EntityToUnicode(cbuf)){
+ if((kHashsign!=theChar) && (-1==NS_EntityToUnicode(cbuf))){
//if you're here we have a bogus entity.
//convert it into a text token.
nsAutoString temp("&");
diff --git a/htmlparser/src/nsHTMLTokens.cpp b/htmlparser/src/nsHTMLTokens.cpp
index 4cd84a966323..5e683f40996f 100644
--- a/htmlparser/src/nsHTMLTokens.cpp
+++ b/htmlparser/src/nsHTMLTokens.cpp
@@ -205,6 +205,12 @@ nsString& GetIdentChars(void) {
return gIdentChars;
}
+static
+nsString& GetNumericChars(void) {
+ static nsString gNumChars("0123456789ABCDEFabcdef");
+ return gNumChars;
+}
+
/*
* Consume the identifier portion of the start tag
*
@@ -1280,31 +1286,40 @@ PRInt32 CEntityToken::GetTokenType(void) {
* @return error result
*/
PRInt32 CEntityToken::ConsumeEntity(PRUnichar aChar,nsString& aString,nsScanner& aScanner){
-
- PRInt32 result=aScanner.Peek(aChar);
+ PRUnichar theChar=0;
+ PRInt32 result=aScanner.Peek(theChar);
if(NS_OK==result) {
- if(kLeftBrace==aChar) {
+ if(kLeftBrace==theChar) {
//you're consuming a script entity...
static nsAutoString terminals("}>");
result=aScanner.ReadUntil(aString,terminals,PR_FALSE,PR_FALSE);
if(NS_OK==result) {
- result=aScanner.Peek(aChar);
+ result=aScanner.Peek(theChar);
if(NS_OK==result) {
- if(kRightBrace==aChar) {
+ if(kRightBrace==theChar) {
aString+=kRightBrace; //append rightbrace, and...
- result=aScanner.GetChar(aChar);//yank the closing right-brace
+ result=aScanner.GetChar(theChar);//yank the closing right-brace
}
}
}
} //if
else {
- result=aScanner.ReadWhile(aString,GetIdentChars(),PR_TRUE,PR_FALSE);
+ if(kHashsign==aChar) {
+ if('X'==(toupper((char)theChar))) {
+ result=aScanner.GetChar(theChar);
+ aString+=theChar;
+ }
+ if(NS_OK==result){
+ result=aScanner.ReadWhile(aString,GetNumericChars(),PR_TRUE,PR_FALSE);
+ }
+ }
+ else result=aScanner.ReadWhile(aString,GetIdentChars(),PR_TRUE,PR_FALSE);
if(NS_OK==result) {
- result=aScanner.Peek(aChar);
+ result=aScanner.Peek(theChar);
if(NS_OK==result) {
- if (kSemicolon == aChar) {
+ if (kSemicolon == theChar) {
// consume semicolon that stopped the scan
- result=aScanner.GetChar(aChar);
+ result=aScanner.GetChar(theChar);
}
}
}//if
@@ -1375,28 +1390,30 @@ PRInt32 CEntityToken::TranslateToUnicodeStr(nsString& aString) {
PRUnichar theChar0=mTextValue[0];
PRBool isDigit0=nsString::IsDigit(theChar0);
- char cbuf[30];
- mTextValue.ToCString(cbuf, sizeof(cbuf)-1);
- value = NS_EntityToUnicode(cbuf);
- if(-1= 0x0080) && (value <= 0x009f)) {
- value = PA_HackTable[value - 0x0080];
- }
- #endif
- aString.Append(PRUnichar(value));
- }//if
+ if(kHashsign==theChar0) {
+ PRInt32 err=0;
+
+ PRUnichar theChar1=mTextValue[1];
+ PRBool isDigit1=nsString::IsDigit(theChar1);
+ value=mTextValue.ToInteger(&err,theRadix[isDigit1]);
+ if(0==err) {
+ #ifdef PA_REMAP_128_TO_160_ILLEGAL_NCR
+ /* for some illegal, but popular usage */
+ if ((value >= 0x0080) && (value <= 0x009f)) {
+ value = PA_HackTable[value - 0x0080];
+ }
+ #endif
+ aString.Append(PRUnichar(value));
}//if
+ }
+ else{
+ char cbuf[30];
+ mTextValue.ToCString(cbuf, sizeof(cbuf)-1);
+ value = NS_EntityToUnicode(cbuf);
+ if(-1CreateTokenOfType(eToken_entity,eHTMLTag_entity);
- result=aToken->Consume(0,aScanner);
+ result=aToken->Consume(theChar,aScanner);
}
else {
//oops, we're actually looking at plain text...
@@ -544,7 +544,7 @@ nsresult nsHTMLTokenizer::ConsumeEntity(PRUnichar aChar,CToken*& aToken,nsScanne
char cbuf[30];
nsString& theStr=aToken->GetStringValueXXX();
theStr.ToCString(cbuf, sizeof(cbuf)-1);
- if(-1==NS_EntityToUnicode(cbuf)){
+ if((kHashsign!=theChar) && (-1==NS_EntityToUnicode(cbuf))){
//if you're here we have a bogus entity.
//convert it into a text token.
nsAutoString temp("&");
diff --git a/parser/htmlparser/src/nsHTMLTokens.cpp b/parser/htmlparser/src/nsHTMLTokens.cpp
index 4cd84a966323..5e683f40996f 100644
--- a/parser/htmlparser/src/nsHTMLTokens.cpp
+++ b/parser/htmlparser/src/nsHTMLTokens.cpp
@@ -205,6 +205,12 @@ nsString& GetIdentChars(void) {
return gIdentChars;
}
+static
+nsString& GetNumericChars(void) {
+ static nsString gNumChars("0123456789ABCDEFabcdef");
+ return gNumChars;
+}
+
/*
* Consume the identifier portion of the start tag
*
@@ -1280,31 +1286,40 @@ PRInt32 CEntityToken::GetTokenType(void) {
* @return error result
*/
PRInt32 CEntityToken::ConsumeEntity(PRUnichar aChar,nsString& aString,nsScanner& aScanner){
-
- PRInt32 result=aScanner.Peek(aChar);
+ PRUnichar theChar=0;
+ PRInt32 result=aScanner.Peek(theChar);
if(NS_OK==result) {
- if(kLeftBrace==aChar) {
+ if(kLeftBrace==theChar) {
//you're consuming a script entity...
static nsAutoString terminals("}>");
result=aScanner.ReadUntil(aString,terminals,PR_FALSE,PR_FALSE);
if(NS_OK==result) {
- result=aScanner.Peek(aChar);
+ result=aScanner.Peek(theChar);
if(NS_OK==result) {
- if(kRightBrace==aChar) {
+ if(kRightBrace==theChar) {
aString+=kRightBrace; //append rightbrace, and...
- result=aScanner.GetChar(aChar);//yank the closing right-brace
+ result=aScanner.GetChar(theChar);//yank the closing right-brace
}
}
}
} //if
else {
- result=aScanner.ReadWhile(aString,GetIdentChars(),PR_TRUE,PR_FALSE);
+ if(kHashsign==aChar) {
+ if('X'==(toupper((char)theChar))) {
+ result=aScanner.GetChar(theChar);
+ aString+=theChar;
+ }
+ if(NS_OK==result){
+ result=aScanner.ReadWhile(aString,GetNumericChars(),PR_TRUE,PR_FALSE);
+ }
+ }
+ else result=aScanner.ReadWhile(aString,GetIdentChars(),PR_TRUE,PR_FALSE);
if(NS_OK==result) {
- result=aScanner.Peek(aChar);
+ result=aScanner.Peek(theChar);
if(NS_OK==result) {
- if (kSemicolon == aChar) {
+ if (kSemicolon == theChar) {
// consume semicolon that stopped the scan
- result=aScanner.GetChar(aChar);
+ result=aScanner.GetChar(theChar);
}
}
}//if
@@ -1375,28 +1390,30 @@ PRInt32 CEntityToken::TranslateToUnicodeStr(nsString& aString) {
PRUnichar theChar0=mTextValue[0];
PRBool isDigit0=nsString::IsDigit(theChar0);
- char cbuf[30];
- mTextValue.ToCString(cbuf, sizeof(cbuf)-1);
- value = NS_EntityToUnicode(cbuf);
- if(-1= 0x0080) && (value <= 0x009f)) {
- value = PA_HackTable[value - 0x0080];
- }
- #endif
- aString.Append(PRUnichar(value));
- }//if
+ if(kHashsign==theChar0) {
+ PRInt32 err=0;
+
+ PRUnichar theChar1=mTextValue[1];
+ PRBool isDigit1=nsString::IsDigit(theChar1);
+ value=mTextValue.ToInteger(&err,theRadix[isDigit1]);
+ if(0==err) {
+ #ifdef PA_REMAP_128_TO_160_ILLEGAL_NCR
+ /* for some illegal, but popular usage */
+ if ((value >= 0x0080) && (value <= 0x009f)) {
+ value = PA_HackTable[value - 0x0080];
+ }
+ #endif
+ aString.Append(PRUnichar(value));
}//if
+ }
+ else{
+ char cbuf[30];
+ mTextValue.ToCString(cbuf, sizeof(cbuf)-1);
+ value = NS_EntityToUnicode(cbuf);
+ if(-1