Skip to content

Commit 7fa58f5

Browse files
committed
Fabric cpp settings trigger runtime error
terminating with uncaught exception of type std::length_error: vector (screenshot1, screenshot2) https://www.icloud.com/iclouddrive/0a4Urx1Av554xzHH1hh3YHy9A#first_screenshot https://stackoverflow.com/a/1183709/7295772
1 parent 6def7a9 commit 7fa58f5

File tree

10 files changed

+106
-7
lines changed

10 files changed

+106
-7
lines changed

Libraries/Components/View/ViewAccessibility.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
import type {SyntheticEvent} from '../../Types/CoreEventTypes';
1414

15+
export type AccessibilityUnit = 'none' | 'verbatim';
1516
// This must be kept in sync with the AccessibilityRolesMask in RCTViewManager.m
1617
export type AccessibilityRole =
1718
| 'none'

Libraries/Text/TextProps.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import type {
1515
AccessibilityActionInfo,
1616
AccessibilityRole,
1717
AccessibilityState,
18+
AccessibilityUnit,
1819
Role,
1920
} from '../Components/View/ViewAccessibility';
2021
import type {TextStyleProp} from '../StyleSheet/StyleSheet';
@@ -57,6 +58,7 @@ export type TextProps = $ReadOnly<{|
5758
accessibilityLanguage?: ?Stringish,
5859
accessibilityLabel?: ?Stringish,
5960
accessibilityRole?: ?AccessibilityRole,
61+
accessibilityUnit?: ?AccessibilityUnit,
6062
accessibilityState?: ?AccessibilityState,
6163
'aria-label'?: ?string,
6264

ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManager.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import com.facebook.react.common.MapBuilder;
2727
import com.facebook.react.common.ReactConstants;
2828
import com.facebook.react.uimanager.ReactAccessibilityDelegate.AccessibilityRole;
29+
import com.facebook.react.uimanager.ReactAccessibilityDelegate.AccessibilityUnit;
2930
import com.facebook.react.uimanager.annotations.ReactProp;
3031
import com.facebook.react.uimanager.events.PointerEventHelper;
3132
import com.facebook.react.uimanager.util.ReactFindViewUtil;
@@ -250,6 +251,14 @@ public void setAccessibilityRole(@NonNull T view, @Nullable String accessibility
250251
view.setTag(R.id.accessibility_role, AccessibilityRole.fromValue(accessibilityRole));
251252
}
252253

254+
@ReactProp(name = ViewProps.ACCESSIBILITY_UNIT)
255+
public void setAccessibilityUnit(@NonNull T view, @Nullable String accessibilityUnit) {
256+
if (accessibilityUnit == null) {
257+
return;
258+
}
259+
view.setTag(R.id.accessibility_unit, AccessibilityUnit.fromValue(accessibilityUnit));
260+
}
261+
253262
@Override
254263
@ReactProp(name = ViewProps.ACCESSIBILITY_COLLECTION)
255264
public void setAccessibilityCollection(

ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactAccessibilityDelegate.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,36 @@ private void scheduleAccessibilityEventSender(View host) {
9090
Message msg = mHandler.obtainMessage(SEND_EVENT, host);
9191
mHandler.sendMessageDelayed(msg, TIMEOUT_SEND_ACCESSIBILITY_EVENT);
9292
}
93+
/**
94+
* These roles are defined by Google's TalkBack screen reader, and this list should be kept up to
95+
* date with their implementation. Details can be seen in their source code here:
96+
*
97+
* <p>https://github.com/google/talkback/blob/master/utils/src/main/java/Unit.java
98+
*/
99+
public enum AccessibilityUnit {
100+
NONE,
101+
VERBATIM;
102+
103+
public static String getValue(AccessibilityUnit role) {
104+
switch (role) {
105+
case VERBATIM:
106+
return "android.type.verbatim";
107+
case NONE:
108+
return "android.type.text";
109+
default:
110+
throw new IllegalArgumentException("Invalid accessibility role value: " + role);
111+
}
112+
}
113+
114+
public static AccessibilityUnit fromValue(@Nullable String value) {
115+
for (AccessibilityUnit unit : AccessibilityUnit.values()) {
116+
if (unit.name().equalsIgnoreCase(value)) {
117+
return unit;
118+
}
119+
}
120+
throw new IllegalArgumentException("Invalid accessibility unit value: " + value);
121+
}
122+
}
93123

94124
/**
95125
* These roles are defined by Google's TalkBack screen reader, and this list should be kept up to

ReactAndroid/src/main/java/com/facebook/react/views/text/TextAttributeProps.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ public class TextAttributeProps {
104104
protected @Nullable ReactAccessibilityDelegate.AccessibilityRole mAccessibilityRole = null;
105105
protected boolean mIsAccessibilityRoleSet = false;
106106
protected boolean mIsAccessibilityUnitSet = false;
107-
protected String mAccessibilityUnit = "";
107+
protected @Nullable ReactAccessibilityDelegate.AccessibilityUnit mAccessibilityUnit = "";
108108
protected boolean mIsAccessibilityLink = false;
109109

110110
protected int mFontStyle = UNSET;
@@ -609,7 +609,8 @@ private void setTextTransform(@Nullable String textTransform) {
609609
private void setAccessibilityUnit(@Nullable String accessibilityUnit) {
610610
if (accessibilityUnit != null) {
611611
mIsAccessibilityUnitSet = true;
612-
mAccessibilityUnit = accessibilityUnit;
612+
mAccessibilityUnit =
613+
ReactAccessibilityDelegate.AccessibilityUnit.fromValue(accessibilityUnit);
613614
}
614615
}
615616

ReactAndroid/src/main/res/views/uimanager/values/ids.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
<!-- tag is used to store accessibilityRole tag-->
1616
<item type="id" name="accessibility_role"/>
17+
<item type="id" name="accessibility_unit"/>
1718

1819
<!-- tag is used to store accessibilityCollection -->
1920
<item type="id" name="accessibility_collection"/>

ReactCommon/react/renderer/attributedstring/TextAttributes.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,8 @@ void TextAttributes::apply(TextAttributes textAttributes) {
9999
? textAttributes.accessibilityRole
100100
: accessibilityRole;
101101
accessibilityUnit = textAttributes.accessibilityUnit.has_value()
102-
? "first value"
103-
: "second value";
102+
? textAttributes.accessibilityUnit
103+
: accessibilityUnit;
104104
}
105105

106106
#pragma mark - Operators

ReactCommon/react/renderer/attributedstring/TextAttributes.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ class TextAttributes : public DebugStringConvertible {
7979
// construction.
8080
std::optional<LayoutDirection> layoutDirection{};
8181
std::optional<AccessibilityRole> accessibilityRole{};
82-
std::optional<std::string> accessibilityUnit{""};
82+
std::optional<AccessibilityUnit> accessibilityUnit{};
8383

8484
#pragma mark - Operations
8585

ReactCommon/react/renderer/attributedstring/conversions.h

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include <react/renderer/core/propsConversions.h>
2323
#include <react/renderer/graphics/Geometry.h>
2424
#include <react/renderer/graphics/conversions.h>
25+
#include <sys/errno.h>
2526
#include <cmath>
2627

2728
#ifdef ANDROID
@@ -565,7 +566,21 @@ inline std::string toString(const TextDecorationStyle &textDecorationStyle) {
565566
return "solid";
566567
}
567568

569+
inline std::string toString(const AccessibilityUnit &accessibilityUnit) {
570+
LOG(ERROR) << "TESTING:: some test";
571+
switch (accessibilityUnit) {
572+
case AccessibilityUnit::None:
573+
return "none";
574+
case AccessibilityUnit::Verbatim:
575+
return "verbatim";
576+
}
577+
LOG(ERROR) << "Unsupported AccessibilityUnit value";
578+
react_native_assert(false);
579+
return "none";
580+
}
581+
568582
inline std::string toString(const AccessibilityRole &accessibilityRole) {
583+
LOG(ERROR) << "TESTING:: some test";
569584
switch (accessibilityRole) {
570585
case AccessibilityRole::None:
571586
return "none";
@@ -631,6 +646,32 @@ inline std::string toString(const AccessibilityRole &accessibilityRole) {
631646
return "none";
632647
}
633648

649+
inline void fromRawValue(
650+
const PropsParserContext &context,
651+
const RawValue &value,
652+
AccessibilityUnit &result) {
653+
react_native_assert(value.hasType<std::string>());
654+
if (value.hasType<std::string>()) {
655+
auto string = (std::string)value;
656+
if (string == "none") {
657+
result = AccessibilityUnit::None;
658+
} else if (string == "verbatim") {
659+
result = AccessibilityUnit::Verbatim;
660+
} else {
661+
LOG(ERROR) << "Unsupported AccessibilityUnit value: " << string;
662+
react_native_assert(false);
663+
// sane default for prod
664+
result = AccessibilityUnit::None;
665+
}
666+
return;
667+
}
668+
669+
LOG(ERROR) << "Unsupported AccessibilityUnit type";
670+
react_native_assert(false);
671+
// sane default for prod
672+
result = AccessibilityUnit::None;
673+
}
674+
634675
inline void fromRawValue(
635676
const PropsParserContext &context,
636677
const RawValue &value,
@@ -955,13 +996,14 @@ inline folly::dynamic toDynamic(const TextAttributes &textAttributes) {
955996
_textAttributes(
956997
"layoutDirection", toString(*textAttributes.layoutDirection));
957998
}
999+
LOG(ERROR) << "TESTING:: triggered ";
9581000
if (textAttributes.accessibilityRole.has_value()) {
9591001
_textAttributes(
9601002
"accessibilityRole", toString(*textAttributes.accessibilityRole));
9611003
}
9621004
if (textAttributes.accessibilityUnit.has_value()) {
9631005
_textAttributes(
964-
"accessibilityUnit", "random value");
1006+
"accessibilityUnit", toString(*textAttributes.accessibilityUnit));
9651007
}
9661008
return _textAttributes;
9671009
}
@@ -1184,9 +1226,10 @@ inline MapBuffer toMapBuffer(const TextAttributes &textAttributes) {
11841226
builder.putString(
11851227
TA_KEY_ACCESSIBILITY_ROLE, toString(*textAttributes.accessibilityRole));
11861228
}
1229+
LOG(ERROR) << "TESTING:: triggered ";
11871230
if (textAttributes.accessibilityUnit.has_value()) {
11881231
builder.putString(
1189-
TA_KEY_ACCESSIBILITY_UNIT, "random string value");
1232+
TA_KEY_ACCESSIBILITY_UNIT, toString(*textAttributes.accessibilityUnit));
11901233
}
11911234
return builder.build();
11921235
}

ReactCommon/react/renderer/attributedstring/primitives.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,11 @@ enum class TextDecorationLineType {
9292

9393
enum class TextDecorationStyle { Solid, Double, Dotted, Dashed };
9494

95+
enum class AccessibilityUnit {
96+
None,
97+
Verbatim,
98+
};
99+
95100
enum class AccessibilityRole {
96101
None,
97102
Button,
@@ -211,6 +216,13 @@ struct hash<facebook::react::AccessibilityRole> {
211216
}
212217
};
213218

219+
template <>
220+
struct hash<facebook::react::AccessibilityUnit> {
221+
size_t operator()(const facebook::react::AccessibilityUnit &v) const {
222+
return hash<int>()(static_cast<int>(v));
223+
}
224+
};
225+
214226
template <>
215227
struct hash<facebook::react::TextTransform> {
216228
size_t operator()(const facebook::react::TextTransform &v) const {

0 commit comments

Comments
 (0)