<!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>[214851] 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/214851">214851</a></dd>
<dt>Author</dt> <dd>n_wang@apple.com</dd>
<dt>Date</dt> <dd>2017-04-03 16:06:25 -0700 (Mon, 03 Apr 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>AX: Expose link children when doing search predication on iOS
https://bugs.webkit.org/show_bug.cgi?id=170424
&lt;rdar://problem/31413335&gt;

Source/WebCore:

The children of links are accessible elements on iOS instead of the link itself,
so we should expose the children when doing predicated searches as well.

Reviewed by Chris Fleizach.

Test: accessibility/ios-simulator/ios-search-predicate-link-children.html

* accessibility/AccessibilityObject.cpp:
(WebCore::AccessibilityObject::isAccessibilityObjectSearchMatchAtIndex):

Tools:

Reviewed by Chris Fleizach.

* DumpRenderTree/ios/AccessibilityUIElementIOS.mm:
(AccessibilityUIElement::uiElementForSearchPredicate):
* WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm:
(WTR::AccessibilityUIElement::uiElementForSearchPredicate):

LayoutTests:

Reviewed by Chris Fleizach.

* accessibility/ios-simulator/ios-search-predicate-link-children-expected.txt: Added.
* accessibility/ios-simulator/ios-search-predicate-link-children.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="#trunkSourceWebCoreaccessibilityAccessibilityObjectcpp">trunk/Source/WebCore/accessibility/AccessibilityObject.cpp</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsDumpRenderTreeiosAccessibilityUIElementIOSmm">trunk/Tools/DumpRenderTree/ios/AccessibilityUIElementIOS.mm</a></li>
<li><a href="#trunkToolsWebKitTestRunnerInjectedBundleiosAccessibilityUIElementIOSmm">trunk/Tools/WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsaccessibilityiossimulatoriossearchpredicatelinkchildrenexpectedtxt">trunk/LayoutTests/accessibility/ios-simulator/ios-search-predicate-link-children-expected.txt</a></li>
<li><a href="#trunkLayoutTestsaccessibilityiossimulatoriossearchpredicatelinkchildrenhtml">trunk/LayoutTests/accessibility/ios-simulator/ios-search-predicate-link-children.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (214850 => 214851)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2017-04-03 23:04:40 UTC (rev 214850)
+++ trunk/LayoutTests/ChangeLog        2017-04-03 23:06:25 UTC (rev 214851)
</span><span class="lines">@@ -1,3 +1,14 @@
</span><ins>+2017-04-03  Nan Wang  &lt;n_wang@apple.com&gt;
+
+        AX: Expose link children when doing search predication on iOS
+        https://bugs.webkit.org/show_bug.cgi?id=170424
+        &lt;rdar://problem/31413335&gt;
+
+        Reviewed by Chris Fleizach.
+
+        * accessibility/ios-simulator/ios-search-predicate-link-children-expected.txt: Added.
+        * accessibility/ios-simulator/ios-search-predicate-link-children.html: Added.
+
</ins><span class="cx"> 2017-04-03  Dave Hyatt  &lt;hyatt@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Japanese fonts in vertical text should support synthesized italics
</span></span></pre></div>
<a id="trunkLayoutTestsaccessibilityiossimulatoriossearchpredicatelinkchildrenexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/accessibility/ios-simulator/ios-search-predicate-link-children-expected.txt (0 => 214851)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/accessibility/ios-simulator/ios-search-predicate-link-children-expected.txt                                (rev 0)
+++ trunk/LayoutTests/accessibility/ios-simulator/ios-search-predicate-link-children-expected.txt        2017-04-03 23:06:25 UTC (rev 214851)
</span><span class="lines">@@ -0,0 +1,22 @@
</span><ins>+start text
+
+heading text
+
+sub text
+start text 2
+
+link2 text link3
+This tests the ability to search for exposed link children.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+PASS resultElement.description is 'AXLabel: heading text'
+PASS resultElement.description is 'AXLabel: sub text'
+PASS resultElement.description is 'AXLabel: heading text'
+PASS resultElement.description is 'AXLabel: link2 text'
+PASS resultElement.description is 'AXLabel: link3'
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsaccessibilityiossimulatoriossearchpredicatelinkchildrenhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/accessibility/ios-simulator/ios-search-predicate-link-children.html (0 => 214851)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/accessibility/ios-simulator/ios-search-predicate-link-children.html                                (rev 0)
+++ trunk/LayoutTests/accessibility/ios-simulator/ios-search-predicate-link-children.html        2017-04-03 23:06:25 UTC (rev 214851)
</span><span class="lines">@@ -0,0 +1,60 @@
</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;p id=&quot;start&quot;&gt;start text&lt;/p&gt;
+&lt;a id=&quot;link&quot; href='#'&gt;
+&lt;h3&gt;heading text&lt;/h3&gt;
+&lt;div&gt;sub text&lt;/div&gt;
+&lt;/a&gt;
+
+&lt;p id=&quot;start2&quot;&gt;start text 2&lt;/p&gt;
+&lt;a id=&quot;link2&quot; href='#'&gt;
+&lt;span&gt;link2&lt;/span&gt;
+&lt;span&gt; text&lt;/span&gt;
+&lt;/a&gt;
+&lt;a href=&quot;#&quot;&gt;link3&lt;/a&gt;
+    
+&lt;p id=&quot;description&quot;&gt;&lt;/p&gt;
+&lt;div id=&quot;console&quot;&gt;&lt;/div&gt;
+
+&lt;script&gt;
+    description(&quot;This tests the ability to search for exposed link children.&quot;);
+    
+    if (window.accessibilityController) {
+        window.testRunner.keepWebHistory();
+        
+        var containerElement = accessibilityController.rootElement;
+        var startElement = accessibilityController.accessibleElementById(&quot;start&quot;);
+        var resultElement;
+        
+        resultElement = containerElement.uiElementForSearchPredicate(startElement, true, &quot;AXLinkSearchKey&quot;, &quot;&quot;, false);
+        shouldBe(&quot;resultElement.description&quot;, &quot;'AXLabel: heading text'&quot;);
+        
+        startElement = resultElement;
+        resultElement = containerElement.uiElementForSearchPredicate(startElement, true, &quot;AXLinkSearchKey&quot;, &quot;&quot;, false);
+        shouldBe(&quot;resultElement.description&quot;, &quot;'AXLabel: sub text'&quot;);
+        
+        // Search backwards.
+        startElement = resultElement;
+        resultElement = containerElement.uiElementForSearchPredicate(startElement, false, &quot;AXLinkSearchKey&quot;, &quot;&quot;, false);
+        shouldBe(&quot;resultElement.description&quot;, &quot;'AXLabel: heading text'&quot;);
+        
+        // Test the case where the link itself is not ignored.
+        startElement = accessibilityController.accessibleElementById(&quot;start2&quot;);
+        resultElement = containerElement.uiElementForSearchPredicate(startElement, true, &quot;AXLinkSearchKey&quot;, &quot;&quot;, false);
+        shouldBe(&quot;resultElement.description&quot;, &quot;'AXLabel: link2 text'&quot;);
+        
+        startElement = resultElement;
+        resultElement = containerElement.uiElementForSearchPredicate(startElement, true, &quot;AXLinkSearchKey&quot;, &quot;&quot;, false);
+        shouldBe(&quot;resultElement.description&quot;, &quot;'AXLabel: link3'&quot;);
+    }
+    
+&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 (214850 => 214851)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2017-04-03 23:04:40 UTC (rev 214850)
+++ trunk/Source/WebCore/ChangeLog        2017-04-03 23:06:25 UTC (rev 214851)
</span><span class="lines">@@ -1,3 +1,19 @@
</span><ins>+2017-04-03  Nan Wang  &lt;n_wang@apple.com&gt;
+
+        AX: Expose link children when doing search predication on iOS
+        https://bugs.webkit.org/show_bug.cgi?id=170424
+        &lt;rdar://problem/31413335&gt;
+
+        The children of links are accessible elements on iOS instead of the link itself, 
+        so we should expose the children when doing predicated searches as well.
+
+        Reviewed by Chris Fleizach.
+
+        Test: accessibility/ios-simulator/ios-search-predicate-link-children.html
+
+        * accessibility/AccessibilityObject.cpp:
+        (WebCore::AccessibilityObject::isAccessibilityObjectSearchMatchAtIndex):
+
</ins><span class="cx"> 2017-04-03  Jer Noble  &lt;jer.noble@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         No audio output for MediaStream-backed audio elements on iOS
</span></span></pre></div>
<a id="trunkSourceWebCoreaccessibilityAccessibilityObjectcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/accessibility/AccessibilityObject.cpp (214850 => 214851)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/accessibility/AccessibilityObject.cpp        2017-04-03 23:04:40 UTC (rev 214850)
+++ trunk/Source/WebCore/accessibility/AccessibilityObject.cpp        2017-04-03 23:06:25 UTC (rev 214851)
</span><span class="lines">@@ -201,8 +201,14 @@
</span><span class="cx">     case LandmarkSearchKey:
</span><span class="cx">         return axObject-&gt;isLandmark();
</span><span class="cx">         
</span><del>-    case LinkSearchKey:
-        return axObject-&gt;isLink();
</del><ins>+    case LinkSearchKey: {
+        bool isLink = axObject-&gt;isLink();
+#if PLATFORM(IOS)
+        if (!isLink)
+            isLink = axObject-&gt;isDescendantOfRole(WebCoreLinkRole);
+#endif
+        return isLink;
+    }
</ins><span class="cx">         
</span><span class="cx">     case ListSearchKey:
</span><span class="cx">         return axObject-&gt;isList();
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (214850 => 214851)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2017-04-03 23:04:40 UTC (rev 214850)
+++ trunk/Tools/ChangeLog        2017-04-03 23:06:25 UTC (rev 214851)
</span><span class="lines">@@ -1,3 +1,16 @@
</span><ins>+2017-04-03  Nan Wang  &lt;n_wang@apple.com&gt;
+
+        AX: Expose link children when doing search predication on iOS
+        https://bugs.webkit.org/show_bug.cgi?id=170424
+        &lt;rdar://problem/31413335&gt;
+
+        Reviewed by Chris Fleizach.
+
+        * DumpRenderTree/ios/AccessibilityUIElementIOS.mm:
+        (AccessibilityUIElement::uiElementForSearchPredicate):
+        * WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm:
+        (WTR::AccessibilityUIElement::uiElementForSearchPredicate):
+
</ins><span class="cx"> 2017-04-03  Brian Burg  &lt;bburg@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         run-safari should support launching with custom language and locale
</span></span></pre></div>
<a id="trunkToolsDumpRenderTreeiosAccessibilityUIElementIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Tools/DumpRenderTree/ios/AccessibilityUIElementIOS.mm (214850 => 214851)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/DumpRenderTree/ios/AccessibilityUIElementIOS.mm        2017-04-03 23:04:40 UTC (rev 214850)
+++ trunk/Tools/DumpRenderTree/ios/AccessibilityUIElementIOS.mm        2017-04-03 23:06:25 UTC (rev 214851)
</span><span class="lines">@@ -1123,11 +1123,15 @@
</span><span class="cx"> 
</span><span class="cx"> AccessibilityUIElement AccessibilityUIElement::uiElementForSearchPredicate(JSContextRef context, AccessibilityUIElement *startElement, bool isDirectionNext, JSValueRef searchKey, JSStringRef searchText, bool visibleOnly, bool immediateDescendantsOnly)
</span><span class="cx"> {
</span><del>-    NSDictionary *parameterizedAttribute = searchPredicateParameterizedAttributeForSearchCriteria(context, startElement, isDirectionNext, 1, searchKey, searchText, visibleOnly, immediateDescendantsOnly);
</del><ins>+    NSDictionary *parameterizedAttribute = searchPredicateParameterizedAttributeForSearchCriteria(context, startElement, isDirectionNext, 5, searchKey, searchText, visibleOnly, immediateDescendantsOnly);
</ins><span class="cx">     id value = [m_element accessibilityFindMatchingObjects:parameterizedAttribute];
</span><span class="cx">     if (![value isKindOfClass:[NSArray class]])
</span><span class="cx">         return nullptr;
</span><del>-    return AccessibilityUIElement([value lastObject]);
</del><ins>+    for (id element in value) {
+        if ([element isAccessibilityElement])
+            return AccessibilityUIElement(element);
+    }
+    return AccessibilityUIElement([value firstObject]);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> JSStringRef AccessibilityUIElement::selectTextWithCriteria(JSContextRef context, JSStringRef ambiguityResolution, JSValueRef searchStrings, JSStringRef replacementString, JSStringRef activity)
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerInjectedBundleiosAccessibilityUIElementIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm (214850 => 214851)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm        2017-04-03 23:04:40 UTC (rev 214850)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm        2017-04-03 23:06:25 UTC (rev 214851)
</span><span class="lines">@@ -662,11 +662,15 @@
</span><span class="cx"> 
</span><span class="cx"> RefPtr&lt;AccessibilityUIElement&gt; AccessibilityUIElement::uiElementForSearchPredicate(JSContextRef context, AccessibilityUIElement *startElement, bool isDirectionNext, JSValueRef searchKey, JSStringRef searchText, bool visibleOnly, bool immediateDescendantsOnly)
</span><span class="cx"> {
</span><del>-    NSDictionary *parameterizedAttribute = searchPredicateParameterizedAttributeForSearchCriteria(context, startElement, isDirectionNext, 1, searchKey, searchText, visibleOnly, immediateDescendantsOnly);
</del><ins>+    NSDictionary *parameterizedAttribute = searchPredicateParameterizedAttributeForSearchCriteria(context, startElement, isDirectionNext, 5, searchKey, searchText, visibleOnly, immediateDescendantsOnly);
</ins><span class="cx">     id value = [m_element accessibilityFindMatchingObjects:parameterizedAttribute];
</span><span class="cx">     if (![value isKindOfClass:[NSArray class]])
</span><span class="cx">         return nullptr;
</span><del>-    return AccessibilityUIElement::create([value lastObject]);
</del><ins>+    for (id element in value) {
+        if ([element isAccessibilityElement])
+            return AccessibilityUIElement::create(element);
+    }
+    return AccessibilityUIElement::create([value firstObject]);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> JSRetainPtr&lt;JSStringRef&gt; AccessibilityUIElement::selectTextWithCriteria(JSContextRef, JSStringRef ambiguityResolution, JSValueRef searchStrings, JSStringRef replacementString, JSStringRef activity)
</span></span></pre>
</div>
</div>

</body>
</html>