123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448 |
- /*
- * Copyright (c) 2023, Jonah Shafran <jonahshafran@gmail.com>
- *
- * SPDX-License-Identifier: BSD-2-Clause
- */
- #include <AK/Variant.h>
- #include <LibWeb/ARIA/StateAndProperties.h>
- namespace Web::ARIA {
- ErrorOr<String> state_or_property_to_string_value(StateAndProperties state_or_property, AriaData const& aria_data, DefaultValueType default_value)
- {
- switch (state_or_property) {
- case StateAndProperties::AriaActiveDescendant: {
- return aria_data.aria_active_descendant_or_default().value_or(String {});
- }
- case StateAndProperties::AriaAtomic: {
- bool value;
- if (default_value.has<bool>())
- value = aria_data.aria_atomic_or_default(default_value.get<bool>());
- else
- value = aria_data.aria_atomic_or_default();
- return value ? "true"_string : "false"_string;
- }
- case StateAndProperties::AriaAutoComplete: {
- auto value = aria_data.aria_auto_complete_or_default();
- switch (value) {
- case AriaAutocomplete::None:
- return "none"_string;
- case AriaAutocomplete::List:
- return "list"_string;
- case AriaAutocomplete::Both:
- return "both"_string;
- case AriaAutocomplete::Inline:
- return "inline"_string;
- }
- VERIFY_NOT_REACHED();
- }
- case StateAndProperties::AriaBusy:
- return String::from_utf8(aria_data.aria_busy_or_default() ? "true"sv : "false"sv);
- case StateAndProperties::AriaChecked:
- return ARIA::tristate_to_string(aria_data.aria_checked_or_default());
- case StateAndProperties::AriaColCount:
- return ARIA::optional_integer_to_string(aria_data.aria_col_count_or_default());
- case StateAndProperties::AriaColIndex:
- return ARIA::optional_integer_to_string(aria_data.aria_col_index_or_default());
- case StateAndProperties::AriaColSpan:
- return ARIA::optional_integer_to_string(aria_data.aria_col_span_or_default());
- case StateAndProperties::AriaControls:
- return id_reference_list_to_string(aria_data.aria_controls_or_default());
- case StateAndProperties::AriaCurrent: {
- auto value = aria_data.aria_current_or_default();
- switch (value) {
- case AriaCurrent::False:
- return "false"_string;
- case AriaCurrent::True:
- return "true"_string;
- case AriaCurrent::Date:
- return "date"_string;
- case AriaCurrent::Location:
- return "location"_string;
- case AriaCurrent::Page:
- return "page"_string;
- case AriaCurrent::Step:
- return "step"_string;
- case AriaCurrent::Time:
- return "time"_string;
- }
- VERIFY_NOT_REACHED();
- }
- case StateAndProperties::AriaDescribedBy:
- return id_reference_list_to_string(aria_data.aria_described_by_or_default());
- case StateAndProperties::AriaDetails: {
- return aria_data.aria_details_or_default().value_or(String {});
- }
- case StateAndProperties::AriaDisabled:
- return aria_data.aria_disabled_or_default() ? "true"_string : "false"_string;
- case StateAndProperties::AriaDropEffect: {
- StringBuilder builder;
- auto value = aria_data.aria_drop_effect_or_default();
- for (auto const drop_effect : value) {
- StringView to_add;
- switch (drop_effect) {
- case AriaDropEffect::Copy:
- to_add = "copy"sv;
- break;
- case AriaDropEffect::Execute:
- to_add = "execute"sv;
- break;
- case AriaDropEffect::Link:
- to_add = "link"sv;
- break;
- case AriaDropEffect::Move:
- to_add = "move"sv;
- break;
- case AriaDropEffect::None:
- to_add = "none"sv;
- break;
- case AriaDropEffect::Popup:
- to_add = "popup"sv;
- break;
- }
- if (builder.is_empty())
- builder.append(to_add);
- else {
- builder.append(" "sv);
- builder.append(to_add);
- }
- }
- return builder.to_string();
- }
- case StateAndProperties::AriaErrorMessage: {
- return aria_data.aria_error_message_or_default().value_or(String {});
- }
- case StateAndProperties::AriaExpanded:
- return ARIA::optional_bool_to_string(aria_data.aria_expanded_or_default());
- case StateAndProperties::AriaFlowTo:
- return id_reference_list_to_string(aria_data.aria_flow_to_or_default());
- case StateAndProperties::AriaGrabbed:
- return ARIA::optional_bool_to_string(aria_data.aria_grabbed_or_default());
- case StateAndProperties::AriaHasPopup: {
- auto value = aria_data.aria_has_popup_or_default();
- switch (value) {
- case AriaHasPopup::False:
- return "false"_string;
- case AriaHasPopup::True:
- return "true"_string;
- case AriaHasPopup::Menu:
- return "menu"_string;
- case AriaHasPopup::Listbox:
- return "listbox"_string;
- case AriaHasPopup::Tree:
- return "tree"_string;
- case AriaHasPopup::Grid:
- return "grid"_string;
- case AriaHasPopup::Dialog:
- return "dialog"_string;
- }
- VERIFY_NOT_REACHED();
- }
- case StateAndProperties::AriaHidden:
- return ARIA::optional_bool_to_string(aria_data.aria_hidden_or_default());
- case StateAndProperties::AriaInvalid: {
- auto value = aria_data.aria_invalid_or_default();
- switch (value) {
- case AriaInvalid::Grammar:
- return "grammar"_string;
- case AriaInvalid::False:
- return "false"_string;
- case AriaInvalid::Spelling:
- return "spelling"_string;
- case AriaInvalid::True:
- return "true"_string;
- }
- VERIFY_NOT_REACHED();
- }
- case StateAndProperties::AriaKeyShortcuts:
- return aria_data.aria_key_shortcuts_or_default();
- case StateAndProperties::AriaLabel:
- return aria_data.aria_label_or_default();
- case StateAndProperties::AriaLabelledBy:
- return id_reference_list_to_string(aria_data.aria_labelled_by_or_default());
- case StateAndProperties::AriaLevel:
- return ARIA::optional_integer_to_string(aria_data.aria_level_or_default());
- case StateAndProperties::AriaLive: {
- AriaLive value;
- if (default_value.has<AriaLive>())
- value = aria_data.aria_live_or_default(default_value.get<AriaLive>());
- else
- value = aria_data.aria_live_or_default();
- switch (value) {
- case AriaLive::Assertive:
- return "assertive"_string;
- case AriaLive::Off:
- return "off"_string;
- case AriaLive::Polite:
- return "polite"_string;
- }
- VERIFY_NOT_REACHED();
- }
- case StateAndProperties::AriaModal:
- return aria_data.aria_modal_or_default() ? "true"_string : "false"_string;
- case StateAndProperties::AriaMultiLine:
- return aria_data.aria_multi_line_or_default() ? "true"_string : "false"_string;
- case StateAndProperties::AriaMultiSelectable:
- return aria_data.aria_multi_selectable_or_default() ? "true"_string : "false"_string;
- case StateAndProperties::AriaOrientation: {
- AriaOrientation value;
- if (default_value.has<AriaOrientation>())
- value = aria_data.aria_orientation_or_default(default_value.get<AriaOrientation>());
- else
- value = aria_data.aria_orientation_or_default();
- switch (value) {
- case AriaOrientation::Horizontal:
- return "horizontal"_string;
- case AriaOrientation::Undefined:
- return "undefined"_string;
- case AriaOrientation::Vertical:
- return "vertical"_string;
- }
- VERIFY_NOT_REACHED();
- }
- case StateAndProperties::AriaOwns:
- return id_reference_list_to_string(aria_data.aria_owns_or_default());
- case StateAndProperties::AriaPlaceholder:
- return aria_data.aria_placeholder_or_default();
- case StateAndProperties::AriaPosInSet:
- return ARIA::optional_integer_to_string(aria_data.aria_pos_in_set_or_default());
- case StateAndProperties::AriaPressed:
- return ARIA::tristate_to_string(aria_data.aria_pressed_or_default());
- case StateAndProperties::AriaReadOnly:
- return aria_data.aria_read_only_or_default() ? "true"_string : "false"_string;
- case StateAndProperties::AriaRelevant: {
- StringBuilder builder;
- auto value = aria_data.aria_relevant_or_default();
- for (auto const relevant : value) {
- StringView to_add;
- switch (relevant) {
- case AriaRelevant::Additions:
- to_add = "additions"sv;
- break;
- case AriaRelevant::AdditionsText:
- to_add = "additions text"sv;
- break;
- case AriaRelevant::All:
- to_add = "all"sv;
- break;
- case AriaRelevant::Removals:
- to_add = "removals"sv;
- break;
- case AriaRelevant::Text:
- to_add = "text"sv;
- break;
- }
- if (builder.is_empty())
- builder.append(to_add);
- else {
- builder.append(" "sv);
- builder.append(to_add);
- }
- }
- return builder.to_string();
- }
- case StateAndProperties::AriaRequired:
- return String::from_utf8(aria_data.aria_required_or_default() ? "true"sv : "false"sv);
- case StateAndProperties::AriaRoleDescription:
- return aria_data.aria_role_description_or_default();
- case StateAndProperties::AriaRowCount:
- return ARIA::optional_integer_to_string(aria_data.aria_row_count_or_default());
- case StateAndProperties::AriaRowIndex:
- return ARIA::optional_integer_to_string(aria_data.aria_row_index_or_default());
- case StateAndProperties::AriaRowSpan:
- return ARIA::optional_integer_to_string(aria_data.aria_row_span_or_default());
- case StateAndProperties::AriaSelected:
- return ARIA::optional_bool_to_string(aria_data.aria_selected_or_default());
- case StateAndProperties::AriaSetSize:
- return ARIA::optional_integer_to_string(aria_data.aria_set_size_or_default());
- case StateAndProperties::AriaSort: {
- auto value = aria_data.aria_sort_or_default();
- switch (value) {
- case AriaSort::Ascending:
- return "ascending"_string;
- case AriaSort::Descending:
- return "descending"_string;
- case AriaSort::None:
- return "none"_string;
- case AriaSort::Other:
- return "other"_string;
- }
- VERIFY_NOT_REACHED();
- }
- case StateAndProperties::AriaValueMax:
- if (default_value.has<f64>())
- return ARIA::optional_number_to_string(aria_data.aria_value_max_or_default(default_value.get<f64>()));
- else
- return ARIA::optional_number_to_string(aria_data.aria_value_max_or_default());
- case StateAndProperties::AriaValueMin:
- if (default_value.has<f64>())
- return ARIA::optional_number_to_string(aria_data.aria_value_min_or_default(default_value.get<f64>()));
- else
- return ARIA::optional_number_to_string(aria_data.aria_value_min_or_default());
- case StateAndProperties::AriaValueNow:
- return ARIA::optional_number_to_string(aria_data.aria_value_now_or_default());
- case StateAndProperties::AriaValueText:
- return aria_data.aria_value_text_or_default();
- }
- VERIFY_NOT_REACHED();
- }
- ErrorOr<String> tristate_to_string(Tristate value)
- {
- switch (value) {
- case Tristate::False:
- return "false"_string;
- case Tristate::True:
- return "true"_string;
- case Tristate::Undefined:
- return "undefined"_string;
- case Tristate::Mixed:
- return "mixed"_string;
- }
- VERIFY_NOT_REACHED();
- }
- ErrorOr<String> optional_integer_to_string(Optional<i32> value)
- {
- if (value.has_value())
- return String::number(value.value());
- return String {};
- }
- ErrorOr<String> optional_bool_to_string(Optional<bool> value)
- {
- if (!value.has_value())
- return "undefined"_string;
- if (value.value())
- return "true"_string;
- return "false"_string;
- }
- ErrorOr<String> optional_number_to_string(Optional<f64> value)
- {
- if (!value.has_value())
- return "undefined"_string;
- return String::number(value.value());
- }
- ErrorOr<String> id_reference_list_to_string(Vector<String> const& value)
- {
- StringBuilder builder;
- for (auto const& id : value) {
- if (builder.is_empty()) {
- builder.append(id);
- } else {
- builder.append(" "sv);
- builder.append(id);
- }
- }
- return builder.to_string();
- }
- StringView state_or_property_to_string(StateAndProperties value)
- {
- switch (value) {
- case StateAndProperties::AriaActiveDescendant:
- return "aria-activedescendant"sv;
- case StateAndProperties::AriaAtomic:
- return "aria-atomic"sv;
- case StateAndProperties::AriaAutoComplete:
- return "aria-autocomplete"sv;
- case StateAndProperties::AriaBusy:
- return "aria-busy"sv;
- case StateAndProperties::AriaChecked:
- return "aria-checked"sv;
- case StateAndProperties::AriaColCount:
- return "aria-colcount"sv;
- case StateAndProperties::AriaColIndex:
- return "aria-colindex"sv;
- case StateAndProperties::AriaColSpan:
- return "aria-colspan"sv;
- case StateAndProperties::AriaControls:
- return "aria-controls"sv;
- case StateAndProperties::AriaCurrent:
- return "aria-current"sv;
- case StateAndProperties::AriaDescribedBy:
- return "aria-describedby"sv;
- case StateAndProperties::AriaDetails:
- return "aria-details"sv;
- case StateAndProperties::AriaDisabled:
- return "aria-disabled"sv;
- case StateAndProperties::AriaDropEffect:
- return "aria-dropeffect"sv;
- case StateAndProperties::AriaErrorMessage:
- return "aria-errormessage"sv;
- case StateAndProperties::AriaExpanded:
- return "aria-expanded"sv;
- case StateAndProperties::AriaFlowTo:
- return "aria-flowto"sv;
- case StateAndProperties::AriaGrabbed:
- return "aria-grabbed"sv;
- case StateAndProperties::AriaHasPopup:
- return "aria-haspopup"sv;
- case StateAndProperties::AriaHidden:
- return "aria-hidden"sv;
- case StateAndProperties::AriaInvalid:
- return "aria-invalid"sv;
- case StateAndProperties::AriaKeyShortcuts:
- return "aria-keyshortcuts"sv;
- case StateAndProperties::AriaLabel:
- return "aria-label"sv;
- case StateAndProperties::AriaLabelledBy:
- return "aria-labelledby"sv;
- case StateAndProperties::AriaLevel:
- return "aria-level"sv;
- case StateAndProperties::AriaLive:
- return "aria-live"sv;
- case StateAndProperties::AriaModal:
- return "aria-modal"sv;
- case StateAndProperties::AriaMultiLine:
- return "aria-multiline"sv;
- case StateAndProperties::AriaMultiSelectable:
- return "aria-multiselectable"sv;
- case StateAndProperties::AriaOrientation:
- return "aria-orientation"sv;
- case StateAndProperties::AriaOwns:
- return "aria-owns"sv;
- case StateAndProperties::AriaPlaceholder:
- return "aria-placeholder"sv;
- case StateAndProperties::AriaPosInSet:
- return "aria-posinset"sv;
- case StateAndProperties::AriaPressed:
- return "aria-pressed"sv;
- case StateAndProperties::AriaReadOnly:
- return "aria-readonly"sv;
- case StateAndProperties::AriaRelevant:
- return "aria-relevant"sv;
- case StateAndProperties::AriaRequired:
- return "aria-required"sv;
- case StateAndProperties::AriaRoleDescription:
- return "aria-roledescription"sv;
- case StateAndProperties::AriaRowCount:
- return "aria-rowcount"sv;
- case StateAndProperties::AriaRowIndex:
- return "aria-rowindex"sv;
- case StateAndProperties::AriaRowSpan:
- return "aria-rowspan"sv;
- case StateAndProperties::AriaSelected:
- return "aria-selected"sv;
- case StateAndProperties::AriaSetSize:
- return "aria-setsize"sv;
- case StateAndProperties::AriaSort:
- return "aria-sort"sv;
- case StateAndProperties::AriaValueMax:
- return "aria-valuemax"sv;
- case StateAndProperties::AriaValueMin:
- return "aria-valuemin"sv;
- case StateAndProperties::AriaValueNow:
- return "aria-valuenow"sv;
- case StateAndProperties::AriaValueText:
- return "aria-valuetext"sv;
- }
- VERIFY_NOT_REACHED();
- }
- }
|