[line-clamp] Refactor line-clamp: auto
The current way line-clamp: auto
works is by checking at every line
and after every (line) box whether the box has reached the clamp
point's BFC offset, and place an ellipsis or hide the box depending on
it. For line boxes, this comparison requires computing the BFC offset
at which the line will finish, before it is computed naturally as part
of the inline layout algorithm. And if no box ends right at the clamp
offset, which is almost every time, the layout has to be redone.
An alternative way of doing this work would be by always doing a
relayout: the first pass computes which line number to clamp at, and
the second pass can behave the same as line-clamp: 3
.
A complication is that with line-clamp: auto
, unlike with
line-clamp: 3
, it is possible to break between two lineless boxes.
To account for this, we store both a number of lines until clamp, as
well as a number of remaining boxes between the last line and the
clamp point. We pack the lines and the remaining boxes into a
LineClampData::UntilClamp
struct.
Since the previous implementation ellipsized lines based on whether
they end at the clamp point, it means that a line could have an
ellipsis even when it was followed by a zero-height block. It also
meant that if a line inside a block with a set height
might not have
an ellipsis even if it was the last line before clamp, because it did
not end at the clamp point. This patch fixes those bugs, and adds (or
in the case of line-clamp-auto-032.tentative.html
, fixes) tests for
them.
In cases where the last line before clamp is followed by an abspos,
however, it seems like it would be unexpected for the line to not have
the ellipsis. This remains to be discussed with the CSS Working Group
(see w3c/csswg-drafts#10868), but since
there are previously written tests that rely on this behavior, we have
chosen to special case abspos so such a line is ellipsized.
Bug: 40336192, 367892771
Change-Id: I45881ce76b7b23de731ae69ef5c947957cc7cf93
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5868971
Reviewed-by: Koji Ishii kojii@chromium.org
Commit-Queue: Andreu Botella abotella@igalia.com
Reviewed-by: Ian Kilpatrick ikilpatrick@chromium.org
Cr-Commit-Position: refs/heads/main@{#1358023}