<!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>[189847] 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/189847">189847</a></dd>
<dt>Author</dt> <dd>zalan@apple.com</dd>
<dt>Date</dt> <dd>2015-09-15 23:07:16 -0700 (Tue, 15 Sep 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Simple line layout: Glitch selecting long text.
https://bugs.webkit.org/show_bug.cgi?id=149204
rdar://problem/22646472

Reviewed by Antti Koivisto.

When long text is split into multiple RenderText objects, we ignore renderer boundaries while
collecting wrapping positions (so that we don't end up wrapping unbreakable fragments at the end of each renderer).
This patch ensures that fragments with hypen character ignore renderer boundaries too.

Source/WebCore:

Test: fast/text/multiple-renderers-with-hypen-on-boundary.html

* rendering/SimpleLineLayoutTextFragmentIterator.cpp:
(WebCore::SimpleLineLayout::TextFragmentIterator::skipToNextPosition):

LayoutTests:

* fast/text/multiple-renderers-with-hypen-on-boundary-expected.html: Added.
* fast/text/multiple-renderers-with-hypen-on-boundary.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="#trunkSourceWebCorerenderingSimpleLineLayoutTextFragmentIteratorcpp">trunk/Source/WebCore/rendering/SimpleLineLayoutTextFragmentIterator.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfasttextmultiplerendererswithhypenonboundaryexpectedhtml">trunk/LayoutTests/fast/text/multiple-renderers-with-hypen-on-boundary-expected.html</a></li>
<li><a href="#trunkLayoutTestsfasttextmultiplerendererswithhypenonboundaryhtml">trunk/LayoutTests/fast/text/multiple-renderers-with-hypen-on-boundary.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (189846 => 189847)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2015-09-16 05:49:11 UTC (rev 189846)
+++ trunk/LayoutTests/ChangeLog        2015-09-16 06:07:16 UTC (rev 189847)
</span><span class="lines">@@ -1,3 +1,18 @@
</span><ins>+2015-09-15  Zalan Bujtas  &lt;zalan@apple.com&gt;
+
+        Simple line layout: Glitch selecting long text.
+        https://bugs.webkit.org/show_bug.cgi?id=149204
+        rdar://problem/22646472
+
+        Reviewed by Antti Koivisto.
+
+        When long text is split into multiple RenderText objects, we ignore renderer boundaries while
+        collecting wrapping positions (so that we don't end up wrapping unbreakable fragments at the end of each renderer).
+        This patch ensures that fragments with hypen character ignore renderer boundaries too.
+
+        * fast/text/multiple-renderers-with-hypen-on-boundary-expected.html: Added.
+        * fast/text/multiple-renderers-with-hypen-on-boundary.html: Added.
+
</ins><span class="cx"> 2015-09-15  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Document.createElement(localName) does not handle correctly missing or null parameter
</span></span></pre></div>
<a id="trunkLayoutTestsfasttextmultiplerendererswithhypenonboundaryexpectedhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/text/multiple-renderers-with-hypen-on-boundary-expected.html (0 => 189847)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/text/multiple-renderers-with-hypen-on-boundary-expected.html                                (rev 0)
+++ trunk/LayoutTests/fast/text/multiple-renderers-with-hypen-on-boundary-expected.html        2015-09-16 06:07:16 UTC (rev 189847)
</span><span class="lines">@@ -0,0 +1,18 @@
</span><ins>+&lt;title&gt;This tests that simple line layout wraps lines the same way normal line layout does when multiple (text)renderers are present and there's a hyphen on the render boundary.&lt;/title&gt;
+&lt;script&gt;
+// Force line box path.
+if (window.internals)
+    internals.settings.setSimpleLineLayoutEnabled(false);
+&lt;/script&gt;
+&lt;style&gt;
+    body { 
+            border: 1px solid green; 
+            width: 50px;
+    }
+&lt;/style&gt;
+&lt;body&gt;
+&lt;/body&gt;
+&lt;script&gt;
+document.body.appendChild(document.createTextNode(&quot;foobar -abc&quot;));
+document.body.appendChild(document.createTextNode(&quot;defghijklmnopqrstvw&quot;));
+&lt;/script&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfasttextmultiplerendererswithhypenonboundaryhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/text/multiple-renderers-with-hypen-on-boundary.html (0 => 189847)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/text/multiple-renderers-with-hypen-on-boundary.html                                (rev 0)
+++ trunk/LayoutTests/fast/text/multiple-renderers-with-hypen-on-boundary.html        2015-09-16 06:07:16 UTC (rev 189847)
</span><span class="lines">@@ -0,0 +1,13 @@
</span><ins>+&lt;title&gt;This tests that simple line layout wraps lines the same way normal line layout does when multiple (text)renderers are present and there's a hyphen on the render boundary.&lt;/title&gt;
+&lt;style&gt;
+    body { 
+            border: 1px solid green; 
+            width: 50px;
+    }
+&lt;/style&gt;
+&lt;body&gt;
+&lt;/body&gt;
+&lt;script&gt;
+document.body.appendChild(document.createTextNode(&quot;foobar -abc&quot;));
+document.body.appendChild(document.createTextNode(&quot;defghijklmnopqrstvw&quot;));
+&lt;/script&gt;
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (189846 => 189847)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-09-16 05:49:11 UTC (rev 189846)
+++ trunk/Source/WebCore/ChangeLog        2015-09-16 06:07:16 UTC (rev 189847)
</span><span class="lines">@@ -1,3 +1,20 @@
</span><ins>+2015-09-15  Zalan Bujtas  &lt;zalan@apple.com&gt;
+
+        Simple line layout: Glitch selecting long text.
+        https://bugs.webkit.org/show_bug.cgi?id=149204
+        rdar://problem/22646472
+
+        Reviewed by Antti Koivisto.
+
+        When long text is split into multiple RenderText objects, we ignore renderer boundaries while
+        collecting wrapping positions (so that we don't end up wrapping unbreakable fragments at the end of each renderer).
+        This patch ensures that fragments with hypen character ignore renderer boundaries too.
+
+        Test: fast/text/multiple-renderers-with-hypen-on-boundary.html
+
+        * rendering/SimpleLineLayoutTextFragmentIterator.cpp:
+        (WebCore::SimpleLineLayout::TextFragmentIterator::skipToNextPosition):
+
</ins><span class="cx"> 2015-09-15  Ryosuke Niwa  &lt;rniwa@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         GTK+ build fix attempt after r189841.
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingSimpleLineLayoutTextFragmentIteratorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/SimpleLineLayoutTextFragmentIterator.cpp (189846 => 189847)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/SimpleLineLayoutTextFragmentIterator.cpp        2015-09-16 05:49:11 UTC (rev 189846)
+++ trunk/Source/WebCore/rendering/SimpleLineLayoutTextFragmentIterator.cpp        2015-09-16 06:07:16 UTC (rev 189847)
</span><span class="lines">@@ -161,16 +161,15 @@
</span><span class="cx">     if (positionType == NonWhitespace)
</span><span class="cx">         nextPosition = m_currentSegment-&gt;text.is8Bit() ? nextNonWhitespacePosition&lt;LChar&gt;(*m_currentSegment, currentPosition) : nextNonWhitespacePosition&lt;UChar&gt;(*m_currentSegment, currentPosition);
</span><span class="cx">     else if (positionType == Breakable) {
</span><del>-        // nextBreakablePosition returns the same position for certain characters such as hyphens. Call next again with modified position unless it's the end of the segment.
</del><span class="cx">         nextPosition = m_currentSegment-&gt;text.is8Bit() ? nextBreakablePosition&lt;LChar&gt;(*m_currentSegment, currentPosition) : nextBreakablePosition&lt;UChar&gt;(*m_currentSegment, currentPosition);
</span><ins>+        // nextBreakablePosition returns the same position for certain characters such as hyphens. Call next again with modified position unless it's the end of the segment.
+        if (nextPosition == currentPosition &amp;&amp; nextPosition &lt; m_currentSegment-&gt;end)
+            nextPosition = m_currentSegment-&gt;text.is8Bit() ? nextBreakablePosition&lt;LChar&gt;(*m_currentSegment, currentPosition + 1) : nextBreakablePosition&lt;UChar&gt;(*m_currentSegment, currentPosition + 1);
</ins><span class="cx">         // We need to know whether the word actually finishes at the end of this renderer or not.
</span><span class="cx">         if (nextPosition == m_currentSegment-&gt;end) {
</span><span class="cx">             const auto nextSegment = m_currentSegment + 1;
</span><span class="cx">             if (nextSegment != m_flowContents.end() &amp;&amp; !isHardLineBreak(nextSegment))
</span><span class="cx">                 overlappingFragment = nextPosition &lt; (nextSegment-&gt;text.is8Bit() ? nextBreakablePosition&lt;LChar&gt;(*nextSegment, nextPosition) : nextBreakablePosition&lt;UChar&gt;(*nextSegment, nextPosition));
</span><del>-        } else if (nextPosition == currentPosition) {
-            if (++nextPosition &lt; m_currentSegment-&gt;end)
-                nextPosition = m_currentSegment-&gt;text.is8Bit() ? nextBreakablePosition&lt;LChar&gt;(*m_currentSegment, currentPosition + 1) : nextBreakablePosition&lt;UChar&gt;(*m_currentSegment, currentPosition + 1);
</del><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx">     width = 0;
</span></span></pre>
</div>
</div>

</body>
</html>