<!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>[199983] releases/WebKitGTK/webkit-2.12</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/199983">199983</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2016-04-25 03:07:17 -0700 (Mon, 25 Apr 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Merge <a href="http://trac.webkit.org/projects/webkit/changeset/199101">r199101</a> - ASSERTION FAILED: !floatingObject-&gt;originatingLine() in WebCore::RenderBlockFlow::linkToEndLineIfNeeded
https://bugs.webkit.org/show_bug.cgi?id=153001

Reviewed by Dan Bernstein.

1. Float boxes are always attached to the line where we see them first.
2. Float box can only be attached to one line.
3. RenderBlockFlow can perform partial layout on dirty lines only.

In certain cases, the last dirty line can &quot;pull up&quot; float boxes from the first clean line.
It simply means that due to some layout changes on previous lines now we see those floats on this last dirty line first.
If after placing the float we still find it on the same position, the line below is still considered clean.
Source/WebCore:

Remove the float box from its original line if the line above already placed it.

Test: fast/block/float/float-moves-between-lines.html

* rendering/RenderBlockFlow.h:
* rendering/RenderBlockLineLayout.cpp:
(WebCore::RenderBlockFlow::reattachCleanLineFloats):
(WebCore::RenderBlockFlow::linkToEndLineIfNeeded):
(WebCore::RenderBlockFlow::layoutRunsAndFloatsInRange): Deleted.

LayoutTests:

Remove the float box from its original line if the line above already placed it.

* fast/block/float/float-moves-between-lines-expected.txt: Added.
* fast/block/float/float-moves-between-lines.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit212LayoutTestsChangeLog">releases/WebKitGTK/webkit-2.12/LayoutTests/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit212SourceWebCoreChangeLog">releases/WebKitGTK/webkit-2.12/Source/WebCore/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit212SourceWebCorerenderingRenderBlockFlowh">releases/WebKitGTK/webkit-2.12/Source/WebCore/rendering/RenderBlockFlow.h</a></li>
<li><a href="#releasesWebKitGTKwebkit212SourceWebCorerenderingRenderBlockLineLayoutcpp">releases/WebKitGTK/webkit-2.12/Source/WebCore/rendering/RenderBlockLineLayout.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit212LayoutTestsfastblockfloatfloatmovesbetweenlinesexpectedtxt">releases/WebKitGTK/webkit-2.12/LayoutTests/fast/block/float/float-moves-between-lines-expected.txt</a></li>
<li><a href="#releasesWebKitGTKwebkit212LayoutTestsfastblockfloatfloatmovesbetweenlineshtml">releases/WebKitGTK/webkit-2.12/LayoutTests/fast/block/float/float-moves-between-lines.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="releasesWebKitGTKwebkit212LayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.12/LayoutTests/ChangeLog (199982 => 199983)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.12/LayoutTests/ChangeLog        2016-04-25 10:03:51 UTC (rev 199982)
+++ releases/WebKitGTK/webkit-2.12/LayoutTests/ChangeLog        2016-04-25 10:07:17 UTC (rev 199983)
</span><span class="lines">@@ -1,3 +1,23 @@
</span><ins>+2016-04-06  Zalan Bujtas  &lt;zalan@apple.com&gt;
+
+        ASSERTION FAILED: !floatingObject-&gt;originatingLine() in WebCore::RenderBlockFlow::linkToEndLineIfNeeded
+        https://bugs.webkit.org/show_bug.cgi?id=153001
+
+        Reviewed by Dan Bernstein.
+
+        1. Float boxes are always attached to the line where we see them first.
+        2. Float box can only be attached to one line.
+        3. RenderBlockFlow can perform partial layout on dirty lines only.
+
+        In certain cases, the last dirty line can &quot;pull up&quot; float boxes from the first clean line.
+        It simply means that due to some layout changes on previous lines now we see those floats on this last dirty line first.
+        If after placing the float we still find it on the same position, the line below is still considered clean.
+
+        Remove the float box from its original line if the line above already placed it.
+
+        * fast/block/float/float-moves-between-lines-expected.txt: Added.
+        * fast/block/float/float-moves-between-lines.html: Added.
+
</ins><span class="cx"> 2016-04-06  Antti Koivisto  &lt;antti@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         REGRESSION(r196629): Messages text size only changes for sending text, conversation text size does not change
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit212LayoutTestsfastblockfloatfloatmovesbetweenlinesexpectedtxt"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.12/LayoutTests/fast/block/float/float-moves-between-lines-expected.txt (0 => 199983)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.12/LayoutTests/fast/block/float/float-moves-between-lines-expected.txt                                (rev 0)
+++ releases/WebKitGTK/webkit-2.12/LayoutTests/fast/block/float/float-moves-between-lines-expected.txt        2016-04-25 10:07:17 UTC (rev 199983)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+fooPass if no assert in debug.
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit212LayoutTestsfastblockfloatfloatmovesbetweenlineshtml"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.12/LayoutTests/fast/block/float/float-moves-between-lines.html (0 => 199983)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.12/LayoutTests/fast/block/float/float-moves-between-lines.html                                (rev 0)
+++ releases/WebKitGTK/webkit-2.12/LayoutTests/fast/block/float/float-moves-between-lines.html        2016-04-25 10:07:17 UTC (rev 199983)
</span><span class="lines">@@ -0,0 +1,17 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;title&gt;This tests that when a float box gets assigned to a new line, we can properly disconnect it from its original line.&lt;/title&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;div style=&quot;width: 5px;&quot;&gt;&lt;img id=&quot;makeTaller&quot; style=&quot;height: 50px; width: 1px&quot;&gt;&lt;img id=&quot;removeThis&quot; style=&quot;width: 5px; height: 5px;&quot;&gt; &lt;div style=&quot;float: left;&quot;&gt;foo&lt;/div&gt;Pass if no assert in debug.&lt;/div&gt;
+&lt;script&gt;
+if (window.testRunner)
+    testRunner.dumpAsText();
+var removeThis = document.getElementById(&quot;removeThis&quot;);
+removeThis.offsetTop;
+removeThis.parentNode.removeChild(removeThis); 
+var makeTaller = document.getElementById(&quot;makeTaller&quot;);
+makeTaller.style.height = '55px';
+&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit212SourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.12/Source/WebCore/ChangeLog (199982 => 199983)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.12/Source/WebCore/ChangeLog        2016-04-25 10:03:51 UTC (rev 199982)
+++ releases/WebKitGTK/webkit-2.12/Source/WebCore/ChangeLog        2016-04-25 10:07:17 UTC (rev 199983)
</span><span class="lines">@@ -1,3 +1,28 @@
</span><ins>+2016-04-06  Zalan Bujtas  &lt;zalan@apple.com&gt;
+
+        ASSERTION FAILED: !floatingObject-&gt;originatingLine() in WebCore::RenderBlockFlow::linkToEndLineIfNeeded
+        https://bugs.webkit.org/show_bug.cgi?id=153001
+
+        Reviewed by Dan Bernstein.
+
+        1. Float boxes are always attached to the line where we see them first.
+        2. Float box can only be attached to one line.
+        3. RenderBlockFlow can perform partial layout on dirty lines only.
+
+        In certain cases, the last dirty line can &quot;pull up&quot; float boxes from the first clean line.
+        It simply means that due to some layout changes on previous lines now we see those floats on this last dirty line first.
+        If after placing the float we still find it on the same position, the line below is still considered clean.

