<!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>[189785] releases/WebKitGTK/webkit-2.10</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/189785">189785</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2015-09-15 00:28:57 -0700 (Tue, 15 Sep 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Merge <a href="http://trac.webkit.org/projects/webkit/changeset/189540">r189540</a> - REGRESSION: Inline-block baseline is wrong when zero-width replaced child is present
https://bugs.webkit.org/show_bug.cgi?id=147452
rdar://problem/21943074

Reviewed by Myles Maxfield.

Source/WebCore:

Added new test in fast/inline-block

Treat zero width replaced elements the same as replaced elements with width. Instead of
clearing floats based off having no committed width, we instead track both committed
width and committed replaced objects. We do this with two new booleans in LineWidth
so that we know when we have uncomitted and committed replaced objects.

* rendering/line/BreakingContext.h:
(WebCore::BreakingContext::handleReplaced):
(WebCore::BreakingContext::handleText):
(WebCore::BreakingContext::canBreakAtThisPosition):
(WebCore::BreakingContext::commitAndUpdateLineBreakIfNeeded):
* rendering/line/LineWidth.cpp:
(WebCore::LineWidth::LineWidth):
(WebCore::LineWidth::commit):
(WebCore::LineWidth::applyOverhang):
* rendering/line/LineWidth.h:
(WebCore::LineWidth::committedWidth):
(WebCore::LineWidth::availableWidth):
(WebCore::LineWidth::logicalLeftOffset):
(WebCore::LineWidth::hasCommitted):
(WebCore::LineWidth::addUncommittedWidth):
(WebCore::LineWidth::addUncommittedReplacedWidth):

LayoutTests:

