diff --git a/ReactCommon/fabric/attributedstring/TextAttributes.cpp b/ReactCommon/fabric/attributedstring/TextAttributes.cpp index 82052a7d7be..c30817a8ea8 100644 --- a/ReactCommon/fabric/attributedstring/TextAttributes.cpp +++ b/ReactCommon/fabric/attributedstring/TextAttributes.cpp @@ -94,7 +94,7 @@ void TextAttributes::apply(TextAttributes textAttributes) { layoutDirection = textAttributes.layoutDirection.hasValue() ? textAttributes.layoutDirection : layoutDirection; - accessibilityRole = !textAttributes.accessibilityRole.empty() + accessibilityRole = textAttributes.accessibilityRole.hasValue() ? textAttributes.accessibilityRole : accessibilityRole; } diff --git a/ReactCommon/fabric/attributedstring/TextAttributes.h b/ReactCommon/fabric/attributedstring/TextAttributes.h index 75937237492..2589d89dfd9 100644 --- a/ReactCommon/fabric/attributedstring/TextAttributes.h +++ b/ReactCommon/fabric/attributedstring/TextAttributes.h @@ -77,7 +77,7 @@ class TextAttributes : public DebugStringConvertible { // Currently, it is intentionally *not* being set as part of BaseTextProps // construction. folly::Optional layoutDirection{}; - std::string accessibilityRole{""}; + folly::Optional accessibilityRole{}; #pragma mark - Operations diff --git a/ReactCommon/fabric/attributedstring/conversions.h b/ReactCommon/fabric/attributedstring/conversions.h index 3046e8f7983..9e7d484ade0 100644 --- a/ReactCommon/fabric/attributedstring/conversions.h +++ b/ReactCommon/fabric/attributedstring/conversions.h @@ -412,6 +412,178 @@ inline std::string toString( } } +inline std::string toString(const AccessibilityRole &accessibilityRole) { + switch (accessibilityRole) { + case AccessibilityRole::None: + return "none"; + case AccessibilityRole::Button: + return "button"; + case AccessibilityRole::Link: + return "link"; + case AccessibilityRole::Search: + return "search"; + case AccessibilityRole::Image: + return "image"; + case AccessibilityRole::Imagebutton: + return "imagebutton"; + case AccessibilityRole::Keyboardkey: + return "keyboardkey"; + case AccessibilityRole::Text: + return "text"; + case AccessibilityRole::Adjustable: + return "adjustable"; + case AccessibilityRole::Summary: + return "summary"; + case AccessibilityRole::Header: + return "header"; + case AccessibilityRole::Alert: + return "alert"; + case AccessibilityRole::Checkbox: + return "checkbox"; + case AccessibilityRole::Combobox: + return "combobox"; + case AccessibilityRole::Menu: + return "menu"; + case AccessibilityRole::Menubar: + return "menubar"; + case AccessibilityRole::Menuitem: + return "menuitem"; + case AccessibilityRole::Progressbar: + return "progressbar"; + case AccessibilityRole::Radio: + return "radio"; + case AccessibilityRole::Radiogroup: + return "radiogroup"; + case AccessibilityRole::Scrollbar: + return "scrollbar"; + case AccessibilityRole::Spinbutton: + return "spinbutton"; + case AccessibilityRole::Switch: + return "switch"; + case AccessibilityRole::Tab: + return "tab"; + case AccessibilityRole::Tablist: + return "tablist"; + case AccessibilityRole::Timer: + return "timer"; + case AccessibilityRole::Toolbar: + return "toolbar"; + } +} + +inline void fromRawValue(const RawValue &value, AccessibilityRole &result) { + auto string = (std::string)value; + if (string == "none") { + result = AccessibilityRole::None; + return; + } + if (string == "button") { + result = AccessibilityRole::Button; + return; + } + if (string == "link") { + result = AccessibilityRole::Link; + return; + } + if (string == "search") { + result = AccessibilityRole::Search; + return; + } + if (string == "image") { + result = AccessibilityRole::Image; + return; + } + if (string == "imagebutton") { + result = AccessibilityRole::Imagebutton; + return; + } + if (string == "keyboardkey") { + result = AccessibilityRole::Keyboardkey; + return; + } + if (string == "text") { + result = AccessibilityRole::Text; + return; + } + if (string == "adjustable") { + result = AccessibilityRole::Adjustable; + return; + } + if (string == "summary") { + result = AccessibilityRole::Summary; + return; + } + if (string == "header") { + result = AccessibilityRole::Header; + return; + } + if (string == "alert") { + result = AccessibilityRole::Alert; + return; + } + if (string == "checkbox") { + result = AccessibilityRole::Checkbox; + return; + } + if (string == "combobox") { + result = AccessibilityRole::Combobox; + return; + } + if (string == "menu") { + result = AccessibilityRole::Menu; + return; + } + if (string == "menubar") { + result = AccessibilityRole::Menubar; + return; + } + if (string == "menuitem") { + result = AccessibilityRole::Menuitem; + return; + } + if (string == "progressbar") { + result = AccessibilityRole::Progressbar; + return; + } + if (string == "radio") { + result = AccessibilityRole::Radio; + return; + } + if (string == "radiogroup") { + result = AccessibilityRole::Radiogroup; + return; + } + if (string == "scrollbar") { + result = AccessibilityRole::Scrollbar; + return; + } + if (string == "spinbutton") { + result = AccessibilityRole::Spinbutton; + return; + } + if (string == "switch") { + result = AccessibilityRole::Switch; + return; + } + if (string == "tab") { + result = AccessibilityRole::Tab; + return; + } + if (string == "tablist") { + result = AccessibilityRole::Tablist; + return; + } + if (string == "timer") { + result = AccessibilityRole::Timer; + return; + } + if (string == "toolbar") { + result = AccessibilityRole::Toolbar; + return; + } + abort(); +} + inline ParagraphAttributes convertRawProp( RawProps const &rawProps, ParagraphAttributes const &sourceParagraphAttributes, diff --git a/ReactCommon/fabric/attributedstring/primitives.h b/ReactCommon/fabric/attributedstring/primitives.h index c44538c546a..13946ec180f 100644 --- a/ReactCommon/fabric/attributedstring/primitives.h +++ b/ReactCommon/fabric/attributedstring/primitives.h @@ -87,6 +87,36 @@ enum class TextDecorationLinePattern { DashDotDot, }; +enum class AccessibilityRole { + None, + Button, + Link, + Search, + Image, + Imagebutton, + Keyboardkey, + Text, + Adjustable, + Summary, + Header, + Alert, + Checkbox, + Combobox, + Menu, + Menubar, + Menuitem, + Progressbar, + Radio, + Radiogroup, + Scrollbar, + Spinbutton, + Switch, + Tab, + Tablist, + Timer, + Toolbar, +}; + } // namespace react } // namespace facebook @@ -160,4 +190,11 @@ struct hash { return hash()(static_cast(v)); } }; + +template <> +struct hash { + size_t operator()(const facebook::react::AccessibilityRole &v) const { + return hash()(static_cast(v)); + } +}; } // namespace std diff --git a/ReactCommon/fabric/textlayoutmanager/platform/ios/RCTAttributedTextUtils.mm b/ReactCommon/fabric/textlayoutmanager/platform/ios/RCTAttributedTextUtils.mm index df67fc85fed..f9a6537abe2 100644 --- a/ReactCommon/fabric/textlayoutmanager/platform/ios/RCTAttributedTextUtils.mm +++ b/ReactCommon/fabric/textlayoutmanager/platform/ios/RCTAttributedTextUtils.mm @@ -212,9 +212,91 @@ NSDictionary *RCTNSTextAttributesFromTextAttributes(T attributes[RCTAttributedStringIsHighlightedAttributeName] = @YES; } - if (!textAttributes.accessibilityRole.empty()) { - attributes[RCTTextAttributesAccessibilityRoleAttributeName] = - [NSString stringWithCString:textAttributes.accessibilityRole.c_str() encoding:NSUTF8StringEncoding]; + if (textAttributes.accessibilityRole.hasValue()) { + auto accessibilityRole = textAttributes.accessibilityRole.value(); + switch (accessibilityRole) { + case AccessibilityRole::None: + attributes[RCTTextAttributesAccessibilityRoleAttributeName] = @("none"); + break; + case AccessibilityRole::Button: + attributes[RCTTextAttributesAccessibilityRoleAttributeName] = @("button"); + break; + case AccessibilityRole::Link: + attributes[RCTTextAttributesAccessibilityRoleAttributeName] = @("link"); + break; + case AccessibilityRole::Search: + attributes[RCTTextAttributesAccessibilityRoleAttributeName] = @("search"); + break; + case AccessibilityRole::Image: + attributes[RCTTextAttributesAccessibilityRoleAttributeName] = @("image"); + break; + case AccessibilityRole::Imagebutton: + attributes[RCTTextAttributesAccessibilityRoleAttributeName] = @("imagebutton"); + break; + case AccessibilityRole::Keyboardkey: + attributes[RCTTextAttributesAccessibilityRoleAttributeName] = @("keyboardkey"); + break; + case AccessibilityRole::Text: + attributes[RCTTextAttributesAccessibilityRoleAttributeName] = @("text"); + break; + case AccessibilityRole::Adjustable: + attributes[RCTTextAttributesAccessibilityRoleAttributeName] = @("adjustable"); + break; + case AccessibilityRole::Summary: + attributes[RCTTextAttributesAccessibilityRoleAttributeName] = @("summary"); + break; + case AccessibilityRole::Header: + attributes[RCTTextAttributesAccessibilityRoleAttributeName] = @("header"); + break; + case AccessibilityRole::Alert: + attributes[RCTTextAttributesAccessibilityRoleAttributeName] = @("alert"); + break; + case AccessibilityRole::Checkbox: + attributes[RCTTextAttributesAccessibilityRoleAttributeName] = @("checkbox"); + break; + case AccessibilityRole::Combobox: + attributes[RCTTextAttributesAccessibilityRoleAttributeName] = @("combobox"); + break; + case AccessibilityRole::Menu: + attributes[RCTTextAttributesAccessibilityRoleAttributeName] = @("menu"); + break; + case AccessibilityRole::Menubar: + attributes[RCTTextAttributesAccessibilityRoleAttributeName] = @("menubar"); + break; + case AccessibilityRole::Menuitem: + attributes[RCTTextAttributesAccessibilityRoleAttributeName] = @("menuitem"); + break; + case AccessibilityRole::Progressbar: + attributes[RCTTextAttributesAccessibilityRoleAttributeName] = @("progressbar"); + break; + case AccessibilityRole::Radio: + attributes[RCTTextAttributesAccessibilityRoleAttributeName] = @("radio"); + break; + case AccessibilityRole::Radiogroup: + attributes[RCTTextAttributesAccessibilityRoleAttributeName] = @("radiogroup"); + break; + case AccessibilityRole::Scrollbar: + attributes[RCTTextAttributesAccessibilityRoleAttributeName] = @("scrollbar"); + break; + case AccessibilityRole::Spinbutton: + attributes[RCTTextAttributesAccessibilityRoleAttributeName] = @("spinbutton"); + break; + case AccessibilityRole::Switch: + attributes[RCTTextAttributesAccessibilityRoleAttributeName] = @("switch"); + break; + case AccessibilityRole::Tab: + attributes[RCTTextAttributesAccessibilityRoleAttributeName] = @("tab"); + break; + case AccessibilityRole::Tablist: + attributes[RCTTextAttributesAccessibilityRoleAttributeName] = @("tablist"); + break; + case AccessibilityRole::Timer: + attributes[RCTTextAttributesAccessibilityRoleAttributeName] = @("timer"); + break; + case AccessibilityRole::Toolbar: + attributes[RCTTextAttributesAccessibilityRoleAttributeName] = @("toolbar"); + break; + }; } return [attributes copy];