Changed to use uconv util function to do the unescape which

checks for valid UTF-8 and fallback to the doc charset,
bug 161479, r=shanjian, sr=jst, a=dbaron.
This commit is contained in:
nhotta%netscape.com 2002-09-08 15:08:45 +00:00
parent c02b619c53
commit 30d3952982
2 changed files with 10 additions and 42 deletions

View File

@ -750,49 +750,20 @@ nsJSProtocolHandler::EnsureUTF8Spec(const nsAFlatCString &aSpec, const char *aCh
{
aUTF8Spec.Truncate();
// assume UTF-8 if the spec contains unescaped non ASCII
if (!nsCRT::IsAscii(aSpec.get()))
return NS_OK;
nsCAutoString unescapedSpec;
NS_UnescapeURL(aSpec.get(), aSpec.Length(),
esc_OnlyNonASCII, unescapedSpec);
if (IsASCII(unescapedSpec))
return NS_OK;
nsresult rv;
if (!mCharsetConverterManager) {
mCharsetConverterManager = do_GetService(NS_CHARSETCONVERTERMANAGER_CONTRACTID, &rv);
if (!mTextToSubURI) {
mTextToSubURI = do_GetService(NS_ITEXTTOSUBURI_CONTRACTID, &rv);
NS_ENSURE_SUCCESS(rv, rv);
}
nsCOMPtr<nsIAtom> charsetAtom;
rv = mCharsetConverterManager->GetCharsetAtom2(aCharset, getter_AddRefs(charsetAtom));
nsAutoString uStr;
rv = mTextToSubURI->UnEscapeNonAsciiURI(nsDependentCString(aCharset), aSpec, uStr);
NS_ENSURE_SUCCESS(rv, rv);
if (mCharsetAtom != charsetAtom) {
rv = mCharsetConverterManager->GetUnicodeDecoder(charsetAtom,
getter_AddRefs(mUnicodeDecoder));
NS_ENSURE_SUCCESS(rv, rv);
mCharsetAtom = charsetAtom;
}
if (!IsASCII(uStr))
NS_EscapeURL(NS_ConvertUCS2toUTF8(uStr), esc_AlwaysCopy | esc_OnlyNonASCII, aUTF8Spec);
PRInt32 srcLen = unescapedSpec.Length();
PRInt32 dstLen;
rv = mUnicodeDecoder->GetMaxLength(unescapedSpec.get(), srcLen, &dstLen);
NS_ENSURE_SUCCESS(rv, rv);
PRUnichar *ustr = (PRUnichar *) nsMemory::Alloc(dstLen * sizeof(PRUnichar));
NS_ENSURE_TRUE(ustr, NS_ERROR_OUT_OF_MEMORY);
rv = mUnicodeDecoder->Convert(unescapedSpec.get(), &srcLen, ustr, &dstLen);
if (NS_SUCCEEDED(rv)) {
NS_ConvertUCS2toUTF8 rawUTF8Spec(ustr, dstLen);
NS_EscapeURL(rawUTF8Spec, esc_AlwaysCopy | esc_OnlyNonASCII, aUTF8Spec);
}
nsMemory::Free(ustr);
return rv;
return NS_OK;
}
////////////////////////////////////////////////////////////////////////////////

View File

@ -40,8 +40,7 @@
#define nsJSProtocolHandler_h___
#include "nsIProtocolHandler.h"
#include "nsICharsetConverterManager.h"
#include "nsICharsetConverterManager2.h"
#include "nsITextToSubURI.h"
#define NS_JSPROTOCOLHANDLER_CID \
{ /* bfc310d2-38a0-11d3-8cd3-0060b0fc14a3 */ \
@ -73,9 +72,7 @@ protected:
nsresult EnsureUTF8Spec(const nsAFlatCString &aSpec, const char *aCharset,
nsACString &aUTF8Spec);
nsCOMPtr<nsICharsetConverterManager2> mCharsetConverterManager;
nsCOMPtr<nsIAtom> mCharsetAtom;
nsCOMPtr<nsIUnicodeDecoder> mUnicodeDecoder;
nsCOMPtr<nsITextToSubURI> mTextToSubURI;
};
#endif /* nsJSProtocolHandler_h___ */