Skip to content

Commit 598304c

Browse files
committed
Support margin-trim: block inline keyword combination
https://bugs.webkit.org/show_bug.cgi?id=284978 rdar://141784069 Reviewed by Sammy Gill. Add parsing/serialization support for this combination as specified in: https://www.w3.org/TR/css-box-4/#margin-trim * LayoutTests/imported/w3c/web-platform-tests/css/css-box/parsing/margin-trim-computed-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/css/css-box/parsing/margin-trim-computed.html: * LayoutTests/imported/w3c/web-platform-tests/css/css-box/parsing/margin-trim-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/css/css-box/parsing/margin-trim.html: * Source/WebCore/css/CSSProperties.json: * Source/WebCore/css/ComputedStyleExtractor.cpp: (WebCore::ComputedStyleExtractor::valueForPropertyInStyle const): * Source/WebCore/css/parser/CSSPropertyParserConsumer+Box.cpp: (WebCore::CSSPropertyParserHelpers::consumeMarginTrim): * Source/WebCore/style/StyleBuilderConverter.h: (WebCore::Style::BuilderConverter::convertMarginTrim): Canonical link: https://commits.webkit.org/294190@main
1 parent 3bbaf05 commit 598304c

File tree

8 files changed

+73
-22
lines changed

8 files changed

+73
-22
lines changed

LayoutTests/imported/w3c/web-platform-tests/css/css-box/parsing/margin-trim-computed-expected.txt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ PASS Property margin-trim value 'inline-start block-start'
1313
PASS Property margin-trim value 'inline-end block-start'
1414
PASS Property margin-trim value 'inline-end block-end'
1515
PASS Property margin-trim value 'block-start block-end inline-start'
16-
PASS Property margin-trim value 'inline-start block-start inline-end block-end'
17-
PASS Property margin-trim value 'inline-start inline-end block-start'
16+
PASS Property margin-trim value 'block-start inline-start block-end inline-end'
17+
PASS Property margin-trim value 'block-start block-end inline-end inline-start'
18+
PASS Property margin-trim value 'block-start block-end inline-start inline-end'
19+
PASS Property margin-trim value 'inline-start block-end block-start inline-end'
20+
PASS Property margin-trim value 'inline-start inline-end block-start block-end'
21+
PASS Property margin-trim value 'inline-end block-end inline-start block-start'
1822

LayoutTests/imported/w3c/web-platform-tests/css/css-box/parsing/margin-trim-computed.html

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,13 @@
2727
test_computed_value("margin-trim", "inline-end block-start", "block-start inline-end");
2828
test_computed_value("margin-trim", "inline-end block-end", "block-end inline-end");
2929
test_computed_value("margin-trim", "block-start block-end inline-start", "block-start inline-start block-end");
30-
test_computed_value("margin-trim", "inline-start block-start inline-end block-end", "block-start inline-start block-end inline-end");
31-
test_computed_value("margin-trim", "inline-start inline-end block-start", "block-start inline-start inline-end");
30+
31+
test_computed_value("margin-trim", "block-start inline-start block-end inline-end", "block inline");
32+
test_computed_value("margin-trim", "block-start block-end inline-end inline-start", "block inline");
33+
test_computed_value("margin-trim", "block-start block-end inline-start inline-end", "block inline");
34+
test_computed_value("margin-trim", "inline-start block-end block-start inline-end", "block inline");
35+
test_computed_value("margin-trim", "inline-start inline-end block-start block-end", "block inline");
36+
test_computed_value("margin-trim", "inline-end block-end inline-start block-start", "block inline");
3237
</script>
3338
</body>
3439
</html>

