mirror of
https://github.com/servo/servo.git
synced 2025-08-06 14:10:11 +01:00
style: Part 1: Add animation-timeline longhand property in style system
This patch adds the animation-timeline longhand property. For shorthand, we will do that in the next patch. This patch includes the aut-generated code in devtools/shared/css/generated/properties-db.js, by `./mach devtools-css-db`. Note: 1. we will use this property in Bug 1676791. For now, only make sure we parse it and serialize it correctly. 2. The syntax of animation-timeline may be updated, based on the spec issue: https://github.com/w3c/csswg-drafts/issues/6674. However, it's not a big problem to update it later, so we still can prototype this property based on the current version of spec. Differential Revision: https://phabricator.services.mozilla.com/D126450
This commit is contained in:
parent
7d8a87cd01
commit
2a7436481c
9 changed files with 108 additions and 14 deletions
|
@ -1049,7 +1049,7 @@ fn static_assert() {
|
|||
% if member:
|
||||
ours.m${gecko_ffi_name}.${member} = others.m${gecko_ffi_name}.${member};
|
||||
% else:
|
||||
ours.m${gecko_ffi_name} = others.m${gecko_ffi_name};
|
||||
ours.m${gecko_ffi_name} = others.m${gecko_ffi_name}.clone();
|
||||
% endif
|
||||
}
|
||||
}
|
||||
|
@ -1183,7 +1183,7 @@ fn static_assert() {
|
|||
<% skip_box_longhands= """display
|
||||
animation-name animation-delay animation-duration
|
||||
animation-direction animation-fill-mode animation-play-state
|
||||
animation-iteration-count animation-timing-function
|
||||
animation-iteration-count animation-timeline animation-timing-function
|
||||
clear transition-duration transition-delay
|
||||
transition-timing-function transition-property
|
||||
-webkit-line-clamp""" %>
|
||||
|
@ -1445,6 +1445,27 @@ fn static_assert() {
|
|||
${impl_copy_animation_value('iteration_count', 'IterationCount')}
|
||||
${impl_animation_or_transition_timing_function('animation')}
|
||||
|
||||
pub fn set_animation_timeline<I>(&mut self, v: I)
|
||||
where
|
||||
I: IntoIterator<Item = longhands::animation_timeline::computed_value::single_value::T>,
|
||||
I::IntoIter: ExactSizeIterator
|
||||
{
|
||||
let v = v.into_iter();
|
||||
debug_assert_ne!(v.len(), 0);
|
||||
let input_len = v.len();
|
||||
self.gecko.mAnimations.ensure_len(input_len);
|
||||
|
||||
self.gecko.mAnimationTimelineCount = input_len as u32;
|
||||
for (gecko, servo) in self.gecko.mAnimations.iter_mut().take(input_len as usize).zip(v) {
|
||||
gecko.mTimeline = servo;
|
||||
}
|
||||
}
|
||||
pub fn animation_timeline_at(&self, index: usize) -> values::specified::box_::AnimationTimeline {
|
||||
self.gecko.mAnimations[index].mTimeline.clone()
|
||||
}
|
||||
${impl_animation_count('timeline', 'Timeline')}
|
||||
${impl_copy_animation_value('timeline', 'Timeline')}
|
||||
|
||||
#[allow(non_snake_case)]
|
||||
pub fn set__webkit_line_clamp(&mut self, v: longhands::_webkit_line_clamp::computed_value::T) {
|
||||
self.gecko.mLineClamp = match v {
|
||||
|
|
|
@ -320,6 +320,20 @@ ${helpers.predefined_type(
|
|||
rule_types_allowed=DEFAULT_RULES_EXCEPT_KEYFRAME,
|
||||
)}
|
||||
|
||||
${helpers.predefined_type(
|
||||
"animation-timeline",
|
||||
"AnimationTimeline",
|
||||
"computed::AnimationTimeline::auto()",
|
||||
engines="gecko",
|
||||
initial_specified_value="specified::AnimationTimeline::auto()",
|
||||
vector=True,
|
||||
need_index=True,
|
||||
animation_value_type="none",
|
||||
gecko_pref="layout.css.scroll-linked-animations.enabled",
|
||||
spec="https://drafts.csswg.org/css-animations-2/#propdef-animation-timeline",
|
||||
rule_types_allowed=DEFAULT_RULES_EXCEPT_KEYFRAME,
|
||||
)}
|
||||
|
||||
<% transform_extra_prefixes = "moz:layout.css.prefixes.transforms webkit" %>
|
||||
|
||||
${helpers.predefined_type(
|
||||
|
|
|
@ -2921,7 +2921,7 @@ pub mod style_structs {
|
|||
}
|
||||
|
||||
/// Returns true if animation properties are equal between styles, but without
|
||||
/// considering keyframe data.
|
||||
/// considering keyframe data and animation-timeline.
|
||||
#[cfg(feature = "servo")]
|
||||
pub fn animations_equals(&self, other: &Self) -> bool {
|
||||
self.animation_name_iter().eq(other.animation_name_iter()) &&
|
||||
|
|
|
@ -2301,8 +2301,12 @@ impl CascadeData {
|
|||
},
|
||||
#[cfg(feature = "gecko")]
|
||||
CssRule::ScrollTimeline(..) => {
|
||||
// TODO: Bug 1676784: set the timeline into animation.
|
||||
}
|
||||
// TODO: Bug 1676791: set the timeline into animation.
|
||||
// https://phabricator.services.mozilla.com/D126452
|
||||
//
|
||||
// Note: Bug 1733260: we may drop @scroll-timeline rule once this spec issue
|
||||
// https://github.com/w3c/csswg-drafts/issues/6674 gets landed.
|
||||
},
|
||||
#[cfg(feature = "gecko")]
|
||||
CssRule::FontFace(ref rule) => {
|
||||
self.extra_data.add_font_face(rule);
|
||||
|
|
|
@ -11,14 +11,12 @@ use crate::values::generics::box_::Perspective as GenericPerspective;
|
|||
use crate::values::generics::box_::VerticalAlign as GenericVerticalAlign;
|
||||
use crate::values::specified::box_ as specified;
|
||||
|
||||
pub use crate::values::specified::box_::Clear as SpecifiedClear;
|
||||
pub use crate::values::specified::box_::{AnimationName, Appearance, BreakBetween, BreakWithin};
|
||||
pub use crate::values::specified::box_::{Contain, Display, Float as SpecifiedFloat, Overflow};
|
||||
pub use crate::values::specified::box_::{OverflowAnchor, OverflowClipBox, OverscrollBehavior};
|
||||
pub use crate::values::specified::box_::{
|
||||
ScrollSnapAlign, ScrollSnapAxis, ScrollSnapStrictness, ScrollSnapType,
|
||||
AnimationName, AnimationTimeline, Appearance, BreakBetween, BreakWithin,
|
||||
Clear as SpecifiedClear, Contain, Display, Float as SpecifiedFloat, Overflow, OverflowAnchor,
|
||||
OverflowClipBox, OverscrollBehavior, ScrollSnapAlign, ScrollSnapAxis, ScrollSnapStrictness,
|
||||
ScrollSnapType, TouchAction, TransitionProperty, WillChange,
|
||||
};
|
||||
pub use crate::values::specified::box_::{TouchAction, TransitionProperty, WillChange};
|
||||
|
||||
/// A computed value for the `vertical-align` property.
|
||||
pub type VerticalAlign = GenericVerticalAlign<LengthPercentage>;
|
||||
|
|
|
@ -44,7 +44,7 @@ pub use self::basic_shape::FillRule;
|
|||
pub use self::border::{BorderCornerRadius, BorderRadius, BorderSpacing};
|
||||
pub use self::border::{BorderImageRepeat, BorderImageSideWidth};
|
||||
pub use self::border::{BorderImageSlice, BorderImageWidth};
|
||||
pub use self::box_::{AnimationIterationCount, AnimationName, Contain};
|
||||
pub use self::box_::{AnimationIterationCount, AnimationName, AnimationTimeline, Contain};
|
||||
pub use self::box_::{Appearance, BreakBetween, BreakWithin, Clear, Float};
|
||||
pub use self::box_::{Display, Overflow, OverflowAnchor, TransitionProperty};
|
||||
pub use self::box_::{OverflowClipBox, OverscrollBehavior, Perspective, Resize};
|
||||
|
|
|
@ -472,6 +472,7 @@ impl ToCss for CustomIdent {
|
|||
#[derive(
|
||||
Clone, Debug, MallocSizeOf, SpecifiedValueInfo, ToComputedValue, ToResolvedValue, ToShmem,
|
||||
)]
|
||||
#[repr(C, u8)]
|
||||
pub enum TimelineOrKeyframesName {
|
||||
/// <custom-ident>
|
||||
Ident(CustomIdent),
|
||||
|
|
|
@ -13,7 +13,7 @@ use crate::values::generics::box_::Perspective as GenericPerspective;
|
|||
use crate::values::generics::box_::{GenericVerticalAlign, VerticalAlignKeyword};
|
||||
use crate::values::specified::length::{LengthPercentage, NonNegativeLength};
|
||||
use crate::values::specified::{AllowQuirks, Number};
|
||||
use crate::values::{CustomIdent, KeyframesName};
|
||||
use crate::values::{CustomIdent, KeyframesName, TimelineName};
|
||||
use crate::Atom;
|
||||
use cssparser::Parser;
|
||||
use num_traits::FromPrimitive;
|
||||
|
@ -762,6 +762,62 @@ impl Parse for AnimationName {
|
|||
}
|
||||
}
|
||||
|
||||
/// A value for the <single-animation-timeline>.
|
||||
///
|
||||
/// https://drafts.csswg.org/css-animations-2/#typedef-single-animation-timeline
|
||||
/// cbindgen:private-default-tagged-enum-constructor=false
|
||||
#[derive(
|
||||
Clone,
|
||||
Debug,
|
||||
Eq,
|
||||
Hash,
|
||||
MallocSizeOf,
|
||||
PartialEq,
|
||||
SpecifiedValueInfo,
|
||||
ToComputedValue,
|
||||
ToCss,
|
||||
ToResolvedValue,
|
||||
ToShmem,
|
||||
)]
|
||||
#[repr(C, u8)]
|
||||
pub enum AnimationTimeline {
|
||||
/// Use default timeline. The animation’s timeline is a DocumentTimeline.
|
||||
Auto,
|
||||
/// The animation is not associated with a timeline.
|
||||
None,
|
||||
/// The scroll-timeline name
|
||||
Timeline(TimelineName),
|
||||
}
|
||||
|
||||
impl AnimationTimeline {
|
||||
/// Returns the `auto` value.
|
||||
pub fn auto() -> Self {
|
||||
Self::Auto
|
||||
}
|
||||
}
|
||||
|
||||
impl Parse for AnimationTimeline {
|
||||
fn parse<'i, 't>(
|
||||
context: &ParserContext,
|
||||
input: &mut Parser<'i, 't>,
|
||||
) -> Result<Self, ParseError<'i>> {
|
||||
// We are using the same parser for TimelineName and KeyframesName, but animation-timeline
|
||||
// accepts "auto", so need to manually parse this. (We can not derive Parse because
|
||||
// TimelineName excludes only "none" keyword.)
|
||||
// FIXME: Bug 1733260: we may drop None based on the spec issue:
|
||||
// Note: https://github.com/w3c/csswg-drafts/issues/6674.
|
||||
if input.try_parse(|i| i.expect_ident_matching("auto")).is_ok() {
|
||||
return Ok(Self::Auto);
|
||||
}
|
||||
|
||||
if input.try_parse(|i| i.expect_ident_matching("none")).is_ok() {
|
||||
return Ok(Self::None);
|
||||
}
|
||||
|
||||
TimelineName::parse(context, input).map(AnimationTimeline::Timeline)
|
||||
}
|
||||
}
|
||||
|
||||
/// https://drafts.csswg.org/css-scroll-snap-1/#snap-axis
|
||||
#[allow(missing_docs)]
|
||||
#[cfg_attr(feature = "servo", derive(Deserialize, Serialize))]
|
||||
|
|
|
@ -36,7 +36,7 @@ pub use self::basic_shape::FillRule;
|
|||
pub use self::border::{BorderCornerRadius, BorderImageSlice, BorderImageWidth};
|
||||
pub use self::border::{BorderImageRepeat, BorderImageSideWidth};
|
||||
pub use self::border::{BorderRadius, BorderSideWidth, BorderSpacing, BorderStyle};
|
||||
pub use self::box_::{AnimationIterationCount, AnimationName, Contain, Display};
|
||||
pub use self::box_::{AnimationIterationCount, AnimationName, AnimationTimeline, Contain, Display};
|
||||
pub use self::box_::{Appearance, BreakBetween, BreakWithin};
|
||||
pub use self::box_::{Clear, Float, Overflow, OverflowAnchor};
|
||||
pub use self::box_::{OverflowClipBox, OverscrollBehavior, Perspective, Resize};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue