Skip to content

Support margin, border and padding on non-atomic inline elements - #1018

Open
nicoburns wants to merge 4 commits into
mainfrom
devin/1790969486-inline-span-pbm
Open

nicoburns wants to merge 4 commits into
mainfrom
devin/1790969486-inline-span-pbm

Conversation

@nicoburns

@nicoburns nicoburns commented Oct 2, 2026 •

Copy link
Copy Markdown
Member

Summary

Margin, border and padding on ordinary inline elements (<span style="padding: 2px 8px; border: 1px solid">) now take up inline space, wrap like they do in browsers, and are painted. Previously they were ignored: such elements only got a background-color rect per glyph run.

Depends on DioxusLabs/parley#83 (TextStyle::inline_start / inline_end, Line::span_fragments(), Layout::span_edges_mut()). The parley dependency temporarily points at that branch (DioxusLabs/parley@e6c2e55) and needs repointing before merge.

Spans stay non-atomic style spans (push_style_span / pop_style_span); nothing is converted to an inline box.

How it works

  • Construction (construct.rs): a span whose inline-axis margin + border + padding can be non-zero is pushed with placeholder edges, so that Parley creates edge items for it. The real sizes are not known yet (percentages).
  • Layout (inline.rs): next to the existing inline_boxes_mut() loop, each edge is resolved and written through span_edges_mut():
    left  = margin-left  + border-left  + padding-left     (percentages against the containing block width)
    right = margin-right + border-right + padding-right
    (inline_start, inline_end) = if root is rtl { (right, left) } else { (left, right) }   // then * scale
    
    Stylo has already mapped logical properties onto physical sides, so this is the only physical-to-logical step. Top/bottom never reach Parley and do not affect line height.
  • Fragments (new layout/inline_span.rs): BaseDocument::inline_span_fragments(inline_root) turns Parley's per-line span fragments into border boxes (InlineSpanFragment), adding the vertical padding/border and dropping the left/right side on lines where that side of the box is absent (box-decoration-break: slice).
  • Paint (blitz-paint): draw_inline_backgrounds (per glyph run, background colour only) is replaced by draw_inline_span_boxes, which runs the normal draw_background + draw_border on each fragment. Inline elements therefore also get background images, border radii etc.
  • inline_fragment_rects (getClientRects for inline elements) is built from the same fragments.

An inline root that contains only an empty span with inline edges now generates a line, as in browsers.

Behaviour changes to existing output

  • Inline fragment rects (and backgrounds) are now the element's font ascent + descent tall, plus vertical padding/border, rather than the full line box height. This matches Chrome (e.g. a 24px rect on a 30px line).
  • Backgrounds and rects no longer include collapsible whitespace hanging at the end of a wrapped line (preserved whitespace, e.g. pre-wrap, is still included).
  • An empty inline element has a fragment (so it is painted and has client rects). It stays on the line of the content before it, as in Chrome, and has no height in a block that generates no line boxes.
  • scrollIntoView on a non-atomic inline uses the bounding box of its fragments.

Comparison with Chrome

Chrome 137 on the left, this branch on the right, for a set of probe cases (font: 20px/30px monospace, 120px wide containers, padding: 0 20px on the spans):

Chrome vs Blitz

getClientRects() for the spans in 15 probe cases match Chrome exactly in 12. The differences:

  • Trailing space inside a span at a wrap point (third case above: aaa <span>bbb </span>ccccc). Chrome hangs the space and lets the end edge overflow the line by 4px. Here the end edge keeps the space before it from hanging, so the span is moved to the next line and is one space wider. Not verified against Firefox.
  • box-decoration-break: clone is not implemented (treated as slice).
  • A line mixing LTR and RTL text differs by 3px, which is the fallback font for the Hebrew glyphs rather than layout.

