Skip to content

Commit a1037e2

Browse files
Calme1709AtkinsSJ
authored andcommitted
LibWeb: Improve support for CalculatedStyleValue in scale
- Properly serialize CalculatedStyleValue components - Allow CSV to be the 'Z' component in interpolated value Gains us 52 WPT tests
1 parent 39fdcbc commit a1037e2

File tree

4 files changed

+78
-66
lines changed

4 files changed

+78
-66
lines changed

Libraries/LibWeb/CSS/Interpolation.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,8 @@ static RefPtr<CSSStyleValue const> interpolate_scale(DOM::Element& element, Calc
111111
}
112112

113113
StyleValueVector new_values = { *interpolated_x, *interpolated_y };
114-
if (interpolated_z && interpolated_z->is_number() && interpolated_z->as_number().number() != 1) {
114+
if (interpolated_z)
115115
new_values.append(*interpolated_z);
116-
}
117116

118117
return TransformationStyleValue::create(
119118
PropertyID::Scale,

Libraries/LibWeb/CSS/StyleValues/TransformationStyleValue.cpp

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -118,13 +118,27 @@ String TransformationStyleValue::to_string(SerializationMode mode) const
118118
}
119119
if (m_properties.property == PropertyID::Scale) {
120120
auto resolve_to_string = [mode](CSSStyleValue const& value) -> String {
121-
if (value.is_number()) {
122-
return MUST(String::formatted("{}", value.as_number().number()));
121+
Optional<double> raw_value;
122+
123+
if (value.is_number())
124+
raw_value = value.as_number().number();
125+
if (value.is_percentage())
126+
raw_value = value.as_percentage().percentage().as_fraction();
127+
if (value.is_calculated()) {
128+
if (value.as_calculated().resolves_to_number()) {
129+
if (auto resolved = value.as_calculated().resolve_number({}); resolved.has_value())
130+
raw_value = *resolved;
131+
}
132+
if (value.as_calculated().resolves_to_percentage()) {
133+
if (auto resolved = value.as_calculated().resolve_percentage({}); resolved.has_value())
134+
raw_value = resolved->as_fraction();
135+
}
123136
}
124-
if (value.is_percentage()) {
125-
return MUST(String::formatted("{}", value.as_percentage().percentage().as_fraction()));
126-
}
127-
return value.to_string(mode);
137+
138+
if (!raw_value.has_value())
139+
return value.to_string(mode);
140+
141+
return MUST(String::formatted("{:.6}", *raw_value));
128142
};
129143

130144
auto x_value = resolve_to_string(m_properties.values[0]);
@@ -135,11 +149,11 @@ String TransformationStyleValue::to_string(SerializationMode mode) const
135149

136150
StringBuilder builder;
137151
builder.append(x_value);
138-
if (x_value != y_value || z_value.has_value()) {
152+
if (x_value != y_value || (z_value.has_value() && *z_value != "1"sv)) {
139153
builder.append(" "sv);
140154
builder.append(y_value);
141155
}
142-
if (z_value.has_value()) {
156+
if (z_value.has_value() && *z_value != "1"sv) {
143157
builder.append(" "sv);
144158
builder.append(z_value.value());
145159
}

Tests/LibWeb/Text/expected/wpt-import/css/css-values/round-mod-rem-computed.txt

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ Harness status: OK
22

33
Found 229 tests
44

5-
195 Pass
6-
34 Fail
5+
211 Pass
6+
18 Fail
77
Pass round(10,10) should be used-value-equivalent to 10
88
Pass mod(1,1) should be used-value-equivalent to 0
99
Pass rem(1,1) should be used-value-equivalent to 0
@@ -202,31 +202,31 @@ Pass round(to-zero, -Infinity, 4) should be used-value-equivalent to calc(-Infin
202202
Pass round(to-zero, Infinity, -4) should be used-value-equivalent to calc(Infinity)
203203
Pass round(to-zero, -Infinity, -4) should be used-value-equivalent to calc(-Infinity)
204204
Pass round(nearest, 0, Infinity) should be used-value-equivalent to 0
205-
Fail round(nearest, 4, Infinity) should be used-value-equivalent to 0
206-
Fail round(nearest, -0, Infinity) should be used-value-equivalent to calc(-0)
207-
Fail round(nearest, -4, Infinity) should be used-value-equivalent to calc(-0)
205+
Pass round(nearest, 4, Infinity) should be used-value-equivalent to 0
206+
Pass round(nearest, -0, Infinity) should be used-value-equivalent to calc(-0)
207+
Pass round(nearest, -4, Infinity) should be used-value-equivalent to calc(-0)
208208
Pass round(nearest, 0, -Infinity) should be used-value-equivalent to 0
209-
Fail round(nearest, 4, -Infinity) should be used-value-equivalent to 0
210-
Fail round(nearest, -0, -Infinity) should be used-value-equivalent to calc(-0)
211-
Fail round(nearest, -4, -Infinity) should be used-value-equivalent to calc(-0)
209+
Pass round(nearest, 4, -Infinity) should be used-value-equivalent to 0
210+
Pass round(nearest, -0, -Infinity) should be used-value-equivalent to calc(-0)
211+
Pass round(nearest, -4, -Infinity) should be used-value-equivalent to calc(-0)
212212
Pass round(to-zero, 0, Infinity) should be used-value-equivalent to 0
213-
Fail round(to-zero, 4, Infinity) should be used-value-equivalent to 0
214-
Fail round(to-zero, -0, Infinity) should be used-value-equivalent to calc(-0)
215-
Fail round(to-zero, -4, Infinity) should be used-value-equivalent to calc(-0)
213+
Pass round(to-zero, 4, Infinity) should be used-value-equivalent to 0
214+
Pass round(to-zero, -0, Infinity) should be used-value-equivalent to calc(-0)
215+
Pass round(to-zero, -4, Infinity) should be used-value-equivalent to calc(-0)
216216
Pass round(to-zero, 0, -Infinity) should be used-value-equivalent to 0
217-
Fail round(to-zero, 4, -Infinity) should be used-value-equivalent to 0
218-
Fail round(to-zero, -0, -Infinity) should be used-value-equivalent to calc(-0)
219-
Fail round(to-zero, -4, -Infinity) should be used-value-equivalent to calc(-0)
217+
Pass round(to-zero, 4, -Infinity) should be used-value-equivalent to 0
218+
Pass round(to-zero, -0, -Infinity) should be used-value-equivalent to calc(-0)
219+
Pass round(to-zero, -4, -Infinity) should be used-value-equivalent to calc(-0)
220220
Fail round(up, 1, Infinity) should be used-value-equivalent to calc(Infinity)
221221
Pass round(up, 0, Infinity) should be used-value-equivalent to 0
222-
Fail round(up, -1, Infinity) should be used-value-equivalent to calc(-0)
222+
Pass round(up, -1, Infinity) should be used-value-equivalent to calc(-0)
223223
Fail round(up, 1, -Infinity) should be used-value-equivalent to calc(Infinity)
224224
Pass round(up, 0, -Infinity) should be used-value-equivalent to 0
225-
Fail round(up, -1, -Infinity) should be used-value-equivalent to calc(-0)
226-
Fail round(down, 1, Infinity) should be used-value-equivalent to calc(-0)
225+
Pass round(up, -1, -Infinity) should be used-value-equivalent to calc(-0)
226+
Pass round(down, 1, Infinity) should be used-value-equivalent to calc(-0)
227227
Pass round(down, 0, Infinity) should be used-value-equivalent to 0
228228
Fail round(down, -1, Infinity) should be used-value-equivalent to calc(-Infinity)
229-
Fail round(down, 1, -Infinity) should be used-value-equivalent to calc(-0)
229+
Pass round(down, 1, -Infinity) should be used-value-equivalent to calc(-0)
230230
Pass round(down, 0, -Infinity) should be used-value-equivalent to 0
231231
Fail round(down, -1, -Infinity) should be used-value-equivalent to calc(-Infinity)
232232
Pass mod(-0, Infinity) should be used-value-equivalent to calc(NaN)

Tests/LibWeb/Text/expected/wpt-import/css/css-values/sin-cos-tan-serialize.txt

Lines changed: 37 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@ Harness status: OK
22

33
Found 270 tests
44

5-
234 Pass
6-
36 Fail
5+
270 Pass
76
Pass cos(0) should be specified-value-equivalent to calc(1)
87
Pass cos(0) should be computed-value-equivalent to 1
98
Pass cos(0) should be used-value-equivalent to 1
@@ -221,56 +220,56 @@ Pass calc(calc(sin(30deg) + cos(60deg) + tan(45deg))) should be specified-value-
221220
Pass calc(calc(sin(30deg) + cos(60deg) + tan(45deg))) should be computed-value-equivalent to 2
222221
Pass calc(calc(sin(30deg) + cos(60deg) + tan(45deg))) should be used-value-equivalent to 2
223222
Pass calc(sin(infinity)) should be specified-value-equivalent to calc(NaN)
224-
Fail calc(sin(infinity)) should be computed-value-equivalent to 0
225-
Fail calc(sin(infinity)) should be used-value-equivalent to 0
223+
Pass calc(sin(infinity)) should be computed-value-equivalent to 0
224+
Pass calc(sin(infinity)) should be used-value-equivalent to 0
226225
Pass calc(calc(sin(infinity))) should be specified-value-equivalent to calc(NaN)
227-
Fail calc(calc(sin(infinity))) should be computed-value-equivalent to 0
228-
Fail calc(calc(sin(infinity))) should be used-value-equivalent to 0
226+
Pass calc(calc(sin(infinity))) should be computed-value-equivalent to 0
227+
Pass calc(calc(sin(infinity))) should be used-value-equivalent to 0
229228
Pass calc(cos(infinity)) should be specified-value-equivalent to calc(NaN)
230-
Fail calc(cos(infinity)) should be computed-value-equivalent to 0
231-
Fail calc(cos(infinity)) should be used-value-equivalent to 0
229+
Pass calc(cos(infinity)) should be computed-value-equivalent to 0
230+
Pass calc(cos(infinity)) should be used-value-equivalent to 0
232231
Pass calc(calc(cos(infinity))) should be specified-value-equivalent to calc(NaN)
233-
Fail calc(calc(cos(infinity))) should be computed-value-equivalent to 0
234-
Fail calc(calc(cos(infinity))) should be used-value-equivalent to 0
232+
Pass calc(calc(cos(infinity))) should be computed-value-equivalent to 0
233+
Pass calc(calc(cos(infinity))) should be used-value-equivalent to 0
235234
Pass calc(tan(infinity)) should be specified-value-equivalent to calc(NaN)
236-
Fail calc(tan(infinity)) should be computed-value-equivalent to 0
237-
Fail calc(tan(infinity)) should be used-value-equivalent to 0
235+
Pass calc(tan(infinity)) should be computed-value-equivalent to 0
236+
Pass calc(tan(infinity)) should be used-value-equivalent to 0
238237
Pass calc(calc(tan(infinity))) should be specified-value-equivalent to calc(NaN)
239-
Fail calc(calc(tan(infinity))) should be computed-value-equivalent to 0
240-
Fail calc(calc(tan(infinity))) should be used-value-equivalent to 0
238+
Pass calc(calc(tan(infinity))) should be computed-value-equivalent to 0
239+
Pass calc(calc(tan(infinity))) should be used-value-equivalent to 0
241240
Pass calc(sin(-infinity)) should be specified-value-equivalent to calc(NaN)
242-
Fail calc(sin(-infinity)) should be computed-value-equivalent to 0
243-
Fail calc(sin(-infinity)) should be used-value-equivalent to 0
241+
Pass calc(sin(-infinity)) should be computed-value-equivalent to 0
242+
Pass calc(sin(-infinity)) should be used-value-equivalent to 0
244243
Pass calc(calc(sin(-infinity))) should be specified-value-equivalent to calc(NaN)
245-
Fail calc(calc(sin(-infinity))) should be computed-value-equivalent to 0
246-
Fail calc(calc(sin(-infinity))) should be used-value-equivalent to 0
244+
Pass calc(calc(sin(-infinity))) should be computed-value-equivalent to 0
245+
Pass calc(calc(sin(-infinity))) should be used-value-equivalent to 0
247246
Pass calc(cos(-infinity)) should be specified-value-equivalent to calc(NaN)
248-
Fail calc(cos(-infinity)) should be computed-value-equivalent to 0
249-
Fail calc(cos(-infinity)) should be used-value-equivalent to 0
247+
Pass calc(cos(-infinity)) should be computed-value-equivalent to 0
248+
Pass calc(cos(-infinity)) should be used-value-equivalent to 0
250249
Pass calc(calc(cos(-infinity))) should be specified-value-equivalent to calc(NaN)
251-
Fail calc(calc(cos(-infinity))) should be computed-value-equivalent to 0
252-
Fail calc(calc(cos(-infinity))) should be used-value-equivalent to 0
250+
Pass calc(calc(cos(-infinity))) should be computed-value-equivalent to 0
251+
Pass calc(calc(cos(-infinity))) should be used-value-equivalent to 0
253252
Pass calc(tan(-infinity)) should be specified-value-equivalent to calc(NaN)
254-
Fail calc(tan(-infinity)) should be computed-value-equivalent to 0
255-
Fail calc(tan(-infinity)) should be used-value-equivalent to 0
253+
Pass calc(tan(-infinity)) should be computed-value-equivalent to 0
254+
Pass calc(tan(-infinity)) should be used-value-equivalent to 0
256255
Pass calc(calc(tan(-infinity))) should be specified-value-equivalent to calc(NaN)
257-
Fail calc(calc(tan(-infinity))) should be computed-value-equivalent to 0
258-
Fail calc(calc(tan(-infinity))) should be used-value-equivalent to 0
256+
Pass calc(calc(tan(-infinity))) should be computed-value-equivalent to 0
257+
Pass calc(calc(tan(-infinity))) should be used-value-equivalent to 0
259258
Pass calc(sin(NaN)) should be specified-value-equivalent to calc(NaN)
260-
Fail calc(sin(NaN)) should be computed-value-equivalent to 0
261-
Fail calc(sin(NaN)) should be used-value-equivalent to 0
259+
Pass calc(sin(NaN)) should be computed-value-equivalent to 0
260+
Pass calc(sin(NaN)) should be used-value-equivalent to 0
262261
Pass calc(calc(sin(NaN))) should be specified-value-equivalent to calc(NaN)
263-
Fail calc(calc(sin(NaN))) should be computed-value-equivalent to 0
264-
Fail calc(calc(sin(NaN))) should be used-value-equivalent to 0
262+
Pass calc(calc(sin(NaN))) should be computed-value-equivalent to 0
263+
Pass calc(calc(sin(NaN))) should be used-value-equivalent to 0
265264
Pass calc(cos(NaN)) should be specified-value-equivalent to calc(NaN)
266-
Fail calc(cos(NaN)) should be computed-value-equivalent to 0
267-
Fail calc(cos(NaN)) should be used-value-equivalent to 0
265+
Pass calc(cos(NaN)) should be computed-value-equivalent to 0
266+
Pass calc(cos(NaN)) should be used-value-equivalent to 0
268267
Pass calc(calc(cos(NaN))) should be specified-value-equivalent to calc(NaN)
269-
Fail calc(calc(cos(NaN))) should be computed-value-equivalent to 0
270-
Fail calc(calc(cos(NaN))) should be used-value-equivalent to 0
268+
Pass calc(calc(cos(NaN))) should be computed-value-equivalent to 0
269+
Pass calc(calc(cos(NaN))) should be used-value-equivalent to 0
271270
Pass calc(tan(NaN)) should be specified-value-equivalent to calc(NaN)
272-
Fail calc(tan(NaN)) should be computed-value-equivalent to 0
273-
Fail calc(tan(NaN)) should be used-value-equivalent to 0
271+
Pass calc(tan(NaN)) should be computed-value-equivalent to 0
272+
Pass calc(tan(NaN)) should be used-value-equivalent to 0
274273
Pass calc(calc(tan(NaN))) should be specified-value-equivalent to calc(NaN)
275-
Fail calc(calc(tan(NaN))) should be computed-value-equivalent to 0
276-
Fail calc(calc(tan(NaN))) should be used-value-equivalent to 0
274+
Pass calc(calc(tan(NaN))) should be computed-value-equivalent to 0
275+
Pass calc(calc(tan(NaN))) should be used-value-equivalent to 0

0 commit comments

Comments
 (0)