f896ae5d3d1a6cecd7fa8f4c67a64ebd7f91c4b8
[WebKit-https.git] / LayoutTests / platform / mac / accessibility / search-predicate.html
1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
2 <html>
3 <head>
4 <script src="../../../fast/js/resources/js-test-pre.js"></script>
5 </head>
6 <body id="body">
7
8 <blockquote>first blockquote level 1</blockquote>
9 <blockquote>second blockquote level 1</blockquote>
10 <p style="color:black; font-family:sans-serif; font-weight:bold; text-decoration:underline;">sans-serif black bold text with underline</p>
11 <p style="color:blue; font-family:serif; font-style:italic;">serif blue italic text</p>
12 <form>
13 <input type="text" /><br />
14 <input type="checkbox" value="Checkbox" /> checkbox<br />
15 <input type="submit" value="Submit" />
16 </form>
17 <img id="image" src="resources/cake.png" alt="Test">
18 <h1>first heading level 1</h1>
19 <h1>second heading level 1</h1>
20 <h2>heading level 2</h2>
21 <h3>heading level 3</h3>
22 <h4>heading level 4</h4>
23 <h5>heading level 5</h5>
24 <h6>heading level 6</h6>
25 <p id="banner" role="banner">landmark</p>
26 <a href="#image">link</a>
27 <ol><li>list item</li></ol>
28 <p aria-live="polite">live region</p>
29 <ul role="radiogroup"><li role="radio">radio button</li></ul>
30 <table>
31 <thead><tr><td>first table heading level 1</td></tr></thead>
32 <tbody><tr><td>first table body level 1</td></tr></tbody>
33 </table>
34 <table>
35 <thead><tr><td>second table heading level 1</td></tr></thead>
36 <tbody><tr><td>second table body level 1</td></tr></tbody>
37 </table>
38
39 <p id="description"></p>
40 <div id="console"></div>
41
42 <script>
43     description("This tests the ability to search for accessible elements by key or text.");
44     
45     if (window.accessibilityController) {
46         window.testRunner.keepWebHistory();
47         
48         document.getElementById("body").focus();
49         var containerElement = accessibilityController.focusedElement;
50         var startElement;
51         var resultElement;
52         
53         // Any element.
54         startElement = accessibilityController.focusedElement.childAtIndex(0);
55         resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXAnyTypeSearchKey", "");
56         shouldBe("resultElement.role", "'AXRole: AXStaticText'");
57         shouldBe("resultElement.stringValue", "'AXValue: first blockquote level 1'");
58         
59         // Same level blockquote.
60         startElement = accessibilityController.focusedElement.childAtIndex(0);
61         resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXBlockquoteSameLevelSearchKey", "");
62         shouldBe("resultElement.role", "'AXRole: AXGroup'");
63         shouldBe("resultElement.childAtIndex(0).stringValue", "'AXValue: second blockquote level 1'");
64         
65         // Blockquote.
66         startElement = accessibilityController.focusedElement.childAtIndex(0);
67         resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXBlockquoteSearchKey", "");
68         shouldBe("resultElement.role", "'AXRole: AXGroup'");
69         shouldBe("resultElement.childAtIndex(0).stringValue", "'AXValue: second blockquote level 1'");
70         
71         // Bold font.
72         startElement = accessibilityController.focusedElement.childAtIndex(0);
73         resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXBoldFontSearchKey", "");
74         shouldBe("resultElement.role", "'AXRole: AXGroup'");
75         shouldBe("resultElement.childAtIndex(0).stringValue", "'AXValue: sans-serif black bold text with underline'");
76         
77         // Button.
78         startElement = accessibilityController.focusedElement.childAtIndex(0);
79         resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXButtonSearchKey", "");
80         shouldBe("resultElement.role", "'AXRole: AXButton'");
81         
82         // Check box.
83         startElement = accessibilityController.focusedElement.childAtIndex(0);
84         resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXCheckBoxSearchKey", "");
85         shouldBe("resultElement.role", "'AXRole: AXCheckBox'");
86         
87         // Control.
88         startElement = accessibilityController.focusedElement.childAtIndex(0);
89         resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXCheckBoxSearchKey", "");
90         shouldBe("resultElement.role", "'AXRole: AXCheckBox'");
91         
92         // Different type element.
93         startElement = accessibilityController.focusedElement.childAtIndex(0);
94         resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXDifferentTypeSearchKey", "");
95         shouldBe("resultElement.role", "'AXRole: AXStaticText'");
96         shouldBe("resultElement.stringValue", "'AXValue: first blockquote level 1'");
97         
98         // Font change.
99         startElement = accessibilityController.focusedElement.childAtIndex(2);
100         resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXFontChangeSearchKey", "");
101         shouldBe("resultElement.role", "'AXRole: AXGroup'");
102         shouldBe("resultElement.childAtIndex(0).stringValue", "'AXValue: serif blue italic text'");
103         
104         // Font color change.
105         startElement = accessibilityController.focusedElement.childAtIndex(2);
106         resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXFontColorChangeSearchKey", "");
107         shouldBe("resultElement.role", "'AXRole: AXGroup'");
108         shouldBe("resultElement.childAtIndex(0).stringValue", "'AXValue: serif blue italic text'");
109         
110         // Graphic.
111         startElement = accessibilityController.focusedElement.childAtIndex(0);
112         resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXGraphicSearchKey", "");
113         shouldBe("resultElement.role", "'AXRole: AXImage'");
114         
115         // Heading level 1.
116         startElement = accessibilityController.focusedElement.childAtIndex(0);
117         resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXHeadingLevel1SearchKey", "");
118         shouldBe("resultElement.role", "'AXRole: AXHeading'");
119         shouldBe("resultElement.childAtIndex(0).stringValue", "'AXValue: first heading level 1'");
120         
121         // Heading level 2.
122         startElement = accessibilityController.focusedElement.childAtIndex(0);
123         resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXHeadingLevel2SearchKey", "");
124         shouldBe("resultElement.role", "'AXRole: AXHeading'");
125         shouldBe("resultElement.childAtIndex(0).stringValue", "'AXValue: heading level 2'");
126         
127         // Heading level 3.
128         startElement = accessibilityController.focusedElement.childAtIndex(0);
129         resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXHeadingLevel3SearchKey", "");
130         shouldBe("resultElement.role", "'AXRole: AXHeading'");
131         shouldBe("resultElement.childAtIndex(0).stringValue", "'AXValue: heading level 3'");
132         
133         // Heading level 4.
134         startElement = accessibilityController.focusedElement.childAtIndex(0);
135         resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXHeadingLevel4SearchKey", "");
136         shouldBe("resultElement.role", "'AXRole: AXHeading'");
137         shouldBe("resultElement.childAtIndex(0).stringValue", "'AXValue: heading level 4'");
138         
139         // Heading level 5.
140         startElement = accessibilityController.focusedElement.childAtIndex(0);
141         resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXHeadingLevel5SearchKey", "");
142         shouldBe("resultElement.role", "'AXRole: AXHeading'");
143         shouldBe("resultElement.childAtIndex(0).stringValue", "'AXValue: heading level 5'");
144         
145         // Heading level 6.
146         startElement = accessibilityController.focusedElement.childAtIndex(0);
147         resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXHeadingLevel6SearchKey", "");
148         shouldBe("resultElement.role", "'AXRole: AXHeading'");
149         shouldBe("resultElement.childAtIndex(0).stringValue", "'AXValue: heading level 6'");
150         
151         // Same level heading.
152         startElement = accessibilityController.focusedElement.childAtIndex(6);
153         resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXHeadingSameLevelSearchKey", "");
154         shouldBe("resultElement.role", "'AXRole: AXHeading'");
155         shouldBe("resultElement.childAtIndex(0).stringValue", "'AXValue: second heading level 1'");
156         
157         // Heading.
158         startElement = accessibilityController.focusedElement.childAtIndex(0);
159         resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXHeadingSearchKey", "");
160         shouldBe("resultElement.role", "'AXRole: AXHeading'");
161         shouldBe("resultElement.childAtIndex(0).stringValue", "'AXValue: first heading level 1'");
162         
163         // Italic font.
164         startElement = accessibilityController.focusedElement.childAtIndex(0);
165         resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXItalicFontSearchKey", "");
166         shouldBe("resultElement.role", "'AXRole: AXGroup'");
167         shouldBe("resultElement.childAtIndex(0).stringValue", "'AXValue: serif blue italic text'");
168         
169         // Landmark.
170         startElement = accessibilityController.focusedElement.childAtIndex(0);
171         resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXLandmarkSearchKey", "");
172         shouldBe("resultElement.role", "'AXRole: AXGroup'");
173         shouldBe("resultElement.subrole", "'AXSubrole: AXLandmarkBanner'");
174         
175         // Link.
176         startElement = accessibilityController.focusedElement.childAtIndex(0);
177         resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXLinkSearchKey", "");
178         shouldBe("resultElement.role", "'AXRole: AXLink'");
179         shouldBe("resultElement.childAtIndex(0).stringValue", "'AXValue: link'");
180         
181         // List.
182         startElement = accessibilityController.focusedElement.childAtIndex(0);
183         resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXListSearchKey", "");
184         shouldBe("resultElement.role", "'AXRole: AXList'");
185         
186         // Live Region.
187         startElement = accessibilityController.focusedElement.childAtIndex(0);
188         resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXLiveRegionSearchKey", "");
189         shouldBe("resultElement.role", "'AXRole: AXGroup'");
190         shouldBe("resultElement.stringAttributeValue('AXARIALive')", "'polite'");
191         
192         // Misspelled word.
193         // FIXME: Handle this search key.
194         
195         // Plain text.
196         startElement = accessibilityController.focusedElement.childAtIndex(0);
197         resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXPlainTextSearchKey", "");
198         shouldBe("resultElement.role", "'AXRole: AXStaticText'");
199         shouldBe("resultElement.stringValue", "'AXValue: first blockquote level 1'");
200         
201         // Radio group.
202         startElement = accessibilityController.focusedElement.childAtIndex(0);
203         resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXRadioGroupSearchKey", "");
204         shouldBe("resultElement.role", "'AXRole: AXRadioGroup'");
205         
206         // Same type element.
207         startElement = accessibilityController.focusedElement.childAtIndex(0);
208         resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXSameTypeSearchKey", "");
209         shouldBe("resultElement.role", "'AXRole: AXGroup'");
210         shouldBe("resultElement.childAtIndex(0).stringValue", "'AXValue: second blockquote level 1'");
211         
212         // Static text.
213         startElement = accessibilityController.focusedElement.childAtIndex(0);
214         resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXStaticTextSearchKey", "");
215         shouldBe("resultElement.role", "'AXRole: AXStaticText'");
216         shouldBe("resultElement.stringValue", "'AXValue: first blockquote level 1'");
217         
218         // Style change.
219         startElement = accessibilityController.focusedElement.childAtIndex(2);
220         resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXStyleChangeSearchKey", "");
221         shouldBe("resultElement.role", "'AXRole: AXGroup'");
222         shouldBe("resultElement.childAtIndex(0).stringValue", "'AXValue: serif blue italic text'");
223         
224         // Same level table.
225         startElement = accessibilityController.focusedElement.childAtIndex(18);
226         resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXTableSameLevelSearchKey", "");
227         shouldBe("resultElement.role", "'AXRole: AXTable'");
228         shouldBe("resultElement.childAtIndex(0).childAtIndex(0).childAtIndex(0).stringValue", "'AXValue: second table heading level 1'");
229         
230         // Table.
231         startElement = accessibilityController.focusedElement.childAtIndex(0);
232         resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXTableSearchKey", "");
233         shouldBe("resultElement.role", "'AXRole: AXTable'");
234         shouldBe("resultElement.childAtIndex(0).childAtIndex(0).childAtIndex(0).stringValue", "'AXValue: first table heading level 1'");
235         
236         // Text field.
237         startElement = accessibilityController.focusedElement.childAtIndex(0);
238         resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXTextFieldSearchKey", "");
239         shouldBe("resultElement.role", "'AXRole: AXTextField'");
240         
241         // Underline.
242         startElement = accessibilityController.focusedElement.childAtIndex(0);
243         resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXUnderlineSearchKey", "");
244         shouldBe("resultElement.role", "'AXRole: AXGroup'");
245         shouldBe("resultElement.childAtIndex(0).stringValue", "'AXValue: sans-serif black bold text with underline'");
246         
247         // Unvisited link.
248         startElement = accessibilityController.focusedElement.childAtIndex(0);
249         resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXUnvisitedLinkSearchKey", "");
250         shouldBe("resultElement.boolAttributeValue('AXVisited')", "false");
251         shouldBe("resultElement.childAtIndex(0).stringValue", "'AXValue: link'");
252         
253         // Visited link.
254         accessibilityController.focusedElement.childAtIndex(14).childAtIndex(0).press();
255         startElement = accessibilityController.focusedElement.childAtIndex(0);
256         resultElement = containerElement.uiElementForSearchPredicate(startElement, true, "AXVisitedLinkSearchKey", "");
257         shouldBe("resultElement.boolAttributeValue('AXVisited')", "true");
258         shouldBe("resultElement.childAtIndex(0).stringValue", "'AXValue: link'");
259         
260         // Previous text search.
261         startElement = accessibilityController.focusedElement.childAtIndex(10);
262         resultElement = containerElement.uiElementForSearchPredicate(startElement, false, "", "sans-serif black bold text with underline");
263         shouldBe("resultElement.role", "'AXRole: AXStaticText'");
264         shouldBe("resultElement.stringValue", "'AXValue: sans-serif black bold text with underline'");
265         
266         // Execute a search for the next heading level 2 or the next link.
267         startElement = accessibilityController.focusedElement.childAtIndex(0);
268         resultElement = containerElement.uiElementForSearchPredicate(startElement, true, ["AXHeadingLevel2SearchKey", "AXLinkSearchKey"], "");
269         shouldBe("resultElement.role", "'AXRole: AXHeading'");
270         shouldBe("resultElement.childAtIndex(0).stringValue", "'AXValue: heading level 2'");
271         
272         // After finding the heading, execute the search again and we should find the link.
273         resultElement = containerElement.uiElementForSearchPredicate(resultElement, true, ["AXHeadingLevel2SearchKey", "AXLinkSearchKey"], "");
274         shouldBe("resultElement.role", "'AXRole: AXLink'");
275         shouldBe("resultElement.childAtIndex(0).stringValue", "'AXValue: link'");
276
277         // From the link, execute the search in reverse and we should land back on the heading.
278         resultElement = containerElement.uiElementForSearchPredicate(resultElement, false, ["AXHeadingLevel2SearchKey", "AXLinkSearchKey"], "");
279         shouldBe("resultElement.role", "'AXRole: AXHeading'");
280         shouldBe("resultElement.childAtIndex(0).stringValue", "'AXValue: heading level 2'");
281     }
282     
283 </script>
284
285 <script src="../../../fast/js/resources/js-test-post.js"></script>
286 </body>
287 </html>