Known limitations

  • The inline root's direction is used for every span: edges are placed in visual order in the root's direction, and a span split by bidi reordering gets one box per visual piece. A span whose own direction differs from the root's gets its start/end sides swapped (WPT ltr-span-only, rtl-span-only); fixing that needs a per-span direction in Parley.
  • A vertical border/padding that overflows the line box can be painted over by the background of the following block (paint order), as visible in the tall span in the screenshot.
  • outline is not painted on non-atomic inlines (it was not before either).

WPT

Compared with main, 131 tests newly pass and 49 newly fail. The newly failing ones, none of which pass for the right reason on main:

  • The reference uses span margin/border/background, and the test needs an unsupported feature (44): text-autospace-* (17), vertical writing modes (line-box-height-v*, inline-box-border-vlr-001, border-slice-001; 16), ruby (2), clip-path on inlines (3), box-decoration-break: clone, ::first-letter backgrounds, multicol (area-002), hanging-punctuation, text-align-last: justify on a line with only an empty inline, outline on inlines (empty-span-size-002).
  • Per-span direction (2): ltr-span-only, rtl-span-only.
  • Other (2): inherit-computed-001 (the border of an empty <em> is now painted, and border: inherit gives it the wrong colour), background-attachment-fixed-inline-scrolled (fixed background of a scrolled inline is 8px off).
  • word-break-normal-hi-000 fails on CI only (it passes locally); it depends on the Devanagari font fitting four words in 390px, and probably passed before only because offsetWidth included the hanging space.

Testing

New tests/blitz-tests/tests/inline_span_pbm.rs (16 tests): inline-axis space, no effect of vertical PBM on line height, wrapped start/end sides, edges not separable from adjacent content, empty spans, percentages, RTL side mapping, logical properties, and painted background/border pixels including wrapped fragments; plus calc() percentages in intrinsically sized blocks, empty spans (line placement, zero height in an empty block), preserved trailing whitespace, and a span split by bidi reordering.

Link to Devin session: https://dioxus.staging.devinenterprise.com/sessions/38d20c11138046c5a04fb2aa400e7033
Open in Devin Desktop: https://dioxus.staging.devinenterprise.com/desktop/session/38d20c11138046c5a04fb2aa400e7033?variant=devin-insiders
Requested by: @nicoburns

WPT results

Subtests: 148 newly passing, 54 newly failing (net +94).