+        Remove the float box from its original line if the line above already placed it.
+
+        Test: fast/block/float/float-moves-between-lines.html
+
+        * rendering/RenderBlockFlow.h:
+        * rendering/RenderBlockLineLayout.cpp:
+        (WebCore::RenderBlockFlow::reattachCleanLineFloats):
+        (WebCore::RenderBlockFlow::linkToEndLineIfNeeded):
+        (WebCore::RenderBlockFlow::layoutRunsAndFloatsInRange): Deleted.
+
</ins><span class="cx"> 2016-04-06  Antti Koivisto  &lt;antti@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         REGRESSION(r196629): Messages text size only changes for sending text, conversation text size does not change
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit212SourceWebCorerenderingRenderBlockFlowh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.12/Source/WebCore/rendering/RenderBlockFlow.h (199982 => 199983)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.12/Source/WebCore/rendering/RenderBlockFlow.h        2016-04-25 10:03:51 UTC (rev 199982)
+++ releases/WebKitGTK/webkit-2.12/Source/WebCore/rendering/RenderBlockFlow.h        2016-04-25 10:07:17 UTC (rev 199983)
</span><span class="lines">@@ -571,6 +571,7 @@
</span><span class="cx">     void layoutRunsAndFloats(LineLayoutState&amp;, bool hasInlineChild);
</span><span class="cx">     const InlineIterator&amp; restartLayoutRunsAndFloatsInRange(LayoutUnit oldLogicalHeight, LayoutUnit newLogicalHeight,  FloatingObject* lastFloatFromPreviousLine, InlineBidiResolver&amp;,  const InlineIterator&amp;);
</span><span class="cx">     void layoutRunsAndFloatsInRange(LineLayoutState&amp;, InlineBidiResolver&amp;, const InlineIterator&amp; cleanLineStart, const BidiStatus&amp; cleanLineBidiStatus, unsigned consecutiveHyphenatedLines);
</span><ins>+    void reattachCleanLineFloats(RootInlineBox&amp; cleanLine, LayoutUnit delta, bool isFirstCleanLine);
</ins><span class="cx">     void linkToEndLineIfNeeded(LineLayoutState&amp;);
</span><span class="cx">     static void repaintDirtyFloats(Vector&lt;FloatWithRect&gt;&amp; floats);
</span><span class="cx">     void checkFloatsInCleanLine(RootInlineBox*, Vector&lt;FloatWithRect&gt;&amp;, size_t&amp; floatIndex, bool&amp; encounteredNewFloat, bool&amp; dirtiedByFloat);
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit212SourceWebCorerenderingRenderBlockLineLayoutcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.12/Source/WebCore/rendering/RenderBlockLineLayout.cpp (199982 => 199983)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.12/Source/WebCore/rendering/RenderBlockLineLayout.cpp        2016-04-25 10:03:51 UTC (rev 199982)
+++ releases/WebKitGTK/webkit-2.12/Source/WebCore/rendering/RenderBlockLineLayout.cpp        2016-04-25 10:07:17 UTC (rev 199983)
</span><span class="lines">@@ -1464,18 +1464,39 @@
</span><span class="cx">             markLinesDirtyInBlockRange(lastRootBox()-&gt;lineBottomWithLeading(), lineBox-&gt;lineBottomWithLeading(), lineBox);
</span><span class="cx">         }
</span><span class="cx">     }
</span><del>-
</del><span class="cx">     clearDidBreakAtLineToAvoidWidow();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void RenderBlockFlow::reattachCleanLineFloats(RootInlineBox&amp; cleanLine, LayoutUnit delta, bool isFirstCleanLine)
+{
+    auto* cleanLineFloats = cleanLine.floatsPtr();
+    if (!cleanLineFloats)
+        return;
+
+    for (auto* floatingBox : *cleanLineFloats) {
+        auto* floatingObject = insertFloatingObject(*floatingBox);
+        if (isFirstCleanLine &amp;&amp; floatingObject-&gt;originatingLine()) {
+            // Float box does not belong to this line anymore.
+            ASSERT(cleanLine.prevRootBox() == floatingObject-&gt;originatingLine());
+            cleanLine.removeFloat(*floatingBox);
+            continue;
+        }
+        ASSERT(!floatingObject-&gt;originatingLine());
+        floatingObject-&gt;setOriginatingLine(&amp;cleanLine);
+        setLogicalHeight(logicalTopForChild(*floatingBox) - marginBeforeForChild(*floatingBox) + delta);
+        positionNewFloats();
+    }
+}
+
</ins><span class="cx"> void RenderBlockFlow::linkToEndLineIfNeeded(LineLayoutState&amp; layoutState)
</span><span class="cx"> {
</span><del>-    if (layoutState.endLine()) {
</del><ins>+    auto* firstCleanLine = layoutState.endLine();
+    if (firstCleanLine) {
</ins><span class="cx">         if (layoutState.endLineMatched()) {
</span><span class="cx">             bool paginated = view().layoutState() &amp;&amp; view().layoutState()-&gt;isPaginated();
</span><span class="cx">             // Attach all the remaining lines, and then adjust their y-positions as needed.
</span><span class="cx">             LayoutUnit delta = logicalHeight() - layoutState.endLineLogicalTop();
</span><del>-            for (RootInlineBox* line = layoutState.endLine(); line; line = line-&gt;nextRootBox()) {
</del><ins>+            for (auto* line = firstCleanLine; line; line = line-&gt;nextRootBox()) {
</ins><span class="cx">                 line-&gt;attachLine();
</span><span class="cx">                 if (paginated) {
</span><span class="cx">                     delta -= line-&gt;paginationStrut();
</span><span class="lines">@@ -1488,16 +1509,7 @@
</span><span class="cx">                 }
</span><span class="cx">                 if (layoutState.flowThread())
</span><span class="cx">                     updateRegionForLine(line);
</span><del>-                if (Vector&lt;RenderBox*&gt;* cleanLineFloats = line-&gt;floatsPtr()) {
-                    for (auto it = cleanLineFloats-&gt;begin(), end = cleanLineFloats-&gt;end(); it != end; ++it) {
-                        RenderBox* floatingBox = *it;
-                        FloatingObject* floatingObject = insertFloatingObject(*floatingBox);
-                        ASSERT(!floatingObject-&gt;originatingLine());
-                        floatingObject-&gt;setOriginatingLine(line);
-                        setLogicalHeight(logicalTopForChild(*floatingBox) - marginBeforeForChild(*floatingBox) + delta);
-                        positionNewFloats();
-                    }
-                }
</del><ins>+                reattachCleanLineFloats(*line, delta, line == firstCleanLine);
</ins><span class="cx">             }
</span><span class="cx">             setLogicalHeight(lastRootBox()-&gt;lineBottomWithLeading());
</span><span class="cx">         } else {
</span></span></pre>
</div>
</div>

</body>
</html>