summaryrefslogtreecommitdiffstats
path: root/servo/components/style/properties/shorthands
diff options
context:
space:
mode:
Diffstat (limited to 'servo/components/style/properties/shorthands')
-rw-r--r--servo/components/style/properties/shorthands/svg.mako.rs19
-rw-r--r--servo/components/style/properties/shorthands/ui.mako.rs41
2 files changed, 46 insertions, 14 deletions
diff --git a/servo/components/style/properties/shorthands/svg.mako.rs b/servo/components/style/properties/shorthands/svg.mako.rs
index cf34b116ee..195427dad5 100644
--- a/servo/components/style/properties/shorthands/svg.mako.rs
+++ b/servo/components/style/properties/shorthands/svg.mako.rs
@@ -144,8 +144,8 @@
// <mask-reference> ||
// <position> [ / <bg-size> ]? ||
// <repeat-style> ||
- // <geometry-box> ||
- // [ <geometry-box> | no-clip ] ||
+ // <coord-box> ||
+ // [ <coord-box> | no-clip ] ||
// <compositing-operator> ||
// <masking-mode>
// https://drafts.fxtf.org/css-masking-1/#the-mask
@@ -198,12 +198,21 @@
writer.item(repeat)?;
}
- // <geometry-box>
- if has_origin {
+ // <coord-box>
+ // Note:
+ // Even if 'mask-origin' is at its initial value 'border-box',
+ // we still have to serialize it to avoid ambiguity iF the
+ // 'mask-clip' longhand has some other <coord-box> value
+ // (i.e. neither 'border-box' nor 'no-clip'). (If we naively
+ // declined to serialize the 'mask-origin' value in this
+ // situation, then whatever value we serialize for 'mask-clip'
+ // would implicitly also represent 'mask-origin' and would be
+ // providing the wrong value for that longhand.)
+ if has_origin || (has_clip && *clip != Clip::NoClip) {
writer.item(origin)?;
}
- // [ <geometry-box> | no-clip ]
+ // [ <coord-box> | no-clip ]
if has_clip && *clip != From::from(*origin) {
writer.item(clip)?;
}
diff --git a/servo/components/style/properties/shorthands/ui.mako.rs b/servo/components/style/properties/shorthands/ui.mako.rs
index 1fdb5965fc..4a27d5e003 100644
--- a/servo/components/style/properties/shorthands/ui.mako.rs
+++ b/servo/components/style/properties/shorthands/ui.mako.rs
@@ -22,10 +22,10 @@ macro_rules! try_parse_one {
extra_prefixes="moz:layout.css.prefixes.transitions webkit"
sub_properties="transition-property transition-duration
transition-timing-function
- transition-delay"
+ transition-delay transition-behavior"
spec="https://drafts.csswg.org/css-transitions/#propdef-transition">
use crate::parser::Parse;
- % for prop in "delay duration property timing_function".split():
+ % for prop in "delay duration property timing_function behavior".split():
use crate::properties::longhands::transition_${prop};
% endfor
use crate::values::specified::TransitionProperty;
@@ -35,7 +35,7 @@ macro_rules! try_parse_one {
input: &mut Parser<'i, 't>,
) -> Result<Longhands, ParseError<'i>> {
struct SingleTransition {
- % for prop in "property duration timing_function delay".split():
+ % for prop in "property duration timing_function delay behavior".split():
transition_${prop}: transition_${prop}::SingleSpecifiedValue,
% endfor
}
@@ -45,7 +45,7 @@ macro_rules! try_parse_one {
input: &mut Parser<'i, 't>,
first: bool,
) -> Result<SingleTransition,ParseError<'i>> {
- % for prop in "property duration timing_function delay".split():
+ % for prop in "property duration timing_function delay behavior".split():
let mut ${prop} = None;
% endfor
@@ -56,6 +56,9 @@ macro_rules! try_parse_one {
try_parse_one!(context, input, duration, transition_duration);
try_parse_one!(context, input, timing_function, transition_timing_function);
try_parse_one!(context, input, delay, transition_delay);
+ if static_prefs::pref!("layout.css.transition-behavior.enabled") {
+ try_parse_one!(context, input, behavior, transition_behavior);
+ }
// Must check 'transition-property' after 'transition-timing-function' since
// 'transition-property' accepts any keyword.
if property.is_none() {
@@ -78,7 +81,7 @@ macro_rules! try_parse_one {
if parsed != 0 {
Ok(SingleTransition {
- % for prop in "property duration timing_function delay".split():
+ % for prop in "property duration timing_function delay behavior".split():
transition_${prop}: ${prop}.unwrap_or_else(transition_${prop}::single_value
::get_initial_specified_value),
% endfor
@@ -88,7 +91,7 @@ macro_rules! try_parse_one {
}
}
- % for prop in "property duration timing_function delay".split():
+ % for prop in "property duration timing_function delay behavior".split():
let mut ${prop}s = Vec::new();
% endfor
@@ -105,13 +108,13 @@ macro_rules! try_parse_one {
Ok(transition)
})?;
for result in results {
- % for prop in "property duration timing_function delay".split():
+ % for prop in "property duration timing_function delay behavior".split():
${prop}s.push(result.transition_${prop});
% endfor
}
Ok(expanded! {
- % for prop in "property duration timing_function delay".split():
+ % for prop in "property duration timing_function delay behavior".split():
transition_${prop}: transition_${prop}::SpecifiedValue(${prop}s.into()),
% endfor
})
@@ -133,12 +136,24 @@ macro_rules! try_parse_one {
return Ok(());
}
% endfor
+
+ if let Some(behavior) = self.transition_behavior {
+ if behavior.0.len() != 1 {
+ return Ok(());
+ }
+ }
} else {
% for name in "duration delay timing_function".split():
if self.transition_${name}.0.len() != property_len {
return Ok(());
}
% endfor
+
+ if let Some(behavior) = self.transition_behavior {
+ if behavior.0.len() != property_len {
+ return Ok(());
+ }
+ }
}
// Representative length.
@@ -152,7 +167,11 @@ macro_rules! try_parse_one {
let has_duration = !self.transition_duration.0[i].is_zero();
let has_timing = !self.transition_timing_function.0[i].is_ease();
let has_delay = !self.transition_delay.0[i].is_zero();
- let has_any = has_duration || has_timing || has_delay;
+ let has_behavior = match self.transition_behavior {
+ Some(behavior) => !behavior.0[i].is_normal(),
+ _ => false,
+ };
+ let has_any = has_duration || has_timing || has_delay || has_behavior;
let mut writer = SequenceWriter::new(dest, " ");
@@ -174,6 +193,10 @@ macro_rules! try_parse_one {
if has_delay {
writer.item(&self.transition_delay.0[i])?;
}
+
+ if has_behavior {
+ writer.item(&self.transition_behavior.unwrap().0[i])?;
+ }
}
Ok(())
}