From aa979b8abd4747d1bbe7f98979fad9791b7cf4f7 Mon Sep 17 00:00:00 2001 From: Dimple Jethani Date: Thu, 1 Nov 2018 14:42:07 -0700 Subject: [PATCH] Added NTSubDescriptor files and SKSubDescriptor interface Summary: Added NTSubDescriptor file which implements the SKSubDescriptor interface to pass all NT specific data to the Layout Component Descriptor. Reviewed By: jknoxville Differential Revision: D12840392 fbshipit-source-id: bff295e13e8531456428424b7e073aefe7e1ced4 --- iOS/FlipperKit.podspec | 4 +- .../FlipperKitLayoutComponentKitSupport.h | 4 ++ .../FlipperKitLayoutComponentKitSupport.mm | 13 +++++ .../SKComponentLayoutDescriptor.h | 4 ++ .../SKComponentLayoutDescriptor.mm | 57 +++++++------------ .../SKSubDescriptor.h | 29 ++++++++++ .../SKSubDescriptor.mm | 27 +++++++++ 7 files changed, 100 insertions(+), 38 deletions(-) create mode 100644 iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKSubDescriptor.h create mode 100644 iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKSubDescriptor.mm diff --git a/iOS/FlipperKit.podspec b/iOS/FlipperKit.podspec index 94bb42881..886900c0f 100644 --- a/iOS/FlipperKit.podspec +++ b/iOS/FlipperKit.podspec @@ -69,6 +69,7 @@ Pod::Spec.new do |spec| 'iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutPlugin/SKInvalidation.h', 'iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutPlugin/SKDescriptorMapper.h', 'iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/FlipperKitLayoutComponentKitSupport.h', + 'iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKSubDescriptor.h', 'iOS/FBDefines/FBMacros.h', 'iOS/FlipperKit/**/{FlipperDiagnosticsViewController,FlipperStateUpdateListener,FlipperClient,FlipperPlugin,FlipperConnection,FlipperResponder,SKMacros}.h' header_search_paths = "\"$(PODS_ROOT)/FlipperKit/iOS/FlipperKit\" \"$(PODS_ROOT)\"/Headers/Private/FlipperKit/** \"$(PODS_ROOT)/boost-for-react-native\" \"$(PODS_ROOT)/DoubleConversion\" \"$(PODS_ROOT)/PeerTalkSonar\"" @@ -108,7 +109,8 @@ Pod::Spec.new do |spec| ss.dependency 'FlipperKit/FlipperKitLayoutPlugin' ss.compiler_flags = folly_compiler_flags ss.dependency 'FlipperKit/FlipperKitLayoutPlugin' - ss.public_header_files = 'iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/FlipperKitLayoutComponentKitSupport.h' + ss.public_header_files = 'iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/FlipperKitLayoutComponentKitSupport.h', + 'iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKSubDescriptor.h' ss.source_files = "iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/**/*.{h,cpp,m,mm}" ss.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)\"/Headers/Private/FlipperKit/**" } end diff --git a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/FlipperKitLayoutComponentKitSupport.h b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/FlipperKitLayoutComponentKitSupport.h index b4f3c92ed..546d952af 100644 --- a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/FlipperKitLayoutComponentKitSupport.h +++ b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/FlipperKitLayoutComponentKitSupport.h @@ -7,10 +7,14 @@ */ #import +#import "SKSubDescriptor.h" #import @interface FlipperKitLayoutComponentKitSupport : NSObject + (void)setUpWithDescriptorMapper:(SKDescriptorMapper *)mapper; ++ (void)setUpWithDescriptorMapper:(SKDescriptorMapper *)mapper + subDescriptors:(NSArray*)subDescriptors; + @end diff --git a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/FlipperKitLayoutComponentKitSupport.mm b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/FlipperKitLayoutComponentKitSupport.mm index f7194dc73..b4f4d8e97 100644 --- a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/FlipperKitLayoutComponentKitSupport.mm +++ b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/FlipperKitLayoutComponentKitSupport.mm @@ -18,9 +18,22 @@ #import "SKComponentRootViewDescriptor.h" #import "SKComponentLayoutDescriptor.h" #import "SKComponentLayoutWrapper.h" +#import "SKSubDescriptor.h" @implementation FlipperKitLayoutComponentKitSupport ++ (void)setUpWithDescriptorMapper:(SKDescriptorMapper *)mapper + subDescriptors:(NSArray*)subDescriptors{ + [mapper registerDescriptor: [[SKComponentHostingViewDescriptor alloc] initWithDescriptorMapper: mapper] + forClass: [CKComponentHostingView class]]; + [mapper registerDescriptor: [[SKComponentRootViewDescriptor alloc] initWithDescriptorMapper: mapper] + forClass: [CKComponentRootView class]]; + SKComponentLayoutDescriptor *layoutDescriptor = [[SKComponentLayoutDescriptor alloc] initWithDescriptorMapper:mapper]; + [layoutDescriptor addSubDescriptors:subDescriptors]; + [mapper registerDescriptor: layoutDescriptor + forClass: [SKComponentLayoutWrapper class]]; +} + + (void)setUpWithDescriptorMapper:(SKDescriptorMapper *)mapper { // What we really want here is "forProtocol:@protocol(CKInspectableView)" but no such luck. [mapper registerDescriptor: [[SKComponentHostingViewDescriptor alloc] initWithDescriptorMapper: mapper] diff --git a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutDescriptor.h b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutDescriptor.h index a6ec89f25..3ff7b904c 100644 --- a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutDescriptor.h +++ b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutDescriptor.h @@ -7,8 +7,12 @@ */ #import +#import "SKSubDescriptor.h" + @class SKComponentLayoutWrapper; @interface SKComponentLayoutDescriptor: SKNodeDescriptor +- (void)addSubDescriptors:(NSArray*)subDescriptors; + @end diff --git a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutDescriptor.mm b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutDescriptor.mm index 87c9d5ed7..3ba00f246 100644 --- a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutDescriptor.mm +++ b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutDescriptor.mm @@ -23,7 +23,9 @@ #import #import +#import "SKSubDescriptor.h" #import "SKComponentLayoutWrapper.h" +#import "NTSubDescriptor.h" #import "CKComponent+Sonar.h" #import "Utils.h" @@ -31,11 +33,16 @@ { NSDictionary *CKFlexboxAlignSelfEnumMap; NSDictionary *CKFlexboxPositionTypeEnumMap; + NSArray*_registeredSubdescriptors; } - (void)setUp { [super setUp]; - + + if (!_registeredSubdescriptors) { + _registeredSubdescriptors = [NSArray new]; + } + static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ [self initEnumMaps]; @@ -87,54 +94,30 @@ - (NSArray *> *> *)dataForNode:(SKComponentLayoutWrapper *)node { NSMutableArray *> *> *data = [NSMutableArray new]; - + if (node.isFlexboxChild) { [data addObject: [SKNamed newWithName:@"Layout" withValue:[self propsForFlexboxChild:node.flexboxChild]]]; } - + NSMutableDictionary *extraData = [[NSMutableDictionary alloc] init]; + + for (SKSubDescriptor *s in _registeredSubdescriptors) { + [extraData setObject:[s getDataForNode:node] forKey:[s getName]]; + } + if (extraData.count > 0) { + [data addObject: [SKNamed newWithName:@"Extra Sections" withValue:extraData]]; + } + [data addObjectsFromArray:[node.component sonar_getData]]; - return data; } -#if !defined(FLIPPER_OSS) -- (NSDictionary *) getNTMetaDataForChild:(CKFlexboxComponentChild)child - qualifier:(NSString *) qualifier -{ - NSString *str = @"{\"stackTrace\":{\"Content\":\":nt:flexbox :nt:text :nt:flexbox\"},\"unminifiedData\":{\"Content\":\"text\"}, \"graphQLCalls\":{\"Content\":\"text\"}}"; - NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding]; - id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; - if ([qualifier isEqualToString:@"Stack Trace"]) { - NSDictionary *trace = [json objectForKey:@"stackTrace"]; - NSString *traceString = [[trace objectForKey:@"Content"] stringByReplacingOccurrencesOfString:@" " withString:@""]; - NSArray *listItems = [traceString componentsSeparatedByString:@":nt:"]; - NSMutableArray *xhpComponents = [NSMutableArray array];; - for (NSString *s in listItems) { - if (![s isEqualToString:@""]) { - NSString *xhpString = [NSString stringWithFormat:@"%@%@%@", @""]; - [xhpComponents addObject:xhpString]; - } - } - return @{@"Content": [xhpComponents componentsJoinedByString:@" "]}; - } else if ([qualifier isEqualToString:@"Unminified Payload"]) { - return [json objectForKey:@"unminifiedData"]; - } else if ([qualifier isEqualToString:@"GraphQL Calls"]) { - return [json objectForKey:@"graphQLCalls"]; - } - return @{}; +- (void)addSubDescriptors:(nonnull NSArray*)subDescriptors{ + _registeredSubdescriptors = subDescriptors; } -#endif - (NSDictionary *)propsForFlexboxChild:(CKFlexboxComponentChild)child { return @{ @"spacingBefore": SKObject(@(child.spacingBefore)), -#if !defined(FLIPPER_OSS) - @"Native Templates": @{ - @"Stack Trace": [self getNTMetaDataForChild:child qualifier:@"Stack Trace"], - @"Unminified Payload":[self getNTMetaDataForChild:child qualifier:@"Unminified Payload"], - @"GraphQL Calls":[self getNTMetaDataForChild:child qualifier:@"GraphQL Calls"], - }, -#endif @"spacingAfter": SKObject(@(child.spacingAfter)), @"flexGrow": SKObject(@(child.flexGrow)), @"flexShrink": SKObject(@(child.flexShrink)), diff --git a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKSubDescriptor.h b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKSubDescriptor.h new file mode 100644 index 000000000..21d49d7e2 --- /dev/null +++ b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKSubDescriptor.h @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2018-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the LICENSE + * file in the root directory of this source tree. + * + */ +#import + +@class SKComponentLayoutWrapper; + +/** + A SKSubDescriptor is an object which knows how to expose an Object of type T + to the SKLayoutDescriptor. This class is for frameworks wanting to pass data along + through the Layout Descriptor. + */ +@interface SKSubDescriptor : NSObject + +/** + This is the SubDescriptor name. + */ +- (NSString *) getName; + +/** + This is the data the SubDescriptor wants to pass up to the SKLayoutDescriptor. + */ +- (NSDictionary *)getDataForNode:(SKComponentLayoutWrapper *)node; + +@end diff --git a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKSubDescriptor.mm b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKSubDescriptor.mm new file mode 100644 index 000000000..21346a133 --- /dev/null +++ b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKSubDescriptor.mm @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2018-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the LICENSE + * file in the root directory of this source tree. + * + */ +#if FB_SONARKIT_ENABLED + +#import "SKSubDescriptor.h" +#import "SKComponentLayoutWrapper.h" + +@implementation SKSubDescriptor +{ +} + +- (NSDictionary *)getDataForNode:(SKComponentLayoutWrapper *)node { + return @{}; +} + +- (NSString *)getName { + return @""; +} + +@end + +#endif