Bug 1418222 - Move system metrics handling to nsMediaFeatures. r?TYLin
MozReview-Commit-ID: 25yWc29Wt4R
--- a/layout/base/nsPresContext.cpp
+++ b/layout/base/nsPresContext.cpp
@@ -38,17 +38,17 @@
#include "nsThreadUtils.h"
#include "nsFrameManager.h"
#include "nsLayoutUtils.h"
#include "nsViewManager.h"
#include "mozilla/GeckoRestyleManager.h"
#include "mozilla/RestyleManager.h"
#include "mozilla/RestyleManagerInlines.h"
#include "SurfaceCacheUtils.h"
-#include "nsCSSRuleProcessor.h"
+#include "nsMediaFeatures.h"
#include "nsRuleNode.h"
#include "gfxPlatform.h"
#include "nsCSSRules.h"
#include "nsFontFaceLoader.h"
#include "mozilla/EffectCompositor.h"
#include "mozilla/EventListenerManager.h"
#include "prenv.h"
#include "nsPluginFrame.h"
@@ -1889,17 +1889,17 @@ nsPresContext::SysColorChangedInternal()
RebuildAllStyleData(nsChangeHint(0), nsRestyleHint(0));
}
void
nsPresContext::RefreshSystemMetrics()
{
// This will force the system metrics to be generated the next time they're
// used.
- nsCSSRuleProcessor::FreeSystemMetrics();
+ nsMediaFeatures::FreeSystemMetrics();
// Changes to system metrics can change media queries on them.
//
// Changes in theme can change system colors (whose changes are
// properly reflected in computed style data), system fonts (whose
// changes are not), and -moz-appearance (whose changes likewise are
// not), so we need to recascade for the first, and reflow for the rest.
MediaFeatureValuesChanged(eRestyle_ForceDescendants, NS_STYLE_HINT_REFLOW);
--- a/layout/build/nsLayoutStatics.cpp
+++ b/layout/build/nsLayoutStatics.cpp
@@ -45,17 +45,17 @@
#include "nsTextControlFrame.h"
#include "nsXBLService.h"
#include "txMozillaXSLTProcessor.h"
#include "nsTreeSanitizer.h"
#include "nsCellMap.h"
#include "nsTextFrame.h"
#include "nsCCUncollectableMarker.h"
#include "nsTextFragment.h"
-#include "nsCSSRuleProcessor.h"
+#include "nsMediaFeatures.h"
#include "nsCORSListenerProxy.h"
#include "nsHTMLDNSPrefetch.h"
#include "nsHtml5Module.h"
#include "nsHTMLTags.h"
#include "nsIRDFContentSink.h" // for RDF atom initialization
#include "mozilla/dom/FallbackEncoding.h"
#include "nsFocusManager.h"
#include "nsListControlFrame.h"
@@ -334,17 +334,17 @@ nsLayoutStatics::Shutdown()
nsXULPopupManager::Shutdown();
#endif
StorageObserver::Shutdown();
txMozillaXSLTProcessor::Shutdown();
Attr::Shutdown();
EventListenerManager::Shutdown();
IMEStateManager::Shutdown();
nsCSSParser::Shutdown();
- nsCSSRuleProcessor::Shutdown();
+ nsMediaFeatures::Shutdown();
nsHTMLDNSPrefetch::Shutdown();
nsCSSRendering::Shutdown();
StaticPresData::Shutdown();
#ifdef DEBUG
nsFrame::DisplayReflowShutdown();
#endif
nsCellMap::Shutdown();
ActiveLayerTracker::Shutdown();
--- a/layout/style/ServoStyleSet.cpp
+++ b/layout/style/ServoStyleSet.cpp
@@ -19,21 +19,21 @@
#include "mozilla/dom/AnonymousContent.h"
#include "mozilla/dom/ChildIterator.h"
#include "mozilla/dom/FontFaceSet.h"
#include "mozilla/dom/Element.h"
#include "mozilla/dom/ElementInlines.h"
#include "nsCSSAnonBoxes.h"
#include "nsCSSFrameConstructor.h"
#include "nsCSSPseudoElements.h"
-#include "nsCSSRuleProcessor.h"
#include "nsDeviceContext.h"
#include "nsHTMLStyleSheet.h"
#include "nsIAnonymousContentCreator.h"
#include "nsIDocumentInlines.h"
+#include "nsMediaFeatures.h"
#include "nsPrintfCString.h"
#include "nsSMILAnimationController.h"
#include "nsStyleContext.h"
#include "nsStyleSet.h"
#include "gfxUserFontSet.h"
using namespace mozilla;
using namespace mozilla::dom;
@@ -409,17 +409,17 @@ ServoStyleSet::PreTraverseSync()
{
// Get the Document's root element to ensure that the cache is valid before
// calling into the (potentially-parallel) Servo traversal, where a cache hit
// is necessary to avoid a data race when updating the cache.
mozilla::Unused << mPresContext->Document()->GetRootElement();
ResolveMappedAttrDeclarationBlocks();
- nsCSSRuleProcessor::InitSystemMetrics();
+ nsMediaFeatures::InitSystemMetrics();
LookAndFeel::NativeInit();
// This is lazily computed and pseudo matching needs to access
// it so force computation early.
mPresContext->Document()->GetDocumentState();
if (gfxUserFontSet* userFontSet = mPresContext->Document()->GetUserFontSet()) {
--- a/layout/style/nsCSSRuleProcessor.cpp
+++ b/layout/style/nsCSSRuleProcessor.cpp
@@ -56,22 +56,16 @@
#include "RuleProcessorCache.h"
#include "nsIDOMMutationEvent.h"
using namespace mozilla;
using namespace mozilla::dom;
typedef ArenaAllocator<4096, 8> CascadeAllocator;
-static nsTArray< RefPtr<nsAtom> >* sSystemMetrics = 0;
-
-#ifdef XP_WIN
-uint8_t nsCSSRuleProcessor::sWinThemeId = LookAndFeel::eWindowsTheme_Generic;
-#endif
-
/**
* A struct representing a given CSS rule and a particular selector
* from that rule's selector list.
*/
struct RuleSelectorPair {
RuleSelectorPair(css::StyleRule* aRule, nsCSSSelector* aSelector)
: mRule(aRule), mSelector(aSelector) {}
// If this class ever grows a destructor, deal with
@@ -1042,199 +1036,16 @@ void
nsCSSRuleProcessor::ClearSheets()
{
for (sheet_array_type::size_type i = mSheets.Length(); i-- != 0; ) {
mSheets[i]->DropRuleProcessor(this);
}
mSheets.Clear();
}
-/* static */ void
-nsCSSRuleProcessor::InitSystemMetrics()
-{
- if (sSystemMetrics)
- return;
-
- MOZ_ASSERT(NS_IsMainThread());
-
- sSystemMetrics = new nsTArray< RefPtr<nsAtom> >;
-
- /***************************************************************************
- * ANY METRICS ADDED HERE SHOULD ALSO BE ADDED AS MEDIA QUERIES IN *
- * nsMediaFeatures.cpp *
- ***************************************************************************/
-
- int32_t metricResult =
- LookAndFeel::GetInt(LookAndFeel::eIntID_ScrollArrowStyle);
- if (metricResult & LookAndFeel::eScrollArrow_StartBackward) {
- sSystemMetrics->AppendElement(nsGkAtoms::scrollbar_start_backward);
- }
- if (metricResult & LookAndFeel::eScrollArrow_StartForward) {
- sSystemMetrics->AppendElement(nsGkAtoms::scrollbar_start_forward);
- }
- if (metricResult & LookAndFeel::eScrollArrow_EndBackward) {
- sSystemMetrics->AppendElement(nsGkAtoms::scrollbar_end_backward);
- }
- if (metricResult & LookAndFeel::eScrollArrow_EndForward) {
- sSystemMetrics->AppendElement(nsGkAtoms::scrollbar_end_forward);
- }
-
- metricResult =
- LookAndFeel::GetInt(LookAndFeel::eIntID_ScrollSliderStyle);
- if (metricResult != LookAndFeel::eScrollThumbStyle_Normal) {
- sSystemMetrics->AppendElement(nsGkAtoms::scrollbar_thumb_proportional);
- }
-
- metricResult =
- LookAndFeel::GetInt(LookAndFeel::eIntID_UseOverlayScrollbars);
- if (metricResult) {
- sSystemMetrics->AppendElement(nsGkAtoms::overlay_scrollbars);
- }
-
- metricResult =
- LookAndFeel::GetInt(LookAndFeel::eIntID_MenuBarDrag);
- if (metricResult) {
- sSystemMetrics->AppendElement(nsGkAtoms::menubar_drag);
- }
-
- nsresult rv =
- LookAndFeel::GetInt(LookAndFeel::eIntID_WindowsDefaultTheme, &metricResult);
- if (NS_SUCCEEDED(rv) && metricResult) {
- sSystemMetrics->AppendElement(nsGkAtoms::windows_default_theme);
- }
-
- rv = LookAndFeel::GetInt(LookAndFeel::eIntID_MacGraphiteTheme, &metricResult);
- if (NS_SUCCEEDED(rv) && metricResult) {
- sSystemMetrics->AppendElement(nsGkAtoms::mac_graphite_theme);
- }
-
- rv = LookAndFeel::GetInt(LookAndFeel::eIntID_MacYosemiteTheme, &metricResult);
- if (NS_SUCCEEDED(rv) && metricResult) {
- sSystemMetrics->AppendElement(nsGkAtoms::mac_yosemite_theme);
- }
-
- rv = LookAndFeel::GetInt(LookAndFeel::eIntID_WindowsAccentColorInTitlebar, &metricResult);
- if (NS_SUCCEEDED(rv) && metricResult) {
- sSystemMetrics->AppendElement(nsGkAtoms::windows_accent_color_in_titlebar);
- }
-
- rv = LookAndFeel::GetInt(LookAndFeel::eIntID_DWMCompositor, &metricResult);
- if (NS_SUCCEEDED(rv) && metricResult) {
- sSystemMetrics->AppendElement(nsGkAtoms::windows_compositor);
- }
-
- rv = LookAndFeel::GetInt(LookAndFeel::eIntID_WindowsGlass, &metricResult);
- if (NS_SUCCEEDED(rv) && metricResult) {
- sSystemMetrics->AppendElement(nsGkAtoms::windows_glass);
- }
-
- rv = LookAndFeel::GetInt(LookAndFeel::eIntID_WindowsClassic, &metricResult);
- if (NS_SUCCEEDED(rv) && metricResult) {
- sSystemMetrics->AppendElement(nsGkAtoms::windows_classic);
- }
-
- rv = LookAndFeel::GetInt(LookAndFeel::eIntID_TouchEnabled, &metricResult);
- if (NS_SUCCEEDED(rv) && metricResult) {
- sSystemMetrics->AppendElement(nsGkAtoms::touch_enabled);
- }
-
- rv = LookAndFeel::GetInt(LookAndFeel::eIntID_SwipeAnimationEnabled,
- &metricResult);
- if (NS_SUCCEEDED(rv) && metricResult) {
- sSystemMetrics->AppendElement(nsGkAtoms::swipe_animation_enabled);
- }
-
- rv = LookAndFeel::GetInt(LookAndFeel::eIntID_GTKCSDAvailable,
- &metricResult);
- if (NS_SUCCEEDED(rv) && metricResult) {
- sSystemMetrics->AppendElement(nsGkAtoms::gtk_csd_available);
- }
-
- rv = LookAndFeel::GetInt(LookAndFeel::eIntID_GTKCSDMinimizeButton,
- &metricResult);
- if (NS_SUCCEEDED(rv) && metricResult) {
- sSystemMetrics->AppendElement(nsGkAtoms::gtk_csd_minimize_button);
- }
-
- rv = LookAndFeel::GetInt(LookAndFeel::eIntID_GTKCSDMaximizeButton,
- &metricResult);
- if (NS_SUCCEEDED(rv) && metricResult) {
- sSystemMetrics->AppendElement(nsGkAtoms::gtk_csd_maximize_button);
- }
-
- rv = LookAndFeel::GetInt(LookAndFeel::eIntID_GTKCSDCloseButton,
- &metricResult);
- if (NS_SUCCEEDED(rv) && metricResult) {
- sSystemMetrics->AppendElement(nsGkAtoms::gtk_csd_close_button);
- }
-
-#ifdef XP_WIN
- if (NS_SUCCEEDED(
- LookAndFeel::GetInt(LookAndFeel::eIntID_WindowsThemeIdentifier,
- &metricResult))) {
- nsCSSRuleProcessor::SetWindowsThemeIdentifier(static_cast<uint8_t>(metricResult));
- switch(metricResult) {
- case LookAndFeel::eWindowsTheme_Aero:
- sSystemMetrics->AppendElement(nsGkAtoms::windows_theme_aero);
- break;
- case LookAndFeel::eWindowsTheme_AeroLite:
- sSystemMetrics->AppendElement(nsGkAtoms::windows_theme_aero_lite);
- break;
- case LookAndFeel::eWindowsTheme_LunaBlue:
- sSystemMetrics->AppendElement(nsGkAtoms::windows_theme_luna_blue);
- break;
- case LookAndFeel::eWindowsTheme_LunaOlive:
- sSystemMetrics->AppendElement(nsGkAtoms::windows_theme_luna_olive);
- break;
- case LookAndFeel::eWindowsTheme_LunaSilver:
- sSystemMetrics->AppendElement(nsGkAtoms::windows_theme_luna_silver);
- break;
- case LookAndFeel::eWindowsTheme_Royale:
- sSystemMetrics->AppendElement(nsGkAtoms::windows_theme_royale);
- break;
- case LookAndFeel::eWindowsTheme_Zune:
- sSystemMetrics->AppendElement(nsGkAtoms::windows_theme_zune);
- break;
- case LookAndFeel::eWindowsTheme_Generic:
- sSystemMetrics->AppendElement(nsGkAtoms::windows_theme_generic);
- break;
- }
- }
-#endif
-}
-
-/* static */ void
-nsCSSRuleProcessor::FreeSystemMetrics()
-{
- delete sSystemMetrics;
- sSystemMetrics = nullptr;
-}
-
-/* static */ void
-nsCSSRuleProcessor::Shutdown()
-{
- FreeSystemMetrics();
-}
-
-/* static */ bool
-nsCSSRuleProcessor::HasSystemMetric(nsAtom* aMetric)
-{
- nsCSSRuleProcessor::InitSystemMetrics();
- return sSystemMetrics->IndexOf(aMetric) != sSystemMetrics->NoIndex;
-}
-
-#ifdef XP_WIN
-/* static */ uint8_t
-nsCSSRuleProcessor::GetWindowsThemeIdentifier()
-{
- nsCSSRuleProcessor::InitSystemMetrics();
- return sWinThemeId;
-}
-#endif
-
/* static */
EventStates
nsCSSRuleProcessor::GetContentState(const Element* aElement,
bool aUsingPrivateBrowsing)
{
EventStates state = aElement->StyleState();
// If we are not supposed to mark visited links as such, be sure to
--- a/layout/style/nsCSSRuleProcessor.h
+++ b/layout/style/nsCSSRuleProcessor.h
@@ -76,21 +76,16 @@ public:
bool aIsShared = false);
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_CLASS(nsCSSRuleProcessor)
public:
nsresult ClearRuleCascades();
- static void InitSystemMetrics();
- static void Shutdown();
- static void FreeSystemMetrics();
- static bool HasSystemMetric(nsAtom* aMetric);
-
/*
* Returns true if the given aElement matches one of the
* selectors in aSelectorList. Note that this method will assume
* the given aElement is not a relevant link. aSelectorList must not
* include any pseudo-element selectors. aSelectorList is allowed
* to be null; in this case false will be returned.
*/
static bool SelectorListMatches(mozilla::dom::Element* aElement,
@@ -240,24 +235,16 @@ public:
void ReleaseStyleSetRef();
void SetInRuleProcessorCache(bool aVal) {
MOZ_ASSERT(mIsShared);
mInRuleProcessorCache = aVal;
}
bool IsInRuleProcessorCache() const { return mInRuleProcessorCache; }
bool IsUsedByMultipleStyleSets() const { return mStyleSetRefCnt > 1; }
-#ifdef XP_WIN
- // Cached theme identifier for the moz-windows-theme media query.
- static uint8_t GetWindowsThemeIdentifier();
- static void SetWindowsThemeIdentifier(uint8_t aId) {
- sWinThemeId = aId;
- }
-#endif
-
struct StateSelector {
StateSelector(mozilla::EventStates aStates, nsCSSSelector* aSelector)
: mStates(aStates),
mSelector(aSelector)
{}
mozilla::EventStates mStates;
nsCSSSelector* mSelector;
@@ -315,15 +302,11 @@ private:
// RefreshRuleCascade for why.
bool mMustGatherDocumentRules;
bool mInRuleProcessorCache;
#ifdef DEBUG
bool mDocumentRulesAndCacheKeyValid;
#endif
-
-#ifdef XP_WIN
- static uint8_t sWinThemeId;
-#endif
};
#endif /* nsCSSRuleProcessor_h_ */
--- a/layout/style/nsMediaFeatures.cpp
+++ b/layout/style/nsMediaFeatures.cpp
@@ -22,16 +22,23 @@
#include "nsIDocument.h"
#include "nsIWidget.h"
#include "nsContentUtils.h"
#include "mozilla/StyleSheet.h"
#include "mozilla/StyleSheetInlines.h"
using namespace mozilla;
+static nsTArray<RefPtr<nsAtom>>* sSystemMetrics = nullptr;
+
+#ifdef XP_WIN
+// Cached theme identifier for the moz-windows-theme media query.
+static uint8_t sWinThemeId = LookAndFeel::eWindowsTheme_Generic;
+#endif
+
static const nsCSSProps::KTableEntry kOrientationKeywords[] = {
{ eCSSKeyword_portrait, NS_STYLE_ORIENTATION_PORTRAIT },
{ eCSSKeyword_landscape, NS_STYLE_ORIENTATION_LANDSCAPE },
{ eCSSKeyword_UNKNOWN, -1 }
};
static const nsCSSProps::KTableEntry kScanKeywords[] = {
{ eCSSKeyword_progressive, NS_STYLE_SCAN_PROGRESSIVE },
@@ -380,16 +387,32 @@ GetDevicePixelRatio(nsPresContext* aPres
static void
GetTransform3d(nsPresContext* aPresContext, const nsMediaFeature*,
nsCSSValue& aResult)
{
// Gecko supports 3d transforms, so this feature is always 1.
aResult.SetIntValue(1, eCSSUnit_Integer);
}
+static bool
+HasSystemMetric(nsAtom* aMetric)
+{
+ nsMediaFeatures::InitSystemMetrics();
+ return sSystemMetrics->IndexOf(aMetric) != sSystemMetrics->NoIndex;
+}
+
+#ifdef XP_WIN
+static uint8_t
+GetWindowsThemeIdentifier()
+{
+ nsMediaFeatures::InitSystemMetrics();
+ return sWinThemeId;
+}
+#endif
+
static void
GetSystemMetric(nsPresContext* aPresContext, const nsMediaFeature* aFeature,
nsCSSValue& aResult)
{
aResult.Reset();
const bool isAccessibleFromContentPages =
!(aFeature->mReqFlags & nsMediaFeature::eUserAgentAndChromeOnly);
@@ -404,34 +427,33 @@ GetSystemMetric(nsPresContext* aPresCont
// returned.)
return;
}
MOZ_ASSERT(aFeature->mValueType == nsMediaFeature::eBoolInteger,
"unexpected type");
nsAtom* metricAtom = *aFeature->mData.mMetric;
- bool hasMetric = nsCSSRuleProcessor::HasSystemMetric(metricAtom);
+ bool hasMetric = HasSystemMetric(metricAtom);
aResult.SetIntValue(hasMetric ? 1 : 0, eCSSUnit_Integer);
}
static void
GetWindowsTheme(nsPresContext* aPresContext, const nsMediaFeature* aFeature,
nsCSSValue& aResult)
{
aResult.Reset();
MOZ_ASSERT(aFeature->mReqFlags & nsMediaFeature::eUserAgentAndChromeOnly);
if (ShouldResistFingerprinting(aPresContext)) {
return;
}
#ifdef XP_WIN
- uint8_t windowsThemeId =
- nsCSSRuleProcessor::GetWindowsThemeIdentifier();
+ uint8_t windowsThemeId = GetWindowsThemeIdentifier();
// Classic mode should fail to match.
if (windowsThemeId == LookAndFeel::eWindowsTheme_Classic)
return;
// Look up the appropriate theme string
for (size_t i = 0; i < ArrayLength(themeStrings); ++i) {
if (windowsThemeId == themeStrings[i].id) {
@@ -473,16 +495,182 @@ GetOperatingSystemVersion(nsPresContext*
static void
GetIsGlyph(nsPresContext* aPresContext, const nsMediaFeature* aFeature,
nsCSSValue& aResult)
{
MOZ_ASSERT(aFeature->mReqFlags & nsMediaFeature::eUserAgentAndChromeOnly);
aResult.SetIntValue(aPresContext->IsGlyph() ? 1 : 0, eCSSUnit_Integer);
}
+/* static */ void
+nsMediaFeatures::InitSystemMetrics()
+{
+ if (sSystemMetrics)
+ return;
+
+ MOZ_ASSERT(NS_IsMainThread());
+
+ sSystemMetrics = new nsTArray<RefPtr<nsAtom>>;
+
+ /***************************************************************************
+ * ANY METRICS ADDED HERE SHOULD ALSO BE ADDED AS MEDIA QUERIES BELOW *
+ ***************************************************************************/
+
+ int32_t metricResult =
+ LookAndFeel::GetInt(LookAndFeel::eIntID_ScrollArrowStyle);
+ if (metricResult & LookAndFeel::eScrollArrow_StartBackward) {
+ sSystemMetrics->AppendElement(nsGkAtoms::scrollbar_start_backward);
+ }
+ if (metricResult & LookAndFeel::eScrollArrow_StartForward) {
+ sSystemMetrics->AppendElement(nsGkAtoms::scrollbar_start_forward);
+ }
+ if (metricResult & LookAndFeel::eScrollArrow_EndBackward) {
+ sSystemMetrics->AppendElement(nsGkAtoms::scrollbar_end_backward);
+ }
+ if (metricResult & LookAndFeel::eScrollArrow_EndForward) {
+ sSystemMetrics->AppendElement(nsGkAtoms::scrollbar_end_forward);
+ }
+
+ metricResult =
+ LookAndFeel::GetInt(LookAndFeel::eIntID_ScrollSliderStyle);
+ if (metricResult != LookAndFeel::eScrollThumbStyle_Normal) {
+ sSystemMetrics->AppendElement(nsGkAtoms::scrollbar_thumb_proportional);
+ }
+
+ metricResult =
+ LookAndFeel::GetInt(LookAndFeel::eIntID_UseOverlayScrollbars);
+ if (metricResult) {
+ sSystemMetrics->AppendElement(nsGkAtoms::overlay_scrollbars);
+ }
+
+ metricResult =
+ LookAndFeel::GetInt(LookAndFeel::eIntID_MenuBarDrag);
+ if (metricResult) {
+ sSystemMetrics->AppendElement(nsGkAtoms::menubar_drag);
+ }
+
+ nsresult rv =
+ LookAndFeel::GetInt(LookAndFeel::eIntID_WindowsDefaultTheme, &metricResult);
+ if (NS_SUCCEEDED(rv) && metricResult) {
+ sSystemMetrics->AppendElement(nsGkAtoms::windows_default_theme);
+ }
+
+ rv = LookAndFeel::GetInt(LookAndFeel::eIntID_MacGraphiteTheme, &metricResult);
+ if (NS_SUCCEEDED(rv) && metricResult) {
+ sSystemMetrics->AppendElement(nsGkAtoms::mac_graphite_theme);
+ }
+
+ rv = LookAndFeel::GetInt(LookAndFeel::eIntID_MacYosemiteTheme, &metricResult);
+ if (NS_SUCCEEDED(rv) && metricResult) {
+ sSystemMetrics->AppendElement(nsGkAtoms::mac_yosemite_theme);
+ }
+
+ rv = LookAndFeel::GetInt(LookAndFeel::eIntID_WindowsAccentColorInTitlebar, &metricResult);
+ if (NS_SUCCEEDED(rv) && metricResult) {
+ sSystemMetrics->AppendElement(nsGkAtoms::windows_accent_color_in_titlebar);
+ }
+
+ rv = LookAndFeel::GetInt(LookAndFeel::eIntID_DWMCompositor, &metricResult);
+ if (NS_SUCCEEDED(rv) && metricResult) {
+ sSystemMetrics->AppendElement(nsGkAtoms::windows_compositor);
+ }
+
+ rv = LookAndFeel::GetInt(LookAndFeel::eIntID_WindowsGlass, &metricResult);
+ if (NS_SUCCEEDED(rv) && metricResult) {
+ sSystemMetrics->AppendElement(nsGkAtoms::windows_glass);
+ }
+
+ rv = LookAndFeel::GetInt(LookAndFeel::eIntID_WindowsClassic, &metricResult);
+ if (NS_SUCCEEDED(rv) && metricResult) {
+ sSystemMetrics->AppendElement(nsGkAtoms::windows_classic);
+ }
+
+ rv = LookAndFeel::GetInt(LookAndFeel::eIntID_TouchEnabled, &metricResult);
+ if (NS_SUCCEEDED(rv) && metricResult) {
+ sSystemMetrics->AppendElement(nsGkAtoms::touch_enabled);
+ }
+
+ rv = LookAndFeel::GetInt(LookAndFeel::eIntID_SwipeAnimationEnabled,
+ &metricResult);
+ if (NS_SUCCEEDED(rv) && metricResult) {
+ sSystemMetrics->AppendElement(nsGkAtoms::swipe_animation_enabled);
+ }
+
+ rv = LookAndFeel::GetInt(LookAndFeel::eIntID_GTKCSDAvailable,
+ &metricResult);
+ if (NS_SUCCEEDED(rv) && metricResult) {
+ sSystemMetrics->AppendElement(nsGkAtoms::gtk_csd_available);
+ }
+
+ rv = LookAndFeel::GetInt(LookAndFeel::eIntID_GTKCSDMinimizeButton,
+ &metricResult);
+ if (NS_SUCCEEDED(rv) && metricResult) {
+ sSystemMetrics->AppendElement(nsGkAtoms::gtk_csd_minimize_button);
+ }
+
+ rv = LookAndFeel::GetInt(LookAndFeel::eIntID_GTKCSDMaximizeButton,
+ &metricResult);
+ if (NS_SUCCEEDED(rv) && metricResult) {
+ sSystemMetrics->AppendElement(nsGkAtoms::gtk_csd_maximize_button);
+ }
+
+ rv = LookAndFeel::GetInt(LookAndFeel::eIntID_GTKCSDCloseButton,
+ &metricResult);
+ if (NS_SUCCEEDED(rv) && metricResult) {
+ sSystemMetrics->AppendElement(nsGkAtoms::gtk_csd_close_button);
+ }
+
+#ifdef XP_WIN
+ if (NS_SUCCEEDED(
+ LookAndFeel::GetInt(LookAndFeel::eIntID_WindowsThemeIdentifier,
+ &metricResult))) {
+ sWinThemeId = metricResult;
+ switch (metricResult) {
+ case LookAndFeel::eWindowsTheme_Aero:
+ sSystemMetrics->AppendElement(nsGkAtoms::windows_theme_aero);
+ break;
+ case LookAndFeel::eWindowsTheme_AeroLite:
+ sSystemMetrics->AppendElement(nsGkAtoms::windows_theme_aero_lite);
+ break;
+ case LookAndFeel::eWindowsTheme_LunaBlue:
+ sSystemMetrics->AppendElement(nsGkAtoms::windows_theme_luna_blue);
+ break;
+ case LookAndFeel::eWindowsTheme_LunaOlive:
+ sSystemMetrics->AppendElement(nsGkAtoms::windows_theme_luna_olive);
+ break;
+ case LookAndFeel::eWindowsTheme_LunaSilver:
+ sSystemMetrics->AppendElement(nsGkAtoms::windows_theme_luna_silver);
+ break;
+ case LookAndFeel::eWindowsTheme_Royale:
+ sSystemMetrics->AppendElement(nsGkAtoms::windows_theme_royale);
+ break;
+ case LookAndFeel::eWindowsTheme_Zune:
+ sSystemMetrics->AppendElement(nsGkAtoms::windows_theme_zune);
+ break;
+ case LookAndFeel::eWindowsTheme_Generic:
+ sSystemMetrics->AppendElement(nsGkAtoms::windows_theme_generic);
+ break;
+ }
+ }
+#endif
+}
+
+/* static */ void
+nsMediaFeatures::FreeSystemMetrics()
+{
+ delete sSystemMetrics;
+ sSystemMetrics = nullptr;
+}
+
+/* static */ void
+nsMediaFeatures::Shutdown()
+{
+ FreeSystemMetrics();
+}
+
/*
* Adding new media features requires (1) adding the new feature to this
* array, with appropriate entries (and potentially any new code needed
* to support new types in these entries and (2) ensuring that either
* nsPresContext::MediaFeatureValuesChanged or
* nsPresContext::PostMediaFeatureValuesChangedEvent is called when the
* value that would be returned by the entry's mGetter changes.
*/
--- a/layout/style/nsMediaFeatures.h
+++ b/layout/style/nsMediaFeatures.h
@@ -80,13 +80,17 @@ struct nsMediaFeature
// given presentation. If it returns eCSSUnit_Null, the feature is
// not present.
nsMediaFeatureValueGetter mGetter;
};
class nsMediaFeatures
{
public:
+ static void InitSystemMetrics();
+ static void FreeSystemMetrics();
+ static void Shutdown();
+
// Terminated with an entry whose mName is null.
static const nsMediaFeature features[];
};
#endif /* !defined(nsMediaFeatures_h_) */