at (12,1685) content-size 150x50 positioned [BFC] children: inline
+ line 0 width: 115.515625, height: 17.46875, bottom: 17.46875, baseline: 13.53125
+ frag 0 from TextNode start: 0, length: 13, rect: [12,1685 115.515625x17.46875]
+ "space-between"
+ TextNode <#text>
+ BlockContainer <(anonymous)> at (10,1746) content-size 780x0 children: inline
+ TextNode <#text>
diff --git a/Tests/LibWeb/Layout/input/flex/abspos-flex-child-static-position-with-justify-content.html b/Tests/LibWeb/Layout/input/flex/abspos-flex-child-static-position-with-justify-content.html
new file mode 100644
index 0000000000..7169c8f06d
--- /dev/null
+++ b/Tests/LibWeb/Layout/input/flex/abspos-flex-child-static-position-with-justify-content.html
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Userland/Libraries/LibWeb/Layout/FlexFormattingContext.cpp b/Userland/Libraries/LibWeb/Layout/FlexFormattingContext.cpp
index fc0c5f52e5..0789482f45 100644
--- a/Userland/Libraries/LibWeb/Layout/FlexFormattingContext.cpp
+++ b/Userland/Libraries/LibWeb/Layout/FlexFormattingContext.cpp
@@ -2150,40 +2150,22 @@ CSSPixelPoint FlexFormattingContext::calculate_static_position(Box const& box) c
CSSPixels main_offset = 0;
switch (flex_container().computed_values().justify_content()) {
case CSS::JustifyContent::Start:
- if (is_direction_reverse()) {
- main_offset = inner_main_size(flex_container());
- } else {
- main_offset = 0;
- }
+ case CSS::JustifyContent::FlexStart:
+ main_offset = 0;
+ pack_from_end = is_direction_reverse();
break;
case CSS::JustifyContent::End:
- if (is_direction_reverse()) {
- main_offset = 0;
- } else {
- main_offset = inner_main_size(flex_container());
- }
- break;
- case CSS::JustifyContent::FlexStart:
- if (is_direction_reverse()) {
- pack_from_end = false;
- main_offset = inner_main_size(flex_container());
- } else {
- main_offset = 0;
- }
- break;
case CSS::JustifyContent::FlexEnd:
- if (is_direction_reverse()) {
- main_offset = 0;
- } else {
- pack_from_end = false;
- main_offset = inner_main_size(flex_container());
- }
+ main_offset = 0;
+ pack_from_end = !is_direction_reverse();
break;
case CSS::JustifyContent::SpaceBetween:
+ pack_from_end = false;
main_offset = 0;
break;
case CSS::JustifyContent::Center:
case CSS::JustifyContent::SpaceAround:
+ pack_from_end = false;
main_offset = inner_main_size(flex_container()) / 2.0 - inner_main_size(box) / 2.0;
break;
}
@@ -2191,12 +2173,12 @@ CSSPixelPoint FlexFormattingContext::calculate_static_position(Box const& box) c
// NOTE: Next, we add the flex container's padding since abspos boxes are placed relative to the padding edge
// of their abspos containing block.
if (pack_from_end) {
- main_offset += is_row_layout() ? m_flex_container_state.padding_left : m_flex_container_state.padding_top;
- } else {
main_offset += is_row_layout() ? m_flex_container_state.padding_right : m_flex_container_state.padding_bottom;
+ } else {
+ main_offset += is_row_layout() ? m_flex_container_state.padding_left : m_flex_container_state.padding_top;
}
- if (!pack_from_end)
+ if (pack_from_end)
main_offset += inner_main_size(flex_container()) - inner_main_size(box);
auto static_position_offset = is_row_layout() ? CSSPixelPoint { main_offset, cross_offset } : CSSPixelPoint { cross_offset, main_offset };