<!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>[183835] 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/183835">183835</a></dd>
<dt>Author</dt> <dd>zalan@apple.com</dd>
<dt>Date</dt> <dd>2015-05-05 15:44:30 -0700 (Tue, 05 May 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Navigating to www.apple.com hits assertion in WebCore::TextIteratorCopyableText::set()
https://bugs.webkit.org/show_bug.cgi?id=144629
rdar://problem/20689877

Reviewed by Andreas Kling.

This patch ensures that we don't emit empty text for the text iterator.
In TextIterator::handleTextNode before emitting a string, certain characters (\n \t) need to
be replaced with space. When such character is found, we emit the string we've processed so far and
handle the replacement during the next callback.
When the first character in the string needs replacing, there's nothing to emit. However if we don't
handle at least one character, TextIterator::advance believes that processing is done and never calls
TextIterator::handleTextNode back with the rest of the string.

Source/WebCore:

Test: fast/text/simple-line-layout-innerText-with-newline.html

* editing/TextIterator.cpp:
(WebCore::isNewLineOrTabCharacter):
(WebCore::TextIterator::handleTextNode):

LayoutTests:

* fast/text/simple-line-layout-innerText-with-newline-expected.html: Added.
* fast/text/simple-line-layout-innerText-with-newline.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="#trunkSourceWebCoreeditingTextIteratorcpp">trunk/Source/WebCore/editing/TextIterator.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfasttextsimplelinelayoutinnerTextwithnewlineexpectedhtml">trunk/LayoutTests/fast/text/simple-line-layout-innerText-with-newline-expected.html</a></li>
<li><a href="#trunkLayoutTestsfasttextsimplelinelayoutinnerTextwithnewlinehtml">trunk/LayoutTests/fast/text/simple-line-layout-innerText-with-newline.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (183834 => 183835)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2015-05-05 22:31:00 UTC (rev 183834)
+++ trunk/LayoutTests/ChangeLog        2015-05-05 22:44:30 UTC (rev 183835)
</span><span class="lines">@@ -1,3 +1,22 @@
</span><ins>+2015-05-05  Zalan Bujtas  &lt;zalan@apple.com&gt;
+
+        Navigating to www.apple.com hits assertion in WebCore::TextIteratorCopyableText::set()
+        https://bugs.webkit.org/show_bug.cgi?id=144629
+        rdar://problem/20689877
+
+        Reviewed by Andreas Kling.
+
+        This patch ensures that we don't emit empty text for the text iterator.
+        In TextIterator::handleTextNode before emitting a string, certain characters (\n \t) need to
+        be replaced with space. When such character is found, we emit the string we've processed so far and
+        handle the replacement during the next callback.
+        When the first character in the string needs replacing, there's nothing to emit. However if we don't
+        handle at least one character, TextIterator::advance believes that processing is done and never calls  
+        TextIterator::handleTextNode back with the rest of the string. 
+
+        * fast/text/simple-line-layout-innerText-with-newline-expected.html: Added.
+        * fast/text/simple-line-layout-innerText-with-newline.html: Added.
+
</ins><span class="cx"> 2015-05-05  Brent Fulgham  &lt;bfulgham@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Add overflow scroll-snap tests
</span></span></pre></div>
<a id="trunkLayoutTestsfasttextsimplelinelayoutinnerTextwithnewlineexpectedhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/text/simple-line-layout-innerText-with-newline-expected.html (0 => 183835)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/text/simple-line-layout-innerText-with-newline-expected.html                                (rev 0)
+++ trunk/LayoutTests/fast/text/simple-line-layout-innerText-with-newline-expected.html        2015-05-05 22:44:30 UTC (rev 183835)
</span><span class="lines">@@ -0,0 +1,8 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+  &lt;title&gt;This tests that innerText works fine with new line characters. (replacing them with space)&lt;/title&gt;
+&lt;/head&gt;
+&lt;body&gt;
+  &lt;div&gt;foo bar&lt;/div&gt;
+&lt;/body&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfasttextsimplelinelayoutinnerTextwithnewlinehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/text/simple-line-layout-innerText-with-newline.html (0 => 183835)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/text/simple-line-layout-innerText-with-newline.html                                (rev 0)
+++ trunk/LayoutTests/fast/text/simple-line-layout-innerText-with-newline.html        2015-05-05 22:44:30 UTC (rev 183835)
</span><span class="lines">@@ -0,0 +1,15 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+  &lt;title&gt;This tests that innerText works fine with new line characters. (replacing them with space)&lt;/title&gt;
+&lt;/head&gt;
+&lt;body&gt;
+  &lt;div style=&quot;font: 0/0 a;&quot;&gt;
+    foo
+    bar
+  &lt;/div&gt;
+  &lt;div id=result&gt;&lt;/div&gt;
+  &lt;script&gt;
+    document.getElementById(&quot;result&quot;).innerHTML = document.body.innerText;
+  &lt;/script&gt;
+&lt;/body&gt;
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (183834 => 183835)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-05-05 22:31:00 UTC (rev 183834)
+++ trunk/Source/WebCore/ChangeLog        2015-05-05 22:44:30 UTC (rev 183835)
</span><span class="lines">@@ -1,3 +1,25 @@
</span><ins>+2015-05-05  Zalan Bujtas  &lt;zalan@apple.com&gt;
+
+        Navigating to www.apple.com hits assertion in WebCore::TextIteratorCopyableText::set()
+        https://bugs.webkit.org/show_bug.cgi?id=144629
+        rdar://problem/20689877
+
+        Reviewed by Andreas Kling.
+
+        This patch ensures that we don't emit empty text for the text iterator.
+        In TextIterator::handleTextNode before emitting a string, certain characters (\n \t) need to
+        be replaced with space. When such character is found, we emit the string we've processed so far and
+        handle the replacement during the next callback.
+        When the first character in the string needs replacing, there's nothing to emit. However if we don't
+        handle at least one character, TextIterator::advance believes that processing is done and never calls  
+        TextIterator::handleTextNode back with the rest of the string. 
+
+        Test: fast/text/simple-line-layout-innerText-with-newline.html
+
+        * editing/TextIterator.cpp:
+        (WebCore::isNewLineOrTabCharacter):
+        (WebCore::TextIterator::handleTextNode):
+
</ins><span class="cx"> 2015-05-05  Alex Christensen  &lt;achristensen@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         [Content Extensions] Use less memory to store the json input.
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingTextIteratorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/TextIterator.cpp (183834 => 183835)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/TextIterator.cpp        2015-05-05 22:31:00 UTC (rev 183834)
+++ trunk/Source/WebCore/editing/TextIterator.cpp        2015-05-05 22:44:30 UTC (rev 183835)
</span><span class="lines">@@ -515,6 +515,11 @@
</span><span class="cx">     return textOffset;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static bool isNewLineOrTabCharacter(UChar character)
+{
+    return character == '\n' || character == '\t';
+}
+
</ins><span class="cx"> bool TextIterator::handleTextNode()
</span><span class="cx"> {
</span><span class="cx">     Text&amp; textNode = downcast&lt;Text&gt;(*m_node);
</span><span class="lines">@@ -607,16 +612,21 @@
</span><span class="cx">                 return false;
</span><span class="cx">             }
</span><span class="cx">         }
</span><del>-        // \n \t single whitespace characters need replacing so that the new line/tab character won't show up.
</del><ins>+        // \n \t single whitespace characters need replacing so that the new line/tab characters don't show up.
</ins><span class="cx">         unsigned stopPosition = contentStart;
</span><del>-        while (stopPosition &lt; contentEnd) {
-            if (rendererText[stopPosition] == '\n' || rendererText[stopPosition] == '\t') {
-                emitText(textNode, renderer, contentStart, stopPosition);
-                m_offset = stopPosition + 1;
-                m_nextRunNeedsWhitespace = true;
</del><ins>+        while (stopPosition &lt; contentEnd &amp;&amp; !isNewLineOrTabCharacter(rendererText[stopPosition]))
+            ++stopPosition;
+        // Emit the text up to the new line/tab character.
+        if (stopPosition &lt; contentEnd) {
+            if (stopPosition == contentStart) {
+                emitCharacter(' ', textNode, nullptr, contentStart, contentStart + 1);
+                m_offset = contentStart + 1;
</ins><span class="cx">                 return false;
</span><span class="cx">             }
</span><del>-            ++stopPosition;
</del><ins>+            emitText(textNode, renderer, contentStart, stopPosition);
+            m_offset = stopPosition + 1;
+            m_nextRunNeedsWhitespace = true;
+            return false;
</ins><span class="cx">         }
</span><span class="cx">         emitText(textNode, renderer, contentStart, contentEnd);
</span><span class="cx">         // When line ending with collapsed whitespace is present, we need to carry over one whitespace: foo(end of line)bar -&gt; foo bar (otherwise we would end up with foobar).
</span></span></pre>
</div>
</div>

</body>
</html>