<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[281136] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/281136">281136</a></dd>
<dt>Author</dt> <dd>antti@apple.com</dd>
<dt>Date</dt> <dd>2021-08-17 07:11:22 -0700 (Tue, 17 Aug 2021)</dd>
</dl>

<h3>Log Message</h3>
<pre>Incorrect repaint when inline level box style change triggers line height change
https://bugs.webkit.org/show_bug.cgi?id=229140
<rdar://problem/81980863>

Reviewed by Alan Bujtas.

Source/WebCore:

If an existing block shrinks vertically as a result of layout we fail to invalidate the
old content area for repaint, thus potentially leaving painting artefacts behind.
This is often hidden by the content shift triggering other repaints.

Test: fast/repaint/line-layout-block-shrink.html

* rendering/RenderBlockFlow.cpp:
(WebCore::RenderBlockFlow::layoutModernLines):

Adjust the repaint area to include the content size before the layout.

LayoutTests:

* fast/repaint/line-layout-block-shrink-expected.txt: Added.
* fast/repaint/line-layout-block-shrink.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderBlockFlowcpp">trunk/Source/WebCore/rendering/RenderBlockFlow.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfastrepaintlinelayoutblockshrinkexpectedtxt">trunk/LayoutTests/fast/repaint/line-layout-block-shrink-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfastrepaintlinelayoutblockshrinkhtml">trunk/LayoutTests/fast/repaint/line-layout-block-shrink.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (281135 => 281136)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog      2021-08-17 13:47:41 UTC (rev 281135)
+++ trunk/LayoutTests/ChangeLog 2021-08-17 14:11:22 UTC (rev 281136)
</span><span class="lines">@@ -1,3 +1,14 @@
</span><ins>+2021-08-17  Antti Koivisto  <antti@apple.com>
+
+        Incorrect repaint when inline level box style change triggers line height change
+        https://bugs.webkit.org/show_bug.cgi?id=229140
+        <rdar://problem/81980863>
+
+        Reviewed by Alan Bujtas.
+
+        * fast/repaint/line-layout-block-shrink-expected.txt: Added.
+        * fast/repaint/line-layout-block-shrink.html: Added.
+
</ins><span class="cx"> 2021-08-17  Jean-Yves Avenard  <jya@apple.com>
</span><span class="cx"> 
</span><span class="cx">         Implement API to ensure MediaRemote key mapping is correct
</span></span></pre></div>
<a id="trunkLayoutTestsfastrepaintlinelayoutblockshrinkexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/repaint/line-layout-block-shrink-expected.txt (0 => 281136)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/repaint/line-layout-block-shrink-expected.txt                             (rev 0)
+++ trunk/LayoutTests/fast/repaint/line-layout-block-shrink-expected.txt        2021-08-17 14:11:22 UTC (rev 281136)
</span><span class="lines">@@ -0,0 +1,5 @@
</span><ins>+PASS if you see this text only once.
+(repaint rects
+  (rect 8 8 784 404)
+)
+
</ins></span></pre></div>
<a id="trunkLayoutTestsfastrepaintlinelayoutblockshrinkhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/repaint/line-layout-block-shrink.html (0 => 281136)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/repaint/line-layout-block-shrink.html                             (rev 0)
+++ trunk/LayoutTests/fast/repaint/line-layout-block-shrink.html        2021-08-17 14:11:22 UTC (rev 281136)
</span><span class="lines">@@ -0,0 +1,13 @@
</span><ins>+<script src="resources/text-based-repaint.js"></script>
+<style>
+  img {
+    height: 400px;
+  }
+</style>
+<img id=changeThis>PASS if you see this text only once.
+<script>
+function repaintTest() {
+    changeThis.style.height = "0px";
+}
+onload = runRepaintTest;
+</script>
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (281135 => 281136)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog   2021-08-17 13:47:41 UTC (rev 281135)
+++ trunk/Source/WebCore/ChangeLog      2021-08-17 14:11:22 UTC (rev 281136)
</span><span class="lines">@@ -1,3 +1,22 @@
</span><ins>+2021-08-17  Antti Koivisto  <antti@apple.com>
+
+        Incorrect repaint when inline level box style change triggers line height change
+        https://bugs.webkit.org/show_bug.cgi?id=229140
+        <rdar://problem/81980863>
+
+        Reviewed by Alan Bujtas.
+
+        If an existing block shrinks vertically as a result of layout we fail to invalidate the
+        old content area for repaint, thus potentially leaving painting artefacts behind.
+        This is often hidden by the content shift triggering other repaints.
+
+        Test: fast/repaint/line-layout-block-shrink.html
+
+        * rendering/RenderBlockFlow.cpp:
+        (WebCore::RenderBlockFlow::layoutModernLines):
+
+        Adjust the repaint area to include the content size before the layout.
+
</ins><span class="cx"> 2021-08-17  Philippe Normand  <pnormand@igalia.com>
</span><span class="cx"> 
</span><span class="cx">         REGRESSION(r218083): [GStreamer] webrtc unexpected failures
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderBlockFlowcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderBlockFlow.cpp (281135 => 281136)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderBlockFlow.cpp       2021-08-17 13:47:41 UTC (rev 281135)
+++ trunk/Source/WebCore/rendering/RenderBlockFlow.cpp  2021-08-17 14:11:22 UTC (rev 281136)
</span><span class="lines">@@ -3731,24 +3731,33 @@
</span><span class="cx">         renderer.clearNeedsLayout();
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    auto contentBoxTop = borderAndPaddingBefore();
+
+    auto computeContentHeight = [&] {
+        if (!hasLines() && hasLineIfEmpty())
+            return lineHeight(true, isHorizontalWritingMode() ? HorizontalLine : VerticalLine, PositionOfInteriorLineBoxes);
+
+        return layoutFormattingContextLineLayout.contentLogicalHeight();
+    };
+
+    auto computeBorderBoxBottom = [&] {
+        auto contentBoxBottom = contentBoxTop + computeContentHeight();
+        return contentBoxBottom + borderAndPaddingAfter();
+    };
+
+    auto oldBorderBoxBottom = computeBorderBoxBottom();
+
</ins><span class="cx">     layoutFormattingContextLineLayout.layout();
</span><span class="cx"> 
</span><span class="cx">     if (view().frameView().layoutContext().layoutState()->isPaginated())
</span><span class="cx">         layoutFormattingContextLineLayout.adjustForPagination();
</span><span class="cx"> 
</span><del>-    auto contentHeight = [&] {
-        if (!hasLines() && hasLineIfEmpty())
-            return lineHeight(true, isHorizontalWritingMode() ? HorizontalLine : VerticalLine, PositionOfInteriorLineBoxes);
-        
-        return layoutFormattingContextLineLayout.contentLogicalHeight();
-    }();
-    auto contentBoxTop = borderAndPaddingBefore();
-    auto contentBoxBottom = contentBoxTop + contentHeight;
-    auto borderBoxBottom = contentBoxBottom + borderAndPaddingAfter();
</del><ins>+    auto newBorderBoxBottom = computeBorderBoxBottom();
</ins><span class="cx"> 
</span><span class="cx">     repaintLogicalTop = contentBoxTop;
</span><del>-    repaintLogicalBottom = borderBoxBottom;
-    setLogicalHeight(borderBoxBottom);
</del><ins>+    repaintLogicalBottom = std::max(oldBorderBoxBottom, newBorderBoxBottom);
+
+    setLogicalHeight(newBorderBoxBottom);
</ins><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>