Skip to content

Commit aa96fa6

Browse files
Abbondanzometa-codesync[bot]
authored andcommitted
Fix AccessibilityRole list conversion (#57926)
Summary: Pull Request resolved: #57926 Serialize `AccessibilityRole::List` as `list` and recognize `list` when parsing accessibility roles. Add exhaustive round-trip coverage for every named `AccessibilityRole`. Changelog: [General][Fixed] - Fix accessibility list role conversion in C++. Reviewed By: christophpurrer Differential Revision: D115746399 fbshipit-source-id: fdf4a74bbef7afe61ac18bf9adbc407cf29ac138
1 parent aeee662 commit aa96fa6

2 files changed

Lines changed: 111 additions & 1 deletion

File tree

packages/react-native/ReactCommon/react/renderer/components/view/accessibilityPropsConversions.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ inline std::string toString(const AccessibilityRole &accessibilityRole)
349349
case AccessibilityRole::Timer:
350350
return "timer";
351351
case AccessibilityRole::List:
352-
return "timer";
352+
return "list";
353353
case AccessibilityRole::Toolbar:
354354
return "toolbar";
355355
case AccessibilityRole::Grid:
@@ -441,6 +441,8 @@ inline void fromRawValue(const PropsParserContext &context, const RawValue &valu
441441
result = AccessibilityRole::Tablist;
442442
} else if (string == "timer") {
443443
result = AccessibilityRole::Timer;
444+
} else if (string == "list") {
445+
result = AccessibilityRole::List;
444446
} else if (string == "toolbar") {
445447
result = AccessibilityRole::Toolbar;
446448
} else if (string == "grid") {

packages/react-native/ReactCommon/react/renderer/components/view/tests/ConversionsTest.cpp

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,123 @@
55
* LICENSE file in the root directory of this source tree.
66
*/
77

8+
#include <array>
9+
810
#include <gtest/gtest.h>
911

1012
#include <react/renderer/attributedstring/conversions.h>
1113
#include <react/renderer/components/view/BoxShadowPropsConversions.h>
1214
#include <react/renderer/components/view/FilterPropsConversions.h>
15+
#include <react/renderer/components/view/accessibilityPropsConversions.h>
1316
#include <react/renderer/components/view/conversions.h>
1417

1518
namespace facebook::react {
1619

20+
TEST(ConversionsTest, accessibility_roles_round_trip) {
21+
struct AccessibilityRoleTestCase {
22+
AccessibilityRole role;
23+
const char* name;
24+
};
25+
26+
constexpr std::array accessibilityRoles{
27+
AccessibilityRoleTestCase{
28+
.role = AccessibilityRole::None, .name = "none"},
29+
AccessibilityRoleTestCase{
30+
.role = AccessibilityRole::Button, .name = "button"},
31+
AccessibilityRoleTestCase{
32+
.role = AccessibilityRole::Dropdownlist, .name = "dropdownlist"},
33+
AccessibilityRoleTestCase{
34+
.role = AccessibilityRole::Togglebutton, .name = "togglebutton"},
35+
AccessibilityRoleTestCase{
36+
.role = AccessibilityRole::Link, .name = "link"},
37+
AccessibilityRoleTestCase{
38+
.role = AccessibilityRole::Search, .name = "search"},
39+
AccessibilityRoleTestCase{
40+
.role = AccessibilityRole::Image, .name = "image"},
41+
AccessibilityRoleTestCase{
42+
.role = AccessibilityRole::Keyboardkey, .name = "keyboardkey"},
43+
AccessibilityRoleTestCase{
44+
.role = AccessibilityRole::Text, .name = "text"},
45+
AccessibilityRoleTestCase{
46+
.role = AccessibilityRole::Adjustable, .name = "adjustable"},
47+
AccessibilityRoleTestCase{
48+
.role = AccessibilityRole::Imagebutton, .name = "imagebutton"},
49+
AccessibilityRoleTestCase{
50+
.role = AccessibilityRole::Header, .name = "header"},
51+
AccessibilityRoleTestCase{
52+
.role = AccessibilityRole::Summary, .name = "summary"},
53+
AccessibilityRoleTestCase{
54+
.role = AccessibilityRole::Alert, .name = "alert"},
55+
AccessibilityRoleTestCase{
56+
.role = AccessibilityRole::Checkbox, .name = "checkbox"},
57+
AccessibilityRoleTestCase{
58+
.role = AccessibilityRole::Combobox, .name = "combobox"},
59+
AccessibilityRoleTestCase{
60+
.role = AccessibilityRole::Menu, .name = "menu"},
61+
AccessibilityRoleTestCase{
62+
.role = AccessibilityRole::Menubar, .name = "menubar"},
63+
AccessibilityRoleTestCase{
64+
.role = AccessibilityRole::Menuitem, .name = "menuitem"},
65+
AccessibilityRoleTestCase{
66+
.role = AccessibilityRole::Progressbar, .name = "progressbar"},
67+
AccessibilityRoleTestCase{
68+
.role = AccessibilityRole::Radio, .name = "radio"},
69+
AccessibilityRoleTestCase{
70+
.role = AccessibilityRole::Radiogroup, .name = "radiogroup"},
71+
AccessibilityRoleTestCase{
72+
.role = AccessibilityRole::Scrollbar, .name = "scrollbar"},
73+
AccessibilityRoleTestCase{
74+
.role = AccessibilityRole::Spinbutton, .name = "spinbutton"},
75+
AccessibilityRoleTestCase{
76+
.role = AccessibilityRole::Switch, .name = "switch"},
77+
AccessibilityRoleTestCase{.role = AccessibilityRole::Tab, .name = "tab"},
78+
AccessibilityRoleTestCase{
79+
.role = AccessibilityRole::Tabbar, .name = "tabbar"},
80+
AccessibilityRoleTestCase{
81+
.role = AccessibilityRole::Tablist, .name = "tablist"},
82+
AccessibilityRoleTestCase{
83+
.role = AccessibilityRole::Timer, .name = "timer"},
84+
AccessibilityRoleTestCase{
85+
.role = AccessibilityRole::List, .name = "list"},
86+
AccessibilityRoleTestCase{
87+
.role = AccessibilityRole::Toolbar, .name = "toolbar"},
88+
AccessibilityRoleTestCase{
89+
.role = AccessibilityRole::Grid, .name = "grid"},
90+
AccessibilityRoleTestCase{
91+
.role = AccessibilityRole::Pager, .name = "pager"},
92+
AccessibilityRoleTestCase{
93+
.role = AccessibilityRole::Scrollview, .name = "scrollview"},
94+
AccessibilityRoleTestCase{
95+
.role = AccessibilityRole::Horizontalscrollview,
96+
.name = "horizontalscrollview"},
97+
AccessibilityRoleTestCase{
98+
.role = AccessibilityRole::Viewgroup, .name = "viewgroup"},
99+
AccessibilityRoleTestCase{
100+
.role = AccessibilityRole::Webview, .name = "webview"},
101+
AccessibilityRoleTestCase{
102+
.role = AccessibilityRole::Drawerlayout, .name = "drawerlayout"},
103+
AccessibilityRoleTestCase{
104+
.role = AccessibilityRole::Slidingdrawer, .name = "slidingdrawer"},
105+
AccessibilityRoleTestCase{
106+
.role = AccessibilityRole::Iconmenu, .name = "iconmenu"},
107+
};
108+
static_assert(
109+
accessibilityRoles.size() ==
110+
static_cast<size_t>(AccessibilityRole::Iconmenu) + 1);
111+
112+
const PropsParserContext context{-1, ContextContainer{}};
113+
for (const auto& [role, name] : accessibilityRoles) {
114+
SCOPED_TRACE(name);
115+
EXPECT_EQ(toString(role), name);
116+
117+
AccessibilityRole parsedRole = role == AccessibilityRole::None
118+
? AccessibilityRole::Button
119+
: AccessibilityRole::None;
120+
fromRawValue(context, RawValue{folly::dynamic(name)}, parsedRole);
121+
EXPECT_EQ(parsedRole, role);
122+
}
123+
}
124+
17125
TEST(ConversionsTest, unprocessed_box_shadow_string) {
18126
RawValue value{
19127
folly::dynamic("10px 2px 0 5px #fff, inset 20px 10px 5px 0 #000")};

0 commit comments

Comments
 (0)