From 06312cdb758e2d1cf373c35f6cc52966647a5041 Mon Sep 17 00:00:00 2001 From: Aliaksandr Kalenik Date: Tue, 25 Mar 2025 23:44:41 +0000 Subject: [PATCH] LibWeb: Ignore non-box element while collecting abspos nodes for layout All abspos boxes are expected to be blockified, so we are certain that we can ignore non-box elements when collecting abspos nodes for layout. Fixes a crash caused by an attempt to cast a BreakNode to a Box while performing abspos layout. --- Libraries/LibWeb/DOM/Document.cpp | 2 +- .../expected/block-and-inline/abspos-br.txt | 16 ++++++++++++++++ .../Layout/input/block-and-inline/abspos-br.html | 1 + 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 Tests/LibWeb/Layout/expected/block-and-inline/abspos-br.txt create mode 100644 Tests/LibWeb/Layout/input/block-and-inline/abspos-br.html diff --git a/Libraries/LibWeb/DOM/Document.cpp b/Libraries/LibWeb/DOM/Document.cpp index 659b74a7a0c..eb6a4bd8e36 100644 --- a/Libraries/LibWeb/DOM/Document.cpp +++ b/Libraries/LibWeb/DOM/Document.cpp @@ -1329,7 +1329,7 @@ void Document::update_layout(UpdateLayoutReason reason) }); // Assign each box that establishes a formatting context a list of absolutely positioned children it should take care of during layout - m_layout_root->for_each_in_inclusive_subtree([&](auto& child) { + m_layout_root->for_each_in_inclusive_subtree_of_type([&](auto& child) { if (!child.is_absolutely_positioned()) return TraversalDecision::Continue; if (auto* containing_block = child.containing_block()) { diff --git a/Tests/LibWeb/Layout/expected/block-and-inline/abspos-br.txt b/Tests/LibWeb/Layout/expected/block-and-inline/abspos-br.txt new file mode 100644 index 00000000000..6ed01176621 --- /dev/null +++ b/Tests/LibWeb/Layout/expected/block-and-inline/abspos-br.txt @@ -0,0 +1,16 @@ +Viewport <#document> at (0,0) content-size 800x600 children: not-inline + BlockContainer at (0,0) content-size 800x600 [BFC] children: not-inline + BlockContainer at (8,8) content-size 784x17 children: inline + frag 0 from TextNode start: 0, length: 1, rect: [8,8 9.34375x17] baseline: 13.296875 + "a" + frag 1 from TextNode start: 0, length: 1, rect: [17.34375,8 9.46875x17] baseline: 13.296875 + "b" + TextNode <#text> + BreakNode
+ TextNode <#text> + +ViewportPaintable (Viewport<#document>) [0,0 800x600] + PaintableWithLines (BlockContainer) [0,0 800x600] + PaintableWithLines (BlockContainer) [8,8 784x17] + TextPaintable (TextNode<#text>) + TextPaintable (TextNode<#text>) diff --git a/Tests/LibWeb/Layout/input/block-and-inline/abspos-br.html b/Tests/LibWeb/Layout/input/block-and-inline/abspos-br.html new file mode 100644 index 00000000000..b84bcf9c2c8 --- /dev/null +++ b/Tests/LibWeb/Layout/input/block-and-inline/abspos-br.html @@ -0,0 +1 @@ +a
b \ No newline at end of file