LibWeb: Use computed display value for ::first-letter layout wrappers

Previously, `::first-letter` elements were always wrapped in an inline
box, meaning these elements were not correctly blockified when floated.
This commit is contained in:
Tim Ledbetter 2026-06-22 02:02:27 +01:00 committed by Jelle Raaijmakers
parent 2f84f89874
commit 0ec95a606f
3 changed files with 45 additions and 1 deletions

View file

@ -447,7 +447,9 @@ void TreeBuilder::create_first_letter_wrapper_if_needed(DOM::Element& element, B
first_letter_slice = make_ref_counted<GeneratedTextNode>(document, Utf16String::from_utf16(text.utf16_view().substring_view(0, letter_end)));
}
auto first_letter_wrapper = make_ref_counted<InlineNode>(document, nullptr, *first_letter_style);
auto first_letter_wrapper = DOM::Element::create_layout_node_for_display_type(document, first_letter_style->display(), *first_letter_style, nullptr);
if (!first_letter_wrapper)
return;
first_letter_wrapper->set_generated_for(CSS::PseudoElement::FirstLetter, element);
first_letter_wrapper->set_children_are_inline(true);
first_letter_wrapper->append_child(*first_letter_slice);

View file

@ -0,0 +1,11 @@
<!doctype html>
<meta charset="utf-8">
<title>CSS Reference File</title>
<link rel="author" title="Rune Lillesveen" href="mailto:futhark@chromium.org">
<p>Pass if no space between "A", space between "B".</p>
<div><span style="float:left">A</span>A</div>
<div><span style="float:left">A</span>A</div>
<div>B B</div>
<div>B B</div>
<div>AAB B</div>
<div>AAB B</div>

View file

@ -0,0 +1,31 @@
<!doctype html>
<meta charset="utf-8">
<title>CSS Test: White-spaces around floated ::first-letter</title>
<link rel="author" title="Rune Lillesveen" href="mailto:futhark@chromium.org">
<link rel="match" href="../../../../expected/wpt-import/css/css-pseudo/first-letter-and-whitespace-ref.html">
<link rel="help" href="https://drafts.csswg.org/css-pseudo-4/#first-letter-styling">
<meta name="assert" content="Test checks that white-spaces are correctly rendered for floated ::first-letter changes">
<style>
div::first-letter {
color: black;
}
.floatLetter::first-letter {
float: left;
}
</style>
<p>Pass if no space between "A", space between "B".</p>
<div id="t1"> <!---->AA</div>
<div id="t2"> <!---->A<!----> <!---->A</div>
<div id="t3" class="floatLetter"> <!---->B<!----> <!---->B</div>
<div id="t4" class="floatLetter"> <!---->B <!---->B</div>
<div id="t5" class="floatLetter"> <!---->AAB<!----> <!---->B</div>
<div id="t6" class="floatLetter"> <!---->AAB<!----> B</div>
<script>
document.body.offsetTop;
t1.className = "floatLetter";
t2.className = "floatLetter";
t3.className = "";
t4.className = "";
t5.className = "";
t6.className = "";
</script>