Auto merge of #21140 - emilio:gecko-sync, r=emilio

style: Sync changes from mozilla-central.

See each individual commit for details.

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/21140)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2018-07-08 21:23:22 -04:00 committed by GitHub
commit 6554a40331
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 371 additions and 323 deletions

View file

@ -65,7 +65,12 @@ lazy_static! {
.map(|s| s.parse::<usize>().expect("invalid STYLO_THREADS value")); .map(|s| s.parse::<usize>().expect("invalid STYLO_THREADS value"));
let mut num_threads = match stylo_threads { let mut num_threads = match stylo_threads {
Ok(num) => num, Ok(num) => num,
_ => cmp::max(num_cpus::get() * 3 / 4, 1), // The default heuristic is num_virtual_cores * .75. This gives us
// three threads on a hyper-threaded dual core, and six threads on
// a hyper-threaded quad core. The performance benefit of additional
// threads seems to level off at around six, so we cap it there on
// many-core machines (see bug 1431285 comment 14).
_ => cmp::min(cmp::max(num_cpus::get() * 3 / 4, 1), 6),
}; };
// If num_threads is one, there's no point in creating a thread pool, so // If num_threads is one, there's no point in creating a thread pool, so

View file

@ -49,8 +49,7 @@ use gecko::values::round_border_to_device_pixels;
use logical_geometry::WritingMode; use logical_geometry::WritingMode;
use media_queries::Device; use media_queries::Device;
use properties::computed_value_flags::*; use properties::computed_value_flags::*;
use properties::{longhands, Importance, LonghandId}; use properties::longhands;
use properties::{PropertyDeclaration, PropertyDeclarationBlock, PropertyDeclarationId};
use rule_tree::StrongRuleNode; use rule_tree::StrongRuleNode;
use selector_parser::PseudoElement; use selector_parser::PseudoElement;
use servo_arc::{Arc, RawOffsetArc}; use servo_arc::{Arc, RawOffsetArc};
@ -58,7 +57,7 @@ use std::marker::PhantomData;
use std::mem::{forget, uninitialized, transmute, zeroed}; use std::mem::{forget, uninitialized, transmute, zeroed};
use std::{cmp, ops, ptr}; use std::{cmp, ops, ptr};
use values::{self, CustomIdent, Either, KeyframesName, None_}; use values::{self, CustomIdent, Either, KeyframesName, None_};
use values::computed::{NonNegativeLength, ToComputedValue, Percentage, TransitionProperty}; use values::computed::{NonNegativeLength, Percentage, TransitionProperty};
use values::computed::font::FontSize; use values::computed::font::FontSize;
use values::computed::effects::{BoxShadow, Filter, SimpleShadow}; use values::computed::effects::{BoxShadow, Filter, SimpleShadow};
use values::computed::outline::OutlineStyle; use values::computed::outline::OutlineStyle;
@ -307,30 +306,6 @@ impl ComputedValuesInner {
pub fn has_moz_binding(&self) -> bool { pub fn has_moz_binding(&self) -> bool {
!self.get_box().gecko.mBinding.mRawPtr.is_null() !self.get_box().gecko.mBinding.mRawPtr.is_null()
} }
pub fn to_declaration_block(&self, property: PropertyDeclarationId) -> PropertyDeclarationBlock {
let value = match property {
% for prop in data.longhands:
% if prop.animatable:
PropertyDeclarationId::Longhand(LonghandId::${prop.camel_case}) => {
PropertyDeclaration::${prop.camel_case}(
% if prop.boxed:
Box::new(
% endif
longhands::${prop.ident}::SpecifiedValue::from_computed_value(
&self.get_${prop.style_struct.ident.strip("_")}().clone_${prop.ident}())
% if prop.boxed:
)
% endif
)
},
% endif
% endfor
PropertyDeclarationId::Custom(_name) => unimplemented!(),
_ => unimplemented!()
};
PropertyDeclarationBlock::with_one(value, Importance::Normal)
}
} }
<%def name="declare_style_struct(style_struct)"> <%def name="declare_style_struct(style_struct)">

View file

