diff --git a/modules/libpref/Preferences.cpp b/modules/libpref/Preferences.cpp index 989492cb67cb..40d6f89e56e7 100644 --- a/modules/libpref/Preferences.cpp +++ b/modules/libpref/Preferences.cpp @@ -2493,6 +2493,16 @@ nsPrefBranch::PrefHasUserValue(const char* aPrefName, bool* aRetVal) { return NS_OK; } +NS_IMETHODIMP +nsPrefBranch::PrefHasDefaultValue(const char* aPrefName, bool* aRetVal) { + NS_ENSURE_ARG_POINTER(aRetVal); + NS_ENSURE_ARG(aPrefName); + + const PrefName& pref = GetPrefName(aPrefName); + *aRetVal = Preferences::HasDefaultValue(pref.get()); + return NS_OK; +} + NS_IMETHODIMP nsPrefBranch::LockPref(const char* aPrefName) { NS_ENSURE_ARG(aPrefName); @@ -5011,6 +5021,14 @@ bool Preferences::HasUserValue(const char* aPrefName) { return pref.isSome() && pref->HasUserValue(); } +/* static */ +bool Preferences::HasDefaultValue(const char* aPrefName) { + NS_ENSURE_TRUE(InitStaticMembers(), false); + + Maybe pref = pref_Lookup(aPrefName); + return pref.isSome() && pref->HasDefaultValue(); +} + /* static */ int32_t Preferences::GetType(const char* aPrefName) { NS_ENSURE_TRUE(InitStaticMembers(), nsIPrefBranch::PREF_INVALID); diff --git a/modules/libpref/Preferences.h b/modules/libpref/Preferences.h index f6787cb58b35..682a465a1ee9 100644 --- a/modules/libpref/Preferences.h +++ b/modules/libpref/Preferences.h @@ -223,6 +223,9 @@ class Preferences final : public nsIPrefService, // Whether the pref has a user value or not. static bool HasUserValue(const char* aPref); + // Whether the pref has a user value or not. + static bool HasDefaultValue(const char* aPref); + // Adds/Removes the observer for the root pref branch. See nsIPrefBranch.idl // for details. static nsresult AddStrongObserver(nsIObserver* aObserver, diff --git a/modules/libpref/nsIPrefBranch.idl b/modules/libpref/nsIPrefBranch.idl index 5fa4af1ba4d2..1a567ba3b26f 100644 --- a/modules/libpref/nsIPrefBranch.idl +++ b/modules/libpref/nsIPrefBranch.idl @@ -278,6 +278,25 @@ interface nsIPrefBranch : nsISupports */ boolean prefHasUserValue(in string aPrefName); + /** + * Called to check if a specific preference has a default value associated to + * it. + * + * @param aPrefName The preference to be tested. + * + * @note + * This method can be called on either a default or user branch but, in + * effect, always operates on the user branch. + * + * @note + * This method can be used to distinguish between a built-in preference and a + * user-added preference. + * + * @return boolean true The preference has a default value. + * false The preference only has a user value. + */ + boolean prefHasDefaultValue(in string aPrefName); + /** * Called to check if a specific preference is locked. If a preference is * locked calling its Get method will always return the default value.