Skip to content

Commit f907b34

Browse files
Abbondanzofacebook-github-bot
authored andcommitted
Fix AccessibilityRole list conversion
Summary: 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++. Differential Revision: D115746399
1 parent 7cdac2a commit f907b34

2 files changed

Lines changed: 76 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: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,88 @@
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{AccessibilityRole::None, "none"},
28+
AccessibilityRoleTestCase{AccessibilityRole::Button, "button"},
29+
AccessibilityRoleTestCase{
30+
AccessibilityRole::Dropdownlist, "dropdownlist"},
31+
AccessibilityRoleTestCase{
32+
AccessibilityRole::Togglebutton, "togglebutton"},
33+
AccessibilityRoleTestCase{AccessibilityRole::Link, "link"},
34+
AccessibilityRoleTestCase{AccessibilityRole::Search, "search"},
35+
AccessibilityRoleTestCase{AccessibilityRole::Image, "image"},
36+
AccessibilityRoleTestCase{AccessibilityRole::Keyboardkey, "keyboardkey"},
37+
AccessibilityRoleTestCase{AccessibilityRole::Text, "text"},
38+
AccessibilityRoleTestCase{AccessibilityRole::Adjustable, "adjustable"},
39+
AccessibilityRoleTestCase{AccessibilityRole::Imagebutton, "imagebutton"},
40+
AccessibilityRoleTestCase{AccessibilityRole::Header, "header"},
41+
AccessibilityRoleTestCase{AccessibilityRole::Summary, "summary"},
42+
AccessibilityRoleTestCase{AccessibilityRole::Alert, "alert"},
43+
AccessibilityRoleTestCase{AccessibilityRole::Checkbox, "checkbox"},
44+
AccessibilityRoleTestCase{AccessibilityRole::Combobox, "combobox"},
45+
AccessibilityRoleTestCase{AccessibilityRole::Menu, "menu"},
46+
AccessibilityRoleTestCase{AccessibilityRole::Menubar, "menubar"},
47+
AccessibilityRoleTestCase{AccessibilityRole::Menuitem, "menuitem"},
48+
AccessibilityRoleTestCase{AccessibilityRole::Progressbar, "progressbar"},
49+
AccessibilityRoleTestCase{AccessibilityRole::Radio, "radio"},
50+
AccessibilityRoleTestCase{AccessibilityRole::Radiogroup, "radiogroup"},
51+
AccessibilityRoleTestCase{AccessibilityRole::Scrollbar, "scrollbar"},
52+
AccessibilityRoleTestCase{AccessibilityRole::Spinbutton, "spinbutton"},
53+
AccessibilityRoleTestCase{AccessibilityRole::Switch, "switch"},
54+
AccessibilityRoleTestCase{AccessibilityRole::Tab, "tab"},
55+
AccessibilityRoleTestCase{AccessibilityRole::Tabbar, "tabbar"},
56+
AccessibilityRoleTestCase{AccessibilityRole::Tablist, "tablist"},
57+
AccessibilityRoleTestCase{AccessibilityRole::Timer, "timer"},
58+
AccessibilityRoleTestCase{AccessibilityRole::List, "list"},
59+
AccessibilityRoleTestCase{AccessibilityRole::Toolbar, "toolbar"},
60+
AccessibilityRoleTestCase{AccessibilityRole::Grid, "grid"},
61+
AccessibilityRoleTestCase{AccessibilityRole::Pager, "pager"},
62+
AccessibilityRoleTestCase{AccessibilityRole::Scrollview, "scrollview"},
63+
AccessibilityRoleTestCase{
64+
AccessibilityRole::Horizontalscrollview, "horizontalscrollview"},
65+
AccessibilityRoleTestCase{AccessibilityRole::Viewgroup, "viewgroup"},
66+
AccessibilityRoleTestCase{AccessibilityRole::Webview, "webview"},
67+
AccessibilityRoleTestCase{
68+
AccessibilityRole::Drawerlayout, "drawerlayout"},
69+
AccessibilityRoleTestCase{
70+
AccessibilityRole::Slidingdrawer, "slidingdrawer"},
71+
AccessibilityRoleTestCase{AccessibilityRole::Iconmenu, "iconmenu"},
72+
};
73+
static_assert(
74+
accessibilityRoles.size() ==
75+
static_cast<size_t>(AccessibilityRole::Iconmenu) + 1);
76+
77+
const PropsParserContext context{-1, ContextContainer{}};
78+
for (const auto& [role, name] : accessibilityRoles) {
79+
SCOPED_TRACE(name);
80+
EXPECT_EQ(toString(role), name);
81+
82+
AccessibilityRole parsedRole = role == AccessibilityRole::None
83+
? AccessibilityRole::Button
84+
: AccessibilityRole::None;
85+
fromRawValue(context, RawValue{folly::dynamic(name)}, parsedRole);
86+
EXPECT_EQ(parsedRole, role);
87+
}
88+
}
89+
1790
TEST(ConversionsTest, unprocessed_box_shadow_string) {
1891
RawValue value{
1992
folly::dynamic("10px 2px 0 5px #fff, inset 20px 10px 5px 0 #000")};

0 commit comments

Comments
 (0)