[line-clamp] Hide atomic inlines and images after clamp
With line-clamp, all content after the clamp point in the layout tree
should be hidden for paint; however, atomic inlines and inline images
weren't. This patch fixes this.
Bug: 40336192
Change-Id: I2dde3b5d4959f4019c12507b14776221f98d1c09
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6010756
Reviewed-by: Koji Ishii <kojii@chromium.org>
Commit-Queue: Andreu Botella <abotella@igalia.com>
Cr-Commit-Position: refs/heads/main@{#1381632}
diff --git a/third_party/blink/renderer/core/layout/block_node.cc b/third_party/blink/renderer/core/layout/block_node.cc
index dc16708..c5d2e0b5 100644
--- a/third_party/blink/renderer/core/layout/block_node.cc
+++ b/third_party/blink/renderer/core/layout/block_node.cc
@@ -1692,6 +1692,7 @@
builder.SetIsPaintedAtomically(true);
builder.SetUseFirstLineStyle(use_first_line_style);
+ builder.SetIsHiddenForPaint(parent_constraint_space.IsHiddenForPaint());
builder.SetBaselineAlgorithmType(baseline_algorithm_type);
diff --git a/third_party/blink/renderer/core/paint/box_fragment_painter.cc b/third_party/blink/renderer/core/paint/box_fragment_painter.cc
index de66182..32b4a2f4 100644
--- a/third_party/blink/renderer/core/paint/box_fragment_painter.cc
+++ b/third_party/blink/renderer/core/paint/box_fragment_painter.cc
@@ -376,8 +376,10 @@
return;
}
- if (!fragment.IsFirstForNode() && !CanPaintMultipleFragments(fragment))
+ if (fragment.IsHiddenForPaint() ||
+ (!fragment.IsFirstForNode() && !CanPaintMultipleFragments(fragment))) {
return;
+ }
// We are about to enter legacy paint code. This means that the node is
// monolithic. However, that doesn't necessarily mean that it only has one
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index faba842..7e4f7fc 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -7963,6 +7963,8 @@
crbug.com/40336192 virtual/disable-css-line-clamp/external/wpt/css/css-overflow/line-clamp/line-clamp-028.tentative.html [ Failure ]
crbug.com/40336192 virtual/disable-css-line-clamp/external/wpt/css/css-overflow/line-clamp/line-clamp-030.tentative.html [ Failure ]
crbug.com/40336192 virtual/disable-css-line-clamp/external/wpt/css/css-overflow/line-clamp/line-clamp-031.tentative.html [ Failure ]
+crbug.com/40336192 virtual/disable-css-line-clamp/external/wpt/css/css-overflow/line-clamp/line-clamp-032.tentative.html [ Failure ]
+crbug.com/40336192 virtual/disable-css-line-clamp/external/wpt/css/css-overflow/line-clamp/line-clamp-033.tentative.html [ Failure ]
crbug.com/40336192 virtual/disable-css-line-clamp/external/wpt/css/css-overflow/line-clamp/line-clamp-auto-001.tentative.html [ Failure ]
crbug.com/40336192 virtual/disable-css-line-clamp/external/wpt/css/css-overflow/line-clamp/line-clamp-auto-002.tentative.html [ Failure ]
crbug.com/40336192 virtual/disable-css-line-clamp/external/wpt/css/css-overflow/line-clamp/line-clamp-auto-003.tentative.html [ Failure ]
diff --git a/third_party/blink/web_tests/external/wpt/css/css-overflow/line-clamp/line-clamp-032.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-overflow/line-clamp/line-clamp-032.tentative.html
new file mode 100644
index 0000000..5c203dd0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-overflow/line-clamp/line-clamp-032.tentative.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Overflow: Atomic inlines after line-clamp</title>
+<link rel="author" title="Andreu Botella" href="mailto:abotella@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-overflow-4/#line-clamp">
+<link rel="match" href="/css/reference/ref-filled-green-100px-square.xht">
+<meta name="assert" content="Atomic inlines after the clamp point should be hidden">
+<style>
+.clamp {
+ line-clamp: 4;
+ width: 150px;
+ line-height: 25px;
+ /* The ellipsis would be outside of the 100x100 green square,
+ * and it shouldn't show up. */
+ color: transparent;
+}
+.green {
+ background-color: green;
+}
+.red {
+ background-color: red;
+}
+.inline-block {
+ display: inline-block;
+ height: 25px;
+ width: 100px;
+}
+.inline-flex {
+ display: inline-flex;
+}
+.inline-grid {
+ display: inline-grid;
+ grid-template-columns: auto auto;
+}
+.inline-table {
+ display: inline-table;
+}
+.inline-table span {
+ display: table-cell;
+}
+:is(.inline-flex, .inline-grid, .inline-table) span {
+ height: 25px;
+ width: 50px;
+}
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class="clamp">
+ <span class="green inline-block">foo</span>
+ <span class="green inline-flex">
+ <span>bar</span>
+ <span>baz</span>
+ </span>
+ <span class="green inline-grid">
+ <span>bar</span>
+ <span>baz</span>
+ </span>
+ <span class="green inline-table">
+ <span>bar</span>
+ <span>baz</span>
+ </span>
+ <!-- Clamp point here -->
+ <span class="red inline-block">foo</span>
+ <span class="red inline-flex">
+ <span>bar</span>
+ <span>baz</span>
+ </span>
+ <span class="red inline-grid">
+ <span>bar</span>
+ <span>baz</span>
+ </span>
+ <span class="red inline-table">
+ <span>bar</span>
+ <span>baz</span>
+ </span>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-overflow/line-clamp/line-clamp-033.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-overflow/line-clamp/line-clamp-033.tentative.html
new file mode 100644
index 0000000..5e893512d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-overflow/line-clamp/line-clamp-033.tentative.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Overflow: Images after line-clamp</title>
+<link rel="author" title="Andreu Botella" href="mailto:abotella@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-overflow-4/#line-clamp">
+<link rel="match" href="/css/reference/ref-filled-green-100px-square.xht">
+<meta name="assert" content="Images after the clamp point should be hidden">
+<style>
+.clamp {
+ /* Image blocks don't contain lines, and the range between the end of the
+ * first <img class="block"> and the start of the second is an empty line,
+ * which doesn't count as far as line-clamp is concerned. Therefore, the text
+ * "Hidden clamp line" is on the third line. */
+ line-clamp: 3;
+ width: 150px;
+ line-height: 0;
+ color: transparent;
+}
+img {
+ height: 25px;
+ width: 100px;
+}
+.atomic {
+ display: inline-block;
+}
+.block {
+ display: block;
+}
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class="clamp">
+ <img src="/css/support/swatch-green.png">
+ <img class="atomic" src="/css/support/swatch-green.png">
+ <img class="block" src="/css/support/swatch-green.png">
+ <span><img class="block" src="/css/support/swatch-green.png"></span>
+ Hidden clamp line
+ <!-- Clamp point here -->
+ <img src="/css/support/swatch-red.png">
+ <img class="atomic" src="/css/support/swatch-red.png">
+ <img class="block" src="/css/support/swatch-red.png">
+ <span><img class="block" src="/css/support/swatch-red.png"></span>
+</div>