Commit 22599b68 authored by David Shin's avatar David Shin
Browse files

Bug 1816964 - `linear()` easing function should not consider less than 2...

Bug 1816964 - `linear()` easing function should not consider less than 2 linear stop arguments valid. r=emilio

Latest spec no longer handles `linear() == linear` and `linear(<single value>) == <single value>`.

Differential Revision: https://phabricator.services.mozilla.com/D169955
parent b02c8246
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -13510,13 +13510,16 @@ if (IsCSSPropertyPrefEnabled("layout.css.step-position-jump.enabled")) {

if (IsCSSPropertyPrefEnabled("layout.css.linear-easing-function.enabled")) {
  let linear_function_other_values = [
    "linear()",
    "linear(0.5)",
    "linear(0, 1)",
    "linear(0 0% 50%, 1 50% 100%)",
  ];

  let linear_function_invalid_values = ["linear(0% 0 100%)", "linear(0,)"];
  let linear_function_invalid_values = [
    "linear()",
    "linear(0.5)",
    "linear(0% 0 100%)",
    "linear(0,)",
  ];
  gCSSProperties["animation-timing-function"].other_values.push(
    ...linear_function_other_values
  );
@@ -13532,7 +13535,7 @@ if (IsCSSPropertyPrefEnabled("layout.css.linear-easing-function.enabled")) {
  );

  gCSSProperties["animation"].other_values.push(
    "1s 2s linear() bounce",
    "1s 2s linear(0, 1) bounce",
    "4s linear(0, 0.5 25% 75%, 1 100% 100%)"
  );
}
+4 −3
Original line number Diff line number Diff line
@@ -136,10 +136,8 @@ impl TimingFunction {
        if !linear_timing_function_enabled() {
            return Err(input.new_custom_error(StyleParseErrorKind::ExperimentalProperty));
        }
        if input.is_exhausted() {
            return Ok(GenericTimingFunction::LinearFunction(LinearStops::default()));
        }
        let mut result = vec![];
        // Closely follows `parse_comma_separated`, but can generate multiple entries for one comma-separated entry.
        loop {
            input.parse_until_before(Delimiter::Comma, |i| {
                let mut input_start = i.try_parse(|i| Percentage::parse(context, i)).ok();
@@ -175,6 +173,9 @@ impl TimingFunction {
                Ok(_) => unreachable!(),
            }
        }
        if result.len() < 2 {
            return Err(input.new_custom_error(StyleParseErrorKind::UnspecifiedError));
        }

        Ok(GenericTimingFunction::LinearFunction(LinearStops::new(
            crate::OwnedSlice::from(result),
+0 −20
Original line number Diff line number Diff line
@@ -64,26 +64,6 @@ test(function(t) {
  assert_style_left_at(anim, 1000, 0.00);
}, 'linear function easing with output less than 1');

test(function(t) {
  var anim = create_animated_div(t, 'linear()');
  var equiv = create_animated_div(t, 'linear');

  assert_animations_equal_at(anim, equiv, 0);
  assert_animations_equal_at(anim, equiv, 250);
  assert_animations_equal_at(anim, equiv, 750);
  assert_animations_equal_at(anim, equiv, 1000);
}, 'linear function easing, linear equivalent');

test(function(t) {
  var anim = create_animated_div(t, 'linear(0.5)');

  assert_style_left_at(anim, 0, 0.5);
  assert_style_left_at(anim, 250, 0.5);
  assert_style_left_at(anim, 500, 0.5);
  assert_style_left_at(anim, 750, 0.5);
  assert_style_left_at(anim, 1000, 0.5);
}, 'linear function easing, constant');

test(function(t) {
  var anim = create_animated_div(t, 'linear(0.2 0% 20%, 0.4 20% 40%, 0.6 40% 60%, 0.8 60% 80%, 1.0 80% 100%)');
  var equiv = create_animated_div(t, 'steps(5, jump-start)');
+2 −4
Original line number Diff line number Diff line
@@ -13,8 +13,6 @@
<body>
<div id="target"></div>
<script>
test_valid_value("animation-timing-function", "linear()");
test_valid_value("animation-timing-function", "linear(0)");
test_valid_value("animation-timing-function", "linear(0, 1)");
test_valid_value("animation-timing-function", "linear(0 0% 100%)", "linear(0 0%, 0 100%)");
test_valid_value("animation-timing-function", "linear(0% 100% 0)", "linear(0 0%, 0 100%)");
@@ -22,11 +20,11 @@ test_valid_value("animation-timing-function", "linear(0 0% 50%, 1 50% 100%)", "l
test_valid_value("animation-timing-function", "linear(0, 0.5 25% 75%, 1 100% 100%)", "linear(0, 0.5 25%, 0.5 75%, 1 100%, 1 100%)");
test_valid_value("animation-timing-function", "linear(0, 1.3, 1, 0.92, 1, 0.99, 1, 1.004, 0.998, 1 100% 100%)", "linear(0, 1.3, 1, 0.92, 1, 0.99, 1, 1.004, 0.998, 1 100%, 1 100%)");

test_invalid_value("animation-timing-function", "linear()");
test_invalid_value("animation-timing-function", "linear(0)");
test_invalid_value("animation-timing-function", "linear(100%)");
test_invalid_value("animation-timing-function", "linear(0% 1 50%)");

test_computed_value("animation-timing-function", "linear()");
test_computed_value("animation-timing-function", "linear(0)", "linear(0 0%)");
test_computed_value("animation-timing-function", "linear(0, 1)", "linear(0 0%, 1 100%)");
test_computed_value("animation-timing-function", "linear(0 0% 100%)", "linear(0 0%, 0 100%)");
test_computed_value("animation-timing-function", "linear(0% 100% 0)", "linear(0 0%, 0 100%)");