/* * Copyright (c) 2022, Jonah Shafran * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include namespace Web::ARIA { #define ENUMERATE_ARIA_ELEMENT_REFERENCING_ATTRIBUTES \ __ENUMERATE_ARIA_ATTRIBUTE(aria_active_descendant_element, aria_active_descendant) #define ENUMERATE_ARIA_ELEMENT_LIST_REFERENCING_ATTRIBUTES \ __ENUMERATE_ARIA_ATTRIBUTE(aria_controls_elements, aria_controls) \ __ENUMERATE_ARIA_ATTRIBUTE(aria_described_by_elements, aria_described_by) \ __ENUMERATE_ARIA_ATTRIBUTE(aria_details_elements, aria_details) \ __ENUMERATE_ARIA_ATTRIBUTE(aria_error_message_elements, aria_error_message) \ __ENUMERATE_ARIA_ATTRIBUTE(aria_flow_to_elements, aria_flow_to) \ __ENUMERATE_ARIA_ATTRIBUTE(aria_labelled_by_elements, aria_labelled_by) \ __ENUMERATE_ARIA_ATTRIBUTE(aria_owns_elements, aria_owns) class ARIAMixin { public: virtual ~ARIAMixin(); #define __ENUMERATE_ARIA_ATTRIBUTE(name, attribute) \ virtual Optional name() const = 0; \ virtual WebIDL::ExceptionOr set_##name(Optional const&) = 0; ENUMERATE_ARIA_ATTRIBUTES #undef __ENUMERATE_ARIA_ATTRIBUTE // https://www.w3.org/TR/html-aria/#docconformance virtual Optional default_role() const { return {}; } virtual DOM::Element& to_element() = 0; virtual DOM::Element const& to_element() const = 0; Optional role_from_role_attribute_value() const; Optional role_or_default() const; // https://www.w3.org/TR/wai-aria-1.2/#tree_exclusion virtual bool exclude_from_accessibility_tree() const = 0; // https://www.w3.org/TR/wai-aria-1.2/#tree_inclusion virtual bool include_in_accessibility_tree() const = 0; bool has_global_aria_attribute() const; // https://www.w3.org/TR/wai-aria-1.2/#valuetype_idref Optional parse_id_reference(Optional const&) const; // https://www.w3.org/TR/wai-aria-1.2/#valuetype_idref_list Vector parse_id_reference_list(Optional const&) const; #define __ENUMERATE_ARIA_ATTRIBUTE(attribute, referencing_attribute) \ GC::Ptr attribute() const; \ void set_##attribute(GC::Ptr value); ENUMERATE_ARIA_ELEMENT_REFERENCING_ATTRIBUTES #undef __ENUMERATE_ARIA_ATTRIBUTE #define __ENUMERATE_ARIA_ATTRIBUTE(attribute, referencing_attribute) \ Optional>> const& attribute() const; \ void set_##attribute(Optional>>); \ \ GC::Ptr cached_##attribute() const; \ void set_cached_##attribute(GC::Ptr); ENUMERATE_ARIA_ELEMENT_LIST_REFERENCING_ATTRIBUTES #undef __ENUMERATE_ARIA_ATTRIBUTE protected: ARIAMixin(); void visit_edges(GC::Cell::Visitor&); virtual bool id_reference_exists(String const&) const = 0; private: #define __ENUMERATE_ARIA_ATTRIBUTE(attribute, referencing_attribute) \ WeakPtr m_##attribute; ENUMERATE_ARIA_ELEMENT_REFERENCING_ATTRIBUTES #undef __ENUMERATE_ARIA_ATTRIBUTE #define __ENUMERATE_ARIA_ATTRIBUTE(attribute, referencing_attribute) \ Optional>> m_##attribute; \ GC::Ptr m_cached_##attribute; ENUMERATE_ARIA_ELEMENT_LIST_REFERENCING_ATTRIBUTES #undef __ENUMERATE_ARIA_ATTRIBUTE }; }