Roles.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. /*
  2. * Copyright (c) 2022, Jonah Shafran <jonahshafran@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/GenericShorthands.h>
  7. #include <LibWeb/ARIA/Roles.h>
  8. namespace Web::ARIA {
  9. StringView role_name(Role role)
  10. {
  11. // Note: Role::switch_ is mapped to "switch" (due to C++ keyword clash)
  12. switch (role) {
  13. #define __ENUMERATE_ARIA_ROLE(name) \
  14. case Role::name: \
  15. if constexpr (Role::name == Role::switch_) \
  16. return "switch"sv; \
  17. return #name##sv;
  18. ENUMERATE_ARIA_ROLES
  19. #undef __ENUMERATE_ARIA_ROLE
  20. default:
  21. VERIFY_NOT_REACHED();
  22. }
  23. }
  24. Optional<Role> role_from_string(StringView role_name)
  25. {
  26. // Note: "switch" is mapped to Role::switch_ (due to C++ keyword clash)
  27. #define __ENUMERATE_ARIA_ROLE(name) \
  28. if constexpr (Role::name == Role::switch_) { \
  29. if (role_name.equals_ignoring_ascii_case("switch"sv)) \
  30. return Role::switch_; \
  31. } else { \
  32. if (role_name.equals_ignoring_ascii_case(#name##sv)) \
  33. return Role::name; \
  34. }
  35. ENUMERATE_ARIA_ROLES
  36. #undef __ENUMERATE_ARIA_ROLE
  37. return {};
  38. }
  39. // https://www.w3.org/TR/wai-aria-1.2/#abstract_roles
  40. bool is_abstract_role(Role role)
  41. {
  42. return first_is_one_of(role,
  43. Role::command,
  44. Role::composite,
  45. Role::input,
  46. Role::landmark,
  47. Role::range,
  48. Role::roletype,
  49. Role::section,
  50. Role::sectionhead,
  51. Role::select,
  52. Role::structure,
  53. Role::widget,
  54. Role::window);
  55. }
  56. // https://www.w3.org/TR/wai-aria-1.2/#widget_roles
  57. bool is_widget_role(Role role)
  58. {
  59. return first_is_one_of(role,
  60. Role::button,
  61. Role::checkbox,
  62. Role::gridcell,
  63. Role::link,
  64. Role::menuitem,
  65. Role::menuitemcheckbox,
  66. Role::option,
  67. Role::progressbar,
  68. Role::radio,
  69. Role::scrollbar,
  70. Role::searchbox,
  71. Role::separator, // TODO: Only when focusable
  72. Role::slider,
  73. Role::spinbutton,
  74. Role::switch_,
  75. Role::tab,
  76. Role::tabpanel,
  77. Role::textbox,
  78. Role::treeitem,
  79. Role::combobox,
  80. Role::grid,
  81. Role::listbox,
  82. Role::menu,
  83. Role::menubar,
  84. Role::radiogroup,
  85. Role::tablist,
  86. Role::tree,
  87. Role::treegrid);
  88. }
  89. // https://www.w3.org/TR/wai-aria-1.2/#document_structure_roles
  90. bool is_document_structure_role(Role role)
  91. {
  92. return first_is_one_of(role,
  93. Role::application,
  94. Role::article,
  95. Role::blockquote,
  96. Role::caption,
  97. Role::cell,
  98. Role::columnheader,
  99. Role::definition,
  100. Role::deletion,
  101. Role::directory,
  102. Role::document,
  103. Role::emphasis,
  104. Role::feed,
  105. Role::figure,
  106. Role::generic,
  107. Role::group,
  108. Role::heading,
  109. Role::img,
  110. Role::insertion,
  111. Role::list,
  112. Role::listitem,
  113. Role::math,
  114. Role::meter,
  115. Role::none,
  116. Role::note,
  117. Role::paragraph,
  118. Role::presentation,
  119. Role::row,
  120. Role::rowgroup,
  121. Role::rowheader,
  122. Role::separator, // TODO: Only when not focusable
  123. Role::strong,
  124. Role::subscript,
  125. Role::table,
  126. Role::term,
  127. Role::time,
  128. Role::toolbar,
  129. Role::tooltip);
  130. }
  131. // https://www.w3.org/TR/wai-aria-1.2/#landmark_roles
  132. bool is_landmark_role(Role role)
  133. {
  134. return first_is_one_of(role,
  135. Role::banner,
  136. Role::complementary,
  137. Role::contentinfo,
  138. Role::form,
  139. Role::main,
  140. Role::navigation,
  141. Role::region,
  142. Role::search);
  143. }
  144. // https://www.w3.org/TR/wai-aria-1.2/#live_region_roles
  145. bool is_live_region_role(Role role)
  146. {
  147. return first_is_one_of(role,
  148. Role::alert,
  149. Role::log,
  150. Role::marquee,
  151. Role::status,
  152. Role::timer);
  153. }
  154. // https://www.w3.org/TR/wai-aria-1.2/#window_roles
  155. bool is_windows_role(Role role)
  156. {
  157. return first_is_one_of(role,
  158. Role::alertdialog,
  159. Role::dialog);
  160. }
  161. bool is_non_abstract_role(Role role)
  162. {
  163. return is_widget_role(role)
  164. || is_document_structure_role(role)
  165. || is_landmark_role(role)
  166. || is_live_region_role(role)
  167. || is_windows_role(role);
  168. }
  169. // https://www.w3.org/TR/wai-aria-1.2/#namefromcontent
  170. bool allows_name_from_content(Role role)
  171. {
  172. return first_is_one_of(role,
  173. Role::button,
  174. Role::cell,
  175. Role::checkbox,
  176. Role::columnheader,
  177. Role::gridcell,
  178. Role::heading,
  179. Role::link,
  180. Role::menuitem,
  181. Role::menuitemcheckbox,
  182. Role::menuitemradio,
  183. Role::option,
  184. Role::radio,
  185. Role::row,
  186. Role::rowheader,
  187. Role::sectionhead,
  188. Role::switch_,
  189. Role::tab,
  190. Role::tooltip,
  191. Role::treeitem);
  192. }
  193. }