mirror of
				https://github.com/LadybirdBrowser/ladybird.git
				synced 2025-11-04 07:10:57 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			206 lines
		
	
	
	
		
			5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			206 lines
		
	
	
	
		
			5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
 * 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);
 | 
						|
}
 | 
						|
 | 
						|
}
 |