From 3f0e1f76d51e3647347ed431b33cb08a791601fb Mon Sep 17 00:00:00 2001 From: Sash Zats Date: Wed, 20 Sep 2023 12:41:38 -0700 Subject: [PATCH] Send and receive current debugger mode Summary: Make sure mobile client and sonar desktop app keep debugger mode in sync Desktop client listens to available modes and currently selected mode which is what we use here. Later we can tweak the logic to try to restore last mode if desktop or mobile clients crash / disconnect etc Reviewed By: lblasa Differential Revision: D49384358 fbshipit-source-id: 5bc1f4240253b68a746dfa5feba4b352f4e261a2 --- .../Events/UIDInitEvent.h | 2 ++ .../FlipperKitUIDebuggerPlugin.mm | 6 ++-- .../Model/UIDTraversalMode.h | 30 +++++++++++++++++ .../Model/UIDTraversalMode.m | 33 +++++++++++++++++++ .../Observer/UIDTreeObserverManager.h | 3 ++ .../Observer/UIDTreeObserverManager.m | 27 +++++++++++++++ .../Serializers/UIDInitEvent+Foundation.m | 7 ++++ 7 files changed, 105 insertions(+), 3 deletions(-) create mode 100644 iOS/Plugins/FlipperKitUIDebuggerPlugin/FlipperKitUIDebuggerPlugin/Model/UIDTraversalMode.h create mode 100644 iOS/Plugins/FlipperKitUIDebuggerPlugin/FlipperKitUIDebuggerPlugin/Model/UIDTraversalMode.m 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), }; }