<!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>[211411] 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/211411">211411</a></dd>
<dt>Author</dt> <dd>cfleizach@apple.com</dd>
<dt>Date</dt> <dd>2017-01-31 00:07:49 -0800 (Tue, 31 Jan 2017)</dd>
</dl>
<h3>Log Message</h3>
<pre>AX: enable search predication for iOS
https://bugs.webkit.org/show_bug.cgi?id=167558
<rdar://problem/30251367>
Reviewed by Joanmarie Diggs.
Source/WebCore:
Move the code to support accessibility searching into a shared place so it can be used by iOS.
Test: accessibility/ios-simulator/ios-search-predicate.html
* accessibility/ios/WebAccessibilityObjectWrapperIOS.mm:
(-[WebAccessibilityObjectWrapper accessibilityFindMatchingObjects:]):
* accessibility/mac/WebAccessibilityObjectWrapperBase.h:
* accessibility/mac/WebAccessibilityObjectWrapperBase.mm:
(convertToNSArray):
(createAccessibilitySearchKeyMap):
(accessibilitySearchKeyForString):
(accessibilitySearchCriteriaForSearchPredicateParameterizedAttribute):
* accessibility/mac/WebAccessibilityObjectWrapperMac.mm:
(createAccessibilitySearchKeyMap): Deleted.
(accessibilitySearchKeyForString): Deleted.
(accessibilitySearchCriteriaForSearchPredicateParameterizedAttribute): Deleted.
(convertToNSArray): Deleted.
Tools:
* DumpRenderTree/ios/AccessibilityUIElementIOS.mm:
(AccessibilityUIElement::uiElementForSearchPredicate):
* DumpRenderTree/mac/AccessibilityCommonMac.h:
* DumpRenderTree/mac/AccessibilityCommonMac.mm:
(searchPredicateParameterizedAttributeForSearchCriteria):
* DumpRenderTree/mac/AccessibilityUIElementMac.mm:
(searchPredicateParameterizedAttributeForSearchCriteria): Deleted.
* WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm:
(WTR::AccessibilityUIElement::uiElementCountForSearchPredicate):
(WTR::AccessibilityUIElement::uiElementForSearchPredicate):
* WebKitTestRunner/InjectedBundle/mac/AccessibilityCommonMac.h:
* WebKitTestRunner/InjectedBundle/mac/AccessibilityCommonMac.mm:
(WTR::searchPredicateParameterizedAttributeForSearchCriteria):
* WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm:
(WTR::searchPredicateParameterizedAttributeForSearchCriteria): Deleted.
* WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj:
LayoutTests:
Add basic searching smoke test to ensure fundamentals work on iOS.
* accessibility/ios-simulator/ios-search-predicate-expected.txt: Added.
* accessibility/ios-simulator/ios-search-predicate.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="#trunkSourceWebCoreaccessibilityiosWebAccessibilityObjectWrapperIOSmm">trunk/Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm</a></li>
<li><a href="#trunkSourceWebCoreaccessibilitymacWebAccessibilityObjectWrapperBaseh">trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperBase.h</a></li>
<li><a href="#trunkSourceWebCoreaccessibilitymacWebAccessibilityObjectWrapperBasemm">trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperBase.mm</a></li>
<li><a href="#trunkSourceWebCoreaccessibilitymacWebAccessibilityObjectWrapperMacmm">trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm</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="#trunkToolsDumpRenderTreemacAccessibilityCommonMach">trunk/Tools/DumpRenderTree/mac/AccessibilityCommonMac.h</a></li>
<li><a href="#trunkToolsDumpRenderTreemacAccessibilityCommonMacmm">trunk/Tools/DumpRenderTree/mac/AccessibilityCommonMac.mm</a></li>
<li><a href="#trunkToolsDumpRenderTreemacAccessibilityUIElementMacmm">trunk/Tools/DumpRenderTree/mac/AccessibilityUIElementMac.mm</a></li>
<li><a href="#trunkToolsWebKitTestRunnerInjectedBundleiosAccessibilityUIElementIOSmm">trunk/Tools/WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm</a></li>
<li><a href="#trunkToolsWebKitTestRunnerInjectedBundlemacAccessibilityCommonMach">trunk/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityCommonMac.h</a></li>
<li><a href="#trunkToolsWebKitTestRunnerInjectedBundlemacAccessibilityCommonMacmm">trunk/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityCommonMac.mm</a></li>
<li><a href="#trunkToolsWebKitTestRunnerInjectedBundlemacAccessibilityUIElementMacmm">trunk/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm</a></li>
<li><a href="#trunkToolsWebKitTestRunnerWebKitTestRunnerxcodeprojprojectpbxproj">trunk/Tools/WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj</a></li>
</ul>
<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsaccessibilityiossimulatoriossearchpredicateexpectedtxt">trunk/LayoutTests/accessibility/ios-simulator/ios-search-predicate-expected.txt</a></li>
<li><a href="#trunkLayoutTestsaccessibilityiossimulatoriossearchpredicatehtml">trunk/LayoutTests/accessibility/ios-simulator/ios-search-predicate.html</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (211410 => 211411)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2017-01-31 07:21:43 UTC (rev 211410)
+++ trunk/LayoutTests/ChangeLog        2017-01-31 08:07:49 UTC (rev 211411)
</span><span class="lines">@@ -1,3 +1,16 @@
</span><ins>+2017-01-31 Chris Fleizach <cfleizach@apple.com>
+
+ AX: enable search predication for iOS
+ https://bugs.webkit.org/show_bug.cgi?id=167558
+ <rdar://problem/30251367>
+
+ Reviewed by Joanmarie Diggs.
+
+ Add basic searching smoke test to ensure fundamentals work on iOS.
+
+ * accessibility/ios-simulator/ios-search-predicate-expected.txt: Added.
+ * accessibility/ios-simulator/ios-search-predicate.html: Added.
+
</ins><span class="cx"> 2017-01-30 Joseph Pecoraro <pecoraro@apple.com>
</span><span class="cx">
</span><span class="cx"> Implement PerformanceObserver
</span></span></pre></div>
<a id="trunkLayoutTestsaccessibilityiossimulatoriossearchpredicateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/accessibility/ios-simulator/ios-search-predicate-expected.txt (0 => 211411)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/accessibility/ios-simulator/ios-search-predicate-expected.txt         (rev 0)
+++ trunk/LayoutTests/accessibility/ios-simulator/ios-search-predicate-expected.txt        2017-01-31 08:07:49 UTC (rev 211411)
</span><span class="lines">@@ -0,0 +1,30 @@
</span><ins>+start
+first heading level 1
+
+second heading level 1
+
+heading level 2
+
+heading level 3
+
+heading level 4
+
+heading level 5
+
+heading level 6
+
+This tests the ability to search for accessible elements by key or text.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS resultElement.childAtIndex(0).description is 'AXLabel: first heading level 1'
+PASS resultElement.childAtIndex(0).description is 'AXLabel: heading level 2'
+PASS resultElement.childAtIndex(0).description is 'AXLabel: heading level 3'
+PASS resultElement.childAtIndex(0).description is 'AXLabel: heading level 4'
+PASS resultElement.childAtIndex(0).description is 'AXLabel: heading level 5'
+PASS resultElement.childAtIndex(0).description is 'AXLabel: heading level 6'
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsaccessibilityiossimulatoriossearchpredicatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/accessibility/ios-simulator/ios-search-predicate.html (0 => 211411)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/accessibility/ios-simulator/ios-search-predicate.html         (rev 0)
+++ trunk/LayoutTests/accessibility/ios-simulator/ios-search-predicate.html        2017-01-31 08:07:49 UTC (rev 211411)
</span><span class="lines">@@ -0,0 +1,67 @@
</span><ins>+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<script src="../../resources/js-test-pre.js"></script>
+</head>
+<body id="body">
+
+<button>start</button>
+
+<h1>first heading level 1</h1>
+<h1>second heading level 1</h1>
+<h2>heading level 2</h2>
+<h3>heading level 3</h3>
+<h4>heading level 4</h4>
+<h5>heading level 5</h5>
+<h6>heading level 6</h6>
+
+
+<p id="description"></p>
+<div id="console"></div>
+
+<script>
+ description("This tests the ability to search for accessible elements by key or text.");
+
+ if (window.accessibilityController) {
+ window.testRunner.keepWebHistory();
+
+ var containerElement = accessibilityController.rootElement;
+ var startElement;
+ var resultElement;
+
+ // Heading level 1.
+ startElement = accessibilityController.focusedElement.childAtIndex(0);
+ resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXHeadingLevel1SearchKey", "", false);
+ shouldBe("resultElement.childAtIndex(0).description", "'AXLabel: first heading level 1'");
+
+ // Heading level 2.
+ startElement = accessibilityController.focusedElement.childAtIndex(0);
+ resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXHeadingLevel2SearchKey", "", false);
+ shouldBe("resultElement.childAtIndex(0).description", "'AXLabel: heading level 2'");
+
+ // Heading level 3.
+ startElement = accessibilityController.focusedElement.childAtIndex(0);
+ resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXHeadingLevel3SearchKey", "", false);
+ shouldBe("resultElement.childAtIndex(0).description", "'AXLabel: heading level 3'");
+
+ // Heading level 4.
+ startElement = accessibilityController.focusedElement.childAtIndex(0);
+ resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXHeadingLevel4SearchKey", "", false);
+ shouldBe("resultElement.childAtIndex(0).description", "'AXLabel: heading level 4'");
+
+ // Heading level 5.
+ startElement = accessibilityController.focusedElement.childAtIndex(0);
+ resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXHeadingLevel5SearchKey", "", false);
+ shouldBe("resultElement.childAtIndex(0).description", "'AXLabel: heading level 5'");
+
+ // Heading level 6.
+ startElement = accessibilityController.focusedElement.childAtIndex(0);
+ resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXHeadingLevel6SearchKey", "", false);
+ shouldBe("resultElement.childAtIndex(0).description", "'AXLabel: heading level 6'");
+ }
+
+</script>
+
+<script src="../../resources/js-test-post.js"></script>
+</body>
+</html>
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (211410 => 211411)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2017-01-31 07:21:43 UTC (rev 211410)
+++ trunk/Source/WebCore/ChangeLog        2017-01-31 08:07:49 UTC (rev 211411)
</span><span class="lines">@@ -1,3 +1,29 @@
</span><ins>+2017-01-31 Chris Fleizach <cfleizach@apple.com>
+
+ AX: enable search predication for iOS
+ https://bugs.webkit.org/show_bug.cgi?id=167558
+ <rdar://problem/30251367>
+
+ Reviewed by Joanmarie Diggs.
+
+ Move the code to support accessibility searching into a shared place so it can be used by iOS.
+
+ Test: accessibility/ios-simulator/ios-search-predicate.html
+
+ * accessibility/ios/WebAccessibilityObjectWrapperIOS.mm:
+ (-[WebAccessibilityObjectWrapper accessibilityFindMatchingObjects:]):
+ * accessibility/mac/WebAccessibilityObjectWrapperBase.h:
+ * accessibility/mac/WebAccessibilityObjectWrapperBase.mm:
+ (convertToNSArray):
+ (createAccessibilitySearchKeyMap):
+ (accessibilitySearchKeyForString):
+ (accessibilitySearchCriteriaForSearchPredicateParameterizedAttribute):
+ * accessibility/mac/WebAccessibilityObjectWrapperMac.mm:
+ (createAccessibilitySearchKeyMap): Deleted.
+ (accessibilitySearchKeyForString): Deleted.
+ (accessibilitySearchCriteriaForSearchPredicateParameterizedAttribute): Deleted.
+ (convertToNSArray): Deleted.
+
</ins><span class="cx"> 2017-01-30 Joseph Pecoraro <pecoraro@apple.com>
</span><span class="cx">
</span><span class="cx"> [WebIDL] Add support for inherit serializer attribute
</span></span></pre></div>
<a id="trunkSourceWebCoreaccessibilityiosWebAccessibilityObjectWrapperIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm (211410 => 211411)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm        2017-01-31 07:21:43 UTC (rev 211410)
+++ trunk/Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm        2017-01-31 08:07:49 UTC (rev 211411)
</span><span class="lines">@@ -1887,6 +1887,14 @@
</span><span class="cx"> return nil;
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+- (NSArray<WebAccessibilityObjectWrapper *> *)accessibilityFindMatchingObjects:(NSDictionary *)parameters
+{
+ AccessibilitySearchCriteria criteria = accessibilitySearchCriteriaForSearchPredicateParameterizedAttribute(parameters);
+ AccessibilityObject::AccessibilityChildrenVector results;
+ m_object->findMatchingObjects(&criteria, results);
+ return convertToNSArray(results);
+}
+
</ins><span class="cx"> - (void)accessibilityElementDidBecomeFocused
</span><span class="cx"> {
</span><span class="cx"> if (![self _prepareAccessibilityCall])
</span></span></pre></div>
<a id="trunkSourceWebCoreaccessibilitymacWebAccessibilityObjectWrapperBaseh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperBase.h (211410 => 211411)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperBase.h        2017-01-31 07:21:43 UTC (rev 211410)
+++ trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperBase.h        2017-01-31 08:07:49 UTC (rev 211411)
</span><span class="lines">@@ -29,10 +29,12 @@
</span><span class="cx"> #ifndef WebAccessibilityObjectWrapperBase_h
</span><span class="cx"> #define WebAccessibilityObjectWrapperBase_h
</span><span class="cx">
</span><ins>+#include "AccessibilityObject.h"
</ins><span class="cx"> #include <CoreGraphics/CoreGraphics.h>
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> class AccessibilityObject;
</span><ins>+struct AccessibilitySearchCriteria;
</ins><span class="cx"> class IntRect;
</span><span class="cx"> class FloatPoint;
</span><span class="cx"> class Path;
</span><span class="lines">@@ -67,6 +69,9 @@
</span><span class="cx"> - (NSArray *)accessibilityMathPostscriptPairs;
</span><span class="cx"> - (NSArray *)accessibilityMathPrescriptPairs;
</span><span class="cx">
</span><ins>+extern WebCore::AccessibilitySearchCriteria accessibilitySearchCriteriaForSearchPredicateParameterizedAttribute(const NSDictionary *);
+extern NSArray *convertToNSArray(const WebCore::AccessibilityObject::AccessibilityChildrenVector&);
+
</ins><span class="cx"> @end
</span><span class="cx">
</span><span class="cx"> #endif // WebAccessibilityObjectWrapperBase_h
</span></span></pre></div>
<a id="trunkSourceWebCoreaccessibilitymacWebAccessibilityObjectWrapperBasemm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperBase.mm (211410 => 211411)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperBase.mm        2017-01-31 07:21:43 UTC (rev 211410)
+++ trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperBase.mm        2017-01-31 08:07:49 UTC (rev 211411)
</span><span class="lines">@@ -67,6 +67,168 @@
</span><span class="cx"> using namespace WebCore;
</span><span class="cx"> using namespace HTMLNames;
</span><span class="cx">
</span><ins>+// Search Keys
+#ifndef NSAccessibilityAnyTypeSearchKey
+#define NSAccessibilityAnyTypeSearchKey @"AXAnyTypeSearchKey"
+#endif
+
+#ifndef NSAccessibilityBlockquoteSameLevelSearchKey
+#define NSAccessibilityBlockquoteSameLevelSearchKey @"AXBlockquoteSameLevelSearchKey"
+#endif
+
+#ifndef NSAccessibilityBlockquoteSearchKey
+#define NSAccessibilityBlockquoteSearchKey @"AXBlockquoteSearchKey"
+#endif
+
+#ifndef NSAccessibilityBoldFontSearchKey
+#define NSAccessibilityBoldFontSearchKey @"AXBoldFontSearchKey"
+#endif
+
+#ifndef NSAccessibilityButtonSearchKey
+#define NSAccessibilityButtonSearchKey @"AXButtonSearchKey"
+#endif
+
+#ifndef NSAccessibilityCheckBoxSearchKey
+#define NSAccessibilityCheckBoxSearchKey @"AXCheckBoxSearchKey"
+#endif
+
+#ifndef NSAccessibilityControlSearchKey
+#define NSAccessibilityControlSearchKey @"AXControlSearchKey"
+#endif
+
+#ifndef NSAccessibilityDifferentTypeSearchKey
+#define NSAccessibilityDifferentTypeSearchKey @"AXDifferentTypeSearchKey"
+#endif
+
+#ifndef NSAccessibilityFontChangeSearchKey
+#define NSAccessibilityFontChangeSearchKey @"AXFontChangeSearchKey"
+#endif
+
+#ifndef NSAccessibilityFontColorChangeSearchKey
+#define NSAccessibilityFontColorChangeSearchKey @"AXFontColorChangeSearchKey"
+#endif
+
+#ifndef NSAccessibilityFrameSearchKey
+#define NSAccessibilityFrameSearchKey @"AXFrameSearchKey"
+#endif
+
+#ifndef NSAccessibilityGraphicSearchKey
+#define NSAccessibilityGraphicSearchKey @"AXGraphicSearchKey"
+#endif
+
+#ifndef NSAccessibilityHeadingLevel1SearchKey
+#define NSAccessibilityHeadingLevel1SearchKey @"AXHeadingLevel1SearchKey"
+#endif
+
+#ifndef NSAccessibilityHeadingLevel2SearchKey
+#define NSAccessibilityHeadingLevel2SearchKey @"AXHeadingLevel2SearchKey"
+#endif
+
+#ifndef NSAccessibilityHeadingLevel3SearchKey
+#define NSAccessibilityHeadingLevel3SearchKey @"AXHeadingLevel3SearchKey"
+#endif
+
+#ifndef NSAccessibilityHeadingLevel4SearchKey
+#define NSAccessibilityHeadingLevel4SearchKey @"AXHeadingLevel4SearchKey"
+#endif
+
+#ifndef NSAccessibilityHeadingLevel5SearchKey
+#define NSAccessibilityHeadingLevel5SearchKey @"AXHeadingLevel5SearchKey"
+#endif
+
+#ifndef NSAccessibilityHeadingLevel6SearchKey
+#define NSAccessibilityHeadingLevel6SearchKey @"AXHeadingLevel6SearchKey"
+#endif
+
+#ifndef NSAccessibilityHeadingSameLevelSearchKey
+#define NSAccessibilityHeadingSameLevelSearchKey @"AXHeadingSameLevelSearchKey"
+#endif
+
+#ifndef NSAccessibilityHeadingSearchKey
+#define NSAccessibilityHeadingSearchKey @"AXHeadingSearchKey"
+#endif
+
+#ifndef NSAccessibilityHighlightedSearchKey
+#define NSAccessibilityHighlightedSearchKey @"AXHighlightedSearchKey"
+#endif
+
+#ifndef NSAccessibilityItalicFontSearchKey
+#define NSAccessibilityItalicFontSearchKey @"AXItalicFontSearchKey"
+#endif
+
+#ifndef NSAccessibilityLandmarkSearchKey
+#define NSAccessibilityLandmarkSearchKey @"AXLandmarkSearchKey"
+#endif
+
+#ifndef NSAccessibilityLinkSearchKey
+#define NSAccessibilityLinkSearchKey @"AXLinkSearchKey"
+#endif
+
+#ifndef NSAccessibilityListSearchKey
+#define NSAccessibilityListSearchKey @"AXListSearchKey"
+#endif
+
+#ifndef NSAccessibilityLiveRegionSearchKey
+#define NSAccessibilityLiveRegionSearchKey @"AXLiveRegionSearchKey"
+#endif
+
+#ifndef NSAccessibilityMisspelledWordSearchKey
+#define NSAccessibilityMisspelledWordSearchKey @"AXMisspelledWordSearchKey"
+#endif
+
+#ifndef NSAccessibilityOutlineSearchKey
+#define NSAccessibilityOutlineSearchKey @"AXOutlineSearchKey"
+#endif
+
+#ifndef NSAccessibilityPlainTextSearchKey
+#define NSAccessibilityPlainTextSearchKey @"AXPlainTextSearchKey"
+#endif
+
+#ifndef NSAccessibilityRadioGroupSearchKey
+#define NSAccessibilityRadioGroupSearchKey @"AXRadioGroupSearchKey"
+#endif
+
+#ifndef NSAccessibilitySameTypeSearchKey
+#define NSAccessibilitySameTypeSearchKey @"AXSameTypeSearchKey"
+#endif
+
+#ifndef NSAccessibilityStaticTextSearchKey
+#define NSAccessibilityStaticTextSearchKey @"AXStaticTextSearchKey"
+#endif
+
+#ifndef NSAccessibilityStyleChangeSearchKey
+#define NSAccessibilityStyleChangeSearchKey @"AXStyleChangeSearchKey"
+#endif
+
+#ifndef NSAccessibilityTableSameLevelSearchKey
+#define NSAccessibilityTableSameLevelSearchKey @"AXTableSameLevelSearchKey"
+#endif
+
+#ifndef NSAccessibilityTableSearchKey
+#define NSAccessibilityTableSearchKey @"AXTableSearchKey"
+#endif
+
+#ifndef NSAccessibilityTextFieldSearchKey
+#define NSAccessibilityTextFieldSearchKey @"AXTextFieldSearchKey"
+#endif
+
+#ifndef NSAccessibilityUnderlineSearchKey
+#define NSAccessibilityUnderlineSearchKey @"AXUnderlineSearchKey"
+#endif
+
+#ifndef NSAccessibilityUnvisitedLinkSearchKey
+#define NSAccessibilityUnvisitedLinkSearchKey @"AXUnvisitedLinkSearchKey"
+#endif
+
+#ifndef NSAccessibilityVisitedLinkSearchKey
+#define NSAccessibilityVisitedLinkSearchKey @"AXVisitedLinkSearchKey"
+#endif
+
+// Search
+#ifndef NSAccessibilityImmediateDescendantsOnly
+#define NSAccessibilityImmediateDescendantsOnly @"AXImmediateDescendantsOnly"
+#endif
+
</ins><span class="cx"> static NSArray *convertMathPairsToNSArray(const AccessibilityObject::AccessibilityMathMultiscriptPairs& pairs, NSString *subscriptKey, NSString *superscriptKey)
</span><span class="cx"> {
</span><span class="cx"> NSMutableArray *array = [NSMutableArray arrayWithCapacity:pairs.size()];
</span><span class="lines">@@ -81,6 +243,25 @@
</span><span class="cx"> return array;
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+
+NSArray *convertToNSArray(const AccessibilityObject::AccessibilityChildrenVector& vector)
+{
+ NSMutableArray *array = [NSMutableArray arrayWithCapacity:vector.size()];
+ for (const auto& child : vector) {
+ WebAccessibilityObjectWrapper* wrapper = child->wrapper();
+ ASSERT(wrapper);
+ if (wrapper) {
+ // we want to return the attachment view instead of the object representing the attachment.
+ // otherwise, we get palindrome errors in the AX hierarchy
+ if (child->isAttachment() && [wrapper attachmentView])
+ [array addObject:[wrapper attachmentView]];
+ else
+ [array addObject:wrapper];
+ }
+ }
+ return [[array copy] autorelease];
+}
+
</ins><span class="cx"> @implementation WebAccessibilityObjectWrapperBase
</span><span class="cx">
</span><span class="cx"> - (id)initWithAccessibilityObject:(AccessibilityObject*)axObject
</span><span class="lines">@@ -455,6 +636,127 @@
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+#pragma mark Search helpers
+
+typedef HashMap<String, AccessibilitySearchKey> AccessibilitySearchKeyMap;
+
+struct SearchKeyEntry {
+ String key;
+ AccessibilitySearchKey value;
+};
+
+static AccessibilitySearchKeyMap* createAccessibilitySearchKeyMap()
+{
+ const SearchKeyEntry searchKeys[] = {
+ { NSAccessibilityAnyTypeSearchKey, AnyTypeSearchKey },
+ { NSAccessibilityBlockquoteSameLevelSearchKey, BlockquoteSameLevelSearchKey },
+ { NSAccessibilityBlockquoteSearchKey, BlockquoteSearchKey },
+ { NSAccessibilityBoldFontSearchKey, BoldFontSearchKey },
+ { NSAccessibilityButtonSearchKey, ButtonSearchKey },
+ { NSAccessibilityCheckBoxSearchKey, CheckBoxSearchKey },
+ { NSAccessibilityControlSearchKey, ControlSearchKey },
+ { NSAccessibilityDifferentTypeSearchKey, DifferentTypeSearchKey },
+ { NSAccessibilityFontChangeSearchKey, FontChangeSearchKey },
+ { NSAccessibilityFontColorChangeSearchKey, FontColorChangeSearchKey },
+ { NSAccessibilityFrameSearchKey, FrameSearchKey },
+ { NSAccessibilityGraphicSearchKey, GraphicSearchKey },
+ { NSAccessibilityHeadingLevel1SearchKey, HeadingLevel1SearchKey },
+ { NSAccessibilityHeadingLevel2SearchKey, HeadingLevel2SearchKey },
+ { NSAccessibilityHeadingLevel3SearchKey, HeadingLevel3SearchKey },
+ { NSAccessibilityHeadingLevel4SearchKey, HeadingLevel4SearchKey },
+ { NSAccessibilityHeadingLevel5SearchKey, HeadingLevel5SearchKey },
+ { NSAccessibilityHeadingLevel6SearchKey, HeadingLevel6SearchKey },
+ { NSAccessibilityHeadingSameLevelSearchKey, HeadingSameLevelSearchKey },
+ { NSAccessibilityHeadingSearchKey, HeadingSearchKey },
+ { NSAccessibilityHighlightedSearchKey, HighlightedSearchKey },
+ { NSAccessibilityItalicFontSearchKey, ItalicFontSearchKey },
+ { NSAccessibilityLandmarkSearchKey, LandmarkSearchKey },
+ { NSAccessibilityLinkSearchKey, LinkSearchKey },
+ { NSAccessibilityListSearchKey, ListSearchKey },
+ { NSAccessibilityLiveRegionSearchKey, LiveRegionSearchKey },
+ { NSAccessibilityMisspelledWordSearchKey, MisspelledWordSearchKey },
+ { NSAccessibilityOutlineSearchKey, OutlineSearchKey },
+ { NSAccessibilityPlainTextSearchKey, PlainTextSearchKey },
+ { NSAccessibilityRadioGroupSearchKey, RadioGroupSearchKey },
+ { NSAccessibilitySameTypeSearchKey, SameTypeSearchKey },
+ { NSAccessibilityStaticTextSearchKey, StaticTextSearchKey },
+ { NSAccessibilityStyleChangeSearchKey, StyleChangeSearchKey },
+ { NSAccessibilityTableSameLevelSearchKey, TableSameLevelSearchKey },
+ { NSAccessibilityTableSearchKey, TableSearchKey },
+ { NSAccessibilityTextFieldSearchKey, TextFieldSearchKey },
+ { NSAccessibilityUnderlineSearchKey, UnderlineSearchKey },
+ { NSAccessibilityUnvisitedLinkSearchKey, UnvisitedLinkSearchKey },
+ { NSAccessibilityVisitedLinkSearchKey, VisitedLinkSearchKey }
+ };
+
+ AccessibilitySearchKeyMap* searchKeyMap = new AccessibilitySearchKeyMap;
+ for (size_t i = 0; i < WTF_ARRAY_LENGTH(searchKeys); i++)
+ searchKeyMap->set(searchKeys[i].key, searchKeys[i].value);
+
+ return searchKeyMap;
+}
+
+static AccessibilitySearchKey accessibilitySearchKeyForString(const String& value)
+{
+ if (value.isEmpty())
+ return AnyTypeSearchKey;
+
+ static const AccessibilitySearchKeyMap* searchKeyMap = createAccessibilitySearchKeyMap();
+ AccessibilitySearchKey searchKey = searchKeyMap->get(value);
+ return searchKey ? searchKey : AnyTypeSearchKey;
+}
+
+AccessibilitySearchCriteria accessibilitySearchCriteriaForSearchPredicateParameterizedAttribute(const NSDictionary *parameterizedAttribute)
+{
+ NSString *directionParameter = [parameterizedAttribute objectForKey:@"AXDirection"];
+ NSNumber *immediateDescendantsOnlyParameter = [parameterizedAttribute objectForKey:NSAccessibilityImmediateDescendantsOnly];
+ NSNumber *resultsLimitParameter = [parameterizedAttribute objectForKey:@"AXResultsLimit"];
+ NSString *searchTextParameter = [parameterizedAttribute objectForKey:@"AXSearchText"];
+ WebAccessibilityObjectWrapperBase *startElementParameter = [parameterizedAttribute objectForKey:@"AXStartElement"];
+ NSNumber *visibleOnlyParameter = [parameterizedAttribute objectForKey:@"AXVisibleOnly"];
+ id searchKeyParameter = [parameterizedAttribute objectForKey:@"AXSearchKey"];
+
+ AccessibilitySearchDirection direction = SearchDirectionNext;
+ if ([directionParameter isKindOfClass:[NSString class]])
+ direction = [directionParameter isEqualToString:@"AXDirectionNext"] ? SearchDirectionNext : SearchDirectionPrevious;
+
+ bool immediateDescendantsOnly = false;
+ if ([immediateDescendantsOnlyParameter isKindOfClass:[NSNumber class]])
+ immediateDescendantsOnly = [immediateDescendantsOnlyParameter boolValue];
+
+ unsigned resultsLimit = 0;
+ if ([resultsLimitParameter isKindOfClass:[NSNumber class]])
+ resultsLimit = [resultsLimitParameter unsignedIntValue];
+
+ String searchText;
+ if ([searchTextParameter isKindOfClass:[NSString class]])
+ searchText = searchTextParameter;
+
+ AccessibilityObject* startElement = nullptr;
+ if ([startElementParameter isKindOfClass:[WebAccessibilityObjectWrapperBase class]])
+ startElement = [startElementParameter accessibilityObject];
+
+ bool visibleOnly = false;
+ if ([visibleOnlyParameter isKindOfClass:[NSNumber class]])
+ visibleOnly = [visibleOnlyParameter boolValue];
+
+ AccessibilitySearchCriteria criteria = AccessibilitySearchCriteria(startElement, direction, searchText, resultsLimit, visibleOnly, immediateDescendantsOnly);
+
+ if ([searchKeyParameter isKindOfClass:[NSString class]])
+ criteria.searchKeys.append(accessibilitySearchKeyForString(searchKeyParameter));
+ else if ([searchKeyParameter isKindOfClass:[NSArray class]]) {
+ size_t searchKeyCount = static_cast<size_t>([searchKeyParameter count]);
+ criteria.searchKeys.reserveInitialCapacity(searchKeyCount);
+ for (size_t i = 0; i < searchKeyCount; ++i) {
+ NSString *searchKey = [searchKeyParameter objectAtIndex:i];
+ if ([searchKey isKindOfClass:[NSString class]])
+ criteria.searchKeys.uncheckedAppend(accessibilitySearchKeyForString(searchKey));
+ }
+ }
+
+ return criteria;
+}
+
</ins><span class="cx"> @end
</span><span class="cx">
</span><span class="cx"> #endif // HAVE(ACCESSIBILITY)
</span></span></pre></div>
<a id="trunkSourceWebCoreaccessibilitymacWebAccessibilityObjectWrapperMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm (211410 => 211411)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm        2017-01-31 07:21:43 UTC (rev 211410)
+++ trunk/Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm        2017-01-31 08:07:49 UTC (rev 211411)
</span><span class="lines">@@ -282,10 +282,6 @@
</span><span class="cx"> #define NSAccessibilityARIARowCountAttribute @"AXARIARowCount"
</span><span class="cx"> #endif
</span><span class="cx">
</span><del>-// Search
-#ifndef NSAccessibilityImmediateDescendantsOnly
-#define NSAccessibilityImmediateDescendantsOnly @"AXImmediateDescendantsOnly"
-#endif
</del><span class="cx">
</span><span class="cx"> #ifndef NSAccessibilityUIElementCountForSearchPredicateParameterizedAttribute
</span><span class="cx"> #define NSAccessibilityUIElementCountForSearchPredicateParameterizedAttribute @"AXUIElementCountForSearchPredicate"
</span><span class="lines">@@ -295,163 +291,6 @@
</span><span class="cx"> #define NSAccessibilityUIElementsForSearchPredicateParameterizedAttribute @"AXUIElementsForSearchPredicate"
</span><span class="cx"> #endif
</span><span class="cx">
</span><del>-// Search Keys
-#ifndef NSAccessibilityAnyTypeSearchKey
-#define NSAccessibilityAnyTypeSearchKey @"AXAnyTypeSearchKey"
-#endif
-
-#ifndef NSAccessibilityBlockquoteSameLevelSearchKey
-#define NSAccessibilityBlockquoteSameLevelSearchKey @"AXBlockquoteSameLevelSearchKey"
-#endif
-
-#ifndef NSAccessibilityBlockquoteSearchKey
-#define NSAccessibilityBlockquoteSearchKey @"AXBlockquoteSearchKey"
-#endif
-
-#ifndef NSAccessibilityBoldFontSearchKey
-#define NSAccessibilityBoldFontSearchKey @"AXBoldFontSearchKey"
-#endif
-
-#ifndef NSAccessibilityButtonSearchKey
-#define NSAccessibilityButtonSearchKey @"AXButtonSearchKey"
-#endif
-
-#ifndef NSAccessibilityCheckBoxSearchKey
-#define NSAccessibilityCheckBoxSearchKey @"AXCheckBoxSearchKey"
-#endif
-
-#ifndef NSAccessibilityControlSearchKey
-#define NSAccessibilityControlSearchKey @"AXControlSearchKey"
-#endif
-
-#ifndef NSAccessibilityDifferentTypeSearchKey
-#define NSAccessibilityDifferentTypeSearchKey @"AXDifferentTypeSearchKey"
-#endif
-
-#ifndef NSAccessibilityFontChangeSearchKey
-#define NSAccessibilityFontChangeSearchKey @"AXFontChangeSearchKey"
-#endif
-
-#ifndef NSAccessibilityFontColorChangeSearchKey
-#define NSAccessibilityFontColorChangeSearchKey @"AXFontColorChangeSearchKey"
-#endif
-
-#ifndef NSAccessibilityFrameSearchKey
-#define NSAccessibilityFrameSearchKey @"AXFrameSearchKey"
-#endif
-
-#ifndef NSAccessibilityGraphicSearchKey
-#define NSAccessibilityGraphicSearchKey @"AXGraphicSearchKey"
-#endif
-
-#ifndef NSAccessibilityHeadingLevel1SearchKey
-#define NSAccessibilityHeadingLevel1SearchKey @"AXHeadingLevel1SearchKey"
-#endif
-
-#ifndef NSAccessibilityHeadingLevel2SearchKey
-#define NSAccessibilityHeadingLevel2SearchKey @"AXHeadingLevel2SearchKey"
-#endif
-
-#ifndef NSAccessibilityHeadingLevel3SearchKey
-#define NSAccessibilityHeadingLevel3SearchKey @"AXHeadingLevel3SearchKey"
-#endif
-
-#ifndef NSAccessibilityHeadingLevel4SearchKey
-#define NSAccessibilityHeadingLevel4SearchKey @"AXHeadingLevel4SearchKey"
-#endif
-
-#ifndef NSAccessibilityHeadingLevel5SearchKey
-#define NSAccessibilityHeadingLevel5SearchKey @"AXHeadingLevel5SearchKey"
-#endif
-
-#ifndef NSAccessibilityHeadingLevel6SearchKey
-#define NSAccessibilityHeadingLevel6SearchKey @"AXHeadingLevel6SearchKey"
-#endif
-
-#ifndef NSAccessibilityHeadingSameLevelSearchKey
-#define NSAccessibilityHeadingSameLevelSearchKey @"AXHeadingSameLevelSearchKey"
-#endif
-
-#ifndef NSAccessibilityHeadingSearchKey
-#define NSAccessibilityHeadingSearchKey @"AXHeadingSearchKey"
-#endif
-
-#ifndef NSAccessibilityHighlightedSearchKey
-#define NSAccessibilityHighlightedSearchKey @"AXHighlightedSearchKey"
-#endif
-
-#ifndef NSAccessibilityItalicFontSearchKey
-#define NSAccessibilityItalicFontSearchKey @"AXItalicFontSearchKey"
-#endif
-
-#ifndef NSAccessibilityLandmarkSearchKey
-#define NSAccessibilityLandmarkSearchKey @"AXLandmarkSearchKey"
-#endif
-
-#ifndef NSAccessibilityLinkSearchKey
-#define NSAccessibilityLinkSearchKey @"AXLinkSearchKey"
-#endif
-
-#ifndef NSAccessibilityListSearchKey
-#define NSAccessibilityListSearchKey @"AXListSearchKey"
-#endif
-
-#ifndef NSAccessibilityLiveRegionSearchKey
-#define NSAccessibilityLiveRegionSearchKey @"AXLiveRegionSearchKey"
-#endif
-
-#ifndef NSAccessibilityMisspelledWordSearchKey
-#define NSAccessibilityMisspelledWordSearchKey @"AXMisspelledWordSearchKey"
-#endif
-
-#ifndef NSAccessibilityOutlineSearchKey
-#define NSAccessibilityOutlineSearchKey @"AXOutlineSearchKey"
-#endif
-
-#ifndef NSAccessibilityPlainTextSearchKey
-#define NSAccessibilityPlainTextSearchKey @"AXPlainTextSearchKey"
-#endif
-
-#ifndef NSAccessibilityRadioGroupSearchKey
-#define NSAccessibilityRadioGroupSearchKey @"AXRadioGroupSearchKey"
-#endif
-
-#ifndef NSAccessibilitySameTypeSearchKey
-#define NSAccessibilitySameTypeSearchKey @"AXSameTypeSearchKey"
-#endif
-
-#ifndef NSAccessibilityStaticTextSearchKey
-#define NSAccessibilityStaticTextSearchKey @"AXStaticTextSearchKey"
-#endif
-
-#ifndef NSAccessibilityStyleChangeSearchKey
-#define NSAccessibilityStyleChangeSearchKey @"AXStyleChangeSearchKey"
-#endif
-
-#ifndef NSAccessibilityTableSameLevelSearchKey
-#define NSAccessibilityTableSameLevelSearchKey @"AXTableSameLevelSearchKey"
-#endif
-
-#ifndef NSAccessibilityTableSearchKey
-#define NSAccessibilityTableSearchKey @"AXTableSearchKey"
-#endif
-
-#ifndef NSAccessibilityTextFieldSearchKey
-#define NSAccessibilityTextFieldSearchKey @"AXTextFieldSearchKey"
-#endif
-
-#ifndef NSAccessibilityUnderlineSearchKey
-#define NSAccessibilityUnderlineSearchKey @"AXUnderlineSearchKey"
-#endif
-
-#ifndef NSAccessibilityUnvisitedLinkSearchKey
-#define NSAccessibilityUnvisitedLinkSearchKey @"AXUnvisitedLinkSearchKey"
-#endif
-
-#ifndef NSAccessibilityVisitedLinkSearchKey
-#define NSAccessibilityVisitedLinkSearchKey @"AXVisitedLinkSearchKey"
-#endif
-
</del><span class="cx"> // Text markers
</span><span class="cx"> #ifndef NSAccessibilityEndTextMarkerForBoundsParameterizedAttribute
</span><span class="cx"> #define NSAccessibilityEndTextMarkerForBoundsParameterizedAttribute @"AXEndTextMarkerForBounds"
</span><span class="lines">@@ -632,129 +471,6 @@
</span><span class="cx"> return IntRect(startPoint.x(), startPoint.y(), endPoint.x() - startPoint.x(), endPoint.y() - startPoint.y());
</span><span class="cx"> }
</span><span class="cx">
</span><del>-#pragma mark Search helpers
-
-typedef HashMap<String, AccessibilitySearchKey> AccessibilitySearchKeyMap;
-
-struct SearchKeyEntry {
- String key;
- AccessibilitySearchKey value;
-};
-
-static AccessibilitySearchKeyMap* createAccessibilitySearchKeyMap()
-{
- const SearchKeyEntry searchKeys[] = {
- { NSAccessibilityAnyTypeSearchKey, AnyTypeSearchKey },
- { NSAccessibilityBlockquoteSameLevelSearchKey, BlockquoteSameLevelSearchKey },
- { NSAccessibilityBlockquoteSearchKey, BlockquoteSearchKey },
- { NSAccessibilityBoldFontSearchKey, BoldFontSearchKey },
- { NSAccessibilityButtonSearchKey, ButtonSearchKey },
- { NSAccessibilityCheckBoxSearchKey, CheckBoxSearchKey },
- { NSAccessibilityControlSearchKey, ControlSearchKey },
- { NSAccessibilityDifferentTypeSearchKey, DifferentTypeSearchKey },
- { NSAccessibilityFontChangeSearchKey, FontChangeSearchKey },
- { NSAccessibilityFontColorChangeSearchKey, FontColorChangeSearchKey },
- { NSAccessibilityFrameSearchKey, FrameSearchKey },
- { NSAccessibilityGraphicSearchKey, GraphicSearchKey },
- { NSAccessibilityHeadingLevel1SearchKey, HeadingLevel1SearchKey },
- { NSAccessibilityHeadingLevel2SearchKey, HeadingLevel2SearchKey },
- { NSAccessibilityHeadingLevel3SearchKey, HeadingLevel3SearchKey },
- { NSAccessibilityHeadingLevel4SearchKey, HeadingLevel4SearchKey },
- { NSAccessibilityHeadingLevel5SearchKey, HeadingLevel5SearchKey },
- { NSAccessibilityHeadingLevel6SearchKey, HeadingLevel6SearchKey },
- { NSAccessibilityHeadingSameLevelSearchKey, HeadingSameLevelSearchKey },
- { NSAccessibilityHeadingSearchKey, HeadingSearchKey },
- { NSAccessibilityHighlightedSearchKey, HighlightedSearchKey },
- { NSAccessibilityItalicFontSearchKey, ItalicFontSearchKey },
- { NSAccessibilityLandmarkSearchKey, LandmarkSearchKey },
- { NSAccessibilityLinkSearchKey, LinkSearchKey },
- { NSAccessibilityListSearchKey, ListSearchKey },
- { NSAccessibilityLiveRegionSearchKey, LiveRegionSearchKey },
- { NSAccessibilityMisspelledWordSearchKey, MisspelledWordSearchKey },
- { NSAccessibilityOutlineSearchKey, OutlineSearchKey },
- { NSAccessibilityPlainTextSearchKey, PlainTextSearchKey },
- { NSAccessibilityRadioGroupSearchKey, RadioGroupSearchKey },
- { NSAccessibilitySameTypeSearchKey, SameTypeSearchKey },
- { NSAccessibilityStaticTextSearchKey, StaticTextSearchKey },
- { NSAccessibilityStyleChangeSearchKey, StyleChangeSearchKey },
- { NSAccessibilityTableSameLevelSearchKey, TableSameLevelSearchKey },
- { NSAccessibilityTableSearchKey, TableSearchKey },
- { NSAccessibilityTextFieldSearchKey, TextFieldSearchKey },
- { NSAccessibilityUnderlineSearchKey, UnderlineSearchKey },
- { NSAccessibilityUnvisitedLinkSearchKey, UnvisitedLinkSearchKey },
- { NSAccessibilityVisitedLinkSearchKey, VisitedLinkSearchKey }
- };
-
- AccessibilitySearchKeyMap* searchKeyMap = new AccessibilitySearchKeyMap;
- for (size_t i = 0; i < WTF_ARRAY_LENGTH(searchKeys); i++)
- searchKeyMap->set(searchKeys[i].key, searchKeys[i].value);
-
- return searchKeyMap;
-}
-
-static AccessibilitySearchKey accessibilitySearchKeyForString(const String& value)
-{
- if (value.isEmpty())
- return AnyTypeSearchKey;
-
- static const AccessibilitySearchKeyMap* searchKeyMap = createAccessibilitySearchKeyMap();
-
- AccessibilitySearchKey searchKey = searchKeyMap->get(value);
-
- return searchKey ? searchKey : AnyTypeSearchKey;
-}
-
-static AccessibilitySearchCriteria accessibilitySearchCriteriaForSearchPredicateParameterizedAttribute(const NSDictionary *parameterizedAttribute)
-{
- NSString *directionParameter = [parameterizedAttribute objectForKey:@"AXDirection"];
- NSNumber *immediateDescendantsOnlyParameter = [parameterizedAttribute objectForKey:NSAccessibilityImmediateDescendantsOnly];
- NSNumber *resultsLimitParameter = [parameterizedAttribute objectForKey:@"AXResultsLimit"];
- NSString *searchTextParameter = [parameterizedAttribute objectForKey:@"AXSearchText"];
- WebAccessibilityObjectWrapper *startElementParameter = [parameterizedAttribute objectForKey:@"AXStartElement"];
- NSNumber *visibleOnlyParameter = [parameterizedAttribute objectForKey:@"AXVisibleOnly"];
- id searchKeyParameter = [parameterizedAttribute objectForKey:@"AXSearchKey"];
-
- AccessibilitySearchDirection direction = SearchDirectionNext;
- if ([directionParameter isKindOfClass:[NSString class]])
- direction = [directionParameter isEqualToString:@"AXDirectionNext"] ? SearchDirectionNext : SearchDirectionPrevious;
-
- bool immediateDescendantsOnly = false;
- if ([immediateDescendantsOnlyParameter isKindOfClass:[NSNumber class]])
- immediateDescendantsOnly = [immediateDescendantsOnlyParameter boolValue];
-
- unsigned resultsLimit = 0;
- if ([resultsLimitParameter isKindOfClass:[NSNumber class]])
- resultsLimit = [resultsLimitParameter unsignedIntValue];
-
- String searchText;
- if ([searchTextParameter isKindOfClass:[NSString class]])
- searchText = searchTextParameter;
-
- AccessibilityObject* startElement = nullptr;
- if ([startElementParameter isKindOfClass:[WebAccessibilityObjectWrapper class]])
- startElement = [startElementParameter accessibilityObject];
-
- bool visibleOnly = false;
- if ([visibleOnlyParameter isKindOfClass:[NSNumber class]])
- visibleOnly = [visibleOnlyParameter boolValue];
-
- AccessibilitySearchCriteria criteria = AccessibilitySearchCriteria(startElement, direction, searchText, resultsLimit, visibleOnly, immediateDescendantsOnly);
-
- if ([searchKeyParameter isKindOfClass:[NSString class]])
- criteria.searchKeys.append(accessibilitySearchKeyForString(searchKeyParameter));
- else if ([searchKeyParameter isKindOfClass:[NSArray class]]) {
- size_t searchKeyCount = static_cast<size_t>([searchKeyParameter count]);
- criteria.searchKeys.reserveInitialCapacity(searchKeyCount);
- for (size_t i = 0; i < searchKeyCount; ++i) {
- NSString *searchKey = [searchKeyParameter objectAtIndex:i];
- if ([searchKey isKindOfClass:[NSString class]])
- criteria.searchKeys.uncheckedAppend(accessibilitySearchKeyForString(searchKey));
- }
- }
-
- return criteria;
-}
-
</del><span class="cx"> #pragma mark Select text helpers
</span><span class="cx">
</span><span class="cx"> static AccessibilitySelectTextCriteria accessibilitySelectTextCriteriaForCriteriaParameterizedAttribute(const NSDictionary *parameterizedAttribute)
</span><span class="lines">@@ -1950,24 +1666,6 @@
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><del>-static NSMutableArray* convertToNSArray(const AccessibilityObject::AccessibilityChildrenVector& vector)
-{
- NSMutableArray* array = [NSMutableArray arrayWithCapacity:vector.size()];
- for (const auto& child : vector) {
- WebAccessibilityObjectWrapper* wrapper = child->wrapper();
- ASSERT(wrapper);
- if (wrapper) {
- // we want to return the attachment view instead of the object representing the attachment.
- // otherwise, we get palindrome errors in the AX hierarchy
- if (child->isAttachment() && [wrapper attachmentView])
- [array addObject:[wrapper attachmentView]];
- else
- [array addObject:wrapper];
- }
- }
- return array;
-}
-
</del><span class="cx"> static NSMutableArray *convertStringsToNSArray(const Vector<String>& vector)
</span><span class="cx"> {
</span><span class="cx"> NSMutableArray *array = [NSMutableArray arrayWithCapacity:vector.size()];
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (211410 => 211411)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2017-01-31 07:21:43 UTC (rev 211410)
+++ trunk/Tools/ChangeLog        2017-01-31 08:07:49 UTC (rev 211411)
</span><span class="lines">@@ -1,3 +1,28 @@
</span><ins>+2017-01-31 Chris Fleizach <cfleizach@apple.com>
+
+ AX: enable search predication for iOS
+ https://bugs.webkit.org/show_bug.cgi?id=167558
+ <rdar://problem/30251367>
+
+ Reviewed by Joanmarie Diggs.
+
+ * DumpRenderTree/ios/AccessibilityUIElementIOS.mm:
+ (AccessibilityUIElement::uiElementForSearchPredicate):
+ * DumpRenderTree/mac/AccessibilityCommonMac.h:
+ * DumpRenderTree/mac/AccessibilityCommonMac.mm:
+ (searchPredicateParameterizedAttributeForSearchCriteria):
+ * DumpRenderTree/mac/AccessibilityUIElementMac.mm:
+ (searchPredicateParameterizedAttributeForSearchCriteria): Deleted.
+ * WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm:
+ (WTR::AccessibilityUIElement::uiElementCountForSearchPredicate):
+ (WTR::AccessibilityUIElement::uiElementForSearchPredicate):
+ * WebKitTestRunner/InjectedBundle/mac/AccessibilityCommonMac.h:
+ * WebKitTestRunner/InjectedBundle/mac/AccessibilityCommonMac.mm:
+ (WTR::searchPredicateParameterizedAttributeForSearchCriteria):
+ * WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm:
+ (WTR::searchPredicateParameterizedAttributeForSearchCriteria): Deleted.
+ * WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj:
+
</ins><span class="cx"> 2017-01-30 Jonathan Bedard <jbedard@apple.com>
</span><span class="cx">
</span><span class="cx"> Workaround for simctl launch bug
</span></span></pre></div>
<a id="trunkToolsDumpRenderTreeiosAccessibilityUIElementIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Tools/DumpRenderTree/ios/AccessibilityUIElementIOS.mm (211410 => 211411)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/DumpRenderTree/ios/AccessibilityUIElementIOS.mm        2017-01-31 07:21:43 UTC (rev 211410)
+++ trunk/Tools/DumpRenderTree/ios/AccessibilityUIElementIOS.mm        2017-01-31 08:07:49 UTC (rev 211411)
</span><span class="lines">@@ -100,6 +100,7 @@
</span><span class="cx"> - (NSString *)accessibilitySortDirection;
</span><span class="cx"> - (BOOL)accessibilityIsExpanded;
</span><span class="cx"> - (NSUInteger)accessibilityBlockquoteLevel;
</span><ins>+- (NSArray *)accessibilityFindMatchingObjects:(NSDictionary *)parameters;
</ins><span class="cx">
</span><span class="cx"> // TextMarker related
</span><span class="cx"> - (NSArray *)textMarkerRange;
</span><span class="lines">@@ -1120,10 +1121,13 @@
</span><span class="cx"> return 0;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-AccessibilityUIElement AccessibilityUIElement::uiElementForSearchPredicate(JSContextRef context, AccessibilityUIElement* startElement, bool isDirectionNext, JSValueRef searchKey, JSStringRef searchText, bool visibleOnly, bool immediateDescendantsOnly)
</del><ins>+AccessibilityUIElement AccessibilityUIElement::uiElementForSearchPredicate(JSContextRef context, AccessibilityUIElement *startElement, bool isDirectionNext, JSValueRef searchKey, JSStringRef searchText, bool visibleOnly, bool immediateDescendantsOnly)
</ins><span class="cx"> {
</span><del>- // FIXME: implement
- return 0;
</del><ins>+ NSDictionary *parameterizedAttribute = searchPredicateParameterizedAttributeForSearchCriteria(context, startElement, isDirectionNext, 1, searchKey, searchText, visibleOnly, immediateDescendantsOnly);
+ id value = [m_element accessibilityFindMatchingObjects:parameterizedAttribute];
+ if (![value isKindOfClass:[NSArray class]])
+ return nullptr;
+ return AccessibilityUIElement([value lastObject]);
</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="trunkToolsDumpRenderTreemacAccessibilityCommonMach"></a>
<div class="modfile"><h4>Modified: trunk/Tools/DumpRenderTree/mac/AccessibilityCommonMac.h (211410 => 211411)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/DumpRenderTree/mac/AccessibilityCommonMac.h        2017-01-31 07:21:43 UTC (rev 211410)
+++ trunk/Tools/DumpRenderTree/mac/AccessibilityCommonMac.h        2017-01-31 08:07:49 UTC (rev 211411)
</span><span class="lines">@@ -31,6 +31,8 @@
</span><span class="cx"> #ifndef AccessibilityCommonMac_h
</span><span class="cx"> #define AccessibilityCommonMac_h
</span><span class="cx">
</span><ins>+#import "AccessibilityUIElement.h"
+
</ins><span class="cx"> #import <JavaScriptCore/JSStringRef.h>
</span><span class="cx">
</span><span class="cx"> // If an unsupported attribute is passed in, it will raise an accessibility exception. These are usually caught by the Accessibility Runtime to inform
</span><span class="lines">@@ -44,4 +46,6 @@
</span><span class="cx"> - (JSStringRef)createJSStringRef;
</span><span class="cx"> @end
</span><span class="cx">
</span><ins>+extern NSDictionary *searchPredicateParameterizedAttributeForSearchCriteria(JSContextRef, AccessibilityUIElement *startElement, bool isDirectionNext, unsigned resultsLimit, JSValueRef searchKey, JSStringRef searchText, bool visibleOnly, bool immediateDescendantsOnly);
+
</ins><span class="cx"> #endif // AccessibilityCommonMac_h
</span></span></pre></div>
<a id="trunkToolsDumpRenderTreemacAccessibilityCommonMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Tools/DumpRenderTree/mac/AccessibilityCommonMac.mm (211410 => 211411)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/DumpRenderTree/mac/AccessibilityCommonMac.mm        2017-01-31 07:21:43 UTC (rev 211410)
+++ trunk/Tools/DumpRenderTree/mac/AccessibilityCommonMac.mm        2017-01-31 08:07:49 UTC (rev 211411)
</span><span class="lines">@@ -31,6 +31,8 @@
</span><span class="cx"> #import "config.h"
</span><span class="cx"> #import "AccessibilityCommonMac.h"
</span><span class="cx">
</span><ins>+#import <JavaScriptCore/JSRetainPtr.h>
+#import <JavaScriptCore/JSStringRef.h>
</ins><span class="cx"> #import <JavaScriptCore/JSStringRefCF.h>
</span><span class="cx">
</span><span class="cx"> @implementation NSString (JSStringRefAdditions)
</span><span class="lines">@@ -49,4 +51,56 @@
</span><span class="cx"> return JSStringCreateWithCFString((CFStringRef)self);
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+NSDictionary *searchPredicateParameterizedAttributeForSearchCriteria(JSContextRef context, AccessibilityUIElement *startElement, bool isDirectionNext, unsigned resultsLimit, JSValueRef searchKey, JSStringRef searchText, bool visibleOnly, bool immediateDescendantsOnly)
+{
+ NSMutableDictionary *parameterizedAttribute = [NSMutableDictionary dictionary];
+
+ if (startElement && startElement->platformUIElement())
+ [parameterizedAttribute setObject:(id)startElement->platformUIElement() forKey:@"AXStartElement"];
+
+ [parameterizedAttribute setObject:(isDirectionNext) ? @"AXDirectionNext" : @"AXDirectionPrevious" forKey:@"AXDirection"];
+
+ [parameterizedAttribute setObject:@(resultsLimit) forKey:@"AXResultsLimit"];
+
+ if (searchKey) {
+ id searchKeyParameter = nil;
+ if (JSValueIsString(context, searchKey)) {
+ JSRetainPtr<JSStringRef> searchKeyString(Adopt, JSValueToStringCopy(context, searchKey, nullptr));
+ if (searchKeyString)
+ searchKeyParameter = [NSString stringWithJSStringRef:searchKeyString.get()];
+ } else if (JSValueIsObject(context, searchKey)) {
+ JSObjectRef searchKeyArray = JSValueToObject(context, searchKey, nullptr);
+ unsigned searchKeyArrayLength = 0;
+
+ JSRetainPtr<JSStringRef> lengthPropertyString(Adopt, JSStringCreateWithUTF8CString("length"));
+ JSValueRef searchKeyArrayLengthValue = JSObjectGetProperty(context, searchKeyArray, lengthPropertyString.get(), nullptr);
+ if (searchKeyArrayLengthValue && JSValueIsNumber(context, searchKeyArrayLengthValue))
+ searchKeyArrayLength = static_cast<unsigned>(JSValueToNumber(context, searchKeyArrayLengthValue, nullptr));
+
+ for (unsigned i = 0; i < searchKeyArrayLength; ++i) {
+ JSValueRef searchKeyValue = JSObjectGetPropertyAtIndex(context, searchKeyArray, i, nullptr);
+ JSStringRef searchKeyString = JSValueToStringCopy(context, searchKeyValue, nullptr);
+ if (searchKeyString) {
+ if (!searchKeyParameter)
+ searchKeyParameter = [NSMutableArray array];
+ [searchKeyParameter addObject:[NSString stringWithJSStringRef:searchKeyString]];
+ JSStringRelease(searchKeyString);
+ }
+ }
+ }
+ if (searchKeyParameter)
+ [parameterizedAttribute setObject:searchKeyParameter forKey:@"AXSearchKey"];
+ }
+
+ if (searchText && JSStringGetLength(searchText))
+ [parameterizedAttribute setObject:[NSString stringWithJSStringRef:searchText] forKey:@"AXSearchText"];
+
+ [parameterizedAttribute setObject:@(visibleOnly) forKey:@"AXVisibleOnly"];
+
+ [parameterizedAttribute setObject:@(immediateDescendantsOnly) forKey:@"AXImmediateDescendantsOnly"];
+
+ return parameterizedAttribute;
+}
+
+
</ins><span class="cx"> @end
</span></span></pre></div>
<a id="trunkToolsDumpRenderTreemacAccessibilityUIElementMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Tools/DumpRenderTree/mac/AccessibilityUIElementMac.mm (211410 => 211411)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/DumpRenderTree/mac/AccessibilityUIElementMac.mm        2017-01-31 07:21:43 UTC (rev 211410)
+++ trunk/Tools/DumpRenderTree/mac/AccessibilityUIElementMac.mm        2017-01-31 08:07:49 UTC (rev 211411)
</span><span class="lines">@@ -203,58 +203,6 @@
</span><span class="cx"> return [allElementString createJSStringRef];
</span><span class="cx"> }
</span><span class="cx">
</span><del>-static NSDictionary *searchPredicateParameterizedAttributeForSearchCriteria(JSContextRef context, AccessibilityUIElement *startElement, bool isDirectionNext, unsigned resultsLimit, JSValueRef searchKey, JSStringRef searchText, bool visibleOnly, bool immediateDescendantsOnly)
-{
- NSMutableDictionary *parameterizedAttribute = [NSMutableDictionary dictionary];
-
- if (startElement && startElement->platformUIElement())
- [parameterizedAttribute setObject:(id)startElement->platformUIElement() forKey:@"AXStartElement"];
-
- [parameterizedAttribute setObject:(isDirectionNext) ? @"AXDirectionNext" : @"AXDirectionPrevious" forKey:@"AXDirection"];
-
- [parameterizedAttribute setObject:@(resultsLimit) forKey:@"AXResultsLimit"];
-
- if (searchKey) {
- id searchKeyParameter = nil;
- if (JSValueIsString(context, searchKey)) {
- JSRetainPtr<JSStringRef> searchKeyString(Adopt, JSValueToStringCopy(context, searchKey, nullptr));
- if (searchKeyString)
- searchKeyParameter = [NSString stringWithJSStringRef:searchKeyString.get()];
- }
- else if (JSValueIsObject(context, searchKey)) {
- JSObjectRef searchKeyArray = JSValueToObject(context, searchKey, nullptr);
- unsigned searchKeyArrayLength = 0;
-
- JSRetainPtr<JSStringRef> lengthPropertyString(Adopt, JSStringCreateWithUTF8CString("length"));
- JSValueRef searchKeyArrayLengthValue = JSObjectGetProperty(context, searchKeyArray, lengthPropertyString.get(), nullptr);
- if (searchKeyArrayLengthValue && JSValueIsNumber(context, searchKeyArrayLengthValue))
- searchKeyArrayLength = static_cast<unsigned>(JSValueToNumber(context, searchKeyArrayLengthValue, nullptr));
-
- for (unsigned i = 0; i < searchKeyArrayLength; ++i) {
- JSValueRef searchKeyValue = JSObjectGetPropertyAtIndex(context, searchKeyArray, i, nullptr);
- JSStringRef searchKeyString = JSValueToStringCopy(context, searchKeyValue, nullptr);
- if (searchKeyString) {
- if (!searchKeyParameter)
- searchKeyParameter = [NSMutableArray array];
- [searchKeyParameter addObject:[NSString stringWithJSStringRef:searchKeyString]];
- JSStringRelease(searchKeyString);
- }
- }
- }
- if (searchKeyParameter)
- [parameterizedAttribute setObject:searchKeyParameter forKey:@"AXSearchKey"];
- }
-
- if (searchText && JSStringGetLength(searchText))
- [parameterizedAttribute setObject:[NSString stringWithJSStringRef:searchText] forKey:@"AXSearchText"];
-
- [parameterizedAttribute setObject:@(visibleOnly) forKey:@"AXVisibleOnly"];
-
- [parameterizedAttribute setObject:@(immediateDescendantsOnly) forKey:@"AXImmediateDescendantsOnly"];
-
- return parameterizedAttribute;
-}
-
</del><span class="cx"> static NSDictionary *selectTextParameterizedAttributeForCriteria(JSContextRef context, JSStringRef ambiguityResolution, JSValueRef searchStrings, JSStringRef replacementString, JSStringRef activity)
</span><span class="cx"> {
</span><span class="cx"> NSMutableDictionary *parameterizedAttribute = [NSMutableDictionary dictionary];
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerInjectedBundleiosAccessibilityUIElementIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm (211410 => 211411)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm        2017-01-31 07:21:43 UTC (rev 211410)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm        2017-01-31 08:07:49 UTC (rev 211411)
</span><span class="lines">@@ -24,6 +24,7 @@
</span><span class="cx"> */
</span><span class="cx">
</span><span class="cx"> #import "config.h"
</span><ins>+#import "AccessibilityCommonMac.h"
</ins><span class="cx"> #import "AccessibilityNotificationHandler.h"
</span><span class="cx"> #import "AccessibilityUIElement.h"
</span><span class="cx"> #import "InjectedBundle.h"
</span><span class="lines">@@ -77,6 +78,7 @@
</span><span class="cx"> - (NSString *)accessibilitySortDirection;
</span><span class="cx"> - (BOOL)accessibilityIsExpanded;
</span><span class="cx"> - (NSUInteger)accessibilityBlockquoteLevel;
</span><ins>+- (NSArray *)accessibilityFindMatchingObjects:(NSDictionary *)parameters;
</ins><span class="cx">
</span><span class="cx"> // TextMarker related
</span><span class="cx"> - (NSArray *)textMarkerRange;
</span><span class="lines">@@ -653,14 +655,18 @@
</span><span class="cx"> return false;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-unsigned AccessibilityUIElement::uiElementCountForSearchPredicate(JSContextRef context, AccessibilityUIElement* startElement, bool isDirectionNext, JSValueRef searchKey, JSStringRef searchText, bool visibleOnly, bool immediateDescendantsOnly)
</del><ins>+unsigned AccessibilityUIElement::uiElementCountForSearchPredicate(JSContextRef context, AccessibilityUIElement *startElement, bool isDirectionNext, JSValueRef searchKey, JSStringRef searchText, bool visibleOnly, bool immediateDescendantsOnly)
</ins><span class="cx"> {
</span><span class="cx"> return 0;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-RefPtr<AccessibilityUIElement> AccessibilityUIElement::uiElementForSearchPredicate(JSContextRef context, AccessibilityUIElement* startElement, bool isDirectionNext, JSValueRef searchKey, JSStringRef searchText, bool visibleOnly, bool immediateDescendantsOnly)
</del><ins>+RefPtr<AccessibilityUIElement> AccessibilityUIElement::uiElementForSearchPredicate(JSContextRef context, AccessibilityUIElement *startElement, bool isDirectionNext, JSValueRef searchKey, JSStringRef searchText, bool visibleOnly, bool immediateDescendantsOnly)
</ins><span class="cx"> {
</span><del>- return nullptr;
</del><ins>+ NSDictionary *parameterizedAttribute = searchPredicateParameterizedAttributeForSearchCriteria(context, startElement, isDirectionNext, 1, searchKey, searchText, visibleOnly, immediateDescendantsOnly);
+ id value = [m_element accessibilityFindMatchingObjects:parameterizedAttribute];
+ if (![value isKindOfClass:[NSArray class]])
+ return nullptr;
+ return AccessibilityUIElement::create([value lastObject]);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> JSRetainPtr<JSStringRef> AccessibilityUIElement::selectTextWithCriteria(JSContextRef, JSStringRef ambiguityResolution, JSValueRef searchStrings, JSStringRef replacementString, JSStringRef activity)
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerInjectedBundlemacAccessibilityCommonMach"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityCommonMac.h (211410 => 211411)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityCommonMac.h        2017-01-31 07:21:43 UTC (rev 211410)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityCommonMac.h        2017-01-31 08:07:49 UTC (rev 211411)
</span><span class="lines">@@ -31,6 +31,8 @@
</span><span class="cx"> #ifndef AccessibilityCommonMac_h
</span><span class="cx"> #define AccessibilityCommonMac_h
</span><span class="cx">
</span><ins>+#import "AccessibilityUIElement.h"
+
</ins><span class="cx"> #import <JavaScriptCore/JSStringRef.h>
</span><span class="cx">
</span><span class="cx"> // If an unsupported attribute is passed in, it will raise an accessibility exception. These are usually caught by the Accessibility Runtime to inform
</span><span class="lines">@@ -44,4 +46,10 @@
</span><span class="cx"> - (JSStringRef)createJSStringRef;
</span><span class="cx"> @end
</span><span class="cx">
</span><ins>+namespace WTR {
+
+extern NSDictionary *searchPredicateParameterizedAttributeForSearchCriteria(JSContextRef, AccessibilityUIElement *startElement, bool isDirectionNext, unsigned resultsLimit, JSValueRef searchKey, JSStringRef searchText, bool visibleOnly, bool immediateDescendantsOnly);
+
+};
+
</ins><span class="cx"> #endif // AccessibilityCommonMac_h
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerInjectedBundlemacAccessibilityCommonMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityCommonMac.mm (211410 => 211411)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityCommonMac.mm        2017-01-31 07:21:43 UTC (rev 211410)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityCommonMac.mm        2017-01-31 08:07:49 UTC (rev 211411)
</span><span class="lines">@@ -31,6 +31,8 @@
</span><span class="cx"> #import "config.h"
</span><span class="cx"> #import "AccessibilityCommonMac.h"
</span><span class="cx">
</span><ins>+#import <JavaScriptCore/JSRetainPtr.h>
+#import <JavaScriptCore/JSStringRef.h>
</ins><span class="cx"> #import <JavaScriptCore/JSStringRefCF.h>
</span><span class="cx">
</span><span class="cx"> @implementation NSString (JSStringRefAdditions)
</span><span class="lines">@@ -49,4 +51,59 @@
</span><span class="cx"> return JSStringCreateWithCFString((CFStringRef)self);
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+namespace WTR {
+
+NSDictionary *searchPredicateParameterizedAttributeForSearchCriteria(JSContextRef context, AccessibilityUIElement *startElement, bool isDirectionNext, unsigned resultsLimit, JSValueRef searchKey, JSStringRef searchText, bool visibleOnly, bool immediateDescendantsOnly)
+{
+ NSMutableDictionary *parameterizedAttribute = [NSMutableDictionary dictionary];
+
+ if (startElement && startElement->platformUIElement())
+ [parameterizedAttribute setObject:(id)startElement->platformUIElement() forKey:@"AXStartElement"];
+
+ [parameterizedAttribute setObject:(isDirectionNext) ? @"AXDirectionNext" : @"AXDirectionPrevious" forKey:@"AXDirection"];
+
+ [parameterizedAttribute setObject:@(resultsLimit) forKey:@"AXResultsLimit"];
+
+ if (searchKey) {
+ id searchKeyParameter = nil;
+ if (JSValueIsString(context, searchKey)) {
+ JSRetainPtr<JSStringRef> searchKeyString(Adopt, JSValueToStringCopy(context, searchKey, nullptr));
+ if (searchKeyString)
+ searchKeyParameter = [NSString stringWithJSStringRef:searchKeyString.get()];
+ } else if (JSValueIsObject(context, searchKey)) {
+ JSObjectRef searchKeyArray = JSValueToObject(context, searchKey, nullptr);
+ unsigned searchKeyArrayLength = 0;
+
+ JSRetainPtr<JSStringRef> lengthPropertyString(Adopt, JSStringCreateWithUTF8CString("length"));
+ JSValueRef searchKeyArrayLengthValue = JSObjectGetProperty(context, searchKeyArray, lengthPropertyString.get(), nullptr);
+ if (searchKeyArrayLengthValue && JSValueIsNumber(context, searchKeyArrayLengthValue))
+ searchKeyArrayLength = static_cast<unsigned>(JSValueToNumber(context, searchKeyArrayLengthValue, nullptr));
+
+ for (unsigned i = 0; i < searchKeyArrayLength; ++i) {
+ JSValueRef searchKeyValue = JSObjectGetPropertyAtIndex(context, searchKeyArray, i, nullptr);
+ JSStringRef searchKeyString = JSValueToStringCopy(context, searchKeyValue, nullptr);
+ if (searchKeyString) {
+ if (!searchKeyParameter)
+ searchKeyParameter = [NSMutableArray array];
+ [searchKeyParameter addObject:[NSString stringWithJSStringRef:searchKeyString]];
+ JSStringRelease(searchKeyString);
+ }
+ }
+ }
+ if (searchKeyParameter)
+ [parameterizedAttribute setObject:searchKeyParameter forKey:@"AXSearchKey"];
+ }
+
+ if (searchText && JSStringGetLength(searchText))
+ [parameterizedAttribute setObject:[NSString stringWithJSStringRef:searchText] forKey:@"AXSearchText"];
+
+ [parameterizedAttribute setObject:@(visibleOnly) forKey:@"AXVisibleOnly"];
+
+ [parameterizedAttribute setObject:@(immediateDescendantsOnly) forKey:@"AXImmediateDescendantsOnly"];
+
+ return parameterizedAttribute;
+}
+
+} // namespace WTR
+
</ins><span class="cx"> @end
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerInjectedBundlemacAccessibilityUIElementMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm (211410 => 211411)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm        2017-01-31 07:21:43 UTC (rev 211410)
+++ trunk/Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementMac.mm        2017-01-31 08:07:49 UTC (rev 211411)
</span><span class="lines">@@ -229,58 +229,6 @@
</span><span class="cx"> return [allElementString createJSStringRef];
</span><span class="cx"> }
</span><span class="cx">
</span><del>-static NSDictionary *searchPredicateParameterizedAttributeForSearchCriteria(JSContextRef context, AccessibilityUIElement *startElement, bool isDirectionNext, unsigned resultsLimit, JSValueRef searchKey, JSStringRef searchText, bool visibleOnly, bool immediateDescendantsOnly)
-{
- NSMutableDictionary *parameterizedAttribute = [NSMutableDictionary dictionary];
-
- if (startElement && startElement->platformUIElement())
- [parameterizedAttribute setObject:(id)startElement->platformUIElement() forKey:@"AXStartElement"];
-
- [parameterizedAttribute setObject:(isDirectionNext) ? @"AXDirectionNext" : @"AXDirectionPrevious" forKey:@"AXDirection"];
-
- [parameterizedAttribute setObject:@(resultsLimit) forKey:@"AXResultsLimit"];
-
- if (searchKey) {
- id searchKeyParameter = nil;
- if (JSValueIsString(context, searchKey)) {
- JSRetainPtr<JSStringRef> searchKeyString(Adopt, JSValueToStringCopy(context, searchKey, nullptr));
- if (searchKeyString)
- searchKeyParameter = [NSString stringWithJSStringRef:searchKeyString.get()];
- }
- else if (JSValueIsObject(context, searchKey)) {
- JSObjectRef searchKeyArray = JSValueToObject(context, searchKey, nullptr);
- unsigned searchKeyArrayLength = 0;
-
- JSRetainPtr<JSStringRef> lengthPropertyString(Adopt, JSStringCreateWithUTF8CString("length"));
- JSValueRef searchKeyArrayLengthValue = JSObjectGetProperty(context, searchKeyArray, lengthPropertyString.get(), nullptr);
- if (searchKeyArrayLengthValue && JSValueIsNumber(context, searchKeyArrayLengthValue))
- searchKeyArrayLength = static_cast<unsigned>(JSValueToNumber(context, searchKeyArrayLengthValue, nullptr));
-
- for (unsigned i = 0; i < searchKeyArrayLength; ++i) {
- JSValueRef searchKeyValue = JSObjectGetPropertyAtIndex(context, searchKeyArray, i, nullptr);
- JSStringRef searchKeyString = JSValueToStringCopy(context, searchKeyValue, nullptr);
- if (searchKeyString) {
- if (!searchKeyParameter)
- searchKeyParameter = [NSMutableArray array];
- [searchKeyParameter addObject:[NSString stringWithJSStringRef:searchKeyString]];
- JSStringRelease(searchKeyString);
- }
- }
- }
- if (searchKeyParameter)
- [parameterizedAttribute setObject:searchKeyParameter forKey:@"AXSearchKey"];
- }
-
- if (searchText && JSStringGetLength(searchText))
- [parameterizedAttribute setObject:[NSString stringWithJSStringRef:searchText] forKey:@"AXSearchText"];
-
- [parameterizedAttribute setObject:@(visibleOnly) forKey:@"AXVisibleOnly"];
-
- [parameterizedAttribute setObject:@(immediateDescendantsOnly) forKey:@"AXImmediateDescendantsOnly"];
-
- return parameterizedAttribute;
-}
-
</del><span class="cx"> static NSDictionary *selectTextParameterizedAttributeForCriteria(JSContextRef context, JSStringRef ambiguityResolution, JSValueRef searchStrings, JSStringRef replacementString, JSStringRef activity)
</span><span class="cx"> {
</span><span class="cx"> NSMutableDictionary *parameterizedAttribute = [NSMutableDictionary dictionary];
</span></span></pre></div>
<a id="trunkToolsWebKitTestRunnerWebKitTestRunnerxcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Tools/WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj (211410 => 211411)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj        2017-01-31 07:21:43 UTC (rev 211410)
+++ trunk/Tools/WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj        2017-01-31 08:07:49 UTC (rev 211411)
</span><span class="lines">@@ -229,6 +229,7 @@
</span><span class="cx">                 29210EDC144CD56E00835BB5 /* AccessibilityUIElement.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = AccessibilityUIElement.idl; sourceTree = "<group>"; };
</span><span class="cx">                 29210EE1144CDE6789815EE5 /* JSAccessibilityTextMarker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSAccessibilityTextMarker.cpp; sourceTree = "<group>"; };
</span><span class="cx">                 29210EE1145CDE6789815EE5 /* JSAccessibilityTextMarker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSAccessibilityTextMarker.h; sourceTree = "<group>"; };
</span><ins>+                299E2AA41E3DEE140065DC30 /* AccessibilityCommonMac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AccessibilityCommonMac.h; sourceTree = "<group>"; };
</ins><span class="cx">                 29A8FCC5145B93C6009045A6 /* AccessibilityTextMarker.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = AccessibilityTextMarker.idl; sourceTree = "<group>"; };
</span><span class="cx">                 29A8FCD2145EF8F2009045A6 /* AccessibilityTextMarkerRange.idl */ = {isa = PBXFileReference; lastKnownFileType = text; path = AccessibilityTextMarkerRange.idl; sourceTree = "<group>"; };
</span><span class="cx">                 29A8FCDF145F0358009045A6 /* AccessibilityTextMarkerRange.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AccessibilityTextMarkerRange.h; sourceTree = "<group>"; };
</span><span class="lines">@@ -597,6 +598,7 @@
</span><span class="cx">                         children = (
</span><span class="cx">                                 29210EAB144CACB200835BB6 /* AccessibilityCommonMac.mm */,
</span><span class="cx">                                 8034C6611487636400AC32E9 /* AccessibilityControllerMac.mm */,
</span><ins>+                                299E2AA41E3DEE140065DC30 /* AccessibilityCommonMac.h */,
</ins><span class="cx">                                 29A8FCE4145F0464009045A6 /* AccessibilityTextMarkerRangeMac.mm */,
</span><span class="cx">                                 29210EAB144CACB200835BB5 /* AccessibilityUIElementMac.mm */,
</span><span class="cx">                                 BC8DAD771316D7B900EC96FC /* InjectedBundleMac.mm */,
</span></span></pre>
</div>
</div>
</body>
</html>