LibWeb: Support interpolation of CalculatedStyleValue

We also support interpolating from a CalculatedStyleValue to a
compatible dimension or percentage style value.

This also brings with it a couple of improvements in how we handle
interpolation between mixed dimension and percentage types in terms of:
 - Proper simplification of the resulting calc()
 - Improved handling of interpolation outside the 0-1 range
This commit is contained in:
Callum Law 2025-09-08 20:12:41 +12:00 committed by Tim Ledbetter
commit 5ed3b2ed16
Notes: github-actions[bot] 2025-09-08 11:00:12 +00:00
6 changed files with 181 additions and 156 deletions

View file

@ -1024,78 +1024,101 @@ RefPtr<StyleValue const> interpolate_box_shadow(DOM::Element& element, Calculati
static RefPtr<StyleValue const> interpolate_value_impl(DOM::Element& element, CalculationContext const& calculation_context, StyleValue const& from, StyleValue const& to, float delta, AllowDiscrete allow_discrete)
{
if (from.type() != to.type()) {
// Handle mixed percentage and dimension types
if (from.type() != to.type() || from.is_calculated() || to.is_calculated()) {
// Handle mixed percentage and dimension types, as well as CalculatedStyleValues
// https://www.w3.org/TR/css-values-4/#mixed-percentages
struct NumericBaseTypeAndDefault {
NumericType::BaseType base_type;
ValueComparingNonnullRefPtr<StyleValue const> default_value;
};
static constexpr auto numeric_base_type_and_default = [](StyleValue const& value) -> Optional<NumericBaseTypeAndDefault> {
switch (value.type()) {
case StyleValue::Type::Angle: {
static auto default_angle_value = AngleStyleValue::create(Angle::make_degrees(0));
return NumericBaseTypeAndDefault { NumericType::BaseType::Angle, default_angle_value };
}
case StyleValue::Type::Frequency: {
static auto default_frequency_value = FrequencyStyleValue::create(Frequency::make_hertz(0));
return NumericBaseTypeAndDefault { NumericType::BaseType::Frequency, default_frequency_value };
}
case StyleValue::Type::Length: {
static auto default_length_value = LengthStyleValue::create(Length::make_px(0));
return NumericBaseTypeAndDefault { NumericType::BaseType::Length, default_length_value };
}
case StyleValue::Type::Percentage: {
static auto default_percentage_value = PercentageStyleValue::create(Percentage { 0.0 });
return NumericBaseTypeAndDefault { NumericType::BaseType::Percent, default_percentage_value };
}
case StyleValue::Type::Time: {
static auto default_time_value = TimeStyleValue::create(Time::make_seconds(0));
return NumericBaseTypeAndDefault { NumericType::BaseType::Time, default_time_value };
}
default:
return {};
}
};
static auto to_calculation_node = [calculation_context](StyleValue const& value) -> NonnullRefPtr<CalculationNode const> {
auto get_value_type_of_numeric_style_value = [&calculation_context](StyleValue const& value) -> Optional<ValueType> {
switch (value.type()) {
case StyleValue::Type::Angle:
return NumericCalculationNode::create(value.as_angle().angle(), calculation_context);
return ValueType::Angle;
case StyleValue::Type::Frequency:
return NumericCalculationNode::create(value.as_frequency().frequency(), calculation_context);
return ValueType::Frequency;
case StyleValue::Type::Integer:
return ValueType::Integer;
case StyleValue::Type::Length:
return NumericCalculationNode::create(value.as_length().length(), calculation_context);
return ValueType::Length;
case StyleValue::Type::Number:
return ValueType::Number;
case StyleValue::Type::Percentage:
return NumericCalculationNode::create(value.as_percentage().percentage(), calculation_context);
return calculation_context.percentages_resolve_as.value_or(ValueType::Percentage);
case StyleValue::Type::Resolution:
return ValueType::Resolution;
case StyleValue::Type::Time:
return NumericCalculationNode::create(value.as_time().time(), calculation_context);
return ValueType::Time;
case StyleValue::Type::Calculated: {
auto const& calculated = value.as_calculated();
if (calculated.resolves_to_angle_percentage())
return ValueType::Angle;
if (calculated.resolves_to_frequency_percentage())
return ValueType::Frequency;
if (calculated.resolves_to_length_percentage())
return ValueType::Length;
if (calculated.resolves_to_resolution())
return ValueType::Resolution;
if (calculated.resolves_to_number())
return calculation_context.resolve_numbers_as_integers ? ValueType::Integer : ValueType::Number;
if (calculated.resolves_to_percentage())
return calculation_context.percentages_resolve_as.value_or(ValueType::Percentage);
if (calculated.resolves_to_time_percentage())
return ValueType::Time;
return {};
}
default:
VERIFY_NOT_REACHED();
return {};
}
};
auto from_base_type_and_default = numeric_base_type_and_default(from);
auto to_base_type_and_default = numeric_base_type_and_default(to);
auto from_value_type = get_value_type_of_numeric_style_value(from);
auto to_value_type = get_value_type_of_numeric_style_value(to);
if (from_base_type_and_default.has_value() && to_base_type_and_default.has_value() && (from_base_type_and_default->base_type == NumericType::BaseType::Percent || to_base_type_and_default->base_type == NumericType::BaseType::Percent)) {
// This is an interpolation from a numeric unit to a percentage, or vice versa. The trick here is to
// interpolate two separate values. For example, consider an interpolation from 30px to 80%. It's quite
// hard to understand how this interpolation works, but if instead we rewrite the values as "30px + 0%" and
// "0px + 80%", then it is very simple to understand; we just interpolate each component separately.
if (from_value_type.has_value() && from_value_type == to_value_type) {
auto to_calculation_node = [&calculation_context](StyleValue const& value) -> NonnullRefPtr<CalculationNode const> {
switch (value.type()) {
case StyleValue::Type::Angle:
return NumericCalculationNode::create(value.as_angle().angle(), calculation_context);
case StyleValue::Type::Frequency:
return NumericCalculationNode::create(value.as_frequency().frequency(), calculation_context);
case StyleValue::Type::Integer:
// https://drafts.csswg.org/css-values-4/#combine-integers
// Interpolation of <integer> is defined as Vresult = round((1 - p) × VA + p × VB); that is,
// interpolation happens in the real number space as for <number>s, and the result is converted to an
// <integer> by rounding to the nearest integer.
return NumericCalculationNode::create(Number { Number::Type::Number, static_cast<double>(value.as_integer().integer()) }, calculation_context);
case StyleValue::Type::Length:
return NumericCalculationNode::create(value.as_length().length(), calculation_context);
case StyleValue::Type::Number:
return NumericCalculationNode::create(Number { Number::Type::Number, value.as_number().number() }, calculation_context);
case StyleValue::Type::Percentage:
return NumericCalculationNode::create(value.as_percentage().percentage(), calculation_context);
case StyleValue::Type::Time:
return NumericCalculationNode::create(value.as_time().time(), calculation_context);
case StyleValue::Type::Calculated:
return value.as_calculated().calculation();
default:
VERIFY_NOT_REACHED();
}
};
auto interpolated_from = interpolate_value(element, calculation_context, from, from_base_type_and_default->default_value, delta, allow_discrete);
auto interpolated_to = interpolate_value(element, calculation_context, to_base_type_and_default->default_value, to, delta, allow_discrete);
if (!interpolated_from || !interpolated_to)
return {};
auto from_node = to_calculation_node(from);
auto to_node = to_calculation_node(to);
Vector<NonnullRefPtr<CalculationNode const>> values;
values.ensure_capacity(2);
values.unchecked_append(to_calculation_node(*interpolated_from));
values.unchecked_append(to_calculation_node(*interpolated_to));
auto calc_node = SumCalculationNode::create(move(values));
return CalculatedStyleValue::create(move(calc_node), NumericType { to_base_type_and_default->base_type, 1 }, calculation_context);
// https://drafts.csswg.org/css-values-4/#combine-math
// Interpolation of math functions, with each other or with numeric values and other numeric-valued functions, is defined as Vresult = calc((1 - p) * VA + p * VB).
auto from_contribution = ProductCalculationNode::create({
from_node,
NumericCalculationNode::create(Number { Number::Type::Number, 1.f - delta }, calculation_context),
});
auto to_contribution = ProductCalculationNode::create({
to_node,
NumericCalculationNode::create(Number { Number::Type::Number, delta }, calculation_context),
});
return CalculatedStyleValue::create(
simplify_a_calculation_tree(SumCalculationNode::create({ from_contribution, to_contribution }), calculation_context, {}),
*from_node->numeric_type()->added_to(*to_node->numeric_type()),
calculation_context);
}
return {};

View file

@ -73,6 +73,8 @@ public:
virtual ValueComparingNonnullRefPtr<StyleValue const> absolutized(CSSPixelRect const& viewport_rect, Length::FontMetrics const& font_metrics, Length::FontMetrics const& root_font_metrics) const override;
virtual bool equals(StyleValue const& other) const override;
NonnullRefPtr<CalculationNode const> calculation() const { return m_calculation; }
bool resolves_to_angle() const { return m_resolved_type.matches_angle(m_context.percentages_resolve_as); }
bool resolves_to_angle_percentage() const { return m_resolved_type.matches_angle_percentage(m_context.percentages_resolve_as); }
Optional<Angle> resolve_angle_deprecated(CalculationResolutionContext const&) const;

View file

@ -2,8 +2,8 @@ Harness status: OK
Found 558 tests
510 Pass
48 Fail
522 Pass
36 Fail
Pass CSS Transitions: property <border-image-width> from neutral to [20px] at (-0.3) should be [7px]
Pass CSS Transitions: property <border-image-width> from neutral to [20px] at (0) should be [10px]
Pass CSS Transitions: property <border-image-width> from neutral to [20px] at (0.3) should be [13px]
@ -293,13 +293,13 @@ Fail CSS Transitions with transition: all: property <border-image-width> from [1
Fail CSS Transitions with transition: all: property <border-image-width> from [10%] to [20px] at (1) should be [calc(0% + 20px)]
Fail CSS Transitions with transition: all: property <border-image-width> from [10%] to [20px] at (1.5) should be [calc(-5% + 30px)]
Fail CSS Animations: property <border-image-width> from [10%] to [20px] at (-0.3) should be [calc(13% + -6px)]
Fail CSS Animations: property <border-image-width> from [10%] to [20px] at (0) should be [10%]
Pass CSS Animations: property <border-image-width> from [10%] to [20px] at (0) should be [10%]
Fail CSS Animations: property <border-image-width> from [10%] to [20px] at (0.3) should be [calc(7% + 6px)]
Fail CSS Animations: property <border-image-width> from [10%] to [20px] at (0.6) should be [calc(4% + 12px)]
Fail CSS Animations: property <border-image-width> from [10%] to [20px] at (1) should be [calc(0% + 20px)]
Fail CSS Animations: property <border-image-width> from [10%] to [20px] at (1.5) should be [calc(-5% + 30px)]
Fail Web Animations: property <border-image-width> from [10%] to [20px] at (-0.3) should be [calc(13% + -6px)]
Fail Web Animations: property <border-image-width> from [10%] to [20px] at (0) should be [10%]
Pass Web Animations: property <border-image-width> from [10%] to [20px] at (0) should be [10%]
Fail Web Animations: property <border-image-width> from [10%] to [20px] at (0.3) should be [calc(7% + 6px)]
Fail Web Animations: property <border-image-width> from [10%] to [20px] at (0.6) should be [calc(4% + 12px)]
Fail Web Animations: property <border-image-width> from [10%] to [20px] at (1) should be [calc(0% + 20px)]
@ -308,25 +308,25 @@ Fail CSS Transitions: property <border-image-width> from [10px] to [20%] at (-0.
Fail CSS Transitions: property <border-image-width> from [10px] to [20%] at (0) should be [calc(0% + 10px)]
Fail CSS Transitions: property <border-image-width> from [10px] to [20%] at (0.3) should be [calc(7px + 6%)]
Fail CSS Transitions: property <border-image-width> from [10px] to [20%] at (0.6) should be [calc(4px + 12%)]
Fail CSS Transitions: property <border-image-width> from [10px] to [20%] at (1) should be [20%]
Pass CSS Transitions: property <border-image-width> from [10px] to [20%] at (1) should be [20%]
Fail CSS Transitions: property <border-image-width> from [10px] to [20%] at (1.5) should be [calc(-5px + 30%)]
Fail CSS Transitions with transition: all: property <border-image-width> from [10px] to [20%] at (-0.3) should be [calc(13px + -6%)]
Fail CSS Transitions with transition: all: property <border-image-width> from [10px] to [20%] at (0) should be [calc(0% + 10px)]
Fail CSS Transitions with transition: all: property <border-image-width> from [10px] to [20%] at (0.3) should be [calc(7px + 6%)]
Fail CSS Transitions with transition: all: property <border-image-width> from [10px] to [20%] at (0.6) should be [calc(4px + 12%)]
Fail CSS Transitions with transition: all: property <border-image-width> from [10px] to [20%] at (1) should be [20%]
Pass CSS Transitions with transition: all: property <border-image-width> from [10px] to [20%] at (1) should be [20%]
Fail CSS Transitions with transition: all: property <border-image-width> from [10px] to [20%] at (1.5) should be [calc(-5px + 30%)]
Fail CSS Animations: property <border-image-width> from [10px] to [20%] at (-0.3) should be [calc(13px + -6%)]
Fail CSS Animations: property <border-image-width> from [10px] to [20%] at (0) should be [calc(0% + 10px)]
Fail CSS Animations: property <border-image-width> from [10px] to [20%] at (0.3) should be [calc(7px + 6%)]
Pass CSS Animations: property <border-image-width> from [10px] to [20%] at (-0.3) should be [calc(13px + -6%)]
Pass CSS Animations: property <border-image-width> from [10px] to [20%] at (0) should be [calc(0% + 10px)]
Pass CSS Animations: property <border-image-width> from [10px] to [20%] at (0.3) should be [calc(7px + 6%)]
Fail CSS Animations: property <border-image-width> from [10px] to [20%] at (0.6) should be [calc(4px + 12%)]
Fail CSS Animations: property <border-image-width> from [10px] to [20%] at (1) should be [20%]
Pass CSS Animations: property <border-image-width> from [10px] to [20%] at (1) should be [20%]
Fail CSS Animations: property <border-image-width> from [10px] to [20%] at (1.5) should be [calc(-5px + 30%)]
Fail Web Animations: property <border-image-width> from [10px] to [20%] at (-0.3) should be [calc(13px + -6%)]
Fail Web Animations: property <border-image-width> from [10px] to [20%] at (0) should be [calc(0% + 10px)]
Fail Web Animations: property <border-image-width> from [10px] to [20%] at (0.3) should be [calc(7px + 6%)]
Pass Web Animations: property <border-image-width> from [10px] to [20%] at (-0.3) should be [calc(13px + -6%)]
Pass Web Animations: property <border-image-width> from [10px] to [20%] at (0) should be [calc(0% + 10px)]
Pass Web Animations: property <border-image-width> from [10px] to [20%] at (0.3) should be [calc(7px + 6%)]
Fail Web Animations: property <border-image-width> from [10px] to [20%] at (0.6) should be [calc(4px + 12%)]
Fail Web Animations: property <border-image-width> from [10px] to [20%] at (1) should be [20%]
Pass Web Animations: property <border-image-width> from [10px] to [20%] at (1) should be [20%]
Fail Web Animations: property <border-image-width> from [10px] to [20%] at (1.5) should be [calc(-5px + 30%)]
Pass CSS Transitions: property <border-image-width> from [10px auto auto 20] to [110px auto auto 120] at (-0.3) should be [ 0px auto auto 0]
Pass CSS Transitions: property <border-image-width> from [10px auto auto 20] to [110px auto auto 120] at (0) should be [ 10px auto auto 20]

View file

@ -2,8 +2,8 @@ Harness status: OK
Found 402 tests
300 Pass
102 Fail
318 Pass
84 Fail
Pass CSS Transitions: property <box-shadow> from neutral to [20px 20px 20px 20px black] at (-0.3) should be [rgb(0, 0, 0) 7px 33px 7px 33px]
Pass CSS Transitions: property <box-shadow> from neutral to [20px 20px 20px 20px black] at (0) should be [rgb(0, 0, 0) 10px 30px 10px 30px]
Pass CSS Transitions: property <box-shadow> from neutral to [20px 20px 20px 20px black] at (0.3) should be [rgb(0, 0, 0) 13px 27px 13px 27px]
@ -268,30 +268,30 @@ Fail Web Animations: property <box-shadow> from [10px 20px rgba(255, 255, 0, 0.5
Fail Web Animations: property <box-shadow> from [10px 20px rgba(255, 255, 0, 0.5), inset 5px 10em #008000] to [none] at (0.6) should be [rgba(255, 255, 0, 0.2) 4px 8px 0px 0px, rgba(0, 128, 0, 0.4) 2px 12px 0px 0px inset]
Pass Web Animations: property <box-shadow> from [10px 20px rgba(255, 255, 0, 0.5), inset 5px 10em #008000] to [none] at (1) should be [rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px inset]
Pass Web Animations: property <box-shadow> from [10px 20px rgba(255, 255, 0, 0.5), inset 5px 10em #008000] to [none] at (1.5) should be [rgba(0, 0, 0, 0) -5px -10px 0px 0px, rgba(0, 0, 0, 0) -2.5px -15px 0px 0px inset]
Fail CSS Transitions: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (-0.3) should be [rgb(0, 0, 0) 0px 0px 0px -4.5px inset]
Fail CSS Transitions: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (0) should be [rgb(0, 0, 0) 0px 0px 0px 0px inset]
Fail CSS Transitions: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (0.3) should be [rgb(0, 0, 0) 0px 0px 0px 4.5px inset]
Fail CSS Transitions: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (0.6) should be [rgb(0, 0, 0) 0px 0px 0px 9px inset]
Pass CSS Transitions: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (-0.3) should be [rgb(0, 0, 0) 0px 0px 0px -4.5px inset]
Pass CSS Transitions: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (0) should be [rgb(0, 0, 0) 0px 0px 0px 0px inset]
Pass CSS Transitions: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (0.3) should be [rgb(0, 0, 0) 0px 0px 0px 4.5px inset]
Pass CSS Transitions: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (0.6) should be [rgb(0, 0, 0) 0px 0px 0px 9px inset]
Pass CSS Transitions: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (1) should be [rgb(0, 0, 0) 0px 0px 0px 15px inset]
Fail CSS Transitions: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (1.5) should be [rgb(0, 0, 0) 0px 0px 0px 22.5px inset]
Fail CSS Transitions with transition: all: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (-0.3) should be [rgb(0, 0, 0) 0px 0px 0px -4.5px inset]
Fail CSS Transitions with transition: all: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (0) should be [rgb(0, 0, 0) 0px 0px 0px 0px inset]
Fail CSS Transitions with transition: all: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (0.3) should be [rgb(0, 0, 0) 0px 0px 0px 4.5px inset]
Fail CSS Transitions with transition: all: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (0.6) should be [rgb(0, 0, 0) 0px 0px 0px 9px inset]
Pass CSS Transitions: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (1.5) should be [rgb(0, 0, 0) 0px 0px 0px 22.5px inset]
Pass CSS Transitions with transition: all: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (-0.3) should be [rgb(0, 0, 0) 0px 0px 0px -4.5px inset]
Pass CSS Transitions with transition: all: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (0) should be [rgb(0, 0, 0) 0px 0px 0px 0px inset]
Pass CSS Transitions with transition: all: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (0.3) should be [rgb(0, 0, 0) 0px 0px 0px 4.5px inset]
Pass CSS Transitions with transition: all: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (0.6) should be [rgb(0, 0, 0) 0px 0px 0px 9px inset]
Pass CSS Transitions with transition: all: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (1) should be [rgb(0, 0, 0) 0px 0px 0px 15px inset]
Fail CSS Transitions with transition: all: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (1.5) should be [rgb(0, 0, 0) 0px 0px 0px 22.5px inset]
Fail CSS Animations: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (-0.3) should be [rgb(0, 0, 0) 0px 0px 0px -4.5px inset]
Pass CSS Transitions with transition: all: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (1.5) should be [rgb(0, 0, 0) 0px 0px 0px 22.5px inset]
Pass CSS Animations: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (-0.3) should be [rgb(0, 0, 0) 0px 0px 0px -4.5px inset]
Pass CSS Animations: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (0) should be [rgb(0, 0, 0) 0px 0px 0px 0px inset]
Fail CSS Animations: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (0.3) should be [rgb(0, 0, 0) 0px 0px 0px 4.5px inset]
Fail CSS Animations: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (0.6) should be [rgb(0, 0, 0) 0px 0px 0px 9px inset]
Pass CSS Animations: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (0.3) should be [rgb(0, 0, 0) 0px 0px 0px 4.5px inset]
Pass CSS Animations: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (0.6) should be [rgb(0, 0, 0) 0px 0px 0px 9px inset]
Pass CSS Animations: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (1) should be [rgb(0, 0, 0) 0px 0px 0px 15px inset]
Fail CSS Animations: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (1.5) should be [rgb(0, 0, 0) 0px 0px 0px 22.5px inset]
Fail Web Animations: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (-0.3) should be [rgb(0, 0, 0) 0px 0px 0px -4.5px inset]
Pass CSS Animations: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (1.5) should be [rgb(0, 0, 0) 0px 0px 0px 22.5px inset]
Pass Web Animations: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (-0.3) should be [rgb(0, 0, 0) 0px 0px 0px -4.5px inset]
Pass Web Animations: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (0) should be [rgb(0, 0, 0) 0px 0px 0px 0px inset]
Fail Web Animations: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (0.3) should be [rgb(0, 0, 0) 0px 0px 0px 4.5px inset]
Fail Web Animations: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (0.6) should be [rgb(0, 0, 0) 0px 0px 0px 9px inset]
Pass Web Animations: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (0.3) should be [rgb(0, 0, 0) 0px 0px 0px 4.5px inset]
Pass Web Animations: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (0.6) should be [rgb(0, 0, 0) 0px 0px 0px 9px inset]
Pass Web Animations: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (1) should be [rgb(0, 0, 0) 0px 0px 0px 15px inset]
Fail Web Animations: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (1.5) should be [rgb(0, 0, 0) 0px 0px 0px 22.5px inset]
Pass Web Animations: property <box-shadow> from [inset 0 0 0 0 black] to [inset 0 0 0 calc(max(10em, 20px) / 2) black] at (1.5) should be [rgb(0, 0, 0) 0px 0px 0px 22.5px inset]
Fail CSS Transitions with transition-behavior:allow-discrete: property <box-shadow> from [10px 20px yellow, 5px 10px green] to [inset 5px 10px green, 15px 20px blue] at (-0.3) should be [10px 20px yellow, 5px 10px green]
Pass CSS Transitions with transition-behavior:allow-discrete: property <box-shadow> from [10px 20px yellow, 5px 10px green] to [inset 5px 10px green, 15px 20px blue] at (0) should be [10px 20px yellow, 5px 10px green]
Fail CSS Transitions with transition-behavior:allow-discrete: property <box-shadow> from [10px 20px yellow, 5px 10px green] to [inset 5px 10px green, 15px 20px blue] at (0.3) should be [10px 20px yellow, 5px 10px green]

View file

@ -2,8 +2,8 @@ Harness status: OK
Found 456 tests
406 Pass
50 Fail
414 Pass
42 Fail
Pass CSS Transitions: property <width> from neutral to [40px] at (-0.3) should be [1px]
Pass CSS Transitions: property <width> from neutral to [40px] at (0) should be [10px]
Pass CSS Transitions: property <width> from neutral to [40px] at (0.3) should be [19px]
@ -160,30 +160,30 @@ Pass Web Animations: property <width> from [0px] to [100px] at (0.3) should be [
Pass Web Animations: property <width> from [0px] to [100px] at (0.6) should be [60px]
Pass Web Animations: property <width> from [0px] to [100px] at (1) should be [100px]
Pass Web Animations: property <width> from [0px] to [100px] at (1.5) should be [150px]
Fail CSS Transitions: property <width> from [10px] to [100%] at (-0.3) should be [0px]
Pass CSS Transitions: property <width> from [10px] to [100%] at (-0.3) should be [0px]
Pass CSS Transitions: property <width> from [10px] to [100%] at (0) should be [10px]
Pass CSS Transitions: property <width> from [10px] to [100%] at (0.3) should be [37px]
Pass CSS Transitions: property <width> from [10px] to [100%] at (0.6) should be [64px]
Pass CSS Transitions: property <width> from [10px] to [100%] at (1) should be [100px]
Fail CSS Transitions: property <width> from [10px] to [100%] at (1.5) should be [145px]
Fail CSS Transitions with transition: all: property <width> from [10px] to [100%] at (-0.3) should be [0px]
Pass CSS Transitions: property <width> from [10px] to [100%] at (1.5) should be [145px]
Pass CSS Transitions with transition: all: property <width> from [10px] to [100%] at (-0.3) should be [0px]
Pass CSS Transitions with transition: all: property <width> from [10px] to [100%] at (0) should be [10px]
Pass CSS Transitions with transition: all: property <width> from [10px] to [100%] at (0.3) should be [37px]
Pass CSS Transitions with transition: all: property <width> from [10px] to [100%] at (0.6) should be [64px]
Pass CSS Transitions with transition: all: property <width> from [10px] to [100%] at (1) should be [100px]
Fail CSS Transitions with transition: all: property <width> from [10px] to [100%] at (1.5) should be [145px]
Fail CSS Animations: property <width> from [10px] to [100%] at (-0.3) should be [0px]
Pass CSS Transitions with transition: all: property <width> from [10px] to [100%] at (1.5) should be [145px]
Pass CSS Animations: property <width> from [10px] to [100%] at (-0.3) should be [0px]
Pass CSS Animations: property <width> from [10px] to [100%] at (0) should be [10px]
Pass CSS Animations: property <width> from [10px] to [100%] at (0.3) should be [37px]
Pass CSS Animations: property <width> from [10px] to [100%] at (0.6) should be [64px]
Pass CSS Animations: property <width> from [10px] to [100%] at (1) should be [100px]
Fail CSS Animations: property <width> from [10px] to [100%] at (1.5) should be [145px]
Fail Web Animations: property <width> from [10px] to [100%] at (-0.3) should be [0px]
Pass CSS Animations: property <width> from [10px] to [100%] at (1.5) should be [145px]
Pass Web Animations: property <width> from [10px] to [100%] at (-0.3) should be [0px]
Pass Web Animations: property <width> from [10px] to [100%] at (0) should be [10px]
Pass Web Animations: property <width> from [10px] to [100%] at (0.3) should be [37px]
Pass Web Animations: property <width> from [10px] to [100%] at (0.6) should be [64px]
Pass Web Animations: property <width> from [10px] to [100%] at (1) should be [100px]
Fail Web Animations: property <width> from [10px] to [100%] at (1.5) should be [145px]
Pass Web Animations: property <width> from [10px] to [100%] at (1.5) should be [145px]
Pass CSS Transitions with transition-behavior:allow-discrete: property <width> from [auto] to [40px] at (-0.3) should be [auto]
Pass CSS Transitions with transition-behavior:allow-discrete: property <width> from [auto] to [40px] at (0) should be [auto]
Pass CSS Transitions with transition-behavior:allow-discrete: property <width> from [auto] to [40px] at (0.3) should be [auto]

View file

@ -2,92 +2,92 @@ Harness status: OK
Found 140 tests
84 Pass
56 Fail
Fail CSS Transitions: property <left> from [0px] to [calc(infinity * 1px)] at (-0.25) should be [-8.5070575e+37px]
Fail CSS Transitions: property <left> from [0px] to [calc(infinity * 1px)] at (0) should be [0px]
136 Pass
4 Fail
Pass CSS Transitions: property <left> from [0px] to [calc(infinity * 1px)] at (-0.25) should be [-8.5070575e+37px]
Pass CSS Transitions: property <left> from [0px] to [calc(infinity * 1px)] at (0) should be [0px]
Pass CSS Transitions: property <left> from [0px] to [calc(infinity * 1px)] at (0.25) should be [8.5070575e+37px]
Pass CSS Transitions: property <left> from [0px] to [calc(infinity * 1px)] at (0.5) should be [1.7014115e+38px]
Pass CSS Transitions: property <left> from [0px] to [calc(infinity * 1px)] at (0.75) should be [2.55211725e+38px]
Pass CSS Transitions: property <left> from [0px] to [calc(infinity * 1px)] at (1) should be [3.402823e+38px]
Pass CSS Transitions: property <left> from [0px] to [calc(infinity * 1px)] at (1.25) should be [4.2535287499999996e+38px]
Fail CSS Transitions with transition: all: property <left> from [0px] to [calc(infinity * 1px)] at (-0.25) should be [-8.5070575e+37px]
Fail CSS Transitions with transition: all: property <left> from [0px] to [calc(infinity * 1px)] at (0) should be [0px]
Pass CSS Transitions with transition: all: property <left> from [0px] to [calc(infinity * 1px)] at (-0.25) should be [-8.5070575e+37px]
Pass CSS Transitions with transition: all: property <left> from [0px] to [calc(infinity * 1px)] at (0) should be [0px]
Pass CSS Transitions with transition: all: property <left> from [0px] to [calc(infinity * 1px)] at (0.25) should be [8.5070575e+37px]
Pass CSS Transitions with transition: all: property <left> from [0px] to [calc(infinity * 1px)] at (0.5) should be [1.7014115e+38px]
Pass CSS Transitions with transition: all: property <left> from [0px] to [calc(infinity * 1px)] at (0.75) should be [2.55211725e+38px]
Pass CSS Transitions with transition: all: property <left> from [0px] to [calc(infinity * 1px)] at (1) should be [3.402823e+38px]
Pass CSS Transitions with transition: all: property <left> from [0px] to [calc(infinity * 1px)] at (1.25) should be [4.2535287499999996e+38px]
Fail CSS Animations: property <left> from [0px] to [calc(infinity * 1px)] at (-0.25) should be [-3.402823e+38px]
Pass CSS Animations: property <left> from [0px] to [calc(infinity * 1px)] at (-0.25) should be [-3.402823e+38px]
Pass CSS Animations: property <left> from [0px] to [calc(infinity * 1px)] at (0) should be [0px]
Fail CSS Animations: property <left> from [0px] to [calc(infinity * 1px)] at (0.25) should be [3.402823e+38px]
Pass CSS Animations: property <left> from [0px] to [calc(infinity * 1px)] at (0.25) should be [3.402823e+38px]
Pass CSS Animations: property <left> from [0px] to [calc(infinity * 1px)] at (0.5) should be [3.402823e+38px]
Pass CSS Animations: property <left> from [0px] to [calc(infinity * 1px)] at (0.75) should be [3.402823e+38px]
Pass CSS Animations: property <left> from [0px] to [calc(infinity * 1px)] at (1) should be [3.402823e+38px]
Pass CSS Animations: property <left> from [0px] to [calc(infinity * 1px)] at (1.25) should be [3.402823e+38px]
Fail Web Animations: property <left> from [0px] to [calc(infinity * 1px)] at (-0.25) should be [-3.402823e+38px]
Pass Web Animations: property <left> from [0px] to [calc(infinity * 1px)] at (-0.25) should be [-3.402823e+38px]
Pass Web Animations: property <left> from [0px] to [calc(infinity * 1px)] at (0) should be [0px]
Fail Web Animations: property <left> from [0px] to [calc(infinity * 1px)] at (0.25) should be [3.402823e+38px]
Pass Web Animations: property <left> from [0px] to [calc(infinity * 1px)] at (0.25) should be [3.402823e+38px]
Pass Web Animations: property <left> from [0px] to [calc(infinity * 1px)] at (0.5) should be [3.402823e+38px]
Pass Web Animations: property <left> from [0px] to [calc(infinity * 1px)] at (0.75) should be [3.402823e+38px]
Pass Web Animations: property <left> from [0px] to [calc(infinity * 1px)] at (1) should be [3.402823e+38px]
Pass Web Animations: property <left> from [0px] to [calc(infinity * 1px)] at (1.25) should be [3.402823e+38px]
Fail CSS Transitions: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (-0.25) should be [-10px]
Fail CSS Transitions: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0) should be [0px]
Fail CSS Transitions: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.25) should be [10px]
Fail CSS Transitions: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.5) should be [20px]
Fail CSS Transitions: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.75) should be [30px]
Pass CSS Transitions: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (-0.25) should be [-10px]
Pass CSS Transitions: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0) should be [0px]
Pass CSS Transitions: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.25) should be [10px]
Pass CSS Transitions: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.5) should be [20px]
Pass CSS Transitions: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.75) should be [30px]
Pass CSS Transitions: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (1) should be [40px]
Fail CSS Transitions: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (1.25) should be [50px]
Fail CSS Transitions with transition: all: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (-0.25) should be [-10px]
Fail CSS Transitions with transition: all: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0) should be [0px]
Fail CSS Transitions with transition: all: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.25) should be [10px]
Fail CSS Transitions with transition: all: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.5) should be [20px]
Fail CSS Transitions with transition: all: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.75) should be [30px]
Pass CSS Transitions: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (1.25) should be [50px]
Pass CSS Transitions with transition: all: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (-0.25) should be [-10px]
Pass CSS Transitions with transition: all: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0) should be [0px]
Pass CSS Transitions with transition: all: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.25) should be [10px]
Pass CSS Transitions with transition: all: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.5) should be [20px]
Pass CSS Transitions with transition: all: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.75) should be [30px]
Pass CSS Transitions with transition: all: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (1) should be [40px]
Fail CSS Transitions with transition: all: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (1.25) should be [50px]
Fail CSS Animations: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (-0.25) should be [-10px]
Pass CSS Transitions with transition: all: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (1.25) should be [50px]
Pass CSS Animations: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (-0.25) should be [-10px]
Pass CSS Animations: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0) should be [0px]
Fail CSS Animations: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.25) should be [10px]
Fail CSS Animations: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.5) should be [20px]
Fail CSS Animations: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.75) should be [30px]
Pass CSS Animations: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.25) should be [10px]
Pass CSS Animations: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.5) should be [20px]
Pass CSS Animations: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.75) should be [30px]
Pass CSS Animations: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (1) should be [40px]
Fail CSS Animations: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (1.25) should be [50px]
Fail Web Animations: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (-0.25) should be [-10px]
Pass CSS Animations: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (1.25) should be [50px]
Pass Web Animations: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (-0.25) should be [-10px]
Pass Web Animations: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0) should be [0px]
Fail Web Animations: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.25) should be [10px]
Fail Web Animations: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.5) should be [20px]
Fail Web Animations: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.75) should be [30px]
Pass Web Animations: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.25) should be [10px]
Pass Web Animations: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.5) should be [20px]
Pass Web Animations: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.75) should be [30px]
Pass Web Animations: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (1) should be [40px]
Fail Web Animations: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (1.25) should be [50px]
Fail CSS Transitions: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (-0.25) should be [calc(((50% - 25px) * 1.25) + ((100% - 10px) * -0.25))]
Fail CSS Transitions: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0) should be [calc(50% - 25px)]
Fail CSS Transitions: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.25) should be [calc(((50% - 25px) * 0.75) + ((100% - 10px) * 0.25))]
Fail CSS Transitions: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.5) should be [calc(((50% - 25px) * 0.5) + ((100% - 10px) * 0.5))]
Fail CSS Transitions: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.75) should be [calc(((50% - 25px) * 0.25) + ((100% - 10px) * 0.75))]
Pass Web Animations: property <left> from [calc(50% - 25px)] to [calc(100% - 10px)] at (1.25) should be [50px]
Pass CSS Transitions: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (-0.25) should be [calc(((50% - 25px) * 1.25) + ((100% - 10px) * -0.25))]
Pass CSS Transitions: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0) should be [calc(50% - 25px)]
Pass CSS Transitions: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.25) should be [calc(((50% - 25px) * 0.75) + ((100% - 10px) * 0.25))]
Pass CSS Transitions: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.5) should be [calc(((50% - 25px) * 0.5) + ((100% - 10px) * 0.5))]
Pass CSS Transitions: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.75) should be [calc(((50% - 25px) * 0.25) + ((100% - 10px) * 0.75))]
Pass CSS Transitions: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (1) should be [calc(100% - 10px)]
Fail CSS Transitions: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (1.25) should be [calc(((50% - 25px) * -0.25) + ((100% - 10px) * 1.25))]
Fail CSS Transitions with transition: all: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (-0.25) should be [calc(((50% - 25px) * 1.25) + ((100% - 10px) * -0.25))]
Fail CSS Transitions with transition: all: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0) should be [calc(50% - 25px)]
Fail CSS Transitions with transition: all: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.25) should be [calc(((50% - 25px) * 0.75) + ((100% - 10px) * 0.25))]
Fail CSS Transitions with transition: all: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.5) should be [calc(((50% - 25px) * 0.5) + ((100% - 10px) * 0.5))]
Fail CSS Transitions with transition: all: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.75) should be [calc(((50% - 25px) * 0.25) + ((100% - 10px) * 0.75))]
Pass CSS Transitions: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (1.25) should be [calc(((50% - 25px) * -0.25) + ((100% - 10px) * 1.25))]
Pass CSS Transitions with transition: all: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (-0.25) should be [calc(((50% - 25px) * 1.25) + ((100% - 10px) * -0.25))]
Pass CSS Transitions with transition: all: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0) should be [calc(50% - 25px)]
Pass CSS Transitions with transition: all: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.25) should be [calc(((50% - 25px) * 0.75) + ((100% - 10px) * 0.25))]
Pass CSS Transitions with transition: all: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.5) should be [calc(((50% - 25px) * 0.5) + ((100% - 10px) * 0.5))]
Pass CSS Transitions with transition: all: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.75) should be [calc(((50% - 25px) * 0.25) + ((100% - 10px) * 0.75))]
Pass CSS Transitions with transition: all: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (1) should be [calc(100% - 10px)]
Fail CSS Transitions with transition: all: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (1.25) should be [calc(((50% - 25px) * -0.25) + ((100% - 10px) * 1.25))]
Fail CSS Animations: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (-0.25) should be [calc(((50% - 25px) * 1.25) + ((100% - 10px) * -0.25))]
Pass CSS Transitions with transition: all: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (1.25) should be [calc(((50% - 25px) * -0.25) + ((100% - 10px) * 1.25))]
Pass CSS Animations: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (-0.25) should be [calc(((50% - 25px) * 1.25) + ((100% - 10px) * -0.25))]
Pass CSS Animations: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0) should be [calc(50% - 25px)]
Fail CSS Animations: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.25) should be [calc(((50% - 25px) * 0.75) + ((100% - 10px) * 0.25))]
Fail CSS Animations: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.5) should be [calc(((50% - 25px) * 0.5) + ((100% - 10px) * 0.5))]
Fail CSS Animations: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.75) should be [calc(((50% - 25px) * 0.25) + ((100% - 10px) * 0.75))]
Pass CSS Animations: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.25) should be [calc(((50% - 25px) * 0.75) + ((100% - 10px) * 0.25))]
Pass CSS Animations: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.5) should be [calc(((50% - 25px) * 0.5) + ((100% - 10px) * 0.5))]
Pass CSS Animations: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.75) should be [calc(((50% - 25px) * 0.25) + ((100% - 10px) * 0.75))]
Pass CSS Animations: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (1) should be [calc(100% - 10px)]
Fail CSS Animations: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (1.25) should be [calc(((50% - 25px) * -0.25) + ((100% - 10px) * 1.25))]
Fail Web Animations: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (-0.25) should be [calc(((50% - 25px) * 1.25) + ((100% - 10px) * -0.25))]
Pass CSS Animations: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (1.25) should be [calc(((50% - 25px) * -0.25) + ((100% - 10px) * 1.25))]
Pass Web Animations: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (-0.25) should be [calc(((50% - 25px) * 1.25) + ((100% - 10px) * -0.25))]
Pass Web Animations: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0) should be [calc(50% - 25px)]
Fail Web Animations: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.25) should be [calc(((50% - 25px) * 0.75) + ((100% - 10px) * 0.25))]
Fail Web Animations: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.5) should be [calc(((50% - 25px) * 0.5) + ((100% - 10px) * 0.5))]
Fail Web Animations: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.75) should be [calc(((50% - 25px) * 0.25) + ((100% - 10px) * 0.75))]
Pass Web Animations: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.25) should be [calc(((50% - 25px) * 0.75) + ((100% - 10px) * 0.25))]
Pass Web Animations: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.5) should be [calc(((50% - 25px) * 0.5) + ((100% - 10px) * 0.5))]
Pass Web Animations: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (0.75) should be [calc(((50% - 25px) * 0.25) + ((100% - 10px) * 0.75))]
Pass Web Animations: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (1) should be [calc(100% - 10px)]
Fail Web Animations: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (1.25) should be [calc(((50% - 25px) * -0.25) + ((100% - 10px) * 1.25))]
Pass Web Animations: property <text-indent> from [calc(50% - 25px)] to [calc(100% - 10px)] at (1.25) should be [calc(((50% - 25px) * -0.25) + ((100% - 10px) * 1.25))]
Pass CSS Transitions: property <text-indent> from [0em] to [100px] at (-0.25) should be [-25px]
Pass CSS Transitions: property <text-indent> from [0em] to [100px] at (0) should be [0em]
Pass CSS Transitions: property <text-indent> from [0em] to [100px] at (0.25) should be [25px]