From 7576e1c61d3ecaf0ba1a679197c438d84de4f6a9 Mon Sep 17 00:00:00 2001 From: Pritesh Nandgaonkar Date: Thu, 23 May 2019 03:46:25 -0700 Subject: [PATCH] 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 --- .../SKComponentLayoutDescriptor.mm | 3 +++ .../SKComponentLayoutWrapper.h | 2 +- .../SKComponentLayoutWrapper.mm | 9 +++++++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutDescriptor.mm b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutDescriptor.mm index b39ed7be9..966528d8a 100644 --- a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutDescriptor.mm +++ b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutDescriptor.mm @@ -86,6 +86,9 @@ - (id)childForNode:(SKComponentLayoutWrapper *)node atIndex:(NSUInteger)index { if (node.children.size() == 0) { + if (node.rootNode == node.component.viewContext.view) { + return nil; + } return node.component.viewContext.view; } return node.children[index]; diff --git a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutWrapper.h b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutWrapper.h index a7d4c8da4..5f7513fe1 100644 --- a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutWrapper.h +++ b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutWrapper.h @@ -18,7 +18,7 @@ @property (nonatomic, readonly) CGSize size; @property (nonatomic, readonly) CGPoint position; @property (nonatomic, readonly) std::vector children; - +@property (nonatomic, readonly) id rootNode; // Null for layouts which are not direct children of a CKFlexboxComponent @property (nonatomic, readonly) BOOL isFlexboxChild; @property (nonatomic, readonly) CKFlexboxComponentChild flexboxChild; diff --git a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutWrapper.mm b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutWrapper.mm index b6d9999bd..4fded345c 100644 --- a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutWrapper.mm +++ b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutWrapper.mm @@ -58,7 +58,8 @@ static CKFlexboxComponentChild findFlexboxLayoutParams(CKComponent *parent, CKCo [[SKComponentLayoutWrapper alloc] initWithLayout:layout position:CGPointMake(0, 0) parentKey:[NSString stringWithFormat: @"%p.", layout.component] - reuseWrapper:reuseWrapper]; + reuseWrapper:reuseWrapper + rootNode: root]; // Cache the result. if (layout.component) { objc_setAssociatedObject(layout.component, &kLayoutWrapperKey, wrapper, OBJC_ASSOCIATION_RETAIN_NONATOMIC); @@ -70,8 +71,10 @@ static CKFlexboxComponentChild findFlexboxLayoutParams(CKComponent *parent, CKCo position:(CGPoint)position parentKey:(NSString *)parentKey reuseWrapper:(CKComponentReuseWrapper *)reuseWrapper + rootNode:(id)node { if (self = [super init]) { + _rootNode = node; _component = layout.component; _size = layout.size; _position = position; @@ -93,7 +96,9 @@ static CKFlexboxComponentChild findFlexboxLayoutParams(CKComponent *parent, CKCo SKComponentLayoutWrapper *childWrapper = [[SKComponentLayoutWrapper alloc] initWithLayout:child.layout position:child.position parentKey:[_identifier stringByAppendingFormat:@"[%d].", index++] - reuseWrapper:reuseWrapper]; + reuseWrapper:reuseWrapper + rootNode: nil + ]; childWrapper->_isFlexboxChild = [_component isKindOfClass:[CKFlexboxComponent class]]; childWrapper->_flexboxChild = findFlexboxLayoutParams(_component, child.layout.component); _children.push_back(childWrapper);