Full diff (183 changed tests)
+ FAIL => PASS    [1/1]  +1  css/CSS2/abspos/hypothetical-inline-alone-on-second-line.html
+ FAIL => PASS    [1/1]  +1  css/CSS2/bidi-text/bidi-box-model-010.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/bidi-text/bidi-box-model-011.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/bidi-text/bidi-box-model-012.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/bidi-text/bidi-box-model-014.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/bidi-text/bidi-box-model-015.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/bidi-text/bidi-box-model-019.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/bidi-text/bidi-box-model-020.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/bidi-text/bidi-box-model-021.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/bidi-text/bidi-box-model-023.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/bidi-text/bidi-box-model-024.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/bidi-text/bidi-box-model-028.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/bidi-text/bidi-box-model-029.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/bidi-text/bidi-box-model-030.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/bidi-text/bidi-box-model-032.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/bidi-text/bidi-box-model-033.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/bidi-text/bidi-box-model-037.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/bidi-text/bidi-box-model-038.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/bidi-text/bidi-box-model-039.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/bidi-text/bidi-box-model-041.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/bidi-text/bidi-box-model-042.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/bidi-text/line-breaking-bidi-003.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/borders/border-width-applies-to-008.xht
- PASS => FAIL    [0/1]  -1  css/CSS2/box/ltr-span-only.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/box/rtl-linebreak.xht
- PASS => FAIL    [0/1]  -1  css/CSS2/box/rtl-span-only.xht
- PASS => FAIL    [0/1]  -1  css/CSS2/cascade/inherit-computed-001.html
+ FAIL => PASS    [1/1]  +1  css/CSS2/css1/c42-ibx-pad-000.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/css1/c547-indent-001.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/css1/c548-leadin-000.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/css1/c5502-imrgn-r-000.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/css1/c5502-imrgn-r-002.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/css1/c5502-imrgn-r-003.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/css1/c5502-imrgn-r-004.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/css1/c5504-imrgn-l-000.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/css1/c5504-imrgn-l-001.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/css1/c5504-imrgn-l-002.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/css1/c5504-imrgn-l-003.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/css1/c5504-imrgn-l-004.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/css1/c5504-imrgn-l-006.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/css1/c5505-imrgn-000.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/css1/c5506-ipadn-t-002.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/css1/c5507-ipadn-r-000.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/css1/c5507-ipadn-r-002.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/css1/c5507-ipadn-r-003.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/css1/c5507-ipadn-r-004.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/css1/c5508-ipadn-b-002.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/css1/c5509-ipadn-l-000.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/css1/c5509-ipadn-l-001.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/css1/c5509-ipadn-l-002.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/css1/c5509-ipadn-l-003.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/css1/c5509-ipadn-l-004.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/css1/c5510-ipadn-000.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/floats-clear/floats-149.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/linebox/empty-inline-002.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/linebox/inline-formatting-context-003.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/linebox/inline-formatting-context-005.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/linebox/inline-formatting-context-007.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/linebox/inline-formatting-context-022.xht
+ FAIL => FAIL  [11/13]  +3  css/CSS2/linebox/inline-negative-margin-001.html
+ FAIL => PASS    [1/1]  +1  css/CSS2/linebox/vertical-align-117a.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/linebox/vertical-align-118a.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/margin-padding-clear/margin-bottom-applies-to-008.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/margin-padding-clear/margin-collapse-001.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/margin-padding-clear/margin-inline-001.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/margin-padding-clear/margin-top-applies-to-008.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/normal-flow/inline-box-border-line-break.html
+ FAIL => PASS    [1/1]  +1  css/CSS2/normal-flow/inline-box-padding-line-break.html
+ FAIL => PASS    [1/1]  +1  css/CSS2/normal-flow/inline-non-replaced-height-002.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/normal-flow/inline-non-replaced-height-003.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/normal-flow/inlines-016.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/normal-flow/inlines-017.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/normal-flow/inlines-020.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/letter-spacing-007.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/letter-spacing-008.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/letter-spacing-019.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/letter-spacing-020.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/letter-spacing-031.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/letter-spacing-032.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/letter-spacing-043.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/letter-spacing-044.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/letter-spacing-055.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/letter-spacing-056.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/letter-spacing-067.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/letter-spacing-068.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/letter-spacing-079.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/letter-spacing-091.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/letter-spacing-092.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/letter-spacing-101.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/text-indent-115-ref-block-margin.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/text-indent-115-ref-inline-margin.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/text-indent-wrap-001-ref-inline-margin.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/text-indent-wrap-001.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/text-indent-wrap-002.html
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/white-space-collapsing-001.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/white-space-collapsing-002.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/word-spacing-007.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/word-spacing-008.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/word-spacing-019.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/word-spacing-020.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/word-spacing-031.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/word-spacing-032.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/word-spacing-043.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/word-spacing-044.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/word-spacing-055.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/word-spacing-056.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/word-spacing-067.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/word-spacing-068.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/word-spacing-079.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/word-spacing-080.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/word-spacing-091.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/word-spacing-092.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/word-spacing-101.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/text/word-spacing-characters-001.xht
+ FAIL => PASS    [1/1]  +1  css/CSS2/visudet/content-height-005.html
- PASS => FAIL    [0/1]  -1  css/css-backgrounds/background-attachment-fixed-inline-scrolled.html
- PASS => FAIL    [0/1]  -1  css/css-backgrounds/background-clip/clip-border-area-box-decoration-break.html
- PASS => FAIL    [0/1]  -1  css/css-backgrounds/background-image-first-letter.html
- PASS => FAIL    [0/1]  -1  css/css-break/area-002.html
+ FAIL => FAIL  [23/36]  +1  css/css-break/hit-test-inline-fragmentation-with-border-radius.html
+ FAIL => PASS    [1/1]  +1  css/css-grid/firefox-bug-1881495.html
+ FAIL => PASS    [1/1]  +1  css/css-highlight-api/painting/custom-highlight-painting-line-wrap-001.html
+ FAIL => PASS    [2/2]  +2  css/css-inline/baseline-shift/baseline-shift-sub-super.html
- PASS => FAIL    [0/1]  -1  css/css-inline/empty-span-size-002.html
- PASS => FAIL    [0/1]  -1  css/css-masking/clip-path/clip-path-inline-006.html
- PASS => FAIL    [0/1]  -1  css/css-masking/clip-path/clip-path-inline-010.html
- PASS => FAIL    [0/1]  -1  css/css-ruby/ruby-box-model-001.html
- PASS => FAIL    [0/6]  -6  css/css-ruby/ruby-position.html
+ FAIL => PASS    [1/1]  +1  css/css-text-decor/text-decoration-inset-025.html
+ FAIL => PASS    [1/1]  +1  css/css-text/boundary-shaping/boundary-shaping-009.html
- PASS => FAIL    [0/1]  -1  css/css-text/hanging-punctuation/hanging-punctuation-variable-font-size.html
+ FAIL => PASS    [1/1]  +1  css/css-text/letter-spacing/letter-spacing-ligatures-004.html
+ FAIL => PASS    [1/1]  +1  css/css-text/line-break/line-break-anywhere-and-white-space-004.html
- PASS => FAIL    [0/1]  -1  css/css-text/text-align/text-align-last-empty-inline.html
- PASS => FAIL    [0/1]  -1  css/css-text/text-autospace/text-autospace-001.html
- PASS => FAIL    [0/1]  -1  css/css-text/text-autospace/text-autospace-002.html
- PASS => FAIL    [0/1]  -1  css/css-text/text-autospace/text-autospace-003.html
- PASS => FAIL    [0/1]  -1  css/css-text/text-autospace/text-autospace-004.html
- PASS => FAIL    [0/1]  -1  css/css-text/text-autospace/text-autospace-combining-marks.html
- PASS => FAIL    [0/1]  -1  css/css-text/text-autospace/text-autospace-elements-001.html
- PASS => FAIL    [0/1]  -1  css/css-text/text-autospace/text-autospace-elements-003.html
- PASS => FAIL    [0/1]  -1  css/css-text/text-autospace/text-autospace-elements-005.html
- PASS => FAIL    [0/1]  -1  css/css-text/text-autospace/text-autospace-elements-005b.html
- PASS => FAIL    [0/1]  -1  css/css-text/text-autospace/text-autospace-ideogram-alpha-001.html
- PASS => FAIL    [0/1]  -1  css/css-text/text-autospace/text-autospace-ideograph-numeric-001.html
- PASS => FAIL    [0/1]  -1  css/css-text/text-autospace/text-autospace-ligature-001.html
- PASS => FAIL    [0/1]  -1  css/css-text/text-autospace/text-autospace-mixed-001.html
- PASS => FAIL    [0/1]  -1  css/css-text/text-autospace/text-autospace-preformatted-001.html
- PASS => FAIL    [0/1]  -1  css/css-text/text-autospace/text-autospace-supplementary-ideograph.html
- PASS => FAIL    [0/1]  -1  css/css-text/text-autospace/text-autospace-vs-001.html
- PASS => FAIL    [0/1]  -1  css/css-text/text-autospace/text-autospace-zh-001.html
+ FAIL => PASS    [1/1]  +1  css/css-text/text-indent/text-indent-percentage-001.xht
+ FAIL => PASS    [1/1]  +1  css/css-text/white-space/line-edge-white-space-collapse-001.html
+ FAIL => PASS    [1/1]  +1  css/css-text/white-space/line-edge-white-space-collapse-002.html
- PASS => FAIL    [0/1]  -1  css/css-text/word-break/word-break-normal-hi-000.html
+ FAIL => PASS    [1/1]  +1  css/css-text/word-spacing/word-spacing-001.html
+ FAIL => PASS    [1/1]  +1  css/css-text/word-spacing/word-spacing-002.html
+ FAIL => PASS    [1/1]  +1  css/css-transforms/perspective-untransformable-no-stacking-context.html
- PASS => FAIL    [0/1]  -1  css/css-writing-modes/border-slice-001.html
- PASS => FAIL    [0/1]  -1  css/css-writing-modes/inline-box-border-vlr-001.html
- PASS => FAIL    [0/1]  -1  css/css-writing-modes/line-box-height-vlr-003.xht
- PASS => FAIL    [0/1]  -1  css/css-writing-modes/line-box-height-vlr-005.xht
- PASS => FAIL    [0/1]  -1  css/css-writing-modes/line-box-height-vlr-007.xht
- PASS => FAIL    [0/1]  -1  css/css-writing-modes/line-box-height-vlr-009.xht
- PASS => FAIL    [0/1]  -1  css/css-writing-modes/line-box-height-vlr-011.xht
- PASS => FAIL    [0/1]  -1  css/css-writing-modes/line-box-height-vlr-013.xht
- PASS => FAIL    [0/1]  -1  css/css-writing-modes/line-box-height-vlr-021.xht
- PASS => FAIL    [0/1]  -1  css/css-writing-modes/line-box-height-vlr-023.xht
- PASS => FAIL    [0/1]  -1  css/css-writing-modes/line-box-height-vrl-002.xht
- PASS => FAIL    [0/1]  -1  css/css-writing-modes/line-box-height-vrl-004.xht
- PASS => FAIL    [0/1]  -1  css/css-writing-modes/line-box-height-vrl-006.xht
- PASS => FAIL    [0/1]  -1  css/css-writing-modes/line-box-height-vrl-008.xht
- PASS => FAIL    [0/1]  -1  css/css-writing-modes/line-box-height-vrl-010.xht
- PASS => FAIL    [0/1]  -1  css/css-writing-modes/line-box-height-vrl-012.xht
+ FAIL => PASS    [1/1]  +1  css/cssom-view/getBoundingClientRect-empty-inline.html
+ FAIL => PASS    [3/3]  +3  css/cssom-view/getClientRects-inline-atomic-child.html
+ FAIL => PASS    [1/1]  +1  css/cssom-view/offsetTop-offsetLeft-nested-offsetParents.html
+ FAIL => PASS    [6/6]  +6  css/cssom-view/offsetTopLeft-empty-inline-offset.html
+ FAIL => PASS    [3/3]  +3  css/cssom-view/offsetTopLeft-empty-inline.html
+ FAIL => PASS    [3/3]  +3  css/cssom-view/offsetTopLeft-leading-space-inline.html
+ FAIL => FAIL    [1/3]  +1  css/cssom-view/offsetTopLeft-trailing-space-inline.html
- PASS => FAIL    [0/1]  -1  css/filter-effects/backdrop-filter-backdrop-root-clip-path-2.html
+ FAIL => PASS    [1/1]  +1  css/selectors/not-links.html

Generated by the WPT workflow.

@staging-devin-ai-integration

Copy link
Copy Markdown
Contributor

I'll fix CI failures and address comments from users with write access that start with 'Devin'.

  • Disable automatic comment, CI, and merge conflict monitoring

- Update Parley: span edges are placed in visual order and a span split by
  bidi reordering has a fragment per visual piece; preserved hanging
  whitespace stays part of the fragment; empty spans stay on the line of
  the preceding content.
- Resolve calc() with a percentage against zero when there is no basis.
- Don't let the missing side of a wrapped span limit the border radii.
- Empty inline elements in an inline root with no line boxes have no height.
- scrollIntoView uses the fragment bounding box for non-atomic inlines.
- Don't depend on where the font wraps in the wrapped border test.

This branch has not been deployed

No deployments
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