Convert 1 * x -> x in calc().

Bug: 40118274
Change-Id: Idc2ef7a86a77bea4e42a7068d9ae3d21a564b4e1
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6481258
Reviewed-by: Daniil Sakhapov <sakhapov@chromium.org>
Commit-Queue: Steinar H Gunderson <sesse@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1451054}
diff --git a/third_party/blink/renderer/core/css/css_math_expression_node.cc b/third_party/blink/renderer/core/css/css_math_expression_node.cc
index 1e41d3b..25e515e 100644
--- a/third_party/blink/renderer/core/css/css_math_expression_node.cc
+++ b/third_party/blink/renderer/core/css/css_math_expression_node.cc
@@ -634,6 +634,7 @@
         child.node, child.op, numeric_children, is_multiply);
     CSSPrimitiveValue::UnitType unit_type =
         node->ResolvedUnitTypeForSimplification();
+
     // Skip already used unit types, as they have been already combined.
     if (IsNumericNodeWithDoubleValue(node)) {
       if (used_units.Contains(unit_type)) {
@@ -641,6 +642,14 @@
       }
       used_units.insert(unit_type);
     }
+
+    // Skip a constant factor of unity, unless it is the only factor.
+    if (is_multiply && unit_type == CSSPrimitiveValue::UnitType::kNumber &&
+        node->IsNumericLiteral() && node->DoubleValue() == 1.0 &&
+        (numeric_children.size() + all_children.size()) > 1) {
+      continue;
+    }
+
     if (!final_node) {
       // First child.
       final_node = MaybeNegateFirstNode(op, node)->Copy();
diff --git a/third_party/blink/web_tests/external/wpt/css/css-values/calc-infinity-nan-serialize-length-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-values/calc-infinity-nan-serialize-length-expected.txt
index 09583002..cced79a00 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-values/calc-infinity-nan-serialize-length-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/css/css-values/calc-infinity-nan-serialize-length-expected.txt
@@ -1,7 +1,5 @@
 This is a testharness.js-based test.
 [FAIL] 'calc(1 * min(NaN * 2px, NaN * 4em))' as a specified value should serialize as 'calc(NaN * 1px)'.
-  assert_equals: 'calc(1 * min(NaN * 2px, NaN * 4em))' and 'calc(NaN * 1px)' should serialize the same in specified values. expected "calc(NaN * 1px)" but got "calc(1 * min(NaN * 1px, NaN * 1em))"
-[FAIL] 'calc(1 * clamp(NaN * 2em, NaN * 4px, NaN * 8pt))' as a specified value should serialize as 'clamp(NaN * 1em, NaN * 1px, NaN * 1px)'.
-  assert_equals: 'calc(1 * clamp(NaN * 2em, NaN * 4px, NaN * 8pt))' and 'clamp(NaN * 1em, NaN * 1px, NaN * 1px)' should serialize the same in specified values. expected "clamp(NaN * 1em, NaN * 1px, NaN * 1px)" but got "calc(1 * clamp(NaN * 1em, NaN * 1px, NaN * 1px))"
+  assert_equals: 'calc(1 * min(NaN * 2px, NaN * 4em))' and 'calc(NaN * 1px)' should serialize the same in specified values. expected "calc(NaN * 1px)" but got "min(NaN * 1px, NaN * 1em)"
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/css/css-values/calc-size/animation/calc-size-interpolation-expansion-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-values/calc-size/animation/calc-size-interpolation-expansion-expected.txt
index 67f64a9..4107bde 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-values/calc-size/animation/calc-size-interpolation-expansion-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/css/css-values/calc-size/animation/calc-size-interpolation-expansion-expected.txt
@@ -1,6 +1,4 @@
 This is a testharness.js-based test.
-[FAIL] value at progress 0.75 in animation of "height" from "calc-size(min-content, size * 4)" to "calc-size(calc-size(min-content, size + 20px), 2 * size)"
-  assert_equals: expected "calc-size(min-content, size + (1.5 * (20px + size)))" but got "calc-size(min-content, (1 * size) + (1.5 * (20px + size)))"
 [FAIL] value at progress 0.75 in animation of "width" from "calc-size(40%, size)" to "calc-size(calc-size(10px, (2 * size)), size + 20px)"
   assert_equals: expected "calc-size(100%, 30px + (0.1 * size))" but got "calc-size(100%, 0% + 30px + (0.1 * size))"
 Harness: the test ran to completion.