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(
"font-family",
"FontFamily", "FontFamily",
initial_value="computed::FontFamily::serif()", initial_value="computed::FontFamily::serif()",
animation_value_type="discrete", animation_value_type="discrete",
flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER", flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER",
spec="https://drafts.csswg.org/css-fonts/#propdef-font-family", spec="https://drafts.csswg.org/css-fonts/#propdef-font-family",
servo_restyle_damage="rebuild_and_reflow")} servo_restyle_damage="rebuild_and_reflow",
)}
${helpers.predefined_type( ${helpers.predefined_type(
"font-style", "font-style",
@ -32,7 +34,8 @@ ${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(
"font-variant-caps",
"normal small-caps", "normal small-caps",
extra_gecko_values="all-small-caps petite-caps all-petite-caps unicase titling-caps", extra_gecko_values="all-small-caps petite-caps all-petite-caps unicase titling-caps",
gecko_constant_prefix="NS_FONT_VARIANT_CAPS", gecko_constant_prefix="NS_FONT_VARIANT_CAPS",
@ -41,7 +44,8 @@ ${helpers.single_keyword_system("font-variant-caps",
custom_consts=font_variant_caps_custom_consts, custom_consts=font_variant_caps_custom_consts,
flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER", flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER",
animation_value_type="discrete", animation_value_type="discrete",
servo_restyle_damage="rebuild_and_reflow")} servo_restyle_damage="rebuild_and_reflow",
)}
${helpers.predefined_type( ${helpers.predefined_type(
"font-weight", "font-weight",
@ -54,7 +58,8 @@ ${helpers.predefined_type(
servo_restyle_damage="rebuild_and_reflow", servo_restyle_damage="rebuild_and_reflow",
)} )}
${helpers.predefined_type("font-size", ${helpers.predefined_type(
"font-size",
"FontSize", "FontSize",
initial_value="computed::FontSize::medium()", initial_value="computed::FontSize::medium()",
initial_specified_value="specified::FontSize::medium()", initial_specified_value="specified::FontSize::medium()",
@ -62,24 +67,29 @@ ${helpers.predefined_type("font-size",
allow_quirks=True, allow_quirks=True,
flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER", flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER",
spec="https://drafts.csswg.org/css-fonts/#propdef-font-size", spec="https://drafts.csswg.org/css-fonts/#propdef-font-size",
servo_restyle_damage="rebuild_and_reflow")} servo_restyle_damage="rebuild_and_reflow",
)}
${helpers.predefined_type("font-size-adjust", ${helpers.predefined_type(
"font-size-adjust",
"FontSizeAdjust", "FontSizeAdjust",
products="gecko", products="gecko",
initial_value="computed::FontSizeAdjust::none()", initial_value="computed::FontSizeAdjust::none()",
initial_specified_value="specified::FontSizeAdjust::none()", initial_specified_value="specified::FontSizeAdjust::none()",
animation_value_type="ComputedValue", animation_value_type="ComputedValue",
flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER", flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER",
spec="https://drafts.csswg.org/css-fonts/#propdef-font-size-adjust")} spec="https://drafts.csswg.org/css-fonts/#propdef-font-size-adjust",
)}
${helpers.predefined_type("font-synthesis", ${helpers.predefined_type(
"font-synthesis",
"FontSynthesis", "FontSynthesis",
products="gecko", products="gecko",
initial_value="specified::FontSynthesis::get_initial_value()", initial_value="specified::FontSynthesis::get_initial_value()",
animation_value_type="discrete", animation_value_type="discrete",
flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER", flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER",
spec="https://drafts.csswg.org/css-fonts/#propdef-font-synthesis")} spec="https://drafts.csswg.org/css-fonts/#propdef-font-synthesis",
)}
${helpers.predefined_type( ${helpers.predefined_type(
"font-stretch", "font-stretch",
@ -92,61 +102,74 @@ ${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(
"font-kerning",
"auto none normal", "auto none normal",
products="gecko", products="gecko",
gecko_ffi_name="mFont.kerning", gecko_ffi_name="mFont.kerning",
gecko_constant_prefix="NS_FONT_KERNING", gecko_constant_prefix="NS_FONT_KERNING",
spec="https://drafts.csswg.org/css-fonts/#propdef-font-kerning", spec="https://drafts.csswg.org/css-fonts/#propdef-font-kerning",
flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER", flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER",
animation_value_type="discrete")} animation_value_type="discrete",
)}
${helpers.predefined_type("font-variant-alternates", ${helpers.predefined_type(
"font-variant-alternates",
"FontVariantAlternates", "FontVariantAlternates",
products="gecko", products="gecko",
initial_value="computed::FontVariantAlternates::get_initial_value()", initial_value="computed::FontVariantAlternates::get_initial_value()",
initial_specified_value="specified::FontVariantAlternates::get_initial_specified_value()", initial_specified_value="specified::FontVariantAlternates::get_initial_specified_value()",
animation_value_type="discrete", animation_value_type="discrete",
flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER", flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER",
spec="https://drafts.csswg.org/css-fonts/#propdef-font-variant-alternates")} spec="https://drafts.csswg.org/css-fonts/#propdef-font-variant-alternates",
)}
${helpers.predefined_type("font-variant-east-asian", ${helpers.predefined_type(
"font-variant-east-asian",
"FontVariantEastAsian", "FontVariantEastAsian",
products="gecko", products="gecko",
initial_value="computed::FontVariantEastAsian::empty()", initial_value="computed::FontVariantEastAsian::empty()",
initial_specified_value="specified::FontVariantEastAsian::empty()", initial_specified_value="specified::FontVariantEastAsian::empty()",
animation_value_type="discrete", animation_value_type="discrete",
flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER", flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER",
spec="https://drafts.csswg.org/css-fonts/#propdef-font-variant-east-asian")} spec="https://drafts.csswg.org/css-fonts/#propdef-font-variant-east-asian",
)}
${helpers.predefined_type("font-variant-ligatures", ${helpers.predefined_type(
"font-variant-ligatures",
"FontVariantLigatures", "FontVariantLigatures",
products="gecko", products="gecko",
initial_value="computed::FontVariantLigatures::empty()", initial_value="computed::FontVariantLigatures::empty()",
initial_specified_value="specified::FontVariantLigatures::empty()", initial_specified_value="specified::FontVariantLigatures::empty()",
animation_value_type="discrete", animation_value_type="discrete",
flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER", flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER",
spec="https://drafts.csswg.org/css-fonts/#propdef-font-variant-ligatures")} spec="https://drafts.csswg.org/css-fonts/#propdef-font-variant-ligatures",
)}
${helpers.predefined_type("font-variant-numeric", ${helpers.predefined_type(
"font-variant-numeric",
"FontVariantNumeric", "FontVariantNumeric",
products="gecko", products="gecko",
initial_value="computed::FontVariantNumeric::empty()", initial_value="computed::FontVariantNumeric::empty()",
initial_specified_value="specified::FontVariantNumeric::empty()", initial_specified_value="specified::FontVariantNumeric::empty()",
animation_value_type="discrete", animation_value_type="discrete",
flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER", flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER",
spec="https://drafts.csswg.org/css-fonts/#propdef-font-variant-numeric")} spec="https://drafts.csswg.org/css-fonts/#propdef-font-variant-numeric",
)}
${helpers.single_keyword_system("font-variant-position", ${helpers.single_keyword_system(
"font-variant-position",
"normal sub super", "normal sub super",
products="gecko", products="gecko",
gecko_ffi_name="mFont.variantPosition", gecko_ffi_name="mFont.variantPosition",
gecko_constant_prefix="NS_FONT_VARIANT_POSITION", gecko_constant_prefix="NS_FONT_VARIANT_POSITION",
spec="https://drafts.csswg.org/css-fonts/#propdef-font-variant-position", spec="https://drafts.csswg.org/css-fonts/#propdef-font-variant-position",
flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER", flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER",
animation_value_type="discrete")} animation_value_type="discrete",
)}
${helpers.predefined_type("font-feature-settings", ${helpers.predefined_type(
"font-feature-settings",
"FontFeatureSettings", "FontFeatureSettings",
products="gecko", products="gecko",
initial_value="computed::FontFeatureSettings::normal()", initial_value="computed::FontFeatureSettings::normal()",
@ -154,7 +177,8 @@ ${helpers.predefined_type("font-feature-settings",
extra_prefixes="moz:layout.css.prefixes.font-features", extra_prefixes="moz:layout.css.prefixes.font-features",
animation_value_type="discrete", animation_value_type="discrete",
flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER", flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER",
spec="https://drafts.csswg.org/css-fonts/#propdef-font-feature-settings")} 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,7 +187,8 @@ https://drafts.csswg.org/css-fonts-4/#low-level-font-variation-settings-control-
""" """
%> %>
${helpers.predefined_type("font-variation-settings", ${helpers.predefined_type(
"font-variation-settings",
"FontVariationSettings", "FontVariationSettings",
products="gecko", products="gecko",
gecko_pref="layout.css.font-variations.enabled", gecko_pref="layout.css.font-variations.enabled",
@ -171,9 +196,11 @@ ${helpers.predefined_type("font-variation-settings",
initial_specified_value="specified::FontVariationSettings::normal()", initial_specified_value="specified::FontVariationSettings::normal()",
animation_value_type="ComputedValue", animation_value_type="ComputedValue",
flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER", flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER",
spec="${variation_spec}")} spec="${variation_spec}",
)}
${helpers.predefined_type("font-language-override", ${helpers.predefined_type(
"font-language-override",
"FontLanguageOverride", "FontLanguageOverride",
products="gecko", products="gecko",
initial_value="computed::FontLanguageOverride::zero()", initial_value="computed::FontLanguageOverride::zero()",
@ -181,9 +208,11 @@ ${helpers.predefined_type("font-language-override",
animation_value_type="discrete", animation_value_type="discrete",
extra_prefixes="moz:layout.css.prefixes.font-features", extra_prefixes="moz:layout.css.prefixes.font-features",
flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER", flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER",
spec="https://drafts.csswg.org/css-fonts-3/#propdef-font-language-override")} spec="https://drafts.csswg.org/css-fonts-3/#propdef-font-language-override",
)}
${helpers.single_keyword_system("font-optical-sizing", ${helpers.single_keyword_system(
"font-optical-sizing",
"auto none", "auto none",
products="gecko", products="gecko",
gecko_pref="layout.css.font-variations.enabled", gecko_pref="layout.css.font-variations.enabled",
@ -191,44 +220,54 @@ ${helpers.single_keyword_system("font-optical-sizing",
gecko_constant_prefix="NS_FONT_OPTICAL_SIZING", gecko_constant_prefix="NS_FONT_OPTICAL_SIZING",
animation_value_type="discrete", animation_value_type="discrete",
flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER", 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")} spec="https://www.w3.org/TR/css-fonts-4/#font-optical-sizing-def",
)}
${helpers.predefined_type("-x-lang", ${helpers.predefined_type(
"-x-lang",
"XLang", "XLang",
products="gecko", products="gecko",
initial_value="computed::XLang::get_initial_value()", initial_value="computed::XLang::get_initial_value()",
animation_value_type="none", animation_value_type="none",
enabled_in="", enabled_in="",
spec="Internal (not web-exposed)")} spec="Internal (not web-exposed)",
)}
${helpers.predefined_type("-moz-script-size-multiplier", ${helpers.predefined_type(
"-moz-script-size-multiplier",
"MozScriptSizeMultiplier", "MozScriptSizeMultiplier",
products="gecko", products="gecko",
initial_value="computed::MozScriptSizeMultiplier::get_initial_value()", initial_value="computed::MozScriptSizeMultiplier::get_initial_value()",
animation_value_type="none", animation_value_type="none",
gecko_ffi_name="mScriptSizeMultiplier", gecko_ffi_name="mScriptSizeMultiplier",
enabled_in="", enabled_in="",
spec="Internal (not web-exposed)")} spec="Internal (not web-exposed)",
)}
${helpers.predefined_type("-moz-script-level", ${helpers.predefined_type(
"-moz-script-level",
"MozScriptLevel", "MozScriptLevel",
0, 0,
animation_value_type="none", animation_value_type="none",
products="gecko", products="gecko",
enabled_in="ua", enabled_in="ua",
gecko_ffi_name="mScriptLevel", gecko_ffi_name="mScriptLevel",
spec="Internal (not web-exposed)")} spec="Internal (not web-exposed)",
)}
${helpers.single_keyword("-moz-math-display", ${helpers.single_keyword(
"-moz-math-display",
"inline block", "inline block",
gecko_constant_prefix="NS_MATHML_DISPLAYSTYLE", gecko_constant_prefix="NS_MATHML_DISPLAYSTYLE",
gecko_ffi_name="mMathDisplay", gecko_ffi_name="mMathDisplay",
products="gecko", products="gecko",
enabled_in="ua", enabled_in="ua",
spec="Internal (not web-exposed)", spec="Internal (not web-exposed)",
animation_value_type="none")} animation_value_type="none",
)}
${helpers.single_keyword("-moz-math-variant", ${helpers.single_keyword(
"-moz-math-variant",
"""none normal bold italic bold-italic script bold-script """none normal bold italic bold-italic script bold-script
fraktur double-struck bold-fraktur sans-serif fraktur double-struck bold-fraktur sans-serif
bold-sans-serif sans-serif-italic sans-serif-bold-italic bold-sans-serif sans-serif-italic sans-serif-bold-italic
@ -239,24 +278,29 @@ ${helpers.single_keyword("-moz-math-variant",
spec="Internal (not web-exposed)", spec="Internal (not web-exposed)",
animation_value_type="none", animation_value_type="none",
enabled_in="", enabled_in="",
needs_conversion=True)} needs_conversion=True,
)}
${helpers.predefined_type("-moz-script-min-size", ${helpers.predefined_type(
"-moz-script-min-size",
"MozScriptMinSize", "MozScriptMinSize",
"specified::MozScriptMinSize::get_initial_value()", "specified::MozScriptMinSize::get_initial_value()",
animation_value_type="none", animation_value_type="none",
products="gecko", products="gecko",
enabled_in="", enabled_in="",
gecko_ffi_name="mScriptMinSize", gecko_ffi_name="mScriptMinSize",
spec="Internal (not web-exposed)")} spec="Internal (not web-exposed)",
)}
${helpers.predefined_type("-x-text-zoom", ${helpers.predefined_type(
"-x-text-zoom",
"XTextZoom", "XTextZoom",
"computed::XTextZoom(true)", "computed::XTextZoom(true)",
animation_value_type="none", animation_value_type="none",
products="gecko", products="gecko",
enabled_in="", enabled_in="",
spec="Internal (not web-exposed)")} spec="Internal (not web-exposed)",
)}
% if product == "gecko": % if product == "gecko":
pub mod system_font { pub mod system_font {
@ -462,7 +506,8 @@ ${helpers.predefined_type("-x-text-zoom",
} }
% endif % endif
${helpers.single_keyword("-moz-osx-font-smoothing", ${helpers.single_keyword(
"-moz-osx-font-smoothing",
"auto grayscale", "auto grayscale",
gecko_constant_prefix="NS_FONT_SMOOTHING", gecko_constant_prefix="NS_FONT_SMOOTHING",
gecko_ffi_name="mFont.smoothing", gecko_ffi_name="mFont.smoothing",
@ -470,21 +515,26 @@ ${helpers.single_keyword("-moz-osx-font-smoothing",
products="gecko", products="gecko",
spec="Nonstandard (https://developer.mozilla.org/en-US/docs/Web/CSS/font-smooth)", spec="Nonstandard (https://developer.mozilla.org/en-US/docs/Web/CSS/font-smooth)",
flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER", flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER",
animation_value_type="discrete")} animation_value_type="discrete",
)}
${helpers.predefined_type("-moz-font-smoothing-background-color", ${helpers.predefined_type(
"-moz-font-smoothing-background-color",
"RGBAColor", "RGBAColor",
"RGBA::transparent()", "RGBA::transparent()",
animation_value_type="AnimatedRGBA", animation_value_type="AnimatedRGBA",
products="gecko", products="gecko",
gecko_ffi_name="mFont.fontSmoothingBackgroundColor", gecko_ffi_name="mFont.fontSmoothingBackgroundColor",
enabled_in="chrome", enabled_in="chrome",
spec="None (Nonstandard internal property)")} spec="None (Nonstandard internal property)",
)}
${helpers.predefined_type("-moz-min-font-size-ratio", ${helpers.predefined_type(
"-moz-min-font-size-ratio",
"Percentage", "Percentage",
"computed::Percentage::hundred()", "computed::Percentage::hundred()",
animation_value_type="none", animation_value_type="none",
products="gecko", products="gecko",
enabled_in="ua", enabled_in="ua",
spec="Nonstandard (Internal-only)")} 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(
"visibility",
"visible hidden", "visible hidden",
extra_gecko_values="collapse", extra_gecko_values="collapse",
gecko_ffi_name="mVisible", gecko_ffi_name="mVisible",
animation_value_type="ComputedValue", animation_value_type="ComputedValue",
spec="https://drafts.csswg.org/css-box/#propdef-visibility")} 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(
"writing-mode",
"horizontal-tb vertical-rl vertical-lr", "horizontal-tb vertical-rl vertical-lr",
extra_gecko_values="sideways-rl sideways-lr", extra_gecko_values="sideways-rl sideways-lr",
extra_gecko_aliases="lr=horizontal-tb lr-tb=horizontal-tb \ extra_gecko_aliases="lr=horizontal-tb lr-tb=horizontal-tb \
rl=horizontal-tb rl-tb=horizontal-tb \ rl=horizontal-tb rl-tb=horizontal-tb \
tb=vertical-rl tb-rl=vertical-rl", tb=vertical-rl tb-rl=vertical-rl",
servo_pref="layout.writing-mode.enabled", servo_pref="layout.writing-mode.enabled",
animation_value_type="discrete", animation_value_type="none",
spec="https://drafts.csswg.org/css-writing-modes/#propdef-writing-mode", spec="https://drafts.csswg.org/css-writing-modes/#propdef-writing-mode",
servo_restyle_damage="rebuild_and_reflow")} servo_restyle_damage="rebuild_and_reflow",
)}
${helpers.single_keyword("direction", "ltr rtl", animation_value_type="discrete", ${helpers.single_keyword(
"direction",
"ltr rtl",
animation_value_type="none",
spec="https://drafts.csswg.org/css-writing-modes/#propdef-direction", spec="https://drafts.csswg.org/css-writing-modes/#propdef-direction",
needs_conversion=True, needs_conversion=True,
servo_restyle_damage="rebuild_and_reflow")} servo_restyle_damage="rebuild_and_reflow",
)}
${helpers.single_keyword("text-orientation", // TODO(emilio): Should text-orientation be non-animatable? It affects the
// WritingMode value, but not the logical -> physical mapping of properties,
// which is the reason direction / writing-mode are non-animatable.
${helpers.single_keyword(
"text-orientation",
"mixed upright sideways", "mixed upright sideways",
extra_gecko_aliases="sideways-right=sideways", extra_gecko_aliases="sideways-right=sideways",
products="gecko", products="gecko",
animation_value_type="discrete", animation_value_type="discrete",
spec="https://drafts.csswg.org/css-writing-modes/#propdef-text-orientation")} 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(
"color-adjust",
"economy exact", products="gecko", "economy exact", products="gecko",
gecko_pref="layout.css.color-adjust.enabled", gecko_pref="layout.css.color-adjust.enabled",
animation_value_type="discrete", animation_value_type="discrete",
spec="https://drafts.csswg.org/css-color/#propdef-color-adjust")} 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(
"image-rendering",
"auto", "auto",
extra_gecko_values="optimizespeed optimizequality -moz-crisp-edges", extra_gecko_values="optimizespeed optimizequality -moz-crisp-edges",
extra_servo_values="pixelated crisp-edges", extra_servo_values="pixelated crisp-edges",
custom_consts=image_rendering_custom_consts, custom_consts=image_rendering_custom_consts,
animation_value_type="discrete", animation_value_type="discrete",
spec="https://drafts.csswg.org/css-images/#propdef-image-rendering")} 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,8 +977,18 @@ 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:
@ -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