diff --git a/iOS/Plugins/FlipperKitUIDebuggerPlugin/FlipperKitUIDebuggerPlugin/Events/UIDInitEvent.h b/iOS/Plugins/FlipperKitUIDebuggerPlugin/FlipperKitUIDebuggerPlugin/Events/UIDInitEvent.h index a05f78d27..a8d49908e 100644 --- a/iOS/Plugins/FlipperKitUIDebuggerPlugin/FlipperKitUIDebuggerPlugin/Events/UIDInitEvent.h +++ b/iOS/Plugins/FlipperKitUIDebuggerPlugin/FlipperKitUIDebuggerPlugin/Events/UIDInitEvent.h @@ -8,6 +8,7 @@ #if FB_SONARKIT_ENABLED #import +#import "UIDTraversalMode.h" NS_ASSUME_NONNULL_BEGIN @@ -16,6 +17,7 @@ NS_ASSUME_NONNULL_BEGIN @interface UIDInitEvent : NSObject @property(nonatomic) NSUInteger rootId; +@property(nonatomic) UIDTraversalMode currentTraversalMode; @property(nonatomic, strong) NSArray* frameworkEventMetadata; diff --git a/iOS/Plugins/FlipperKitUIDebuggerPlugin/FlipperKitUIDebuggerPlugin/FlipperKitUIDebuggerPlugin.mm b/iOS/Plugins/FlipperKitUIDebuggerPlugin/FlipperKitUIDebuggerPlugin/FlipperKitUIDebuggerPlugin.mm index db0b5e65b..a6be2241e 100644 --- a/iOS/Plugins/FlipperKitUIDebuggerPlugin/FlipperKitUIDebuggerPlugin/FlipperKitUIDebuggerPlugin.mm +++ b/iOS/Plugins/FlipperKitUIDebuggerPlugin/FlipperKitUIDebuggerPlugin/FlipperKitUIDebuggerPlugin.mm @@ -8,11 +8,10 @@ #if FB_SONARKIT_ENABLED #import "FlipperKitUIDebuggerPlugin.h" -#import - #import #import #import +#import #import "Core/UIDContext.h" @@ -20,6 +19,8 @@ #import "Observer/UIDTreeObserverFactory.h" #import "Observer/UIDTreeObserverManager.h" +#import "UIDTraversalMode.h" + @implementation FlipperKitUIDebuggerPlugin { UIDContext* _context; } @@ -49,7 +50,6 @@ } _context.connection = connection; - [[UIDTreeObserverManager shared] startWithContext:_context]; NSSet>* connectionListeners = diff --git a/iOS/Plugins/FlipperKitUIDebuggerPlugin/FlipperKitUIDebuggerPlugin/Model/UIDTraversalMode.h b/iOS/Plugins/FlipperKitUIDebuggerPlugin/FlipperKitUIDebuggerPlugin/Model/UIDTraversalMode.h new file mode 100644 index 000000000..3523a1e4c --- /dev/null +++ b/iOS/Plugins/FlipperKitUIDebuggerPlugin/FlipperKitUIDebuggerPlugin/Model/UIDTraversalMode.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * 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 + +NS_ASSUME_NONNULL_BEGIN + +typedef NS_CLOSED_ENUM(NSInteger, UIDTraversalMode) { + UIDTraversalModeViewHierarchy, + UIDTraversalModeAccessibilityHierarchy, +}; + +#ifdef __cplusplus +extern "C" { +#endif +UIDTraversalMode UIDTraversalModeFromString(NSString* string); +NSString* NSStringFromUIDTraversalMode(UIDTraversalMode mode); +#ifdef __cplusplus +} +#endif + +NS_ASSUME_NONNULL_END + +#endif diff --git a/iOS/Plugins/FlipperKitUIDebuggerPlugin/FlipperKitUIDebuggerPlugin/Model/UIDTraversalMode.m b/iOS/Plugins/FlipperKitUIDebuggerPlugin/FlipperKitUIDebuggerPlugin/Model/UIDTraversalMode.m new file mode 100644 index 000000000..be9d166c2 --- /dev/null +++ b/iOS/Plugins/FlipperKitUIDebuggerPlugin/FlipperKitUIDebuggerPlugin/Model/UIDTraversalMode.m @@ -0,0 +1,33 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * 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 "UIDTraversalMode.h" + +static NSString* kUIDTraversalModeViewHierarchyValue = @"view-hierarchy"; + +static NSString* kUIDTraversalModeAccessibilityHierarchyValue = + @"accessibility-hierarchy"; + +UIDTraversalMode UIDTraversalModeFromString(NSString* string) { + if ([string isEqualToString:kUIDTraversalModeAccessibilityHierarchyValue]) { + return UIDTraversalModeAccessibilityHierarchy; + } + return UIDTraversalModeViewHierarchy; +} + +NSString* NSStringFromUIDTraversalMode(UIDTraversalMode mode) { + switch (mode) { + case UIDTraversalModeViewHierarchy: + return kUIDTraversalModeViewHierarchyValue; + case UIDTraversalModeAccessibilityHierarchy: + return kUIDTraversalModeAccessibilityHierarchyValue; + } +} + +#endif diff --git a/iOS/Plugins/FlipperKitUIDebuggerPlugin/FlipperKitUIDebuggerPlugin/Observer/UIDTreeObserverManager.h b/iOS/Plugins/FlipperKitUIDebuggerPlugin/FlipperKitUIDebuggerPlugin/Observer/UIDTreeObserverManager.h index f4e20a7b4..ee0bbcfb4 100644 --- a/iOS/Plugins/FlipperKitUIDebuggerPlugin/FlipperKitUIDebuggerPlugin/Observer/UIDTreeObserverManager.h +++ b/iOS/Plugins/FlipperKitUIDebuggerPlugin/FlipperKitUIDebuggerPlugin/Observer/UIDTreeObserverManager.h @@ -7,6 +7,7 @@ #if FB_SONARKIT_ENABLED +#import #import NS_ASSUME_NONNULL_BEGIN @@ -17,6 +18,8 @@ NS_ASSUME_NONNULL_BEGIN + (instancetype)shared; +@property(nonatomic, assign) UIDTraversalMode traversalMode; + - (void)startWithContext:(UIDContext*)context; - (void)stop; diff --git a/iOS/Plugins/FlipperKitUIDebuggerPlugin/FlipperKitUIDebuggerPlugin/Observer/UIDTreeObserverManager.m b/iOS/Plugins/FlipperKitUIDebuggerPlugin/FlipperKitUIDebuggerPlugin/Observer/UIDTreeObserverManager.m index 1c3cd7567..f975be3a7 100644 --- a/iOS/Plugins/FlipperKitUIDebuggerPlugin/FlipperKitUIDebuggerPlugin/Observer/UIDTreeObserverManager.m +++ b/iOS/Plugins/FlipperKitUIDebuggerPlugin/FlipperKitUIDebuggerPlugin/Observer/UIDTreeObserverManager.m @@ -39,6 +39,7 @@ _queue = dispatch_queue_create("ui-debugger.background", DISPATCH_QUEUE_SERIAL); _context = nil; + _traversalMode = UIDTraversalModeViewHierarchy; } return self; } @@ -54,6 +55,19 @@ return instance; } +- (void)setTraversalMode:(UIDTraversalMode)traversalMode { + if (_traversalMode == traversalMode) { + return; + } + + // trigger another pass + dispatch_async(dispatch_get_main_queue(), ^{ + [self->_rootObserver processNode:self->_context.application + withSnapshot:YES + withContext:self->_context]; + }); +} + - (void)startWithContext:(UIDContext*)context { _context = context; _context.updateDigester = self; @@ -69,6 +83,18 @@ [_rootObserver subscribe:_context.application]; [_context.frameworkEventManager enable]; + + __weak __typeof(self) weakSelf = self; + [_context.connection + receive:@"onTraversalModeChange" + withBlock:^(NSDictionary* data, id responder) { + NSString* _Nullable maybeMode = + [data[@"mode"] isKindOfClass:NSString.class] ? data[@"mode"] : nil; + if (maybeMode == nil) { + return; + } + weakSelf.traversalMode = UIDTraversalModeFromString(maybeMode); + }]; } - (void)stop { @@ -86,6 +112,7 @@ UIDInitEvent* init = [UIDInitEvent new]; init.rootId = [descriptor identifierForNode:_context.application]; init.frameworkEventMetadata = [_context.frameworkEventManager eventsMetadata]; + init.currentTraversalMode = _traversalMode; [_context.connection send:[UIDInitEvent name] withRawParams:UID_toJSON(init)]; } diff --git a/iOS/Plugins/FlipperKitUIDebuggerPlugin/FlipperKitUIDebuggerPlugin/Serializers/UIDInitEvent+Foundation.m b/iOS/Plugins/FlipperKitUIDebuggerPlugin/FlipperKitUIDebuggerPlugin/Serializers/UIDInitEvent+Foundation.m index 01b42df4c..9b6eb5065 100644 --- a/iOS/Plugins/FlipperKitUIDebuggerPlugin/FlipperKitUIDebuggerPlugin/Serializers/UIDInitEvent+Foundation.m +++ b/iOS/Plugins/FlipperKitUIDebuggerPlugin/FlipperKitUIDebuggerPlugin/Serializers/UIDInitEvent+Foundation.m @@ -9,6 +9,7 @@ #import "NSArray+Foundation.h" #import "UIDInitEvent+Foundation.h" +#import "UIDTraversalMode.h" FB_LINKABLE(UIDInitEvent_Foundation) @implementation UIDInitEvent (Foundation) @@ -19,6 +20,12 @@ FB_LINKABLE(UIDInitEvent_Foundation) @"frameworkEventMetadata" : self.frameworkEventMetadata ? [self.frameworkEventMetadata toFoundation] : @[], + @"supportedTraversalModes" : @[ + NSStringFromUIDTraversalMode(UIDTraversalModeViewHierarchy), + NSStringFromUIDTraversalMode(UIDTraversalModeAccessibilityHierarchy), + ], + @"currentTraversalMode" : + NSStringFromUIDTraversalMode(self.currentTraversalMode), }; }