@ -207,8 +207,8 @@ impl AnimatedProperty {
% for prop in data.longhands: % for prop in data.longhands:
% if prop.animatable: % if prop.animatable:
LonghandId::${prop.camel_case} => { LonghandId::${prop.camel_case} => {
let old_computed = old_style.get_${prop.style_struct.ident.strip("_")}().clone_${prop.ident}(); let old_computed = old_style.clone_${prop.ident}();
let new_computed = new_style.get_${prop.style_struct.ident.strip("_")}().clone_${prop.ident}(); let new_computed = new_style.clone_${prop.ident}();
AnimatedProperty::${prop.camel_case}( AnimatedProperty::${prop.camel_case}(
% if prop.is_animatable_with_computed_value: % if prop.is_animatable_with_computed_value:
old_computed, old_computed,
@ -546,15 +546,13 @@ impl AnimationValue {
/// Get an AnimationValue for an AnimatableLonghand from a given computed values. /// Get an AnimationValue for an AnimatableLonghand from a given computed values.
pub fn from_computed_values( pub fn from_computed_values(
property: LonghandId, property: LonghandId,
computed_values: &ComputedValues style: &ComputedValues,
) -> Option<Self> { ) -> Option<Self> {
Some(match property { Some(match property {
% for prop in data.longhands: % for prop in data.longhands:
% if prop.animatable: % if prop.animatable:
LonghandId::${prop.camel_case} => { LonghandId::${prop.camel_case} => {
let computed = computed_values let computed = style.clone_${prop.ident}();
.get_${prop.style_struct.ident.strip("_")}()
.clone_${prop.ident}();
AnimationValue::${prop.camel_case}( AnimationValue::${prop.camel_case}(
% if prop.is_animatable_with_computed_value: % if prop.is_animatable_with_computed_value:
computed computed

View file

@ -7,13 +7,15 @@
<% data.new_style_struct("Font", inherited=True) %> <% data.new_style_struct("Font", inherited=True) %>
${helpers.predefined_type("font-family", ${helpers.predefined_type(
"FontFamily", "font-family",
initial_value="computed::FontFamily::serif()", "FontFamily",
animation_value_type="discrete", initial_value="computed::FontFamily::serif()",
flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER", animation_value_type="discrete",
spec="https://drafts.csswg.org/css-fonts/#propdef-font-family", flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER",
servo_restyle_damage="rebuild_and_reflow")} spec="https://drafts.csswg.org/css-fonts/#propdef-font-family",
servo_restyle_damage="rebuild_and_reflow",
)}
${helpers.predefined_type( ${helpers.predefined_type(
"font-style", "font-style",
@ -32,16 +34,18 @@ ${helpers.predefined_type(
"all-petite-caps": "ALLPETITE", "all-petite-caps": "ALLPETITE",
"titling-caps": "TITLING" } %> "titling-caps": "TITLING" } %>
${helpers.single_keyword_system("font-variant-caps", ${helpers.single_keyword_system(
"normal small-caps", "font-variant-caps",
extra_gecko_values="all-small-caps petite-caps all-petite-caps unicase titling-caps", "normal small-caps",
gecko_constant_prefix="NS_FONT_VARIANT_CAPS", extra_gecko_values="all-small-caps petite-caps all-petite-caps unicase titling-caps",
gecko_ffi_name="mFont.variantCaps", gecko_constant_prefix="NS_FONT_VARIANT_CAPS",
spec="https://drafts.csswg.org/css-fonts/#propdef-font-variant-caps", gecko_ffi_name="mFont.variantCaps",
custom_consts=font_variant_caps_custom_consts, spec="https://drafts.csswg.org/css-fonts/#propdef-font-variant-caps",
flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER", custom_consts=font_variant_caps_custom_consts,
animation_value_type="discrete", flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER",
servo_restyle_damage="rebuild_and_reflow")} animation_value_type="discrete",
servo_restyle_damage="rebuild_and_reflow",
)}
${helpers.predefined_type( ${helpers.predefined_type(
"font-weight", "font-weight",
@ -54,32 +58,38 @@ ${helpers.predefined_type(
servo_restyle_damage="rebuild_and_reflow", servo_restyle_damage="rebuild_and_reflow",
)} )}
${helpers.predefined_type("font-size", ${helpers.predefined_type(
"FontSize", "font-size",
initial_value="computed::FontSize::medium()", "FontSize",
initial_specified_value="specified::FontSize::medium()", initial_value="computed::FontSize::medium()",
animation_value_type="NonNegativeLength", initial_specified_value="specified::FontSize::medium()",
allow_quirks=True, animation_value_type="NonNegativeLength",
flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER", allow_quirks=True,
spec="https://drafts.csswg.org/css-fonts/#propdef-font-size", flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER",
servo_restyle_damage="rebuild_and_reflow")} spec="https://drafts.csswg.org/css-fonts/#propdef-font-size",
servo_restyle_damage="rebuild_and_reflow",
)}
${helpers.predefined_type("font-size-adjust", ${helpers.predefined_type(
"FontSizeAdjust", "font-size-adjust",
products="gecko", "FontSizeAdjust",
initial_value="computed::FontSizeAdjust::none()", products="gecko",
initial_specified_value="specified::FontSizeAdjust::none()", initial_value="computed::FontSizeAdjust::none()",
animation_value_type="ComputedValue", initial_specified_value="specified::FontSizeAdjust::none()",
flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER", animation_value_type="ComputedValue",
spec="https://drafts.csswg.org/css-fonts/#propdef-font-size-adjust")} flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER",
spec="https://drafts.csswg.org/css-fonts/#propdef-font-size-adjust",
)}
${helpers.predefined_type("font-synthesis", ${helpers.predefined_type(
"FontSynthesis", "font-synthesis",
products="gecko", "FontSynthesis",
initial_value="specified::FontSynthesis::get_initial_value()", products="gecko",
animation_value_type="discrete", initial_value="specified::FontSynthesis::get_initial_value()",
flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER", animation_value_type="discrete",
spec="https://drafts.csswg.org/css-fonts/#propdef-font-synthesis")} flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER",
spec="https://drafts.csswg.org/css-fonts/#propdef-font-synthesis",
)}
${helpers.predefined_type( ${helpers.predefined_type(
"font-stretch", "font-stretch",
@ -92,69 +102,83 @@ ${helpers.predefined_type(
servo_restyle_damage="rebuild_and_reflow", servo_restyle_damage="rebuild_and_reflow",
)} )}
${helpers.single_keyword_system("font-kerning", ${helpers.single_keyword_system(
"auto none normal", "font-kerning",
products="gecko", "auto none normal",
gecko_ffi_name="mFont.kerning", products="gecko",
gecko_constant_prefix="NS_FONT_KERNING", gecko_ffi_name="mFont.kerning",
spec="https://drafts.csswg.org/css-fonts/#propdef-font-kerning", gecko_constant_prefix="NS_FONT_KERNING",
flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER", spec="https://drafts.csswg.org/css-fonts/#propdef-font-kerning",
animation_value_type="discrete")} flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER",
animation_value_type="discrete",
)}
${helpers.predefined_type("font-variant-alternates", ${helpers.predefined_type(
"FontVariantAlternates", "font-variant-alternates",
products="gecko", "FontVariantAlternates",
initial_value="computed::FontVariantAlternates::get_initial_value()", products="gecko",
initial_specified_value="specified::FontVariantAlternates::get_initial_specified_value()", initial_value="computed::FontVariantAlternates::get_initial_value()",
animation_value_type="discrete", initial_specified_value="specified::FontVariantAlternates::get_initial_specified_value()",
flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER", animation_value_type="discrete",
spec="https://drafts.csswg.org/css-fonts/#propdef-font-variant-alternates")} flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER",
spec="https://drafts.csswg.org/css-fonts/#propdef-font-variant-alternates",
)}
${helpers.predefined_type("font-variant-east-asian", ${helpers.predefined_type(
"FontVariantEastAsian", "font-variant-east-asian",
products="gecko", "FontVariantEastAsian",
initial_value="computed::FontVariantEastAsian::empty()", products="gecko",
initial_specified_value="specified::FontVariantEastAsian::empty()", initial_value="computed::FontVariantEastAsian::empty()",
animation_value_type="discrete", initial_specified_value="specified::FontVariantEastAsian::empty()",
flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER", animation_value_type="discrete",
spec="https://drafts.csswg.org/css-fonts/#propdef-font-variant-east-asian")} flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER",
spec="https://drafts.csswg.org/css-fonts/#propdef-font-variant-east-asian",
)}
${helpers.predefined_type("font-variant-ligatures", ${helpers.predefined_type(
"FontVariantLigatures", "font-variant-ligatures",
products="gecko", "FontVariantLigatures",
initial_value="computed::FontVariantLigatures::empty()", products="gecko",
initial_specified_value="specified::FontVariantLigatures::empty()", initial_value="computed::FontVariantLigatures::empty()",
animation_value_type="discrete", initial_specified_value="specified::FontVariantLigatures::empty()",
flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER", animation_value_type="discrete",
spec="https://drafts.csswg.org/css-fonts/#propdef-font-variant-ligatures")} flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER",
spec="https://drafts.csswg.org/css-fonts/#propdef-font-variant-ligatures",
)}
${helpers.predefined_type("font-variant-numeric", ${helpers.predefined_type(
"FontVariantNumeric", "font-variant-numeric",
products="gecko", "FontVariantNumeric",
initial_value="computed::FontVariantNumeric::empty()", products="gecko",
initial_specified_value="specified::FontVariantNumeric::empty()", initial_value="computed::FontVariantNumeric::empty()",
animation_value_type="discrete", initial_specified_value="specified::FontVariantNumeric::empty()",
flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER", animation_value_type="discrete",
spec="https://drafts.csswg.org/css-fonts/#propdef-font-variant-numeric")} flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER",
spec="https://drafts.csswg.org/css-fonts/#propdef-font-variant-numeric",
)}
${helpers.single_keyword_system("font-variant-position", ${helpers.single_keyword_system(
"normal sub super", "font-variant-position",
products="gecko", "normal sub super",
gecko_ffi_name="mFont.variantPosition", products="gecko",
gecko_constant_prefix="NS_FONT_VARIANT_POSITION", gecko_ffi_name="mFont.variantPosition",
spec="https://drafts.csswg.org/css-fonts/#propdef-font-variant-position", gecko_constant_prefix="NS_FONT_VARIANT_POSITION",
flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER", spec="https://drafts.csswg.org/css-fonts/#propdef-font-variant-position",
animation_value_type="discrete")} flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER",
animation_value_type="discrete",
)}
${helpers.predefined_type("font-feature-settings", ${helpers.predefined_type(
"FontFeatureSettings", "font-feature-settings",
products="gecko", "FontFeatureSettings",
initial_value="computed::FontFeatureSettings::normal()", products="gecko",
initial_specified_value="specified::FontFeatureSettings::normal()", initial_value="computed::FontFeatureSettings::normal()",
extra_prefixes="moz:layout.css.prefixes.font-features", initial_specified_value="specified::FontFeatureSettings::normal()",
animation_value_type="discrete", extra_prefixes="moz:layout.css.prefixes.font-features",
flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER", animation_value_type="discrete",
spec="https://drafts.csswg.org/css-fonts/#propdef-font-feature-settings")} flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER",
spec="https://drafts.csswg.org/css-fonts/#propdef-font-feature-settings",
)}
<% <%
# This spec link is too long to fit elsewhere # This spec link is too long to fit elsewhere
@ -163,100 +187,120 @@ https://drafts.csswg.org/css-fonts-4/#low-level-font-variation-settings-control-
""" """
%> %>
${helpers.predefined_type("font-variation-settings", ${helpers.predefined_type(
"FontVariationSettings", "font-variation-settings",
products="gecko", "FontVariationSettings",
gecko_pref="layout.css.font-variations.enabled", products="gecko",
initial_value="computed::FontVariationSettings::normal()", gecko_pref="layout.css.font-variations.enabled",
initial_specified_value="specified::FontVariationSettings::normal()", initial_value="computed::FontVariationSettings::normal()",
animation_value_type="ComputedValue", initial_specified_value="specified::FontVariationSettings::normal()",
flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER", animation_value_type="ComputedValue",
spec="${variation_spec}")} flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER",
spec="${variation_spec}",
)}
${helpers.predefined_type("font-language-override", ${helpers.predefined_type(
"FontLanguageOverride", "font-language-override",
products="gecko", "FontLanguageOverride",
initial_value="computed::FontLanguageOverride::zero()", products="gecko",
initial_specified_value="specified::FontLanguageOverride::normal()", initial_value="computed::FontLanguageOverride::zero()",
animation_value_type="discrete", initial_specified_value="specified::FontLanguageOverride::normal()",
extra_prefixes="moz:layout.css.prefixes.font-features", animation_value_type="discrete",
flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER", extra_prefixes="moz:layout.css.prefixes.font-features",
spec="https://drafts.csswg.org/css-fonts-3/#propdef-font-language-override")} flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER",
spec="https://drafts.csswg.org/css-fonts-3/#propdef-font-language-override",
)}
${helpers.single_keyword_system("font-optical-sizing", ${helpers.single_keyword_system(
"auto none", "font-optical-sizing",
products="gecko", "auto none",
gecko_pref="layout.css.font-variations.enabled", products="gecko",
gecko_ffi_name="mFont.opticalSizing", gecko_pref="layout.css.font-variations.enabled",
gecko_constant_prefix="NS_FONT_OPTICAL_SIZING", gecko_ffi_name="mFont.opticalSizing",
animation_value_type="discrete", gecko_constant_prefix="NS_FONT_OPTICAL_SIZING",
flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER", animation_value_type="discrete",
spec="https://www.w3.org/TR/css-fonts-4/#font-optical-sizing-def")} flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER",
spec="https://www.w3.org/TR/css-fonts-4/#font-optical-sizing-def",
)}
${helpers.predefined_type("-x-lang", ${helpers.predefined_type(
"XLang", "-x-lang",
products="gecko", "XLang",
initial_value="computed::XLang::get_initial_value()", products="gecko",
animation_value_type="none", initial_value="computed::XLang::get_initial_value()",
enabled_in="", animation_value_type="none",
spec="Internal (not web-exposed)")} enabled_in="",
spec="Internal (not web-exposed)",
)}
${helpers.predefined_type("-moz-script-size-multiplier", ${helpers.predefined_type(
"MozScriptSizeMultiplier", "-moz-script-size-multiplier",
products="gecko", "MozScriptSizeMultiplier",
initial_value="computed::MozScriptSizeMultiplier::get_initial_value()", products="gecko",
animation_value_type="none", initial_value="computed::MozScriptSizeMultiplier::get_initial_value()",
gecko_ffi_name="mScriptSizeMultiplier", animation_value_type="none",
enabled_in="", gecko_ffi_name="mScriptSizeMultiplier",
spec="Internal (not web-exposed)")} enabled_in="",
spec="Internal (not web-exposed)",
)}
${helpers.predefined_type("-moz-script-level", ${helpers.predefined_type(
"MozScriptLevel", "-moz-script-level",
0, "MozScriptLevel",
animation_value_type="none", 0,
products="gecko", animation_value_type="none",
enabled_in="ua", products="gecko",
gecko_ffi_name="mScriptLevel", enabled_in="ua",
spec="Internal (not web-exposed)")} gecko_ffi_name="mScriptLevel",
spec="Internal (not web-exposed)",
)}
${helpers.single_keyword("-moz-math-display", ${helpers.single_keyword(
"inline block", "-moz-math-display",
gecko_constant_prefix="NS_MATHML_DISPLAYSTYLE", "inline block",
gecko_ffi_name="mMathDisplay", gecko_constant_prefix="NS_MATHML_DISPLAYSTYLE",
products="gecko", gecko_ffi_name="mMathDisplay",
enabled_in="ua", products="gecko",
spec="Internal (not web-exposed)", enabled_in="ua",
animation_value_type="none")} spec="Internal (not web-exposed)",
animation_value_type="none",
)}
${helpers.single_keyword("-moz-math-variant", ${helpers.single_keyword(
"""none normal bold italic bold-italic script bold-script "-moz-math-variant",
fraktur double-struck bold-fraktur sans-serif """none normal bold italic bold-italic script bold-script
bold-sans-serif sans-serif-italic sans-serif-bold-italic fraktur double-struck bold-fraktur sans-serif
monospace initial tailed looped stretched""", bold-sans-serif sans-serif-italic sans-serif-bold-italic
gecko_constant_prefix="NS_MATHML_MATHVARIANT", monospace initial tailed looped stretched""",
gecko_ffi_name="mMathVariant", gecko_constant_prefix="NS_MATHML_MATHVARIANT",
products="gecko", gecko_ffi_name="mMathVariant",
spec="Internal (not web-exposed)", products="gecko",
animation_value_type="none", spec="Internal (not web-exposed)",
enabled_in="", animation_value_type="none",
needs_conversion=True)} enabled_in="",
needs_conversion=True,
)}
${helpers.predefined_type("-moz-script-min-size", ${helpers.predefined_type(
"MozScriptMinSize", "-moz-script-min-size",
"specified::MozScriptMinSize::get_initial_value()", "MozScriptMinSize",
animation_value_type="none", "specified::MozScriptMinSize::get_initial_value()",
products="gecko", animation_value_type="none",
enabled_in="", products="gecko",
gecko_ffi_name="mScriptMinSize", enabled_in="",
spec="Internal (not web-exposed)")} gecko_ffi_name="mScriptMinSize",
spec="Internal (not web-exposed)",
)}
${helpers.predefined_type("-x-text-zoom", ${helpers.predefined_type(
"XTextZoom", "-x-text-zoom",
"computed::XTextZoom(true)", "XTextZoom",
animation_value_type="none", "computed::XTextZoom(true)",
products="gecko", animation_value_type="none",
enabled_in="", products="gecko",
spec="Internal (not web-exposed)")} enabled_in="",
spec="Internal (not web-exposed)",
)}
% if product == "gecko": % if product == "gecko":
pub mod system_font { pub mod system_font {
@ -462,29 +506,35 @@ ${helpers.predefined_type("-x-text-zoom",
} }
% endif % endif
${helpers.single_keyword("-moz-osx-font-smoothing", ${helpers.single_keyword(
"auto grayscale", "-moz-osx-font-smoothing",
gecko_constant_prefix="NS_FONT_SMOOTHING", "auto grayscale",
gecko_ffi_name="mFont.smoothing", gecko_constant_prefix="NS_FONT_SMOOTHING",
gecko_pref="layout.css.osx-font-smoothing.enabled", gecko_ffi_name="mFont.smoothing",
products="gecko", gecko_pref="layout.css.osx-font-smoothing.enabled",
spec="Nonstandard (https://developer.mozilla.org/en-US/docs/Web/CSS/font-smooth)", products="gecko",
flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER", spec="Nonstandard (https://developer.mozilla.org/en-US/docs/Web/CSS/font-smooth)",
animation_value_type="discrete")} flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER",
animation_value_type="discrete",
)}
${helpers.predefined_type("-moz-font-smoothing-background-color", ${helpers.predefined_type(
"RGBAColor", "-moz-font-smoothing-background-color",
"RGBA::transparent()", "RGBAColor",
animation_value_type="AnimatedRGBA", "RGBA::transparent()",
products="gecko", animation_value_type="AnimatedRGBA",
gecko_ffi_name="mFont.fontSmoothingBackgroundColor", products="gecko",
enabled_in="chrome", gecko_ffi_name="mFont.fontSmoothingBackgroundColor",
spec="None (Nonstandard internal property)")} enabled_in="chrome",
spec="None (Nonstandard internal property)",
)}
${helpers.predefined_type("-moz-min-font-size-ratio", ${helpers.predefined_type(
"Percentage", "-moz-min-font-size-ratio",
"computed::Percentage::hundred()", "Percentage",
animation_value_type="none", "computed::Percentage::hundred()",
products="gecko", animation_value_type="none",
enabled_in="ua", products="gecko",
spec="Nonstandard (Internal-only)")} enabled_in="ua",
spec="Nonstandard (Internal-only)",
)}

View file

@ -7,57 +7,74 @@
<% data.new_style_struct("InheritedBox", inherited=True, gecko_name="Visibility") %> <% data.new_style_struct("InheritedBox", inherited=True, gecko_name="Visibility") %>
// TODO: collapse. Well, do tables first. // TODO: collapse. Well, do tables first.
${helpers.single_keyword("visibility", ${helpers.single_keyword(
"visible hidden", "visibility",
extra_gecko_values="collapse", "visible hidden",
gecko_ffi_name="mVisible", extra_gecko_values="collapse",
animation_value_type="ComputedValue", gecko_ffi_name="mVisible",
spec="https://drafts.csswg.org/css-box/#propdef-visibility")} animation_value_type="ComputedValue",
spec="https://drafts.csswg.org/css-box/#propdef-visibility",
)}
// CSS Writing Modes Level 3 // CSS Writing Modes Level 3
// https://drafts.csswg.org/css-writing-modes-3 // https://drafts.csswg.org/css-writing-modes-3
${helpers.single_keyword("writing-mode", ${helpers.single_keyword(
"horizontal-tb vertical-rl vertical-lr", "writing-mode",
extra_gecko_values="sideways-rl sideways-lr", "horizontal-tb vertical-rl vertical-lr",
extra_gecko_aliases="lr=horizontal-tb lr-tb=horizontal-tb \ extra_gecko_values="sideways-rl sideways-lr",
rl=horizontal-tb rl-tb=horizontal-tb \ extra_gecko_aliases="lr=horizontal-tb lr-tb=horizontal-tb \
tb=vertical-rl tb-rl=vertical-rl", rl=horizontal-tb rl-tb=horizontal-tb \
servo_pref="layout.writing-mode.enabled", tb=vertical-rl tb-rl=vertical-rl",
animation_value_type="discrete", servo_pref="layout.writing-mode.enabled",
spec="https://drafts.csswg.org/css-writing-modes/#propdef-writing-mode", animation_value_type="none",
servo_restyle_damage="rebuild_and_reflow")} spec="https://drafts.csswg.org/css-writing-modes/#propdef-writing-mode",
servo_restyle_damage="rebuild_and_reflow",
)}
${helpers.single_keyword("direction", "ltr rtl", animation_value_type="discrete", ${helpers.single_keyword(
spec="https://drafts.csswg.org/css-writing-modes/#propdef-direction", "direction",
needs_conversion=True, "ltr rtl",
servo_restyle_damage="rebuild_and_reflow")} animation_value_type="none",
spec="https://drafts.csswg.org/css-writing-modes/#propdef-direction",
needs_conversion=True,
servo_restyle_damage="rebuild_and_reflow",
)}
${helpers.single_keyword("text-orientation", // TODO(emilio): Should text-orientation be non-animatable? It affects the
"mixed upright sideways", // WritingMode value, but not the logical -> physical mapping of properties,
extra_gecko_aliases="sideways-right=sideways", // which is the reason direction / writing-mode are non-animatable.
products="gecko", ${helpers.single_keyword(
animation_value_type="discrete", "text-orientation",
spec="https://drafts.csswg.org/css-writing-modes/#propdef-text-orientation")} "mixed upright sideways",
extra_gecko_aliases="sideways-right=sideways",
products="gecko",
animation_value_type="discrete",
spec="https://drafts.csswg.org/css-writing-modes/#propdef-text-orientation",
)}
// CSS Color Module Level 4 // CSS Color Module Level 4
// https://drafts.csswg.org/css-color/ // https://drafts.csswg.org/css-color/
${helpers.single_keyword("color-adjust", ${helpers.single_keyword(
"economy exact", products="gecko", "color-adjust",
gecko_pref="layout.css.color-adjust.enabled", "economy exact", products="gecko",
animation_value_type="discrete", gecko_pref="layout.css.color-adjust.enabled",
spec="https://drafts.csswg.org/css-color/#propdef-color-adjust")} animation_value_type="discrete",
spec="https://drafts.csswg.org/css-color/#propdef-color-adjust",
)}
<% image_rendering_custom_consts = { "crisp-edges": "CRISPEDGES", <% image_rendering_custom_consts = { "crisp-edges": "CRISPEDGES",
"-moz-crisp-edges": "CRISPEDGES" } %> "-moz-crisp-edges": "CRISPEDGES" } %>
// According to to CSS-IMAGES-3, `optimizespeed` and `optimizequality` are synonyms for `auto` // According to to CSS-IMAGES-3, `optimizespeed` and `optimizequality` are synonyms for `auto`
// And, firefox doesn't support `pixelated` yet (https://bugzilla.mozilla.org/show_bug.cgi?id=856337) // And, firefox doesn't support `pixelated` yet (https://bugzilla.mozilla.org/show_bug.cgi?id=856337)
${helpers.single_keyword("image-rendering", ${helpers.single_keyword(
"auto", "image-rendering",
extra_gecko_values="optimizespeed optimizequality -moz-crisp-edges", "auto",
extra_servo_values="pixelated crisp-edges", extra_gecko_values="optimizespeed optimizequality -moz-crisp-edges",
custom_consts=image_rendering_custom_consts, extra_servo_values="pixelated crisp-edges",
animation_value_type="discrete", custom_consts=image_rendering_custom_consts,
spec="https://drafts.csswg.org/css-images/#propdef-image-rendering")} animation_value_type="discrete",
spec="https://drafts.csswg.org/css-images/#propdef-image-rendering",
)}
${helpers.predefined_type("image-orientation", ${helpers.predefined_type("image-orientation",
"ImageOrientation", "ImageOrientation",

View file

@ -35,7 +35,7 @@ use logical_geometry::WritingMode;
#[cfg(feature = "gecko")] use malloc_size_of::{MallocSizeOf, MallocSizeOfOps}; #[cfg(feature = "gecko")] use malloc_size_of::{MallocSizeOf, MallocSizeOfOps};
use media_queries::Device; use media_queries::Device;
use parser::ParserContext; use parser::ParserContext;
#[cfg(feature = "gecko")] use properties::longhands::system_font::SystemFont; use properties::longhands::system_font::SystemFont;
use rule_cache::{RuleCache, RuleCacheConditions}; use rule_cache::{RuleCache, RuleCacheConditions};
use selector_parser::PseudoElement; use selector_parser::PseudoElement;
use selectors::parser::SelectorParseErrorKind; use selectors::parser::SelectorParseErrorKind;
@ -946,25 +946,17 @@ impl LonghandId {
} }
/// Returns whether this property is animatable. /// Returns whether this property is animatable.
#[inline]
pub fn is_animatable(self) -> bool { pub fn is_animatable(self) -> bool {
match self { ${static_longhand_id_set("ANIMATABLE", lambda p: p.animatable)}
% for property in data.longhands: ANIMATABLE.contains(self)
LonghandId::${property.camel_case} => {
${str(property.animatable).lower()}
}
% endfor
}
} }
/// Returns whether this property is animatable in a discrete way. /// Returns whether this property is animatable in a discrete way.
#[inline]
pub fn is_discrete_animatable(self) -> bool { pub fn is_discrete_animatable(self) -> bool {
match self { ${static_longhand_id_set("DISCRETE_ANIMATABLE", lambda p: p.animation_value_type == "discrete")}
% for property in data.longhands: DISCRETE_ANIMATABLE.contains(self)
LonghandId::${property.camel_case} => {
${str(property.animation_value_type == "discrete").lower()}
}
% endfor
}
} }
/// Converts from a LonghandId to an adequate nsCSSPropertyID. /// Converts from a LonghandId to an adequate nsCSSPropertyID.
@ -985,20 +977,30 @@ impl LonghandId {
} }
} }
/// If this is a logical property, return the corresponding physical one in the given writing mode. /// Return whether this property is logical.
#[inline]
pub fn is_logical(&self) -> bool {
${static_longhand_id_set("LOGICAL", lambda p: p.logical)}
LOGICAL.contains(*self)
}
/// If this is a logical property, return the corresponding physical one in
/// the given writing mode.
///
/// Otherwise, return unchanged. /// Otherwise, return unchanged.
#[inline]
pub fn to_physical(&self, wm: WritingMode) -> Self { pub fn to_physical(&self, wm: WritingMode) -> Self {
match *self { match *self {
% for property in data.longhands: % for property in data.longhands:
% if property.logical: % if property.logical:
LonghandId::${property.camel_case} => { LonghandId::${property.camel_case} => {
<%helpers:logical_setter_helper name="${property.name}"> <%helpers:logical_setter_helper name="${property.name}">
<%def name="inner(physical_ident)"> <%def name="inner(physical_ident)">
LonghandId::${to_camel_case(physical_ident)} LonghandId::${to_camel_case(physical_ident)}
</%def> </%def>
</%helpers:logical_setter_helper> </%helpers:logical_setter_helper>
} }
% endif % endif
% endfor % endfor
_ => *self _ => *self
} }
@ -1488,7 +1490,7 @@ impl UnparsedValue {
PropertyDeclaration::CSSWideKeyword(WideKeywordDeclaration { PropertyDeclaration::CSSWideKeyword(WideKeywordDeclaration {
id: longhand_id, id: longhand_id,
keyword, keyword,
}) })
}) })
} }
} }
@ -1937,14 +1939,15 @@ impl PropertyDeclaration {
} }
/// Returns whether or not the property is set by a system font /// Returns whether or not the property is set by a system font
#[cfg(feature = "gecko")]
pub fn get_system(&self) -> Option<SystemFont> { pub fn get_system(&self) -> Option<SystemFont> {
match *self { match *self {
% if product == "gecko":
% for prop in SYSTEM_FONT_LONGHANDS: % for prop in SYSTEM_FONT_LONGHANDS:
PropertyDeclaration::${to_camel_case(prop)}(ref prop) => { PropertyDeclaration::${to_camel_case(prop)}(ref prop) => {
prop.get_system() prop.get_system()
} }
% endfor % endfor
% endif
_ => None, _ => None,
} }
} }
@ -1957,12 +1960,6 @@ impl PropertyDeclaration {
} }
} }
#[cfg(feature = "servo")]
/// Dummy method to avoid cfg()s
pub fn get_system(&self) -> Option<()> {
None
}
/// Returns whether the declaration may be serialized as part of a shorthand. /// Returns whether the declaration may be serialized as part of a shorthand.
/// ///
/// This method returns false if this declaration contains variable or has a /// This method returns false if this declaration contains variable or has a
@ -2615,6 +2612,22 @@ impl ComputedValues {
self.custom_properties.as_ref() self.custom_properties.as_ref()
} }
% for prop in data.longhands:
/// Gets the computed value of a given property.
#[inline(always)]
#[allow(non_snake_case)]
pub fn clone_${prop.ident}(
&self,
) -> longhands::${prop.ident}::computed_value::T {
self.get_${prop.style_struct.ident.strip("_")}()
% if prop.logical:
.clone_${prop.ident}(self.writing_mode)
% else:
.clone_${prop.ident}()
% endif
}
% endfor
/// Writes the value of the given longhand as a string in `dest`. /// Writes the value of the given longhand as a string in `dest`.
/// ///
/// Note that the value will usually be the computed value, except for /// Note that the value will usually be the computed value, except for
@ -2635,20 +2648,10 @@ impl ComputedValues {
match property_id { match property_id {
% for prop in data.longhands: % for prop in data.longhands:
LonghandId::${prop.camel_case} => { LonghandId::${prop.camel_case} => {
let style_struct = let value = self.clone_${prop.ident}();
self.get_${prop.style_struct.ident.strip("_")}();
let value =
style_struct
% if prop.logical:
.clone_${prop.ident}(self.writing_mode);
% else:
.clone_${prop.ident}();
% endif
% if prop.predefined_type == "Color": % if prop.predefined_type == "Color":
let value = self.resolve_color(value); let value = self.resolve_color(value);
% endif % endif
value.to_css(dest) value.to_css(dest)
} }
% endfor % endfor