style: Clean up text-justify, and make distribute a parse-time alias

Since it's simpler, as discussed in the CSSWG issue.

Differential Revision: https://phabricator.services.mozilla.com/D111346
This commit is contained in:
Oriol Brufau 2023-05-16 23:14:19 +02:00
parent bbc03a2577
commit b40f4b6fec
7 changed files with 48 additions and 76 deletions

View file

@ -511,6 +511,7 @@ class Longhand(Property):
"TextAlignLast", "TextAlignLast",
"TextDecorationLine", "TextDecorationLine",
"TextEmphasisPosition", "TextEmphasisPosition",
"TextJustify",
"TextTransform", "TextTransform",
"TextUnderlinePosition", "TextUnderlinePosition",
"TouchAction", "TouchAction",

View file

@ -707,8 +707,8 @@
</%def> </%def>
<%def name="single_keyword(name, values, vector=False, <%def name="single_keyword(name, values, vector=False,
extra_specified=None, needs_conversion=False, needs_conversion=False, gecko_pref_controlled_initial_value=None,
gecko_pref_controlled_initial_value=None, **kwargs)"> **kwargs)">
<% <%
keyword_kwargs = {a: kwargs.pop(a, None) for a in [ keyword_kwargs = {a: kwargs.pop(a, None) for a in [
'gecko_constant_prefix', 'gecko_constant_prefix',
@ -725,11 +725,10 @@
]} ]}
%> %>
<%def name="inner_body(keyword, extra_specified=None, needs_conversion=False, <%def name="inner_body(keyword, needs_conversion=False,
gecko_pref_controlled_initial_value=None)"> gecko_pref_controlled_initial_value=None)">
<%def name="variants(variants, include_aliases)"> <%def name="variants(variants)">
% for variant in variants: % for variant in variants:
% if include_aliases:
<% <%
aliases = [] aliases = []
for alias, v in keyword.aliases_for(engine).items(): for alias, v in keyword.aliases_for(engine).items():
@ -739,38 +738,15 @@
% if aliases: % if aliases:
#[parse(aliases = "${','.join(sorted(aliases))}")] #[parse(aliases = "${','.join(sorted(aliases))}")]
% endif % endif
% endif
${to_camel_case(variant)}, ${to_camel_case(variant)},
% endfor % endfor
</%def> </%def>
% if extra_specified:
#[cfg_attr(feature = "servo", derive(Deserialize, Serialize))]
#[derive(
Clone,
Copy,
Debug,
Eq,
MallocSizeOf,
Parse,
PartialEq,
SpecifiedValueInfo,
ToCss,
ToShmem,
)]
pub enum SpecifiedValue {
${variants(keyword.values_for(engine) + extra_specified.split(), bool(extra_specified))}
}
% else:
pub use self::computed_value::T as SpecifiedValue; pub use self::computed_value::T as SpecifiedValue;
% endif
pub mod computed_value { pub mod computed_value {
#[cfg_attr(feature = "servo", derive(Deserialize, Serialize))] #[cfg_attr(feature = "servo", derive(Deserialize, Serialize))]
#[derive(Clone, Copy, Debug, Eq, FromPrimitive, MallocSizeOf, PartialEq, ToCss, ToResolvedValue)] #[derive(Clone, Copy, Debug, Eq, FromPrimitive, MallocSizeOf, Parse, PartialEq, SpecifiedValueInfo, ToComputedValue, ToCss, ToResolvedValue, ToShmem)]
% if not extra_specified:
#[derive(Parse, SpecifiedValueInfo, ToComputedValue, ToShmem)]
% endif
pub enum T { pub enum T {
${variants(data.longhands_by_name[name].keyword.values_for(engine), not extra_specified)} ${variants(data.longhands_by_name[name].keyword.values_for(engine))}
} }
} }
#[inline] #[inline]
@ -799,10 +775,7 @@
% if needs_conversion: % if needs_conversion:
<% <%
conversion_values = keyword.values_for(engine) conversion_values = keyword.values_for(engine) + list(keyword.aliases_for(engine).keys())
if extra_specified:
conversion_values += extra_specified.split()
conversion_values += keyword.aliases_for(engine).keys()
%> %>
${gecko_keyword_conversion(keyword, values=conversion_values)} ${gecko_keyword_conversion(keyword, values=conversion_values)}
% endif % endif
@ -817,7 +790,7 @@
% else: % else:
<%call expr="longhand(name, keyword=Keyword(name, values, **keyword_kwargs), **kwargs)"> <%call expr="longhand(name, keyword=Keyword(name, values, **keyword_kwargs), **kwargs)">
${inner_body(Keyword(name, values, **keyword_kwargs), ${inner_body(Keyword(name, values, **keyword_kwargs),
extra_specified=extra_specified, needs_conversion=needs_conversion, needs_conversion=needs_conversion,
gecko_pref_controlled_initial_value=gecko_pref_controlled_initial_value)} gecko_pref_controlled_initial_value=gecko_pref_controlled_initial_value)}
% if caller: % if caller:
${caller.body()} ${caller.body()}

View file