* fast/inline-block/baseline-with-zero-width-replaced-child-expected.html: Added.
* fast/inline-block/baseline-with-zero-width-replaced-child.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit210LayoutTestsChangeLog">releases/WebKitGTK/webkit-2.10/LayoutTests/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit210SourceWebCoreChangeLog">releases/WebKitGTK/webkit-2.10/Source/WebCore/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit210SourceWebCorerenderinglineBreakingContexth">releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/line/BreakingContext.h</a></li>
<li><a href="#releasesWebKitGTKwebkit210SourceWebCorerenderinglineLineWidthcpp">releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/line/LineWidth.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit210SourceWebCorerenderinglineLineWidthh">releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/line/LineWidth.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit210LayoutTestsfastinlineblockbaselinewithzerowidthreplacedchildexpectedhtml">releases/WebKitGTK/webkit-2.10/LayoutTests/fast/inline-block/baseline-with-zero-width-replaced-child-expected.html</a></li>
<li><a href="#releasesWebKitGTKwebkit210LayoutTestsfastinlineblockbaselinewithzerowidthreplacedchildhtml">releases/WebKitGTK/webkit-2.10/LayoutTests/fast/inline-block/baseline-with-zero-width-replaced-child.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="releasesWebKitGTKwebkit210LayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.10/LayoutTests/ChangeLog (189784 => 189785)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/LayoutTests/ChangeLog        2015-09-15 07:25:44 UTC (rev 189784)
+++ releases/WebKitGTK/webkit-2.10/LayoutTests/ChangeLog        2015-09-15 07:28:57 UTC (rev 189785)
</span><span class="lines">@@ -1,3 +1,14 @@
</span><ins>+2015-09-09  David Hyatt  &lt;hyatt@apple.com&gt;
+
+        REGRESSION: Inline-block baseline is wrong when zero-width replaced child is present
+        https://bugs.webkit.org/show_bug.cgi?id=147452
+        rdar://problem/21943074
+
+        Reviewed by Myles Maxfield.
+
+        * fast/inline-block/baseline-with-zero-width-replaced-child-expected.html: Added.
+        * fast/inline-block/baseline-with-zero-width-replaced-child.html: Added.
+
</ins><span class="cx"> 2015-09-08  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         document.importNode(node, deep): deep's default value should be false
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit210LayoutTestsfastinlineblockbaselinewithzerowidthreplacedchildexpectedhtml"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.10/LayoutTests/fast/inline-block/baseline-with-zero-width-replaced-child-expected.html (0 => 189785)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/LayoutTests/fast/inline-block/baseline-with-zero-width-replaced-child-expected.html                                (rev 0)
+++ releases/WebKitGTK/webkit-2.10/LayoutTests/fast/inline-block/baseline-with-zero-width-replaced-child-expected.html        2015-09-15 07:28:57 UTC (rev 189785)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;/head&gt;
+&lt;body&gt;
+The green block should align nicely with the text.
+&lt;div style=&quot;display: inline-block; height: 20px; background-color: green;&quot;&gt;&lt;div style=&quot;width: 45px; display:inline-block;height:3px;&quot;&gt;&lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit210LayoutTestsfastinlineblockbaselinewithzerowidthreplacedchildhtml"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.10/LayoutTests/fast/inline-block/baseline-with-zero-width-replaced-child.html (0 => 189785)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/LayoutTests/fast/inline-block/baseline-with-zero-width-replaced-child.html                                (rev 0)
+++ releases/WebKitGTK/webkit-2.10/LayoutTests/fast/inline-block/baseline-with-zero-width-replaced-child.html        2015-09-15 07:28:57 UTC (rev 189785)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;/head&gt;
+&lt;body&gt;
+The green block should align nicely with the text.
+&lt;div style=&quot;display: inline-block; height: 20px; background-color: green;&quot;&gt;&lt;div style=&quot;display: inline-block; background-color: red;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;height: 20px; width: 45px; float: right;&quot;&gt;&lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit210SourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.10/Source/WebCore/ChangeLog (189784 => 189785)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/Source/WebCore/ChangeLog        2015-09-15 07:25:44 UTC (rev 189784)
+++ releases/WebKitGTK/webkit-2.10/Source/WebCore/ChangeLog        2015-09-15 07:28:57 UTC (rev 189785)
</span><span class="lines">@@ -1,3 +1,35 @@
</span><ins>+2015-09-08  David Hyatt  &lt;hyatt@apple.com&gt;
+
+        REGRESSION: Inline-block baseline is wrong when zero-width replaced child is present
+        https://bugs.webkit.org/show_bug.cgi?id=147452
+        rdar://problem/21943074
+
+        Reviewed by Myles Maxfield.
+
+        Added new test in fast/inline-block
+
+        Treat zero width replaced elements the same as replaced elements with width. Instead of
+        clearing floats based off having no committed width, we instead track both committed
+        width and committed replaced objects. We do this with two new booleans in LineWidth
+        so that we know when we have uncomitted and committed replaced objects.
+
+        * rendering/line/BreakingContext.h:
+        (WebCore::BreakingContext::handleReplaced):
+        (WebCore::BreakingContext::handleText):
+        (WebCore::BreakingContext::canBreakAtThisPosition):
+        (WebCore::BreakingContext::commitAndUpdateLineBreakIfNeeded):
+        * rendering/line/LineWidth.cpp:
+        (WebCore::LineWidth::LineWidth):
+        (WebCore::LineWidth::commit):
+        (WebCore::LineWidth::applyOverhang):
+        * rendering/line/LineWidth.h:
+        (WebCore::LineWidth::committedWidth):
+        (WebCore::LineWidth::availableWidth):
+        (WebCore::LineWidth::logicalLeftOffset):
+        (WebCore::LineWidth::hasCommitted):
+        (WebCore::LineWidth::addUncommittedWidth):
+        (WebCore::LineWidth::addUncommittedReplacedWidth):
+
</ins><span class="cx"> 2015-09-08  Michael Catanzaro  &lt;mcatanzaro@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Crash when WebCore::SQLiteFileSystem::openDatabase is called from multiple threads
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit210SourceWebCorerenderinglineBreakingContexth"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/line/BreakingContext.h (189784 => 189785)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/line/BreakingContext.h        2015-09-15 07:25:44 UTC (rev 189784)
+++ releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/line/BreakingContext.h        2015-09-15 07:28:57 UTC (rev 189785)
</span><span class="lines">@@ -552,9 +552,9 @@
</span><span class="cx">             m_ignoringSpaces = true;
</span><span class="cx">         }
</span><span class="cx">         if (downcast&lt;RenderListMarker&gt;(*m_current.renderer()).isInside())
</span><del>-            m_width.addUncommittedWidth(replacedLogicalWidth);
</del><ins>+            m_width.addUncommittedReplacedWidth(replacedLogicalWidth);
</ins><span class="cx">     } else
</span><del>-        m_width.addUncommittedWidth(replacedLogicalWidth);
</del><ins>+        m_width.addUncommittedReplacedWidth(replacedLogicalWidth);
</ins><span class="cx">     if (is&lt;RenderRubyRun&gt;(*m_current.renderer())) {
</span><span class="cx">         m_width.applyOverhang(downcast&lt;RenderRubyRun&gt;(m_current.renderer()), m_lastObject, m_nextObject);
</span><span class="cx">         downcast&lt;RenderRubyRun&gt;(m_current.renderer())-&gt;updatePriorContextFromCachedBreakIterator(m_renderTextInfo.lineBreakIterator);
</span><span class="lines">@@ -741,7 +741,7 @@
</span><span class="cx">     bool breakNBSP = m_autoWrap &amp;&amp; m_currentStyle-&gt;nbspMode() == SPACE;
</span><span class="cx">     // Auto-wrapping text should wrap in the middle of a word only if it could not wrap before the word,
</span><span class="cx">     // which is only possible if the word is the first thing on the line, that is, if |w| is zero.
</span><del>-    bool breakWords = m_currentStyle-&gt;breakWords() &amp;&amp; ((m_autoWrap &amp;&amp; !m_width.committedWidth()) || m_currWS == PRE);
</del><ins>+    bool breakWords = m_currentStyle-&gt;breakWords() &amp;&amp; ((m_autoWrap &amp;&amp; !m_width.hasCommitted()) || m_currWS == PRE);
</ins><span class="cx">     bool midWordBreak = false;
</span><span class="cx">     bool breakAll = m_currentStyle-&gt;wordBreak() == BreakAllWordBreak &amp;&amp; m_autoWrap;
</span><span class="cx">     bool keepAllWords = m_currentStyle-&gt;wordBreak() == KeepAllWordBreak;
</span><span class="lines">@@ -858,7 +858,7 @@
</span><span class="cx"> 
</span><span class="cx">             applyWordSpacing = wordSpacing &amp;&amp; m_currentCharacterIsSpace;
</span><span class="cx"> 
</span><del>-            if (!m_width.committedWidth() &amp;&amp; m_autoWrap &amp;&amp; !m_width.fitsOnLine())
</del><ins>+            if (!m_width.hasCommitted() &amp;&amp; m_autoWrap &amp;&amp; !m_width.fitsOnLine())
</ins><span class="cx">                 m_width.fitBelowFloats(m_lineInfo.isFirstLine());
</span><span class="cx"> 
</span><span class="cx">             if (m_autoWrap || breakWords) {
</span><span class="lines">@@ -1086,7 +1086,7 @@
</span><span class="cx">     bool canBreakHere = !m_currentCharacterIsSpace &amp;&amp; textBeginsWithBreakablePosition(nextRenderText);
</span><span class="cx"> 
</span><span class="cx">     // See if attempting to fit below floats creates more available width on the line.
</span><del>-    if (!m_width.fitsOnLine() &amp;&amp; !m_width.committedWidth())
</del><ins>+    if (!m_width.fitsOnLine() &amp;&amp; !m_width.hasCommitted())
</ins><span class="cx">         m_width.fitBelowFloats(m_lineInfo.isFirstLine());
</span><span class="cx"> 
</span><span class="cx">     bool canPlaceOnLine = m_width.fitsOnLine() || !m_autoWrapWasEverTrueOnLine;
</span><span class="lines">@@ -1120,7 +1120,7 @@
</span><span class="cx">             m_atEnd = true;
</span><span class="cx">             return;
</span><span class="cx">         }
</span><del>-    } else if (m_blockStyle.autoWrap() &amp;&amp; !m_width.fitsOnLine() &amp;&amp; !m_width.committedWidth()) {
</del><ins>+    } else if (m_blockStyle.autoWrap() &amp;&amp; !m_width.fitsOnLine() &amp;&amp; !m_width.hasCommitted()) {
</ins><span class="cx">         // If the container autowraps but the current child does not then we still need to ensure that it
</span><span class="cx">         // wraps and moves below any floats.
</span><span class="cx">         m_width.fitBelowFloats(m_lineInfo.isFirstLine());
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit210SourceWebCorerenderinglineLineWidthcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/line/LineWidth.cpp (189784 => 189785)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/line/LineWidth.cpp        2015-09-15 07:25:44 UTC (rev 189784)
+++ releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/line/LineWidth.cpp        2015-09-15 07:28:57 UTC (rev 189785)
</span><span class="lines">@@ -125,6 +125,10 @@
</span><span class="cx"> {
</span><span class="cx">     m_committedWidth += m_uncommittedWidth;
</span><span class="cx">     m_uncommittedWidth = 0;
</span><ins>+    if (m_hasUncommittedReplaced) {
+        m_hasCommittedReplaced = true;
+        m_hasUncommittedReplaced = false;
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void LineWidth::applyOverhang(RenderRubyRun* rubyRun, RenderObject* startRenderer, RenderObject* endRenderer)
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit210SourceWebCorerenderinglineLineWidthh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/line/LineWidth.h (189784 => 189785)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/line/LineWidth.h        2015-09-15 07:25:44 UTC (rev 189784)
+++ releases/WebKitGTK/webkit-2.10/Source/WebCore/rendering/line/LineWidth.h        2015-09-15 07:28:57 UTC (rev 189785)
</span><span class="lines">@@ -58,10 +58,20 @@
</span><span class="cx">     float committedWidth() const { return m_committedWidth; }
</span><span class="cx">     float availableWidth() const { return m_availableWidth; }
</span><span class="cx">     float logicalLeftOffset() const { return m_left; }
</span><ins>+    
+    bool hasCommitted() const { return m_committedWidth &gt; 0 || m_hasCommittedReplaced; }
</ins><span class="cx"> 
</span><span class="cx">     void updateAvailableWidth(LayoutUnit minimumHeight = 0);
</span><span class="cx">     void shrinkAvailableWidthForNewFloatIfNeeded(FloatingObject*);
</span><del>-    void addUncommittedWidth(float delta) { m_uncommittedWidth += delta; }
</del><ins>+    void addUncommittedWidth(float delta)
+    {
+        m_uncommittedWidth += delta;
+    }
+    void addUncommittedReplacedWidth(float delta)
+    {
+        addUncommittedWidth(delta);
+        m_hasUncommittedReplaced = true;
+    }
</ins><span class="cx">     void commit();
</span><span class="cx">     void applyOverhang(RenderRubyRun*, RenderObject* startRenderer, RenderObject* endRenderer);
</span><span class="cx">     void fitBelowFloats(bool isFirstLine = false);
</span><span class="lines">@@ -86,6 +96,8 @@
</span><span class="cx">     float m_right;
</span><span class="cx">     float m_availableWidth;
</span><span class="cx">     bool m_isFirstLine;
</span><ins>+    bool m_hasUncommittedReplaced { false };
+    bool m_hasCommittedReplaced { false };
</ins><span class="cx">     IndentTextOrNot m_shouldIndentText;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>