Skip to content

Generate and lay out list markers with counters and real text - #10995

Merged
kalenikaliaksandr merged 2 commits into
LadybirdBrowser:masterfrom
kalenikaliaksandr:list-marker-rework
Aug 4, 2026
Merged

Generate and lay out list markers with counters and real text#10995
kalenikaliaksandr merged 2 commits into
LadybirdBrowser:masterfrom
kalenikaliaksandr:list-marker-rework

Conversation

@kalenikaliaksandr

Copy link
Copy Markdown
Member

Replaces the legacy leaf-box list marker path (single-font measurement
in build_list_item_facts, centered draw_text at paint time that did not
line up with the list item's text) with the css-lists-3 model:

    1. and
    2. map onto list-item counter presentational hints per the HTML rendering spec, and the parallel HTML ordinal machinery is deleted; markers are numbered by the list-item counter alone.
    3. ::marker with content:normal resolves its content from
      list-style-type through the regular content pipeline, so text markers
      are block containers with generated text children and their own line
      box, painted like any other text.
    4. Outside markers are positioned by aligning their first baseline with
      the list item's first-line baseline; inside markers now genuinely
      flow as inline content at the start of the list item instead of being
      drawn outside the box.
    5. Markers with author content become marker boxes too and get the same
      outside positioning.
    6. Symbolic markers (disc, circle, square, disclosure-*) and
      list-style-image keep the UA-image path in MarkerPaintable.
    7. The spec's ::marker rule is added to the UA style sheet;
      white-space:pre preserves the marker suffix's trailing space.
    8. Counter inheritance walks through ::first-letter/::first-line
      fragments, which never carry counters.
    9. List mutations invalidate markers through the list owner, covering
      list items wrapped in non-list ancestors.

The reversed-list screenshot expectation changes where a mid-list value
attribute pins the sequence: the spec's implicit start-value algorithm
counts backwards from the pinned counter-set, yielding 7,6,5,4,3 where
the ordinal model produced 5,4,5,4,3. Firefox, which implements the
counter-based numbering model, renders the same 7,6,5,4,3; Chrome still
numbers reversed lists with the legacy ordinal algorithm and shows
5,4,5,4,3. The list item text in that test mirrors the legacy values,
so the expectation image intentionally shows markers that do not match
the item text.

Implements the css-lists-3 counter machinery that list markers are
defined in terms of:

- Elements with display:list-item now automatically increment the
  list-item counter (decrementing it inside reversed scopes), unless
  counter-increment mentions list-item explicitly. counter(list-item)
  previously rendered 0 everywhere.
- counter-reset: reversed(<name>) now parses (the grammar was already
  implemented but force-disabled), and unvalued reversed counters
  compute their start value with the spec's scope-walk algorithm.

Also makes reversed(none) invalid, per the <counter-name> grammar.

The imported lists-styles-quirks expectations temporarily record five
newly-failing counter-reset subtests: with reversed() parsing, the
test's reference styles take effect and expose that <ol reversed> is
not yet mapped onto the list-item counter. The next commit adds that
mapping.
@coderabbitai

coderabbitai Bot commented Aug 4, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The PR implements CSS list-item and reversed counters, replaces ordinal-based list handling, and updates marker construction, layout, painting, invalidation, and tests.

Changes

CSS list counters and HTML integration

Layer / File(s) Summary
Counter model and list integration
Libraries/LibWeb/CSS/*, Libraries/LibWeb/DOM/*, Libraries/LibWeb/HTML/*
CSS counters resolve implicit list-item increments and reversed-counter starts. HTML list attributes provide counter definitions. DOM mutations invalidate list-counter layout updates.
Marker construction and rendering contracts
Libraries/LibWeb/Layout/*, Libraries/LibWeb/Painting/*, Libraries/LibWeb/CSS/Default.css
Marker creation resolves counters through the originating pseudo-element. Marker boxes distinguish symbolic and textual content and support child layout.
Rust marker layout flow
Libraries/LibWeb/Rust/src/layout/*
Marker layout handles outside and inside positions, symbolic sizing, textual child layout, baseline alignment, float intrusion, and block formatting contexts.
Layout and paint expectations
Tests/LibWeb/Layout/expected/*
Expected trees record marker boxes, generated marker text, updated positions, block formatting contexts, and PaintableWithLines output.
Counter and marker test coverage
Tests/LibWeb/Ref/*, Tests/LibWeb/Text/*
Tests cover reversed counters, list-item attributes, implicit increments, dynamic mutations, nested scopes, marker alignment, serialization, and quirks results.

Estimated code review effort: 5 (Critical) | ~120 minutes

Possibly related PRs

Suggested reviewers: awesomekling, shannonbooth, tcl3

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description check ✅ Passed The description directly matches the changes, including CSS counter-based numbering, marker layout, UA styles, and list mutation invalidation.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
Libraries/LibWeb/Layout/TreeBuilder.cpp (1)

362-379: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Marker text is built by two separate paths.

create_and_attach_list_item_marker resolves the marker content, creates the GeneratedTextNode, and sets children_are_inline itself. The regular pseudo-element path builds the same result through resolve_content (lines 583-600) plus the Rust create_content_item callback. The two paths must stay in agreement about content resolution, text-node creation, set_content, and the inline-children flag.

Consider extracting the shared "attach resolved marker content to the marker box" step so both the nested-marker path and the pseudo-element path use one implementation.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Libraries/LibWeb/Layout/TreeBuilder.cpp` around lines 362 - 379, Unify marker
content attachment between create_and_attach_list_item_marker and the regular
pseudo-element flow around resolve_content/create_content_item. Extract or reuse
a shared helper that resolves marker content, creates the GeneratedTextNode,
sets content, appends the node, and enables inline children, then update both
paths to use it while preserving their existing marker setup.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@Libraries/LibWeb/DOM/Node.cpp`:
- Around line 891-897: Update the insertion loop in Node insertion handling to
trigger invalidate_list_item_counters_for_list_owner() for both HTML li elements
and inserted elements whose computed display is list-item, matching the removal
path. Preserve the existing early break after invalidating the first qualifying
node.

---

Nitpick comments:
In `@Libraries/LibWeb/Layout/TreeBuilder.cpp`:
- Around line 362-379: Unify marker content attachment between
create_and_attach_list_item_marker and the regular pseudo-element flow around
resolve_content/create_content_item. Extract or reuse a shared helper that
resolves marker content, creates the GeneratedTextNode, sets content, appends
the node, and enables inline children, then update both paths to use it while
preserving their existing marker setup.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: be97cfdc-bf6b-44a2-8602-60dc32ff4263

📥 Commits

Reviewing files that changed from the base of the PR and between 7756a29 and e86ec6f.

⛔ Files ignored due to path filters (5)
  • Tests/LibWeb/Screenshot/expected/ol-render-node-append-group-reversed.png is excluded by !**/*.png
  • Tests/LibWeb/Screenshot/expected/ol-render-node-append-reversed.png is excluded by !**/*.png
  • Tests/LibWeb/Screenshot/expected/ol-render-node-insert-last-group-reversed.png is excluded by !**/*.png
  • Tests/LibWeb/Screenshot/expected/ol-render-node-insert-last-reversed.png is excluded by !**/*.png
  • Tests/LibWeb/Screenshot/expected/ordered-list.png is excluded by !**/*.png
📒 Files selected for processing (72)
  • Libraries/LibWeb/CSS/CountersSet.cpp
  • Libraries/LibWeb/CSS/CountersSet.h
  • Libraries/LibWeb/CSS/Default.css
  • Libraries/LibWeb/CSS/Parser/PropertyParsing.cpp
  • Libraries/LibWeb/DOM/AbstractElement.cpp
  • Libraries/LibWeb/DOM/Element.cpp
  • Libraries/LibWeb/DOM/Element.h
  • Libraries/LibWeb/DOM/Node.cpp
  • Libraries/LibWeb/DOM/Node.h
  • Libraries/LibWeb/HTML/HTMLLIElement.cpp
  • Libraries/LibWeb/HTML/HTMLOListElement.cpp
  • Libraries/LibWeb/HTML/HTMLOListElement.h
  • Libraries/LibWeb/Layout/LayoutRustBridge.cpp
  • Libraries/LibWeb/Layout/ListItemMarkerBox.cpp
  • Libraries/LibWeb/Layout/ListItemMarkerBox.h
  • Libraries/LibWeb/Layout/TreeBuilder.cpp
  • Libraries/LibWeb/Painting/MarkerPaintable.cpp
  • Libraries/LibWeb/Painting/Paintable.cpp
  • Libraries/LibWeb/Rust/src/layout/block_formatting_context.rs
  • Libraries/LibWeb/Rust/src/layout/formatting_context.rs
  • Libraries/LibWeb/Rust/src/layout/inline_formatting_context.rs
  • Libraries/LibWeb/Rust/src/layout/inline_level_iterator.rs
  • Libraries/LibWeb/Rust/src/layout/layout_state.rs
  • Libraries/LibWeb/Rust/src/layout/line_builder.rs
  • Libraries/LibWeb/Rust/src/layout/node_facts.rs
  • Libraries/LibWeb/Rust/src/layout/tree_builder.rs
  • Tests/LibWeb/Layout/expected/block-and-inline/list-markers-intruded-by-float.txt
  • Tests/LibWeb/Layout/expected/block-in-inline-in-floated-fieldset.txt
  • Tests/LibWeb/Layout/expected/css-pseudo-element-display-list-item.txt
  • Tests/LibWeb/Layout/expected/css/content-for-marker-in-list.txt
  • Tests/LibWeb/Layout/expected/css/content-for-marker.txt
  • Tests/LibWeb/Layout/expected/details-closed.txt
  • Tests/LibWeb/Layout/expected/details-open.txt
  • Tests/LibWeb/Layout/expected/details-summary-default-ua-style.txt
  • Tests/LibWeb/Layout/expected/empty-list-items.txt
  • Tests/LibWeb/Layout/expected/inside-list-item-content-offset.txt
  • Tests/LibWeb/Layout/expected/list-item-marker-content-height.txt
  • Tests/LibWeb/Layout/expected/list-item-marker-pseudo-placement.txt
  • Tests/LibWeb/Layout/expected/list-item-with-floated-child.txt
  • Tests/LibWeb/Layout/expected/list-marker-rtl.txt
  • Tests/LibWeb/Layout/expected/list-render-list-owner-is-document.txt
  • Tests/LibWeb/Layout/expected/list-render-list-owner-not-ol.txt
  • Tests/LibWeb/Layout/expected/list-render-no-list.txt
  • Tests/LibWeb/Layout/expected/ol-render-deep-hybrid-list-item-list.txt
  • Tests/LibWeb/Layout/expected/ol-render-item-values.txt
  • Tests/LibWeb/Layout/expected/ol-render-style-list-item.txt
  • Tests/LibWeb/Layout/expected/ordered-list.txt
  • Tests/LibWeb/Layout/expected/pseudo-element-content-replacement-list-item.txt
  • Tests/LibWeb/Layout/expected/ul-render.txt
  • Tests/LibWeb/Ref/expected/css/css-lists/counter-reset-reversed-ref.html
  • Tests/LibWeb/Ref/expected/css/css-lists/list-item-counter-details-summary-ref.html
  • Tests/LibWeb/Ref/expected/css/css-lists/list-item-counter-dynamic-attributes-ref.html
  • Tests/LibWeb/Ref/expected/css/css-lists/list-item-counter-dynamic-insert-remove-ref.html
  • Tests/LibWeb/Ref/expected/css/css-lists/list-item-counter-dynamic-wrapped-ref.html
  • Tests/LibWeb/Ref/expected/css/css-lists/list-item-counter-html-attributes-ref.html
  • Tests/LibWeb/Ref/expected/css/css-lists/list-item-counter-implicit-increment-ref.html
  • Tests/LibWeb/Ref/expected/css/css-lists/list-item-counter-increment-suppression-ref.html
  • Tests/LibWeb/Ref/expected/css/css-lists/list-item-counter-nested-scopes-ref.html
  • Tests/LibWeb/Ref/expected/list-marker-baseline-alignment-ref.html
  • Tests/LibWeb/Ref/input/css/css-lists/counter-reset-reversed.html
  • Tests/LibWeb/Ref/input/css/css-lists/list-item-counter-details-summary.html
  • Tests/LibWeb/Ref/input/css/css-lists/list-item-counter-dynamic-attributes.html
  • Tests/LibWeb/Ref/input/css/css-lists/list-item-counter-dynamic-insert-remove.html
  • Tests/LibWeb/Ref/input/css/css-lists/list-item-counter-dynamic-wrapped.html
  • Tests/LibWeb/Ref/input/css/css-lists/list-item-counter-html-attributes.html
  • Tests/LibWeb/Ref/input/css/css-lists/list-item-counter-implicit-increment.html
  • Tests/LibWeb/Ref/input/css/css-lists/list-item-counter-increment-suppression.html
  • Tests/LibWeb/Ref/input/css/css-lists/list-item-counter-nested-scopes.html
  • Tests/LibWeb/Ref/input/list-marker-baseline-alignment.html
  • Tests/LibWeb/Text/expected/css/counter-reset-reversed-serialization.txt
  • Tests/LibWeb/Text/expected/wpt-import/html/rendering/non-replaced-elements/lists/lists-styles-quirks.txt
  • Tests/LibWeb/Text/input/css/counter-reset-reversed-serialization.html
💤 Files with no reviewable changes (2)
  • Libraries/LibWeb/HTML/HTMLOListElement.h
  • Libraries/LibWeb/Painting/MarkerPaintable.cpp

Comment on lines +891 to +897
// AD-HOC: An inserted list item renumbers the list-item counter for its list owner's whole list.
for (auto& inserted_node : nodes) {
if (inserted_node->is_html_li_element()) {
static_cast<Element&>(*inserted_node).invalidate_list_item_counters_for_list_owner();
break;
}
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Description: Inspect invalidate_list_item_counters_for_list_owner and all of its call sites.
set -euo pipefail

rg -nP --type=cpp -C6 '\binvalidate_list_item_counters_for_list_owner\s*\(' 

# Locate its definition and the list-owner resolution it relies on.
fd -t f 'Element.cpp' Libraries/LibWeb/DOM --exec rg -nP -C25 'invalidate_list_item_counters_for_list_owner'

Repository: LadybirdBrowser/ladybird

Length of output: 162


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "tracked file:"
git ls-files | rg '(^|/)Node\.cpp$|(^|/)Element\.cpp$|(^|/)DOM/|List' | head -200

echo
echo "search for relevant identifiers:"
rg -n -C5 'invalidate_list_item_counters_for_list_owner|is_html_li_element|display.*list-item|list_item|list-item' --type=cpp --type=h | head -300

echo
echo "Node.cpp around reported lines:"
wc -l Libraries/LibWeb/DOM/Node.cpp
sed -n '860,1035p' Libraries/LibWeb/DOM/Node.cpp

Repository: LadybirdBrowser/ladybird

Length of output: 7707


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "find files with list-related names:"
fd -t f -i 'list|counter' Libraries/LibWeb | head -200

echo
echo "search likely DOM symbols more broadly:"
rg -n -C4 'list_element|query_selector|display\s*:|computed_style|display' Libraries/LibWeb --glob '*.{cpp,h}' | head -400

Repository: LadybirdBrowser/ladybird

Length of output: 38040


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "node insert/remove sections:"
sed -n '840,890p' Libraries/LibWeb/DOM/Node.cpp
sed -n '980,1045p' Libraries/LibWeb/DOM/Node.cpp

echo
echo "find exact symbol across tracked files:"
python3 - <<'PY'
from pathlib import Path
queries = ['invalidate_list_item_counters_for_list_owner', 'list_owner', 'is_html_li_element']
for q in queries:
    hits=[]
    for p in Path('.').rglob('*'):
        if any(part in {'.git','build','dist'} for part in p.parts):
            continue
        if p.is_file() and p.suffix in {'.cpp','.h','.idl'}:
            try:
                s=p.read_text(errors='ignore')
            except Exception:
                continue
            if q in s:
                hits.append(p)
    print(q, len(hits))
    for h in hits[:150]:
        print(' ', h)
PY

echo
echo "Element list marker symbols:"
rg -n -C6 'marker|list_item|list-item|list-element|OL|UL|LI|invalidate|renumber|counter' Libraries/LibWeb --glob '*.{cpp,h}' | head -400

Repository: LadybirdBrowser/ladybird

Length of output: 38761


Align list-item insertion with the removal path

The removal path handles both HTML <li> elements and elements with computed display: list-item, but the insertion path only checks is_html_li_element(). An inserted non-<li> element with display: list-item will not call invalidate_list_item_counters_for_list_owner(), so counters may not renumber consistently.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Libraries/LibWeb/DOM/Node.cpp` around lines 891 - 897, Update the insertion
loop in Node insertion handling to trigger
invalidate_list_item_counters_for_list_owner() for both HTML li elements and
inserted elements whose computed display is list-item, matching the removal
path. Preserve the existing early break after invalidating the first qualifying
node.

Replaces the legacy leaf-box list marker path (single-font measurement
in build_list_item_facts, centered draw_text at paint time that did not
line up with the list item's text) with the css-lists-3 model:

- <ol start/reversed> and <li value> map onto list-item counter
  presentational hints per the HTML rendering spec, and the parallel
  HTML ordinal machinery is deleted; markers are numbered by the
  list-item counter alone.
- ::marker with content:normal resolves its content from
  list-style-type through the regular content pipeline, so text markers
  are block containers with generated text children and their own line
  box, painted like any other text.
- Outside markers are positioned by aligning their first baseline with
  the list item's first-line baseline; inside markers now genuinely
  flow as inline content at the start of the list item instead of being
  drawn outside the box.
- Markers with author content become marker boxes too and get the same
  outside positioning.
- Symbolic markers (disc, circle, square, disclosure-*) and
  list-style-image keep the UA-image path in MarkerPaintable.
- The spec's ::marker rule is added to the UA style sheet;
  white-space:pre preserves the marker suffix's trailing space.
- Counter inheritance walks through ::first-letter/::first-line
  fragments, which never carry counters.
- List mutations invalidate markers through the list owner, covering
  list items wrapped in non-list ancestors.

The reversed-list screenshot expectation changes where a mid-list value
attribute pins the sequence: the spec's implicit start-value algorithm
counts backwards from the pinned counter-set, yielding 7,6,5,4,3 where
the ordinal model produced 5,4,5,4,3. Firefox, which implements the
counter-based numbering model, renders the same 7,6,5,4,3; Chrome still
numbers reversed lists with the legacy ordinal algorithm and shows
5,4,5,4,3. The list item text in that test mirrors the legacy values,
so the expectation image intentionally shows markers that do not match
the item text.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
Libraries/LibWeb/Layout/ListItemMarkerBox.cpp (1)

57-71: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Guard relative_size() with has_symbolic_counter_style()

LayoutRustBridge.cpp computes marker_is_symbolic using is_symbolic(), then calls marker->relative_size() whenever list_style_image() is absent. For list-style: url(marker.png) decimal, is_symbolic() is true, but MarkerPaintable::paint() returns when an image is present without setting marker dimensions, leaving the image outside the list marker box. Keep relative_size() guarded as written and fix the image-only marker size path so LayoutRustBridge.cpp does not enter the unresolved counter-style branch.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Libraries/LibWeb/Layout/ListItemMarkerBox.cpp` around lines 57 - 71, Update
the marker sizing logic in LayoutRustBridge.cpp so image-only list markers do
not enter the counter-style relative_size() path when list_style_image() is
present. Preserve the existing relative_size() guard in
ListItemMarkerBox::relative_size(), and ensure image markers receive valid
dimensions or follow the appropriate image sizing path before
MarkerPaintable::paint() handles them.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@Libraries/LibWeb/Layout/ListItemMarkerBox.cpp`:
- Around line 57-71: Update the marker sizing logic in LayoutRustBridge.cpp so
image-only list markers do not enter the counter-style relative_size() path when
list_style_image() is present. Preserve the existing relative_size() guard in
ListItemMarkerBox::relative_size(), and ensure image markers receive valid
dimensions or follow the appropriate image sizing path before
MarkerPaintable::paint() handles them.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 2255532e-2daf-4c5e-affa-0fb2dab28097

📥 Commits

Reviewing files that changed from the base of the PR and between e86ec6f and 35289b7.

⛔ Files ignored due to path filters (5)
  • Tests/LibWeb/Screenshot/expected/ol-render-node-append-group-reversed.png is excluded by !**/*.png
  • Tests/LibWeb/Screenshot/expected/ol-render-node-append-reversed.png is excluded by !**/*.png
  • Tests/LibWeb/Screenshot/expected/ol-render-node-insert-last-group-reversed.png is excluded by !**/*.png
  • Tests/LibWeb/Screenshot/expected/ol-render-node-insert-last-reversed.png is excluded by !**/*.png
  • Tests/LibWeb/Screenshot/expected/ordered-list.png is excluded by !**/*.png
📒 Files selected for processing (61)
  • Libraries/LibWeb/CSS/Default.css
  • Libraries/LibWeb/DOM/AbstractElement.cpp
  • Libraries/LibWeb/DOM/Element.cpp
  • Libraries/LibWeb/DOM/Element.h
  • Libraries/LibWeb/DOM/Node.cpp
  • Libraries/LibWeb/DOM/Node.h
  • Libraries/LibWeb/HTML/HTMLLIElement.cpp
  • Libraries/LibWeb/HTML/HTMLOListElement.cpp
  • Libraries/LibWeb/HTML/HTMLOListElement.h
  • Libraries/LibWeb/Layout/LayoutRustBridge.cpp
  • Libraries/LibWeb/Layout/ListItemMarkerBox.cpp
  • Libraries/LibWeb/Layout/ListItemMarkerBox.h
  • Libraries/LibWeb/Layout/TreeBuilder.cpp
  • Libraries/LibWeb/Painting/MarkerPaintable.cpp
  • Libraries/LibWeb/Painting/Paintable.cpp
  • Libraries/LibWeb/Rust/src/layout/block_formatting_context.rs
  • Libraries/LibWeb/Rust/src/layout/formatting_context.rs
  • Libraries/LibWeb/Rust/src/layout/inline_formatting_context.rs
  • Libraries/LibWeb/Rust/src/layout/inline_level_iterator.rs
  • Libraries/LibWeb/Rust/src/layout/layout_state.rs
  • Libraries/LibWeb/Rust/src/layout/line_builder.rs
  • Libraries/LibWeb/Rust/src/layout/node_facts.rs
  • Libraries/LibWeb/Rust/src/layout/tree_builder.rs
  • Tests/LibWeb/Layout/expected/block-and-inline/list-markers-intruded-by-float.txt
  • Tests/LibWeb/Layout/expected/block-in-inline-in-floated-fieldset.txt
  • Tests/LibWeb/Layout/expected/css-pseudo-element-display-list-item.txt
  • Tests/LibWeb/Layout/expected/css/content-for-marker-in-list.txt
  • Tests/LibWeb/Layout/expected/css/content-for-marker.txt
  • Tests/LibWeb/Layout/expected/details-closed.txt
  • Tests/LibWeb/Layout/expected/details-open.txt
  • Tests/LibWeb/Layout/expected/details-summary-default-ua-style.txt
  • Tests/LibWeb/Layout/expected/empty-list-items.txt
  • Tests/LibWeb/Layout/expected/inside-list-item-content-offset.txt
  • Tests/LibWeb/Layout/expected/list-item-marker-content-height.txt
  • Tests/LibWeb/Layout/expected/list-item-marker-pseudo-placement.txt
  • Tests/LibWeb/Layout/expected/list-item-with-floated-child.txt
  • Tests/LibWeb/Layout/expected/list-marker-rtl.txt
  • Tests/LibWeb/Layout/expected/list-render-list-owner-is-document.txt
  • Tests/LibWeb/Layout/expected/list-render-list-owner-not-ol.txt
  • Tests/LibWeb/Layout/expected/list-render-no-list.txt
  • Tests/LibWeb/Layout/expected/ol-render-deep-hybrid-list-item-list.txt
  • Tests/LibWeb/Layout/expected/ol-render-item-values.txt
  • Tests/LibWeb/Layout/expected/ol-render-style-list-item.txt
  • Tests/LibWeb/Layout/expected/ordered-list.txt
  • Tests/LibWeb/Layout/expected/pseudo-element-content-replacement-list-item.txt
  • Tests/LibWeb/Layout/expected/ul-render.txt
  • Tests/LibWeb/Ref/expected/css/css-lists/counter-reset-reversed-ref.html
  • Tests/LibWeb/Ref/expected/css/css-lists/list-item-counter-dynamic-attributes-ref.html
  • Tests/LibWeb/Ref/expected/css/css-lists/list-item-counter-dynamic-insert-remove-ref.html
  • Tests/LibWeb/Ref/expected/css/css-lists/list-item-counter-dynamic-wrapped-ref.html
  • Tests/LibWeb/Ref/expected/css/css-lists/list-item-counter-html-attributes-ref.html
  • Tests/LibWeb/Ref/expected/css/css-lists/list-item-counter-increment-suppression-ref.html
  • Tests/LibWeb/Ref/expected/list-marker-baseline-alignment-ref.html
  • Tests/LibWeb/Ref/input/css/css-lists/counter-reset-reversed.html
  • Tests/LibWeb/Ref/input/css/css-lists/list-item-counter-dynamic-attributes.html
  • Tests/LibWeb/Ref/input/css/css-lists/list-item-counter-dynamic-insert-remove.html
  • Tests/LibWeb/Ref/input/css/css-lists/list-item-counter-dynamic-wrapped.html
  • Tests/LibWeb/Ref/input/css/css-lists/list-item-counter-html-attributes.html
  • Tests/LibWeb/Ref/input/css/css-lists/list-item-counter-increment-suppression.html
  • Tests/LibWeb/Ref/input/list-marker-baseline-alignment.html
  • Tests/LibWeb/Text/expected/wpt-import/html/rendering/non-replaced-elements/lists/lists-styles-quirks.txt
💤 Files with no reviewable changes (2)
  • Libraries/LibWeb/HTML/HTMLOListElement.h
  • Libraries/LibWeb/Painting/MarkerPaintable.cpp
🚧 Files skipped from review as they are similar to previous changes (54)
  • Libraries/LibWeb/DOM/Node.h
  • Libraries/LibWeb/Rust/src/layout/inline_formatting_context.rs
  • Libraries/LibWeb/Rust/src/layout/formatting_context.rs
  • Tests/LibWeb/Layout/expected/css/content-for-marker-in-list.txt
  • Libraries/LibWeb/CSS/Default.css
  • Tests/LibWeb/Ref/expected/css/css-lists/list-item-counter-increment-suppression-ref.html
  • Tests/LibWeb/Layout/expected/list-marker-rtl.txt
  • Tests/LibWeb/Layout/expected/details-open.txt
  • Tests/LibWeb/Ref/expected/css/css-lists/counter-reset-reversed-ref.html
  • Tests/LibWeb/Layout/expected/list-item-marker-content-height.txt
  • Tests/LibWeb/Ref/input/css/css-lists/list-item-counter-dynamic-insert-remove.html
  • Tests/LibWeb/Layout/expected/css-pseudo-element-display-list-item.txt
  • Tests/LibWeb/Layout/expected/details-summary-default-ua-style.txt
  • Libraries/LibWeb/DOM/AbstractElement.cpp
  • Tests/LibWeb/Layout/expected/ul-render.txt
  • Tests/LibWeb/Ref/input/css/css-lists/list-item-counter-increment-suppression.html
  • Tests/LibWeb/Layout/expected/list-render-list-owner-is-document.txt
  • Libraries/LibWeb/Layout/ListItemMarkerBox.h
  • Tests/LibWeb/Ref/expected/css/css-lists/list-item-counter-dynamic-wrapped-ref.html
  • Libraries/LibWeb/Rust/src/layout/layout_state.rs
  • Libraries/LibWeb/Layout/LayoutRustBridge.cpp
  • Tests/LibWeb/Ref/input/css/css-lists/counter-reset-reversed.html
  • Tests/LibWeb/Layout/expected/inside-list-item-content-offset.txt
  • Tests/LibWeb/Ref/expected/css/css-lists/list-item-counter-html-attributes-ref.html
  • Tests/LibWeb/Ref/expected/list-marker-baseline-alignment-ref.html
  • Tests/LibWeb/Layout/expected/ol-render-deep-hybrid-list-item-list.txt
  • Tests/LibWeb/Layout/expected/list-item-with-floated-child.txt
  • Libraries/LibWeb/Painting/Paintable.cpp
  • Tests/LibWeb/Layout/expected/pseudo-element-content-replacement-list-item.txt
  • Tests/LibWeb/Layout/expected/list-render-list-owner-not-ol.txt
  • Tests/LibWeb/Ref/input/css/css-lists/list-item-counter-html-attributes.html
  • Tests/LibWeb/Ref/expected/css/css-lists/list-item-counter-dynamic-insert-remove-ref.html
  • Tests/LibWeb/Layout/expected/block-in-inline-in-floated-fieldset.txt
  • Tests/LibWeb/Layout/expected/list-render-no-list.txt
  • Tests/LibWeb/Ref/input/css/css-lists/list-item-counter-dynamic-wrapped.html
  • Libraries/LibWeb/Rust/src/layout/inline_level_iterator.rs
  • Tests/LibWeb/Ref/input/list-marker-baseline-alignment.html
  • Libraries/LibWeb/Rust/src/layout/line_builder.rs
  • Tests/LibWeb/Layout/expected/css/content-for-marker.txt
  • Tests/LibWeb/Layout/expected/ordered-list.txt
  • Tests/LibWeb/Layout/expected/ol-render-item-values.txt
  • Tests/LibWeb/Layout/expected/empty-list-items.txt
  • Libraries/LibWeb/Rust/src/layout/node_facts.rs
  • Tests/LibWeb/Layout/expected/ol-render-style-list-item.txt
  • Tests/LibWeb/Ref/expected/css/css-lists/list-item-counter-dynamic-attributes-ref.html
  • Tests/LibWeb/Layout/expected/list-item-marker-pseudo-placement.txt
  • Libraries/LibWeb/Rust/src/layout/block_formatting_context.rs
  • Libraries/LibWeb/Rust/src/layout/tree_builder.rs
  • Tests/LibWeb/Layout/expected/block-and-inline/list-markers-intruded-by-float.txt
  • Tests/LibWeb/Layout/expected/details-closed.txt
  • Tests/LibWeb/Text/expected/wpt-import/html/rendering/non-replaced-elements/lists/lists-styles-quirks.txt
  • Tests/LibWeb/Ref/input/css/css-lists/list-item-counter-dynamic-attributes.html
  • Libraries/LibWeb/DOM/Node.cpp
  • Libraries/LibWeb/DOM/Element.h

@kalenikaliaksandr
kalenikaliaksandr merged commit 76ff8b7 into LadybirdBrowser:master Aug 4, 2026
15 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant