123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 |
- /*
- * Copyright (c) 2022, Jonah Shafran <jonahshafran@gmail.com>
- *
- * SPDX-License-Identifier: BSD-2-Clause
- */
- #include <AK/GenericShorthands.h>
- #include <LibWeb/ARIA/Roles.h>
- namespace Web::ARIA {
- StringView role_name(Role role)
- {
- // Note: Role::switch_ is mapped to "switch" (due to C++ keyword clash)
- switch (role) {
- #define __ENUMERATE_ARIA_ROLE(name) \
- case Role::name: \
- if constexpr (Role::name == Role::switch_) \
- return "switch"sv; \
- return #name##sv;
- ENUMERATE_ARIA_ROLES
- #undef __ENUMERATE_ARIA_ROLE
- default:
- VERIFY_NOT_REACHED();
- }
- }
- Optional<Role> role_from_string(StringView role_name)
- {
- // Note: "switch" is mapped to Role::switch_ (due to C++ keyword clash)
- #define __ENUMERATE_ARIA_ROLE(name) \
- if constexpr (Role::name == Role::switch_) { \
- if (role_name.equals_ignoring_ascii_case("switch"sv)) \
- return Role::switch_; \
- } else { \
- if (role_name.equals_ignoring_ascii_case(#name##sv)) \
- return Role::name; \
- }
- ENUMERATE_ARIA_ROLES
- #undef __ENUMERATE_ARIA_ROLE
- return {};
- }
- // https://www.w3.org/TR/wai-aria-1.2/#abstract_roles
- bool is_abstract_role(Role role)
- {
- return first_is_one_of(role,
- Role::command,
- Role::composite,
- Role::input,
- Role::landmark,
- Role::range,
- Role::roletype,
- Role::section,
- Role::sectionhead,
- Role::select,
- Role::structure,
- Role::widget,
- Role::window);
- }
- // https://www.w3.org/TR/wai-aria-1.2/#widget_roles
- bool is_widget_role(Role role)
- {
- return first_is_one_of(role,
- Role::button,
- Role::checkbox,
- Role::gridcell,
- Role::link,
- Role::menuitem,
- Role::menuitemcheckbox,
- Role::option,
- Role::progressbar,
- Role::radio,
- Role::scrollbar,
- Role::searchbox,
- Role::separator, // TODO: Only when focusable
- Role::slider,
- Role::spinbutton,
- Role::switch_,
- Role::tab,
- Role::tabpanel,
- Role::textbox,
- Role::treeitem,
- Role::combobox,
- Role::grid,
- Role::listbox,
- Role::menu,
- Role::menubar,
- Role::radiogroup,
- Role::tablist,
- Role::tree,
- Role::treegrid);
- }
- // https://www.w3.org/TR/wai-aria-1.2/#document_structure_roles
- bool is_document_structure_role(Role role)
- {
- return first_is_one_of(role,
- Role::application,
- Role::article,
- Role::blockquote,
- Role::caption,
- Role::cell,
- Role::columnheader,
- Role::definition,
- Role::deletion,
- Role::directory,
- Role::document,
- Role::emphasis,
- Role::feed,
- Role::figure,
- Role::generic,
- Role::group,
- Role::heading,
- Role::img,
- Role::insertion,
- Role::list,
- Role::listitem,
- Role::math,
- Role::meter,
- Role::none,
- Role::note,
- Role::paragraph,
- Role::presentation,
- Role::row,
- Role::rowgroup,
- Role::rowheader,
- Role::separator, // TODO: Only when not focusable
- Role::strong,
- Role::subscript,
- Role::table,
- Role::term,
- Role::time,
- Role::toolbar,
- Role::tooltip);
- }
- // https://www.w3.org/TR/wai-aria-1.2/#landmark_roles
- bool is_landmark_role(Role role)
- {
- return first_is_one_of(role,
- Role::banner,
- Role::complementary,
- Role::contentinfo,
- Role::form,
- Role::main,
- Role::navigation,
- Role::region,
- Role::search);
- }
- // https://www.w3.org/TR/wai-aria-1.2/#live_region_roles
- bool is_live_region_role(Role role)
- {
- return first_is_one_of(role,
- Role::alert,
- Role::log,
- Role::marquee,
- Role::status,
- Role::timer);
- }
- // https://www.w3.org/TR/wai-aria-1.2/#window_roles
- bool is_windows_role(Role role)
- {
- return first_is_one_of(role,
- Role::alertdialog,
- Role::dialog);
- }
- bool is_non_abstract_role(Role role)
- {
- return is_widget_role(role)
- || is_document_structure_role(role)
- || is_landmark_role(role)
- || is_live_region_role(role)
- || is_windows_role(role);
- }
- // https://www.w3.org/TR/wai-aria-1.2/#namefromcontent
- bool allows_name_from_content(Role role)
- {
- return first_is_one_of(role,
- Role::button,
- Role::cell,
- Role::checkbox,
- Role::columnheader,
- Role::gridcell,
- Role::heading,
- Role::link,
- Role::menuitem,
- Role::menuitemcheckbox,
- Role::menuitemradio,
- Role::option,
- Role::radio,
- Role::row,
- Role::rowheader,
- Role::sectionhead,
- Role::switch_,
- Role::tab,
- Role::tooltip,
- Role::treeitem);
- }
- }
|