Fix watch tab bug

Summary:
This solves the watch tab crash discussed here D15266478, which got reverted.

Bug: [Here](diffusion/FBS/browse/master/xplat/sonar/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutPlugin/FlipperKitLayoutPlugin.mm;57c596a566bec49e343af51b93df65ed1377a2b9$338), when the node is `CKComponentRootView` the `[descriptor childForNode: node atIndex: i]` returns `SKComponentLayoutWrapper`. In the next iteration of the loop, node is `SKComponentLayoutWrapper`, the  `[descriptor childForNode: node atIndex: i]` returns `CKComponentRootView`, and hence the infinite recursion

I also tested T44431259, it is not regressed.

Reviewed By: passy

Differential Revision: D15451821

fbshipit-source-id: 25f10112f5f52bb1fa964316a4c7e91a3b29156d
This commit is contained in:
Pritesh Nandgaonkar
2019-05-23 03:46:25 -07:00
committed by Facebook Github Bot
parent 2c024a4488
commit 7576e1c61d
3 changed files with 11 additions and 3 deletions

View File

@@ -86,6 +86,9 @@
- (id)childForNode:(SKComponentLayoutWrapper *)node atIndex:(NSUInteger)index { - (id)childForNode:(SKComponentLayoutWrapper *)node atIndex:(NSUInteger)index {
if (node.children.size() == 0) { if (node.children.size() == 0) {
if (node.rootNode == node.component.viewContext.view) {
return nil;
}
return node.component.viewContext.view; return node.component.viewContext.view;
} }
return node.children[index]; return node.children[index];

View File

@@ -18,7 +18,7 @@
@property (nonatomic, readonly) CGSize size; @property (nonatomic, readonly) CGSize size;
@property (nonatomic, readonly) CGPoint position; @property (nonatomic, readonly) CGPoint position;
@property (nonatomic, readonly) std::vector<SKComponentLayoutWrapper *> children; @property (nonatomic, readonly) std::vector<SKComponentLayoutWrapper *> children;
@property (nonatomic, readonly) id<CKInspectableView> rootNode;
// Null for layouts which are not direct children of a CKFlexboxComponent // Null for layouts which are not direct children of a CKFlexboxComponent
@property (nonatomic, readonly) BOOL isFlexboxChild; @property (nonatomic, readonly) BOOL isFlexboxChild;
@property (nonatomic, readonly) CKFlexboxComponentChild flexboxChild; @property (nonatomic, readonly) CKFlexboxComponentChild flexboxChild;

View File

@@ -58,7 +58,8 @@ static CKFlexboxComponentChild findFlexboxLayoutParams(CKComponent *parent, CKCo
[[SKComponentLayoutWrapper alloc] initWithLayout:layout [[SKComponentLayoutWrapper alloc] initWithLayout:layout
position:CGPointMake(0, 0) position:CGPointMake(0, 0)
parentKey:[NSString stringWithFormat: @"%p.", layout.component] parentKey:[NSString stringWithFormat: @"%p.", layout.component]
reuseWrapper:reuseWrapper]; reuseWrapper:reuseWrapper
rootNode: root];
// Cache the result. // Cache the result.
if (layout.component) { if (layout.component) {
objc_setAssociatedObject(layout.component, &kLayoutWrapperKey, wrapper, OBJC_ASSOCIATION_RETAIN_NONATOMIC); objc_setAssociatedObject(layout.component, &kLayoutWrapperKey, wrapper, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
@@ -70,8 +71,10 @@ static CKFlexboxComponentChild findFlexboxLayoutParams(CKComponent *parent, CKCo
position:(CGPoint)position position:(CGPoint)position
parentKey:(NSString *)parentKey parentKey:(NSString *)parentKey
reuseWrapper:(CKComponentReuseWrapper *)reuseWrapper reuseWrapper:(CKComponentReuseWrapper *)reuseWrapper
rootNode:(id<CKInspectableView>)node
{ {
if (self = [super init]) { if (self = [super init]) {
_rootNode = node;
_component = layout.component; _component = layout.component;
_size = layout.size; _size = layout.size;
_position = position; _position = position;
@@ -93,7 +96,9 @@ static CKFlexboxComponentChild findFlexboxLayoutParams(CKComponent *parent, CKCo
SKComponentLayoutWrapper *childWrapper = [[SKComponentLayoutWrapper alloc] initWithLayout:child.layout SKComponentLayoutWrapper *childWrapper = [[SKComponentLayoutWrapper alloc] initWithLayout:child.layout
position:child.position position:child.position
parentKey:[_identifier stringByAppendingFormat:@"[%d].", index++] parentKey:[_identifier stringByAppendingFormat:@"[%d].", index++]
reuseWrapper:reuseWrapper]; reuseWrapper:reuseWrapper
rootNode: nil
];
childWrapper->_isFlexboxChild = [_component isKindOfClass:[CKFlexboxComponent class]]; childWrapper->_isFlexboxChild = [_component isKindOfClass:[CKFlexboxComponent class]];
childWrapper->_flexboxChild = findFlexboxLayoutParams(_component, child.layout.component); childWrapper->_flexboxChild = findFlexboxLayoutParams(_component, child.layout.component);
_children.push_back(childWrapper); _children.push_back(childWrapper);