Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:11.4
seamonkey
mozilla-ua-locale.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File mozilla-ua-locale.patch of Package seamonkey
From: upstream Subject: allow reading general.useragent.locale from user profile References: https://bugzilla.mozilla.org/show_bug.cgi?id=519468 https://bugzilla.mozilla.org/show_bug.cgi?id=542999 http://bugzilla.novell.com/show_bug.cgi?id=582654 diff --git a/chrome/src/nsChromeRegistry.cpp b/chrome/src/nsChromeRegistry.cpp --- a/chrome/src/nsChromeRegistry.cpp +++ b/chrome/src/nsChromeRegistry.cpp @@ -545,58 +545,39 @@ nsChromeRegistry::Init() if (safeMode) prefserv->GetDefaultBranch(nsnull, getter_AddRefs(prefs)); else prefs = do_QueryInterface(prefserv); if (!prefs) { NS_WARNING("Could not get pref service!"); } - - PRBool useLocalePref = PR_TRUE; - - if (prefs) { - // check the pref first - PRBool matchOS = PR_FALSE; - rv = prefs->GetBoolPref(MATCH_OS_LOCALE_PREF, &matchOS); - - // match os locale - if (NS_SUCCEEDED(rv) && matchOS) { - // compute lang and region code only when needed! - nsCAutoString uiLocale; - rv = getUILangCountry(uiLocale); - if (NS_SUCCEEDED(rv)) { - useLocalePref = PR_FALSE; - mSelectedLocale = uiLocale; - } - } - } - - if (prefs) { + else { nsXPIDLCString provider; - rv = prefs->GetCharPref(SELECTED_SKIN_PREF, getter_Copies(provider)); if (NS_SUCCEEDED(rv)) mSelectedSkin = provider; + SelectLocalePref(prefs); + nsCOMPtr<nsIPrefBranch2> prefs2 (do_QueryInterface(prefs)); - if (prefs2) + if (prefs2) { + rv = prefs2->AddObserver(MATCH_OS_LOCALE_PREF, this, PR_TRUE); + rv = prefs2->AddObserver(SELECTED_LOCALE_PREF, this, PR_TRUE); rv = prefs2->AddObserver(SELECTED_SKIN_PREF, this, PR_TRUE); - - if (useLocalePref) { - rv = prefs->GetCharPref(SELECTED_LOCALE_PREF, getter_Copies(provider)); - if (NS_SUCCEEDED(rv)) - mSelectedLocale = provider; - - if (prefs2) - prefs2->AddObserver(SELECTED_LOCALE_PREF, this, PR_TRUE); } } + nsCOMPtr<nsIObserverService> obsService (do_GetService("@mozilla.org/observer-service;1")); + if (obsService) { + obsService->AddObserver(this, "command-line-startup", PR_TRUE); + obsService->AddObserver(this, "profile-initial-state", PR_TRUE); + } + CheckForNewChrome(); mInitialized = PR_TRUE; return NS_OK; } NS_IMETHODIMP @@ -1479,40 +1460,68 @@ nsChromeRegistry::ProcessNewChromeBuffer while (aBuffer < bufferEnd && (*aBuffer == '\0' || *aBuffer == ' ' || *aBuffer == '\r' || *aBuffer == '\n')) ++aBuffer; } return NS_OK; } +nsresult +nsChromeRegistry::SelectLocalePref(nsIPrefBranch* prefs) +{ + nsresult rv; + PRBool matchOSLocale = PR_FALSE, userLocaleOverride = PR_FALSE; + prefs->PrefHasUserValue(SELECTED_LOCALE_PREF, &userLocaleOverride); + rv = prefs->GetBoolPref(MATCH_OS_LOCALE_PREF, &matchOSLocale); + + if (NS_SUCCEEDED(rv) && matchOSLocale && !userLocaleOverride) { + // compute lang and region code only when needed! + nsCAutoString uiLocale; + rv = getUILangCountry(uiLocale); + if (NS_SUCCEEDED(rv)) + mSelectedLocale = uiLocale; + } + else { + nsXPIDLCString provider; + rv = prefs->GetCharPref(SELECTED_LOCALE_PREF, getter_Copies(provider)); + if (NS_SUCCEEDED(rv)) { + mSelectedLocale = provider; + } + } + + return rv; +} + NS_IMETHODIMP nsChromeRegistry::Observe(nsISupports *aSubject, const char *aTopic, const PRUnichar *someData) { nsresult rv = NS_OK; if (!strcmp(NS_PREFBRANCH_PREFCHANGE_TOPIC_ID, aTopic)) { nsCOMPtr<nsIPrefBranch> prefs (do_QueryInterface(aSubject)); NS_ASSERTION(prefs, "Bad observer call!"); NS_ConvertUTF16toUTF8 pref(someData); - nsXPIDLCString provider; - rv = prefs->GetCharPref(pref.get(), getter_Copies(provider)); - if (NS_FAILED(rv)) { - NS_ERROR("Couldn't get new locale or skin pref!"); - return rv; + if (pref.EqualsLiteral(MATCH_OS_LOCALE_PREF) || + pref.EqualsLiteral(SELECTED_LOCALE_PREF)) { + rv = SelectLocalePref(prefs); + if (NS_SUCCEEDED(rv) && mProfileLoaded) + FlushAllCaches(); } - - if (pref.EqualsLiteral(SELECTED_SKIN_PREF)) { + else if (pref.EqualsLiteral(SELECTED_SKIN_PREF)) { + nsXPIDLCString provider; + rv = prefs->GetCharPref(pref.get(), getter_Copies(provider)); + if (NS_FAILED(rv)) { + NS_ERROR("Couldn't get new locale pref!"); + return rv; + } + mSelectedSkin = provider; RefreshSkins(); - } - else if (pref.EqualsLiteral(SELECTED_LOCALE_PREF)) { - mSelectedLocale = provider; - FlushAllCaches(); } else { NS_ERROR("Unexpected pref!"); } } else if (!strcmp("command-line-startup", aTopic)) { nsCOMPtr<nsICommandLine> cmdLine (do_QueryInterface(aSubject)); if (cmdLine) { nsAutoString uiLocale; @@ -1522,16 +1531,19 @@ NS_IMETHODIMP nsChromeRegistry::Observe( CopyUTF16toUTF8(uiLocale, mSelectedLocale); nsCOMPtr<nsIPrefBranch2> prefs (do_GetService(NS_PREFSERVICE_CONTRACTID)); if (prefs) { prefs->RemoveObserver(SELECTED_LOCALE_PREF, this); } } } } + else if (!strcmp("profile-initial-state", aTopic)) { + mProfileLoaded = PR_TRUE; + } else { NS_ERROR("Unexpected observer topic!"); } return rv; } #ifdef MOZ_XUL diff --git a/chrome/src/nsChromeRegistry.h b/chrome/src/nsChromeRegistry.h --- a/chrome/src/nsChromeRegistry.h +++ b/chrome/src/nsChromeRegistry.h @@ -56,16 +56,17 @@ #include "nsInterfaceHashtable.h" struct PRFileDesc; class nsIAtom; class nsICSSLoader; class nsICSSStyleSheet; class nsIDOMWindowInternal; class nsILocalFile; +class nsIPrefBranch; class nsIRDFDataSource; class nsIRDFResource; class nsIRDFService; class nsISimpleEnumerator; class nsIURL; // for component registration // {47049e42-1d87-482a-984d-56ae185e367a} @@ -89,17 +90,17 @@ public: #ifdef MOZ_XUL NS_DECL_NSIXULOVERLAYPROVIDER #endif NS_DECL_NSIOBSERVER // nsChromeRegistry methods: - nsChromeRegistry() : mInitialized(PR_FALSE) { + nsChromeRegistry() : mInitialized(PR_FALSE), mProfileLoaded(PR_FALSE) { mPackagesHash.ops = nsnull; } ~nsChromeRegistry(); nsresult Init(); static nsChromeRegistry* gChromeRegistry; @@ -110,16 +111,18 @@ protected: nsresult LoadInstallDataSource(); nsresult LoadProfileDataSource(); void FlushSkinCaches(); void FlushAllCaches(); private: + nsresult SelectLocalePref(nsIPrefBranch* prefs); + static nsresult RefreshWindow(nsIDOMWindowInternal* aWindow, nsICSSLoader* aCSSLoader); static nsresult GetProviderAndPath(nsIURL* aChromeURL, nsACString& aProvider, nsACString& aPath); #ifdef MOZ_XUL NS_HIDDEN_(void) ProcessProvider(PRFileDesc *fd, nsIRDFService* aRDFs, nsIRDFDataSource* ds, nsIRDFResource* aRoot, @@ -239,16 +242,17 @@ public: const nsCOMArray<nsIURI>* GetArray(nsIURI* aBase); private: nsTHashtable<OverlayListEntry> mTable; }; private: PRBool mInitialized; + PRBool mProfileLoaded; // Hash of package names ("global") to PackageEntry objects PLDHashTable mPackagesHash; // Hashes on the file to be overlaid (chrome://browser/content/browser.xul) // to a list of overlays/stylesheets OverlayListHash mOverlayHash; OverlayListHash mStyleHash; diff --git a/toolkit/xre/nsXREDirProvider.cpp b/toolkit/xre/nsXREDirProvider.cpp --- a/toolkit/xre/nsXREDirProvider.cpp +++ b/toolkit/xre/nsXREDirProvider.cpp @@ -811,16 +811,18 @@ nsXREDirProvider::DoStartup() static const PRUnichar kStartup[] = {'s','t','a','r','t','u','p','\0'}; obsSvc->NotifyObservers(nsnull, "profile-do-change", kStartup); obsSvc->NotifyObservers(nsnull, "profile-after-change", kStartup); // Any component that has registered for the profile-after-change category // should also be created at this time. (void)NS_CreateServicesFromCategory("profile-after-change", nsnull, "profile-after-change"); + + obsSvc->NotifyObservers(nsnull, "profile-initial-state", nsnull); } return NS_OK; } class ProfileChangeStatusImpl : public nsIProfileChangeStatus { public: NS_DECL_ISUPPORTS
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor