<!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>[211108] 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/211108">211108</a></dd>
<dt>Author</dt> <dd>zalan@apple.com</dd>
<dt>Date</dt> <dd>2017-01-24 13:38:20 -0800 (Tue, 24 Jan 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>Simple line layout: Add support for hyphen: auto.
https://bugs.webkit.org/show_bug.cgi?id=167297
&lt;rdar://problem/30119463&gt;

Reviewed by Antti Koivisto.

Source/WebCore:

Implement hyphen: auto for simple line layout.

Tests: fast/text/simple-line-hyphens-with-text-align.html
       fast/text/simple-line-hyphens-with-word-letter-spacing.html

* platform/text/Hyphenation.h:
(WebCore::enoughWidthForHyphenation):
* rendering/RenderTreeAsText.cpp:
(WebCore::writeSimpleLine):
(WebCore::write):
* rendering/SimpleLineLayout.cpp:
(WebCore::SimpleLineLayout::canUseForStyle):
(WebCore::SimpleLineLayout::LineState::appendFragmentAndCreateRunIfNeeded): Inherit the hyphen attribute from the
run-to-be-appended. Ensure that we don't append additional runs when the last run has hyphen.
(WebCore::SimpleLineLayout::splitFragmentToFitLine): Before calling into the lastHyphenPosition() we need to
ensure that the hyphen would surely fit (even on the splitting position).
(WebCore::SimpleLineLayout::createLineRuns): Probe hypenation for overhanging non-whitespace runs.
(WebCore::SimpleLineLayout::printReason):
* rendering/SimpleLineLayout.h:
(WebCore::SimpleLineLayout::Run::Run):
* rendering/SimpleLineLayoutFlowContents.h:
(WebCore::SimpleLineLayout::FlowContents::Segment::toSegmentPosition):
(WebCore::SimpleLineLayout::FlowContents::Segment::toRenderPosition):
* rendering/SimpleLineLayoutResolver.cpp:
(WebCore::SimpleLineLayout::RunResolver::Run::Run):
(WebCore::SimpleLineLayout::RunResolver::Run::constructStringForHyphenIfNeeded):
(WebCore::SimpleLineLayout::RunResolver::Run::text):
* rendering/SimpleLineLayoutResolver.h:
(WebCore::SimpleLineLayout::RunResolver::Run::hasHyphen):
* rendering/SimpleLineLayoutTextFragmentIterator.cpp:
(WebCore::SimpleLineLayout::TextFragmentIterator::Style::Style):
(WebCore::SimpleLineLayout::TextFragmentIterator::nextBreakablePosition):
(WebCore::SimpleLineLayout::TextFragmentIterator::nextNonWhitespacePosition):
(WebCore::SimpleLineLayout::TextFragmentIterator::textWidth):
(WebCore::SimpleLineLayout::TextFragmentIterator::lastHyphenPosition): We only check the actual run for hyphenation ignoring
the neighboring runs. This might need to be changed in the future.
(WebCore::SimpleLineLayout::TextFragmentIterator::runWidth):
* rendering/SimpleLineLayoutTextFragmentIterator.h:
(WebCore::SimpleLineLayout::TextFragmentIterator::TextFragment::TextFragment):
(WebCore::SimpleLineLayout::TextFragmentIterator::TextFragment::hasHyphen):
(WebCore::SimpleLineLayout::TextFragmentIterator::TextFragment::operator==):
(WebCore::SimpleLineLayout::TextFragmentIterator::TextFragment::split):
(WebCore::SimpleLineLayout::TextFragmentIterator::TextFragment::splitWithHyphen):
* rendering/line/BreakingContext.h:
(WebCore::tryHyphenating):

LayoutTests:

* fast/text/simple-line-hyphens-with-text-align-expected.html: Added.
* fast/text/simple-line-hyphens-with-text-align.html: Added.
* fast/text/simple-line-hyphens-with-word-letter-spacing-expected.html: Added.
* fast/text/simple-line-hyphens-with-word-letter-spacing.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="#trunkSourceWebCoreplatformtextHyphenationh">trunk/Source/WebCore/platform/text/Hyphenation.h</a></li>
<li><a href="#trunkSourceWebCorerenderingRenderTreeAsTextcpp">trunk/Source/WebCore/rendering/RenderTreeAsText.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingSimpleLineLayoutcpp">trunk/Source/WebCore/rendering/SimpleLineLayout.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingSimpleLineLayouth">trunk/Source/WebCore/rendering/SimpleLineLayout.h</a></li>
<li><a href="#trunkSourceWebCorerenderingSimpleLineLayoutFlowContentsh">trunk/Source/WebCore/rendering/SimpleLineLayoutFlowContents.h</a></li>
<li><a href="#trunkSourceWebCorerenderingSimpleLineLayoutResolvercpp">trunk/Source/WebCore/rendering/SimpleLineLayoutResolver.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingSimpleLineLayoutResolverh">trunk/Source/WebCore/rendering/SimpleLineLayoutResolver.h</a></li>
<li><a href="#trunkSourceWebCorerenderingSimpleLineLayoutTextFragmentIteratorcpp">trunk/Source/WebCore/rendering/SimpleLineLayoutTextFragmentIterator.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingSimpleLineLayoutTextFragmentIteratorh">trunk/Source/WebCore/rendering/SimpleLineLayoutTextFragmentIterator.h</a></li>
<li><a href="#trunkSourceWebCorerenderinglineBreakingContexth">trunk/Source/WebCore/rendering/line/BreakingContext.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfasttextsimplelinehyphenswithtextalignexpectedhtml">trunk/LayoutTests/fast/text/simple-line-hyphens-with-text-align-expected.html</a></li>
<li><a href="#trunkLayoutTestsfasttextsimplelinehyphenswithtextalignhtml">trunk/LayoutTests/fast/text/simple-line-hyphens-with-text-align.html</a></li>
<li><a href="#trunkLayoutTestsfasttextsimplelinehyphenswithwordletterspacingexpectedhtml">trunk/LayoutTests/fast/text/simple-line-hyphens-with-word-letter-spacing-expected.html</a></li>
<li><a href="#trunkLayoutTestsfasttextsimplelinehyphenswithwordletterspacinghtml">trunk/LayoutTests/fast/text/simple-line-hyphens-with-word-letter-spacing.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (211107 => 211108)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2017-01-24 21:23:05 UTC (rev 211107)
+++ trunk/LayoutTests/ChangeLog        2017-01-24 21:38:20 UTC (rev 211108)
</span><span class="lines">@@ -1,3 +1,16 @@
</span><ins>+2017-01-24  Zalan Bujtas  &lt;zalan@apple.com&gt;
+
+        Simple line layout: Add support for hyphen: auto.
+        https://bugs.webkit.org/show_bug.cgi?id=167297
+        &lt;rdar://problem/30119463&gt;
+
+        Reviewed by Antti Koivisto.
+
+        * fast/text/simple-line-hyphens-with-text-align-expected.html: Added.
+        * fast/text/simple-line-hyphens-with-text-align.html: Added.
+        * fast/text/simple-line-hyphens-with-word-letter-spacing-expected.html: Added.
+        * fast/text/simple-line-hyphens-with-word-letter-spacing.html: Added.
+
</ins><span class="cx"> 2017-01-24  Ryan Haddad  &lt;ryanhaddad@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         More modern-media-controls LayoutTest gardening.
</span></span></pre></div>
<a id="trunkLayoutTestsfasttextsimplelinehyphenswithtextalignexpectedhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/text/simple-line-hyphens-with-text-align-expected.html (0 => 211108)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/text/simple-line-hyphens-with-text-align-expected.html                                (rev 0)
+++ trunk/LayoutTests/fast/text/simple-line-hyphens-with-text-align-expected.html        2017-01-24 21:38:20 UTC (rev 211108)
</span><span class="lines">@@ -0,0 +1,23 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;title&gt;This tests that simple and normal line layout produce the same lines with hyphens&lt;/title&gt;
+&lt;style&gt;
+div {
+  display: inline-block;
+  -webkit-hyphens: auto; 
+  width: 200px;
+  border: 1px solid green;
+}
+&lt;/style&gt;
+&lt;script&gt;
+if (internal.settings)
+    internals.settings.setSimpleLineLayoutEnabled(false);
+&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;div&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec consequat rhoncus erat, id pellentesque ligula aliquet et. Nam aliquam pellentesque risus. Mauris lorem nunc, sodales pellentesque porttitor ut, pellentesque at felis. Nullam et accumsan leo, in scelerisque massa. Fusce luctus laoreet pretium. Nulla sollicitudin volutpat neque in mattis. Vestibulum non placerat velit. Aenean dui nunc, tincidunt nec tempus et, venenatis vel magna. Interdum et malesuada fames ac ante ipsum primis in faucibus. Proin pretium nisl sit amet lacus varius consequat. Donec congue molestie mauris, a vehicula velit. Nam pellentesque sed arcu congue rutrum. Maecenas pulvinar ex at diam dapibus consectetur ut non nisl. Sed tempus bibendum sodales. Donec nec arcu ligula. Vivamus sit amet aliquet neque, vel volutpat nibh. In purus sem, tincidunt vulputate neque eu, scelerisque hendrerit ex. Donec eu porta lectus, at malesuada magna. Duis ut egestas est. Nullam et libero sit amet lect
 us tempus pharetra ac id mauris. Ut diam orci, interdum nec suscipit ut, semper nec orci. Fusce sed risus elementum, posuere orci id, aliquam urna. Donec arcu turpis, scelerisque a mauris vel, vehicula convallis ipsum. Phasellus facilisis, magna ut dapibus pretium, sapien mauris viverra enim, ut hendrerit urna dui eu ligula. Nulla vestibulum et nibh quis laoreet. Quisque feugiat arcu ipsum, id mollis quam sagittis at. Morbi tempus, risus molestie ultricies viverra, justo augue facilisis orci, a semper risus dui pellentesque purus. Curabitur facilisis arcu quam, id facilisis turpis aliquam ac. Maecenas efficitur risus pellentesque sem maximus euismod. Proin aliquet justo ac dolor faucibus porttitor. Fusce orci lectus, eleifend at lectus sit amet, pretium ornare felis. Nullam nec ipsum maximus, molestie arcu in, finibus urna. Suspendisse tincidunt feugiat est, in viverra lectus tincidunt quis. Ut eros tortor, tincidunt vel commodo hendrerit, consequat vel neque. Vestibulum eni
 m nibh, accumsan quis viverra ut, iaculis sit amet est. Morbi non lacus at dolor euismod molestie. Integer pulvinar, nibh in volutpat tincidunt, urna odio interdum magna, vitae faucibus felis quam nec est. Proin tellus quam, auctor nec dictum sed, rhoncus nec massa. Mauris ac arcu ac augue porta viverra. Quisque semper eget nisi quis viverra. Donec vitae mauris ipsum. Duis tempor pulvinar viverra. Nam dignissim iaculis felis, eget vestibulum eros. Nulla eget faucibus massa. Integer sollicitudin pretium erat, vel commodo nunc congue non. Nulla in nunc auctor dui efficitur euismod. Sed pharetra sapien erat, a blandit neque porttitor sit amet. Mauris pharetra sodales maximus. Nulla volutpat auctor quam, a elementum risus tristique eu. In ac sodales nibh. Maecenas pharetra orci sem, eu laoreet quam tincidunt non. Mauris in interdum dui. Vivamus et interdum erat. Aliquam nec ante tincidunt, elementum risus in, mattis orci. Sed massa turpis, blandit a rutrum at, dignissim et lectu
 s. Nunc tincidunt orci nibh, id ullamcorper nisl vestibulum vel.&lt;/div&gt;
+&lt;div style=&quot;text-align: justify&quot;&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec consequat rhoncus erat, id pellentesque ligula aliquet et. Nam aliquam pellentesque risus. Mauris lorem nunc, sodales pellentesque porttitor ut, pellentesque at felis. Nullam et accumsan leo, in scelerisque massa. Fusce luctus laoreet pretium. Nulla sollicitudin volutpat neque in mattis. Vestibulum non placerat velit. Aenean dui nunc, tincidunt nec tempus et, venenatis vel magna. Interdum et malesuada fames ac ante ipsum primis in faucibus. Proin pretium nisl sit amet lacus varius consequat. Donec congue molestie mauris, a vehicula velit. Nam pellentesque sed arcu congue rutrum. Maecenas pulvinar ex at diam dapibus consectetur ut non nisl. Sed tempus bibendum sodales. Donec nec arcu ligula. Vivamus sit amet aliquet neque, vel volutpat nibh. In purus sem, tincidunt vulputate neque eu, scelerisque hendrerit ex. Donec eu porta lectus, at malesuada magna. Duis ut egest
 as est. Nullam et libero sit amet lectus tempus pharetra ac id mauris. Ut diam orci, interdum nec suscipit ut, semper nec orci. Fusce sed risus elementum, posuere orci id, aliquam urna. Donec arcu turpis, scelerisque a mauris vel, vehicula convallis ipsum. Phasellus facilisis, magna ut dapibus pretium, sapien mauris viverra enim, ut hendrerit urna dui eu ligula. Nulla vestibulum et nibh quis laoreet. Quisque feugiat arcu ipsum, id mollis quam sagittis at. Morbi tempus, risus molestie ultricies viverra, justo augue facilisis orci, a semper risus dui pellentesque purus. Curabitur facilisis arcu quam, id facilisis turpis aliquam ac. Maecenas efficitur risus pellentesque sem maximus euismod. Proin aliquet justo ac dolor faucibus porttitor. Fusce orci lectus, eleifend at lectus sit amet, pretium ornare felis. Nullam nec ipsum maximus, molestie arcu in, finibus urna. Suspendisse tincidunt feugiat est, in viverra lectus tincidunt quis. Ut eros tortor, tincidunt vel commodo hendreri
 t, consequat vel neque. Vestibulum enim nibh, accumsan quis viverra ut, iaculis sit amet est. Morbi non lacus at dolor euismod molestie. Integer pulvinar, nibh in volutpat tincidunt, urna odio interdum magna, vitae faucibus felis quam nec est. Proin tellus quam, auctor nec dictum sed, rhoncus nec massa. Mauris ac arcu ac augue porta viverra. Quisque semper eget nisi quis viverra. Donec vitae mauris ipsum. Duis tempor pulvinar viverra. Nam dignissim iaculis felis, eget vestibulum eros. Nulla eget faucibus massa. Integer sollicitudin pretium erat, vel commodo nunc congue non. Nulla in nunc auctor dui efficitur euismod. Sed pharetra sapien erat, a blandit neque porttitor sit amet. Mauris pharetra sodales maximus. Nulla volutpat auctor quam, a elementum risus tristique eu. In ac sodales nibh. Maecenas pharetra orci sem, eu laoreet quam tincidunt non. Mauris in interdum dui. Vivamus et interdum erat. Aliquam nec ante tincidunt, elementum risus in, mattis orci. Sed massa turpis, b
 landit a rutrum at, dignissim et lectus. Nunc tincidunt orci nibh, id ullamcorper nisl vestibulum vel.&lt;/div&gt;
+&lt;div style=&quot;text-align: right&quot;&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec consequat rhoncus erat, id pellentesque ligula aliquet et. Nam aliquam pellentesque risus. Mauris lorem nunc, sodales pellentesque porttitor ut, pellentesque at felis. Nullam et accumsan leo, in scelerisque massa. Fusce luctus laoreet pretium. Nulla sollicitudin volutpat neque in mattis. Vestibulum non placerat velit. Aenean dui nunc, tincidunt nec tempus et, venenatis vel magna. Interdum et malesuada fames ac ante ipsum primis in faucibus. Proin pretium nisl sit amet lacus varius consequat. Donec congue molestie mauris, a vehicula velit. Nam pellentesque sed arcu congue rutrum. Maecenas pulvinar ex at diam dapibus consectetur ut non nisl. Sed tempus bibendum sodales. Donec nec arcu ligula. Vivamus sit amet aliquet neque, vel volutpat nibh. In purus sem, tincidunt vulputate neque eu, scelerisque hendrerit ex. Donec eu porta lectus, at malesuada magna. Duis ut egestas
  est. Nullam et libero sit amet lectus tempus pharetra ac id mauris. Ut diam orci, interdum nec suscipit ut, semper nec orci. Fusce sed risus elementum, posuere orci id, aliquam urna. Donec arcu turpis, scelerisque a mauris vel, vehicula convallis ipsum. Phasellus facilisis, magna ut dapibus pretium, sapien mauris viverra enim, ut hendrerit urna dui eu ligula. Nulla vestibulum et nibh quis laoreet. Quisque feugiat arcu ipsum, id mollis quam sagittis at. Morbi tempus, risus molestie ultricies viverra, justo augue facilisis orci, a semper risus dui pellentesque purus. Curabitur facilisis arcu quam, id facilisis turpis aliquam ac. Maecenas efficitur risus pellentesque sem maximus euismod. Proin aliquet justo ac dolor faucibus porttitor. Fusce orci lectus, eleifend at lectus sit amet, pretium ornare felis. Nullam nec ipsum maximus, molestie arcu in, finibus urna. Suspendisse tincidunt feugiat est, in viverra lectus tincidunt quis. Ut eros tortor, tincidunt vel commodo hendrerit,
  consequat vel neque. Vestibulum enim nibh, accumsan quis viverra ut, iaculis sit amet est. Morbi non lacus at dolor euismod molestie. Integer pulvinar, nibh in volutpat tincidunt, urna odio interdum magna, vitae faucibus felis quam nec est. Proin tellus quam, auctor nec dictum sed, rhoncus nec massa. Mauris ac arcu ac augue porta viverra. Quisque semper eget nisi quis viverra. Donec vitae mauris ipsum. Duis tempor pulvinar viverra. Nam dignissim iaculis felis, eget vestibulum eros. Nulla eget faucibus massa. Integer sollicitudin pretium erat, vel commodo nunc congue non. Nulla in nunc auctor dui efficitur euismod. Sed pharetra sapien erat, a blandit neque porttitor sit amet. Mauris pharetra sodales maximus. Nulla volutpat auctor quam, a elementum risus tristique eu. In ac sodales nibh. Maecenas pharetra orci sem, eu laoreet quam tincidunt non. Mauris in interdum dui. Vivamus et interdum erat. Aliquam nec ante tincidunt, elementum risus in, mattis orci. Sed massa turpis, bla
 ndit a rutrum at, dignissim et lectus. Nunc tincidunt orci nibh, id ullamcorper nisl vestibulum vel.&lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfasttextsimplelinehyphenswithtextalignhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/text/simple-line-hyphens-with-text-align.html (0 => 211108)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/text/simple-line-hyphens-with-text-align.html                                (rev 0)
+++ trunk/LayoutTests/fast/text/simple-line-hyphens-with-text-align.html        2017-01-24 21:38:20 UTC (rev 211108)
</span><span class="lines">@@ -0,0 +1,19 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;title&gt;This tests that simple and normal line layout produce the same lines with hyphens&lt;/title&gt;
+&lt;style&gt;
+div {
+  display: inline-block;
+  -webkit-hyphens: auto; 
+  width: 200px;
+  border: 1px solid green;
+}
+&lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;div&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec consequat rhoncus erat, id pellentesque ligula aliquet et. Nam aliquam pellentesque risus. Mauris lorem nunc, sodales pellentesque porttitor ut, pellentesque at felis. Nullam et accumsan leo, in scelerisque massa. Fusce luctus laoreet pretium. Nulla sollicitudin volutpat neque in mattis. Vestibulum non placerat velit. Aenean dui nunc, tincidunt nec tempus et, venenatis vel magna. Interdum et malesuada fames ac ante ipsum primis in faucibus. Proin pretium nisl sit amet lacus varius consequat. Donec congue molestie mauris, a vehicula velit. Nam pellentesque sed arcu congue rutrum. Maecenas pulvinar ex at diam dapibus consectetur ut non nisl. Sed tempus bibendum sodales. Donec nec arcu ligula. Vivamus sit amet aliquet neque, vel volutpat nibh. In purus sem, tincidunt vulputate neque eu, scelerisque hendrerit ex. Donec eu porta lectus, at malesuada magna. Duis ut egestas est. Nullam et libero sit amet lect
 us tempus pharetra ac id mauris. Ut diam orci, interdum nec suscipit ut, semper nec orci. Fusce sed risus elementum, posuere orci id, aliquam urna. Donec arcu turpis, scelerisque a mauris vel, vehicula convallis ipsum. Phasellus facilisis, magna ut dapibus pretium, sapien mauris viverra enim, ut hendrerit urna dui eu ligula. Nulla vestibulum et nibh quis laoreet. Quisque feugiat arcu ipsum, id mollis quam sagittis at. Morbi tempus, risus molestie ultricies viverra, justo augue facilisis orci, a semper risus dui pellentesque purus. Curabitur facilisis arcu quam, id facilisis turpis aliquam ac. Maecenas efficitur risus pellentesque sem maximus euismod. Proin aliquet justo ac dolor faucibus porttitor. Fusce orci lectus, eleifend at lectus sit amet, pretium ornare felis. Nullam nec ipsum maximus, molestie arcu in, finibus urna. Suspendisse tincidunt feugiat est, in viverra lectus tincidunt quis. Ut eros tortor, tincidunt vel commodo hendrerit, consequat vel neque. Vestibulum eni
 m nibh, accumsan quis viverra ut, iaculis sit amet est. Morbi non lacus at dolor euismod molestie. Integer pulvinar, nibh in volutpat tincidunt, urna odio interdum magna, vitae faucibus felis quam nec est. Proin tellus quam, auctor nec dictum sed, rhoncus nec massa. Mauris ac arcu ac augue porta viverra. Quisque semper eget nisi quis viverra. Donec vitae mauris ipsum. Duis tempor pulvinar viverra. Nam dignissim iaculis felis, eget vestibulum eros. Nulla eget faucibus massa. Integer sollicitudin pretium erat, vel commodo nunc congue non. Nulla in nunc auctor dui efficitur euismod. Sed pharetra sapien erat, a blandit neque porttitor sit amet. Mauris pharetra sodales maximus. Nulla volutpat auctor quam, a elementum risus tristique eu. In ac sodales nibh. Maecenas pharetra orci sem, eu laoreet quam tincidunt non. Mauris in interdum dui. Vivamus et interdum erat. Aliquam nec ante tincidunt, elementum risus in, mattis orci. Sed massa turpis, blandit a rutrum at, dignissim et lectu
 s. Nunc tincidunt orci nibh, id ullamcorper nisl vestibulum vel.&lt;/div&gt;
+&lt;div style=&quot;text-align: justify&quot;&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec consequat rhoncus erat, id pellentesque ligula aliquet et. Nam aliquam pellentesque risus. Mauris lorem nunc, sodales pellentesque porttitor ut, pellentesque at felis. Nullam et accumsan leo, in scelerisque massa. Fusce luctus laoreet pretium. Nulla sollicitudin volutpat neque in mattis. Vestibulum non placerat velit. Aenean dui nunc, tincidunt nec tempus et, venenatis vel magna. Interdum et malesuada fames ac ante ipsum primis in faucibus. Proin pretium nisl sit amet lacus varius consequat. Donec congue molestie mauris, a vehicula velit. Nam pellentesque sed arcu congue rutrum. Maecenas pulvinar ex at diam dapibus consectetur ut non nisl. Sed tempus bibendum sodales. Donec nec arcu ligula. Vivamus sit amet aliquet neque, vel volutpat nibh. In purus sem, tincidunt vulputate neque eu, scelerisque hendrerit ex. Donec eu porta lectus, at malesuada magna. Duis ut egest
 as est. Nullam et libero sit amet lectus tempus pharetra ac id mauris. Ut diam orci, interdum nec suscipit ut, semper nec orci. Fusce sed risus elementum, posuere orci id, aliquam urna. Donec arcu turpis, scelerisque a mauris vel, vehicula convallis ipsum. Phasellus facilisis, magna ut dapibus pretium, sapien mauris viverra enim, ut hendrerit urna dui eu ligula. Nulla vestibulum et nibh quis laoreet. Quisque feugiat arcu ipsum, id mollis quam sagittis at. Morbi tempus, risus molestie ultricies viverra, justo augue facilisis orci, a semper risus dui pellentesque purus. Curabitur facilisis arcu quam, id facilisis turpis aliquam ac. Maecenas efficitur risus pellentesque sem maximus euismod. Proin aliquet justo ac dolor faucibus porttitor. Fusce orci lectus, eleifend at lectus sit amet, pretium ornare felis. Nullam nec ipsum maximus, molestie arcu in, finibus urna. Suspendisse tincidunt feugiat est, in viverra lectus tincidunt quis. Ut eros tortor, tincidunt vel commodo hendreri
 t, consequat vel neque. Vestibulum enim nibh, accumsan quis viverra ut, iaculis sit amet est. Morbi non lacus at dolor euismod molestie. Integer pulvinar, nibh in volutpat tincidunt, urna odio interdum magna, vitae faucibus felis quam nec est. Proin tellus quam, auctor nec dictum sed, rhoncus nec massa. Mauris ac arcu ac augue porta viverra. Quisque semper eget nisi quis viverra. Donec vitae mauris ipsum. Duis tempor pulvinar viverra. Nam dignissim iaculis felis, eget vestibulum eros. Nulla eget faucibus massa. Integer sollicitudin pretium erat, vel commodo nunc congue non. Nulla in nunc auctor dui efficitur euismod. Sed pharetra sapien erat, a blandit neque porttitor sit amet. Mauris pharetra sodales maximus. Nulla volutpat auctor quam, a elementum risus tristique eu. In ac sodales nibh. Maecenas pharetra orci sem, eu laoreet quam tincidunt non. Mauris in interdum dui. Vivamus et interdum erat. Aliquam nec ante tincidunt, elementum risus in, mattis orci. Sed massa turpis, b
 landit a rutrum at, dignissim et lectus. Nunc tincidunt orci nibh, id ullamcorper nisl vestibulum vel.&lt;/div&gt;
+&lt;div style=&quot;text-align: right&quot;&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec consequat rhoncus erat, id pellentesque ligula aliquet et. Nam aliquam pellentesque risus. Mauris lorem nunc, sodales pellentesque porttitor ut, pellentesque at felis. Nullam et accumsan leo, in scelerisque massa. Fusce luctus laoreet pretium. Nulla sollicitudin volutpat neque in mattis. Vestibulum non placerat velit. Aenean dui nunc, tincidunt nec tempus et, venenatis vel magna. Interdum et malesuada fames ac ante ipsum primis in faucibus. Proin pretium nisl sit amet lacus varius consequat. Donec congue molestie mauris, a vehicula velit. Nam pellentesque sed arcu congue rutrum. Maecenas pulvinar ex at diam dapibus consectetur ut non nisl. Sed tempus bibendum sodales. Donec nec arcu ligula. Vivamus sit amet aliquet neque, vel volutpat nibh. In purus sem, tincidunt vulputate neque eu, scelerisque hendrerit ex. Donec eu porta lectus, at malesuada magna. Duis ut egestas
  est. Nullam et libero sit amet lectus tempus pharetra ac id mauris. Ut diam orci, interdum nec suscipit ut, semper nec orci. Fusce sed risus elementum, posuere orci id, aliquam urna. Donec arcu turpis, scelerisque a mauris vel, vehicula convallis ipsum. Phasellus facilisis, magna ut dapibus pretium, sapien mauris viverra enim, ut hendrerit urna dui eu ligula. Nulla vestibulum et nibh quis laoreet. Quisque feugiat arcu ipsum, id mollis quam sagittis at. Morbi tempus, risus molestie ultricies viverra, justo augue facilisis orci, a semper risus dui pellentesque purus. Curabitur facilisis arcu quam, id facilisis turpis aliquam ac. Maecenas efficitur risus pellentesque sem maximus euismod. Proin aliquet justo ac dolor faucibus porttitor. Fusce orci lectus, eleifend at lectus sit amet, pretium ornare felis. Nullam nec ipsum maximus, molestie arcu in, finibus urna. Suspendisse tincidunt feugiat est, in viverra lectus tincidunt quis. Ut eros tortor, tincidunt vel commodo hendrerit,
  consequat vel neque. Vestibulum enim nibh, accumsan quis viverra ut, iaculis sit amet est. Morbi non lacus at dolor euismod molestie. Integer pulvinar, nibh in volutpat tincidunt, urna odio interdum magna, vitae faucibus felis quam nec est. Proin tellus quam, auctor nec dictum sed, rhoncus nec massa. Mauris ac arcu ac augue porta viverra. Quisque semper eget nisi quis viverra. Donec vitae mauris ipsum. Duis tempor pulvinar viverra. Nam dignissim iaculis felis, eget vestibulum eros. Nulla eget faucibus massa. Integer sollicitudin pretium erat, vel commodo nunc congue non. Nulla in nunc auctor dui efficitur euismod. Sed pharetra sapien erat, a blandit neque porttitor sit amet. Mauris pharetra sodales maximus. Nulla volutpat auctor quam, a elementum risus tristique eu. In ac sodales nibh. Maecenas pharetra orci sem, eu laoreet quam tincidunt non. Mauris in interdum dui. Vivamus et interdum erat. Aliquam nec ante tincidunt, elementum risus in, mattis orci. Sed massa turpis, bla
 ndit a rutrum at, dignissim et lectus. Nunc tincidunt orci nibh, id ullamcorper nisl vestibulum vel.&lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfasttextsimplelinehyphenswithwordletterspacingexpectedhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/text/simple-line-hyphens-with-word-letter-spacing-expected.html (0 => 211108)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/text/simple-line-hyphens-with-word-letter-spacing-expected.html                                (rev 0)
+++ trunk/LayoutTests/fast/text/simple-line-hyphens-with-word-letter-spacing-expected.html        2017-01-24 21:38:20 UTC (rev 211108)
</span><span class="lines">@@ -0,0 +1,22 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;title&gt;This tests that simple and normal line layout produce the same lines with hyphens&lt;/title&gt;
+&lt;style&gt;
+div {
+  display: inline-block;
+  -webkit-hyphens: auto; 
+  width: 200px;
+  border: 1px solid green;
+}
+&lt;/style&gt;
+&lt;script&gt;
+if (internal.settings)
+    internals.settings.setSimpleLineLayoutEnabled(false);
+&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;div style=&quot;word-spacing: 30px&quot;&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec consequat rhoncus erat, id pellentesque ligula aliquet et. Nam aliquam pellentesque risus. Mauris lorem nunc, sodales pellentesque porttitor ut, pellentesque at felis. Nullam et accumsan leo, in scelerisque massa. Fusce luctus laoreet pretium. Nulla sollicitudin volutpat neque in mattis. Vestibulum non placerat velit. Aenean dui nunc, tincidunt nec tempus et, venenatis vel magna. Interdum et malesuada fames ac ante ipsum primis in faucibus. Proin pretium nisl sit amet lacus varius consequat. Donec congue molestie mauris, a vehicula velit. Nam pellentesque sed arcu congue rutrum. Maecenas pulvinar ex at diam dapibus consectetur ut non nisl. Sed tempus bibendum sodales. Donec nec arcu ligula. Vivamus sit amet aliquet neque, vel volutpat nibh. In purus sem, tincidunt vulputate neque eu, scelerisque hendrerit ex. Donec eu porta lectus, at malesuada magna. Duis ut egesta
 s est. Nullam et libero sit amet lectus tempus pharetra ac id mauris. Ut diam orci, interdum nec suscipit ut, semper nec orci. Fusce sed risus elementum, posuere orci id, aliquam urna. Donec arcu turpis, scelerisque a mauris vel, vehicula convallis ipsum. Phasellus facilisis, magna ut dapibus pretium, sapien mauris viverra enim, ut hendrerit urna dui eu ligula. Nulla vestibulum et nibh quis laoreet. Quisque feugiat arcu ipsum, id mollis quam sagittis at. Morbi tempus, risus molestie ultricies viverra, justo augue facilisis orci, a semper risus dui pellentesque purus. Curabitur facilisis arcu quam, id facilisis turpis aliquam ac. Maecenas efficitur risus pellentesque sem maximus euismod. Proin aliquet justo ac dolor faucibus porttitor. Fusce orci lectus, eleifend at lectus sit amet, pretium ornare felis. Nullam nec ipsum maximus, molestie arcu in, finibus urna. Suspendisse tincidunt feugiat est, in viverra lectus tincidunt quis. Ut eros tortor, tincidunt vel commodo hendrerit
 , consequat vel neque. Vestibulum enim nibh, accumsan quis viverra ut, iaculis sit amet est. Morbi non lacus at dolor euismod molestie. Integer pulvinar, nibh in volutpat tincidunt, urna odio interdum magna, vitae faucibus felis quam nec est. Proin tellus quam, auctor nec dictum sed, rhoncus nec massa. Mauris ac arcu ac augue porta viverra. Quisque semper eget nisi quis viverra. Donec vitae mauris ipsum. Duis tempor pulvinar viverra. Nam dignissim iaculis felis, eget vestibulum eros. Nulla eget faucibus massa. Integer sollicitudin pretium erat, vel commodo nunc congue non. Nulla in nunc auctor dui efficitur euismod. Sed pharetra sapien erat, a blandit neque porttitor sit amet. Mauris pharetra sodales maximus. Nulla volutpat auctor quam, a elementum risus tristique eu. In ac sodales nibh. Maecenas pharetra orci sem, eu laoreet quam tincidunt non. Mauris in interdum dui. Vivamus et interdum erat. Aliquam nec ante tincidunt, elementum risus in, mattis orci. Sed massa turpis, bl
 andit a rutrum at, dignissim et lectus. Nunc tincidunt orci nibh, id ullamcorper nisl vestibulum vel.&lt;/div&gt;
+&lt;div style=&quot;letter-spacing: 3px&quot;&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec consequat rhoncus erat, id pellentesque ligula aliquet et. Nam aliquam pellentesque risus. Mauris lorem nunc, sodales pellentesque porttitor ut, pellentesque at felis. Nullam et accumsan leo, in scelerisque massa. Fusce luctus laoreet pretium. Nulla sollicitudin volutpat neque in mattis. Vestibulum non placerat velit. Aenean dui nunc, tincidunt nec tempus et, venenatis vel magna. Interdum et malesuada fames ac ante ipsum primis in faucibus. Proin pretium nisl sit amet lacus varius consequat. Donec congue molestie mauris, a vehicula velit. Nam pellentesque sed arcu congue rutrum. Maecenas pulvinar ex at diam dapibus consectetur ut non nisl. Sed tempus bibendum sodales. Donec nec arcu ligula. Vivamus sit amet aliquet neque, vel volutpat nibh. In purus sem, tincidunt vulputate neque eu, scelerisque hendrerit ex. Donec eu porta lectus, at malesuada magna. Duis ut egest
 as est. Nullam et libero sit amet lectus tempus pharetra ac id mauris. Ut diam orci, interdum nec suscipit ut, semper nec orci. Fusce sed risus elementum, posuere orci id, aliquam urna. Donec arcu turpis, scelerisque a mauris vel, vehicula convallis ipsum. Phasellus facilisis, magna ut dapibus pretium, sapien mauris viverra enim, ut hendrerit urna dui eu ligula. Nulla vestibulum et nibh quis laoreet. Quisque feugiat arcu ipsum, id mollis quam sagittis at. Morbi tempus, risus molestie ultricies viverra, justo augue facilisis orci, a semper risus dui pellentesque purus. Curabitur facilisis arcu quam, id facilisis turpis aliquam ac. Maecenas efficitur risus pellentesque sem maximus euismod. Proin aliquet justo ac dolor faucibus porttitor. Fusce orci lectus, eleifend at lectus sit amet, pretium ornare felis. Nullam nec ipsum maximus, molestie arcu in, finibus urna. Suspendisse tincidunt feugiat est, in viverra lectus tincidunt quis. Ut eros tortor, tincidunt vel commodo hendreri
 t, consequat vel neque. Vestibulum enim nibh, accumsan quis viverra ut, iaculis sit amet est. Morbi non lacus at dolor euismod molestie. Integer pulvinar, nibh in volutpat tincidunt, urna odio interdum magna, vitae faucibus felis quam nec est. Proin tellus quam, auctor nec dictum sed, rhoncus nec massa. Mauris ac arcu ac augue porta viverra. Quisque semper eget nisi quis viverra. Donec vitae mauris ipsum. Duis tempor pulvinar viverra. Nam dignissim iaculis felis, eget vestibulum eros. Nulla eget faucibus massa. Integer sollicitudin pretium erat, vel commodo nunc congue non. Nulla in nunc auctor dui efficitur euismod. Sed pharetra sapien erat, a blandit neque porttitor sit amet. Mauris pharetra sodales maximus. Nulla volutpat auctor quam, a elementum risus tristique eu. In ac sodales nibh. Maecenas pharetra orci sem, eu laoreet quam tincidunt non. Mauris in interdum dui. Vivamus et interdum erat. Aliquam nec ante tincidunt, elementum risus in, mattis orci. Sed massa turpis, b
 landit a rutrum at, dignissim et lectus. Nunc tincidunt orci nibh, id ullamcorper nisl vestibulum vel.&lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfasttextsimplelinehyphenswithwordletterspacinghtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/text/simple-line-hyphens-with-word-letter-spacing.html (0 => 211108)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/text/simple-line-hyphens-with-word-letter-spacing.html                                (rev 0)
+++ trunk/LayoutTests/fast/text/simple-line-hyphens-with-word-letter-spacing.html        2017-01-24 21:38:20 UTC (rev 211108)
</span><span class="lines">@@ -0,0 +1,18 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;title&gt;This tests that simple and normal line layout produce the same lines with hyphens&lt;/title&gt;
+&lt;style&gt;
+div {
+  display: inline-block;
+  -webkit-hyphens: auto; 
+  width: 200px;
+  border: 1px solid green;
+}
+&lt;/style&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;div style=&quot;word-spacing: 30px&quot;&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec consequat rhoncus erat, id pellentesque ligula aliquet et. Nam aliquam pellentesque risus. Mauris lorem nunc, sodales pellentesque porttitor ut, pellentesque at felis. Nullam et accumsan leo, in scelerisque massa. Fusce luctus laoreet pretium. Nulla sollicitudin volutpat neque in mattis. Vestibulum non placerat velit. Aenean dui nunc, tincidunt nec tempus et, venenatis vel magna. Interdum et malesuada fames ac ante ipsum primis in faucibus. Proin pretium nisl sit amet lacus varius consequat. Donec congue molestie mauris, a vehicula velit. Nam pellentesque sed arcu congue rutrum. Maecenas pulvinar ex at diam dapibus consectetur ut non nisl. Sed tempus bibendum sodales. Donec nec arcu ligula. Vivamus sit amet aliquet neque, vel volutpat nibh. In purus sem, tincidunt vulputate neque eu, scelerisque hendrerit ex. Donec eu porta lectus, at malesuada magna. Duis ut egesta
 s est. Nullam et libero sit amet lectus tempus pharetra ac id mauris. Ut diam orci, interdum nec suscipit ut, semper nec orci. Fusce sed risus elementum, posuere orci id, aliquam urna. Donec arcu turpis, scelerisque a mauris vel, vehicula convallis ipsum. Phasellus facilisis, magna ut dapibus pretium, sapien mauris viverra enim, ut hendrerit urna dui eu ligula. Nulla vestibulum et nibh quis laoreet. Quisque feugiat arcu ipsum, id mollis quam sagittis at. Morbi tempus, risus molestie ultricies viverra, justo augue facilisis orci, a semper risus dui pellentesque purus. Curabitur facilisis arcu quam, id facilisis turpis aliquam ac. Maecenas efficitur risus pellentesque sem maximus euismod. Proin aliquet justo ac dolor faucibus porttitor. Fusce orci lectus, eleifend at lectus sit amet, pretium ornare felis. Nullam nec ipsum maximus, molestie arcu in, finibus urna. Suspendisse tincidunt feugiat est, in viverra lectus tincidunt quis. Ut eros tortor, tincidunt vel commodo hendrerit
 , consequat vel neque. Vestibulum enim nibh, accumsan quis viverra ut, iaculis sit amet est. Morbi non lacus at dolor euismod molestie. Integer pulvinar, nibh in volutpat tincidunt, urna odio interdum magna, vitae faucibus felis quam nec est. Proin tellus quam, auctor nec dictum sed, rhoncus nec massa. Mauris ac arcu ac augue porta viverra. Quisque semper eget nisi quis viverra. Donec vitae mauris ipsum. Duis tempor pulvinar viverra. Nam dignissim iaculis felis, eget vestibulum eros. Nulla eget faucibus massa. Integer sollicitudin pretium erat, vel commodo nunc congue non. Nulla in nunc auctor dui efficitur euismod. Sed pharetra sapien erat, a blandit neque porttitor sit amet. Mauris pharetra sodales maximus. Nulla volutpat auctor quam, a elementum risus tristique eu. In ac sodales nibh. Maecenas pharetra orci sem, eu laoreet quam tincidunt non. Mauris in interdum dui. Vivamus et interdum erat. Aliquam nec ante tincidunt, elementum risus in, mattis orci. Sed massa turpis, bl
 andit a rutrum at, dignissim et lectus. Nunc tincidunt orci nibh, id ullamcorper nisl vestibulum vel.&lt;/div&gt;
+&lt;div style=&quot;letter-spacing: 3px&quot;&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec consequat rhoncus erat, id pellentesque ligula aliquet et. Nam aliquam pellentesque risus. Mauris lorem nunc, sodales pellentesque porttitor ut, pellentesque at felis. Nullam et accumsan leo, in scelerisque massa. Fusce luctus laoreet pretium. Nulla sollicitudin volutpat neque in mattis. Vestibulum non placerat velit. Aenean dui nunc, tincidunt nec tempus et, venenatis vel magna. Interdum et malesuada fames ac ante ipsum primis in faucibus. Proin pretium nisl sit amet lacus varius consequat. Donec congue molestie mauris, a vehicula velit. Nam pellentesque sed arcu congue rutrum. Maecenas pulvinar ex at diam dapibus consectetur ut non nisl. Sed tempus bibendum sodales. Donec nec arcu ligula. Vivamus sit amet aliquet neque, vel volutpat nibh. In purus sem, tincidunt vulputate neque eu, scelerisque hendrerit ex. Donec eu porta lectus, at malesuada magna. Duis ut egest
 as est. Nullam et libero sit amet lectus tempus pharetra ac id mauris. Ut diam orci, interdum nec suscipit ut, semper nec orci. Fusce sed risus elementum, posuere orci id, aliquam urna. Donec arcu turpis, scelerisque a mauris vel, vehicula convallis ipsum. Phasellus facilisis, magna ut dapibus pretium, sapien mauris viverra enim, ut hendrerit urna dui eu ligula. Nulla vestibulum et nibh quis laoreet. Quisque feugiat arcu ipsum, id mollis quam sagittis at. Morbi tempus, risus molestie ultricies viverra, justo augue facilisis orci, a semper risus dui pellentesque purus. Curabitur facilisis arcu quam, id facilisis turpis aliquam ac. Maecenas efficitur risus pellentesque sem maximus euismod. Proin aliquet justo ac dolor faucibus porttitor. Fusce orci lectus, eleifend at lectus sit amet, pretium ornare felis. Nullam nec ipsum maximus, molestie arcu in, finibus urna. Suspendisse tincidunt feugiat est, in viverra lectus tincidunt quis. Ut eros tortor, tincidunt vel commodo hendreri
 t, consequat vel neque. Vestibulum enim nibh, accumsan quis viverra ut, iaculis sit amet est. Morbi non lacus at dolor euismod molestie. Integer pulvinar, nibh in volutpat tincidunt, urna odio interdum magna, vitae faucibus felis quam nec est. Proin tellus quam, auctor nec dictum sed, rhoncus nec massa. Mauris ac arcu ac augue porta viverra. Quisque semper eget nisi quis viverra. Donec vitae mauris ipsum. Duis tempor pulvinar viverra. Nam dignissim iaculis felis, eget vestibulum eros. Nulla eget faucibus massa. Integer sollicitudin pretium erat, vel commodo nunc congue non. Nulla in nunc auctor dui efficitur euismod. Sed pharetra sapien erat, a blandit neque porttitor sit amet. Mauris pharetra sodales maximus. Nulla volutpat auctor quam, a elementum risus tristique eu. In ac sodales nibh. Maecenas pharetra orci sem, eu laoreet quam tincidunt non. Mauris in interdum dui. Vivamus et interdum erat. Aliquam nec ante tincidunt, elementum risus in, mattis orci. Sed massa turpis, b
 landit a rutrum at, dignissim et lectus. Nunc tincidunt orci nibh, id ullamcorper nisl vestibulum vel.&lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (211107 => 211108)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2017-01-24 21:23:05 UTC (rev 211107)
+++ trunk/Source/WebCore/ChangeLog        2017-01-24 21:38:20 UTC (rev 211108)
</span><span class="lines">@@ -1,3 +1,57 @@
</span><ins>+2017-01-24  Zalan Bujtas  &lt;zalan@apple.com&gt;
+
+        Simple line layout: Add support for hyphen: auto.
+        https://bugs.webkit.org/show_bug.cgi?id=167297
+        &lt;rdar://problem/30119463&gt;
+
+        Reviewed by Antti Koivisto.
+
+        Implement hyphen: auto for simple line layout. 
+
+        Tests: fast/text/simple-line-hyphens-with-text-align.html
+               fast/text/simple-line-hyphens-with-word-letter-spacing.html
+
+        * platform/text/Hyphenation.h:
+        (WebCore::enoughWidthForHyphenation):
+        * rendering/RenderTreeAsText.cpp:
+        (WebCore::writeSimpleLine):
+        (WebCore::write):
+        * rendering/SimpleLineLayout.cpp:
+        (WebCore::SimpleLineLayout::canUseForStyle):
+        (WebCore::SimpleLineLayout::LineState::appendFragmentAndCreateRunIfNeeded): Inherit the hyphen attribute from the
+        run-to-be-appended. Ensure that we don't append additional runs when the last run has hyphen.
+        (WebCore::SimpleLineLayout::splitFragmentToFitLine): Before calling into the lastHyphenPosition() we need to
+        ensure that the hyphen would surely fit (even on the splitting position).
+        (WebCore::SimpleLineLayout::createLineRuns): Probe hypenation for overhanging non-whitespace runs. 
+        (WebCore::SimpleLineLayout::printReason):
+        * rendering/SimpleLineLayout.h:
+        (WebCore::SimpleLineLayout::Run::Run):
+        * rendering/SimpleLineLayoutFlowContents.h:
+        (WebCore::SimpleLineLayout::FlowContents::Segment::toSegmentPosition):
+        (WebCore::SimpleLineLayout::FlowContents::Segment::toRenderPosition):
+        * rendering/SimpleLineLayoutResolver.cpp:
+        (WebCore::SimpleLineLayout::RunResolver::Run::Run):
+        (WebCore::SimpleLineLayout::RunResolver::Run::constructStringForHyphenIfNeeded):
+        (WebCore::SimpleLineLayout::RunResolver::Run::text):
+        * rendering/SimpleLineLayoutResolver.h:
+        (WebCore::SimpleLineLayout::RunResolver::Run::hasHyphen):
+        * rendering/SimpleLineLayoutTextFragmentIterator.cpp:
+        (WebCore::SimpleLineLayout::TextFragmentIterator::Style::Style):
+        (WebCore::SimpleLineLayout::TextFragmentIterator::nextBreakablePosition):
+        (WebCore::SimpleLineLayout::TextFragmentIterator::nextNonWhitespacePosition):
+        (WebCore::SimpleLineLayout::TextFragmentIterator::textWidth):
+        (WebCore::SimpleLineLayout::TextFragmentIterator::lastHyphenPosition): We only check the actual run for hyphenation ignoring
+        the neighboring runs. This might need to be changed in the future.
+        (WebCore::SimpleLineLayout::TextFragmentIterator::runWidth):
+        * rendering/SimpleLineLayoutTextFragmentIterator.h:
+        (WebCore::SimpleLineLayout::TextFragmentIterator::TextFragment::TextFragment):
+        (WebCore::SimpleLineLayout::TextFragmentIterator::TextFragment::hasHyphen):
+        (WebCore::SimpleLineLayout::TextFragmentIterator::TextFragment::operator==):
+        (WebCore::SimpleLineLayout::TextFragmentIterator::TextFragment::split):
+        (WebCore::SimpleLineLayout::TextFragmentIterator::TextFragment::splitWithHyphen):
+        * rendering/line/BreakingContext.h:
+        (WebCore::tryHyphenating):
+
</ins><span class="cx"> 2017-01-24  Matt Rajca  &lt;mrajca@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Pass down website autoplay policies to media elements
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformtextHyphenationh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/text/Hyphenation.h (211107 => 211108)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/text/Hyphenation.h        2017-01-24 21:23:05 UTC (rev 211107)
+++ trunk/Source/WebCore/platform/text/Hyphenation.h        2017-01-24 21:38:20 UTC (rev 211108)
</span><span class="lines">@@ -31,6 +31,13 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><ins>+inline static bool enoughWidthForHyphenation(float availableWidth, float fontPixelSize)
+{
+    // If the maximum width available for the prefix before the hyphen is small, then it is very unlikely
+    // that an hyphenation opportunity exists, so do not bother to look for it.
+    return availableWidth &gt; fontPixelSize * 5 / 4;
+
+}
</ins><span class="cx"> bool canHyphenate(const AtomicString&amp; localeIdentifier);
</span><span class="cx"> size_t lastHyphenLocation(StringView, size_t beforeIndex, const AtomicString&amp; localeIdentifier);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingRenderTreeAsTextcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/RenderTreeAsText.cpp (211107 => 211108)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/RenderTreeAsText.cpp        2017-01-24 21:23:05 UTC (rev 211107)
+++ trunk/Source/WebCore/rendering/RenderTreeAsText.cpp        2017-01-24 21:38:20 UTC (rev 211108)
</span><span class="lines">@@ -493,18 +493,23 @@
</span><span class="cx">     ts &lt;&lt; &quot;\n&quot;;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static void writeSimpleLine(TextStream&amp; ts, const RenderText&amp; o, const FloatRect&amp; rect, StringView text)
</del><ins>+static void writeSimpleLine(TextStream&amp; ts, const RenderText&amp; renderText, const SimpleLineLayout::RunResolver::Run&amp; run)
</ins><span class="cx"> {
</span><ins>+    auto rect = run.rect();
</ins><span class="cx">     int x = rect.x();
</span><span class="cx">     int y = rect.y();
</span><span class="cx">     int logicalWidth = ceilf(rect.x() + rect.width()) - x;
</span><span class="cx"> 
</span><del>-    if (is&lt;RenderTableCell&gt;(*o.containingBlock()))
-        y -= floorToInt(downcast&lt;RenderTableCell&gt;(*o.containingBlock()).intrinsicPaddingBefore());
-        
</del><ins>+    if (is&lt;RenderTableCell&gt;(*renderText.containingBlock()))
+        y -= floorToInt(downcast&lt;RenderTableCell&gt;(*renderText.containingBlock()).intrinsicPaddingBefore());
+
</ins><span class="cx">     ts &lt;&lt; &quot;text run at (&quot; &lt;&lt; x &lt;&lt; &quot;,&quot; &lt;&lt; y &lt;&lt; &quot;) width &quot; &lt;&lt; logicalWidth;
</span><del>-    ts &lt;&lt; &quot;: &quot;
-        &lt;&lt; quoteAndEscapeNonPrintables(text);
</del><ins>+    if (run.hasHyphen()) {
+        ts &lt;&lt; &quot;: &quot; &lt;&lt; quoteAndEscapeNonPrintables(run.text().substring(0, run.text().length() - 1));
+        ts &lt;&lt; &quot; + hyphen string &quot; &lt;&lt; quoteAndEscapeNonPrintables(renderText.style().hyphenString().string());
+    } else
+        ts &lt;&lt; &quot;: &quot; &lt;&lt; quoteAndEscapeNonPrintables(run.text());
+
</ins><span class="cx">     ts &lt;&lt; &quot;\n&quot;;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -555,7 +560,7 @@
</span><span class="cx">             auto resolver = runResolver(downcast&lt;RenderBlockFlow&gt;(*text.parent()), *layout);
</span><span class="cx">             for (const auto&amp; run : resolver.rangeForRenderer(text)) {
</span><span class="cx">                 writeIndent(ts, indent + 1);
</span><del>-                writeSimpleLine(ts, text, run.rect(), run.text());
</del><ins>+                writeSimpleLine(ts, text, run);
</ins><span class="cx">             }
</span><span class="cx">         } else {
</span><span class="cx">             for (auto* box = text.firstTextBox(); box; box = box-&gt;nextTextBox()) {
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingSimpleLineLayoutcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/SimpleLineLayout.cpp (211107 => 211108)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/SimpleLineLayout.cpp        2017-01-24 21:23:05 UTC (rev 211107)
+++ trunk/Source/WebCore/rendering/SimpleLineLayout.cpp        2017-01-24 21:38:20 UTC (rev 211108)
</span><span class="lines">@@ -33,6 +33,7 @@
</span><span class="cx"> #include &quot;HitTestLocation.h&quot;
</span><span class="cx"> #include &quot;HitTestRequest.h&quot;
</span><span class="cx"> #include &quot;HitTestResult.h&quot;
</span><ins>+#include &quot;Hyphenation.h&quot;
</ins><span class="cx"> #include &quot;InlineTextBox.h&quot;
</span><span class="cx"> #include &quot;LineWidth.h&quot;
</span><span class="cx"> #include &quot;Logging.h&quot;
</span><span class="lines">@@ -85,7 +86,7 @@
</span><span class="cx">     FlowHasRTLOrdering                    = 1LLU  &lt;&lt; 20,
</span><span class="cx">     FlowHasLineAlignEdges                 = 1LLU  &lt;&lt; 21,
</span><span class="cx">     FlowHasLineSnap                       = 1LLU  &lt;&lt; 22,
</span><del>-    FlowHasHypensAuto                     = 1LLU  &lt;&lt; 23,
</del><ins>+    FlowHasHypensLimit                    = 1LLU  &lt;&lt; 23,
</ins><span class="cx">     FlowHasTextEmphasisFillOrMark         = 1LLU  &lt;&lt; 24,
</span><span class="cx">     FlowHasTextShadow                     = 1LLU  &lt;&lt; 25,
</span><span class="cx">     FlowHasPseudoFirstLine                = 1LLU  &lt;&lt; 26,
</span><span class="lines">@@ -236,8 +237,10 @@
</span><span class="cx">         SET_REASON_AND_RETURN_IF_NEEDED(FlowHasLineAlignEdges, reasons, includeReasons);
</span><span class="cx">     if (style.lineSnap() != LineSnapNone)
</span><span class="cx">         SET_REASON_AND_RETURN_IF_NEEDED(FlowHasLineSnap, reasons, includeReasons);
</span><del>-    if (style.hyphens() == HyphensAuto)
-        SET_REASON_AND_RETURN_IF_NEEDED(FlowHasHypensAuto, reasons, includeReasons);
</del><ins>+    if (style.hyphenationLimitBefore() != RenderStyle::initialHyphenationLimitBefore()
+        || style.hyphenationLimitAfter() != RenderStyle::initialHyphenationLimitAfter()
+        || style.hyphenationLimitLines() != RenderStyle::initialHyphenationLimitLines())
+        SET_REASON_AND_RETURN_IF_NEEDED(FlowHasHypensLimit, reasons, includeReasons);
</ins><span class="cx">     if (style.textEmphasisFill() != TextEmphasisFillFilled || style.textEmphasisMark() != TextEmphasisMarkNone)
</span><span class="cx">         SET_REASON_AND_RETURN_IF_NEEDED(FlowHasTextEmphasisFillOrMark, reasons, includeReasons);
</span><span class="cx">     if (style.textShadow())
</span><span class="lines">@@ -453,7 +456,7 @@
</span><span class="cx">         unsigned endPosition = fragment.isCollapsed() ? fragment.start() + 1 : fragment.end();
</span><span class="cx">         // New line needs new run.
</span><span class="cx">         if (!m_runsWidth)
</span><del>-            runs.append(Run(fragment.start(), endPosition, m_runsWidth, m_runsWidth + fragment.width(), false));
</del><ins>+            runs.append(Run(fragment.start(), endPosition, m_runsWidth, m_runsWidth + fragment.width(), false, fragment.hasHyphen()));
</ins><span class="cx">         else {
</span><span class="cx">             const auto&amp; lastFragment = m_fragments.last();
</span><span class="cx">             // Advance last completed fragment when the previous fragment is all set (including multiple parts across renderers)
</span><span class="lines">@@ -470,11 +473,13 @@
</span><span class="cx">                 return;
</span><span class="cx">             }
</span><span class="cx">             if (lastFragment.isLastInRenderer() || lastFragment.isCollapsed())
</span><del>-                runs.append(Run(fragment.start(), endPosition, m_runsWidth, m_runsWidth + fragment.width(), false));
</del><ins>+                runs.append(Run(fragment.start(), endPosition, m_runsWidth, m_runsWidth + fragment.width(), false, fragment.hasHyphen()));
</ins><span class="cx">             else {
</span><span class="cx">                 Run&amp; lastRun = runs.last();
</span><span class="cx">                 lastRun.end = endPosition;
</span><span class="cx">                 lastRun.logicalRight += fragment.width();
</span><ins>+                ASSERT(!lastRun.hasHyphen);
+                lastRun.hasHyphen = fragment.hasHyphen();
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">         m_fragments.append(fragment);
</span><span class="lines">@@ -623,8 +628,26 @@
</span><span class="cx">         return availableWidth &lt; textFragmentIterator.textWidth(start, index + 1, 0);
</span><span class="cx">     });
</span><span class="cx">     unsigned splitPosition = (*it);
</span><del>-    if (keepAtLeastOneCharacter &amp;&amp; splitPosition == fragmentToSplit.start())
-        ++splitPosition;
</del><ins>+    auto&amp; style = textFragmentIterator.style();
+    // Does first character fit this line?
+    if (splitPosition == fragmentToSplit.start()) {
+        if (keepAtLeastOneCharacter)
+            ++splitPosition;
+    } else if (style.shouldHyphenate &amp;&amp; enoughWidthForHyphenation(availableWidth, style.font.pixelSize())) {
+        // We might be able to fit the hyphen at the split position.
+        auto splitPositionWithHyphen = splitPosition;
+        // Find a splitting position where hyphen surely fits.
+        auto leftSideWidth = textFragmentIterator.textWidth(start, splitPosition, 0);
+        while (leftSideWidth + style.hyphenStringWidth &gt; availableWidth) {
+            if (--splitPositionWithHyphen &lt;= start)
+                break; // No space for hyphen.
+            leftSideWidth -= textFragmentIterator.textWidth(splitPositionWithHyphen, splitPositionWithHyphen + 1, 0);
+        }
+        if (splitPositionWithHyphen &gt; start) {
+            if (auto hyphenPosition = textFragmentIterator.lastHyphenPosition(fragmentToSplit, splitPositionWithHyphen + 1))
+                return fragmentToSplit.splitWithHyphen(*hyphenPosition, textFragmentIterator);
+        }
+    }
</ins><span class="cx">     return fragmentToSplit.split(splitPosition, textFragmentIterator);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -736,8 +759,20 @@
</span><span class="cx">                 line.appendFragmentAndCreateRunIfNeeded(fragment, runs);
</span><span class="cx">                 break;
</span><span class="cx">             }
</span><ins>+            ASSERT(fragment.type() == TextFragmentIterator::TextFragment::NonWhitespace);
+            // Find out if this non-whitespace fragment has a hyphen where we can break.
+            if (style.shouldHyphenate) {
+                auto fragmentToSplit = fragment;
+                // Split and check if we actually ended up with a hyphen.
+                auto overflowFragment = splitFragmentToFitLine(fragmentToSplit, line.availableWidth() - line.width(), emptyLine, textFragmentIterator);
+                if (fragmentToSplit.hasHyphen()) {
+                    line.setOverflowedFragment(overflowFragment);
+                    line.appendFragmentAndCreateRunIfNeeded(fragmentToSplit, runs);
+                    break;
+                }
+                // No hyphen, no split.
+            }
</ins><span class="cx">             // Non-breakable non-whitespace first fragment. Add it to the current line. -it overflows though.
</span><del>-            ASSERT(fragment.type() == TextFragmentIterator::TextFragment::NonWhitespace);
</del><span class="cx">             if (emptyLine) {
</span><span class="cx">                 forceFragmentToLine(line, textFragmentIterator, runs, fragment);
</span><span class="cx">                 break;
</span><span class="lines">@@ -956,8 +991,8 @@
</span><span class="cx">     case FlowHasLineSnap:
</span><span class="cx">         stream &lt;&lt; &quot;-webkit-line-snap property&quot;;
</span><span class="cx">         break;
</span><del>-    case FlowHasHypensAuto:
-        stream &lt;&lt; &quot;hyphen: auto&quot;;
</del><ins>+    case FlowHasHypensLimit:
+        stream &lt;&lt; &quot;hyphen-limit-* property&quot;;
</ins><span class="cx">         break;
</span><span class="cx">     case FlowHasTextEmphasisFillOrMark:
</span><span class="cx">         stream &lt;&lt; &quot;text-emphasis (fill/mark)&quot;;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingSimpleLineLayouth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/SimpleLineLayout.h (211107 => 211108)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/SimpleLineLayout.h        2017-01-24 21:23:05 UTC (rev 211107)
+++ trunk/Source/WebCore/rendering/SimpleLineLayout.h        2017-01-24 21:38:20 UTC (rev 211108)
</span><span class="lines">@@ -46,17 +46,19 @@
</span><span class="cx"> #if COMPILER(MSVC)
</span><span class="cx">     Run() { }
</span><span class="cx"> #endif
</span><del>-    Run(unsigned start, unsigned end, float logicalLeft, float logicalRight, bool isEndOfLine)
-        : start(start)
-        , end(end)
</del><ins>+    Run(unsigned start, unsigned end, float logicalLeft, float logicalRight, bool isEndOfLine, bool hasHyphen)
+        : end(end)
+        , start(start)
</ins><span class="cx">         , isEndOfLine(isEndOfLine)
</span><ins>+        , hasHyphen(hasHyphen)
</ins><span class="cx">         , logicalLeft(logicalLeft)
</span><span class="cx">         , logicalRight(logicalRight)
</span><span class="cx">     { }
</span><span class="cx"> 
</span><del>-    unsigned start;
-    unsigned end : 31;
</del><ins>+    unsigned end;
+    unsigned start : 30;
</ins><span class="cx">     unsigned isEndOfLine : 1;
</span><ins>+    unsigned hasHyphen : 1;
</ins><span class="cx">     float logicalLeft;
</span><span class="cx">     float logicalRight;
</span><span class="cx">     // TODO: Move these optional items out of SimpleLineLayout::Run to a supplementary structure.
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingSimpleLineLayoutFlowContentsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/SimpleLineLayoutFlowContents.h (211107 => 211108)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/SimpleLineLayoutFlowContents.h        2017-01-24 21:23:05 UTC (rev 211107)
+++ trunk/Source/WebCore/rendering/SimpleLineLayoutFlowContents.h        2017-01-24 21:38:20 UTC (rev 211108)
</span><span class="lines">@@ -37,6 +37,12 @@
</span><span class="cx">     FlowContents(const RenderBlockFlow&amp;);
</span><span class="cx"> 
</span><span class="cx">     struct Segment {
</span><ins>+        unsigned toSegmentPosition(unsigned position) const
+        {
+            ASSERT(position &gt;= start);
+            return position - start;
+        }
+        unsigned toRenderPosition(unsigned position) const { return start + position; }
</ins><span class="cx">         unsigned start;
</span><span class="cx">         unsigned end;
</span><span class="cx">         String text;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingSimpleLineLayoutResolvercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/SimpleLineLayoutResolver.cpp (211107 => 211108)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/SimpleLineLayoutResolver.cpp        2017-01-24 21:23:05 UTC (rev 211107)
+++ trunk/Source/WebCore/rendering/SimpleLineLayoutResolver.cpp        2017-01-24 21:38:20 UTC (rev 211108)
</span><span class="lines">@@ -47,8 +47,21 @@
</span><span class="cx"> RunResolver::Run::Run(const Iterator&amp; iterator)
</span><span class="cx">     : m_iterator(iterator)
</span><span class="cx"> {
</span><ins>+    constructStringForHyphenIfNeeded();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void RunResolver::Run::constructStringForHyphenIfNeeded()
+{
+    auto&amp; run = m_iterator.simpleRun();
+    if (!run.hasHyphen)
+        return;
+    // Empty runs should not have hyphen.
+    ASSERT(run.start &lt; run.end);
+    auto&amp; segment = m_iterator.resolver().m_flowContents.segmentForRun(run.start, run.end);
+    auto text = StringView(segment.text).substring(segment.toSegmentPosition(run.start), run.end - run.start);
+    m_textWithHyphen = makeString(text, m_iterator.resolver().flow().style().hyphenString());
+}
+
</ins><span class="cx"> FloatRect RunResolver::Run::rect() const
</span><span class="cx"> {
</span><span class="cx">     auto&amp; run = m_iterator.simpleRun();
</span><span class="lines">@@ -69,12 +82,14 @@
</span><span class="cx"> 
</span><span class="cx"> StringView RunResolver::Run::text() const
</span><span class="cx"> {
</span><ins>+    if (m_textWithHyphen)
+        return StringView(*m_textWithHyphen);
</ins><span class="cx">     auto&amp; run = m_iterator.simpleRun();
</span><span class="cx">     ASSERT(run.start &lt; run.end);
</span><span class="cx">     auto&amp; segment = m_iterator.resolver().m_flowContents.segmentForRun(run.start, run.end);
</span><span class="cx">     // We currently split runs on segment boundaries (different RenderObject).
</span><span class="cx">     ASSERT(run.end &lt;= segment.end);
</span><del>-    return StringView(segment.text).substring(run.start - segment.start, run.end - run.start);
</del><ins>+    return StringView(segment.text).substring(segment.toSegmentPosition(run.start), run.end - run.start);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> RunResolver::Iterator::Iterator(const RunResolver&amp; resolver, unsigned runIndex, unsigned lineIndex)
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingSimpleLineLayoutResolverh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/SimpleLineLayoutResolver.h (211107 => 211108)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/SimpleLineLayoutResolver.h        2017-01-24 21:23:05 UTC (rev 211107)
+++ trunk/Source/WebCore/rendering/SimpleLineLayoutResolver.h        2017-01-24 21:38:20 UTC (rev 211108)
</span><span class="lines">@@ -65,13 +65,16 @@
</span><span class="cx">         int baselinePosition() const;
</span><span class="cx">         StringView text() const;
</span><span class="cx">         bool isEndOfLine() const;
</span><ins>+        bool hasHyphen() const { return m_iterator.simpleRun().hasHyphen; }
</ins><span class="cx"> 
</span><span class="cx">         unsigned lineIndex() const;
</span><span class="cx"> 
</span><span class="cx">     private:
</span><span class="cx">         float computeBaselinePosition() const;
</span><ins>+        void constructStringForHyphenIfNeeded();
</ins><span class="cx"> 
</span><span class="cx">         const Iterator&amp; m_iterator;
</span><ins>+        std::optional&lt;String&gt; m_textWithHyphen;
</ins><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx">     class Iterator {
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingSimpleLineLayoutTextFragmentIteratorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/SimpleLineLayoutTextFragmentIterator.cpp (211107 => 211108)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/SimpleLineLayoutTextFragmentIterator.cpp        2017-01-24 21:23:05 UTC (rev 211107)
+++ trunk/Source/WebCore/rendering/SimpleLineLayoutTextFragmentIterator.cpp        2017-01-24 21:38:20 UTC (rev 211108)
</span><span class="lines">@@ -26,6 +26,7 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;SimpleLineLayoutTextFragmentIterator.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;Hyphenation.h&quot;
</ins><span class="cx"> #include &quot;RenderBlockFlow.h&quot;
</span><span class="cx"> #include &quot;RenderChildIterator.h&quot;
</span><span class="cx"> #include &quot;SimpleLineLayoutFlowContents.h&quot;
</span><span class="lines">@@ -46,6 +47,8 @@
</span><span class="cx">     , spaceWidth(font.width(TextRun(StringView(&amp;space, 1))))
</span><span class="cx">     , wordSpacing(font.wordSpacing())
</span><span class="cx">     , tabWidth(collapseWhitespace ? 0 : style.tabSize())
</span><ins>+    , shouldHyphenate(style.hyphens() == HyphensAuto &amp;&amp; canHyphenate(style.locale()))
+    , hyphenStringWidth(shouldHyphenate ? font.width(TextRun(style.hyphenString())) : 0)
</ins><span class="cx">     , locale(style.locale())
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="lines">@@ -143,8 +146,7 @@
</span><span class="cx">         m_lineBreakIterator.setPriorContext(lastCharacter, secondToLastCharacter);
</span><span class="cx">         m_lineBreakIterator.resetStringAndReleaseIterator(segment.text, m_style.locale, LineBreakIteratorMode::Default);
</span><span class="cx">     }
</span><del>-    unsigned segmentPosition = startPosition - segment.start;
-    return segment.start + nextBreakablePositionInSegment(m_lineBreakIterator, segmentPosition, m_style.breakNBSP, m_style.keepAllWordsForCJK);
</del><ins>+    return segment.toRenderPosition(nextBreakablePositionInSegment(m_lineBreakIterator, segment.toSegmentPosition(startPosition), m_style.breakNBSP, m_style.keepAllWordsForCJK));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template &lt;typename CharacterType&gt;
</span><span class="lines">@@ -154,7 +156,7 @@
</span><span class="cx">     const auto* text = segment.text.characters&lt;CharacterType&gt;();
</span><span class="cx">     unsigned position = startPosition;
</span><span class="cx">     for (; position &lt; segment.end; ++position) {
</span><del>-        auto character = text[position - segment.start];
</del><ins>+        auto character = text[segment.toSegmentPosition(position)];
</ins><span class="cx">         bool isWhitespace = character == ' ' || character == '\t' || (!m_style.preserveNewline &amp;&amp; character == '\n');
</span><span class="cx">         if (!isWhitespace)
</span><span class="cx">             return position;
</span><span class="lines">@@ -170,10 +172,28 @@
</span><span class="cx">     if (!m_style.font.size())
</span><span class="cx">         return 0;
</span><span class="cx">     if (m_style.font.isFixedPitch() || (from == segment.start &amp;&amp; to == segment.end))
</span><del>-        return downcast&lt;RenderText&gt;(segment.renderer).width(from - segment.start, to - from, m_style.font, xPosition, nullptr, nullptr);
</del><ins>+        return downcast&lt;RenderText&gt;(segment.renderer).width(segment.toSegmentPosition(from), to - from, m_style.font, xPosition, nullptr, nullptr);
</ins><span class="cx">     return runWidth(segment, from, to, xPosition);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+std::optional&lt;unsigned&gt; TextFragmentIterator::lastHyphenPosition(const TextFragmentIterator::TextFragment&amp; run, unsigned beforeIndex) const
+{
+    ASSERT(run.start() &lt; beforeIndex);
+    auto&amp; segment = *m_currentSegment;
+    ASSERT(segment.start &lt;= beforeIndex &amp;&amp; beforeIndex &lt;= segment.end);
+    ASSERT(is&lt;RenderText&gt;(segment.renderer));
+    if (!m_style.shouldHyphenate || run.type() != TextFragment::NonWhitespace)
+        return std::nullopt;
+    
+    auto runStart = segment.toSegmentPosition(run.start());
+    auto before = segment.toSegmentPosition(beforeIndex) - runStart;
+    auto substringForHyphenation = StringView(segment.text).substring(runStart, run.end() - run.start());
+    auto hyphenLocation = lastHyphenLocation(substringForHyphenation, before, m_style.locale);
+    if (hyphenLocation)
+        return segment.toRenderPosition(hyphenLocation + runStart);
+    return std::nullopt;
+}
+
</ins><span class="cx"> unsigned TextFragmentIterator::skipToNextPosition(PositionType positionType, unsigned startPosition, float&amp; width, float xPosition, bool&amp; overlappingFragment)
</span><span class="cx"> {
</span><span class="cx">     overlappingFragment = false;
</span><span class="lines">@@ -219,8 +239,8 @@
</span><span class="cx">     ASSERT(startPosition &lt;= endPosition);
</span><span class="cx">     if (startPosition == endPosition)
</span><span class="cx">         return 0;
</span><del>-    unsigned segmentFrom = startPosition - segment.start;
-    unsigned segmentTo = endPosition - segment.start;
</del><ins>+    unsigned segmentFrom = segment.toSegmentPosition(startPosition);
+    unsigned segmentTo = segment.toSegmentPosition(endPosition);
</ins><span class="cx">     bool measureWithEndSpace = m_style.collapseWhitespace &amp;&amp; segmentTo &lt; segment.text.length() &amp;&amp; segment.text[segmentTo] == ' ';
</span><span class="cx">     if (measureWithEndSpace)
</span><span class="cx">         ++segmentTo;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingSimpleLineLayoutTextFragmentIteratorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/SimpleLineLayoutTextFragmentIterator.h (211107 => 211108)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/SimpleLineLayoutTextFragmentIterator.h        2017-01-24 21:23:05 UTC (rev 211107)
+++ trunk/Source/WebCore/rendering/SimpleLineLayoutTextFragmentIterator.h        2017-01-24 21:38:20 UTC (rev 211108)
</span><span class="lines">@@ -43,7 +43,7 @@
</span><span class="cx">     public:
</span><span class="cx">         enum Type { ContentEnd, SoftLineBreak, HardLineBreak, Whitespace, NonWhitespace };
</span><span class="cx">         TextFragment() = default;
</span><del>-        TextFragment(unsigned start, unsigned end, float width, Type type, bool isLastInRenderer = false, bool overlapsToNextRenderer = false, bool isCollapsed = false, bool isCollapsible = false)
</del><ins>+        TextFragment(unsigned start, unsigned end, float width, Type type, bool isLastInRenderer = false, bool overlapsToNextRenderer = false, bool isCollapsed = false, bool isCollapsible = false, bool hasHyphen = false)
</ins><span class="cx">             : m_start(start)
</span><span class="cx">             , m_end(end)
</span><span class="cx">             , m_width(width)
</span><span class="lines">@@ -52,6 +52,7 @@
</span><span class="cx">             , m_overlapsToNextRenderer(overlapsToNextRenderer)
</span><span class="cx">             , m_isCollapsed(isCollapsed)
</span><span class="cx">             , m_isCollapsible(isCollapsible)
</span><ins>+            , m_hasHyphen(hasHyphen)
</ins><span class="cx">         {
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -64,9 +65,11 @@
</span><span class="cx">         bool isLineBreak() const { return m_type == SoftLineBreak || m_type == HardLineBreak; }
</span><span class="cx">         bool isCollapsed() const { return m_isCollapsed; }
</span><span class="cx">         bool isCollapsible() const { return m_isCollapsible; }
</span><ins>+        bool hasHyphen() const { return m_hasHyphen; }
</ins><span class="cx"> 
</span><span class="cx">         bool isEmpty() const { return start() == end() &amp;&amp; !isLineBreak(); }
</span><span class="cx">         TextFragment split(unsigned splitPosition, const TextFragmentIterator&amp;);
</span><ins>+        TextFragment splitWithHyphen(unsigned hyphenPosition, const TextFragmentIterator&amp;);
</ins><span class="cx">         bool operator==(const TextFragment&amp; other) const
</span><span class="cx">         {
</span><span class="cx">             return m_start == other.m_start
</span><span class="lines">@@ -76,7 +79,8 @@
</span><span class="cx">                 &amp;&amp; m_isLastInRenderer == other.m_isLastInRenderer
</span><span class="cx">                 &amp;&amp; m_overlapsToNextRenderer == other.m_overlapsToNextRenderer
</span><span class="cx">                 &amp;&amp; m_isCollapsed == other.m_isCollapsed
</span><del>-                &amp;&amp; m_isCollapsible == other.m_isCollapsible;
</del><ins>+                &amp;&amp; m_isCollapsible == other.m_isCollapsible
+                &amp;&amp; m_hasHyphen == other.m_hasHyphen;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">     private:
</span><span class="lines">@@ -88,10 +92,14 @@
</span><span class="cx">         bool m_overlapsToNextRenderer { false };
</span><span class="cx">         bool m_isCollapsed { false };
</span><span class="cx">         bool m_isCollapsible { false };
</span><ins>+        bool m_hasHyphen { false };
</ins><span class="cx">     };
</span><span class="cx">     TextFragment nextTextFragment(float xPosition = 0);
</span><span class="cx">     void revertToEndOfFragment(const TextFragment&amp;);
</span><ins>+
+    // FIXME: These functions below should be decoupled from the text iterator.
</ins><span class="cx">     float textWidth(unsigned startPosition, unsigned endPosition, float xPosition) const;
</span><ins>+    std::optional&lt;unsigned&gt; lastHyphenPosition(const TextFragmentIterator::TextFragment&amp; run, unsigned beforeIndex) const;
</ins><span class="cx"> 
</span><span class="cx">     struct Style {
</span><span class="cx">         explicit Style(const RenderStyle&amp;);
</span><span class="lines">@@ -108,6 +116,8 @@
</span><span class="cx">         float spaceWidth;
</span><span class="cx">         float wordSpacing;
</span><span class="cx">         unsigned tabWidth;
</span><ins>+        bool shouldHyphenate;
+        float hyphenStringWidth;
</ins><span class="cx">         AtomicString locale;
</span><span class="cx">     };
</span><span class="cx">     const Style&amp; style() const { return m_style; }
</span><span class="lines">@@ -142,15 +152,25 @@
</span><span class="cx">         fragment.m_isCollapsed = false;
</span><span class="cx">     };
</span><span class="cx"> 
</span><del>-    TextFragment newFragment(*this);
</del><ins>+    TextFragment rightSide(*this);
</ins><span class="cx">     m_end = splitPosition;
</span><span class="cx">     updateFragmentProperties(*this);
</span><span class="cx"> 
</span><del>-    newFragment.m_start = splitPosition;
-    updateFragmentProperties(newFragment);
-    return newFragment;
</del><ins>+    rightSide.m_start = splitPosition;
+    updateFragmentProperties(rightSide);
+    return rightSide;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+inline TextFragmentIterator::TextFragment TextFragmentIterator::TextFragment::splitWithHyphen(unsigned hyphenPosition,
+    const TextFragmentIterator&amp; textFragmentIterator)
+{
+    ASSERT(textFragmentIterator.style().shouldHyphenate);
+    auto rightSide = split(hyphenPosition, textFragmentIterator);
+    m_hasHyphen = true;
+    m_width += textFragmentIterator.style().hyphenStringWidth;
+    return rightSide;
+}
+
</ins><span class="cx"> inline bool TextFragmentIterator::isSoftLineBreak(unsigned position) const
</span><span class="cx"> {
</span><span class="cx">     const auto&amp; segment = *m_currentSegment;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderinglineBreakingContexth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/line/BreakingContext.h (211107 => 211108)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/line/BreakingContext.h        2017-01-24 21:23:05 UTC (rev 211107)
+++ trunk/Source/WebCore/rendering/line/BreakingContext.h        2017-01-24 21:38:20 UTC (rev 211108)
</span><span class="lines">@@ -687,9 +687,7 @@
</span><span class="cx">     int hyphenWidth = measureHyphenWidth(text, font);
</span><span class="cx"> 
</span><span class="cx">     float maxPrefixWidth = availableWidth - xPos - hyphenWidth - lastSpaceWordSpacing;
</span><del>-    // If the maximum width available for the prefix before the hyphen is small, then it is very unlikely
-    // that an hyphenation opportunity exists, so do not bother to look for it.
-    if (maxPrefixWidth &lt;= font.pixelSize() * 5 / 4)
</del><ins>+    if (!enoughWidthForHyphenation(maxPrefixWidth, font.pixelSize()))
</ins><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     const RenderStyle&amp; style = text.style();
</span></span></pre>
</div>
</div>

</body>
</html>