mirror of
https://github.com/servo/servo.git
synced 2025-07-08 07:53:40 +01:00
Bug 1347053 - Fix shorthand parser for transition none. r=xidorn
MozReview-Commit-ID: GUs1ByQsiMF
This commit is contained in:
parent
78c8edfb0a
commit
3d8420e31b
2 changed files with 32 additions and 26 deletions
|
@ -777,7 +777,8 @@ ${helpers.single_keyword("overflow-x", "visible hidden scroll auto",
|
||||||
spec="https://drafts.csswg.org/css-transitions/#propdef-transition-delay">
|
spec="https://drafts.csswg.org/css-transitions/#propdef-transition-delay">
|
||||||
pub use properties::longhands::transition_duration::single_value::SpecifiedValue;
|
pub use properties::longhands::transition_duration::single_value::SpecifiedValue;
|
||||||
pub use properties::longhands::transition_duration::single_value::computed_value;
|
pub use properties::longhands::transition_duration::single_value::computed_value;
|
||||||
pub use properties::longhands::transition_duration::single_value::{get_initial_value, parse};
|
pub use properties::longhands::transition_duration::single_value::{get_initial_value, get_initial_specified_value};
|
||||||
|
pub use properties::longhands::transition_duration::single_value::parse;
|
||||||
</%helpers:vector_longhand>
|
</%helpers:vector_longhand>
|
||||||
|
|
||||||
<%helpers:vector_longhand name="animation-name"
|
<%helpers:vector_longhand name="animation-name"
|
||||||
|
|
|
@ -54,20 +54,22 @@ macro_rules! try_parse_one {
|
||||||
transition-delay"
|
transition-delay"
|
||||||
spec="https://drafts.csswg.org/css-transitions/#propdef-transition">
|
spec="https://drafts.csswg.org/css-transitions/#propdef-transition">
|
||||||
use parser::Parse;
|
use parser::Parse;
|
||||||
use properties::longhands::{transition_delay, transition_duration, transition_property};
|
% for prop in "delay duration property timing_function".split():
|
||||||
use properties::longhands::{transition_timing_function};
|
use properties::longhands::transition_${prop};
|
||||||
|
% endfor
|
||||||
|
|
||||||
pub fn parse_value(context: &ParserContext, input: &mut Parser) -> Result<Longhands, ()> {
|
pub fn parse_value(context: &ParserContext, input: &mut Parser) -> Result<Longhands, ()> {
|
||||||
struct SingleTransition {
|
struct SingleTransition {
|
||||||
transition_property: transition_property::SingleSpecifiedValue,
|
% for prop in "property duration timing_function delay".split():
|
||||||
transition_duration: transition_duration::SingleSpecifiedValue,
|
transition_${prop}: transition_${prop}::SingleSpecifiedValue,
|
||||||
transition_timing_function: transition_timing_function::SingleSpecifiedValue,
|
% endfor
|
||||||
transition_delay: transition_delay::SingleSpecifiedValue,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_one_transition(context: &ParserContext, input: &mut Parser) -> Result<SingleTransition,()> {
|
fn parse_one_transition(context: &ParserContext, input: &mut Parser) -> Result<SingleTransition,()> {
|
||||||
let (mut property, mut duration) = (None, None);
|
% for prop in "property duration timing_function delay".split():
|
||||||
let (mut timing_function, mut delay) = (None, None);
|
let mut ${prop} = None;
|
||||||
|
% endfor
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
try_parse_one!(input, property, transition_property);
|
try_parse_one!(input, property, transition_property);
|
||||||
try_parse_one!(context, input, duration, transition_duration);
|
try_parse_one!(context, input, duration, transition_duration);
|
||||||
|
@ -80,38 +82,41 @@ macro_rules! try_parse_one {
|
||||||
if let Some(property) = property {
|
if let Some(property) = property {
|
||||||
Ok(SingleTransition {
|
Ok(SingleTransition {
|
||||||
transition_property: property,
|
transition_property: property,
|
||||||
transition_duration:
|
% for prop in "duration timing_function delay".split():
|
||||||
duration.unwrap_or_else(transition_duration::single_value::get_initial_value),
|
transition_${prop}: ${prop}.unwrap_or_else(transition_${prop}::single_value
|
||||||
transition_timing_function:
|
|
||||||
timing_function.unwrap_or_else(transition_timing_function::single_value
|
|
||||||
::get_initial_specified_value),
|
::get_initial_specified_value),
|
||||||
transition_delay:
|
% endfor
|
||||||
delay.unwrap_or_else(transition_delay::single_value::get_initial_value),
|
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
Err(())
|
Err(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let (mut properties, mut durations) = (Vec::new(), Vec::new());
|
% for prop in "property duration timing_function delay".split():
|
||||||
let (mut timing_functions, mut delays) = (Vec::new(), Vec::new());
|
let mut ${prop}s = Vec::new();
|
||||||
|
% endfor
|
||||||
|
|
||||||
if input.try(|input| input.expect_ident_matching("none")).is_err() {
|
if input.try(|input| input.expect_ident_matching("none")).is_err() {
|
||||||
let results = try!(input.parse_comma_separated(|i| parse_one_transition(context, i)));
|
let results = try!(input.parse_comma_separated(|i| parse_one_transition(context, i)));
|
||||||
for result in results {
|
for result in results {
|
||||||
properties.push(result.transition_property);
|
% for prop in "property duration timing_function delay".split():
|
||||||
durations.push(result.transition_duration);
|
${prop}s.push(result.transition_${prop});
|
||||||
timing_functions.push(result.transition_timing_function);
|
% endfor
|
||||||
delays.push(result.transition_delay);
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
// `transition: none` is a valid syntax, and we keep transition_property empty because |none| is not
|
||||||
|
// a valid TransitionProperty.
|
||||||
|
// durations, delays, and timing_functions are not allowed as empty, so before we convert them into
|
||||||
|
// longhand properties, we need to put initial values for none transition.
|
||||||
|
% for prop in "duration timing_function delay".split():
|
||||||
|
${prop}s.push(transition_${prop}::single_value::get_initial_specified_value());
|
||||||
|
% endfor
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(Longhands {
|
Ok(Longhands {
|
||||||
transition_property: transition_property::SpecifiedValue(properties),
|
% for prop in "property duration timing_function delay".split():
|
||||||
transition_duration: transition_duration::SpecifiedValue(durations),
|
transition_${prop}: transition_${prop}::SpecifiedValue(${prop}s),
|
||||||
transition_timing_function:
|
% endfor
|
||||||
transition_timing_function::SpecifiedValue(timing_functions),
|
|
||||||
transition_delay: transition_delay::SpecifiedValue(delays),
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue