mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-11 12:25:53 +00:00
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:
parent
c02b619c53
commit
30d3952982
@ -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;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -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___ */
|
||||
|
Loading…
Reference in New Issue
Block a user