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