Fabric: Fixed crash in [RCTParagraphComponentView accessibilityElements]

Summary:
Now we check for `_state` being nullptr before dereferencing this.

`accessibilityElements` (as a bunch of other methods that have the same check) can be called by OS any moment (we cannot predict when), so at some very rare moments, it can be called when the view is not fully initialized yet. To prevent crashing we just need to return some default value indicating that the view is empty.

Changelog: [Internal] Fabric-specific internal change.

Reviewed By: sammy-SC

Differential Revision: D24095654

fbshipit-source-id: d8a37f269c5bf7718acb0b512e7a9313e199398e
This commit is contained in:
Valentin Shergin
2020-10-04 19:10:05 -07:00
committed by Facebook GitHub Bot
parent 03e120daa9
commit 7c83eaba80
@@ -141,16 +141,21 @@ using namespace facebook::react;
- (NSArray *)accessibilityElements
{
if (![_accessibilityProvider isUpToDate:_state->getData().attributedString]) {
if (!_state) {
return [NSArray new];
}
auto &data = _state->getData();
if (![_accessibilityProvider isUpToDate:data.attributedString]) {
RCTTextLayoutManager *textLayoutManager =
(RCTTextLayoutManager *)unwrapManagedObject(_state->getData().layoutManager->getNativeTextLayoutManager());
(RCTTextLayoutManager *)unwrapManagedObject(data.layoutManager->getNativeTextLayoutManager());
CGRect frame = RCTCGRectFromRect(_layoutMetrics.getContentFrame());
_accessibilityProvider =
[[RCTParagraphComponentAccessibilityProvider alloc] initWithString:_state->getData().attributedString
layoutManager:textLayoutManager
paragraphAttributes:_state->getData().paragraphAttributes
frame:frame
view:self];
_accessibilityProvider = [[RCTParagraphComponentAccessibilityProvider alloc] initWithString:data.attributedString
layoutManager:textLayoutManager
paragraphAttributes:data.paragraphAttributes
frame:frame
view:self];
}
self.isAccessibilityElement = NO;