Remove AnimatedProperty

This removes an extra layer of abstraction and allows Servo to share
more code with Gecko. In addition, we will need to handle raw
`AnimationValue` structs soon in order to fully implement "faster
reversing of interrupted transitions."
This commit is contained in:
Martin Robinson 2020-05-12 18:05:24 +02:00
parent bdfa6b0751
commit 0f1831e2fa
10 changed files with 101 additions and 362 deletions

View file

@ -113,7 +113,7 @@ impl Animations {
transition.state = AnimationState::Finished;
update.add_event(
transition.node,
transition.property_animation.property_name().into(),
transition.property_animation.property_id().name().into(),
TransitionOrAnimationEventType::TransitionEnd,
transition.property_animation.duration,
);
@ -135,7 +135,7 @@ impl Animations {
// according to https://drafts.csswg.org/css-transitions/#event-transitionevent
update.add_event(
transition.node,
transition.property_animation.property_name().into(),
transition.property_animation.property_id().name().into(),
TransitionOrAnimationEventType::TransitionCancel,
(now - transition.start_time).max(0.),
);
@ -157,7 +157,7 @@ impl Animations {
// according to https://drafts.csswg.org/css-transitions/#event-transitionevent
update.add_event(
transition.node,
transition.property_animation.property_name().into(),
transition.property_animation.property_id().name().into(),
TransitionOrAnimationEventType::TransitionRun,
0.,
);

View file

@ -11,13 +11,14 @@ use crate::bezier::Bezier;
use crate::context::SharedStyleContext;
use crate::dom::{OpaqueNode, TElement, TNode};
use crate::font_metrics::FontMetricsProvider;
use crate::properties::animated_properties::AnimatedProperty;
use crate::properties::animated_properties::AnimationValue;
use crate::properties::longhands::animation_direction::computed_value::single_value::T as AnimationDirection;
use crate::properties::longhands::animation_play_state::computed_value::single_value::T as AnimationPlayState;
use crate::properties::LonghandIdSet;
use crate::properties::{self, CascadeMode, ComputedValues, LonghandId};
use crate::stylesheets::keyframes_rule::{KeyframesAnimation, KeyframesStep, KeyframesStepValue};
use crate::stylesheets::Origin;
use crate::values::animated::{Animate, Procedure};
use crate::values::computed::Time;
use crate::values::computed::TimingFunction;
use crate::values::generics::box_::AnimationIterationCount;
@ -29,8 +30,11 @@ use std::fmt;
/// Represents an animation for a given property.
#[derive(Clone, Debug, MallocSizeOf)]
pub struct PropertyAnimation {
/// An `AnimatedProperty` that this `PropertyAnimation` corresponds to.
property: AnimatedProperty,
/// The value we are animating from.
from: AnimationValue,
/// The value we are animating to.
to: AnimationValue,
/// The timing function of this `PropertyAnimation`.
timing_function: TimingFunction,
@ -42,12 +46,8 @@ pub struct PropertyAnimation {
impl PropertyAnimation {
/// Returns the given property longhand id.
pub fn property_id(&self) -> LonghandId {
self.property.id()
}
/// Returns the given property name.
pub fn property_name(&self) -> &'static str {
self.property.name()
debug_assert_eq!(self.from.id(), self.to.id());
self.from.id()
}
fn from_longhand(
@ -57,30 +57,33 @@ impl PropertyAnimation {
old_style: &ComputedValues,
new_style: &ComputedValues,
) -> Option<PropertyAnimation> {
let animated_property = AnimatedProperty::from_longhand(longhand, old_style, new_style)?;
// FIXME(emilio): Handle the case where old_style and new_style's writing mode differ.
let longhand = longhand.to_physical(new_style.writing_mode);
let from = AnimationValue::from_computed_values(longhand, old_style)?;
let to = AnimationValue::from_computed_values(longhand, new_style)?;
let duration = duration.seconds() as f64;
let property_animation = PropertyAnimation {
property: animated_property,
timing_function,
duration: duration.seconds() as f64,
};
if property_animation.does_animate() {
Some(property_animation)
} else {
None
if from == to || duration == 0.0 {
return None;
}
Some(PropertyAnimation {
from,
to,
timing_function,
duration,
})
}
/// Update the given animation at a given point of progress.
pub fn update(&self, style: &mut ComputedValues, time: f64) {
/// The output of the timing function given the progress ration of this animation.
fn timing_function_output(&self, progress: f64) -> f64 {
let epsilon = 1. / (200. * self.duration);
let progress = match self.timing_function {
match self.timing_function {
GenericTimingFunction::CubicBezier { x1, y1, x2, y2 } => {
Bezier::new(x1, y1, x2, y2).solve(time, epsilon)
Bezier::new(x1, y1, x2, y2).solve(progress, epsilon)
},
GenericTimingFunction::Steps(steps, pos) => {
let mut current_step = (time * (steps as f64)).floor() as i32;
let mut current_step = (progress * (steps as f64)).floor() as i32;
if pos == StepPosition::Start ||
pos == StepPosition::JumpStart ||
@ -95,7 +98,7 @@ impl PropertyAnimation {
// (i.e. Treat before_flag is unset,)
// https://drafts.csswg.org/css-easing/#step-timing-function-algo
if time >= 0.0 && current_step < 0 {
if progress >= 0.0 && current_step < 0 {
current_step = 0;
}
@ -108,7 +111,7 @@ impl PropertyAnimation {
StepPosition::End => steps,
};
if time <= 1.0 && current_step > jumps {
if progress <= 1.0 && current_step > jumps {
current_step = jumps;
}
@ -116,22 +119,19 @@ impl PropertyAnimation {
},
GenericTimingFunction::Keyword(keyword) => {
let (x1, x2, y1, y2) = keyword.to_bezier();
Bezier::new(x1, x2, y1, y2).solve(time, epsilon)
Bezier::new(x1, x2, y1, y2).solve(progress, epsilon)
},
}
}
/// Update the given animation at a given point of progress.
fn update(&self, style: &mut ComputedValues, progress: f64) {
let procedure = Procedure::Interpolate {
progress: self.timing_function_output(progress),
};
self.property.update(style, progress);
}
#[inline]
fn does_animate(&self) -> bool {
self.property.does_animate() && self.duration != 0.0
}
/// Whether this animation has the same end value as another one.
#[inline]
pub fn has_the_same_end_value_as(&self, other: &Self) -> bool {
self.property.has_the_same_end_value_as(&other.property)
if let Ok(new_value) = self.from.animate(&self.to, procedure) {
new_value.set_in_style_for_servo(style);
}
}
}
@ -486,42 +486,23 @@ impl Animation {
);
let mut new_style = (*style).clone();
let mut update_style_for_longhand = |longhand| {
let from = AnimationValue::from_computed_values(longhand, &from_style)?;
let to = AnimationValue::from_computed_values(longhand, &target_style)?;
PropertyAnimation {
from,
to,
timing_function,
duration: relative_duration as f64,
}
.update(&mut new_style, relative_progress);
None::<()>
};
for property in self.keyframes_animation.properties_changed.iter() {
debug!(
"Animation::update_style: scanning prop {:?} for animation \"{}\"",
property, self.name
);
let animation = PropertyAnimation::from_longhand(
property,
timing_function,
Time::from_seconds(relative_duration as f32),
&from_style,
&target_style,
);
match animation {
Some(property_animation) => {
debug!(
"Animation::update_style: got property animation for prop {:?}",
property
);
debug!("Animation::update_style: {:?}", property_animation);
property_animation.update(&mut new_style, relative_progress);
},
None => {
debug!(
"Animation::update_style: property animation {:?} not animating",
property
);
},
}
update_style_for_longhand(property);
}
debug!(
"Animation::update_style: got style change in animation \"{}\"",
self.name
);
*style = new_style;
}
}
@ -573,12 +554,9 @@ impl Transition {
/// Whether this animation has the same end value as another one.
#[inline]
fn has_same_end_value(&self, other_animation: &PropertyAnimation) -> bool {
if self.state == AnimationState::Canceled {
return false;
}
self.property_animation
.has_the_same_end_value_as(other_animation)
fn progress(&self, now: f64) -> f64 {
let progress = (now - self.start_time) / (self.property_animation.duration);
progress.min(1.0)
}
/// Update a style to the value specified by this `Transition` given a `SharedStyleContext`.
@ -588,9 +566,7 @@ impl Transition {
return;
}
let now = context.current_time_for_animations;
let progress = (now - self.start_time) / (self.property_animation.duration);
let progress = progress.min(1.0);
let progress = self.progress(context.current_time_for_animations);
if progress >= 0.0 {
self.property_animation.update(style, progress);
}
@ -782,7 +758,8 @@ pub fn start_transitions_if_applicable(
) -> LonghandIdSet {
// If the style of this element is display:none, then we don't start any transitions
// and we cancel any currently running transitions by returning an empty LonghandIdSet.
if new_style.get_box().clone_display().is_none() {
let box_style = new_style.get_box();
if box_style.clone_display().is_none() {
return LonghandIdSet::new();
}
@ -797,12 +774,8 @@ pub fn start_transitions_if_applicable(
let property_animation = match PropertyAnimation::from_longhand(
transition.longhand_id,
new_style
.get_box()
.transition_timing_function_mod(transition.index),
new_style
.get_box()
.transition_duration_mod(transition.index),
box_style.transition_timing_function_mod(transition.index),
box_style.transition_duration_mod(transition.index),
old_style,
new_style,
) {
@ -812,12 +785,13 @@ pub fn start_transitions_if_applicable(
// Per [1], don't trigger a new transition if the end state for that
// transition is the same as that of a transition that's running or
// completed.
// completed. We don't take into account any canceled animations.
// [1]: https://drafts.csswg.org/css-transitions/#starting
if animation_state
.transitions
.iter()
.any(|transition| transition.has_same_end_value(&property_animation))
.filter(|transition| transition.state != AnimationState::Canceled)
.any(|transition| transition.property_animation.to == property_animation.to)
{
continue;
}

View file

@ -57,132 +57,6 @@ impl From<nsCSSPropertyID> for TransitionProperty {
}
}
/// An animated property interpolation between two computed values for that
/// property.
#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "servo", derive(MallocSizeOf))]
pub enum AnimatedProperty {
% for prop in data.longhands:
% if prop.animatable and not prop.logical:
<%
value_type = "longhands::{}::computed_value::T".format(prop.ident)
if not prop.is_animatable_with_computed_value:
value_type = "<{} as ToAnimatedValue>::AnimatedValue".format(value_type)
%>
/// ${prop.name}
${prop.camel_case}(${value_type}, ${value_type}),
% endif
% endfor
}
impl AnimatedProperty {
/// Get the id of the property we're animating.
pub fn id(&self) -> LonghandId {
match *self {
% for prop in data.longhands:
% if prop.animatable and not prop.logical:
AnimatedProperty::${prop.camel_case}(..) => LonghandId::${prop.camel_case},
% endif
% endfor
}
}
/// Get the name of this property.
pub fn name(&self) -> &'static str {
self.id().name()
}
/// Whether this interpolation does animate, that is, whether the start and
/// end values are different.
pub fn does_animate(&self) -> bool {
match *self {
% for prop in data.longhands:
% if prop.animatable and not prop.logical:
AnimatedProperty::${prop.camel_case}(ref from, ref to) => from != to,
% endif
% endfor
}
}
/// Whether an animated property has the same end value as another.
pub fn has_the_same_end_value_as(&self, other: &Self) -> bool {
match (self, other) {
% for prop in data.longhands:
% if prop.animatable and not prop.logical:
(&AnimatedProperty::${prop.camel_case}(_, ref this_end_value),
&AnimatedProperty::${prop.camel_case}(_, ref other_end_value)) => {
this_end_value == other_end_value
}
% endif
% endfor
_ => false,
}
}
/// Update `style` with the proper computed style corresponding to this
/// animation at `progress`.
#[cfg_attr(feature = "gecko", allow(unused))]
pub fn update(&self, style: &mut ComputedValues, progress: f64) {
#[cfg(feature = "servo")]
{
match *self {
% for prop in data.longhands:
% if prop.animatable and not prop.logical:
AnimatedProperty::${prop.camel_case}(ref from, ref to) => {
// https://drafts.csswg.org/web-animations/#discrete-animation-type
% if prop.animation_value_type == "discrete":
let value = if progress < 0.5 { from.clone() } else { to.clone() };
% else:
let value = match from.animate(to, Procedure::Interpolate { progress }) {
Ok(value) => value,
Err(()) => return,
};
% endif
% if not prop.is_animatable_with_computed_value:
let value: longhands::${prop.ident}::computed_value::T =
ToAnimatedValue::from_animated_value(value);
% endif
style.mutate_${prop.style_struct.name_lower}().set_${prop.ident}(value);
}
% endif
% endfor
}
}
}
/// Get an animatable value from a transition-property, an old style, and a
/// new style.
pub fn from_longhand(
property: LonghandId,
old_style: &ComputedValues,
new_style: &ComputedValues,
) -> Option<AnimatedProperty> {
// FIXME(emilio): Handle the case where old_style and new_style's
// writing mode differ.
let property = property.to_physical(new_style.writing_mode);
Some(match property {
% for prop in data.longhands:
% if prop.animatable and not prop.logical:
LonghandId::${prop.camel_case} => {
let old_computed = old_style.clone_${prop.ident}();
let new_computed = new_style.clone_${prop.ident}();
AnimatedProperty::${prop.camel_case}(
% if prop.is_animatable_with_computed_value:
old_computed,
new_computed,
% else:
old_computed.to_animated_value(),
new_computed.to_animated_value(),
% endif
)
}
% endif
% endfor
_ => return None,
})
}
}
/// A collection of AnimationValue that were composed on an element.
/// This HashMap stores the values that are the last AnimationValue to be
/// composed for each TransitionProperty.
@ -192,11 +66,6 @@ pub type AnimationValueMap = FxHashMap<LonghandId, AnimationValue>;
/// property in order to be interpolated with another one. When interpolating,
/// both values need to belong to the same property.
///
/// This is different to AnimatedProperty in the sense that AnimatedProperty
/// also knows the final value to be used during the animation.
///
/// This is to be used in Gecko integration code.
///
/// FIXME: We need to add a path for custom properties, but that's trivial after
/// this (is a similar path to that of PropertyDeclaration).
#[cfg_attr(feature = "servo", derive(MallocSizeOf))]
@ -546,6 +415,30 @@ impl AnimationValue {
_ => return None,
})
}
/// Update `style` with the value of this `AnimationValue`.
///
/// SERVO ONLY: This doesn't properly handle things like updating 'em' units
/// when animated font-size.
pub fn set_in_style_for_servo(&self, style: &mut ComputedValues) {
match self {
% for prop in data.longhands:
% if prop.animatable and not prop.logical:
AnimationValue::${prop.camel_case}(ref value) => {
% if not prop.is_animatable_with_computed_value:
let value: longhands::${prop.ident}::computed_value::T =
ToAnimatedValue::from_animated_value(value.clone());
style.mutate_${prop.style_struct.name_lower}().set_${prop.ident}(value);
% else:
style.mutate_${prop.style_struct.name_lower}().set_${prop.ident}(value.clone());
% endif
}
% else:
AnimationValue::${prop.camel_case}(..) => unreachable!(),
% endif
% endfor
}
}
}
fn animate_discrete<T: Clone>(this: &T, other: &T, procedure: Procedure) -> Result<T, ()> {

View file

@ -47,9 +47,6 @@
[CSS Animations: property <line-height> from [14q\] to [normal\] at (0) should be [14q\]]
expected: FAIL
[CSS Animations: property <line-height> from [normal\] to [normal\] at (0.3) should be [normal\]]
expected: FAIL
[CSS Animations: property <line-height> from [normal\] to [4\] at (0) should be [normal\]]
expected: FAIL
@ -134,9 +131,6 @@
[Web Animations: property <line-height> from [14q\] to [normal\] at (0) should be [14q\]]
expected: FAIL
[CSS Animations: property <line-height> from [normal\] to [normal\] at (0) should be [normal\]]
expected: FAIL
[Web Animations: property <line-height> from [4\] to [14px\] at (0.5) should be [14px\]]
expected: FAIL
@ -224,9 +218,6 @@
[Web Animations: property <line-height> from [normal\] to [14px\] at (0) should be [normal\]]
expected: FAIL
[CSS Animations: property <line-height> from [normal\] to [normal\] at (-0.3) should be [normal\]]
expected: FAIL
[Web Animations: property <line-height> from [4q\] to [14q\] at (-0.3) should be [1q\]]
expected: FAIL
@ -323,9 +314,6 @@
[CSS Animations: property <line-height> from [14q\] to [normal\] at (0.3) should be [14q\]]
expected: FAIL
[CSS Animations: property <line-height> from [normal\] to [normal\] at (0.6) should be [normal\]]
expected: FAIL
[Web Animations: property <line-height> from [normal\] to [14px\] at (0.3) should be [normal\]]
expected: FAIL
@ -407,15 +395,9 @@
[Web Animations: property <line-height> from [inherit\] to [20px\] at (1.5) should be [15px\]]
expected: FAIL
[CSS Animations: property <line-height> from [normal\] to [normal\] at (1) should be [normal\]]
expected: FAIL
[CSS Animations: property <line-height> from [normal\] to [14px\] at (0.6) should be [14px\]]
expected: FAIL
[CSS Animations: property <line-height> from [normal\] to [normal\] at (1.5) should be [normal\]]
expected: FAIL
[Web Animations: property <line-height> from [inherit\] to [20px\] at (0.3) should be [27px\]]
expected: FAIL

View file

@ -1,2 +0,0 @@
[mix-blend-mode-animation.html]
expected: TIMEOUT

View file

@ -11,9 +11,6 @@
[CSS Animations: property <border-left-width> from [unset\] to [20px\] at (1.5) should be [28.5px\]]
expected: FAIL
[CSS Animations: property <border-left-width> from [0px\] to [10px\] at (-0.3) should be [0px\]]
expected: FAIL
[Web Animations: property <border-left-width> from [unset\] to [20px\] at (0.3) should be [8.1px\]]
expected: FAIL
@ -26,9 +23,6 @@
[CSS Animations: property <border-top-width> from [15px\] to [thick\] at (-2) should be [35px\]]
expected: FAIL
[CSS Animations: property <border-top-width> from [15px\] to [thick\] at (1.5) should be [0px\]]
expected: FAIL
[Web Animations: property <border-right-width> from [thin\] to [11px\] at (0.6) should be [7px\]]
expected: FAIL
@ -41,15 +35,6 @@
[Web Animations: property <border-left-width> from neutral to [20px\] at (1) should be [20px\]]
expected: FAIL
[CSS Animations: property <border-bottom-width> from [thick\] to [15px\] at (-2) should be [0px\]]
expected: FAIL
[CSS Animations: property <border-left-width> from [inherit\] to [20px\] at (0) should be [0px\]]
expected: FAIL
[CSS Animations: property <border-left-width> from [medium\] to [13px\] at (-2) should be [0px\]]
expected: FAIL
[CSS Animations: property <border-left-width> from [medium\] to [13px\] at (0.6) should be [9px\]]
expected: FAIL
@ -101,9 +86,6 @@
[CSS Transitions with transition: all: property <border-width> from [20px 40px 60px 80px\] to [30px 50px 70px 90px\] at (1.5) should be [35px 55px 75px 95px\]]
expected: FAIL
[CSS Animations: property <border-right-width> from [thin\] to [11px\] at (-0.3) should be [0px\]]
expected: FAIL
[CSS Animations: property <border-width> from [20px 40px 60px 80px\] to [30px 50px 70px 90px\] at (1.5) should be [35px 55px 75px 95px\]]
expected: FAIL
@ -146,9 +128,6 @@
[CSS Animations: property <border-right-width> from [thin\] to [11px\] at (1.5) should be [16px\]]
expected: FAIL
[CSS Animations: property <border-left-width> from [initial\] to [20px\] at (-0.3) should be [0px\]]
expected: FAIL
[CSS Animations: property <border-right-width> from [thin\] to [11px\] at (0.3) should be [4px\]]
expected: FAIL
@ -218,9 +197,6 @@
[CSS Animations: property <border-left-width> from [medium\] to [13px\] at (1.5) should be [18px\]]
expected: FAIL
[CSS Animations: property <border-right-width> from [thin\] to [11px\] at (-2) should be [0px\]]
expected: FAIL
[Web Animations: property <border-bottom-width> from [thick\] to [15px\] at (1.5) should be [20px\]]
expected: FAIL
@ -239,9 +215,6 @@
[CSS Animations: property <border-left-width> from [initial\] to [20px\] at (0) should be [3px\]]
expected: FAIL
[CSS Animations: property <border-left-width> from [inherit\] to [20px\] at (-0.3) should be [0px\]]
expected: FAIL
[Web Animations: property <border-bottom-width> from [thick\] to [15px\] at (-0.3) should be [2px\]]
expected: FAIL
@ -347,9 +320,6 @@
[Web Animations: property <border-right-width> from [thin\] to [11px\] at (-0.3) should be [0px\]]
expected: FAIL
[CSS Animations: property <border-left-width> from [0px\] to [10px\] at (0) should be [0px\]]
expected: FAIL
[CSS Transitions with transition: all: property <border-width> from [20px 40px 60px 80px\] to [30px 50px 70px 90px\] at (0) should be [20px 40px 60px 80px\]]
expected: FAIL
@ -383,9 +353,6 @@
[CSS Animations: property <border-top-width> from [15px\] to [thick\] at (1) should be [5px\]]
expected: FAIL
[CSS Animations: property <border-left-width> from [unset\] to [20px\] at (-0.3) should be [0px\]]
expected: FAIL
[CSS Animations: property <border-left-width> from neutral to [20px\] at (1.5) should be [25px\]]
expected: FAIL
@ -416,3 +383,6 @@
[Web Animations: property <border-left-width> from [0px\] to [10px\] at (1) should be [10px\]]
expected: FAIL
[CSS Animations: property <border-left-width> from [0px\] to [10px\] at (1) should be [10px\]]
expected: FAIL

View file

@ -92,12 +92,6 @@
[Web Animations: property <rotate> from [1 -2.5 3.64 100deg\] to [1 -2.5 3.64 -100deg\] at (-1) should be [0.22 -0.55 0.8 300deg\]]
expected: FAIL
[CSS Animations: property <rotate> from [none\] to [none\] at (0) should be [none\]]
expected: FAIL
[CSS Animations: property <rotate> from [none\] to [none\] at (2) should be [none\]]
expected: FAIL
[Web Animations: property <rotate> from neutral to [30deg\] at (1) should be [30deg\]]
expected: FAIL
@ -146,12 +140,6 @@
[Web Animations: property <rotate> from [100deg\] to [180deg\] at (0) should be [100deg\]]
expected: FAIL
[CSS Animations: property <rotate> from [none\] to [none\] at (0.125) should be [none\]]
expected: FAIL
[CSS Animations: property <rotate> from [none\] to [none\] at (1) should be [none\]]
expected: FAIL
[Web Animations: property <rotate> from [none\] to [7 -8 9 400grad\] at (-1) should be [0.5 -0.57 0.65 -400grad\]]
expected: FAIL
@ -242,9 +230,6 @@
[Web Animations: property <rotate> from [1 0 0 0deg\] to [0 1 0 10deg\] at (0) should be [0 1 0 0deg\]]
expected: FAIL
[CSS Animations: property <rotate> from [none\] to [none\] at (0.875) should be [none\]]
expected: FAIL
[Web Animations: property <rotate> from [unset\] to [30deg\] at (2) should be [60deg\]]
expected: FAIL
@ -353,9 +338,6 @@
[Web Animations: property <rotate> from [100deg\] to [180deg\] at (0.875) should be [170deg\]]
expected: FAIL
[CSS Animations: property <rotate> from [none\] to [none\] at (-1) should be [none\]]
expected: FAIL
[Web Animations: property <rotate> from [100deg\] to [180deg\] at (1) should be [180deg\]]
expected: FAIL

View file

@ -119,9 +119,6 @@
[CSS Animations: property <scale> from [inherit\] to [2 0.5 1\] at (-1) should be [-1 1.5 3\]]
expected: FAIL
[CSS Animations: property <scale> from [none\] to [none\] at (0.875) should be [none\]]
expected: FAIL
[Web Animations: property <scale> from [inherit\] to [2 0.5 1\] at (2) should be [3.5 0 0\]]
expected: FAIL
@ -149,9 +146,6 @@
[Web Animations: property <scale> from [26 17 9\] to [2 1\] at (0.875) should be [5 3 2\]]
expected: FAIL
[CSS Animations: property <scale> from [none\] to [none\] at (-1) should be [none\]]
expected: FAIL
[Web Animations: property <scale> from [none\] to [4 3 2\] at (1) should be [4 3 2\]]
expected: FAIL
@ -167,9 +161,6 @@
[Web Animations: property <scale> from [2 0.5 1\] to [inherit\] at (2) should be [-1 1.5 3\]]
expected: FAIL
[CSS Animations: property <scale> from [none\] to [none\] at (0.125) should be [none\]]
expected: FAIL
[Web Animations: property <scale> from [1\] to [10 -5 0\] at (1) should be [10 -5 0\]]
expected: FAIL
@ -179,9 +170,6 @@
[Web Animations: property <scale> from [2 30 400\] to [10 110 1200\] at (-1) should be [-6 -50 -400\]]
expected: FAIL
[CSS Animations: property <scale> from [none\] to [none\] at (1) should be [none\]]
expected: FAIL
[Web Animations: property <scale> from [26 17 9\] to [2 1\] at (0.125) should be [23 15 8\]]
expected: FAIL
@ -194,9 +182,6 @@
[Web Animations: property <scale> from [inherit\] to [2 0.5 1\] at (0) should be [0.5 1 2\]]
expected: FAIL
[CSS Animations: property <scale> from [none\] to [none\] at (0) should be [none\]]
expected: FAIL
[Web Animations: property <scale> from [none\] to [none\] at (1) should be [none\]]
expected: FAIL
@ -218,9 +203,6 @@
[Web Animations: property <scale> from [26 17 9\] to [2 1\] at (0) should be [26 17 9\]]
expected: FAIL
[CSS Animations: property <scale> from [2 0.5 1\] to [inherit\] at (0) should be [2 0.5\]]
expected: FAIL
[Web Animations: property <scale> from [-10 5\] to [10 -5\] at (0.75) should be [5 -2.5\]]
expected: FAIL
@ -341,9 +323,6 @@
[Web Animations: property <scale> from [inherit\] to [initial\] at (-1) should be [0 1 3\]]
expected: FAIL
[CSS Animations: property <scale> from [none\] to [none\] at (2) should be [none\]]
expected: FAIL
[CSS Animations: property <scale> from [initial\] to [inherit\] at (0) should be [1\]]
expected: FAIL

View file

@ -218,9 +218,6 @@
[Web Animations: property <translate> from [-100px -50px 100px\] to [0px\] at (-1) should be [-200px -100px 200px\]]
expected: FAIL
[CSS Animations: property <translate> from [200px 100px 200px\] to [inherit\] at (0) should be [200px 100px 200px\]]
expected: FAIL
[Web Animations: property <translate> from [inherit\] to [200px 100px 200px\] at (1) should be [200px 100px 200px\]]
expected: FAIL
@ -236,24 +233,15 @@
[Web Animations: property <translate> from neutral to [20px\] at (0.25) should be [12.5px\]]
expected: FAIL
[CSS Animations: property <translate> from [none\] to [none\] at (0.125) should be [none\]]
expected: FAIL
[Web Animations: property <translate> from [200px 100px 200px\] to [inherit\] at (0) should be [200px 100px 200px\]]
expected: FAIL
[Web Animations: property <translate> from [220px 240px 260px\] to [300px 400px 500px\] at (0) should be [220px 240px 260px\]]
expected: FAIL
[CSS Animations: property <translate> from [none\] to [none\] at (0.875) should be [none\]]
expected: FAIL
[Web Animations: property <translate> from neutral to [20px\] at (1) should be [20px\]]
expected: FAIL
[CSS Animations: property <translate> from [none\] to [none\] at (-1) should be [none\]]
expected: FAIL
[Web Animations: property <translate> from [200px 100px 400px\] to [initial\] at (0.75) should be [50px 25px 100px\]]
expected: FAIL
@ -440,18 +428,9 @@
[Web Animations: property <translate> from [220px 240px 260px\] to [300px 400px 500px\] at (1) should be [300px 400px 500px\]]
expected: FAIL
[CSS Animations: property <translate> from [none\] to [none\] at (0) should be [none\]]
expected: FAIL
[CSS Animations: property <translate> from [none\] to [none\] at (2) should be [none\]]
expected: FAIL
[Web Animations: property <translate> from neutral to [20px\] at (0.75) should be [17.5px\]]
expected: FAIL
[CSS Animations: property <translate> from [none\] to [none\] at (1) should be [none\]]
expected: FAIL
[Web Animations: property <translate> from [initial\] to [inherit\] at (-1) should be [-100px -200px -300px\]]
expected: FAIL

View file

@ -149,12 +149,6 @@
[CSS Animations: property <outline-width> from [0px\] to [10px\] at (1.5) should be [15px\]]
expected: FAIL
[CSS Animations: property <outline-width> from [initial\] to [20px\] at (-0.3) should be [0px\]]
expected: FAIL
[CSS Animations: property <outline-width> from [thick\] to [15px\] at (-2) should be [0px\]]
expected: FAIL
[CSS Animations: property <outline-width> from [thick\] to [15px\] at (0) should be [5px\]]
expected: FAIL
@ -191,9 +185,6 @@
[CSS Animations: property <outline-width> from [initial\] to [20px\] at (0.6) should be [13px\]]
expected: FAIL
[CSS Animations: property <outline-width> from [unset\] to [20px\] at (-0.3) should be [0px\]]
expected: FAIL
[CSS Animations: property <outline-width> from [unset\] to [20px\] at (1.5) should be [28px\]]
expected: FAIL
@ -206,9 +197,6 @@
[Web Animations: property <outline-width> from [inherit\] to [20px\] at (0) should be [30px\]]
expected: FAIL
[CSS Animations: property <outline-width> from [0px\] to [10px\] at (0) should be [0px\]]
expected: FAIL
[CSS Animations: property <outline-width> from neutral to [20px\] at (0.6) should be [16px\]]
expected: FAIL
@ -242,9 +230,6 @@
[CSS Transitions with transition: all: property <outline-width> from [unset\] to [20px\] at (1.5) should be [28px\]]
expected: FAIL
[CSS Animations: property <outline-width> from [0px\] to [10px\] at (-0.3) should be [0px\]]
expected: FAIL
[CSS Animations: property <outline-width> from [initial\] to [20px\] at (0) should be [3px\]]
expected: FAIL
@ -254,12 +239,6 @@
[CSS Transitions: property <outline-width> from [unset\] to [20px\] at (1.5) should be [28px\]]
expected: FAIL
[CSS Animations: property <outline-width> from [unset\] to [23px\] at (0) should be [3px\]]
expected: FAIL
[CSS Animations: property <outline-width> from [unset\] to [23px\] at (-0.3) should be [0px\]]
expected: FAIL
[Web Animations: property <outline-width> from [unset\] to [23px\] at (1.5) should be [33px\]]
expected: FAIL
@ -284,9 +263,6 @@
[CSS Animations: property <outline-width> from [initial\] to [23px\] at (1) should be [23px\]]
expected: FAIL
[CSS Animations: property <outline-width> from [initial\] to [23px\] at (-0.3) should be [0px\]]
expected: FAIL
[Web Animations: property <outline-width> from [unset\] to [23px\] at (-0.3) should be [0px\]]
expected: FAIL
@ -326,3 +302,9 @@
[CSS Animations: property <outline-width> from [initial\] to [23px\] at (1.5) should be [33px\]]
expected: FAIL
[CSS Animations: property <outline-width> from [unset\] to [23px\] at (0) should be [3px\]]
expected: FAIL
[CSS Animations: property <outline-width> from [0px\] to [10px\] at (1) should be [10px\]]
expected: FAIL