From 86098505ecd6162c633b5b3c0a2d153de86a2983 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Tue, 23 Jun 2020 20:05:35 +0200 Subject: [PATCH] LibWeb: Handle position:absolute with both left and right specified In this case, we need to undo the right-side offsetting, since the width computation algorithm will already have stretched the width to accomodate both the side constraints. --- Libraries/LibWeb/Layout/LayoutBlock.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/Libraries/LibWeb/Layout/LayoutBlock.cpp b/Libraries/LibWeb/Layout/LayoutBlock.cpp index f53dd9c8b2..591142e201 100644 --- a/Libraries/LibWeb/Layout/LayoutBlock.cpp +++ b/Libraries/LibWeb/Layout/LayoutBlock.cpp @@ -103,9 +103,17 @@ void LayoutBlock::layout_absolutely_positioned_descendant(LayoutBox& box) - box_model.offset().bottom.to_px(box) - box_model.border_box(box).bottom; - if (!box_model.offset().left.is_auto() || !box_model.margin().left.is_auto()) { + bool has_left_side_constraints = !box_model.offset().left.is_auto() || !box_model.margin().left.is_auto(); + bool has_right_side_constraints = !box_model.offset().right.is_auto() || !box_model.margin().right.is_auto(); + + if (has_left_side_constraints && has_right_side_constraints) { + // If both 'left' and 'right' are set, we will have stretched the width to accomodate both. + x_offset += box_model.offset().right.to_px(box); + } + + if (has_left_side_constraints) { used_offset.set_x(x_offset + box_model.margin().left.to_px(box)); - } else if (!box_model.offset().right.is_auto() || !box_model.margin().right.is_auto()) { + } else if (has_right_side_constraints) { used_offset.set_x(width() + x_offset - box.width() - box_model.margin().right.to_px(box)); }