diff --git a/mozilla/netwerk/base/src/nsStandardURL.cpp b/mozilla/netwerk/base/src/nsStandardURL.cpp index 2c89a64c00e..970253c1cf0 100644 --- a/mozilla/netwerk/base/src/nsStandardURL.cpp +++ b/mozilla/netwerk/base/src/nsStandardURL.cpp @@ -347,6 +347,10 @@ nsStandardURL::InitGlobalObjects() nsCOMPtr obs( new nsPrefObserver() ); pbi->AddObserver(NS_NET_PREF_ESCAPEUTF8, obs.get(), PR_FALSE); pbi->AddObserver(NS_NET_PREF_ENABLEIDN, obs.get(), PR_FALSE); + // initialize IDN + nsCOMPtr serv(do_GetService(NS_IDNSERVICE_CONTRACTID)); + if (serv) + NS_ADDREF(gIDNService = serv.get()); } } } diff --git a/mozilla/netwerk/build/nsNetModule.cpp b/mozilla/netwerk/build/nsNetModule.cpp index 639884b1f79..da6c5a7c608 100644 --- a/mozilla/netwerk/build/nsNetModule.cpp +++ b/mozilla/netwerk/build/nsNetModule.cpp @@ -170,7 +170,7 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(nsResumableEntityID) /////////////////////////////////////////////////////////////////////////////// #include "nsIDNService.h" -NS_GENERIC_FACTORY_CONSTRUCTOR(nsIDNService) +NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsIDNService, Init) /////////////////////////////////////////////////////////////////////////////// diff --git a/mozilla/netwerk/dns/src/nsIDNService.cpp b/mozilla/netwerk/dns/src/nsIDNService.cpp index 2d66951d22e..82bbf6f8402 100644 --- a/mozilla/netwerk/dns/src/nsIDNService.cpp +++ b/mozilla/netwerk/dns/src/nsIDNService.cpp @@ -44,6 +44,8 @@ #include "nsIServiceManager.h" #include "nsIPrefService.h" #include "nsIPrefBranch.h" +#include "nsIPrefBranchInternal.h" +#include "nsIObserverService.h" #include "punycode.h" //----------------------------------------------------------------------------- @@ -52,13 +54,55 @@ static const PRUint32 kMaxDNSNodeLen = 63; //----------------------------------------------------------------------------- +#define NS_NET_PREF_IDNTESTBED "network.IDN_testbed" +#define NS_NET_PREF_IDNPREFIX "network.IDN_prefix" //----------------------------------------------------------------------------- // nsIDNService //----------------------------------------------------------------------------- /* Implementation file */ -NS_IMPL_ISUPPORTS1(nsIDNService, nsIIDNService) +NS_IMPL_THREADSAFE_ISUPPORTS3(nsIDNService, + nsIIDNService, + nsIObserver, + nsISupportsWeakReference); + +nsresult nsIDNService::Init() +{ + nsCOMPtr prefInternal(do_GetService(NS_PREFSERVICE_CONTRACTID)); + if (prefInternal) { + prefInternal->AddObserver(NS_NET_PREF_IDNTESTBED, this, PR_TRUE); + prefInternal->AddObserver(NS_NET_PREF_IDNPREFIX, this, PR_TRUE); + } + + return NS_OK; +} + +NS_IMETHODIMP nsIDNService::Observe(nsISupports *aSubject, + const char *aTopic, + const PRUnichar *aData) +{ + if (!strcmp(aTopic, NS_PREFBRANCH_PREFCHANGE_TOPIC_ID)) { + nsCOMPtr prefBranch( do_QueryInterface(aSubject) ); + if (prefBranch) { + // to support test environment which is a temporary testing environment + // until IDN is actually deployed + if (NS_LITERAL_STRING(NS_NET_PREF_IDNTESTBED).Equals(aData)) { + PRBool val; + if (NS_SUCCEEDED(prefBranch->GetBoolPref(NS_NET_PREF_IDNTESTBED, &val))) + mMultilingualTestBed = val; + } + else if (NS_LITERAL_STRING(NS_NET_PREF_IDNPREFIX).Equals(aData)) { + nsXPIDLCString prefix; + if (NS_SUCCEEDED(prefBranch->GetCharPref(NS_NET_PREF_IDNPREFIX, getter_Copies(prefix))) && + prefix.Length() <= kACEPrefixLen) + PL_strncpyz(nsIDNService::mACEPrefix, prefix.get(), kACEPrefixLen + 1); + } + } + } + + return NS_OK; +} nsIDNService::nsIDNService() { @@ -72,30 +116,6 @@ nsIDNService::nsIDNService() mMultilingualTestBed = PR_FALSE; - nsCOMPtr prefService(do_GetService(NS_PREFSERVICE_CONTRACTID)); - if (prefService) { - nsCOMPtr prefBranch; - prefService->GetBranch(nsnull, getter_AddRefs(prefBranch)); - if (prefBranch) { - - // to support test environment which is a temporary testing environment - // until IDN is actually deployed - PRBool value; - rv = prefBranch->GetBoolPref("network.IDN_testbed", &value); - if (NS_SUCCEEDED(rv)) - mMultilingualTestBed = value; - - // read prefix from pref - nsXPIDLCString prefix; - rv = prefBranch->GetCharPref("network.IDN_prefix", getter_Copies(prefix)); - if (NS_SUCCEEDED(rv) && - prefix.Length() <= kACEPrefixLen) { - strncpy(mACEPrefix, prefix.get(), kACEPrefixLen); - mACEPrefix[sizeof(mACEPrefix)-1] = '\0'; - } - } - } - if (idn_success != idn_nameprep_create(NULL, &mNamePrepHandle)) mNamePrepHandle = nsnull; diff --git a/mozilla/netwerk/dns/src/nsIDNService.h b/mozilla/netwerk/dns/src/nsIDNService.h index 1259553b84d..fb4f89672e1 100644 --- a/mozilla/netwerk/dns/src/nsIDNService.h +++ b/mozilla/netwerk/dns/src/nsIDNService.h @@ -41,6 +41,8 @@ #include "nsIIDNService.h" #include "nsCOMPtr.h" +#include "nsIObserver.h" +#include "nsWeakReference.h" #include "nsIUnicodeNormalizer.h" #include "nsIDNKitInterface.h" @@ -50,15 +52,20 @@ #define kACEPrefixLen 4 -class nsIDNService : public nsIIDNService +class nsIDNService : public nsIIDNService, + public nsIObserver, + public nsSupportsWeakReference { public: NS_DECL_ISUPPORTS NS_DECL_NSIIDNSERVICE + NS_DECL_NSIOBSERVER nsIDNService(); virtual ~nsIDNService(); + nsresult Init(); + private: void normalizeFullStops(nsAString& s); nsresult stringPrepAndACE(const nsAString& in, nsACString& out);