1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "ui/accessibility/ax_role_properties.h"
6
7 #include "build/build_config.h"
8 #include "ui/accessibility/ax_enums.mojom.h"
9
10 namespace ui {
11
12 namespace {
13
14 #if defined(OS_WIN) || defined(OS_CHROMEOS)
15 constexpr bool kExposeLayoutTableAsDataTable = true;
16 #else
17 constexpr bool kExposeLayoutTableAsDataTable = false;
18 #endif // defined(OS_WIN)
19
20 } // namespace
21
HasPresentationalChildren(const ax::mojom::Role role)22 bool HasPresentationalChildren(const ax::mojom::Role role) {
23 // See http://www.w3.org/TR/core-aam-1.1/#exclude_elements2.
24 if (IsImage(role))
25 return true;
26
27 switch (role) {
28 case ax::mojom::Role::kButton:
29 case ax::mojom::Role::kCheckBox:
30 case ax::mojom::Role::kMath:
31 case ax::mojom::Role::kMenuItemCheckBox:
32 case ax::mojom::Role::kMenuItemRadio:
33 case ax::mojom::Role::kMenuListOption:
34 case ax::mojom::Role::kProgressIndicator:
35 case ax::mojom::Role::kScrollBar:
36 case ax::mojom::Role::kSlider:
37 case ax::mojom::Role::kSwitch:
38 case ax::mojom::Role::kTab:
39 return true;
40 default:
41 return false;
42 }
43 }
44
IsAlert(const ax::mojom::Role role)45 bool IsAlert(const ax::mojom::Role role) {
46 switch (role) {
47 case ax::mojom::Role::kAlert:
48 case ax::mojom::Role::kAlertDialog:
49 return true;
50 default:
51 return false;
52 }
53 }
54
IsButton(const ax::mojom::Role role)55 bool IsButton(const ax::mojom::Role role) {
56 // According to the WAI-ARIA spec, native button or role="button"
57 // supports |aria-expanded| and |aria-pressed|.
58 // If the button has |aria-expanded| set, then it takes on
59 // Role::kPopUpButton.
60 // If the button has |aria-pressed| set, then it takes on
61 // Role::kToggleButton.
62 // https://www.w3.org/TR/wai-aria-1.1/#button
63 return role == ax::mojom::Role::kButton ||
64 role == ax::mojom::Role::kPopUpButton ||
65 role == ax::mojom::Role::kToggleButton;
66 }
67
IsClickable(const ax::mojom::Role role)68 bool IsClickable(const ax::mojom::Role role) {
69 switch (role) {
70 case ax::mojom::Role::kButton:
71 case ax::mojom::Role::kCheckBox:
72 case ax::mojom::Role::kColorWell:
73 case ax::mojom::Role::kComboBoxMenuButton:
74 case ax::mojom::Role::kDate:
75 case ax::mojom::Role::kDateTime:
76 case ax::mojom::Role::kDisclosureTriangle:
77 case ax::mojom::Role::kDocBackLink:
78 case ax::mojom::Role::kDocBiblioRef:
79 case ax::mojom::Role::kDocGlossRef:
80 case ax::mojom::Role::kDocNoteRef:
81 case ax::mojom::Role::kImeCandidate:
82 case ax::mojom::Role::kInputTime:
83 case ax::mojom::Role::kLink:
84 case ax::mojom::Role::kListBox:
85 case ax::mojom::Role::kListBoxOption:
86 case ax::mojom::Role::kMenuItem:
87 case ax::mojom::Role::kMenuItemCheckBox:
88 case ax::mojom::Role::kMenuItemRadio:
89 case ax::mojom::Role::kMenuListOption:
90 case ax::mojom::Role::kPdfActionableHighlight:
91 case ax::mojom::Role::kPopUpButton:
92 case ax::mojom::Role::kPortal:
93 case ax::mojom::Role::kRadioButton:
94 case ax::mojom::Role::kSearchBox:
95 case ax::mojom::Role::kSpinButton:
96 case ax::mojom::Role::kSwitch:
97 case ax::mojom::Role::kTab:
98 case ax::mojom::Role::kTextField:
99 case ax::mojom::Role::kTextFieldWithComboBox:
100 // kTree and related roles are not included because they are not natively
101 // supported by HTML and so their "clickable" behavior is uncertain.
102 case ax::mojom::Role::kToggleButton:
103 return true;
104 default:
105 return false;
106 }
107 }
108
IsCellOrTableHeader(const ax::mojom::Role role)109 bool IsCellOrTableHeader(const ax::mojom::Role role) {
110 switch (role) {
111 case ax::mojom::Role::kCell:
112 case ax::mojom::Role::kColumnHeader:
113 case ax::mojom::Role::kRowHeader:
114 return true;
115 case ax::mojom::Role::kLayoutTableCell:
116 return kExposeLayoutTableAsDataTable;
117 default:
118 return false;
119 }
120 }
121
IsContainerWithSelectableChildren(const ax::mojom::Role role)122 bool IsContainerWithSelectableChildren(const ax::mojom::Role role) {
123 switch (role) {
124 case ax::mojom::Role::kComboBoxGrouping:
125 case ax::mojom::Role::kComboBoxMenuButton:
126 case ax::mojom::Role::kGrid:
127 case ax::mojom::Role::kListBox:
128 case ax::mojom::Role::kListGrid:
129 case ax::mojom::Role::kMenu:
130 case ax::mojom::Role::kMenuBar:
131 case ax::mojom::Role::kMenuListPopup:
132 case ax::mojom::Role::kRadioGroup:
133 case ax::mojom::Role::kTabList:
134 case ax::mojom::Role::kToolbar:
135 case ax::mojom::Role::kTree:
136 case ax::mojom::Role::kTreeGrid:
137 return true;
138 default:
139 return false;
140 }
141 }
142
IsControl(const ax::mojom::Role role)143 bool IsControl(const ax::mojom::Role role) {
144 switch (role) {
145 case ax::mojom::Role::kButton:
146 case ax::mojom::Role::kCheckBox:
147 case ax::mojom::Role::kColorWell:
148 case ax::mojom::Role::kComboBoxMenuButton:
149 case ax::mojom::Role::kDate:
150 case ax::mojom::Role::kDateTime:
151 case ax::mojom::Role::kDisclosureTriangle:
152 case ax::mojom::Role::kInputTime:
153 case ax::mojom::Role::kListBox:
154 case ax::mojom::Role::kListGrid:
155 case ax::mojom::Role::kMenuItem:
156 case ax::mojom::Role::kMenuItemCheckBox:
157 case ax::mojom::Role::kMenuItemRadio:
158 case ax::mojom::Role::kMenuListOption:
159 case ax::mojom::Role::kPdfActionableHighlight:
160 case ax::mojom::Role::kPopUpButton:
161 case ax::mojom::Role::kRadioButton:
162 case ax::mojom::Role::kScrollBar:
163 case ax::mojom::Role::kSearchBox:
164 case ax::mojom::Role::kSlider:
165 case ax::mojom::Role::kSpinButton:
166 case ax::mojom::Role::kSwitch:
167 case ax::mojom::Role::kTab:
168 case ax::mojom::Role::kTextField:
169 case ax::mojom::Role::kTextFieldWithComboBox:
170 case ax::mojom::Role::kToggleButton:
171 case ax::mojom::Role::kTree:
172 case ax::mojom::Role::kTreeGrid:
173 case ax::mojom::Role::kTreeItem:
174 return true;
175 default:
176 return false;
177 }
178 }
179
IsControlOnAndroid(const ax::mojom::Role role,bool isFocusable)180 bool IsControlOnAndroid(const ax::mojom::Role role, bool isFocusable) {
181 switch (role) {
182 case ax::mojom::Role::kSplitter:
183 return isFocusable;
184 case ax::mojom::Role::kTreeItem:
185 case ax::mojom::Role::kDate:
186 case ax::mojom::Role::kDateTime:
187 case ax::mojom::Role::kInputTime:
188 case ax::mojom::Role::kDocBackLink:
189 case ax::mojom::Role::kDocBiblioRef:
190 case ax::mojom::Role::kDocGlossRef:
191 case ax::mojom::Role::kDocNoteRef:
192 case ax::mojom::Role::kLink:
193 return true;
194 case ax::mojom::Role::kMenu:
195 case ax::mojom::Role::kMenuBar:
196 case ax::mojom::Role::kNone:
197 case ax::mojom::Role::kUnknown:
198 case ax::mojom::Role::kTree:
199 case ax::mojom::Role::kDialog:
200 case ax::mojom::Role::kAlert:
201 return false;
202 default:
203 return IsControl(role);
204 }
205 }
206
IsDocument(const ax::mojom::Role role)207 bool IsDocument(const ax::mojom::Role role) {
208 switch (role) {
209 case ax::mojom::Role::kDocument:
210 case ax::mojom::Role::kRootWebArea:
211 case ax::mojom::Role::kWebArea:
212 return true;
213 default:
214 return false;
215 }
216 }
217
IsDialog(const ax::mojom::Role role)218 bool IsDialog(const ax::mojom::Role role) {
219 switch (role) {
220 case ax::mojom::Role::kAlertDialog:
221 case ax::mojom::Role::kDialog:
222 return true;
223 default:
224 return false;
225 }
226 }
227
IsForm(const ax::mojom::Role role)228 bool IsForm(const ax::mojom::Role role) {
229 switch (role) {
230 case ax::mojom::Role::kForm:
231 return true;
232 default:
233 return false;
234 }
235 }
236
IsFormatBoundary(const ax::mojom::Role role)237 bool IsFormatBoundary(const ax::mojom::Role role) {
238 return IsControl(role) || IsHeading(role) || IsImageOrVideo(role);
239 }
240
IsHeading(const ax::mojom::Role role)241 bool IsHeading(const ax::mojom::Role role) {
242 switch (role) {
243 case ax::mojom::Role::kHeading:
244 case ax::mojom::Role::kDocSubtitle:
245 return true;
246 default:
247 return false;
248 }
249 }
250
IsHeadingOrTableHeader(const ax::mojom::Role role)251 bool IsHeadingOrTableHeader(const ax::mojom::Role role) {
252 switch (role) {
253 case ax::mojom::Role::kColumnHeader:
254 case ax::mojom::Role::kDocSubtitle:
255 case ax::mojom::Role::kHeading:
256 case ax::mojom::Role::kRowHeader:
257 return true;
258 default:
259 return false;
260 }
261 }
262
IsIframe(ax::mojom::Role role)263 bool IsIframe(ax::mojom::Role role) {
264 switch (role) {
265 case ax::mojom::Role::kIframe:
266 case ax::mojom::Role::kIframePresentational:
267 return true;
268 default:
269 return false;
270 }
271 }
272
IsImageOrVideo(const ax::mojom::Role role)273 bool IsImageOrVideo(const ax::mojom::Role role) {
274 return IsImage(role) || role == ax::mojom::Role::kVideo;
275 }
276
IsImage(const ax::mojom::Role role)277 bool IsImage(const ax::mojom::Role role) {
278 switch (role) {
279 case ax::mojom::Role::kCanvas:
280 case ax::mojom::Role::kDocCover:
281 case ax::mojom::Role::kGraphicsSymbol:
282 case ax::mojom::Role::kImage:
283 case ax::mojom::Role::kImageMap:
284 case ax::mojom::Role::kSvgRoot:
285 return true;
286 default:
287 return false;
288 }
289 }
290
IsItemLike(const ax::mojom::Role role)291 bool IsItemLike(const ax::mojom::Role role) {
292 switch (role) {
293 case ax::mojom::Role::kArticle:
294 case ax::mojom::Role::kComment:
295 case ax::mojom::Role::kListItem:
296 case ax::mojom::Role::kMenuItem:
297 case ax::mojom::Role::kMenuItemRadio:
298 case ax::mojom::Role::kTab:
299 case ax::mojom::Role::kMenuItemCheckBox:
300 case ax::mojom::Role::kTreeItem:
301 case ax::mojom::Role::kListBoxOption:
302 case ax::mojom::Role::kMenuListOption:
303 case ax::mojom::Role::kRadioButton:
304 case ax::mojom::Role::kDescriptionListTerm:
305 case ax::mojom::Role::kTerm:
306 return true;
307 default:
308 return false;
309 }
310 }
311
IsLandmark(const ax::mojom::Role role)312 bool IsLandmark(const ax::mojom::Role role) {
313 switch (role) {
314 case ax::mojom::Role::kBanner:
315 case ax::mojom::Role::kComplementary:
316 case ax::mojom::Role::kContentInfo:
317 case ax::mojom::Role::kForm:
318 case ax::mojom::Role::kMain:
319 case ax::mojom::Role::kNavigation:
320 case ax::mojom::Role::kRegion:
321 case ax::mojom::Role::kSearch:
322 return true;
323 default:
324 return false;
325 }
326 }
327
IsLink(const ax::mojom::Role role)328 bool IsLink(const ax::mojom::Role role) {
329 switch (role) {
330 case ax::mojom::Role::kDocBackLink:
331 case ax::mojom::Role::kDocBiblioRef:
332 case ax::mojom::Role::kDocGlossRef:
333 case ax::mojom::Role::kDocNoteRef:
334 case ax::mojom::Role::kLink:
335 return true;
336 default:
337 return false;
338 }
339 }
340
IsList(const ax::mojom::Role role)341 bool IsList(const ax::mojom::Role role) {
342 switch (role) {
343 case ax::mojom::Role::kDescriptionList:
344 case ax::mojom::Role::kDirectory:
345 case ax::mojom::Role::kDocBibliography:
346 case ax::mojom::Role::kList:
347 case ax::mojom::Role::kListBox:
348 case ax::mojom::Role::kListGrid:
349 return true;
350 default:
351 return false;
352 }
353 }
354
IsListItem(const ax::mojom::Role role)355 bool IsListItem(const ax::mojom::Role role) {
356 switch (role) {
357 case ax::mojom::Role::kDescriptionListTerm:
358 case ax::mojom::Role::kDocBiblioEntry:
359 case ax::mojom::Role::kDocEndnote:
360 case ax::mojom::Role::kListBoxOption:
361 case ax::mojom::Role::kListItem:
362 case ax::mojom::Role::kTerm:
363 return true;
364 default:
365 return false;
366 }
367 }
368
IsMenuItem(ax::mojom::Role role)369 bool IsMenuItem(ax::mojom::Role role) {
370 switch (role) {
371 case ax::mojom::Role::kMenuItem:
372 case ax::mojom::Role::kMenuItemCheckBox:
373 case ax::mojom::Role::kMenuItemRadio:
374 return true;
375 default:
376 return false;
377 }
378 }
379
IsMenuRelated(const ax::mojom::Role role)380 bool IsMenuRelated(const ax::mojom::Role role) {
381 switch (role) {
382 case ax::mojom::Role::kMenu:
383 case ax::mojom::Role::kMenuBar:
384 case ax::mojom::Role::kMenuItem:
385 case ax::mojom::Role::kMenuItemCheckBox:
386 case ax::mojom::Role::kMenuItemRadio:
387 case ax::mojom::Role::kMenuListOption:
388 case ax::mojom::Role::kMenuListPopup:
389 return true;
390 default:
391 return false;
392 }
393 }
394
IsPresentational(const ax::mojom::Role role)395 bool IsPresentational(const ax::mojom::Role role) {
396 switch (role) {
397 case ax::mojom::Role::kNone:
398 case ax::mojom::Role::kPresentational:
399 return true;
400 default:
401 return false;
402 }
403 }
404
IsRadio(const ax::mojom::Role role)405 bool IsRadio(const ax::mojom::Role role) {
406 switch (role) {
407 case ax::mojom::Role::kRadioButton:
408 case ax::mojom::Role::kMenuItemRadio:
409 return true;
410 default:
411 return false;
412 }
413 }
414
IsRangeValueSupported(const ax::mojom::Role role)415 bool IsRangeValueSupported(const ax::mojom::Role role) {
416 // https://www.w3.org/TR/wai-aria-1.1/#aria-valuenow
417 // https://www.w3.org/TR/wai-aria-1.1/#aria-valuetext
418 // Roles that support aria-valuetext / aria-valuenow
419 switch (role) {
420 case ax::mojom::Role::kMeter:
421 case ax::mojom::Role::kProgressIndicator:
422 case ax::mojom::Role::kScrollBar:
423 case ax::mojom::Role::kSlider:
424 case ax::mojom::Role::kSpinButton:
425 case ax::mojom::Role::kSplitter:
426 return true;
427 default:
428 return false;
429 }
430 }
431
IsReadOnlySupported(const ax::mojom::Role role)432 bool IsReadOnlySupported(const ax::mojom::Role role) {
433 // https://www.w3.org/TR/wai-aria-1.1/#aria-readonly
434 // Roles that support aria-readonly
435 switch (role) {
436 case ax::mojom::Role::kCheckBox:
437 case ax::mojom::Role::kColorWell:
438 case ax::mojom::Role::kComboBoxGrouping:
439 case ax::mojom::Role::kComboBoxMenuButton:
440 case ax::mojom::Role::kDate:
441 case ax::mojom::Role::kDateTime:
442 case ax::mojom::Role::kGrid:
443 case ax::mojom::Role::kInputTime:
444 case ax::mojom::Role::kListBox:
445 case ax::mojom::Role::kMenuItemCheckBox:
446 case ax::mojom::Role::kMenuItemRadio:
447 case ax::mojom::Role::kMenuListPopup:
448 case ax::mojom::Role::kPopUpButton:
449 case ax::mojom::Role::kRadioButton:
450 case ax::mojom::Role::kRadioGroup:
451 case ax::mojom::Role::kSearchBox:
452 case ax::mojom::Role::kSlider:
453 case ax::mojom::Role::kSpinButton:
454 case ax::mojom::Role::kSwitch:
455 case ax::mojom::Role::kTextField:
456 case ax::mojom::Role::kTextFieldWithComboBox:
457 case ax::mojom::Role::kToggleButton:
458 case ax::mojom::Role::kTreeGrid:
459 return true;
460
461 // https://www.w3.org/TR/wai-aria-1.1/#aria-readonly
462 // ARIA-1.1+ 'gridcell', supports aria-readonly, but 'cell' does not.
463 //
464 // https://www.w3.org/TR/wai-aria-1.1/#columnheader
465 // https://www.w3.org/TR/wai-aria-1.1/#rowheader
466 // While the [columnheader|rowheader] role can be used in both interactive
467 // grids and non-interactive tables, the use of aria-readonly and
468 // aria-required is only applicable to interactive elements.
469 // Therefore, [...] user agents SHOULD NOT expose either property to
470 // assistive technologies unless the columnheader descends from a grid.
471 case ax::mojom::Role::kCell:
472 case ax::mojom::Role::kRowHeader:
473 case ax::mojom::Role::kColumnHeader:
474 return false;
475 default:
476 return false;
477 }
478 }
479
IsRowContainer(const ax::mojom::Role role)480 bool IsRowContainer(const ax::mojom::Role role) {
481 switch (role) {
482 case ax::mojom::Role::kGrid:
483 case ax::mojom::Role::kListGrid:
484 case ax::mojom::Role::kTable:
485 case ax::mojom::Role::kTree:
486 case ax::mojom::Role::kTreeGrid:
487 return true;
488 case ax::mojom::Role::kLayoutTable:
489 return kExposeLayoutTableAsDataTable;
490 default:
491 return false;
492 }
493 }
494
IsSection(const ax::mojom::Role role)495 bool IsSection(const ax::mojom::Role role) {
496 if (IsLandmark(role) || IsSelect(role))
497 return true;
498
499 switch (role) {
500 case ax::mojom::Role::kAlert:
501 case ax::mojom::Role::kAlertDialog: // Subclass of kAlert.
502 case ax::mojom::Role::kCell:
503 case ax::mojom::Role::kColumnHeader: // Subclass of kCell.
504 case ax::mojom::Role::kDefinition:
505 case ax::mojom::Role::kDirectory: // Subclass of kList.
506 case ax::mojom::Role::kFeed: // Subclass of kList.
507 case ax::mojom::Role::kFigure:
508 case ax::mojom::Role::kGrid: // Subclass of kTable.
509 case ax::mojom::Role::kGroup:
510 case ax::mojom::Role::kImage:
511 case ax::mojom::Role::kList:
512 case ax::mojom::Role::kListItem:
513 case ax::mojom::Role::kLog:
514 case ax::mojom::Role::kMarquee:
515 case ax::mojom::Role::kMath:
516 case ax::mojom::Role::kNote:
517 case ax::mojom::Role::kProgressIndicator: // Subclass of kStatus.
518 case ax::mojom::Role::kRow: // Subclass of kGroup.
519 case ax::mojom::Role::kRowHeader: // Subclass of kCell.
520 case ax::mojom::Role::kSection:
521 case ax::mojom::Role::kStatus:
522 case ax::mojom::Role::kTable:
523 case ax::mojom::Role::kTabPanel:
524 case ax::mojom::Role::kTerm:
525 case ax::mojom::Role::kTimer: // Subclass of kStatus.
526 case ax::mojom::Role::kToolbar: // Subclass of kGroup.
527 case ax::mojom::Role::kTooltip:
528 case ax::mojom::Role::kTreeItem: // Subclass of kListItem.
529 return true;
530 default:
531 return false;
532 }
533 }
534
IsSectionhead(const ax::mojom::Role role)535 bool IsSectionhead(const ax::mojom::Role role) {
536 switch (role) {
537 case ax::mojom::Role::kColumnHeader:
538 case ax::mojom::Role::kHeading:
539 case ax::mojom::Role::kRowHeader:
540 case ax::mojom::Role::kTab:
541 return true;
542 default:
543 return false;
544 }
545 }
546
IsSelect(const ax::mojom::Role role)547 bool IsSelect(const ax::mojom::Role role) {
548 switch (role) {
549 case ax::mojom::Role::kComboBoxGrouping:
550 case ax::mojom::Role::kListBox:
551 case ax::mojom::Role::kMenu:
552 case ax::mojom::Role::kMenuBar: // Subclass of kMenu.
553 case ax::mojom::Role::kRadioGroup:
554 case ax::mojom::Role::kTree:
555 case ax::mojom::Role::kTreeGrid: // Subclass of kTree.
556 return true;
557 default:
558 return false;
559 }
560 }
561
IsSelectElement(const ax::mojom::Role role)562 bool IsSelectElement(const ax::mojom::Role role) {
563 // Depending on their "size" attribute, <select> elements come in two flavors:
564 // the first appears like a list box and the second like a popup menu.
565 switch (role) {
566 case ax::mojom::Role::kListBox:
567 case ax::mojom::Role::kPopUpButton:
568 return true;
569 default:
570 return false;
571 }
572 }
573
IsSetLike(const ax::mojom::Role role)574 bool IsSetLike(const ax::mojom::Role role) {
575 switch (role) {
576 case ax::mojom::Role::kDescriptionList:
577 case ax::mojom::Role::kDirectory:
578 case ax::mojom::Role::kDocBibliography:
579 case ax::mojom::Role::kFeed:
580 case ax::mojom::Role::kGroup:
581 case ax::mojom::Role::kList:
582 case ax::mojom::Role::kListBox:
583 case ax::mojom::Role::kListGrid:
584 case ax::mojom::Role::kMenu:
585 case ax::mojom::Role::kMenuBar:
586 case ax::mojom::Role::kMenuListPopup:
587 case ax::mojom::Role::kPopUpButton:
588 case ax::mojom::Role::kRadioGroup:
589 case ax::mojom::Role::kTabList:
590 case ax::mojom::Role::kTree:
591 return true;
592 default:
593 return false;
594 }
595 }
596
IsStaticList(const ax::mojom::Role role)597 bool IsStaticList(const ax::mojom::Role role) {
598 switch (role) {
599 case ax::mojom::Role::kList:
600 case ax::mojom::Role::kDescriptionList:
601 return true;
602 default:
603 return false;
604 }
605 }
606
IsStructure(const ax::mojom::Role role)607 bool IsStructure(const ax::mojom::Role role) {
608 if (IsSection(role) || IsSectionhead(role))
609 return true;
610
611 switch (role) {
612 case ax::mojom::Role::kApplication:
613 case ax::mojom::Role::kDocument:
614 case ax::mojom::Role::kArticle: // Subclass of kDocument.
615 case ax::mojom::Role::kPresentational:
616 case ax::mojom::Role::kRowGroup:
617 case ax::mojom::Role::kSplitter:
618 // Dpub roles.
619 case ax::mojom::Role::kDocAbstract:
620 case ax::mojom::Role::kDocAcknowledgments:
621 case ax::mojom::Role::kDocAfterword:
622 case ax::mojom::Role::kDocAppendix:
623 case ax::mojom::Role::kDocBiblioEntry:
624 case ax::mojom::Role::kDocBibliography:
625 case ax::mojom::Role::kDocChapter:
626 case ax::mojom::Role::kDocColophon:
627 case ax::mojom::Role::kDocConclusion:
628 case ax::mojom::Role::kDocCover:
629 case ax::mojom::Role::kDocCredit:
630 case ax::mojom::Role::kDocCredits:
631 case ax::mojom::Role::kDocDedication:
632 case ax::mojom::Role::kDocEndnote:
633 case ax::mojom::Role::kDocEndnotes:
634 case ax::mojom::Role::kDocEpigraph:
635 case ax::mojom::Role::kDocEpilogue:
636 case ax::mojom::Role::kDocErrata:
637 case ax::mojom::Role::kDocExample:
638 case ax::mojom::Role::kDocFootnote:
639 case ax::mojom::Role::kDocForeword:
640 case ax::mojom::Role::kDocGlossary:
641 case ax::mojom::Role::kDocIndex:
642 case ax::mojom::Role::kDocIntroduction:
643 case ax::mojom::Role::kDocNotice:
644 case ax::mojom::Role::kDocPageBreak:
645 case ax::mojom::Role::kDocPageList:
646 case ax::mojom::Role::kDocPart:
647 case ax::mojom::Role::kDocPreface:
648 case ax::mojom::Role::kDocPrologue:
649 case ax::mojom::Role::kDocQna:
650 case ax::mojom::Role::kDocSubtitle:
651 case ax::mojom::Role::kDocTip:
652 case ax::mojom::Role::kDocToc:
653 return true;
654 default:
655 return false;
656 }
657 }
658
IsTableColumn(ax::mojom::Role role)659 bool IsTableColumn(ax::mojom::Role role) {
660 return role == ax::mojom::Role::kColumn;
661 }
662
IsTableHeader(ax::mojom::Role role)663 bool IsTableHeader(ax::mojom::Role role) {
664 switch (role) {
665 case ax::mojom::Role::kColumnHeader:
666 case ax::mojom::Role::kRowHeader:
667 return true;
668 default:
669 return false;
670 }
671 }
672
IsTableLike(const ax::mojom::Role role)673 bool IsTableLike(const ax::mojom::Role role) {
674 switch (role) {
675 case ax::mojom::Role::kGrid:
676 case ax::mojom::Role::kListGrid:
677 case ax::mojom::Role::kTable:
678 case ax::mojom::Role::kTreeGrid:
679 return true;
680 case ax::mojom::Role::kLayoutTable:
681 return kExposeLayoutTableAsDataTable;
682 default:
683 return false;
684 }
685 }
686
IsTableRow(ax::mojom::Role role)687 bool IsTableRow(ax::mojom::Role role) {
688 switch (role) {
689 case ax::mojom::Role::kRow:
690 return true;
691 case ax::mojom::Role::kLayoutTableRow:
692 return kExposeLayoutTableAsDataTable;
693 default:
694 return false;
695 }
696 }
697
IsText(ax::mojom::Role role)698 bool IsText(ax::mojom::Role role) {
699 switch (role) {
700 case ax::mojom::Role::kInlineTextBox:
701 case ax::mojom::Role::kLineBreak:
702 case ax::mojom::Role::kStaticText:
703 return true;
704 default:
705 return false;
706 }
707 }
708
ShouldHaveReadonlyStateByDefault(const ax::mojom::Role role)709 bool ShouldHaveReadonlyStateByDefault(const ax::mojom::Role role) {
710 switch (role) {
711 case ax::mojom::Role::kArticle:
712 case ax::mojom::Role::kDefinition:
713 case ax::mojom::Role::kDescriptionList:
714 case ax::mojom::Role::kDescriptionListTerm:
715 case ax::mojom::Role::kDocument:
716 case ax::mojom::Role::kGraphicsDocument:
717 case ax::mojom::Role::kImage:
718 case ax::mojom::Role::kImageMap:
719 case ax::mojom::Role::kList:
720 case ax::mojom::Role::kListItem:
721 case ax::mojom::Role::kProgressIndicator:
722 case ax::mojom::Role::kRootWebArea:
723 case ax::mojom::Role::kTerm:
724 case ax::mojom::Role::kTimer:
725 case ax::mojom::Role::kToolbar:
726 case ax::mojom::Role::kTooltip:
727 case ax::mojom::Role::kWebArea:
728 return true;
729
730 case ax::mojom::Role::kGrid:
731 // TODO(aleventhal) this changed between ARIA 1.0 and 1.1,
732 // need to determine whether grids/treegrids should really be readonly
733 // or editable by default
734 break;
735
736 default:
737 break;
738 }
739 return false;
740 }
741
SupportsExpandCollapse(const ax::mojom::Role role)742 bool SupportsExpandCollapse(const ax::mojom::Role role) {
743 switch (role) {
744 case ax::mojom::Role::kComboBoxGrouping:
745 case ax::mojom::Role::kComboBoxMenuButton:
746 case ax::mojom::Role::kDisclosureTriangle:
747 case ax::mojom::Role::kTextFieldWithComboBox:
748 case ax::mojom::Role::kTreeItem:
749 return true;
750 default:
751 return false;
752 }
753 }
754
SupportsHierarchicalLevel(const ax::mojom::Role role)755 bool SupportsHierarchicalLevel(const ax::mojom::Role role) {
756 switch (role) {
757 case ax::mojom::Role::kComment:
758 case ax::mojom::Role::kListItem:
759 case ax::mojom::Role::kRow:
760 case ax::mojom::Role::kTabList:
761 case ax::mojom::Role::kTreeItem:
762 return true;
763 default:
764 return false;
765 }
766 }
767
SupportsOrientation(const ax::mojom::Role role)768 bool SupportsOrientation(const ax::mojom::Role role) {
769 switch (role) {
770 case ax::mojom::Role::kComboBoxGrouping:
771 case ax::mojom::Role::kComboBoxMenuButton:
772 case ax::mojom::Role::kListBox:
773 case ax::mojom::Role::kMenu:
774 case ax::mojom::Role::kMenuBar:
775 case ax::mojom::Role::kRadioGroup:
776 case ax::mojom::Role::kScrollBar:
777 case ax::mojom::Role::kSlider:
778 case ax::mojom::Role::kSplitter:
779 case ax::mojom::Role::kTabList:
780 case ax::mojom::Role::kToolbar:
781 case ax::mojom::Role::kTreeGrid:
782 case ax::mojom::Role::kTree:
783 return true;
784 default:
785 return false;
786 }
787 }
788
SupportsSelected(const ax::mojom::Role role)789 bool SupportsSelected(const ax::mojom::Role role) {
790 switch (role) {
791 case ax::mojom::Role::kCell:
792 case ax::mojom::Role::kColumnHeader:
793 case ax::mojom::Role::kListBoxOption:
794 case ax::mojom::Role::kMenuListOption:
795 case ax::mojom::Role::kRow:
796 case ax::mojom::Role::kRowHeader:
797 case ax::mojom::Role::kTab:
798 case ax::mojom::Role::kTreeItem:
799 return true;
800 default:
801 return false;
802 }
803 }
804
SupportsToggle(const ax::mojom::Role role)805 bool SupportsToggle(const ax::mojom::Role role) {
806 switch (role) {
807 case ax::mojom::Role::kCheckBox:
808 case ax::mojom::Role::kMenuItemCheckBox:
809 case ax::mojom::Role::kSwitch:
810 case ax::mojom::Role::kToggleButton:
811 return true;
812 default:
813 return false;
814 }
815 }
816
817 } // namespace ui
818