From 993c58091f3fa21e4ad582ba654f5ca0a273f3b6 Mon Sep 17 00:00:00 2001 From: "masayuki%d-toybox.com" Date: Thu, 13 Apr 2006 14:44:38 +0000 Subject: [PATCH] Bug 261929 Consider sending urls in UTF-8 by default (images/links with non-ASCII chacters not displayed). patch by Masatoshi Kimura (emk) r=cbiesinger, sr=darin git-svn-id: svn://10.0.0.236/trunk@194312 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/modules/libpref/src/init/all.js | 6 ++++- mozilla/netwerk/base/src/nsStandardURL.cpp | 31 +++++++++++++++++----- mozilla/netwerk/base/src/nsStandardURL.h | 1 + 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/mozilla/modules/libpref/src/init/all.js b/mozilla/modules/libpref/src/init/all.js index 701b8638697..796b9a55939 100644 --- a/mozilla/modules/libpref/src/init/all.js +++ b/mozilla/modules/libpref/src/init/all.js @@ -633,7 +633,11 @@ pref("network.standard-url.escape-utf8", true); // This preference controls whether or not URLs are always encoded and sent as // UTF-8. -pref("network.standard-url.encode-utf8", false); +pref("network.standard-url.encode-utf8", true); + +// This preference controls whether or not queries are encoded and sent as +// UTF-8. +pref("network.standard-url.encode-query-utf8", false); // Idle timeout for ftp control connections - 5 minute default pref("network.ftp.idleConnectionTimeout", 300); diff --git a/mozilla/netwerk/base/src/nsStandardURL.cpp b/mozilla/netwerk/base/src/nsStandardURL.cpp index daa9a7252af..ec93e9abc49 100644 --- a/mozilla/netwerk/base/src/nsStandardURL.cpp +++ b/mozilla/netwerk/base/src/nsStandardURL.cpp @@ -64,6 +64,7 @@ nsICharsetConverterManager *nsStandardURL::gCharsetMgr = nsnull; PRBool nsStandardURL::gInitialized = PR_FALSE; PRBool nsStandardURL::gEscapeUTF8 = PR_TRUE; PRBool nsStandardURL::gAlwaysEncodeInUTF8 = PR_TRUE; +PRBool nsStandardURL::gEncodeQueryInUTF8 = PR_TRUE; PRBool nsStandardURL::gShowPunycode = PR_FALSE; nsIPrefBranch *nsStandardURL::gIDNWhitelistPrefBranch = nsnull; @@ -138,6 +139,7 @@ end: #define NS_NET_PREF_ESCAPEUTF8 "network.standard-url.escape-utf8" #define NS_NET_PREF_ENABLEIDN "network.enableIDN" #define NS_NET_PREF_ALWAYSENCODEINUTF8 "network.standard-url.encode-utf8" +#define NS_NET_PREF_ENCODEQUERYINUTF8 "network.standard-url.encode-query-utf8" #define NS_NET_PREF_SHOWPUNYCODE "network.IDN_show_punycode" #define NS_NET_PREF_IDNWHITELIST "network.IDN.whitelist." @@ -256,8 +258,15 @@ nsSegmentEncoder::InitUnicodeEncoder() return PR_TRUE; } +#define GET_SEGMENT_ENCODER_INTERNAL(name, useUTF8) \ + nsSegmentEncoder name(useUTF8 ? nsnull : mOriginCharset.get()) + #define GET_SEGMENT_ENCODER(name) \ - nsSegmentEncoder name(gAlwaysEncodeInUTF8 ? nsnull : mOriginCharset.get()) + GET_SEGMENT_ENCODER_INTERNAL(name, gAlwaysEncodeInUTF8) + +#define GET_QUERY_ENCODER(name) \ + GET_SEGMENT_ENCODER_INTERNAL(name, gAlwaysEncodeInUTF8 && \ + gEncodeQueryInUTF8) //---------------------------------------------------------------------------- // nsStandardURL @@ -302,10 +311,11 @@ nsStandardURL::InitGlobalObjects() nsCOMPtr prefBranch( do_GetService(NS_PREFSERVICE_CONTRACTID) ); if (prefBranch) { nsCOMPtr obs( new nsPrefObserver() ); - prefBranch->AddObserver(NS_NET_PREF_ESCAPEUTF8, obs.get(), PR_FALSE); + prefBranch->AddObserver(NS_NET_PREF_ESCAPEUTF8, obs.get(), PR_FALSE); prefBranch->AddObserver(NS_NET_PREF_ALWAYSENCODEINUTF8, obs.get(), PR_FALSE); - prefBranch->AddObserver(NS_NET_PREF_ENABLEIDN, obs.get(), PR_FALSE); - prefBranch->AddObserver(NS_NET_PREF_SHOWPUNYCODE, obs.get(), PR_FALSE); + prefBranch->AddObserver(NS_NET_PREF_ENCODEQUERYINUTF8, obs.get(), PR_FALSE); + prefBranch->AddObserver(NS_NET_PREF_ENABLEIDN, obs.get(), PR_FALSE); + prefBranch->AddObserver(NS_NET_PREF_SHOWPUNYCODE, obs.get(), PR_FALSE); PrefsChanged(prefBranch, nsnull); @@ -488,13 +498,14 @@ nsStandardURL::BuildNormalizedSpec(const char *spec) // appropriate encoding. { GET_SEGMENT_ENCODER(encoder); + GET_QUERY_ENCODER(queryEncoder); approxLen += encoder.EncodeSegmentCount(spec, mUsername, esc_Username, encUsername, useEncUsername); approxLen += encoder.EncodeSegmentCount(spec, mPassword, esc_Password, encPassword, useEncPassword); approxLen += encoder.EncodeSegmentCount(spec, mDirectory, esc_Directory, encDirectory, useEncDirectory); approxLen += encoder.EncodeSegmentCount(spec, mBasename, esc_FileBaseName, encBasename, useEncBasename); approxLen += encoder.EncodeSegmentCount(spec, mExtension, esc_FileExtension, encExtension, useEncExtension); approxLen += encoder.EncodeSegmentCount(spec, mParam, esc_Param, encParam, useEncParam); - approxLen += encoder.EncodeSegmentCount(spec, mQuery, esc_Query, encQuery, useEncQuery); + approxLen += queryEncoder.EncodeSegmentCount(spec, mQuery, esc_Query, encQuery, useEncQuery); approxLen += encoder.EncodeSegmentCount(spec, mRef, esc_Ref, encRef, useEncRef); } @@ -834,13 +845,19 @@ nsStandardURL::PrefsChanged(nsIPrefBranch *prefs, const char *pref) gEscapeUTF8 = val; LOG(("escape UTF-8 %s\n", gEscapeUTF8 ? "enabled" : "disabled")); } - + if (PREF_CHANGED(NS_NET_PREF_ALWAYSENCODEINUTF8)) { if (GOT_PREF(NS_NET_PREF_ALWAYSENCODEINUTF8, val)) gAlwaysEncodeInUTF8 = val; LOG(("encode in UTF-8 %s\n", gAlwaysEncodeInUTF8 ? "enabled" : "disabled")); } + if (PREF_CHANGED(NS_NET_PREF_ENCODEQUERYINUTF8)) { + if (GOT_PREF(NS_NET_PREF_ENCODEQUERYINUTF8, val)) + gEncodeQueryInUTF8 = val; + LOG(("encode query in UTF-8 %s\n", gEncodeQueryInUTF8 ? "enabled" : "disabled")); + } + if (PREF_CHANGED(NS_NET_PREF_SHOWPUNYCODE)) { if (GOT_PREF(NS_NET_PREF_SHOWPUNYCODE, val)) gShowPunycode = val; @@ -2194,7 +2211,7 @@ nsStandardURL::SetQuery(const nsACString &input) // encode query if necessary nsCAutoString buf; PRBool encoded; - GET_SEGMENT_ENCODER(encoder); + GET_QUERY_ENCODER(encoder); encoder.EncodeSegmentCount(query, URLSegment(0, queryLen), esc_Query, buf, encoded); if (encoded) { diff --git a/mozilla/netwerk/base/src/nsStandardURL.h b/mozilla/netwerk/base/src/nsStandardURL.h index d7b5dcb29c2..a22d432a61f 100644 --- a/mozilla/netwerk/base/src/nsStandardURL.h +++ b/mozilla/netwerk/base/src/nsStandardURL.h @@ -274,6 +274,7 @@ private: static PRBool gInitialized; static PRBool gEscapeUTF8; static PRBool gAlwaysEncodeInUTF8; + static PRBool gEncodeQueryInUTF8; static PRBool gShowPunycode; static nsIPrefBranch *gIDNWhitelistPrefBranch; };