LayoutTests/imported/w3c/web-platform-tests/css/css-box/parsing/margin-trim-expected.txt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,20 @@ PASS e.style['margin-trim'] = "block-start" should set the property value
66
PASS e.style['margin-trim'] = "block-end" should set the property value
77
PASS e.style['margin-trim'] = "inline-start" should set the property value
88
PASS e.style['margin-trim'] = "inline-end" should set the property value
9+
PASS e.style['margin-trim'] = "block inline" should set the property value
10+
PASS e.style['margin-trim'] = "inline block" should set the property value
911
PASS e.style['margin-trim'] = "block-start block-end" should set the property value
1012
PASS e.style['margin-trim'] = "inline-start inline-end" should set the property value
1113
PASS e.style['margin-trim'] = "block-end block-start" should set the property value
1214
PASS e.style['margin-trim'] = "inline-end inline-start" should set the property value
1315
PASS e.style['margin-trim'] = "inline-start block-start" should set the property value
1416
PASS e.style['margin-trim'] = "inline-end block-start block-end" should set the property value
1517
PASS e.style['margin-trim'] = "block-start inline-start block-end inline-end" should set the property value
18+
PASS e.style['margin-trim'] = "block-start block-end inline-end inline-start" should set the property value
19+
PASS e.style['margin-trim'] = "block-start block-end inline-start inline-end" should set the property value
20+
PASS e.style['margin-trim'] = "inline-start block-end block-start inline-end" should set the property value
21+
PASS e.style['margin-trim'] = "inline-start inline-end block-start block-end" should set the property value
1622
PASS e.style['margin-trim'] = "inline-end block-end inline-start block-start" should set the property value
17-
PASS e.style['margin-trim'] = "block inline" should not set the property value
1823
PASS e.style['margin-trim'] = "block block" should not set the property value
1924
PASS e.style['margin-trim'] = "inline inline" should not set the property value
2025
PASS e.style['margin-trim'] = "block inline-start inline-end" should not set the property value

LayoutTests/imported/w3c/web-platform-tests/css/css-box/parsing/margin-trim.html

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@
2121
test_valid_value("margin-trim", "inline-start");
2222
test_valid_value("margin-trim", "inline-end");
2323

24+
test_valid_value("margin-trim", "block inline");
25+
test_valid_value("margin-trim", "inline block");
26+
2427
// Serialize values into either block or inline
2528
test_valid_value("margin-trim", "block-start block-end", "block");
2629
test_valid_value("margin-trim", "inline-start inline-end", "inline");
@@ -29,10 +32,15 @@
2932
test_valid_value("margin-trim", "inline-start block-start");
3033

3134
test_valid_value("margin-trim", "inline-end block-start block-end");
32-
test_valid_value("margin-trim", "block-start inline-start block-end inline-end");
33-
test_valid_value("margin-trim", "inline-end block-end inline-start block-start");
3435

35-
test_invalid_value("margin-trim", "block inline");
36+
// Serialize 4 values into "block inline"
37+
test_valid_value("margin-trim", "block-start inline-start block-end inline-end", "block inline");
38+
test_valid_value("margin-trim", "block-start block-end inline-end inline-start", "block inline");
39+
test_valid_value("margin-trim", "block-start block-end inline-start inline-end", "block inline");
40+
test_valid_value("margin-trim", "inline-start block-end block-start inline-end", "block inline");
41+
test_valid_value("margin-trim", "inline-start inline-end block-start block-end", "block inline");
42+
test_valid_value("margin-trim", "inline-end block-end inline-start block-start", "block inline");
43+
3644
test_invalid_value("margin-trim", "block block");
3745
test_invalid_value("margin-trim", "inline inline");
3846
test_invalid_value("margin-trim", "block inline-start inline-end");

