Bug 1176968 part 2: Add "requirement flags" field to media query features, and logic for ignoring the feature if requirements aren't met. r=heycam

This commit is contained in:
Daniel Holbert 2015-11-09 18:09:40 -08:00
Родитель b3e5df1df4
Коммит 72ffc49c97
3 изменённых файлов: 53 добавлений и 1 удалений

Просмотреть файл

@ -3411,6 +3411,7 @@ CSSParserImpl::ParseMediaQueryExpression(nsMediaQuery* aQuery)
// case insensitive from CSS - must be lower cased
nsContentUtils::ASCIIToLower(mToken.mIdent);
nsDependentString featureString(mToken.mIdent, 0);
uint8_t satisfiedReqFlags = 0;
// Strip off "min-"/"max-" prefix from featureString:
if (StringBeginsWith(featureString, NS_LITERAL_STRING("min-"))) {
@ -3426,7 +3427,11 @@ CSSParserImpl::ParseMediaQueryExpression(nsMediaQuery* aQuery)
nsCOMPtr<nsIAtom> mediaFeatureAtom = do_GetAtom(featureString);
const nsMediaFeature *feature = nsMediaFeatures::features;
for (; feature->mName; ++feature) {
if (*(feature->mName) == mediaFeatureAtom) {
// See if name matches & all requirement flags are satisfied:
// (We check requirements by turning off all of the flags that have been
// satisfied, and then see if the result is 0.)
if (*(feature->mName) == mediaFeatureAtom &&
!(feature->mReqFlags & ~satisfiedReqFlags)) {
break;
}
}

Просмотреть файл

@ -420,6 +420,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::width,
nsMediaFeature::eMinMaxAllowed,
nsMediaFeature::eLength,
nsMediaFeature::eNoRequirements,
{ nullptr },
GetWidth
},
@ -427,6 +428,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::height,
nsMediaFeature::eMinMaxAllowed,
nsMediaFeature::eLength,
nsMediaFeature::eNoRequirements,
{ nullptr },
GetHeight
},
@ -434,6 +436,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::deviceWidth,
nsMediaFeature::eMinMaxAllowed,
nsMediaFeature::eLength,
nsMediaFeature::eNoRequirements,
{ nullptr },
GetDeviceWidth
},
@ -441,6 +444,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::deviceHeight,
nsMediaFeature::eMinMaxAllowed,
nsMediaFeature::eLength,
nsMediaFeature::eNoRequirements,
{ nullptr },
GetDeviceHeight
},
@ -448,6 +452,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::orientation,
nsMediaFeature::eMinMaxNotAllowed,
nsMediaFeature::eEnumerated,
nsMediaFeature::eNoRequirements,
{ kOrientationKeywords },
GetOrientation
},
@ -455,6 +460,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::aspectRatio,
nsMediaFeature::eMinMaxAllowed,
nsMediaFeature::eIntRatio,
nsMediaFeature::eNoRequirements,
{ nullptr },
GetAspectRatio
},
@ -462,6 +468,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::deviceAspectRatio,
nsMediaFeature::eMinMaxAllowed,
nsMediaFeature::eIntRatio,
nsMediaFeature::eNoRequirements,
{ nullptr },
GetDeviceAspectRatio
},
@ -469,6 +476,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::color,
nsMediaFeature::eMinMaxAllowed,
nsMediaFeature::eInteger,
nsMediaFeature::eNoRequirements,
{ nullptr },
GetColor
},
@ -476,6 +484,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::colorIndex,
nsMediaFeature::eMinMaxAllowed,
nsMediaFeature::eInteger,
nsMediaFeature::eNoRequirements,
{ nullptr },
GetColorIndex
},
@ -483,6 +492,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::monochrome,
nsMediaFeature::eMinMaxAllowed,
nsMediaFeature::eInteger,
nsMediaFeature::eNoRequirements,
{ nullptr },
GetMonochrome
},
@ -490,6 +500,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::resolution,
nsMediaFeature::eMinMaxAllowed,
nsMediaFeature::eResolution,
nsMediaFeature::eNoRequirements,
{ nullptr },
GetResolution
},
@ -497,6 +508,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::scan,
nsMediaFeature::eMinMaxNotAllowed,
nsMediaFeature::eEnumerated,
nsMediaFeature::eNoRequirements,
{ kScanKeywords },
GetScan
},
@ -504,6 +516,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::grid,
nsMediaFeature::eMinMaxNotAllowed,
nsMediaFeature::eBoolInteger,
nsMediaFeature::eNoRequirements,
{ nullptr },
GetGrid
},
@ -513,6 +526,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::_moz_device_pixel_ratio,
nsMediaFeature::eMinMaxAllowed,
nsMediaFeature::eFloat,
nsMediaFeature::eNoRequirements,
{ nullptr },
GetDevicePixelRatio
},
@ -520,6 +534,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::_moz_device_orientation,
nsMediaFeature::eMinMaxNotAllowed,
nsMediaFeature::eEnumerated,
nsMediaFeature::eNoRequirements,
{ kOrientationKeywords },
GetDeviceOrientation
},
@ -527,6 +542,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::_moz_is_resource_document,
nsMediaFeature::eMinMaxNotAllowed,
nsMediaFeature::eBoolInteger,
nsMediaFeature::eNoRequirements,
{ nullptr },
GetIsResourceDocument
},
@ -534,6 +550,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::_moz_color_picker_available,
nsMediaFeature::eMinMaxNotAllowed,
nsMediaFeature::eBoolInteger,
nsMediaFeature::eNoRequirements,
{ &nsGkAtoms::color_picker_available },
GetSystemMetric
},
@ -541,6 +558,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::_moz_scrollbar_start_backward,
nsMediaFeature::eMinMaxNotAllowed,
nsMediaFeature::eBoolInteger,
nsMediaFeature::eNoRequirements,
{ &nsGkAtoms::scrollbar_start_backward },
GetSystemMetric
},
@ -548,6 +566,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::_moz_scrollbar_start_forward,
nsMediaFeature::eMinMaxNotAllowed,
nsMediaFeature::eBoolInteger,
nsMediaFeature::eNoRequirements,
{ &nsGkAtoms::scrollbar_start_forward },
GetSystemMetric
},
@ -555,6 +574,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::_moz_scrollbar_end_backward,
nsMediaFeature::eMinMaxNotAllowed,
nsMediaFeature::eBoolInteger,
nsMediaFeature::eNoRequirements,
{ &nsGkAtoms::scrollbar_end_backward },
GetSystemMetric
},
@ -562,6 +582,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::_moz_scrollbar_end_forward,
nsMediaFeature::eMinMaxNotAllowed,
nsMediaFeature::eBoolInteger,
nsMediaFeature::eNoRequirements,
{ &nsGkAtoms::scrollbar_end_forward },
GetSystemMetric
},
@ -569,6 +590,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::_moz_scrollbar_thumb_proportional,
nsMediaFeature::eMinMaxNotAllowed,
nsMediaFeature::eBoolInteger,
nsMediaFeature::eNoRequirements,
{ &nsGkAtoms::scrollbar_thumb_proportional },
GetSystemMetric
},
@ -576,6 +598,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::_moz_images_in_menus,
nsMediaFeature::eMinMaxNotAllowed,
nsMediaFeature::eBoolInteger,
nsMediaFeature::eNoRequirements,
{ &nsGkAtoms::images_in_menus },
GetSystemMetric
},
@ -583,6 +606,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::_moz_images_in_buttons,
nsMediaFeature::eMinMaxNotAllowed,
nsMediaFeature::eBoolInteger,
nsMediaFeature::eNoRequirements,
{ &nsGkAtoms::images_in_buttons },
GetSystemMetric
},
@ -590,6 +614,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::_moz_overlay_scrollbars,
nsMediaFeature::eMinMaxNotAllowed,
nsMediaFeature::eBoolInteger,
nsMediaFeature::eNoRequirements,
{ &nsGkAtoms::overlay_scrollbars },
GetSystemMetric
},
@ -597,6 +622,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::_moz_windows_default_theme,
nsMediaFeature::eMinMaxNotAllowed,
nsMediaFeature::eBoolInteger,
nsMediaFeature::eNoRequirements,
{ &nsGkAtoms::windows_default_theme },
GetSystemMetric
},
@ -604,6 +630,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::_moz_mac_graphite_theme,
nsMediaFeature::eMinMaxNotAllowed,
nsMediaFeature::eBoolInteger,
nsMediaFeature::eNoRequirements,
{ &nsGkAtoms::mac_graphite_theme },
GetSystemMetric
},
@ -611,6 +638,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::_moz_mac_lion_theme,
nsMediaFeature::eMinMaxNotAllowed,
nsMediaFeature::eBoolInteger,
nsMediaFeature::eNoRequirements,
{ &nsGkAtoms::mac_lion_theme },
GetSystemMetric
},
@ -618,6 +646,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::_moz_mac_yosemite_theme,
nsMediaFeature::eMinMaxNotAllowed,
nsMediaFeature::eBoolInteger,
nsMediaFeature::eNoRequirements,
{ &nsGkAtoms::mac_yosemite_theme },
GetSystemMetric
},
@ -625,6 +654,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::_moz_windows_compositor,
nsMediaFeature::eMinMaxNotAllowed,
nsMediaFeature::eBoolInteger,
nsMediaFeature::eNoRequirements,
{ &nsGkAtoms::windows_compositor },
GetSystemMetric
},
@ -632,6 +662,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::_moz_windows_classic,
nsMediaFeature::eMinMaxNotAllowed,
nsMediaFeature::eBoolInteger,
nsMediaFeature::eNoRequirements,
{ &nsGkAtoms::windows_classic },
GetSystemMetric
},
@ -639,6 +670,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::_moz_windows_glass,
nsMediaFeature::eMinMaxNotAllowed,
nsMediaFeature::eBoolInteger,
nsMediaFeature::eNoRequirements,
{ &nsGkAtoms::windows_glass },
GetSystemMetric
},
@ -646,6 +678,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::_moz_touch_enabled,
nsMediaFeature::eMinMaxNotAllowed,
nsMediaFeature::eBoolInteger,
nsMediaFeature::eNoRequirements,
{ &nsGkAtoms::touch_enabled },
GetSystemMetric
},
@ -653,6 +686,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::_moz_menubar_drag,
nsMediaFeature::eMinMaxNotAllowed,
nsMediaFeature::eBoolInteger,
nsMediaFeature::eNoRequirements,
{ &nsGkAtoms::menubar_drag },
GetSystemMetric
},
@ -660,6 +694,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::_moz_windows_theme,
nsMediaFeature::eMinMaxNotAllowed,
nsMediaFeature::eIdent,
nsMediaFeature::eNoRequirements,
{ nullptr },
GetWindowsTheme
},
@ -667,6 +702,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::_moz_os_version,
nsMediaFeature::eMinMaxNotAllowed,
nsMediaFeature::eIdent,
nsMediaFeature::eNoRequirements,
{ nullptr },
GetOperatinSystemVersion
},
@ -675,6 +711,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::_moz_swipe_animation_enabled,
nsMediaFeature::eMinMaxNotAllowed,
nsMediaFeature::eBoolInteger,
nsMediaFeature::eNoRequirements,
{ &nsGkAtoms::swipe_animation_enabled },
GetSystemMetric
},
@ -683,6 +720,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::_moz_physical_home_button,
nsMediaFeature::eMinMaxNotAllowed,
nsMediaFeature::eBoolInteger,
nsMediaFeature::eNoRequirements,
{ &nsGkAtoms::physical_home_button },
GetSystemMetric
},
@ -694,6 +732,7 @@ nsMediaFeatures::features[] = {
&nsGkAtoms::_moz_is_glyph,
nsMediaFeature::eMinMaxNotAllowed,
nsMediaFeature::eBoolInteger,
nsMediaFeature::eNoRequirements,
{ nullptr },
GetIsGlyph
},
@ -702,6 +741,7 @@ nsMediaFeatures::features[] = {
nullptr,
nsMediaFeature::eMinMaxAllowed,
nsMediaFeature::eInteger,
nsMediaFeature::eNoRequirements,
{ nullptr },
nullptr
},

Просмотреть файл

@ -46,6 +46,13 @@ struct nsMediaFeature {
};
ValueType mValueType;
enum RequirementFlags : uint8_t {
// Bitfield of requirements that must be satisfied in order for this
// media feature to be active.
eNoRequirements = 0
};
uint8_t mReqFlags;
union {
// In static arrays, it's the first member that's initialized. We
// need that to be void* so we can initialize both other types.