mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
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:
parent
bdfa6b0751
commit
0f1831e2fa
10 changed files with 101 additions and 362 deletions
|
@ -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.,
|
||||
);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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, ()> {
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -1,2 +0,0 @@
|
|||
[mix-blend-mode-animation.html]
|
||||
expected: TIMEOUT
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue