diff --git a/mozilla/parser/xml/src/nsSAXXMLReader.cpp b/mozilla/parser/xml/src/nsSAXXMLReader.cpp index 2ce37cefaee..71a861e10c8 100644 --- a/mozilla/parser/xml/src/nsSAXXMLReader.cpp +++ b/mozilla/parser/xml/src/nsSAXXMLReader.cpp @@ -39,6 +39,7 @@ #include "nsIInputStream.h" #include "nsNetCID.h" #include "nsNetUtil.h" +#include "nsICharsetAlias.h" #include "nsParserCIID.h" #include "nsStreamUtils.h" #include "nsStringStream.h" @@ -430,20 +431,19 @@ nsSAXXMLReader::ParseFromStream(nsIInputStream *aStream, aStream = bufferedStream; } - rv = InitParser(nsnull); - NS_ENSURE_SUCCESS(rv, rv); - nsCOMPtr parserChannel; rv = NS_NewInputStreamChannel(getter_AddRefs(parserChannel), mBaseURI, aStream, nsDependentCString(aContentType)); if (!parserChannel || NS_FAILED(rv)) { - mListener = nsnull; return NS_ERROR_FAILURE; } if (aCharset) parserChannel->SetContentCharset(nsDependentCString(aCharset)); + rv = InitParser(nsnull, parserChannel); + NS_ENSURE_SUCCESS(rv, rv); + rv = mListener->OnStartRequest(parserChannel, nsnull); if (NS_FAILED(rv)) parserChannel->Cancel(rv); @@ -493,7 +493,9 @@ NS_IMETHODIMP nsSAXXMLReader::OnStartRequest(nsIRequest *aRequest, nsISupports *aContext) { NS_ENSURE_TRUE(mIsAsyncParse, NS_ERROR_FAILURE); - nsresult rv = InitParser(mParserObserver); + nsresult rv; + nsCOMPtr channel = do_QueryInterface(aRequest); + rv = InitParser(mParserObserver, channel); NS_ENSURE_SUCCESS(rv, rv); // we don't need or want this anymore mParserObserver = nsnull; @@ -526,14 +528,21 @@ nsSAXXMLReader::OnDataAvailable(nsIRequest *aRequest, nsISupports *aContext, } nsresult -nsSAXXMLReader::InitParser(nsIRequestObserver *aObserver) +nsSAXXMLReader::InitParser(nsIRequestObserver *aObserver, nsIChannel *aChannel) { nsresult rv; // setup the parser nsCOMPtr parser = do_CreateInstance(kParserCID, &rv); + NS_ENSURE_SUCCESS(rv, rv); + parser->SetContentSink(this); + PRInt32 charsetSource = kCharsetFromDocTypeDefault; + nsCAutoString charset(NS_LITERAL_CSTRING("UTF-8")); + TryChannelCharset(aChannel, charsetSource, charset); + parser->SetDocumentCharset(charset, charsetSource); + if (!mBaseURI) { rv = NS_NewURI(getter_AddRefs(mBaseURI), "about:blank"); NS_ENSURE_SUCCESS(rv, rv); @@ -551,6 +560,36 @@ nsSAXXMLReader::InitParser(nsIRequestObserver *aObserver) return rv; } +// from nsDocument.cpp +PRBool +nsSAXXMLReader::TryChannelCharset(nsIChannel *aChannel, + PRInt32& aCharsetSource, + nsACString& aCharset) +{ + if (aCharsetSource >= kCharsetFromChannel) { + return PR_TRUE; + } + + if (aChannel) { + nsCAutoString charsetVal; + nsresult rv = aChannel->GetContentCharset(charsetVal); + if (NS_SUCCEEDED(rv)) { + nsCOMPtr + calias(do_GetService(NS_CHARSETALIAS_CONTRACTID)); + if (calias) { + nsCAutoString preferred; + rv = calias->GetPreferred(charsetVal, preferred); + if (NS_SUCCEEDED(rv)) { + aCharset = preferred; + aCharsetSource = kCharsetFromChannel; + return PR_TRUE; + } + } + } + } + return PR_FALSE; +} + nsresult nsSAXXMLReader::SplitExpatName(const PRUnichar *aExpatName, nsString &aURI,