Bug 1352343 - Bind LocaleService to react to OSPreferences intl:system-locales-changed. r=jfkthame

MozReview-Commit-ID: Hnhun0bAVSr

--HG--
extra : rebase_source : 4aa553251bde30797de84bd72ef872891d44d1a3
This commit is contained in:
Zibi Braniecki 2017-10-05 18:43:38 +02:00
parent 7d1e1adec8
commit e6913c46a1

View File

@ -19,6 +19,8 @@
#include "unicode/uloc.h"
#define INTL_SYSTEM_LOCALES_CHANGED "intl:system-locales-changed"
#define MATCH_OS_LOCALE_PREF "intl.locale.matchOS"
#define SELECTED_LOCALE_PREF "general.useragent.locale"
@ -175,6 +177,11 @@ LocaleService::GetInstance()
// from prefs.
DebugOnly<nsresult> rv = Preferences::AddWeakObservers(sInstance, kObservedPrefs);
MOZ_ASSERT(NS_SUCCEEDED(rv), "Adding observers failed.");
nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
if (obs) {
obs->AddObserver(sInstance, INTL_SYSTEM_LOCALES_CHANGED, false);
}
}
ClearOnShutdown(&sInstance);
}
@ -185,6 +192,11 @@ LocaleService::~LocaleService()
{
if (mIsServer) {
Preferences::RemoveObservers(this, kObservedPrefs);
nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
if (obs) {
obs->RemoveObserver(static_cast<nsIObserver*>(this), INTL_SYSTEM_LOCALES_CHANGED);
}
}
}
@ -519,19 +531,24 @@ LocaleService::Observe(nsISupports *aSubject, const char *aTopic,
{
MOZ_ASSERT(mIsServer, "This should only be called in the server mode.");
NS_ConvertUTF16toUTF8 pref(aData);
// This is a temporary solution until we get bug 1337078 landed.
if (pref.EqualsLiteral(ANDROID_OS_LOCALE_PREF)) {
OSPreferences::GetInstance()->Refresh();
}
// At the moment the only thing we're observing are settings indicating
// user requested locales.
if (pref.EqualsLiteral(MATCH_OS_LOCALE_PREF) ||
pref.EqualsLiteral(SELECTED_LOCALE_PREF) ||
pref.EqualsLiteral(ANDROID_OS_LOCALE_PREF)) {
if (!strcmp(aTopic, INTL_SYSTEM_LOCALES_CHANGED)) {
OnRequestedLocalesChanged();
} else {
NS_ConvertUTF16toUTF8 pref(aData);
// This is a temporary solution until we get bug 1337078 landed.
if (pref.EqualsLiteral(ANDROID_OS_LOCALE_PREF)) {
OSPreferences::GetInstance()->Refresh();
}
// At the moment the only thing we're observing are settings indicating
// user requested locales.
if (pref.EqualsLiteral(MATCH_OS_LOCALE_PREF) ||
pref.EqualsLiteral(SELECTED_LOCALE_PREF) ||
pref.EqualsLiteral(ANDROID_OS_LOCALE_PREF)) {
OnRequestedLocalesChanged();
}
}
return NS_OK;
}