summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2023-04-19 10:08:11 +0200
committerAndreas Kling <kling@serenityos.org>2023-04-19 12:07:16 +0200
commit8c03d21e954785241ffec75fb239b276495d7b12 (patch)
tree4bb6f28fe68411e106ac2d584c7c4ad52657242d
parentd10e838efdeab1d378834f781ae22af673ac4ea0 (diff)
downloadserenity-8c03d21e954785241ffec75fb239b276495d7b12.zip
LibWeb: Fix broken handling of `flex: <flex-grow>` shorthand
This is a tiny bit messy because: - The spec says we should expand this to `flex: <flex-grow> 1 0` - All major engines expand it to `flex: <flex-grow> 1 0%` Spec bug: https://github.com/w3c/csswg-drafts/issues/5742
-rw-r--r--Tests/LibWeb/Layout/expected/flex-grow-2.txt10
-rw-r--r--Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp32
2 files changed, 28 insertions, 14 deletions
diff --git a/Tests/LibWeb/Layout/expected/flex-grow-2.txt b/Tests/LibWeb/Layout/expected/flex-grow-2.txt
index a42104409f..2542329f6b 100644
--- a/Tests/LibWeb/Layout/expected/flex-grow-2.txt
+++ b/Tests/LibWeb/Layout/expected/flex-grow-2.txt
@@ -4,23 +4,23 @@ Viewport <#document> at (0,0) content-size 800x600 children: not-inline
Box <div.container> at (9,9) content-size 500x102 flex-container(row) children: not-inline
BlockContainer <(anonymous)> at (9,9) content-size 0x0 children: inline
TextNode <#text>
- BlockContainer <div.box> at (10,10) content-size 132.333343x100 flex-item children: inline
+ BlockContainer <div.box> at (10,10) content-size 82.333335x100 flex-item children: inline
line 0 width: 6.34375, height: 17.46875, bottom: 17.46875, baseline: 13.53125
frag 0 from TextNode start: 0, length: 1, rect: [10,10 6.34375x17.46875]
"1"
TextNode <#text>
BlockContainer <(anonymous)> at (9,9) content-size 0x0 children: inline
TextNode <#text>
- BlockContainer <div.box> at (144.333343,10) content-size 164.666671x100 flex-item children: inline
+ BlockContainer <div.box> at (94.333335,10) content-size 164.666671x100 flex-item children: inline
line 0 width: 8.8125, height: 17.46875, bottom: 17.46875, baseline: 13.53125
- frag 0 from TextNode start: 0, length: 1, rect: [144.333343,10 8.8125x17.46875]
+ frag 0 from TextNode start: 0, length: 1, rect: [94.333335,10 8.8125x17.46875]
"2"
TextNode <#text>
BlockContainer <(anonymous)> at (9,9) content-size 0x0 children: inline
TextNode <#text>
- BlockContainer <div.box> at (311,10) content-size 197x100 flex-item children: inline
+ BlockContainer <div.box> at (261,10) content-size 247x100 flex-item children: inline
line 0 width: 9.09375, height: 17.46875, bottom: 17.46875, baseline: 13.53125
- frag 0 from TextNode start: 0, length: 1, rect: [311,10 9.09375x17.46875]
+ frag 0 from TextNode start: 0, length: 1, rect: [261,10 9.09375x17.46875]
"3"
TextNode <#text>
BlockContainer <(anonymous)> at (9,9) content-size 0x0 children: inline
diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp
index 5aa739a1eb..757a119c08 100644
--- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp
+++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp
@@ -5121,22 +5121,36 @@ RefPtr<StyleValue> Parser::parse_filter_value_list_value(Vector<ComponentValue>
RefPtr<StyleValue> Parser::parse_flex_value(Vector<ComponentValue> const& component_values)
{
if (component_values.size() == 1) {
+ // One-value syntax: <flex-grow> | <flex-basis> | none
auto value = parse_css_value(component_values[0]);
if (!value)
return nullptr;
- switch (value->to_identifier()) {
- case ValueID::Auto: {
- auto one = NumericStyleValue::create_integer(1);
- return FlexStyleValue::create(one, one, IdentifierStyleValue::create(ValueID::Auto));
+ if (value->is_identifier() && property_accepts_value(PropertyID::Flex, *value)) {
+ switch (value->to_identifier()) {
+ case ValueID::None: {
+ auto zero = NumericStyleValue::create_integer(0);
+ return FlexStyleValue::create(zero, zero, IdentifierStyleValue::create(ValueID::Auto));
+ }
+ default:
+ return value;
+ }
}
- case ValueID::None: {
- auto zero = NumericStyleValue::create_integer(0);
- return FlexStyleValue::create(zero, zero, IdentifierStyleValue::create(ValueID::Auto));
+
+ if (property_accepts_value(PropertyID::FlexGrow, *value)) {
+ // NOTE: The spec says that flex-basis should be 0 here, but other engines currently use 0%.
+ // https://github.com/w3c/csswg-drafts/issues/5742
+ auto zero_percent = NumericStyleValue::create_integer(0);
+ auto one = NumericStyleValue::create_integer(1);
+ return FlexStyleValue::create(*value, one, zero_percent);
}
- default:
- break;
+
+ if (property_accepts_value(PropertyID::FlexBasis, *value)) {
+ auto one = NumericStyleValue::create_integer(1);
+ return FlexStyleValue::create(one, one, *value);
}
+
+ return nullptr;
}
RefPtr<StyleValue> flex_grow;