<!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>[165002] 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/165002">165002</a></dd>
<dt>Author</dt> <dd>antti@apple.com</dd>
<dt>Date</dt> <dd>2014-03-03 13:11:24 -0800 (Mon, 03 Mar 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Find results on simple lines are not marked correctly
https://bugs.webkit.org/show_bug.cgi?id=129586

Reviewed by Andreas Kling.

Source/WebCore: 

Tests: editing/text-iterator/count-mark-lineboxes.html
       editing/text-iterator/count-mark-simple-lines.html
               
TextIterator operating on simple lines failed to take the end of the range into account.
This also causes performance issues on long documents as range traversals would miss the end
node and end up going through the entire document.

* editing/TextIterator.cpp:
(WebCore::TextIterator::handleTextNode):
        
    Stop when hitting the range end on simple text nodes.

(WebCore::SimplifiedBackwardsTextIterator::handleTextNode):
        
    Use hasRenderedText test instead of linebox-only firstTextBox.

* testing/Internals.cpp:
(WebCore::Internals::countMatchesForText):
* testing/Internals.h:
* testing/Internals.idl:
        
    Add testing interface for counting and marking matches.

LayoutTests: 

* editing/text-iterator/count-mark-lineboxes-expected.txt: Added.
* editing/text-iterator/count-mark-lineboxes.html: Added.
* editing/text-iterator/count-mark-simple-lines-expected.txt: Added.
* editing/text-iterator/count-mark-simple-lines.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>
<li><a href="#trunkSourceWebCoretestingInternalscpp">trunk/Source/WebCore/testing/Internals.cpp</a></li>
<li><a href="#trunkSourceWebCoretestingInternalsh">trunk/Source/WebCore/testing/Internals.h</a></li>
<li><a href="#trunkSourceWebCoretestingInternalsidl">trunk/Source/WebCore/testing/Internals.idl</a></li>
<li><a href="#trunkSourceWebKitWebKitvcxprojWebKitExportGeneratorWebKitExportsdefin">trunk/Source/WebKit/WebKit.vcxproj/WebKitExportGenerator/WebKitExports.def.in</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestseditingtextiteratorcountmarklineboxesexpectedtxt">trunk/LayoutTests/editing/text-iterator/count-mark-lineboxes-expected.txt</a></li>
<li><a href="#trunkLayoutTestseditingtextiteratorcountmarklineboxeshtml">trunk/LayoutTests/editing/text-iterator/count-mark-lineboxes.html</a></li>
<li><a href="#trunkLayoutTestseditingtextiteratorcountmarksimplelinesexpectedtxt">trunk/LayoutTests/editing/text-iterator/count-mark-simple-lines-expected.txt</a></li>
<li><a href="#trunkLayoutTestseditingtextiteratorcountmarksimplelineshtml">trunk/LayoutTests/editing/text-iterator/count-mark-simple-lines.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (165001 => 165002)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2014-03-03 20:57:59 UTC (rev 165001)
+++ trunk/LayoutTests/ChangeLog        2014-03-03 21:11:24 UTC (rev 165002)
</span><span class="lines">@@ -1,3 +1,15 @@
</span><ins>+2014-03-03  Antti Koivisto  &lt;antti@apple.com&gt;
+
+        Find results on simple lines are not marked correctly
+        https://bugs.webkit.org/show_bug.cgi?id=129586
+
+        Reviewed by Andreas Kling.
+
+        * editing/text-iterator/count-mark-lineboxes-expected.txt: Added.
+        * editing/text-iterator/count-mark-lineboxes.html: Added.
+        * editing/text-iterator/count-mark-simple-lines-expected.txt: Added.
+        * editing/text-iterator/count-mark-simple-lines.html: Added.
+
</ins><span class="cx"> 2014-03-03  Jer Noble  &lt;jer.noble@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [MSE] YouTube videos fail to play
</span></span></pre></div>
<a id="trunkLayoutTestseditingtextiteratorcountmarklineboxesexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/editing/text-iterator/count-mark-lineboxes-expected.txt (0 => 165002)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/editing/text-iterator/count-mark-lineboxes-expected.txt                                (rev 0)
+++ trunk/LayoutTests/editing/text-iterator/count-mark-lineboxes-expected.txt        2014-03-03 21:11:24 UTC (rev 165002)
</span><span class="lines">@@ -0,0 +1,10 @@
</span><ins>+PASS internals.countMatchesForText('Catilina', 23, 'mark') is 3
+PASS internals.markerCountForNode(text, 'all') is 3
+PASS internals.countMatchesForText('Roma', 23, 'mark') is 3
+PASS internals.markerCountForNode(text, 'all') is 6
+PASS internals.countMatchesForText('uid', 23, 'mark') is 2
+PASS internals.markerCountForNode(text, 'all') is 8
+PASS successfullyParsed is true
+
+TEST COMPLETE
+Etenim qUid est, Catilina, quod iam amplius expectes, si neque nox tenebris obscurare coeptus nefarios nec privata domus parietibus continere voces coniurationis tuae potest, si illustrantur, si erumpunt omnia? Muta iam istam mentem, mihi crede, obliviscere caedis atque incendiorum. Teneris undique; luce sunt clariora nobis tua consilia omnia; quae iam mecum licet recognoscas. Meministine me ante diem XII Kalendas Novembris dicere in senatu fore in armis certo die, qui dies futurus esset ante diem VI Kal. Novembris, C. Manlium, audaciae satellitem atque administrum tuae? Num me fefellit, Catilina, non modo res tanta, tam atrox tamque incredibilis, verum, id quod multo magis est admirandum, dies? Dixi ego idem in senatu caedem te optumatium contulisse in ante diem V Kalendas Novembris, tum cum multi principes civitatis Roma non tam sui conservandi quam tuorum consiliorum reprimendorum causa profugerunt. Num infitiari potes te illo ipso die meis praesidiis, mea diligentia circumclusum commovere te contra rem publicam non potuisse, cum tu discessu ceterorum nostra tamen, qui remansissemus, caede te contentum esse dicebas? QUid? cum te Praeneste Kalendis ipsis Novembribus occupaturum nocturno impetu esse confideres, sensistin illam coloniam meo iussu meis praesidiis, custodiis, vigiliis esse munitam? Nihil agis, nihil moliris, nihil cogitas, quod non ego non modo audiam, sed etiam videam planeque sentiam. Recognosce tandem mecum noctem illam superiorem; iam intelleges multo me vigilare acrius ad salutem quam te ad perniciem rei publicae. Dico te priore nocte venisse inter falcarios (non agam obscure) in M. Laecae domum; convenisse eodem complures eiusdem amentiae scelerisque socios. Num negare audes? quid taces? Convincam, si negas. Video enim esse hic in senatu quosdam, qui tecum una fuerunt. O di inmortales! ubinam gentium sumus? in qua urbe vivimus? quam rem publicam habemus? Hic, hic sunt in nostro numero, patres conscripti, in hoc orbis terrae sanctissimo gravissimoque consilio, qui de nostro omnium interitu, qui de huius urbis atque adeo de orbis terrarum exitio cogitent! Hos ego video consul et de re publica sententiam rogo et, quos ferro trucidari oportebat, eos nondum voce volnero! Fuisti igitur apud Laecam illa nocte, Catilina, distribuisti partes Italiae, statuisti, quo quemque proficisci placeret, delegisti, quos Romae relinqueres, quos tecum educeres, discripsisti urbis partes ad incendia, confirmasti te ipsum iam esse exiturum, dixisti paulum tibi esse etiam nunc morae, quod ego viverem. Reperti sunt duo equites Romani, qui te ista cura liberarent et sese illa ipsa nocte paulo ante lucem me in meo lectulo interfecturos [esse] pollicerentur. Haec ego omnia vixdum etiam coetu vestro dimisso comperi; domum meam maioribus praesidiis munivi atque firmavi, exclusi eos, quos tu ad me salutatum mane miseras, cum illi ipsi venissent, quos ego iam multis ac summis viris ad me id temporis venturos esse praedixeram.
</ins></span></pre></div>
<a id="trunkLayoutTestseditingtextiteratorcountmarklineboxeshtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/editing/text-iterator/count-mark-lineboxes.html (0 => 165002)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/editing/text-iterator/count-mark-lineboxes.html                                (rev 0)
+++ trunk/LayoutTests/editing/text-iterator/count-mark-lineboxes.html        2014-03-03 21:11:24 UTC (rev 165002)
</span><span class="lines">@@ -0,0 +1,59 @@
</span><ins>+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;script&gt;
+internals.settings.setSimpleLineLayoutEnabled(false);
+&lt;/script&gt;
+&lt;body&gt;
+&lt;p id=test&gt;Etenim qUid est, Catilina, quod iam amplius expectes, si neque nox
+tenebris obscurare coeptus nefarios nec privata domus parietibus continere
+voces coniurationis tuae potest, si illustrantur, si erumpunt omnia?  Muta
+iam istam mentem, mihi crede, obliviscere caedis atque incendiorum.
+Teneris undique; luce sunt clariora nobis tua consilia omnia; quae iam
+mecum licet recognoscas.  Meministine me ante diem XII Kalendas Novembris
+dicere in senatu fore in armis certo die, qui dies futurus esset ante diem
+VI Kal.  Novembris, C. Manlium, audaciae satellitem atque administrum
+tuae?  Num me fefellit, Catilina, non modo res tanta, tam atrox tamque
+incredibilis, verum, id quod multo magis est admirandum, dies?  Dixi ego
+idem in senatu caedem te optumatium contulisse in ante diem V Kalendas
+Novembris, tum cum multi principes civitatis Roma non tam sui conservandi
+quam tuorum consiliorum reprimendorum causa profugerunt.  Num infitiari
+potes te illo ipso die meis praesidiis, mea diligentia circumclusum
+commovere te contra rem publicam non potuisse, cum tu discessu ceterorum
+nostra tamen, qui remansissemus, caede te contentum esse dicebas?  QUid?
+cum te Praeneste Kalendis ipsis Novembribus occupaturum nocturno impetu
+esse confideres, sensistin illam coloniam meo iussu meis praesidiis,
+custodiis, vigiliis esse munitam?  Nihil agis, nihil moliris, nihil
+cogitas, quod non ego non modo audiam, sed etiam videam planeque sentiam.
+Recognosce tandem mecum noctem illam superiorem; iam intelleges multo me
+vigilare acrius ad salutem quam te ad perniciem rei publicae.  Dico te
+priore nocte venisse inter falcarios (non agam obscure) in M. Laecae
+domum; convenisse eodem complures eiusdem amentiae scelerisque socios.
+Num negare audes?  quid taces?  Convincam, si negas.  Video enim esse hic
+in senatu quosdam, qui tecum una fuerunt.  O di inmortales! ubinam gentium
+sumus?  in qua urbe vivimus?  quam rem publicam habemus?  Hic, hic sunt in
+nostro numero, patres conscripti, in hoc orbis terrae sanctissimo
+gravissimoque consilio, qui de nostro omnium interitu, qui de huius urbis
+atque adeo de orbis terrarum exitio cogitent! Hos ego video consul et de
+re publica sententiam rogo et, quos ferro trucidari oportebat, eos nondum
+voce volnero! Fuisti igitur apud Laecam illa nocte, Catilina, distribuisti
+partes Italiae, statuisti, quo quemque proficisci placeret, delegisti,
+quos Romae relinqueres, quos tecum educeres, discripsisti urbis partes ad
+incendia, confirmasti te ipsum iam esse exiturum, dixisti paulum tibi esse
+etiam nunc morae, quod ego viverem.  Reperti sunt duo equites Romani, qui
+te ista cura liberarent et sese illa ipsa nocte paulo ante lucem me in meo
+lectulo interfecturos [esse] pollicerentur.  Haec ego omnia vixdum etiam
+coetu vestro dimisso comperi; domum meam maioribus praesidiis munivi atque
+firmavi, exclusi eos, quos tu ad me salutatum mane miseras, cum illi ipsi
+venissent, quos ego iam multis ac summis viris ad me id temporis venturos
+esse praedixeram.
+&lt;/p&gt;
+&lt;script&gt;
+var text = document.getElementById('test').firstChild;
+shouldBe(&quot;internals.countMatchesForText('Catilina', 23, 'mark')&quot;, &quot;3&quot;);
+shouldBe(&quot;internals.markerCountForNode(text, 'all')&quot;, &quot;3&quot;);
+shouldBe(&quot;internals.countMatchesForText('Roma', 23, 'mark')&quot;, &quot;3&quot;);
+shouldBe(&quot;internals.markerCountForNode(text, 'all')&quot;, &quot;6&quot;);
+shouldBe(&quot;internals.countMatchesForText('uid', 23, 'mark')&quot;, &quot;2&quot;);
+shouldBe(&quot;internals.markerCountForNode(text, 'all')&quot;, &quot;8&quot;);
+&lt;/script&gt;
+&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestseditingtextiteratorcountmarksimplelinesexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/editing/text-iterator/count-mark-simple-lines-expected.txt (0 => 165002)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/editing/text-iterator/count-mark-simple-lines-expected.txt                                (rev 0)
+++ trunk/LayoutTests/editing/text-iterator/count-mark-simple-lines-expected.txt        2014-03-03 21:11:24 UTC (rev 165002)
</span><span class="lines">@@ -0,0 +1,10 @@
</span><ins>+PASS internals.countMatchesForText('Catilina', 23, 'mark') is 3
+PASS internals.markerCountForNode(text, 'all') is 3
+PASS internals.countMatchesForText('Roma', 23, 'mark') is 3
+PASS internals.markerCountForNode(text, 'all') is 6
+PASS internals.countMatchesForText('uid', 23, 'mark') is 2
+PASS internals.markerCountForNode(text, 'all') is 8
+PASS successfullyParsed is true
+
+TEST COMPLETE
+Etenim qUid est, Catilina, quod iam amplius expectes, si neque nox tenebris obscurare coeptus nefarios nec privata domus parietibus continere voces coniurationis tuae potest, si illustrantur, si erumpunt omnia? Muta iam istam mentem, mihi crede, obliviscere caedis atque incendiorum. Teneris undique; luce sunt clariora nobis tua consilia omnia; quae iam mecum licet recognoscas. Meministine me ante diem XII Kalendas Novembris dicere in senatu fore in armis certo die, qui dies futurus esset ante diem VI Kal. Novembris, C. Manlium, audaciae satellitem atque administrum tuae? Num me fefellit, Catilina, non modo res tanta, tam atrox tamque incredibilis, verum, id quod multo magis est admirandum, dies? Dixi ego idem in senatu caedem te optumatium contulisse in ante diem V Kalendas Novembris, tum cum multi principes civitatis Roma non tam sui conservandi quam tuorum consiliorum reprimendorum causa profugerunt. Num infitiari potes te illo ipso die meis praesidiis, mea diligentia circumclusum commovere te contra rem publicam non potuisse, cum tu discessu ceterorum nostra tamen, qui remansissemus, caede te contentum esse dicebas? QUid? cum te Praeneste Kalendis ipsis Novembribus occupaturum nocturno impetu esse confideres, sensistin illam coloniam meo iussu meis praesidiis, custodiis, vigiliis esse munitam? Nihil agis, nihil moliris, nihil cogitas, quod non ego non modo audiam, sed etiam videam planeque sentiam. Recognosce tandem mecum noctem illam superiorem; iam intelleges multo me vigilare acrius ad salutem quam te ad perniciem rei publicae. Dico te priore nocte venisse inter falcarios (non agam obscure) in M. Laecae domum; convenisse eodem complures eiusdem amentiae scelerisque socios. Num negare audes? quid taces? Convincam, si negas. Video enim esse hic in senatu quosdam, qui tecum una fuerunt. O di inmortales! ubinam gentium sumus? in qua urbe vivimus? quam rem publicam habemus? Hic, hic sunt in nostro numero, patres conscripti, in hoc orbis terrae sanctissimo gravissimoque consilio, qui de nostro omnium interitu, qui de huius urbis atque adeo de orbis terrarum exitio cogitent! Hos ego video consul et de re publica sententiam rogo et, quos ferro trucidari oportebat, eos nondum voce volnero! Fuisti igitur apud Laecam illa nocte, Catilina, distribuisti partes Italiae, statuisti, quo quemque proficisci placeret, delegisti, quos Romae relinqueres, quos tecum educeres, discripsisti urbis partes ad incendia, confirmasti te ipsum iam esse exiturum, dixisti paulum tibi esse etiam nunc morae, quod ego viverem. Reperti sunt duo equites Romani, qui te ista cura liberarent et sese illa ipsa nocte paulo ante lucem me in meo lectulo interfecturos [esse] pollicerentur. Haec ego omnia vixdum etiam coetu vestro dimisso comperi; domum meam maioribus praesidiis munivi atque firmavi, exclusi eos, quos tu ad me salutatum mane miseras, cum illi ipsi venissent, quos ego iam multis ac summis viris ad me id temporis venturos esse praedixeram.
</ins></span></pre></div>
<a id="trunkLayoutTestseditingtextiteratorcountmarksimplelineshtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/editing/text-iterator/count-mark-simple-lines.html (0 => 165002)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/editing/text-iterator/count-mark-simple-lines.html                                (rev 0)
+++ trunk/LayoutTests/editing/text-iterator/count-mark-simple-lines.html        2014-03-03 21:11:24 UTC (rev 165002)
</span><span class="lines">@@ -0,0 +1,56 @@
</span><ins>+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;body&gt;
+&lt;p id=test&gt;Etenim qUid est, Catilina, quod iam amplius expectes, si neque nox
+tenebris obscurare coeptus nefarios nec privata domus parietibus continere
+voces coniurationis tuae potest, si illustrantur, si erumpunt omnia?  Muta
+iam istam mentem, mihi crede, obliviscere caedis atque incendiorum.
+Teneris undique; luce sunt clariora nobis tua consilia omnia; quae iam
+mecum licet recognoscas.  Meministine me ante diem XII Kalendas Novembris
+dicere in senatu fore in armis certo die, qui dies futurus esset ante diem
+VI Kal.  Novembris, C. Manlium, audaciae satellitem atque administrum
+tuae?  Num me fefellit, Catilina, non modo res tanta, tam atrox tamque
+incredibilis, verum, id quod multo magis est admirandum, dies?  Dixi ego
+idem in senatu caedem te optumatium contulisse in ante diem V Kalendas
+Novembris, tum cum multi principes civitatis Roma non tam sui conservandi
+quam tuorum consiliorum reprimendorum causa profugerunt.  Num infitiari
+potes te illo ipso die meis praesidiis, mea diligentia circumclusum
+commovere te contra rem publicam non potuisse, cum tu discessu ceterorum
+nostra tamen, qui remansissemus, caede te contentum esse dicebas?  QUid?
+cum te Praeneste Kalendis ipsis Novembribus occupaturum nocturno impetu
+esse confideres, sensistin illam coloniam meo iussu meis praesidiis,
+custodiis, vigiliis esse munitam?  Nihil agis, nihil moliris, nihil
+cogitas, quod non ego non modo audiam, sed etiam videam planeque sentiam.
+Recognosce tandem mecum noctem illam superiorem; iam intelleges multo me
+vigilare acrius ad salutem quam te ad perniciem rei publicae.  Dico te
+priore nocte venisse inter falcarios (non agam obscure) in M. Laecae
+domum; convenisse eodem complures eiusdem amentiae scelerisque socios.
+Num negare audes?  quid taces?  Convincam, si negas.  Video enim esse hic
+in senatu quosdam, qui tecum una fuerunt.  O di inmortales! ubinam gentium
+sumus?  in qua urbe vivimus?  quam rem publicam habemus?  Hic, hic sunt in
+nostro numero, patres conscripti, in hoc orbis terrae sanctissimo
+gravissimoque consilio, qui de nostro omnium interitu, qui de huius urbis
+atque adeo de orbis terrarum exitio cogitent! Hos ego video consul et de
+re publica sententiam rogo et, quos ferro trucidari oportebat, eos nondum
+voce volnero! Fuisti igitur apud Laecam illa nocte, Catilina, distribuisti
+partes Italiae, statuisti, quo quemque proficisci placeret, delegisti,
+quos Romae relinqueres, quos tecum educeres, discripsisti urbis partes ad
+incendia, confirmasti te ipsum iam esse exiturum, dixisti paulum tibi esse
+etiam nunc morae, quod ego viverem.  Reperti sunt duo equites Romani, qui
+te ista cura liberarent et sese illa ipsa nocte paulo ante lucem me in meo
+lectulo interfecturos [esse] pollicerentur.  Haec ego omnia vixdum etiam
+coetu vestro dimisso comperi; domum meam maioribus praesidiis munivi atque
+firmavi, exclusi eos, quos tu ad me salutatum mane miseras, cum illi ipsi
+venissent, quos ego iam multis ac summis viris ad me id temporis venturos
+esse praedixeram.
+&lt;/p&gt;
+&lt;script&gt;
+var text = document.getElementById('test').firstChild;
+shouldBe(&quot;internals.countMatchesForText('Catilina', 23, 'mark')&quot;, &quot;3&quot;);
+shouldBe(&quot;internals.markerCountForNode(text, 'all')&quot;, &quot;3&quot;);
+shouldBe(&quot;internals.countMatchesForText('Roma', 23, 'mark')&quot;, &quot;3&quot;);
+shouldBe(&quot;internals.markerCountForNode(text, 'all')&quot;, &quot;6&quot;);
+shouldBe(&quot;internals.countMatchesForText('uid', 23, 'mark')&quot;, &quot;2&quot;);
+shouldBe(&quot;internals.markerCountForNode(text, 'all')&quot;, &quot;8&quot;);
+&lt;/script&gt;
+&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (165001 => 165002)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-03-03 20:57:59 UTC (rev 165001)
+++ trunk/Source/WebCore/ChangeLog        2014-03-03 21:11:24 UTC (rev 165002)
</span><span class="lines">@@ -1,3 +1,33 @@
</span><ins>+2014-03-03  Antti Koivisto  &lt;antti@apple.com&gt;
+
+        Find results on simple lines are not marked correctly
+        https://bugs.webkit.org/show_bug.cgi?id=129586
+
+        Reviewed by Andreas Kling.
+
+        Tests: editing/text-iterator/count-mark-lineboxes.html
+               editing/text-iterator/count-mark-simple-lines.html
+               
+        TextIterator operating on simple lines failed to take the end of the range into account.
+        This also causes performance issues on long documents as range traversals would miss the end
+        node and end up going through the entire document.
+
+        * editing/TextIterator.cpp:
+        (WebCore::TextIterator::handleTextNode):
+        
+            Stop when hitting the range end on simple text nodes.
+
+        (WebCore::SimplifiedBackwardsTextIterator::handleTextNode):
+        
+            Use hasRenderedText test instead of linebox-only firstTextBox.
+
+        * testing/Internals.cpp:
+        (WebCore::Internals::countMatchesForText):
+        * testing/Internals.h:
+        * testing/Internals.idl:
+        
+            Add testing interface for counting and marking matches.
+
</ins><span class="cx"> 2014-03-03  Benjamin Poulain  &lt;benjamin@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         SelectorQuery failing RightMostWithIdMatch are compiling their selectors for each execution
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingTextIteratorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/TextIterator.cpp (165001 => 165002)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/TextIterator.cpp        2014-03-03 20:57:59 UTC (rev 165001)
+++ trunk/Source/WebCore/editing/TextIterator.cpp        2014-03-03 21:11:24 UTC (rev 165002)
</span><span class="lines">@@ -538,9 +538,10 @@
</span><span class="cx">         if (renderer-&gt;style().visibility() != VISIBLE &amp;&amp; !m_ignoresStyleVisibility)
</span><span class="cx">             return true;
</span><span class="cx">         // This code aims to produce same results as handleTextBox() below so test results don't change. It does not make much logical sense.
</span><ins>+        const unsigned end = (m_node == m_endContainer) ? static_cast&lt;unsigned&gt;(m_endOffset) : str.length();
</ins><span class="cx">         unsigned runEnd = m_offset;
</span><span class="cx">         unsigned runStart = m_offset;
</span><del>-        while (runEnd &lt; str.length() &amp;&amp; (deprecatedIsCollapsibleWhitespace(str[runEnd]) || str[runEnd] == '\t'))
</del><ins>+        while (runEnd &lt; end &amp;&amp; (deprecatedIsCollapsibleWhitespace(str[runEnd]) || str[runEnd] == '\t'))
</ins><span class="cx">             ++runEnd;
</span><span class="cx">         bool addSpaceForPrevious = m_lastTextNodeEndedWithCollapsedSpace &amp;&amp; m_lastCharacter &amp;&amp; !deprecatedIsCollapsibleWhitespace(m_lastCharacter);
</span><span class="cx">         if (runEnd &gt; runStart || addSpaceForPrevious) {
</span><span class="lines">@@ -556,12 +557,12 @@
</span><span class="cx">             }
</span><span class="cx">             runStart = runEnd;
</span><span class="cx">         }
</span><del>-        while (runEnd &lt; str.length() &amp;&amp; !deprecatedIsCollapsibleWhitespace(str[runEnd]))
</del><ins>+        while (runEnd &lt; end &amp;&amp; !deprecatedIsCollapsibleWhitespace(str[runEnd]))
</ins><span class="cx">             ++runEnd;
</span><del>-        if (runStart &lt; str.length())
</del><ins>+        if (runStart &lt; end)
</ins><span class="cx">             emitText(m_node, renderer, runStart, runEnd);
</span><span class="cx">         m_offset = runEnd;
</span><del>-        return runEnd == str.length();
</del><ins>+        return runEnd == end;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (renderer-&gt;firstTextBox())
</span><span class="lines">@@ -1300,7 +1301,7 @@
</span><span class="cx">         return true;
</span><span class="cx"> 
</span><span class="cx">     String text = renderer-&gt;text();
</span><del>-    if (!renderer-&gt;firstTextBox() &amp;&amp; text.length() &gt; 0)
</del><ins>+    if (!renderer-&gt;hasRenderedText() &amp;&amp; text.length() &gt; 0)
</ins><span class="cx">         return true;
</span><span class="cx"> 
</span><span class="cx">     m_positionEndOffset = m_offset;
</span></span></pre></div>
<a id="trunkSourceWebCoretestingInternalscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/testing/Internals.cpp (165001 => 165002)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/testing/Internals.cpp        2014-03-03 20:57:59 UTC (rev 165001)
+++ trunk/Source/WebCore/testing/Internals.cpp        2014-03-03 21:11:24 UTC (rev 165002)
</span><span class="lines">@@ -1435,6 +1435,16 @@
</span><span class="cx">     document-&gt;frame()-&gt;editor().toggleOverwriteModeEnabled();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+unsigned Internals::countMatchesForText(const String&amp; text, unsigned findOptions, const String&amp; markMatches, ExceptionCode&amp;)
+{
+    Document* document = contextDocument();
+    if (!document || !document-&gt;frame())
+        return 0;
+
+    bool mark = markMatches == &quot;mark&quot;;
+    return document-&gt;frame()-&gt;editor().countMatchesForText(text, nullptr, findOptions, std::numeric_limits&lt;unsigned&gt;::max(), mark, nullptr);
+}
+
</ins><span class="cx"> const ProfilesArray&amp; Internals::consoleProfiles() const
</span><span class="cx"> {
</span><span class="cx">     return contextDocument()-&gt;domWindow()-&gt;console()-&gt;profiles();
</span></span></pre></div>
<a id="trunkSourceWebCoretestingInternalsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/testing/Internals.h (165001 => 165002)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/testing/Internals.h        2014-03-03 20:57:59 UTC (rev 165001)
+++ trunk/Source/WebCore/testing/Internals.h        2014-03-03 21:11:24 UTC (rev 165002)
</span><span class="lines">@@ -187,6 +187,8 @@
</span><span class="cx">     bool isOverwriteModeEnabled(ExceptionCode&amp;);
</span><span class="cx">     void toggleOverwriteModeEnabled(ExceptionCode&amp;);
</span><span class="cx"> 
</span><ins>+    unsigned countMatchesForText(const String&amp;, unsigned findOptions, const String&amp; markMatches, ExceptionCode&amp;);
+
</ins><span class="cx">     unsigned numberOfScrollableAreas(ExceptionCode&amp;);
</span><span class="cx"> 
</span><span class="cx">     bool isPageBoxVisible(int pageNumber, ExceptionCode&amp;);
</span></span></pre></div>
<a id="trunkSourceWebCoretestingInternalsidl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/testing/Internals.idl (165001 => 165002)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/testing/Internals.idl        2014-03-03 20:57:59 UTC (rev 165001)
+++ trunk/Source/WebCore/testing/Internals.idl        2014-03-03 21:11:24 UTC (rev 165002)
</span><span class="lines">@@ -98,6 +98,7 @@
</span><span class="cx">     [RaisesException] void setSuggestedValue(Element inputElement, DOMString value);
</span><span class="cx">     [RaisesException] void setEditingValue(Element inputElement, DOMString value);
</span><span class="cx">     [RaisesException] void setAutofilled(Element inputElement, boolean enabled);
</span><ins>+    [RaisesException] unsigned long countMatchesForText(DOMString text, unsigned long findOptions, DOMString markMatches);
</ins><span class="cx"> 
</span><span class="cx">     [RaisesException] void paintControlTints();
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKitWebKitvcxprojWebKitExportGeneratorWebKitExportsdefin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/WebKit.vcxproj/WebKitExportGenerator/WebKitExports.def.in (165001 => 165002)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/WebKit.vcxproj/WebKitExportGenerator/WebKitExports.def.in        2014-03-03 20:57:59 UTC (rev 165001)
+++ trunk/Source/WebKit/WebKit.vcxproj/WebKitExportGenerator/WebKitExports.def.in        2014-03-03 21:11:24 UTC (rev 165002)
</span><span class="lines">@@ -335,6 +335,7 @@
</span><span class="cx">         symbolWithPointer(?isContinuousSpellCheckingEnabled@Editor@WebCore@@QBE_NXZ, ?isContinuousSpellCheckingEnabled@Editor@WebCore@@QEBA_NXZ)
</span><span class="cx">         symbolWithPointer(?toggleContinuousSpellChecking@Editor@WebCore@@QAEXXZ, ?toggleContinuousSpellChecking@Editor@WebCore@@QEAAXXZ)
</span><span class="cx">         symbolWithPointer(?toggleOverwriteModeEnabled@Editor@WebCore@@QAEXXZ, ?toggleOverwriteModeEnabled@Editor@WebCore@@QEAAXXZ)
</span><ins>+        symbolWithPointer(?countMatchesForText@Editor@WebCore@@QAEIABVString@WTF@@PAVRange@2@EI_NPAV?$Vector@V?$RefPtr@VRange@WebCore@@@WTF@@$0A@VCrashOnOverflow@2@@4@@Z, ?countMatchesForText@Editor@WebCore@@QEAAIABVString@WTF@@PAVRange@2@EI_NPAV?$Vector@V?$RefPtr@VRange@WebCore@@@WTF@@$0A@VCrashOnOverflow@2@@4@@Z)
</ins><span class="cx"> #if ENABLE(FULLSCREEN_API)
</span><span class="cx">         symbolWithPointer(?webkitWillEnterFullScreenForElement@Document@WebCore@@QAEXPAVElement@2@@Z, ?webkitWillEnterFullScreenForElement@Document@WebCore@@QEAAXPEAVElement@2@@Z)
</span><span class="cx">         symbolWithPointer(?webkitDidEnterFullScreenForElement@Document@WebCore@@QAEXPAVElement@2@@Z, ?webkitDidEnterFullScreenForElement@Document@WebCore@@QEAAXPEAVElement@2@@Z)
</span></span></pre>
</div>
</div>

</body>
</html>