<!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>[172005] 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/172005">172005</a></dd>
<dt>Author</dt> <dd>cfleizach@apple.com</dd>
<dt>Date</dt> <dd>2014-08-04 14:56:08 -0700 (Mon, 04 Aug 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>AX: isWordEndMatch should allow for multiple word selections
https://bugs.webkit.org/show_bug.cgi?id=135573

Reviewed by Mario Sanchez Prada.


Source/WebCore: 
isWordEndMatch was searching from the beginning of the selected range, which meant
that if the result was multiple words, we'd reject the result. 
Instead, we should search from the end of the range, so that we encompass all words.

Modified existing test: platform/mac/accessibility/select-text-should-match-whole-words.html

* editing/TextIterator.cpp:
(WebCore::SearchBuffer::isWordEndMatch):

LayoutTests: 
* platform/mac/accessibility/select-text-should-match-whole-words-expected.txt:
* platform/mac/accessibility/select-text-should-match-whole-words.html:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsplatformmacaccessibilityselecttextshouldmatchwholewordsexpectedtxt">trunk/LayoutTests/platform/mac/accessibility/select-text-should-match-whole-words-expected.txt</a></li>
<li><a href="#trunkLayoutTestsplatformmacaccessibilityselecttextshouldmatchwholewordshtml">trunk/LayoutTests/platform/mac/accessibility/select-text-should-match-whole-words.html</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>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (172004 => 172005)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2014-08-04 21:25:22 UTC (rev 172004)
+++ trunk/LayoutTests/ChangeLog        2014-08-04 21:56:08 UTC (rev 172005)
</span><span class="lines">@@ -1,5 +1,15 @@
</span><span class="cx"> 2014-08-04  Chris Fleizach  &lt;cfleizach@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        AX: isWordEndMatch should allow for multiple word selections
+        https://bugs.webkit.org/show_bug.cgi?id=135573
+
+        Reviewed by Mario Sanchez Prada.
+
+        * platform/mac/accessibility/select-text-should-match-whole-words-expected.txt:
+        * platform/mac/accessibility/select-text-should-match-whole-words.html:
+
+2014-08-04  Chris Fleizach  &lt;cfleizach@apple.com&gt;
+
</ins><span class="cx">         AX: Secure text fields need to support Search parameterized attributes
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=135568
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsplatformmacaccessibilityselecttextshouldmatchwholewordsexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/mac/accessibility/select-text-should-match-whole-words-expected.txt (172004 => 172005)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/mac/accessibility/select-text-should-match-whole-words-expected.txt        2014-08-04 21:25:22 UTC (rev 172004)
+++ trunk/LayoutTests/platform/mac/accessibility/select-text-should-match-whole-words-expected.txt        2014-08-04 21:56:08 UTC (rev 172005)
</span><span class="lines">@@ -1,4 +1,4 @@
</span><del>-The man jumped high.
</del><ins>+The man jumped higher.
</ins><span class="cx"> 
</span><span class="cx"> This tests that selection matches whole words, rather than partial matches.
</span><span class="cx"> 
</span><span class="lines">@@ -11,6 +11,12 @@
</span><span class="cx"> PASS result is 'jumped'
</span><span class="cx"> PASS windowSelection.getRangeAt(0).startOffset is 8
</span><span class="cx"> PASS windowSelection.getRangeAt(0).endOffset is 14
</span><ins>+PASS result is 'jumped higher'
+PASS windowSelection.getRangeAt(0).startOffset is 8
+PASS windowSelection.getRangeAt(0).endOffset is 21
+PASS result is ''
+PASS windowSelection.getRangeAt(0).startOffset is 0
+PASS windowSelection.getRangeAt(0).endOffset is 0
</ins><span class="cx"> PASS successfullyParsed is true
</span><span class="cx"> 
</span><span class="cx"> TEST COMPLETE
</span></span></pre></div>
<a id="trunkLayoutTestsplatformmacaccessibilityselecttextshouldmatchwholewordshtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/mac/accessibility/select-text-should-match-whole-words.html (172004 => 172005)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/mac/accessibility/select-text-should-match-whole-words.html        2014-08-04 21:25:22 UTC (rev 172004)
+++ trunk/LayoutTests/platform/mac/accessibility/select-text-should-match-whole-words.html        2014-08-04 21:56:08 UTC (rev 172005)
</span><span class="lines">@@ -6,7 +6,7 @@
</span><span class="cx"> &lt;/head&gt;
</span><span class="cx"> &lt;body&gt;
</span><span class="cx"> 
</span><del>-&lt;p contenteditable=&quot;true&quot; id=&quot;text&quot;&gt;The man jumped high.&lt;/p&gt;
</del><ins>+&lt;p contenteditable=&quot;true&quot; id=&quot;text&quot;&gt;The man jumped higher.&lt;/p&gt;
</ins><span class="cx"> 
</span><span class="cx"> &lt;p id=&quot;description&quot;&gt;&lt;/p&gt;
</span><span class="cx"> &lt;div id=&quot;console&quot;&gt;&lt;/div&gt;
</span><span class="lines">@@ -17,7 +17,6 @@
</span><span class="cx">     if (window.accessibilityController) {
</span><span class="cx">         var text = accessibilityController.accessibleElementById(&quot;text&quot;);
</span><span class="cx">         var windowSelection = window.getSelection();
</span><del>-        windowSelection.removeAllRanges();
</del><span class="cx"> 
</span><span class="cx">         // A matching range before the selection should be selected when searching for closest match.
</span><span class="cx">         document.getElementById(&quot;text&quot;).focus();
</span><span class="lines">@@ -26,6 +25,7 @@
</span><span class="cx">         var range = document.createRange();
</span><span class="cx">         range.setStart(document.getElementById(&quot;text&quot;).firstChild, 0);
</span><span class="cx">         range.setEnd(document.getElementById(&quot;text&quot;).firstChild, 0);
</span><ins>+        windowSelection.removeAllRanges();
</ins><span class="cx">         windowSelection.addRange(range);
</span><span class="cx">       
</span><span class="cx">         // Try to select a partial word, it should fail.
</span><span class="lines">@@ -39,7 +39,22 @@
</span><span class="cx">         shouldBe(&quot;result&quot;, &quot;'jumped'&quot;);
</span><span class="cx">         shouldBe(&quot;windowSelection.getRangeAt(0).startOffset&quot;, &quot;8&quot;);
</span><span class="cx">         shouldBe(&quot;windowSelection.getRangeAt(0).endOffset&quot;, &quot;14&quot;);
</span><ins>+        windowSelection.removeAllRanges();
+        windowSelection.addRange(range);
</ins><span class="cx"> 
</span><ins>+        // Select multiple whole word, it should succeed.
+        result = text.selectTextWithCriteria(&quot;AXSelectTextAmbiguityResolutionClosestToSelection&quot;, &quot;jumped higher&quot;);
+        shouldBe(&quot;result&quot;, &quot;'jumped higher'&quot;);
+        shouldBe(&quot;windowSelection.getRangeAt(0).startOffset&quot;, &quot;8&quot;);
+        shouldBe(&quot;windowSelection.getRangeAt(0).endOffset&quot;, &quot;21&quot;);
+        windowSelection.removeAllRanges();
+        windowSelection.addRange(range);
+
+        // Select multiple words, where one is not a whole word, it should fail.
+        result = text.selectTextWithCriteria(&quot;AXSelectTextAmbiguityResolutionClosestToSelection&quot;, &quot;jumped high&quot;);
+        shouldBe(&quot;result&quot;, &quot;''&quot;);
+        shouldBe(&quot;windowSelection.getRangeAt(0).startOffset&quot;, &quot;0&quot;);
+        shouldBe(&quot;windowSelection.getRangeAt(0).endOffset&quot;, &quot;0&quot;);
</ins><span class="cx">     }
</span><span class="cx"> &lt;/script&gt;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (172004 => 172005)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-08-04 21:25:22 UTC (rev 172004)
+++ trunk/Source/WebCore/ChangeLog        2014-08-04 21:56:08 UTC (rev 172005)
</span><span class="lines">@@ -1,5 +1,21 @@
</span><span class="cx"> 2014-08-04  Chris Fleizach  &lt;cfleizach@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        AX: isWordEndMatch should allow for multiple word selections
+        https://bugs.webkit.org/show_bug.cgi?id=135573
+
+        Reviewed by Mario Sanchez Prada.
+
+        isWordEndMatch was searching from the beginning of the selected range, which meant
+        that if the result was multiple words, we'd reject the result. 
+        Instead, we should search from the end of the range, so that we encompass all words.
+
+        Modified existing test: platform/mac/accessibility/select-text-should-match-whole-words.html
+
+        * editing/TextIterator.cpp:
+        (WebCore::SearchBuffer::isWordEndMatch):
+
+2014-08-04  Chris Fleizach  &lt;cfleizach@apple.com&gt;
+
</ins><span class="cx">         AX: Secure text fields need to support Search parameterized attributes
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=135568
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreeditingTextIteratorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/editing/TextIterator.cpp (172004 => 172005)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/editing/TextIterator.cpp        2014-08-04 21:25:22 UTC (rev 172004)
+++ trunk/Source/WebCore/editing/TextIterator.cpp        2014-08-04 21:56:08 UTC (rev 172005)
</span><span class="lines">@@ -2121,10 +2121,12 @@
</span><span class="cx">     
</span><span class="cx"> inline bool SearchBuffer::isWordEndMatch(size_t start, size_t length) const
</span><span class="cx"> {
</span><ins>+    ASSERT(length);
</ins><span class="cx">     ASSERT(m_options &amp; AtWordEnds);
</span><span class="cx"> 
</span><span class="cx">     int endWord;
</span><del>-    findEndWordBoundary(StringView(m_buffer.data(), m_buffer.size()), start, &amp;endWord);
</del><ins>+    // Start searching at the end of matched search, so that multiple word matches succeed.
+    findEndWordBoundary(StringView(m_buffer.data(), m_buffer.size()), start + length - 1, &amp;endWord);
</ins><span class="cx">     return static_cast&lt;size_t&gt;(endWord) == (start + length);
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>