Skip to content

Implement legacy -webkit-line-clamp (without ellipsis) - #756

Open
nicoburns wants to merge 1 commit into
mainfrom
devin/1787150566-webkit-line-clamp
Open

Implement legacy -webkit-line-clamp (without ellipsis)#756
nicoburns wants to merge 1 commit into
mainfrom
devin/1787150566-webkit-line-clamp

Conversation

@nicoburns

@nicoburns nicoburns commented Aug 19, 2026

Copy link
Copy Markdown
Member

Summary

Implements the legacy -webkit-line-clamp recipe (display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: N) in Blitz. Ellipsis rendering is intentionally out of scope — content is clamped cleanly at the Nth line boundary (equivalent to max-lines: N; block-ellipsis: none).

Depends on DioxusLabs/stylo#13, which enables -webkit-line-clamp, -moz-box-orient/-webkit-box-orient, display: -webkit-box/-webkit-inline-box, and Stylo's adjust_for_webkit_line_clamp style adjustment for Servo builds. Cargo.toml pins the stylo crates to that fork commit via git/rev; this should move back to a crates.io version once released.

How it works

Stylo's style adjuster (matching Blink) detects the full legacy recipe at computed-value time and adjusts display to flow-root (or inline-block for -webkit-inline-box), leaving original_display as the -webkit-box value. So no -webkit-box flex layout is needed — the element lays out as a normal block, and Blitz only adds the N-line height clamp in layout/inline.rs:

// applies iff original_display.inside() == WebkitBox && display.inside() != WebkitBox
// (i.e. the stylo adjustment fired: full recipe present)
if line_count > N {
    height = height.min(layout.get(N - 1).metrics().block_max_coord);
}

Lines past the Nth don't contribute to content height; with overflow: hidden they're clipped, with overflow: visible they still paint (matching Blink's legacy quirk). The gating on original_display makes -webkit-line-clamp a no-op on elements that aren't legacy webkit boxes (per WPT webkit-line-clamp-001/002).

table.rs/traversal.rs gain DisplayInside::WebkitBox match arms (treated as flow) since the enum variant now exists in Servo builds — this covers the unadjusted case where -webkit-box-orient isn't vertical.

Verification

  • cargo fmt / clippy --workspace / check --workspace / test --workspace pass.
  • New fixture examples/assets/line_clamp.html rendered via cargo run --example screenshot: clamp-2 + overflow: hidden shows exactly 2 lines; clamp-3 + overflow: visible has 3-line height with later lines painting past the background (Blink quirk).

line-clamp screenshot

  • WPT css/css-overflow/line-clamp: 35 passing (up from 31 on main), including webkit-line-clamp-001 through 004, 015, 023, 029, 033, 034, 038, 039. Remaining failures are references containing an ellipsis (out of scope), script-driven tests, or line counting in block descendants (not part of this scope).

Link to Devin session: https://dioxus.staging.devinenterprise.com/sessions/4a6c323b22734b559aa869fdf89fb375
Requested by: @nicoburns

WPT results

4 newly passing, 5 newly failing (net -1).

Full diff (9 changed tests)
+ Fail => Pass css/css-flexbox/balance/webkit-box-no-balance.html
- Pass => Fail css/css-overflow/line-clamp/line-clamp-018.html
+ Fail => Pass css/css-overflow/line-clamp/line-clamp-029.html
- Pass => Fail css/css-overflow/line-clamp/webkit-line-clamp-018.html
- Pass => Fail css/css-overflow/line-clamp/webkit-line-clamp-019.html
+ Fail => Pass css/css-overflow/line-clamp/webkit-line-clamp-023.html
- Pass => Fail css/css-overflow/line-clamp/webkit-line-clamp-026.html
- Pass => Fail css/css-overflow/line-clamp/webkit-line-clamp-048.html
+ Fail => Pass css/css-overflow/line-clamp/webkit-line-clamp-with-line-height.html

Generated by the WPT workflow.

@staging-devin-ai-integration

Copy link
Copy Markdown
Contributor

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR that start with 'DevinAI' or '@devin'.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment, CI, and merge conflict monitoring

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