diff --git a/layout/style/nsLayoutStylesheetCache.cpp b/layout/style/nsLayoutStylesheetCache.cpp index a749018ac6bb..712a1c4cc564 100644 --- a/layout/style/nsLayoutStylesheetCache.cpp +++ b/layout/style/nsLayoutStylesheetCache.cpp @@ -292,6 +292,13 @@ nsLayoutStylesheetCache::EnsureGlobal() Preferences::AddBoolVarCache(&sNumberControlEnabled, NUMBER_CONTROL_PREF, true); + + // For each pref that controls a CSS feature that a UA style sheet depends + // on (such as a pref that enables a property that a UA style sheet uses), + // register DependentPrefChanged as a callback to ensure that the relevant + // style sheets will be re-parsed. + // Preferences::RegisterCallback(&DependentPrefChanged, + // "layout.css.example-pref.enabled"); } void @@ -390,6 +397,29 @@ nsLayoutStylesheetCache::LoadSheet(nsIURI* aURI, } } +/* static */ void +nsLayoutStylesheetCache::InvalidateSheet(nsRefPtr& aSheet) +{ + MOZ_ASSERT(gCSSLoader, "pref changed before we loaded a sheet?"); + + if (aSheet) { + gCSSLoader->ObsoleteSheet(aSheet->GetSheetURI()); + aSheet = nullptr; + } +} + +/* static */ void +nsLayoutStylesheetCache::DependentPrefChanged(const char* aPref, void* aData) +{ + MOZ_ASSERT(gStyleCache, "pref changed after shutdown?"); + + // Cause any UA style sheets whose parsing depends on the value of prefs + // to be re-parsed by dropping the sheet from gCSSLoader's cache then + // setting our cached sheet pointer to null. This will only work for sheets + // that are loaded lazily. + // InvalidateSheet(gStyleCache->mSomeLazilyLoadedSheet); +} + mozilla::StaticRefPtr nsLayoutStylesheetCache::gStyleCache; diff --git a/layout/style/nsLayoutStylesheetCache.h b/layout/style/nsLayoutStylesheetCache.h index 29ee1515cd76..cfc50e99ed08 100644 --- a/layout/style/nsLayoutStylesheetCache.h +++ b/layout/style/nsLayoutStylesheetCache.h @@ -67,6 +67,8 @@ private: nsRefPtr& aSheet); static void LoadSheet(nsIURI* aURI, nsRefPtr& aSheet, bool aEnableUnsafeRules); + static void InvalidateSheet(nsRefPtr& aSheet); + static void DependentPrefChanged(const char* aPref, void* aData); static mozilla::StaticRefPtr gStyleCache; static mozilla::css::Loader* gCSSLoader;