diff --git a/content/html/document/src/nsHTMLContentSink.cpp b/content/html/document/src/nsHTMLContentSink.cpp index 024b68d85664..5769bff3e98c 100644 --- a/content/html/document/src/nsHTMLContentSink.cpp +++ b/content/html/document/src/nsHTMLContentSink.cpp @@ -272,33 +272,9 @@ public: //---------------------------------------------------------------------- -// Temporary factory code to create content objects - static void -GetAttributeValueAt(const nsIParserNode& aNode, - PRInt32 aIndex, - nsString& aResult, - nsIScriptContextOwner* aScriptContextOwner) +ReduceEntities(nsString& aString) { - // Copy value - const nsString& value = aNode.GetValueAt(aIndex); - aResult.Truncate(); - aResult.Append(value); - - // Strip quotes if present - PRUnichar first = aResult.First(); - if ((first == '"') || (first == '\'')) { - if (aResult.Last() == first) { - aResult.Cut(0, 1); - PRInt32 pos = aResult.Length() - 1; - if (pos >= 0) { - aResult.Cut(pos, 1); - } - } else { - // Mismatched quotes - leave them in - } - } - // Reduce any entities // XXX Note: as coded today, this will only convert well formed // entities. This may not be compatible enough. @@ -307,21 +283,21 @@ GetAttributeValueAt(const nsIParserNode& aNode, // so we should add a translate numeric entity method from the parser... char cbuf[100]; PRInt32 index = 0; - while (index < aResult.Length()) { + while (index < aString.Length()) { // If we have the start of an entity (and it's not at the end of // our string) then translate the entity into it's unicode value. - if ((aResult.CharAt(index++) == '&') && (index < aResult.Length())) { + if ((aString.CharAt(index++) == '&') && (index < aString.Length())) { PRInt32 start = index - 1; - PRUnichar e = aResult.CharAt(index); + PRUnichar e = aString.CharAt(index); if (e == '#') { // Convert a numeric character reference index++; char* cp = cbuf; char* limit = cp + sizeof(cbuf) - 1; PRBool ok = PR_FALSE; - PRInt32 slen = aResult.Length(); + PRInt32 slen = aString.Length(); while ((index < slen) && (cp < limit)) { - PRUnichar e = aResult.CharAt(index); + PRUnichar e = aString.CharAt(index); if (e == ';') { index++; ok = PR_TRUE; @@ -348,8 +324,8 @@ GetAttributeValueAt(const nsIParserNode& aNode, // Remove entity from string and replace it with the integer // value. - aResult.Cut(start, index - start); - aResult.Insert(PRUnichar(ch), start); + aString.Cut(start, index - start); + aString.Insert(PRUnichar(ch), start); index = start + 1; } else if (((e >= 'A') && (e <= 'Z')) || @@ -360,9 +336,9 @@ GetAttributeValueAt(const nsIParserNode& aNode, char* limit = cp + sizeof(cbuf) - 1; *cp++ = char(e); PRBool ok = PR_FALSE; - PRInt32 slen = aResult.Length(); + PRInt32 slen = aString.Length(); while ((index < slen) && (cp < limit)) { - PRUnichar e = aResult.CharAt(index); + PRUnichar e = aString.CharAt(index); if (e == ';') { index++; ok = PR_TRUE; @@ -388,8 +364,8 @@ GetAttributeValueAt(const nsIParserNode& aNode, // Remove entity from string and replace it with the integer // value. - aResult.Cut(start, index - start); - aResult.Insert(PRUnichar(ch), start); + aString.Cut(start, index - start); + aString.Insert(PRUnichar(ch), start); index = start + 1; } else if (e == '{') { @@ -400,6 +376,35 @@ GetAttributeValueAt(const nsIParserNode& aNode, } } +// Temporary factory code to create content objects + +static void +GetAttributeValueAt(const nsIParserNode& aNode, + PRInt32 aIndex, + nsString& aResult, + nsIScriptContextOwner* aScriptContextOwner) +{ + // Copy value + const nsString& value = aNode.GetValueAt(aIndex); + aResult.Truncate(); + aResult.Append(value); + + // Strip quotes if present + PRUnichar first = aResult.First(); + if ((first == '"') || (first == '\'')) { + if (aResult.Last() == first) { + aResult.Cut(0, 1); + PRInt32 pos = aResult.Length() - 1; + if (pos >= 0) { + aResult.Cut(pos, 1); + } + } else { + // Mismatched quotes - leave them in + } + } + ReduceEntities(aResult); +} + static PRBool FindAttribute(const nsIParserNode& aNode, const nsString& aKeyName, @@ -1454,6 +1459,7 @@ HTMLContentSink::SetTitle(const nsString& aValue) else { *mTitle = aValue; } + ReduceEntities(*mTitle); mTitle->CompressWhitespace(PR_TRUE, PR_TRUE); ((nsHTMLDocument*)mDocument)->SetTitle(*mTitle); diff --git a/layout/html/document/src/nsHTMLContentSink.cpp b/layout/html/document/src/nsHTMLContentSink.cpp index 024b68d85664..5769bff3e98c 100644 --- a/layout/html/document/src/nsHTMLContentSink.cpp +++ b/layout/html/document/src/nsHTMLContentSink.cpp @@ -272,33 +272,9 @@ public: //---------------------------------------------------------------------- -// Temporary factory code to create content objects - static void -GetAttributeValueAt(const nsIParserNode& aNode, - PRInt32 aIndex, - nsString& aResult, - nsIScriptContextOwner* aScriptContextOwner) +ReduceEntities(nsString& aString) { - // Copy value - const nsString& value = aNode.GetValueAt(aIndex); - aResult.Truncate(); - aResult.Append(value); - - // Strip quotes if present - PRUnichar first = aResult.First(); - if ((first == '"') || (first == '\'')) { - if (aResult.Last() == first) { - aResult.Cut(0, 1); - PRInt32 pos = aResult.Length() - 1; - if (pos >= 0) { - aResult.Cut(pos, 1); - } - } else { - // Mismatched quotes - leave them in - } - } - // Reduce any entities // XXX Note: as coded today, this will only convert well formed // entities. This may not be compatible enough. @@ -307,21 +283,21 @@ GetAttributeValueAt(const nsIParserNode& aNode, // so we should add a translate numeric entity method from the parser... char cbuf[100]; PRInt32 index = 0; - while (index < aResult.Length()) { + while (index < aString.Length()) { // If we have the start of an entity (and it's not at the end of // our string) then translate the entity into it's unicode value. - if ((aResult.CharAt(index++) == '&') && (index < aResult.Length())) { + if ((aString.CharAt(index++) == '&') && (index < aString.Length())) { PRInt32 start = index - 1; - PRUnichar e = aResult.CharAt(index); + PRUnichar e = aString.CharAt(index); if (e == '#') { // Convert a numeric character reference index++; char* cp = cbuf; char* limit = cp + sizeof(cbuf) - 1; PRBool ok = PR_FALSE; - PRInt32 slen = aResult.Length(); + PRInt32 slen = aString.Length(); while ((index < slen) && (cp < limit)) { - PRUnichar e = aResult.CharAt(index); + PRUnichar e = aString.CharAt(index); if (e == ';') { index++; ok = PR_TRUE; @@ -348,8 +324,8 @@ GetAttributeValueAt(const nsIParserNode& aNode, // Remove entity from string and replace it with the integer // value. - aResult.Cut(start, index - start); - aResult.Insert(PRUnichar(ch), start); + aString.Cut(start, index - start); + aString.Insert(PRUnichar(ch), start); index = start + 1; } else if (((e >= 'A') && (e <= 'Z')) || @@ -360,9 +336,9 @@ GetAttributeValueAt(const nsIParserNode& aNode, char* limit = cp + sizeof(cbuf) - 1; *cp++ = char(e); PRBool ok = PR_FALSE; - PRInt32 slen = aResult.Length(); + PRInt32 slen = aString.Length(); while ((index < slen) && (cp < limit)) { - PRUnichar e = aResult.CharAt(index); + PRUnichar e = aString.CharAt(index); if (e == ';') { index++; ok = PR_TRUE; @@ -388,8 +364,8 @@ GetAttributeValueAt(const nsIParserNode& aNode, // Remove entity from string and replace it with the integer // value. - aResult.Cut(start, index - start); - aResult.Insert(PRUnichar(ch), start); + aString.Cut(start, index - start); + aString.Insert(PRUnichar(ch), start); index = start + 1; } else if (e == '{') { @@ -400,6 +376,35 @@ GetAttributeValueAt(const nsIParserNode& aNode, } } +// Temporary factory code to create content objects + +static void +GetAttributeValueAt(const nsIParserNode& aNode, + PRInt32 aIndex, + nsString& aResult, + nsIScriptContextOwner* aScriptContextOwner) +{ + // Copy value + const nsString& value = aNode.GetValueAt(aIndex); + aResult.Truncate(); + aResult.Append(value); + + // Strip quotes if present + PRUnichar first = aResult.First(); + if ((first == '"') || (first == '\'')) { + if (aResult.Last() == first) { + aResult.Cut(0, 1); + PRInt32 pos = aResult.Length() - 1; + if (pos >= 0) { + aResult.Cut(pos, 1); + } + } else { + // Mismatched quotes - leave them in + } + } + ReduceEntities(aResult); +} + static PRBool FindAttribute(const nsIParserNode& aNode, const nsString& aKeyName, @@ -1454,6 +1459,7 @@ HTMLContentSink::SetTitle(const nsString& aValue) else { *mTitle = aValue; } + ReduceEntities(*mTitle); mTitle->CompressWhitespace(PR_TRUE, PR_TRUE); ((nsHTMLDocument*)mDocument)->SetTitle(*mTitle);