<!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>[200508] 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/200508">200508</a></dd>
<dt>Author</dt> <dd>n_wang@apple.com</dd>
<dt>Date</dt> <dd>2016-05-06 00:27:22 -0700 (Fri, 06 May 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>AX: String for document range is empty if end visible position anchors to a ignored replaced node
https://bugs.webkit.org/show_bug.cgi?id=157403

Reviewed by Chris Fleizach.

Source/WebCore:

The CharacterOffset that is converted from VisiblePositon is wrong when the VisiblePostion anchors
to an ignored replaced node. Fixed it by adjusting the offset of the CharacterOffset correctly in 
such case.

Test: accessibility/mac/text-marker-string-for-document-end-replaced-node.html

* accessibility/AXObjectCache.cpp:
(WebCore::characterOffsetsInOrder):
(WebCore::AXObjectCache::characterOffsetFromVisiblePosition):
(WebCore::AXObjectCache::accessibilityObjectForTextMarkerData):

LayoutTests:

* accessibility/mac/text-marker-string-for-document-end-replaced-node-expected.txt: Added.
* accessibility/mac/text-marker-string-for-document-end-replaced-node.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="#trunkSourceWebCoreaccessibilityAXObjectCachecpp">trunk/Source/WebCore/accessibility/AXObjectCache.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsaccessibilitymactextmarkerstringfordocumentendreplacednodeexpectedtxt">trunk/LayoutTests/accessibility/mac/text-marker-string-for-document-end-replaced-node-expected.txt</a></li>
<li><a href="#trunkLayoutTestsaccessibilitymactextmarkerstringfordocumentendreplacednodehtml">trunk/LayoutTests/accessibility/mac/text-marker-string-for-document-end-replaced-node.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (200507 => 200508)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2016-05-06 06:25:30 UTC (rev 200507)
+++ trunk/LayoutTests/ChangeLog        2016-05-06 07:27:22 UTC (rev 200508)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2016-05-06  Nan Wang  &lt;n_wang@apple.com&gt;
+
+        AX: String for document range is empty if end visible position anchors to a ignored replaced node
+        https://bugs.webkit.org/show_bug.cgi?id=157403
+
+        Reviewed by Chris Fleizach.
+
+        * accessibility/mac/text-marker-string-for-document-end-replaced-node-expected.txt: Added.
+        * accessibility/mac/text-marker-string-for-document-end-replaced-node.html: Added.
+
</ins><span class="cx"> 2016-05-05  Dean Jackson  &lt;dino@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         4 and 8 digit color attributes should use the crazypants algorithm, not the CSS one.
</span></span></pre></div>
<a id="trunkLayoutTestsaccessibilitymactextmarkerstringfordocumentendreplacednodeexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/accessibility/mac/text-marker-string-for-document-end-replaced-node-expected.txt (0 => 200508)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/accessibility/mac/text-marker-string-for-document-end-replaced-node-expected.txt                                (rev 0)
+++ trunk/LayoutTests/accessibility/mac/text-marker-string-for-document-end-replaced-node-expected.txt        2016-05-06 07:27:22 UTC (rev 200508)
</span><span class="lines">@@ -0,0 +1,25 @@
</span><ins>+ Some text
+
+Message content.
+
+Some other text.
+
+This tests that we are getting the correct string for document range if the end visible position anchors an ignored replaced node.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+String: 
+ Some text
+
+Message content.
+
+Some other text.
+
+This tests that we are getting the correct string for document range if the end visible position anchors an ignored replaced node.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsaccessibilitymactextmarkerstringfordocumentendreplacednodehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/accessibility/mac/text-marker-string-for-document-end-replaced-node.html (0 => 200508)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/accessibility/mac/text-marker-string-for-document-end-replaced-node.html                                (rev 0)
+++ trunk/LayoutTests/accessibility/mac/text-marker-string-for-document-end-replaced-node.html        2016-05-06 07:27:22 UTC (rev 200508)
</span><span class="lines">@@ -0,0 +1,43 @@
</span><ins>+&lt;!DOCTYPE HTML PUBLIC &quot;-//IETF//DTD HTML//EN&quot;&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body id=&quot;body&quot;&gt;
+
+&lt;body&gt;
+&lt;div id=&quot;wrapper&quot;&gt;
+&lt;h1&gt;
+        &lt;img src=&quot;&quot; alt=&quot;Apple&quot;&gt; 
+    &lt;span&gt; Some text &lt;/span&gt;
+&lt;/h1&gt;
+&lt;div id=&quot;message&quot;&gt;
+Message content.&lt;br&gt;&lt;br&gt;
+Some other text.&lt;br&gt;
+&lt;/div&gt;
+&lt;img alt=&quot;&quot; style=&quot;bottom: -20px; right: -30px; width: 135px; height: 100px;&quot; src=&quot;&quot;&gt;        
+&lt;/div&gt;
+
+&lt;p id=&quot;description&quot;&gt;&lt;/p&gt;
+&lt;div id=&quot;console&quot;&gt;&lt;/div&gt;
+
+&lt;/body&gt;
+
+&lt;script&gt;
+
+    description(&quot;This tests that we are getting the correct string for document range if the end visible position anchors an ignored replaced node.&quot;);
+
+    if (window.accessibilityController) {
+
+          var body = accessibilityController.rootElement.childAtIndex(0);
+          var startMarker = body.startTextMarker;
+          var endMarker = body.endTextMarker;
+          var textMarkerRange = body.textMarkerRangeForMarkers(startMarker, endMarker);
+          debug(&quot;String: \n&quot; + body.stringForTextMarkerRange(textMarkerRange));
+    }
+    
+&lt;/script&gt;
+
+&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (200507 => 200508)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-05-06 06:25:30 UTC (rev 200507)
+++ trunk/Source/WebCore/ChangeLog        2016-05-06 07:27:22 UTC (rev 200508)
</span><span class="lines">@@ -1,3 +1,21 @@
</span><ins>+2016-05-06  Nan Wang  &lt;n_wang@apple.com&gt;
+
+        AX: String for document range is empty if end visible position anchors to a ignored replaced node
+        https://bugs.webkit.org/show_bug.cgi?id=157403
+
+        Reviewed by Chris Fleizach.
+
+        The CharacterOffset that is converted from VisiblePositon is wrong when the VisiblePostion anchors
+        to an ignored replaced node. Fixed it by adjusting the offset of the CharacterOffset correctly in 
+        such case.
+
+        Test: accessibility/mac/text-marker-string-for-document-end-replaced-node.html
+
+        * accessibility/AXObjectCache.cpp:
+        (WebCore::characterOffsetsInOrder):
+        (WebCore::AXObjectCache::characterOffsetFromVisiblePosition):
+        (WebCore::AXObjectCache::accessibilityObjectForTextMarkerData):
+
</ins><span class="cx"> 2016-05-05  David Kilzer  &lt;ddkilzer@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [iOS] WebCore does not need to link to CoreAudio, GraphicsServices, SystemConfiguration frameworks
</span></span></pre></div>
<a id="trunkSourceWebCoreaccessibilityAXObjectCachecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/accessibility/AXObjectCache.cpp (200507 => 200508)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/accessibility/AXObjectCache.cpp        2016-05-06 06:25:30 UTC (rev 200507)
+++ trunk/Source/WebCore/accessibility/AXObjectCache.cpp        2016-05-06 07:27:22 UTC (rev 200508)
</span><span class="lines">@@ -1655,9 +1655,9 @@
</span><span class="cx">     
</span><span class="cx">     Node* node1 = characterOffset1.node;
</span><span class="cx">     Node* node2 = characterOffset2.node;
</span><del>-    if (!node1-&gt;offsetInCharacters() &amp;&amp; !isReplacedNodeOrBR(node1))
</del><ins>+    if (!node1-&gt;offsetInCharacters() &amp;&amp; !isReplacedNodeOrBR(node1) &amp;&amp; node1-&gt;hasChildNodes())
</ins><span class="cx">         node1 = node1-&gt;traverseToChildAt(characterOffset1.offset);
</span><del>-    if (!node2-&gt;offsetInCharacters() &amp;&amp; !isReplacedNodeOrBR(node2))
</del><ins>+    if (!node2-&gt;offsetInCharacters() &amp;&amp; !isReplacedNodeOrBR(node2) &amp;&amp; node2-&gt;hasChildNodes())
</ins><span class="cx">         node2 = node2-&gt;traverseToChildAt(characterOffset2.offset);
</span><span class="cx">     
</span><span class="cx">     if (!node1 || !node2)
</span><span class="lines">@@ -1997,7 +1997,11 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    return traverseToOffsetInRange(rangeForNodeContents(obj-&gt;node()), characterOffset);
</del><ins>+    // Sometimes when the node is a replaced node and is ignored in accessibility, we get a wrong CharacterOffset from it.
+    CharacterOffset result = traverseToOffsetInRange(rangeForNodeContents(obj-&gt;node()), characterOffset);
+    if  (result.remainingOffset &gt; 0 &amp;&amp; !result.isNull() &amp;&amp; isRendererReplacedElement(result.node-&gt;renderer()))
+        result.offset += result.remainingOffset;
+    return result;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> AccessibilityObject* AXObjectCache::accessibilityObjectForTextMarkerData(TextMarkerData&amp; textMarkerData)
</span></span></pre>
</div>
</div>

</body>
</html>