diff --git a/htmlparser/src/nsParser.cpp b/htmlparser/src/nsParser.cpp
index c7f9548d939..c03cab181b1 100644
--- a/htmlparser/src/nsParser.cpp
+++ b/htmlparser/src/nsParser.cpp
@@ -2520,7 +2520,7 @@ nsParser::DetectMetaTag(const char* aBytes,
if ((offset = tokenizer.GetNextWord(PR_TRUE)) != kNotFound) {
const char* contentStart = attrStart+offset;
CWordTokenizer contentTokenizer(contentStart, 0,
- tokenizer.GetLength());
+ attrEnd-contentStart);
// Read the content type
if (contentTokenizer.GetNextWord() != kNotFound) {
diff --git a/intl/chardet/src/nsMetaCharsetObserver.cpp b/intl/chardet/src/nsMetaCharsetObserver.cpp
index 06819322ee1..8a713ba4699 100644
--- a/intl/chardet/src/nsMetaCharsetObserver.cpp
+++ b/intl/chardet/src/nsMetaCharsetObserver.cpp
@@ -179,12 +179,16 @@ NS_IMETHODIMP nsMetaCharsetObserver::Notify(
PRInt32 i;
const PRUnichar *httpEquivValue=nsnull;
const PRUnichar *contentValue=nsnull;
+ const PRUnichar *charsetValue=nsnull;
+
for(i=0;i<(numOfAttributes-3);i++)
{
if(0 == nsCRT::strcasecmp((keys->StringAt(i))->get(), "HTTP-EQUIV"))
httpEquivValue=((values->StringAt(i))->get());
else if(0 == nsCRT::strcasecmp((keys->StringAt(i))->get(), "content"))
contentValue=(values->StringAt(i))->get();
+ else if(0 == nsCRT::strcasecmp((keys->StringAt(i))->get(), "charset"))
+ charsetValue=(values->StringAt(i))->get();
}
NS_NAMED_LITERAL_STRING(contenttype, "Content-Type");
NS_NAMED_LITERAL_STRING(texthtml, "text/html");
@@ -213,18 +217,31 @@ NS_IMETHODIMP nsMetaCharsetObserver::Notify(
))
)
{
- nsAutoString contentPart1(contentValue+10); // after "text/html;"
- PRInt32 start = contentPart1.RFind("charset=", PR_TRUE ) ;
- if(kNotFound != start)
- {
- start += 8; // 8 = "charset=".length
- PRInt32 end = contentPart1.FindCharInSet("\'\";", start );
- if(kNotFound == end )
- end = contentPart1.Length();
- nsAutoString newCharset;
- NS_ASSERTION(end>=start, "wrong index");
- contentPart1.Mid(newCharset, start, end - start);
+
+ nsAutoString newCharset;
+
+ if (nsnull == charsetValue)
+ {
+ nsAutoString contentPart1(contentValue+10); // after "text/html;"
+ PRInt32 start = contentPart1.RFind("charset=", PR_TRUE ) ;
+ if(kNotFound != start)
+ {
+ start += 8; // 8 = "charset=".length
+ PRInt32 end = contentPart1.FindCharInSet("\'\";", start );
+ if(kNotFound == end )
+ end = contentPart1.Length();
+ NS_ASSERTION(end>=start, "wrong index");
+ contentPart1.Mid(newCharset, start, end - start);
+ }
+ }
+ else
+ {
+ newCharset = charsetValue;
+ }
+
+ if (!newCharset.IsEmpty())
+ {
nsAutoString charsetString(charset);
if(! newCharset.EqualsIgnoreCase(charsetString))
{
@@ -248,7 +265,7 @@ NS_IMETHODIMP nsMetaCharsetObserver::Notify(
} // if(NS_SUCCEEDED(res)
}
} // if EqualIgnoreCase
- } // if (kNotFound != start)
+ } // if !newCharset.IsEmpty()
} // if
}
else
diff --git a/parser/htmlparser/src/nsParser.cpp b/parser/htmlparser/src/nsParser.cpp
index c7f9548d939..c03cab181b1 100644
--- a/parser/htmlparser/src/nsParser.cpp
+++ b/parser/htmlparser/src/nsParser.cpp
@@ -2520,7 +2520,7 @@ nsParser::DetectMetaTag(const char* aBytes,
if ((offset = tokenizer.GetNextWord(PR_TRUE)) != kNotFound) {
const char* contentStart = attrStart+offset;
CWordTokenizer contentTokenizer(contentStart, 0,
- tokenizer.GetLength());
+ attrEnd-contentStart);
// Read the content type
if (contentTokenizer.GetNextWord() != kNotFound) {