--- a/modules/libpref/Preferences.cpp
+++ b/modules/libpref/Preferences.cpp
@@ -1688,17 +1688,18 @@ pref_Lookup(const char* aPrefName, bool
return result;
}
static Result<Pref*, nsresult>
pref_LookupForModify(const char* aPrefName,
const std::function<bool(const PrefWrapper&)>& aCheckFn)
{
- Maybe<PrefWrapper> wrapper = pref_Lookup(aPrefName, /* includeTypeNone */ true);
+ Maybe<PrefWrapper> wrapper =
+ pref_Lookup(aPrefName, /* includeTypeNone */ true);
if (wrapper.isNothing()) {
return Err(NS_ERROR_INVALID_ARG);
}
if (!aCheckFn(*wrapper)) {
return nullptr;
}
if (wrapper->is<Pref*>()) {
return wrapper->as<Pref*>();
@@ -1751,18 +1752,18 @@ pref_SetPref(const char* aPrefName,
// New entry. Set the type.
pref->SetType(aType);
}
}
bool valueChanged = false;
nsresult rv;
if (aKind == PrefValueKind::Default) {
- rv = pref->SetDefaultValue(
- aType, aValue, aIsSticky, aIsLocked, &valueChanged);
+ rv =
+ pref->SetDefaultValue(aType, aValue, aIsSticky, aIsLocked, &valueChanged);
} else {
MOZ_ASSERT(!aIsLocked); // `locked` is disallowed in user pref files
rv = pref->SetUserValue(aType, aValue, aFromInit, &valueChanged);
}
if (NS_FAILED(rv)) {
NS_WARNING(
nsPrintfCString(
"Rejected attempt to change type of pref %s's %s value from %s to %s",
@@ -4773,16 +4774,51 @@ pref_ReadPrefFromJar(nsZipArchive* aJarR
startTime,
manifest)) {
return NS_ERROR_FILE_CORRUPTED;
}
return NS_OK;
}
+// These preference getter wrappers allow us to look up the value for static
+// preferences based on their native types, rather than manually mapping them to
+// the appropriate Preferences::Get* functions.
+template<typename T>
+static T
+GetPref(const char* aName, T aDefaultValue);
+
+template<>
+bool
+GetPref<bool>(const char* aName, bool aDefaultValue)
+{
+ return Preferences::GetBool(aName, aDefaultValue);
+}
+
+template<>
+int32_t
+GetPref<int32_t>(const char* aName, int32_t aDefaultValue)
+{
+ return Preferences::GetInt(aName, aDefaultValue);
+}
+
+template<>
+uint32_t
+GetPref<uint32_t>(const char* aName, uint32_t aDefaultValue)
+{
+ return Preferences::GetInt(aName, aDefaultValue);
+}
+
+template<>
+float MOZ_MAYBE_UNUSED
+GetPref<float>(const char* aName, float aDefaultValue)
+{
+ return Preferences::GetFloat(aName, aDefaultValue);
+}
+
// Initialize default preference JavaScript buffers from appropriate TEXT
// resources.
/* static */ Result<Ok, const char*>
Preferences::InitInitialObjects(bool aIsStartup)
{
// Initialize static prefs before prefs from data files so that the latter
// will override the former.
StaticPrefs::InitAll(aIsStartup);
@@ -4801,16 +4837,28 @@ Preferences::InitInitialObjects(bool aIs
// support that for static preferences in this configuration, and therefore
// ignore the possibility.
for (auto& pref : gSharedMap->Iter()) {
if (pref.HasUserValue() || pref.IsLocked()) {
NotifyCallbacks(pref.Name(), PrefWrapper(pref));
}
}
+#ifdef DEBUG
+ // Check that all varcache preferences match their current values.
+
+#define PREF(name, cpp_type, value)
+#define VARCACHE_PREF(name, id, cpp_type, value) \
+ MOZ_ASSERT(GetPref<StripAtomic<cpp_type>>(name, value) == StaticPrefs::id(), \
+ "Incorrect cached value for " name);
+#include "mozilla/StaticPrefList.h"
+#undef PREF
+#undef VARCACHE_PREF
+#endif
+
return Ok();
}
// In the omni.jar case, we load the following prefs:
// - jar:$gre/omni.jar!/greprefs.js
// - jar:$gre/omni.jar!/defaults/pref/*.js
//
// In the non-omni.jar case, we load: