<!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>[180744] releases/WebKitGTK/webkit-2.8</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/180744">180744</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2015-02-27 06:25:27 -0800 (Fri, 27 Feb 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Merge <a href="http://trac.webkit.org/projects/webkit/changeset/180278">r180278</a> - Justified ruby can cause lines to grow beyond their container
https://bugs.webkit.org/show_bug.cgi?id=141732

Reviewed by David Hyatt.

Source/WebCore:

After we re-layout RenderRubyRuns, this can change the environment upon which
ruby's overhang calculation is sensitive to. Before this patch, we would recalculate
the overhang after the RenderRubyRun gets relaid out. However, doing such causes the
effective width of the RenderRubyRun to change, which causes out subsequent
justification calculations to be off.

Therefore, we have a cycle; the amount of ruby overhang can change the justification
in a line, and the layout of the line affects the ruby overhang calculation. Instead
of performing a layout in a loop until it converges, this patch simply observes that
having a flush right edge is more valuable than having a perfectly correct overhang.
It therefore simply removes the secondary overhang calculation.

Test: fast/text/ruby-justification-flush.html

* rendering/RenderBlockFlow.h:
* rendering/RenderBlockLineLayout.cpp:
(WebCore::RenderBlockFlow::updateRubyForJustifiedText):
(WebCore::RenderBlockFlow::computeExpansionForJustifiedText):
(WebCore::RenderBlockFlow::computeInlineDirectionPositionsForSegment):

LayoutTests:

Make sure that the right edge of a justified ruby line matches up with
the same line without ruby.

* fast/text/ruby-justification-flush-expected.html: Added.
* fast/text/ruby-justification-flush.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit28LayoutTestsChangeLog">releases/WebKitGTK/webkit-2.8/LayoutTests/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit28SourceWebCoreChangeLog">releases/WebKitGTK/webkit-2.8/Source/WebCore/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit28SourceWebCorerenderingRenderBlockFlowh">releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderBlockFlow.h</a></li>
<li><a href="#releasesWebKitGTKwebkit28SourceWebCorerenderingRenderBlockLineLayoutcpp">releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderBlockLineLayout.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit28LayoutTestsfasttextrubyjustificationflushexpectedhtml">releases/WebKitGTK/webkit-2.8/LayoutTests/fast/text/ruby-justification-flush-expected.html</a></li>
<li><a href="#releasesWebKitGTKwebkit28LayoutTestsfasttextrubyjustificationflushhtml">releases/WebKitGTK/webkit-2.8/LayoutTests/fast/text/ruby-justification-flush.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="releasesWebKitGTKwebkit28LayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.8/LayoutTests/ChangeLog (180743 => 180744)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.8/LayoutTests/ChangeLog        2015-02-27 14:19:29 UTC (rev 180743)
+++ releases/WebKitGTK/webkit-2.8/LayoutTests/ChangeLog        2015-02-27 14:25:27 UTC (rev 180744)
</span><span class="lines">@@ -1,3 +1,16 @@
</span><ins>+2015-02-18  Myles C. Maxfield  &lt;mmaxfield@apple.com&gt;
+
+        Justified ruby can cause lines to grow beyond their container
+        https://bugs.webkit.org/show_bug.cgi?id=141732
+
+        Reviewed by David Hyatt.
+
+        Make sure that the right edge of a justified ruby line matches up with
+        the same line without ruby.
+
+        * fast/text/ruby-justification-flush-expected.html: Added.
+        * fast/text/ruby-justification-flush.html: Added.
+
</ins><span class="cx"> 2015-02-17  Alexey Proskuryakov  &lt;ap@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         fast/selectors/nth-last-child-of-register-requirement.html is extremely slow in debug builds
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit28LayoutTestsfasttextrubyjustificationflushexpectedhtml"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.8/LayoutTests/fast/text/ruby-justification-flush-expected.html (0 => 180744)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.8/LayoutTests/fast/text/ruby-justification-flush-expected.html                                (rev 0)
+++ releases/WebKitGTK/webkit-2.8/LayoutTests/fast/text/ruby-justification-flush-expected.html        2015-02-27 14:25:27 UTC (rev 180744)
</span><span class="lines">@@ -0,0 +1,29 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;meta charset=&quot;utf-8&quot;&gt;
+&lt;style&gt;
+#outer {
+    position: absolute;
+    width: 500px;
+    height: 500px;
+    overflow: hidden;
+}
+
+#inner {
+    font-size: 127px;
+    text-align: justify;
+    position: absolute;
+    bottom: 0px;
+    left: 73px;
+    width: 1200px;
+    font-family: Ahem;
+}
+&lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+This test makes sure that ruby overhangs don't make text grow beyond the bound of the enclosing box.
+At the bottom left of this page, there are two black squares on top of each other. This test passes if the two squares are exactly vertically aligned.
+&lt;div id=&quot;outer&quot;&gt;&lt;div id=&quot;inner&quot;&gt;a&lt;br&gt;a&lt;br&gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit28LayoutTestsfasttextrubyjustificationflushhtml"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.8/LayoutTests/fast/text/ruby-justification-flush.html (0 => 180744)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.8/LayoutTests/fast/text/ruby-justification-flush.html                                (rev 0)
+++ releases/WebKitGTK/webkit-2.8/LayoutTests/fast/text/ruby-justification-flush.html        2015-02-27 14:25:27 UTC (rev 180744)
</span><span class="lines">@@ -0,0 +1,29 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;meta charset=&quot;utf-8&quot;&gt;
+&lt;style&gt;
+#outer {
+    position: absolute;
+    width: 500px;
+    height: 500px;
+    overflow: hidden;
+}
+
+#inner {
+    font-size: 127px;
+    text-align: justify;
+    position: absolute;
+    bottom: 0px;
+    left: -1000px;
+    width: 1200px;
+    font-family: Ahem;
+}
+&lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+This test makes sure that ruby overhangs don't make text grow beyond the bound of the enclosing box.
+At the bottom left of this page, there are two black squares on top of each other. This test passes if the two squares are exactly vertically aligned.
+&lt;div id=&quot;outer&quot;&gt;&lt;div id=&quot;inner&quot;&gt;a&lt;ruby&gt; a &lt;rt&gt;aaaa&lt;/rt&gt; a &lt;rt&gt;aaaa&lt;/rt&gt;&lt;/ruby&gt;a a a a a a a a&lt;/div&gt;&lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit28SourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.8/Source/WebCore/ChangeLog (180743 => 180744)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.8/Source/WebCore/ChangeLog        2015-02-27 14:19:29 UTC (rev 180743)
+++ releases/WebKitGTK/webkit-2.8/Source/WebCore/ChangeLog        2015-02-27 14:25:27 UTC (rev 180744)
</span><span class="lines">@@ -1,3 +1,30 @@
</span><ins>+2015-02-18  Myles C. Maxfield  &lt;mmaxfield@apple.com&gt;
+
+        Justified ruby can cause lines to grow beyond their container
+        https://bugs.webkit.org/show_bug.cgi?id=141732
+
+        Reviewed by David Hyatt.
+
+        After we re-layout RenderRubyRuns, this can change the environment upon which
+        ruby's overhang calculation is sensitive to. Before this patch, we would recalculate
+        the overhang after the RenderRubyRun gets relaid out. However, doing such causes the
+        effective width of the RenderRubyRun to change, which causes out subsequent
+        justification calculations to be off.
+
+        Therefore, we have a cycle; the amount of ruby overhang can change the justification
+        in a line, and the layout of the line affects the ruby overhang calculation. Instead
+        of performing a layout in a loop until it converges, this patch simply observes that
+        having a flush right edge is more valuable than having a perfectly correct overhang.
+        It therefore simply removes the secondary overhang calculation.
+
+        Test: fast/text/ruby-justification-flush.html
+
+        * rendering/RenderBlockFlow.h:
+        * rendering/RenderBlockLineLayout.cpp:
+        (WebCore::RenderBlockFlow::updateRubyForJustifiedText):
+        (WebCore::RenderBlockFlow::computeExpansionForJustifiedText):
+        (WebCore::RenderBlockFlow::computeInlineDirectionPositionsForSegment):
+
</ins><span class="cx"> 2015-02-17  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Slight CachedPage class clean up
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit28SourceWebCorerenderingRenderBlockFlowh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderBlockFlow.h (180743 => 180744)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderBlockFlow.h        2015-02-27 14:19:29 UTC (rev 180743)
+++ releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderBlockFlow.h        2015-02-27 14:25:27 UTC (rev 180744)
</span><span class="lines">@@ -555,8 +555,8 @@
</span><span class="cx">     RootInlineBox* constructLine(BidiRunList&lt;BidiRun&gt;&amp;, const LineInfo&amp;);
</span><span class="cx">     void setMarginsForRubyRun(BidiRun*, RenderRubyRun&amp;, RenderObject*, const LineInfo&amp;);
</span><span class="cx">     void computeInlineDirectionPositionsForLine(RootInlineBox*, const LineInfo&amp;, BidiRun* firstRun, BidiRun* trailingSpaceRun, bool reachedEnd, GlyphOverflowAndFallbackFontsMap&amp;, VerticalPositionCache&amp;, WordMeasurements&amp;);
</span><del>-    void updateRubyForJustifiedText(RenderRubyRun&amp;, BidiRun&amp;, const Vector&lt;unsigned, 16&gt;&amp; expansionOpportunities, unsigned&amp; expansionOpportunityCount, float&amp; totalLogicalWidth, float availableLogicalWidth, RenderObject* previousObject, const LineInfo&amp;, size_t&amp; expansionIndex);
-    void computeExpansionForJustifiedText(BidiRun* firstRun, BidiRun* trailingSpaceRun, const Vector&lt;unsigned, 16&gt;&amp; expansionOpportunities, unsigned expansionOpportunityCount, float totalLogicalWidth, float availableLogicalWidth, const LineInfo&amp;);
</del><ins>+    void updateRubyForJustifiedText(RenderRubyRun&amp;, BidiRun&amp;, const Vector&lt;unsigned, 16&gt;&amp; expansionOpportunities, unsigned&amp; expansionOpportunityCount, float&amp; totalLogicalWidth, float availableLogicalWidth, size_t&amp; expansionIndex);
+    void computeExpansionForJustifiedText(BidiRun* firstRun, BidiRun* trailingSpaceRun, const Vector&lt;unsigned, 16&gt;&amp; expansionOpportunities, unsigned expansionOpportunityCount, float totalLogicalWidth, float availableLogicalWidth);
</ins><span class="cx">     BidiRun* computeInlineDirectionPositionsForSegment(RootInlineBox*, const LineInfo&amp;, ETextAlign, float&amp; logicalLeft,
</span><span class="cx">         float&amp; availableLogicalWidth, BidiRun* firstRun, BidiRun* trailingSpaceRun, GlyphOverflowAndFallbackFontsMap&amp; textBoxDataMap, VerticalPositionCache&amp;, WordMeasurements&amp;);
</span><span class="cx">     void computeBlockDirectionPositionsForLine(RootInlineBox*, BidiRun*, GlyphOverflowAndFallbackFontsMap&amp;, VerticalPositionCache&amp;);
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit28SourceWebCorerenderingRenderBlockLineLayoutcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderBlockLineLayout.cpp (180743 => 180744)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderBlockLineLayout.cpp        2015-02-27 14:19:29 UTC (rev 180743)
+++ releases/WebKitGTK/webkit-2.8/Source/WebCore/rendering/RenderBlockLineLayout.cpp        2015-02-27 14:25:27 UTC (rev 180744)
</span><span class="lines">@@ -545,7 +545,7 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void RenderBlockFlow::updateRubyForJustifiedText(RenderRubyRun&amp; rubyRun, BidiRun&amp; r, const Vector&lt;unsigned, 16&gt;&amp; expansionOpportunities, unsigned&amp; expansionOpportunityCount, float&amp; totalLogicalWidth, float availableLogicalWidth, RenderObject* previousObject, const LineInfo&amp; lineInfo, size_t&amp; i)
</del><ins>+void RenderBlockFlow::updateRubyForJustifiedText(RenderRubyRun&amp; rubyRun, BidiRun&amp; r, const Vector&lt;unsigned, 16&gt;&amp; expansionOpportunities, unsigned&amp; expansionOpportunityCount, float&amp; totalLogicalWidth, float availableLogicalWidth, size_t&amp; i)
</ins><span class="cx"> {
</span><span class="cx">     if (!rubyRun.rubyBase() || !rubyRun.rubyBase()-&gt;firstRootBox() || rubyRun.rubyBase()-&gt;firstRootBox()-&gt;nextRootBox() || !r.renderer().style().collapseWhiteSpace())
</span><span class="cx">         return;
</span><span class="lines">@@ -580,7 +580,6 @@
</span><span class="cx">         }
</span><span class="cx">         rubyRun.layoutBlock(true);
</span><span class="cx">         rubyRun.clearOverrideLogicalContentWidth();
</span><del>-        setMarginsForRubyRun(&amp;r, rubyRun, previousObject, lineInfo); // Expanding the base might mean there's less of a need for overhang
</del><span class="cx">         r.box()-&gt;setExpansion(newRubyRunWidth - r.box()-&gt;logicalWidth());
</span><span class="cx"> 
</span><span class="cx">         // This relayout caused the size of the RenderRubyText and the RenderRubyBase to change, dependent on the line's current expansion. Next time we relayout the
</span><span class="lines">@@ -596,19 +595,15 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void RenderBlockFlow::computeExpansionForJustifiedText(BidiRun* firstRun, BidiRun* trailingSpaceRun, const Vector&lt;unsigned, 16&gt;&amp; expansionOpportunities, unsigned expansionOpportunityCount, float totalLogicalWidth, float availableLogicalWidth, const LineInfo&amp; lineInfo)
</del><ins>+void RenderBlockFlow::computeExpansionForJustifiedText(BidiRun* firstRun, BidiRun* trailingSpaceRun, const Vector&lt;unsigned, 16&gt;&amp; expansionOpportunities, unsigned expansionOpportunityCount, float totalLogicalWidth, float availableLogicalWidth)
</ins><span class="cx"> {
</span><span class="cx">     if (!expansionOpportunityCount || availableLogicalWidth &lt;= totalLogicalWidth)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    RenderObject* previousObject = nullptr;
-
</del><span class="cx">     size_t i = 0;
</span><span class="cx">     for (BidiRun* run = firstRun; run; run = run-&gt;next()) {
</span><del>-        if (!run-&gt;box() || run == trailingSpaceRun) {
-            previousObject = &amp;run-&gt;renderer();
</del><ins>+        if (!run-&gt;box() || run == trailingSpaceRun)
</ins><span class="cx">             continue;
</span><del>-        }
</del><span class="cx">         
</span><span class="cx">         if (is&lt;RenderText&gt;(run-&gt;renderer())) {
</span><span class="cx">             unsigned opportunitiesInRun = expansionOpportunities[i++];
</span><span class="lines">@@ -624,10 +619,8 @@
</span><span class="cx">             }
</span><span class="cx">             expansionOpportunityCount -= opportunitiesInRun;
</span><span class="cx">         } else if (is&lt;RenderRubyRun&gt;(run-&gt;renderer()))
</span><del>-            updateRubyForJustifiedText(downcast&lt;RenderRubyRun&gt;(run-&gt;renderer()), *run, expansionOpportunities, expansionOpportunityCount, totalLogicalWidth, availableLogicalWidth, previousObject, lineInfo, i);
</del><ins>+            updateRubyForJustifiedText(downcast&lt;RenderRubyRun&gt;(run-&gt;renderer()), *run, expansionOpportunities, expansionOpportunityCount, totalLogicalWidth, availableLogicalWidth, i);
</ins><span class="cx"> 
</span><del>-        previousObject = &amp;run-&gt;renderer();
-
</del><span class="cx">         if (!expansionOpportunityCount)
</span><span class="cx">             break;
</span><span class="cx">     }
</span><span class="lines">@@ -813,7 +806,7 @@
</span><span class="cx"> 
</span><span class="cx">     updateLogicalWidthForAlignment(textAlign, lineBox, trailingSpaceRun, logicalLeft, totalLogicalWidth, availableLogicalWidth, expansionOpportunityCount);
</span><span class="cx"> 
</span><del>-    computeExpansionForJustifiedText(firstRun, trailingSpaceRun, expansionOpportunities, expansionOpportunityCount, totalLogicalWidth, availableLogicalWidth, lineInfo);
</del><ins>+    computeExpansionForJustifiedText(firstRun, trailingSpaceRun, expansionOpportunities, expansionOpportunityCount, totalLogicalWidth, availableLogicalWidth);
</ins><span class="cx"> 
</span><span class="cx">     return run;
</span><span class="cx"> }
</span></span></pre>
</div>
</div>

</body>
</html>