Source/WebCore/css/CSSProperties.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5276,7 +5276,7 @@
52765276
"settings-flag": "cssMarginTrimEnabled",
52775277
"style-builder-converter": "MarginTrim",
52785278
"parser-function": "consumeMarginTrim",
5279-
"parser-grammar-unused": "none | block | inline | [ block-start || inline-start || block-end || inline-end ]",
5279+
"parser-grammar-unused": "none | [ block || inline ] | [ block-start || inline-start || block-end || inline-end ]",
52805280
"parser-grammar-unused-reason": "Needs support for transforming parsed input to minimal form."
52815281
},
52825282
"specification": {

Source/WebCore/css/ComputedStyleExtractor.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4184,6 +4184,12 @@ RefPtr<CSSValue> ComputedStyleExtractor::valueForPropertyInStyle(const RenderSty
41844184
return CSSPrimitiveValue::create(CSSValueBlock);
41854185
if (marginTrim.containsAll({ MarginTrimType::InlineStart, MarginTrimType::InlineEnd }) && !marginTrim.containsAny({ MarginTrimType::BlockStart, MarginTrimType::BlockEnd }))
41864186
return CSSPrimitiveValue::create(CSSValueInline);
4187+
if (marginTrim.containsAll({ MarginTrimType::BlockStart, MarginTrimType::BlockEnd, MarginTrimType::InlineStart, MarginTrimType::InlineEnd })) {
4188+
CSSValueListBuilder list;
4189+
list.append(CSSPrimitiveValue::create(CSSValueBlock));
4190+
list.append(CSSPrimitiveValue::create(CSSValueInline));
4191+
return CSSValueList::createSpaceSeparated(WTFMove(list));
4192+
}
41874193

41884194
CSSValueListBuilder list;
41894195
if (marginTrim.contains(MarginTrimType::BlockStart))

Source/WebCore/css/parser/CSSPropertyParserConsumer+Box.cpp

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -45,20 +45,35 @@ RefPtr<CSSValue> consumeMarginTrim(CSSParserTokenRange& range, CSS::PropertyPars
4545
// https://drafts.csswg.org/css-box/#margin-trim
4646

4747
auto firstValue = range.peek().id();
48-
if (firstValue == CSSValueBlock || firstValue == CSSValueInline || firstValue == CSSValueNone)
48+
if (firstValue == CSSValueNone)
4949
return consumeIdent(range).releaseNonNull();
50+
51+
// FIXME: Multiple values should be appended in canonical order.
5052
Vector<CSSValueID, 4> idents;
51-
while (auto ident = consumeIdentRaw<CSSValueBlockStart, CSSValueBlockEnd, CSSValueInlineStart, CSSValueInlineEnd>(range)) {
52-
if (idents.contains(*ident))
53-
return nullptr;
54-
idents.append(*ident);
55-
}
56-
// Try to serialize into either block or inline form
57-
if (idents.size() == 2) {
58-
if (idents.contains(CSSValueBlockStart) && idents.contains(CSSValueBlockEnd))
59-
return CSSPrimitiveValue::create(CSSValueBlock);
60-
if (idents.contains(CSSValueInlineStart) && idents.contains(CSSValueInlineEnd))
61-
return CSSPrimitiveValue::create(CSSValueInline);
53+
if (firstValue == CSSValueBlock || firstValue == CSSValueInline) {
54+
while (auto ident = consumeIdentRaw<CSSValueBlock, CSSValueInline>(range)) {
55+
if (idents.contains(*ident))
56+
return nullptr;
57+
idents.append(*ident);
58+
}
59+
} else {
60+
while (auto ident = consumeIdentRaw<CSSValueBlockStart, CSSValueBlockEnd, CSSValueInlineStart, CSSValueInlineEnd>(range)) {
61+
if (idents.contains(*ident))
62+
return nullptr;
63+
idents.append(*ident);
64+
}
65+
// Try to serialize into either block or inline form
66+
if (idents.size() == 2) {
67+
if (idents.contains(CSSValueBlockStart) && idents.contains(CSSValueBlockEnd))
68+
return CSSPrimitiveValue::create(CSSValueBlock);
69+
if (idents.contains(CSSValueInlineStart) && idents.contains(CSSValueInlineEnd))
70+
return CSSPrimitiveValue::create(CSSValueInline);
71+
} else if (idents.size() == 4) {
72+
CSSValueListBuilder list;
73+
list.append(CSSPrimitiveValue::create(CSSValueBlock));
74+
list.append(CSSPrimitiveValue::create(CSSValueInline));
75+
return CSSValueList::createSpaceSeparated(WTFMove(list));
76+
}
6277
}
6378
CSSValueListBuilder list;
6479
for (auto ident : idents)

Source/WebCore/style/StyleBuilderConverter.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2174,7 +2174,14 @@ inline OptionSet<MarginTrimType> BuilderConverter::convertMarginTrim(BuilderStat
21742174
if (!list || !list->size())
21752175
return RenderStyle::initialMarginTrim();
21762176
OptionSet<MarginTrimType> marginTrim;
2177-
ASSERT(list->size() <= 4);
2177+
for (auto& item : *list) {
2178+
if (item.valueID() == CSSValueBlock)
2179+
marginTrim.add({ MarginTrimType::BlockStart, MarginTrimType::BlockEnd });
2180+
if (item.valueID() == CSSValueInline)
2181+
marginTrim.add({ MarginTrimType::InlineStart, MarginTrimType::InlineEnd });
2182+
}
2183+
if (!marginTrim.isEmpty())
2184+
return marginTrim;
21782185
for (auto& item : *list) {
21792186
if (item.valueID() == CSSValueBlockStart)
21802187
marginTrim.add(MarginTrimType::BlockStart);
@@ -2185,6 +2192,7 @@ inline OptionSet<MarginTrimType> BuilderConverter::convertMarginTrim(BuilderStat
21852192
if (item.valueID() == CSSValueInlineEnd)
21862193
marginTrim.add(MarginTrimType::InlineEnd);
21872194
}
2195+
ASSERT(list->size() <= 4);
21882196
return marginTrim;
21892197
}
21902198

0 commit comments

Comments
 (0)