123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913 |
- /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
- /* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
- /* the features that media queries can test */
- #include "nsMediaFeatures.h"
- #include "nsGkAtoms.h"
- #include "nsCSSKeywords.h"
- #include "nsStyleConsts.h"
- #include "nsPresContext.h"
- #include "nsCSSValue.h"
- #ifdef XP_WIN
- #include "mozilla/LookAndFeel.h"
- #endif
- #include "nsCSSRuleProcessor.h"
- #include "nsDeviceContext.h"
- #include "nsIBaseWindow.h"
- #include "nsIDocument.h"
- #include "nsIWidget.h"
- #include "nsContentUtils.h"
- #include "mozilla/Preferences.h"
- #include "mozilla/StyleSheet.h"
- #include "mozilla/StyleSheetInlines.h"
- using namespace mozilla;
- 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 },
- { eCSSKeyword_interlace, NS_STYLE_SCAN_INTERLACE },
- { eCSSKeyword_UNKNOWN, -1 }
- };
- static const nsCSSProps::KTableEntry kDisplayModeKeywords[] = {
- { eCSSKeyword_browser, NS_STYLE_DISPLAY_MODE_BROWSER },
- { eCSSKeyword_minimal_ui, NS_STYLE_DISPLAY_MODE_MINIMAL_UI },
- { eCSSKeyword_standalone, NS_STYLE_DISPLAY_MODE_STANDALONE },
- { eCSSKeyword_fullscreen, NS_STYLE_DISPLAY_MODE_FULLSCREEN },
- { eCSSKeyword_UNKNOWN, -1 }
- };
- static const nsCSSProps::KTableEntry kPrefersColorSchemeKeywords[] = {
- { eCSSKeyword_light, NS_STYLE_PREFERS_COLOR_SCHEME_LIGHT },
- { eCSSKeyword_dark, NS_STYLE_PREFERS_COLOR_SCHEME_DARK },
- { eCSSKeyword_UNKNOWN, -1 },
- };
- #ifdef XP_WIN
- struct WindowsThemeName {
- LookAndFeel::WindowsTheme id;
- const wchar_t* name;
- };
- // Windows theme identities used in the -moz-windows-theme media query.
- const WindowsThemeName themeStrings[] = {
- { LookAndFeel::eWindowsTheme_Aero, L"aero" },
- { LookAndFeel::eWindowsTheme_AeroLite, L"aero-lite" },
- { LookAndFeel::eWindowsTheme_Generic, L"generic" }
- };
- struct OperatingSystemVersionInfo {
- LookAndFeel::OperatingSystemVersion id;
- const wchar_t* name;
- };
- // Os version identities used in the -moz-os-version media query.
- const OperatingSystemVersionInfo osVersionStrings[] = {
- { LookAndFeel::eOperatingSystemVersion_Windows7, L"windows-win7" },
- { LookAndFeel::eOperatingSystemVersion_Windows8, L"windows-win8" },
- { LookAndFeel::eOperatingSystemVersion_Windows10, L"windows-win10" }
- };
- #endif
- // A helper for four features below
- static nsSize
- GetSize(nsPresContext* aPresContext)
- {
- nsSize size;
- if (aPresContext->IsRootPaginatedDocument())
- // We want the page size, including unprintable areas and margins.
- size = aPresContext->GetPageSize();
- else
- size = aPresContext->GetVisibleArea().Size();
- return size;
- }
- static nsresult
- GetWidth(nsPresContext* aPresContext, const nsMediaFeature*,
- nsCSSValue& aResult)
- {
- nsSize size = GetSize(aPresContext);
- float pixelWidth = aPresContext->AppUnitsToFloatCSSPixels(size.width);
- aResult.SetFloatValue(pixelWidth, eCSSUnit_Pixel);
- return NS_OK;
- }
- static nsresult
- GetHeight(nsPresContext* aPresContext, const nsMediaFeature*,
- nsCSSValue& aResult)
- {
- nsSize size = GetSize(aPresContext);
- float pixelHeight = aPresContext->AppUnitsToFloatCSSPixels(size.height);
- aResult.SetFloatValue(pixelHeight, eCSSUnit_Pixel);
- return NS_OK;
- }
- inline static nsDeviceContext*
- GetDeviceContextFor(nsPresContext* aPresContext)
- {
- // It would be nice to call
- // nsLayoutUtils::GetDeviceContextForScreenInfo here, except for two
- // things: (1) it can flush, and flushing is bad here, and (2) it
- // doesn't really get us consistency in multi-monitor situations
- // *anyway*.
- return aPresContext->DeviceContext();
- }
- static bool
- ShouldResistFingerprinting(nsPresContext* aPresContext)
- {
- return nsContentUtils::ShouldResistFingerprinting(aPresContext->GetDocShell());
- }
- // A helper for three features below.
- static nsSize
- GetDeviceSize(nsPresContext* aPresContext)
- {
- nsSize size;
- if (ShouldResistFingerprinting(aPresContext) || aPresContext->IsDeviceSizePageSize()) {
- size = GetSize(aPresContext);
- } else if (aPresContext->IsRootPaginatedDocument()) {
- // We want the page size, including unprintable areas and margins.
- // XXX The spec actually says we want the "page sheet size", but
- // how is that different?
- size = aPresContext->GetPageSize();
- } else {
- GetDeviceContextFor(aPresContext)->
- GetDeviceSurfaceDimensions(size.width, size.height);
- }
- return size;
- }
- static nsresult
- GetDeviceWidth(nsPresContext* aPresContext, const nsMediaFeature*,
- nsCSSValue& aResult)
- {
- nsSize size = GetDeviceSize(aPresContext);
- float pixelWidth = aPresContext->AppUnitsToFloatCSSPixels(size.width);
- aResult.SetFloatValue(pixelWidth, eCSSUnit_Pixel);
- return NS_OK;
- }
- static nsresult
- GetDeviceHeight(nsPresContext* aPresContext, const nsMediaFeature*,
- nsCSSValue& aResult)
- {
- nsSize size = GetDeviceSize(aPresContext);
- float pixelHeight = aPresContext->AppUnitsToFloatCSSPixels(size.height);
- aResult.SetFloatValue(pixelHeight, eCSSUnit_Pixel);
- return NS_OK;
- }
- static nsresult
- GetOrientation(nsPresContext* aPresContext, const nsMediaFeature*,
- nsCSSValue& aResult)
- {
- nsSize size = GetSize(aPresContext);
- int32_t orientation;
- if (size.width > size.height) {
- orientation = NS_STYLE_ORIENTATION_LANDSCAPE;
- } else {
- // Per spec, square viewports should be 'portrait'
- orientation = NS_STYLE_ORIENTATION_PORTRAIT;
- }
- aResult.SetIntValue(orientation, eCSSUnit_Enumerated);
- return NS_OK;
- }
- static nsresult
- GetDeviceOrientation(nsPresContext* aPresContext, const nsMediaFeature*,
- nsCSSValue& aResult)
- {
- nsSize size = GetDeviceSize(aPresContext);
- int32_t orientation;
- if (size.width > size.height) {
- orientation = NS_STYLE_ORIENTATION_LANDSCAPE;
- } else {
- // Per spec, square viewports should be 'portrait'
- orientation = NS_STYLE_ORIENTATION_PORTRAIT;
- }
- aResult.SetIntValue(orientation, eCSSUnit_Enumerated);
- return NS_OK;
- }
- static nsresult
- GetIsResourceDocument(nsPresContext* aPresContext, const nsMediaFeature*,
- nsCSSValue& aResult)
- {
- nsIDocument* doc = aPresContext->Document();
- aResult.SetIntValue(doc && doc->IsResourceDoc() ? 1 : 0, eCSSUnit_Integer);
- return NS_OK;
- }
- // Helper for two features below
- static nsresult
- MakeArray(const nsSize& aSize, nsCSSValue& aResult)
- {
- RefPtr<nsCSSValue::Array> a = nsCSSValue::Array::Create(2);
- a->Item(0).SetIntValue(aSize.width, eCSSUnit_Integer);
- a->Item(1).SetIntValue(aSize.height, eCSSUnit_Integer);
- aResult.SetArrayValue(a, eCSSUnit_Array);
- return NS_OK;
- }
- static nsresult
- GetAspectRatio(nsPresContext* aPresContext, const nsMediaFeature*,
- nsCSSValue& aResult)
- {
- return MakeArray(GetSize(aPresContext), aResult);
- }
- static nsresult
- GetDeviceAspectRatio(nsPresContext* aPresContext, const nsMediaFeature*,
- nsCSSValue& aResult)
- {
- return MakeArray(GetDeviceSize(aPresContext), aResult);
- }
- static nsresult
- GetColor(nsPresContext* aPresContext, const nsMediaFeature*,
- nsCSSValue& aResult)
- {
- uint32_t depth = 24; // Use depth of 24 when resisting fingerprinting.
- if (!ShouldResistFingerprinting(aPresContext)) {
- // FIXME: This implementation is bogus. nsDeviceContext
- // doesn't provide reliable information (should be fixed in bug
- // 424386).
- // FIXME: On a monochrome device, return 0!
- nsDeviceContext *dx = GetDeviceContextFor(aPresContext);
- dx->GetDepth(depth);
- }
- // The spec says to use bits *per color component*, so divide by 3,
- // and round down, since the spec says to use the smallest when the
- // color components differ.
- depth /= 3;
- aResult.SetIntValue(int32_t(depth), eCSSUnit_Integer);
- return NS_OK;
- }
- static nsresult
- GetColorIndex(nsPresContext* aPresContext, const nsMediaFeature*,
- nsCSSValue& aResult)
- {
- // We should return zero if the device does not use a color lookup
- // table. Stuart says that our handling of displays with 8-bit
- // color is bad enough that we never change the lookup table to
- // match what we're trying to display, so perhaps we should always
- // return zero. Given that there isn't any better information
- // exposed, we don't have much other choice.
- aResult.SetIntValue(0, eCSSUnit_Integer);
- return NS_OK;
- }
- static nsresult
- GetMonochrome(nsPresContext* aPresContext, const nsMediaFeature*,
- nsCSSValue& aResult)
- {
- // For color devices we should return 0.
- // FIXME: On a monochrome device, return the actual color depth, not
- // 0!
- aResult.SetIntValue(0, eCSSUnit_Integer);
- return NS_OK;
- }
- static nsresult
- GetResolution(nsPresContext* aPresContext, const nsMediaFeature*,
- nsCSSValue& aResult)
- {
- float dpi = 96; // Use 96 when resisting fingerprinting.
- if (!ShouldResistFingerprinting(aPresContext)) {
- // Resolution measures device pixels per CSS (inch/cm/pixel). We
- // return it in device pixels per CSS inches.
- dpi = float(nsPresContext::AppUnitsPerCSSInch()) /
- float(aPresContext->AppUnitsPerDevPixel());
- }
- aResult.SetFloatValue(dpi, eCSSUnit_Inch);
- return NS_OK;
- }
- static nsresult
- GetScan(nsPresContext* aPresContext, const nsMediaFeature*,
- nsCSSValue& aResult)
- {
- // Since Gecko doesn't support the 'tv' media type, the 'scan'
- // feature is never present.
- aResult.Reset();
- return NS_OK;
- }
- static nsresult
- GetDisplayMode(nsPresContext* aPresContext, const nsMediaFeature*,
- nsCSSValue& aResult)
- {
- nsCOMPtr<nsISupports> container;
- if (aPresContext) {
- // Calling GetRootPresContext() can be slow, so make sure to call it
- // just once.
- nsRootPresContext* root = aPresContext->GetRootPresContext();
- if (root && root->Document()) {
- container = root->Document()->GetContainer();
- }
- }
- nsCOMPtr<nsIBaseWindow> baseWindow = do_QueryInterface(container);
- if (!baseWindow) {
- aResult.SetIntValue(NS_STYLE_DISPLAY_MODE_BROWSER, eCSSUnit_Enumerated);
- return NS_OK;
- }
- nsCOMPtr<nsIWidget> mainWidget;
- baseWindow->GetMainWidget(getter_AddRefs(mainWidget));
- int32_t displayMode;
- nsSizeMode mode = mainWidget ? mainWidget->SizeMode() : nsSizeMode_Normal;
- // Background tabs are always in 'browser' mode for now.
- // If new modes are supported, please ensure not cause the regression in
- // Bug 1259641.
- switch (mode) {
- case nsSizeMode_Fullscreen:
- displayMode = NS_STYLE_DISPLAY_MODE_FULLSCREEN;
- break;
- default:
- displayMode = NS_STYLE_DISPLAY_MODE_BROWSER;
- break;
- }
- aResult.SetIntValue(displayMode, eCSSUnit_Enumerated);
- return NS_OK;
- }
- static nsresult
- GetGrid(nsPresContext* aPresContext, const nsMediaFeature*,
- nsCSSValue& aResult)
- {
- // Gecko doesn't support grid devices (e.g., ttys), so the 'grid'
- // feature is always 0.
- aResult.SetIntValue(0, eCSSUnit_Integer);
- return NS_OK;
- }
- static nsresult
- GetDevicePixelRatio(nsPresContext* aPresContext, const nsMediaFeature*,
- nsCSSValue& aResult)
- {
- if (!ShouldResistFingerprinting(aPresContext)) {
- float ratio = aPresContext->CSSPixelsToDevPixels(1.0f);
- aResult.SetFloatValue(ratio, eCSSUnit_Number);
- } else {
- aResult.SetFloatValue(1.0, eCSSUnit_Number);
- }
- return NS_OK;
- }
- static nsresult
- GetTransform3d(nsPresContext* aPresContext, const nsMediaFeature*,
- nsCSSValue& aResult)
- {
- // Gecko supports 3d transforms, so this feature is always 1.
- aResult.SetIntValue(1, eCSSUnit_Integer);
- return NS_OK;
- }
- static nsresult
- GetSystemMetric(nsPresContext* aPresContext, const nsMediaFeature* aFeature,
- nsCSSValue& aResult)
- {
- aResult.Reset();
- if (ShouldResistFingerprinting(aPresContext)) {
- // If "privacy.resistFingerprinting" is enabled, then we simply don't
- // return any system-backed media feature values. (No spoofed values returned.)
- return NS_OK;
- }
- MOZ_ASSERT(aFeature->mValueType == nsMediaFeature::eBoolInteger,
- "unexpected type");
- nsIAtom *metricAtom = *aFeature->mData.mMetric;
- bool hasMetric = nsCSSRuleProcessor::HasSystemMetric(metricAtom);
- aResult.SetIntValue(hasMetric ? 1 : 0, eCSSUnit_Integer);
- return NS_OK;
- }
- static nsresult
- GetWindowsTheme(nsPresContext* aPresContext, const nsMediaFeature* aFeature,
- nsCSSValue& aResult)
- {
- aResult.Reset();
- if (ShouldResistFingerprinting(aPresContext)) {
- return NS_OK;
- }
- #ifdef XP_WIN
- uint8_t windowsThemeId =
- nsCSSRuleProcessor::GetWindowsThemeIdentifier();
- // Classic mode should fail to match.
- if (windowsThemeId == LookAndFeel::eWindowsTheme_Classic)
- return NS_OK;
- // Look up the appropriate theme string
- for (size_t i = 0; i < ArrayLength(themeStrings); ++i) {
- if (windowsThemeId == themeStrings[i].id) {
- aResult.SetStringValue(nsDependentString(themeStrings[i].name),
- eCSSUnit_Ident);
- break;
- }
- }
- #endif
- return NS_OK;
- }
- static nsresult
- GetOperatingSystemVersion(nsPresContext* aPresContext, const nsMediaFeature* aFeature,
- nsCSSValue& aResult)
- {
- aResult.Reset();
- if (ShouldResistFingerprinting(aPresContext)) {
- return NS_OK;
- }
- #ifdef XP_WIN
- int32_t metricResult;
- if (NS_SUCCEEDED(
- LookAndFeel::GetInt(LookAndFeel::eIntID_OperatingSystemVersionIdentifier,
- &metricResult))) {
- for (size_t i = 0; i < ArrayLength(osVersionStrings); ++i) {
- if (metricResult == osVersionStrings[i].id) {
- aResult.SetStringValue(nsDependentString(osVersionStrings[i].name),
- eCSSUnit_Ident);
- break;
- }
- }
- }
- #endif
- return NS_OK;
- }
- static nsresult
- GetPrefersColorScheme(nsPresContext* aPresContext, const nsMediaFeature* aFeature,
- nsCSSValue& aResult)
- {
- switch(Preferences::GetInt("browser.display.prefers_color_scheme", 1)) {
- case 1:
- aResult.SetIntValue(NS_STYLE_PREFERS_COLOR_SCHEME_LIGHT,
- eCSSUnit_Enumerated);
- break;
- case 2:
- aResult.SetIntValue(NS_STYLE_PREFERS_COLOR_SCHEME_DARK,
- eCSSUnit_Enumerated);
- break;
- case 3:
- // If the pref is 3, we follow ui.color_scheme instead. When following
- // ui.color_scheme, light theme is the fallback behavior.
- switch(Preferences::GetInt("ui.color_scheme", 1)) {
- case 2:
- aResult.SetIntValue(NS_STYLE_PREFERS_COLOR_SCHEME_DARK,
- eCSSUnit_Enumerated);
- break;
- default:
- aResult.SetIntValue(NS_STYLE_PREFERS_COLOR_SCHEME_LIGHT,
- eCSSUnit_Enumerated);
- }
- break;
- default:
- aResult.Reset();
- }
- return NS_OK;
- }
- static nsresult
- GetDarkTheme(nsPresContext* aPresContext, const nsMediaFeature* aFeature,
- nsCSSValue& aResult)
- {
- #ifdef XP_WIN
- // Under Windows, do nothing if High Contrast Theme is on.
- if (LookAndFeel::GetInt(LookAndFeel::eIntID_UseAccessibilityTheme, 0)) {
- aResult.Reset();
- return NS_OK;
- }
- #endif
- switch(Preferences::GetInt("ui.color_scheme", 1)) {
- case 1:
- aResult.SetIntValue(0, eCSSUnit_Integer);
- break;
- case 2:
- aResult.SetIntValue(1, eCSSUnit_Integer);
- break;
- default:
- aResult.Reset();
- }
- return NS_OK;
- }
- static nsresult
- GetIsGlyph(nsPresContext* aPresContext, const nsMediaFeature* aFeature,
- nsCSSValue& aResult)
- {
- aResult.SetIntValue(aPresContext->IsGlyph() ? 1 : 0, eCSSUnit_Integer);
- return NS_OK;
- }
- /*
- * 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.
- */
- /* static */ const nsMediaFeature
- nsMediaFeatures::features[] = {
- {
- &nsGkAtoms::width,
- nsMediaFeature::eMinMaxAllowed,
- nsMediaFeature::eLength,
- nsMediaFeature::eNoRequirements,
- { nullptr },
- GetWidth
- },
- {
- &nsGkAtoms::height,
- nsMediaFeature::eMinMaxAllowed,
- nsMediaFeature::eLength,
- nsMediaFeature::eNoRequirements,
- { nullptr },
- GetHeight
- },
- {
- &nsGkAtoms::deviceWidth,
- nsMediaFeature::eMinMaxAllowed,
- nsMediaFeature::eLength,
- nsMediaFeature::eNoRequirements,
- { nullptr },
- GetDeviceWidth
- },
- {
- &nsGkAtoms::deviceHeight,
- nsMediaFeature::eMinMaxAllowed,
- nsMediaFeature::eLength,
- nsMediaFeature::eNoRequirements,
- { nullptr },
- GetDeviceHeight
- },
- {
- &nsGkAtoms::orientation,
- nsMediaFeature::eMinMaxNotAllowed,
- nsMediaFeature::eEnumerated,
- nsMediaFeature::eNoRequirements,
- { kOrientationKeywords },
- GetOrientation
- },
- {
- &nsGkAtoms::aspectRatio,
- nsMediaFeature::eMinMaxAllowed,
- nsMediaFeature::eIntRatio,
- nsMediaFeature::eNoRequirements,
- { nullptr },
- GetAspectRatio
- },
- {
- &nsGkAtoms::deviceAspectRatio,
- nsMediaFeature::eMinMaxAllowed,
- nsMediaFeature::eIntRatio,
- nsMediaFeature::eNoRequirements,
- { nullptr },
- GetDeviceAspectRatio
- },
- {
- &nsGkAtoms::color,
- nsMediaFeature::eMinMaxAllowed,
- nsMediaFeature::eInteger,
- nsMediaFeature::eNoRequirements,
- { nullptr },
- GetColor
- },
- {
- &nsGkAtoms::colorIndex,
- nsMediaFeature::eMinMaxAllowed,
- nsMediaFeature::eInteger,
- nsMediaFeature::eNoRequirements,
- { nullptr },
- GetColorIndex
- },
- {
- &nsGkAtoms::monochrome,
- nsMediaFeature::eMinMaxAllowed,
- nsMediaFeature::eInteger,
- nsMediaFeature::eNoRequirements,
- { nullptr },
- GetMonochrome
- },
- {
- &nsGkAtoms::prefers_color_scheme,
- nsMediaFeature::eMinMaxNotAllowed,
- nsMediaFeature::eEnumerated,
- nsMediaFeature::eNoRequirements,
- { kPrefersColorSchemeKeywords },
- GetPrefersColorScheme
- },
- {
- &nsGkAtoms::resolution,
- nsMediaFeature::eMinMaxAllowed,
- nsMediaFeature::eResolution,
- nsMediaFeature::eNoRequirements,
- { nullptr },
- GetResolution
- },
- {
- &nsGkAtoms::scan,
- nsMediaFeature::eMinMaxNotAllowed,
- nsMediaFeature::eEnumerated,
- nsMediaFeature::eNoRequirements,
- { kScanKeywords },
- GetScan
- },
- {
- &nsGkAtoms::grid,
- nsMediaFeature::eMinMaxNotAllowed,
- nsMediaFeature::eBoolInteger,
- nsMediaFeature::eNoRequirements,
- { nullptr },
- GetGrid
- },
- {
- &nsGkAtoms::displayMode,
- nsMediaFeature::eMinMaxNotAllowed,
- nsMediaFeature::eEnumerated,
- nsMediaFeature::eNoRequirements,
- { kDisplayModeKeywords },
- GetDisplayMode
- },
- // Webkit extensions that we support for de-facto web compatibility
- // -webkit-{min|max}-device-pixel-ratio (controlled with its own pref):
- {
- &nsGkAtoms::devicePixelRatio,
- nsMediaFeature::eMinMaxAllowed,
- nsMediaFeature::eFloat,
- nsMediaFeature::eHasWebkitPrefix |
- nsMediaFeature::eWebkitDevicePixelRatioPrefEnabled,
- { nullptr },
- GetDevicePixelRatio
- },
- // -webkit-transform-3d:
- {
- &nsGkAtoms::transform_3d,
- nsMediaFeature::eMinMaxNotAllowed,
- nsMediaFeature::eBoolInteger,
- nsMediaFeature::eHasWebkitPrefix,
- { nullptr },
- GetTransform3d
- },
- // Mozilla extensions
- {
- &nsGkAtoms::_moz_dark_theme,
- nsMediaFeature::eMinMaxNotAllowed,
- nsMediaFeature::eBoolInteger,
- nsMediaFeature::eNoRequirements,
- { nullptr },
- GetDarkTheme
- },
- {
- &nsGkAtoms::_moz_device_pixel_ratio,
- nsMediaFeature::eMinMaxAllowed,
- nsMediaFeature::eFloat,
- nsMediaFeature::eNoRequirements,
- { nullptr },
- GetDevicePixelRatio
- },
- {
- &nsGkAtoms::_moz_device_orientation,
- nsMediaFeature::eMinMaxNotAllowed,
- nsMediaFeature::eEnumerated,
- nsMediaFeature::eNoRequirements,
- { kOrientationKeywords },
- GetDeviceOrientation
- },
- {
- &nsGkAtoms::_moz_is_resource_document,
- nsMediaFeature::eMinMaxNotAllowed,
- nsMediaFeature::eBoolInteger,
- nsMediaFeature::eNoRequirements,
- { nullptr },
- GetIsResourceDocument
- },
- {
- &nsGkAtoms::_moz_color_picker_available,
- nsMediaFeature::eMinMaxNotAllowed,
- nsMediaFeature::eBoolInteger,
- nsMediaFeature::eNoRequirements,
- { &nsGkAtoms::color_picker_available },
- GetSystemMetric
- },
- {
- &nsGkAtoms::_moz_scrollbar_start_backward,
- nsMediaFeature::eMinMaxNotAllowed,
- nsMediaFeature::eBoolInteger,
- nsMediaFeature::eNoRequirements,
- { &nsGkAtoms::scrollbar_start_backward },
- GetSystemMetric
- },
- {
- &nsGkAtoms::_moz_scrollbar_start_forward,
- nsMediaFeature::eMinMaxNotAllowed,
- nsMediaFeature::eBoolInteger,
- nsMediaFeature::eNoRequirements,
- { &nsGkAtoms::scrollbar_start_forward },
- GetSystemMetric
- },
- {
- &nsGkAtoms::_moz_scrollbar_end_backward,
- nsMediaFeature::eMinMaxNotAllowed,
- nsMediaFeature::eBoolInteger,
- nsMediaFeature::eNoRequirements,
- { &nsGkAtoms::scrollbar_end_backward },
- GetSystemMetric
- },
- {
- &nsGkAtoms::_moz_scrollbar_end_forward,
- nsMediaFeature::eMinMaxNotAllowed,
- nsMediaFeature::eBoolInteger,
- nsMediaFeature::eNoRequirements,
- { &nsGkAtoms::scrollbar_end_forward },
- GetSystemMetric
- },
- {
- &nsGkAtoms::_moz_scrollbar_thumb_proportional,
- nsMediaFeature::eMinMaxNotAllowed,
- nsMediaFeature::eBoolInteger,
- nsMediaFeature::eNoRequirements,
- { &nsGkAtoms::scrollbar_thumb_proportional },
- GetSystemMetric
- },
- {
- &nsGkAtoms::_moz_overlay_scrollbars,
- nsMediaFeature::eMinMaxNotAllowed,
- nsMediaFeature::eBoolInteger,
- nsMediaFeature::eNoRequirements,
- { &nsGkAtoms::overlay_scrollbars },
- GetSystemMetric
- },
- {
- &nsGkAtoms::_moz_windows_default_theme,
- nsMediaFeature::eMinMaxNotAllowed,
- nsMediaFeature::eBoolInteger,
- nsMediaFeature::eNoRequirements,
- { &nsGkAtoms::windows_default_theme },
- GetSystemMetric
- },
- {
- &nsGkAtoms::_moz_mac_graphite_theme,
- nsMediaFeature::eMinMaxNotAllowed,
- nsMediaFeature::eBoolInteger,
- nsMediaFeature::eNoRequirements,
- { &nsGkAtoms::mac_graphite_theme },
- GetSystemMetric
- },
- {
- &nsGkAtoms::_moz_mac_lion_theme,
- nsMediaFeature::eMinMaxNotAllowed,
- nsMediaFeature::eBoolInteger,
- nsMediaFeature::eNoRequirements,
- { &nsGkAtoms::mac_lion_theme },
- GetSystemMetric
- },
- {
- &nsGkAtoms::_moz_mac_yosemite_theme,
- nsMediaFeature::eMinMaxNotAllowed,
- nsMediaFeature::eBoolInteger,
- nsMediaFeature::eNoRequirements,
- { &nsGkAtoms::mac_yosemite_theme },
- GetSystemMetric
- },
- {
- &nsGkAtoms::_moz_windows_accent_color_applies,
- nsMediaFeature::eMinMaxNotAllowed,
- nsMediaFeature::eBoolInteger,
- nsMediaFeature::eNoRequirements,
- { &nsGkAtoms::windows_accent_color_applies },
- GetSystemMetric
- },
- {
- &nsGkAtoms::_moz_windows_accent_color_is_dark,
- nsMediaFeature::eMinMaxNotAllowed,
- nsMediaFeature::eBoolInteger,
- nsMediaFeature::eNoRequirements,
- { &nsGkAtoms::windows_accent_color_is_dark },
- GetSystemMetric
- },
- {
- &nsGkAtoms::_moz_windows_compositor,
- nsMediaFeature::eMinMaxNotAllowed,
- nsMediaFeature::eBoolInteger,
- nsMediaFeature::eNoRequirements,
- { &nsGkAtoms::windows_compositor },
- GetSystemMetric
- },
- {
- &nsGkAtoms::_moz_windows_classic,
- nsMediaFeature::eMinMaxNotAllowed,
- nsMediaFeature::eBoolInteger,
- nsMediaFeature::eNoRequirements,
- { &nsGkAtoms::windows_classic },
- GetSystemMetric
- },
- {
- &nsGkAtoms::_moz_windows_glass,
- nsMediaFeature::eMinMaxNotAllowed,
- nsMediaFeature::eBoolInteger,
- nsMediaFeature::eNoRequirements,
- { &nsGkAtoms::windows_glass },
- GetSystemMetric
- },
- {
- &nsGkAtoms::_moz_touch_enabled,
- nsMediaFeature::eMinMaxNotAllowed,
- nsMediaFeature::eBoolInteger,
- nsMediaFeature::eNoRequirements,
- { &nsGkAtoms::touch_enabled },
- GetSystemMetric
- },
- {
- &nsGkAtoms::_moz_menubar_drag,
- nsMediaFeature::eMinMaxNotAllowed,
- nsMediaFeature::eBoolInteger,
- nsMediaFeature::eNoRequirements,
- { &nsGkAtoms::menubar_drag },
- GetSystemMetric
- },
- {
- &nsGkAtoms::_moz_windows_theme,
- nsMediaFeature::eMinMaxNotAllowed,
- nsMediaFeature::eIdent,
- nsMediaFeature::eNoRequirements,
- { nullptr },
- GetWindowsTheme
- },
- {
- &nsGkAtoms::_moz_os_version,
- nsMediaFeature::eMinMaxNotAllowed,
- nsMediaFeature::eIdent,
- nsMediaFeature::eNoRequirements,
- { nullptr },
- GetOperatingSystemVersion
- },
- {
- &nsGkAtoms::_moz_swipe_animation_enabled,
- nsMediaFeature::eMinMaxNotAllowed,
- nsMediaFeature::eBoolInteger,
- nsMediaFeature::eNoRequirements,
- { &nsGkAtoms::swipe_animation_enabled },
- GetSystemMetric
- },
- {
- &nsGkAtoms::_moz_physical_home_button,
- nsMediaFeature::eMinMaxNotAllowed,
- nsMediaFeature::eBoolInteger,
- nsMediaFeature::eNoRequirements,
- { &nsGkAtoms::physical_home_button },
- GetSystemMetric
- },
- // Internal -moz-is-glyph media feature: applies only inside SVG glyphs.
- // Internal because it is really only useful in the user agent anyway
- // and therefore not worth standardizing.
- {
- &nsGkAtoms::_moz_is_glyph,
- nsMediaFeature::eMinMaxNotAllowed,
- nsMediaFeature::eBoolInteger,
- nsMediaFeature::eNoRequirements,
- { nullptr },
- GetIsGlyph
- },
- // Null-mName terminator:
- {
- nullptr,
- nsMediaFeature::eMinMaxAllowed,
- nsMediaFeature::eInteger,
- nsMediaFeature::eNoRequirements,
- { nullptr },
- nullptr
- },
- };
|