@ -96,45 +96,16 @@ ${helpers.predefined_type(
servo_restyle_damage="rebuild_and_reflow", servo_restyle_damage="rebuild_and_reflow",
)} )}
// TODO(pcwalton): Support `text-justify: distribute`. ${helpers.predefined_type(
<%helpers:single_keyword "text-justify",
name="text-justify" "TextJustify",
values="auto none inter-word" "computed::TextJustify::Auto",
engines="gecko servo-2013 servo-2020", engines="gecko servo-2013 servo-2020",
servo_2020_pref="layout.2020.unimplemented", servo_2020_pref="layout.2020.unimplemented",
extra_gecko_values="inter-character" animation_value_type="discrete",
extra_specified="${'distribute' if engine == 'gecko' else ''}" spec="https://drafts.csswg.org/css-text/#propdef-text-justify",
gecko_enum_prefix="StyleTextJustify" servo_restyle_damage="rebuild_and_reflow",
animation_value_type="discrete" )}
spec="https://drafts.csswg.org/css-text/#propdef-text-justify"
servo_restyle_damage="rebuild_and_reflow"
>
% if engine == 'gecko':
impl ToComputedValue for SpecifiedValue {
type ComputedValue = computed_value::T;
#[inline]
fn to_computed_value(&self, _: &Context) -> computed_value::T {
match *self {
% for value in "Auto None InterCharacter InterWord".split():
SpecifiedValue::${value} => computed_value::T::${value},
% endfor
// https://drafts.csswg.org/css-text-3/#valdef-text-justify-distribute
SpecifiedValue::Distribute => computed_value::T::InterCharacter,
}
}
#[inline]
fn from_computed_value(computed: &computed_value::T) -> SpecifiedValue {
match *computed {
% for value in "Auto None InterCharacter InterWord".split():
computed_value::T::${value} => SpecifiedValue::${value},
% endfor
}
}
}
% endif
</%helpers:single_keyword>
${helpers.predefined_type( ${helpers.predefined_type(
"text-align-last", "text-align-last",

View file

@ -89,7 +89,7 @@ pub use self::text::TextUnderlinePosition;
pub use self::text::{InitialLetter, LetterSpacing, LineBreak, LineHeight}; pub use self::text::{InitialLetter, LetterSpacing, LineBreak, LineHeight};
pub use self::text::{OverflowWrap, RubyPosition, TextOverflow, WordBreak, WordSpacing}; pub use self::text::{OverflowWrap, RubyPosition, TextOverflow, WordBreak, WordSpacing};
pub use self::text::{TextAlign, TextAlignLast, TextEmphasisPosition, TextEmphasisStyle}; pub use self::text::{TextAlign, TextAlignLast, TextEmphasisPosition, TextEmphasisStyle};
pub use self::text::{TextDecorationLength, TextDecorationSkipInk}; pub use self::text::{TextDecorationLength, TextDecorationSkipInk, TextJustify};
pub use self::time::Time; pub use self::time::Time;
pub use self::transform::{Rotate, Scale, Transform, TransformOperation}; pub use self::transform::{Rotate, Scale, Transform, TransformOperation};
pub use self::transform::{TransformOrigin, TransformStyle, Translate}; pub use self::transform::{TransformOrigin, TransformStyle, Translate};

View file

@ -21,7 +21,7 @@ use style_traits::{CssWriter, ToCss};
pub use crate::values::specified::text::{TextAlignLast, TextUnderlinePosition}; pub use crate::values::specified::text::{TextAlignLast, TextUnderlinePosition};
pub use crate::values::specified::{LineBreak, OverflowWrap, RubyPosition, WordBreak}; pub use crate::values::specified::{LineBreak, OverflowWrap, RubyPosition, WordBreak};
pub use crate::values::specified::{TextDecorationLine, TextEmphasisPosition}; pub use crate::values::specified::{TextDecorationLine, TextEmphasisPosition};
pub use crate::values::specified::{TextDecorationSkipInk, TextTransform}; pub use crate::values::specified::{TextDecorationSkipInk, TextJustify, TextTransform};
/// A computed value for the `initial-letter` property. /// A computed value for the `initial-letter` property.
pub type InitialLetter = GenericInitialLetter<CSSFloat, CSSInteger>; pub type InitialLetter = GenericInitialLetter<CSSFloat, CSSInteger>;

View file

@ -90,7 +90,7 @@ pub use self::text::RubyPosition;
pub use self::text::{InitialLetter, LetterSpacing, LineBreak, LineHeight, TextAlign}; pub use self::text::{InitialLetter, LetterSpacing, LineBreak, LineHeight, TextAlign};
pub use self::text::{OverflowWrap, TextEmphasisPosition, TextEmphasisStyle, WordBreak}; pub use self::text::{OverflowWrap, TextEmphasisPosition, TextEmphasisStyle, WordBreak};
pub use self::text::{TextAlignKeyword, TextDecorationLine, TextOverflow, WordSpacing}; pub use self::text::{TextAlignKeyword, TextDecorationLine, TextOverflow, WordSpacing};
pub use self::text::{TextDecorationLength, TextDecorationSkipInk, TextTransform}; pub use self::text::{TextDecorationLength, TextDecorationSkipInk, TextJustify, TextTransform};
pub use self::time::Time; pub use self::time::Time;
pub use self::transform::{Rotate, Scale, Transform}; pub use self::transform::{Rotate, Scale, Transform};
pub use self::transform::{TransformOrigin, TransformStyle, Translate}; pub use self::transform::{TransformOrigin, TransformStyle, Translate};

View file

@ -1001,6 +1001,33 @@ pub enum WordBreak {
BreakWord, BreakWord,
} }
/// Values for the `text-justify` CSS property.
#[repr(u8)]
#[derive(
Clone,
Copy,
Debug,
Eq,
MallocSizeOf,
Parse,
PartialEq,
SpecifiedValueInfo,
ToComputedValue,
ToCss,
ToResolvedValue,
ToShmem,
)]
#[allow(missing_docs)]
pub enum TextJustify {
Auto,
None,
InterWord,
// See https://drafts.csswg.org/css-text-3/#valdef-text-justify-distribute
// and https://github.com/w3c/csswg-drafts/issues/6156 for the alias.
#[parse(aliases = "distribute")]
InterCharacter,
}
/// Values for the `line-break` property. /// Values for the `line-break` property.
#[repr(u8)] #[repr(u8)]
#[derive( #[derive(