OSS
Summary: Move UIDebugger plugin to OSS space. Reviewed By: passy Differential Revision: D47634848 fbshipit-source-id: 90e8c0181a2434d0e5d76bdb99b902051e6d702e
This commit is contained in:
committed by
Facebook GitHub Bot
parent
af5b9532ec
commit
db7aa9eeaf
@@ -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 <Foundation/Foundation.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@class UIDFrameworkEventMetadata;
|
||||
@class UIDFrameworkEvent;
|
||||
|
||||
@protocol UIDFrameworkEventManager<NSObject>
|
||||
|
||||
- (void)registerEventMetadata:(UIDFrameworkEventMetadata*)eventMetadata;
|
||||
- (void)emitEvent:(UIDFrameworkEvent*)event;
|
||||
- (NSArray<UIDFrameworkEventMetadata*>*)eventsMetadata;
|
||||
- (NSArray<UIDFrameworkEvent*>*)events;
|
||||
- (void)enable;
|
||||
- (void)disable;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,21 @@
|
||||
/*
|
||||
* 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 <Foundation/Foundation.h>
|
||||
#import "UIDFrameworkEventManager.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface UIDSerialFrameworkEventManager : NSObject<UIDFrameworkEventManager>
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,75 @@
|
||||
/*
|
||||
* 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 "UIDSerialFrameworkEventManager.h"
|
||||
|
||||
@interface UIDSerialFrameworkEventManager () {
|
||||
dispatch_queue_t _queue;
|
||||
NSMutableArray<UIDFrameworkEventMetadata*>* _eventMetadata;
|
||||
NSMutableArray<UIDFrameworkEvent*>* _events;
|
||||
BOOL _enabled;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation UIDSerialFrameworkEventManager
|
||||
|
||||
- (instancetype)init {
|
||||
if (self = [super init]) {
|
||||
_enabled = false;
|
||||
_eventMetadata = [NSMutableArray new];
|
||||
_events = [NSMutableArray new];
|
||||
_queue = dispatch_queue_create(
|
||||
"ui-debugger.framework-events", DISPATCH_QUEUE_SERIAL);
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)emitEvent:(nonnull UIDFrameworkEvent*)event {
|
||||
dispatch_async(_queue, ^{
|
||||
if (self->_enabled) {
|
||||
[self->_events addObject:event];
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
- (void)registerEventMetadata:
|
||||
(nonnull UIDFrameworkEventMetadata*)eventMetadata {
|
||||
[_eventMetadata addObject:eventMetadata];
|
||||
}
|
||||
|
||||
- (NSArray<UIDFrameworkEventMetadata*>*)eventsMetadata {
|
||||
return [_eventMetadata copy];
|
||||
}
|
||||
|
||||
- (NSArray<UIDFrameworkEvent*>*)events {
|
||||
__block NSArray* events = nil;
|
||||
dispatch_sync(_queue, ^{
|
||||
events = [_events copy];
|
||||
[_events removeAllObjects];
|
||||
});
|
||||
return events ?: @[];
|
||||
}
|
||||
|
||||
- (void)enable {
|
||||
dispatch_async(_queue, ^{
|
||||
self->_enabled = true;
|
||||
});
|
||||
}
|
||||
|
||||
- (void)disable {
|
||||
dispatch_async(_queue, ^{
|
||||
self->_enabled = false;
|
||||
[self->_events removeAllObjects];
|
||||
});
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* 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 <FlipperKit/FlipperConnection.h>
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "UIDFrameworkEventManager.h"
|
||||
#import "UIDUpdateDigester.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@class UIDDescriptorRegister;
|
||||
@class UIDTreeObserverFactory;
|
||||
@class UIDFrameworkEvent;
|
||||
@class UIDFrameworkEventMetadata;
|
||||
|
||||
@interface UIDContext : NSObject
|
||||
|
||||
@property(nonatomic, nullable) UIApplication* application;
|
||||
@property(nonatomic, nullable) id<FlipperConnection> connection;
|
||||
@property(nonatomic, readonly) UIDDescriptorRegister* descriptorRegister;
|
||||
@property(nonatomic, readonly) UIDTreeObserverFactory* observerFactory;
|
||||
@property(nonatomic, nullable) id<UIDUpdateDigester> updateDigester;
|
||||
@property(nonatomic, strong, readonly) id<UIDFrameworkEventManager>
|
||||
frameworkEventManager;
|
||||
|
||||
- (instancetype)initWithApplication:(UIApplication*)application
|
||||
descriptorRegister:(UIDDescriptorRegister*)descriptorRegister
|
||||
observerFactory:(UIDTreeObserverFactory*)observerFactory;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -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 "UIDContext.h"
|
||||
#import "UIDDescriptorRegister.h"
|
||||
#import "UIDSerialFrameworkEventManager.h"
|
||||
#import "UIDTreeObserverFactory.h"
|
||||
|
||||
@implementation UIDContext
|
||||
|
||||
- (instancetype)initWithApplication:(UIApplication*)application
|
||||
descriptorRegister:(UIDDescriptorRegister*)descriptorRegister
|
||||
observerFactory:(UIDTreeObserverFactory*)observerFactory {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
_application = application;
|
||||
_descriptorRegister = descriptorRegister;
|
||||
_observerFactory = observerFactory;
|
||||
_connection = nil;
|
||||
_frameworkEventManager = [UIDSerialFrameworkEventManager new];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* 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 <UIKit/UIKit.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@protocol UIDUpdate
|
||||
@end
|
||||
|
||||
@interface UIDSubtreeUpdate : NSObject<UIDUpdate>
|
||||
|
||||
@property(nonatomic) NSString* observerType;
|
||||
@property(nonatomic) NSUInteger rootId;
|
||||
@property(nonatomic) NSArray* nodes;
|
||||
@property(nonatomic) NSTimeInterval timestamp;
|
||||
@property(nonatomic) long traversalMS;
|
||||
@property(nonatomic) long snapshotMS;
|
||||
@property(nonatomic) UIImage* snapshot;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,15 @@
|
||||
/*
|
||||
* 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 "UIDUpdate.h"
|
||||
|
||||
@implementation UIDSubtreeUpdate
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
* 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 <Foundation/Foundation.h>
|
||||
#import "UIDUpdate.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@protocol UIDUpdateDigester
|
||||
|
||||
- (void)digest:(id<UIDUpdate>)update;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
* 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 <Foundation/Foundation.h>
|
||||
#import "UIDNodeDescriptor.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/**
|
||||
A chained descriptor is a special type of descriptor that models the
|
||||
inheritance hierarchy in native UI frameworks. With this setup you can define
|
||||
a descriptor for each class in the inheritance chain and given that we record
|
||||
the super class's descriptor we can automatically aggregate the results for
|
||||
each descriptor in the inheritance hierarchy in a chain.
|
||||
|
||||
The result is that each descriptor in the inheritance chain only exports the
|
||||
attributes that it knows about but we still get all the attributes from the
|
||||
parent classes.
|
||||
*/
|
||||
@interface UIDChainedDescriptor<__covariant T> : UIDNodeDescriptor<T>
|
||||
|
||||
@property(strong, nonatomic) UIDChainedDescriptor* parent;
|
||||
|
||||
/** The children this node exposes in the inspector. */
|
||||
- (NSArray<id<NSObject>>*)aggregateChildrenOfNode:(T)node;
|
||||
|
||||
/**
|
||||
Get the attributes to show for this node in the sidebar of the inspector. The
|
||||
object will be shown in order and with a header matching the given name.
|
||||
*/
|
||||
- (void)aggregateAttributes:(UIDMutableAttributes*)attributes forNode:(id)node;
|
||||
|
||||
/**
|
||||
These are shown inline in the tree view on the desktop, will likely be removed
|
||||
in the future.
|
||||
*/
|
||||
- (void)aggregateInlineAttributes:(UIDMutableInlineAttributes*)attributes
|
||||
forNode:(id)node;
|
||||
|
||||
- (NSSet<NSString*>*)aggregateTagsForNode:(id)node;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,87 @@
|
||||
/*
|
||||
* 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 "UIDChainedDescriptor.h"
|
||||
#import "UIDInspectable.h"
|
||||
|
||||
@implementation UIDChainedDescriptor
|
||||
|
||||
- (NSSet<NSString*>*)tagsForNode:(id)node {
|
||||
NSSet* tags = [self aggregateTagsForNode:node] ?: [_parent tagsForNode:node];
|
||||
return tags ?: [NSSet set];
|
||||
}
|
||||
|
||||
- (NSSet<NSString*>*)aggregateTagsForNode:(id)node {
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (UIDBounds*)boundsForNode:(id)node {
|
||||
return [_parent boundsForNode:node];
|
||||
}
|
||||
|
||||
- (id<NSObject>)activeChildForNode:(id)node {
|
||||
return [_parent activeChildForNode:node];
|
||||
}
|
||||
|
||||
- (UIImage*)snapshotForNode:(id)node {
|
||||
return [_parent snapshotForNode:node];
|
||||
}
|
||||
|
||||
- (NSArray<id<NSObject>>*)childrenOfNode:(id)node {
|
||||
NSArray<id<NSObject>>* children = [self aggregateChildrenOfNode:node];
|
||||
if (!children) {
|
||||
children = [_parent childrenOfNode:node];
|
||||
}
|
||||
|
||||
return children != NULL ? children : [NSArray array];
|
||||
}
|
||||
|
||||
- (NSArray<id<NSObject>>*)aggregateChildrenOfNode:(id)node {
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (UIDAttributes*)attributesForNode:(id)node {
|
||||
UIDMutableAttributes* attributes = [NSMutableDictionary new];
|
||||
[self aggregateAttributes:attributes forNode:node];
|
||||
|
||||
UIDChainedDescriptor* currentDescriptor = _parent;
|
||||
while (currentDescriptor) {
|
||||
[currentDescriptor aggregateAttributes:attributes forNode:node];
|
||||
currentDescriptor = currentDescriptor.parent;
|
||||
}
|
||||
|
||||
return attributes;
|
||||
}
|
||||
|
||||
- (void)aggregateAttributes:(UIDMutableAttributes*)attributes forNode:(id)node {
|
||||
}
|
||||
|
||||
- (UIDInlineAttributes*)inlineAttributesForNode:(id)node {
|
||||
UIDMutableInlineAttributes* attributes = [NSMutableDictionary new];
|
||||
|
||||
[attributes addEntriesFromDictionary:[super inlineAttributesForNode:node]];
|
||||
|
||||
[self aggregateInlineAttributes:attributes forNode:node];
|
||||
|
||||
UIDChainedDescriptor* currentDescriptor = _parent;
|
||||
while (currentDescriptor) {
|
||||
[currentDescriptor aggregateInlineAttributes:attributes forNode:node];
|
||||
currentDescriptor = currentDescriptor.parent;
|
||||
}
|
||||
|
||||
return attributes;
|
||||
}
|
||||
|
||||
- (void)aggregateInlineAttributes:(UIDMutableInlineAttributes*)attributes
|
||||
forNode:(id)node {
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,69 @@
|
||||
/*
|
||||
* 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 <UIKit/UIKit.h>
|
||||
#import "UIDBounds.h"
|
||||
#import "UIDInspectable.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@protocol UIDDescriptor<NSObject>
|
||||
|
||||
/**
|
||||
A globally unique ID used to identify a node in the hierarchy.
|
||||
*/
|
||||
- (NSUInteger)UID_identifier;
|
||||
|
||||
/**
|
||||
The name used to identify this node in the inspector. Does not need to be
|
||||
unique. A good default is to use the class name of the node.
|
||||
*/
|
||||
- (NSString*)UID_name;
|
||||
|
||||
/**
|
||||
Get the attributes to show for this node in the sidebar of the inspector. The
|
||||
object will be shown in order and with a header matching the given name.
|
||||
*/
|
||||
- (void)UID_aggregateAttributes:(UIDMutableAttributes*)attributes;
|
||||
|
||||
@optional
|
||||
|
||||
/**
|
||||
These are shown inline in the tree view on the desktop, will likely be removed
|
||||
in the future.
|
||||
*/
|
||||
- (UIDInlineAttributes*)UID_inlineAttributes;
|
||||
|
||||
/** The children this node exposes in the inspector. */
|
||||
- (NSArray<id<NSObject>>*)UID_children;
|
||||
|
||||
/** Should be w.r.t the direct parent */
|
||||
- (UIDBounds*)UID_bounds;
|
||||
|
||||
/**
|
||||
If the type has the concept of overlapping children, then this indicates
|
||||
which child is active / on top, we will only listen to / traverse this child.
|
||||
If return null we assume all children are 'active'.
|
||||
*/
|
||||
- (id<NSObject>)UID_activeChild;
|
||||
|
||||
/** Get a snapshot of the node. */
|
||||
- (UIImage*)UID_snapshot;
|
||||
|
||||
/**
|
||||
Set of tags to describe this node in an abstract way for the UI. Unfortunately
|
||||
this can't be an enum as we have to plugin 3rd party frameworks dynamically.
|
||||
*/
|
||||
- (NSSet<NSString*>*)UID_tags;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* 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 <Foundation/Foundation.h>
|
||||
#import "UIDNodeDescriptor.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface UIDDescriptorRegister : NSObject
|
||||
|
||||
+ (instancetype)defaultRegister;
|
||||
|
||||
- (void)registerDescriptor:(UIDNodeDescriptor*)descriptor forClass:(Class)clazz;
|
||||
- (UIDNodeDescriptor*)descriptorForClass:(Class)clazz;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,103 @@
|
||||
/*
|
||||
* 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 "UIDDescriptorRegister.h"
|
||||
#import <objc/runtime.h>
|
||||
#import "UIDChainedDescriptor.h"
|
||||
#import "UIDUIApplicationDescriptor.h"
|
||||
#import "UIDUILabelDescriptor.h"
|
||||
#import "UIDUINavigationControllerDescriptor.h"
|
||||
#import "UIDUITabBarControllerDescriptor.h"
|
||||
#import "UIDUIViewControllerDescriptor.h"
|
||||
#import "UIDUIViewDescriptor.h"
|
||||
#import "UIDUIWindowDescriptor.h"
|
||||
|
||||
@interface UIDDescriptorRegister ()
|
||||
|
||||
- (void)prepareChain;
|
||||
|
||||
@end
|
||||
|
||||
@implementation UIDDescriptorRegister {
|
||||
NSMutableDictionary<NSString*, UIDNodeDescriptor*>* _register;
|
||||
}
|
||||
|
||||
- (instancetype)init {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
_register = [NSMutableDictionary new];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (instancetype)defaultRegister {
|
||||
static UIDDescriptorRegister* defaultRegister = nil;
|
||||
|
||||
static dispatch_once_t onceToken;
|
||||
dispatch_once(&onceToken, ^{
|
||||
defaultRegister = [UIDDescriptorRegister new];
|
||||
|
||||
[defaultRegister registerDescriptor:[UIDUIApplicationDescriptor new]
|
||||
forClass:[UIApplication class]];
|
||||
[defaultRegister registerDescriptor:[UIDUIWindowDescriptor new]
|
||||
forClass:[UIWindow class]];
|
||||
[defaultRegister registerDescriptor:[UIDUIViewControllerDescriptor new]
|
||||
forClass:[UIViewController class]];
|
||||
[defaultRegister registerDescriptor:[UIDUIViewDescriptor new]
|
||||
forClass:[UIView class]];
|
||||
[defaultRegister registerDescriptor:[UIDUILabelDescriptor new]
|
||||
forClass:[UILabel class]];
|
||||
});
|
||||
|
||||
return defaultRegister;
|
||||
}
|
||||
|
||||
- (void)registerDescriptor:(UIDNodeDescriptor*)descriptor
|
||||
forClass:(Class)clazz {
|
||||
NSString* key = NSStringFromClass(clazz);
|
||||
_register[key] = descriptor;
|
||||
|
||||
[self prepareChain];
|
||||
}
|
||||
|
||||
- (UIDNodeDescriptor*)descriptorForClass:(Class)clazz {
|
||||
UIDNodeDescriptor* classDescriptor = nil;
|
||||
|
||||
while (classDescriptor == nil && clazz != nil) {
|
||||
classDescriptor = [_register objectForKey:NSStringFromClass(clazz)];
|
||||
clazz = [clazz superclass];
|
||||
}
|
||||
|
||||
return classDescriptor;
|
||||
}
|
||||
|
||||
- (void)prepareChain {
|
||||
NSEnumerator* enumerator = [_register keyEnumerator];
|
||||
NSString* key;
|
||||
|
||||
while ((key = [enumerator nextObject])) {
|
||||
UIDNodeDescriptor* descriptor = [_register objectForKey:key];
|
||||
if ([descriptor isKindOfClass:[UIDChainedDescriptor class]]) {
|
||||
UIDChainedDescriptor* chainedDescriptor =
|
||||
(UIDChainedDescriptor*)descriptor;
|
||||
|
||||
Class clazz = NSClassFromString(key);
|
||||
Class superclass = [clazz superclass];
|
||||
|
||||
UIDNodeDescriptor* superDescriptor = [self descriptorForClass:superclass];
|
||||
if ([superDescriptor isKindOfClass:[UIDChainedDescriptor class]]) {
|
||||
chainedDescriptor.parent = (UIDChainedDescriptor*)superDescriptor;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* 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 <Foundation/Foundation.h>
|
||||
#import "UIDMetadata.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
FOUNDATION_EXPORT NSString* const UIDEBUGGER_METADATA_TYPE_IDENTIFIER;
|
||||
FOUNDATION_EXPORT NSString* const UIDEBUGGER_METADATA_TYPE_ATTRIBUTE;
|
||||
FOUNDATION_EXPORT NSString* const UIDEBUGGER_METADATA_TYPE_LAYOUT;
|
||||
FOUNDATION_EXPORT NSString* const UIDEBUGGER_METADATA_TYPE_DOCUMENTATION;
|
||||
|
||||
@interface UIDMetadataRegister : NSObject
|
||||
|
||||
+ (instancetype)shared;
|
||||
|
||||
- (UIDMetadataId)registerMetadataWithType:(NSString*)type name:(NSString*)name;
|
||||
|
||||
- (UIDMetadataId)registerMetadataWithType:(NSString*)type
|
||||
name:(NSString*)name
|
||||
isMutable:(bool)isMutable
|
||||
definedBy:(UIDMetadataId)definedById;
|
||||
|
||||
- (NSDictionary<UIDMetadataId, UIDMetadata*>*)extractPendingMetadata;
|
||||
|
||||
- (UIDMetadataId)findMetadataDefinedBy:(UIDMetadataId)definedById
|
||||
name:(NSString*)name;
|
||||
- (UIDMetadataId)findRootMetadataWithName:(NSString*)name;
|
||||
|
||||
- (void)reset;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,126 @@
|
||||
/*
|
||||
* 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 "UIDMetadataRegister.h"
|
||||
|
||||
NSString* const UIDEBUGGER_METADATA_TYPE_IDENTIFIER = @"identity";
|
||||
NSString* const UIDEBUGGER_METADATA_TYPE_ATTRIBUTE = @"attribute";
|
||||
NSString* const UIDEBUGGER_METADATA_TYPE_LAYOUT = @"layout";
|
||||
NSString* const UIDEBUGGER_METADATA_TYPE_DOCUMENTATION = @"documentation";
|
||||
|
||||
typedef NSMutableDictionary<NSString*, UIDMetadata*>* UIDNamedMetadata;
|
||||
@interface UIDMetadataRegister () {
|
||||
NSMutableDictionary<UIDMetadataId, UIDNamedMetadata>* _register;
|
||||
NSMutableArray<UIDMetadata*>* _pending;
|
||||
uint32_t _generator;
|
||||
|
||||
UIDMetadataId _rootId;
|
||||
NSLock* _lock;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation UIDMetadataRegister
|
||||
|
||||
- (instancetype)init {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
_lock = [NSLock new];
|
||||
_register = [NSMutableDictionary new];
|
||||
_pending = [NSMutableArray new];
|
||||
|
||||
_rootId = @0;
|
||||
_generator = 0;
|
||||
|
||||
[_register setObject:[NSMutableDictionary new] forKey:_rootId];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (instancetype)shared {
|
||||
static UIDMetadataRegister* instance = nil;
|
||||
|
||||
static dispatch_once_t onceToken;
|
||||
dispatch_once(&onceToken, ^{
|
||||
instance = [UIDMetadataRegister new];
|
||||
});
|
||||
|
||||
return instance;
|
||||
}
|
||||
|
||||
- (UIDMetadataId)registerMetadataWithType:(NSString*)type name:(NSString*)name {
|
||||
return [self registerMetadataWithType:type
|
||||
name:name
|
||||
isMutable:false
|
||||
definedBy:_rootId];
|
||||
}
|
||||
|
||||
- (UIDMetadataId)registerMetadataWithType:(NSString*)type
|
||||
name:(NSString*)name
|
||||
isMutable:(bool)isMutable
|
||||
definedBy:(UIDMetadataId)parent {
|
||||
UIDMetadataId identifier = @(++_generator);
|
||||
UIDMetadata* metadata = [[UIDMetadata alloc] initWithIdentifier:identifier
|
||||
type:type
|
||||
name:name
|
||||
isMutable:isMutable
|
||||
parent:parent];
|
||||
|
||||
[_lock lock];
|
||||
if (![_register objectForKey:parent]) {
|
||||
[_register setObject:[NSMutableDictionary new] forKey:parent];
|
||||
}
|
||||
[[_register objectForKey:parent] setObject:metadata forKey:name];
|
||||
|
||||
[_pending addObject:metadata];
|
||||
[_lock unlock];
|
||||
|
||||
return identifier;
|
||||
}
|
||||
|
||||
- (UIDMetadataId)findRootMetadataWithName:(NSString*)name {
|
||||
return [self findMetadataDefinedBy:_rootId name:name];
|
||||
}
|
||||
|
||||
- (UIDMetadataId)findMetadataDefinedBy:(UIDMetadataId)parentId
|
||||
name:(NSString*)name {
|
||||
[_lock lock];
|
||||
UIDMetadata* metadata = [[_register objectForKey:parentId] objectForKey:name];
|
||||
[_lock unlock];
|
||||
if (metadata) {
|
||||
return metadata.identifier;
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (NSDictionary<UIDMetadataId, UIDMetadata*>*)extractPendingMetadata {
|
||||
NSMutableDictionary* pendingMetadata = [NSMutableDictionary new];
|
||||
[_lock lock];
|
||||
for (UIDMetadata* metadata in _pending) {
|
||||
[pendingMetadata setObject:metadata forKey:metadata.identifier];
|
||||
}
|
||||
[_pending removeAllObjects];
|
||||
[_lock unlock];
|
||||
return pendingMetadata;
|
||||
}
|
||||
|
||||
- (void)reset {
|
||||
[_lock lock];
|
||||
[_pending removeAllObjects];
|
||||
for (id key in _register) {
|
||||
UIDNamedMetadata value = [_register objectForKey:key];
|
||||
[_pending addObjectsFromArray:value.allValues];
|
||||
}
|
||||
[_lock unlock];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
* 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 <UIKit/UIKit.h>
|
||||
#import "UIDBounds.h"
|
||||
#import "UIDInspectable.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface UIDNodeDescriptor<__covariant T> : NSObject
|
||||
|
||||
/**
|
||||
A globally unique ID used to identify a node in the hierarchy.
|
||||
*/
|
||||
- (NSUInteger)identifierForNode:(T)node;
|
||||
|
||||
/**
|
||||
The name used to identify this node in the inspector. Does not need to be
|
||||
unique. A good default is to use the class name of the node.
|
||||
*/
|
||||
- (NSString*)nameForNode:(T)node;
|
||||
|
||||
/**
|
||||
Get the attributes to show for this node in the sidebar of the inspector. The
|
||||
object will be shown in order and with a header matching the given name.
|
||||
*/
|
||||
- (UIDAttributes*)attributesForNode:(T)node;
|
||||
|
||||
/**
|
||||
These are shown inline in the tree view on the desktop, will likely be removed
|
||||
in the future.
|
||||
*/
|
||||
- (UIDInlineAttributes*)inlineAttributesForNode:(T)node;
|
||||
|
||||
/**
|
||||
These contain additional contextual data (currently: Bloks node metadata).
|
||||
*/
|
||||
- (UIDGenericAttributes*)hiddenAttributesForNode:(T)node;
|
||||
|
||||
/** The children this node exposes in the inspector. */
|
||||
- (NSArray<id<NSObject>>*)childrenOfNode:(T)node;
|
||||
|
||||
/** Should be w.r.t the direct parent */
|
||||
- (UIDBounds*)boundsForNode:(T)node;
|
||||
|
||||
/**
|
||||
If the type has the concept of overlapping children, then this indicates
|
||||
which child is active / on top, we will only listen to / traverse this child.
|
||||
If return null we assume all children are 'active'.
|
||||
*/
|
||||
- (id<NSObject>)activeChildForNode:(T)node;
|
||||
|
||||
/** Get a snapshot of the node. */
|
||||
- (UIImage*)snapshotForNode:(T)node;
|
||||
|
||||
/**
|
||||
Set of tags to describe this node in an abstract way for the UI. Unfortunately
|
||||
this can't be an enum as we have to plugin 3rd party frameworks dynamically.
|
||||
*/
|
||||
- (NSSet<NSString*>*)tagsForNode:(T)node;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
* 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 "UIDNodeDescriptor.h"
|
||||
|
||||
@implementation UIDNodeDescriptor
|
||||
|
||||
- (NSUInteger)identifierForNode:(id)node {
|
||||
return [node hash];
|
||||
}
|
||||
|
||||
- (NSString*)nameForNode:(id)node {
|
||||
return NSStringFromClass([node class]);
|
||||
}
|
||||
|
||||
- (UIDInlineAttributes*)inlineAttributesForNode:(id)node {
|
||||
return @{@"address" : [NSString stringWithFormat:@"%p", node]};
|
||||
}
|
||||
|
||||
- (UIDGenericAttributes*)hiddenAttributesForNode:(id)node {
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (UIDAttributes*)attributesForNode:(id)node {
|
||||
return [NSDictionary dictionary];
|
||||
}
|
||||
|
||||
- (NSArray<id<NSObject>>*)childrenOfNode:(id)node {
|
||||
return [NSArray array];
|
||||
}
|
||||
|
||||
- (NSSet<NSString*>*)tagsForNode:(id)node {
|
||||
return [NSSet set];
|
||||
}
|
||||
|
||||
- (UIDBounds*)boundsForNode:(id)node {
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (id<NSObject>)activeChildForNode:(id)node {
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (UIImage*)snapshotForNode:(id)node {
|
||||
return nil;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,21 @@
|
||||
/*
|
||||
* 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 <UIKit/UIKit.h>
|
||||
#import "UIDNodeDescriptor.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface UIDUIApplicationDescriptor : UIDNodeDescriptor<UIApplication*>
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* 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 "UIDUIApplicationDescriptor.h"
|
||||
#import <objc/runtime.h>
|
||||
#import <string>
|
||||
#import <unordered_set>
|
||||
#import "UIDBounds.h"
|
||||
#import "UIDSnapshot.h"
|
||||
|
||||
@implementation UIDUIApplicationDescriptor
|
||||
|
||||
- (NSArray<id<NSObject>>*)childrenOfNode:(UIApplication*)node {
|
||||
static std::unordered_set<std::string> ignoredWindows(
|
||||
{"FBStatusBarTrackingWindow",
|
||||
"FBAccessibilityOverlayWindow",
|
||||
"UITextEffectsWindow"});
|
||||
|
||||
NSMutableArray<UIWindow*>* children = [NSMutableArray new];
|
||||
for (UIWindow* window in node.windows) {
|
||||
if (ignoredWindows.find(class_getName(window.class)) !=
|
||||
ignoredWindows.end()) {
|
||||
continue;
|
||||
}
|
||||
[children addObject:window];
|
||||
}
|
||||
return children;
|
||||
}
|
||||
|
||||
- (id<NSObject>)activeChildForNode:(UIApplication*)node {
|
||||
return node.keyWindow;
|
||||
}
|
||||
|
||||
- (UIDBounds*)boundsForNode:(UIApplication*)node {
|
||||
return [UIDBounds fromRect:[UIScreen mainScreen].bounds];
|
||||
}
|
||||
|
||||
- (UIImage*)snapshotForNode:(UIApplication*)node {
|
||||
return UIDApplicationSnapshot(node, [self childrenOfNode:node]);
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,21 @@
|
||||
/*
|
||||
* 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 <UIKit/UIKit.h>
|
||||
#import "UIDChainedDescriptor.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface UIDUILabelDescriptor : UIDChainedDescriptor<UILabel*>
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,248 @@
|
||||
/*
|
||||
* 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 "UIDUILabelDescriptor.h"
|
||||
#import "UIDInspectable.h"
|
||||
#import "UIDMetadata.h"
|
||||
#import "UIDMetadataRegister.h"
|
||||
|
||||
@interface UIDUILabelDescriptor () {
|
||||
UIDMetadataId UILabelAttributeId;
|
||||
UIDMetadataId TextAttributeId;
|
||||
UIDMetadataId AttributedTextAttributeId;
|
||||
UIDMetadataId FontAttributeId;
|
||||
UIDMetadataId TextColorAttributeId;
|
||||
UIDMetadataId TextAlignmentAttributeId;
|
||||
UIDMetadataId LineBreakModeAttributeId;
|
||||
UIDMetadataId LineBreakStrategyAttributeId;
|
||||
UIDMetadataId EnabledAttributeId;
|
||||
UIDMetadataId ShowExpansionTextAttributeId;
|
||||
UIDMetadataId AdjustsFontSizeToFitWidthAttributeId;
|
||||
UIDMetadataId AllowsDefaultTightneningForTruncationAttributeId;
|
||||
UIDMetadataId BaselineAdjustmentAttributeId;
|
||||
UIDMetadataId MinScaleFactorAttributeId;
|
||||
UIDMetadataId NumberOfLinesAttributeId;
|
||||
UIDMetadataId HighlightedTextColorAttributeId;
|
||||
UIDMetadataId HighlightedAttributeId;
|
||||
UIDMetadataId ShadowColorAttributeId;
|
||||
UIDMetadataId ShadowOffsetAttributeId;
|
||||
|
||||
NSDictionary* NSTextAlignmentEnum;
|
||||
NSDictionary* NSLineBreakModeEnum;
|
||||
NSDictionary* NSLineBreakStrategyEnum;
|
||||
NSDictionary* UIBaselineAdjustmentEnum;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation UIDUILabelDescriptor
|
||||
|
||||
- (instancetype)init {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
NSTextAlignmentEnum = @{
|
||||
@(NSTextAlignmentLeft) : @"LEFT",
|
||||
@(NSTextAlignmentRight) : @"RIGHT",
|
||||
@(NSTextAlignmentCenter) : @"CENTER",
|
||||
@(NSTextAlignmentJustified) : @"JUSTIFIED",
|
||||
@(NSTextAlignmentNatural) : @"NATURAL",
|
||||
};
|
||||
NSLineBreakModeEnum = @{
|
||||
@(NSLineBreakByWordWrapping) : @"WORD WRAPPING",
|
||||
@(NSLineBreakByCharWrapping) : @"CHAR WRAPPING",
|
||||
@(NSLineBreakByClipping) : @"CLIPPING",
|
||||
@(NSLineBreakByTruncatingHead) : @"TRUNCATING HEAD",
|
||||
@(NSLineBreakByTruncatingTail) : @"TRUNCATING TAIL",
|
||||
@(NSLineBreakByTruncatingMiddle) : @"TRUNCATING MIDDLE",
|
||||
};
|
||||
if (@available(iOS 14.0, *)) {
|
||||
NSLineBreakStrategyEnum = @{
|
||||
@(NSLineBreakStrategyNone) : @"NONE",
|
||||
@(NSLineBreakStrategyPushOut) : @"PUSH OUT",
|
||||
@(NSLineBreakStrategyHangulWordPriority) : @"HANGUL WORD PRIORITY",
|
||||
@(NSLineBreakStrategyStandard) : @"STANDARD",
|
||||
};
|
||||
} else {
|
||||
NSLineBreakStrategyEnum = @{
|
||||
@(NSLineBreakStrategyNone) : @"NONE",
|
||||
@(NSLineBreakStrategyPushOut) : @"PUSH OUT",
|
||||
};
|
||||
}
|
||||
UIBaselineAdjustmentEnum = @{
|
||||
@(UIBaselineAdjustmentAlignBaselines) : @"ALIGN BASELINES",
|
||||
@(UIBaselineAdjustmentAlignCenters) : @"ALIGN CENTERS",
|
||||
@(UIBaselineAdjustmentNone) : @"NONE",
|
||||
};
|
||||
|
||||
UILabelAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"UILabel"];
|
||||
TextAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"text"
|
||||
isMutable:false
|
||||
definedBy:UILabelAttributeId];
|
||||
AttributedTextAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"attributedText"
|
||||
isMutable:false
|
||||
definedBy:UILabelAttributeId];
|
||||
FontAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"font"
|
||||
isMutable:false
|
||||
definedBy:UILabelAttributeId];
|
||||
TextColorAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"textColor"
|
||||
isMutable:false
|
||||
definedBy:UILabelAttributeId];
|
||||
TextAlignmentAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"textAlignment"
|
||||
isMutable:false
|
||||
definedBy:UILabelAttributeId];
|
||||
LineBreakModeAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"lineBreakMode"
|
||||
isMutable:false
|
||||
definedBy:UILabelAttributeId];
|
||||
LineBreakStrategyAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"lineBreakStrategy"
|
||||
isMutable:false
|
||||
definedBy:UILabelAttributeId];
|
||||
EnabledAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"enabled"
|
||||
isMutable:false
|
||||
definedBy:UILabelAttributeId];
|
||||
if (@available(iOS 15.0, macCatalyst 15.0, *)) {
|
||||
ShowExpansionTextAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"showsExpansionTextWhenTruncated"
|
||||
isMutable:false
|
||||
definedBy:UILabelAttributeId];
|
||||
}
|
||||
AdjustsFontSizeToFitWidthAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"adjustsFontSizeToFitWidth"
|
||||
isMutable:false
|
||||
definedBy:UILabelAttributeId];
|
||||
AllowsDefaultTightneningForTruncationAttributeId =
|
||||
[[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"allowsDefaultTighteningForTruncation"
|
||||
isMutable:false
|
||||
definedBy:UILabelAttributeId];
|
||||
BaselineAdjustmentAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"baselineAdjustment"
|
||||
isMutable:false
|
||||
definedBy:UILabelAttributeId];
|
||||
MinScaleFactorAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"minimumScaleFactor"
|
||||
isMutable:false
|
||||
definedBy:UILabelAttributeId];
|
||||
NumberOfLinesAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"numberOfLines"
|
||||
isMutable:false
|
||||
definedBy:UILabelAttributeId];
|
||||
HighlightedTextColorAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"highlightedTextColor"
|
||||
isMutable:false
|
||||
definedBy:UILabelAttributeId];
|
||||
HighlightedAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"highligted"
|
||||
isMutable:false
|
||||
definedBy:UILabelAttributeId];
|
||||
ShadowColorAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"shadowColor"
|
||||
isMutable:false
|
||||
definedBy:UILabelAttributeId];
|
||||
ShadowOffsetAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"shadowOffset"
|
||||
isMutable:false
|
||||
definedBy:UILabelAttributeId];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)aggregateAttributes:(UIDMutableAttributes*)attributes
|
||||
forNode:(UILabel*)node {
|
||||
NSMutableDictionary* labelAttributes = [NSMutableDictionary new];
|
||||
|
||||
[labelAttributes setObject:[UIDInspectableText fromText:node.text]
|
||||
forKey:TextAttributeId];
|
||||
[labelAttributes
|
||||
setObject:[UIDInspectableText fromText:[node.attributedText string]]
|
||||
forKey:AttributedTextAttributeId];
|
||||
[labelAttributes setObject:[UIDInspectableText fromText:node.font.fontName]
|
||||
forKey:FontAttributeId];
|
||||
[labelAttributes setObject:[UIDInspectableColor fromColor:node.textColor]
|
||||
forKey:TextColorAttributeId];
|
||||
[labelAttributes
|
||||
setObject:[UIDInspectableEnum
|
||||
from:NSTextAlignmentEnum[@(node.textAlignment)]]
|
||||
forKey:TextAlignmentAttributeId];
|
||||
[labelAttributes
|
||||
setObject:[UIDInspectableEnum
|
||||
from:NSLineBreakModeEnum[@(node.lineBreakMode)]]
|
||||
forKey:LineBreakModeAttributeId];
|
||||
[labelAttributes setObject:[UIDInspectableBoolean fromBoolean:node.enabled]
|
||||
forKey:EnabledAttributeId];
|
||||
if (@available(iOS 15.0, macCatalyst 15.0, *)) {
|
||||
[labelAttributes
|
||||
setObject:[UIDInspectableBoolean
|
||||
fromBoolean:node.showsExpansionTextWhenTruncated]
|
||||
forKey:ShowExpansionTextAttributeId];
|
||||
}
|
||||
|
||||
[labelAttributes setObject:[UIDInspectableBoolean
|
||||
fromBoolean:node.adjustsFontSizeToFitWidth]
|
||||
forKey:AdjustsFontSizeToFitWidthAttributeId];
|
||||
[labelAttributes
|
||||
setObject:[UIDInspectableBoolean
|
||||
fromBoolean:node.allowsDefaultTighteningForTruncation]
|
||||
forKey:AllowsDefaultTightneningForTruncationAttributeId];
|
||||
[labelAttributes
|
||||
setObject:[UIDInspectableEnum
|
||||
from:UIBaselineAdjustmentEnum[@(node.baselineAdjustment)]]
|
||||
forKey:BaselineAdjustmentAttributeId];
|
||||
[labelAttributes
|
||||
setObject:[UIDInspectableNumber fromCGFloat:node.minimumScaleFactor]
|
||||
forKey:MinScaleFactorAttributeId];
|
||||
[labelAttributes
|
||||
setObject:[UIDInspectableNumber
|
||||
fromNumber:[NSNumber numberWithInt:node.numberOfLines]]
|
||||
forKey:NumberOfLinesAttributeId];
|
||||
[labelAttributes
|
||||
setObject:[UIDInspectableColor fromColor:node.highlightedTextColor]
|
||||
forKey:HighlightedTextColorAttributeId];
|
||||
[labelAttributes
|
||||
setObject:[UIDInspectableBoolean fromBoolean:node.highlighted]
|
||||
forKey:HighlightedAttributeId];
|
||||
[labelAttributes setObject:[UIDInspectableColor fromColor:node.shadowColor]
|
||||
forKey:ShadowColorAttributeId];
|
||||
[labelAttributes setObject:[UIDInspectableSize fromSize:node.shadowOffset]
|
||||
forKey:ShadowOffsetAttributeId];
|
||||
|
||||
[attributes setObject:[UIDInspectableObject fromFields:labelAttributes]
|
||||
forKey:UILabelAttributeId];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* 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 <UIKit/UIKit.h>
|
||||
#import "UIDNodeDescriptor.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/**
|
||||
UINavigationController
|
||||
(https://developer.apple.com/documentation/uikit/uinavigationcontroller?language=objc)
|
||||
Propeties:
|
||||
- viewControllers: the view controllers currently on the navigation stack.
|
||||
- topViewController: last controller pushed on top of the navigation
|
||||
stack.
|
||||
- visibleViewController: the view controller associated with the
|
||||
currently visible view in the navigation stack. View Controller can also be
|
||||
presented instead of pushed. If presented, then it hasn't changed the stack
|
||||
even though its view is visible.
|
||||
*/
|
||||
@interface UIDUINavigationControllerDescriptor
|
||||
: UIDNodeDescriptor<UINavigationController*>
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
* 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 "UIDUINavigationControllerDescriptor.h"
|
||||
|
||||
@implementation UIDUINavigationControllerDescriptor
|
||||
|
||||
- (NSArray<id<NSObject>>*)childrenOfNode:(UINavigationController*)node {
|
||||
return node.viewControllers;
|
||||
}
|
||||
|
||||
- (id<NSObject>)activeChildForNode:(UINavigationController*)node {
|
||||
return node.visibleViewController;
|
||||
}
|
||||
|
||||
- (UIDBounds*)boundsForNode:(UINavigationController*)node {
|
||||
return [UIDBounds fromRect:node.view.bounds];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* 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 <UIKit/UIKit.h>
|
||||
#import "UIDNodeDescriptor.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/**
|
||||
UITabBarController
|
||||
(https://developer.apple.com/documentation/uikit/uitabbarcontroller?language=objc)
|
||||
Properties:
|
||||
- viewControllers: root view controllers displayed by the tab bar user
|
||||
interface.
|
||||
- selectedViewController: the view controller associated with the
|
||||
currently selected tab bar item.
|
||||
*/
|
||||
@interface UIDUITabBarControllerDescriptor
|
||||
: UIDNodeDescriptor<UITabBarController*>
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
* 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 "UIDUITabBarControllerDescriptor.h"
|
||||
|
||||
@implementation UIDUITabBarControllerDescriptor
|
||||
|
||||
- (NSArray<id<NSObject>>*)childrenOfNode:(UITabBarController*)node {
|
||||
return node.viewControllers;
|
||||
}
|
||||
|
||||
- (id<NSObject>)activeChildForNode:(UITabBarController*)node {
|
||||
return node.selectedViewController;
|
||||
}
|
||||
|
||||
- (UIDBounds*)boundsForNode:(UITabBarController*)node {
|
||||
return [UIDBounds fromRect:node.view.bounds];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,21 @@
|
||||
/*
|
||||
* 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 <UIKit/UIKit.h>
|
||||
#import "UIDNodeDescriptor.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface UIDUIViewControllerDescriptor : UIDNodeDescriptor<UIViewController*>
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -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 "UIDUIViewControllerDescriptor.h"
|
||||
|
||||
@implementation UIDUIViewControllerDescriptor
|
||||
|
||||
- (NSArray<id<NSObject>>*)childrenOfNode:(UIViewController*)node {
|
||||
if (node.view != nil) {
|
||||
return [NSArray arrayWithObject:node.view];
|
||||
}
|
||||
|
||||
return [NSArray array];
|
||||
}
|
||||
|
||||
- (UIDBounds*)boundsForNode:(UIViewController*)node {
|
||||
CGRect bounds = CGRectMake(
|
||||
0, 0, node.view.bounds.size.width, node.view.bounds.size.height);
|
||||
return [UIDBounds fromRect:bounds];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,21 @@
|
||||
/*
|
||||
* 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 <UIKit/UIKit.h>
|
||||
#import "UIDChainedDescriptor.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface UIDUIViewDescriptor : UIDChainedDescriptor<UIView*>
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* 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 "UIDUIViewDescriptor.h"
|
||||
#import "UIView+UIDDescriptor.h"
|
||||
|
||||
@implementation UIDUIViewDescriptor
|
||||
|
||||
- (void)aggregateAttributes:(UIDMutableAttributes*)attributes
|
||||
forNode:(UIView*)node {
|
||||
[node UID_aggregateAttributes:attributes];
|
||||
}
|
||||
|
||||
- (NSArray<id<NSObject>>*)childrenOfNode:(UIView*)node {
|
||||
return [node UID_children];
|
||||
}
|
||||
|
||||
- (UIImage*)snapshotForNode:(UIView*)node {
|
||||
return [node UID_snapshot];
|
||||
}
|
||||
|
||||
- (UIDBounds*)boundsForNode:(UIView*)node {
|
||||
return [node UID_bounds];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,21 @@
|
||||
/*
|
||||
* 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 <UIKit/UIKit.h>
|
||||
#import "UIDChainedDescriptor.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface UIDUIWindowDescriptor : UIDChainedDescriptor<UIWindow*>
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
* 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 "UIDUIWindowDescriptor.h"
|
||||
#import "UIView+UIDDescriptor.h"
|
||||
|
||||
@implementation UIDUIWindowDescriptor
|
||||
|
||||
- (id<NSObject>)activeChildForNode:(UIWindow*)node {
|
||||
return [node UID_activeChild];
|
||||
}
|
||||
|
||||
- (UIDBounds*)boundsForNode:(UIWindow*)node {
|
||||
return [UIDBounds fromRect:node.bounds];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
* 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 <FlipperKit/SKMacros.h>
|
||||
#import <FlipperKitUIDebuggerPlugin/UIDDescriptor.h>
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
FB_LINK_REQUIRE_CATEGORY(UIView_UIDDescriptor)
|
||||
@interface UIView (UIDDescriptor)<UIDDescriptor>
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,606 @@
|
||||
/*
|
||||
* 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 "UIDInspectable.h"
|
||||
#import "UIDMetadata.h"
|
||||
#import "UIDMetadataRegister.h"
|
||||
#import "UIDSnapshot.h"
|
||||
#import "UIView+UIDDescriptor.h"
|
||||
|
||||
FB_LINKABLE(UIView_UIDDescriptor)
|
||||
@implementation UIView (UIDDescriptor)
|
||||
|
||||
- (NSUInteger)UID_identifier {
|
||||
return [self hash];
|
||||
}
|
||||
|
||||
- (nonnull NSString*)UID_name {
|
||||
return NSStringFromClass([self class]);
|
||||
}
|
||||
|
||||
- (void)UID_aggregateAttributes:(nonnull UIDMutableAttributes*)attributes {
|
||||
static UIDMetadataId UIViewAttributeId;
|
||||
static UIDMetadataId FrameAttributeId;
|
||||
static UIDMetadataId BoundsAttributeId;
|
||||
static UIDMetadataId CenterAttributeId;
|
||||
static UIDMetadataId AnchorPointAttributeId;
|
||||
static UIDMetadataId SafeAreaInsetsAttributeId;
|
||||
static UIDMetadataId ClipsToBoundsAttributeId;
|
||||
static UIDMetadataId HiddenAttributeId;
|
||||
static UIDMetadataId AlphaAttributeId;
|
||||
static UIDMetadataId OpaqueAttributeId;
|
||||
static UIDMetadataId ClearContextBeforeDrawingAttributeId;
|
||||
static UIDMetadataId BackgroundColorAttributeId;
|
||||
static UIDMetadataId TintColorAttributeId;
|
||||
static UIDMetadataId TagAttributeId;
|
||||
|
||||
static UIDMetadataId CALayerAttributeId;
|
||||
static UIDMetadataId CALayerShadowColorAttributeId;
|
||||
static UIDMetadataId CALayerShadowOpacityAttributeId;
|
||||
static UIDMetadataId CALayerShadowRadiusAttributeId;
|
||||
static UIDMetadataId CALayerShadowOffsetAttributeId;
|
||||
static UIDMetadataId CALayerBackgroundColorAttributeId;
|
||||
static UIDMetadataId CALayerBorderColorAttributeId;
|
||||
static UIDMetadataId CALayerBorderWidthAttributeId;
|
||||
static UIDMetadataId CALayerCornerRadiusAttributeId;
|
||||
static UIDMetadataId CALayerMasksToBoundsAttributeId;
|
||||
|
||||
static UIDMetadataId AccessibilityAttributeId;
|
||||
static UIDMetadataId IsAccessibilityElementAttributeId;
|
||||
static UIDMetadataId AccessibilityLabelAttributeId;
|
||||
static UIDMetadataId AccessibilityIdentifierAttributeId;
|
||||
static UIDMetadataId AccessibilityValueAttributeId;
|
||||
static UIDMetadataId AccessibilityHintAttributeId;
|
||||
static UIDMetadataId AccessibilityTraitsAttributeId;
|
||||
static UIDMetadataId AccessibilityViewIsModalAttributeId;
|
||||
static UIDMetadataId ShouldGroupAccessibilityChildrenAttributeId;
|
||||
|
||||
static UIDMetadataId AccessibilityTraitNoneAttributeId;
|
||||
static UIDMetadataId AccessibilityTraitButtonAttributeId;
|
||||
static UIDMetadataId AccessibilityTraitLinkAttributeId;
|
||||
static UIDMetadataId AccessibilityTraitImageAttributeId;
|
||||
static UIDMetadataId AccessibilityTraitSearchFieldAttributeId;
|
||||
static UIDMetadataId AccessibilityTraitKeyboardKeyAttributeId;
|
||||
static UIDMetadataId AccessibilityTraitStaticTextAttributeId;
|
||||
static UIDMetadataId AccessibilityTraitHeaderAttributeId;
|
||||
static UIDMetadataId AccessibilityTraitTabBarAttributeId;
|
||||
static UIDMetadataId AccessibilityTraitSummaryElementAttributeId;
|
||||
static UIDMetadataId AccessibilityTraitSelectedAttributeId;
|
||||
static UIDMetadataId AccessibilityTraitNotEnabledAttributeId;
|
||||
static UIDMetadataId AccessibilityTraitAdjustableAttributeId;
|
||||
static UIDMetadataId AccessibilityTraitAllowsDirectInteractionAttributeId;
|
||||
static UIDMetadataId AccessibilityTraitUpdatesFrequentlyAttributeId;
|
||||
static UIDMetadataId AccessibilityTraitCausesPageTurnAttributeId;
|
||||
static UIDMetadataId AccessibilityTraitPlaysSoundAttributeId;
|
||||
static UIDMetadataId AccessibilityTraitStartsMediaSessionAttributeId;
|
||||
|
||||
static dispatch_once_t onceToken;
|
||||
dispatch_once(&onceToken, ^{
|
||||
UIViewAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"UIView"];
|
||||
FrameAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_LAYOUT
|
||||
name:@"frame"
|
||||
isMutable:false
|
||||
definedBy:UIViewAttributeId];
|
||||
BoundsAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_LAYOUT
|
||||
name:@"bounds"
|
||||
isMutable:false
|
||||
definedBy:UIViewAttributeId];
|
||||
CenterAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_LAYOUT
|
||||
name:@"center"
|
||||
isMutable:false
|
||||
definedBy:UIViewAttributeId];
|
||||
AnchorPointAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_LAYOUT
|
||||
name:@"anchorPoint"
|
||||
isMutable:false
|
||||
definedBy:UIViewAttributeId];
|
||||
SafeAreaInsetsAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_LAYOUT
|
||||
name:@"safeAreaInset"
|
||||
isMutable:false
|
||||
definedBy:UIViewAttributeId];
|
||||
ClipsToBoundsAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_LAYOUT
|
||||
name:@"clipsToBounds"
|
||||
isMutable:false
|
||||
definedBy:UIViewAttributeId];
|
||||
HiddenAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"hidden"
|
||||
isMutable:false
|
||||
definedBy:UIViewAttributeId];
|
||||
AlphaAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"alpha"
|
||||
isMutable:false
|
||||
definedBy:UIViewAttributeId];
|
||||
OpaqueAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"opaque"
|
||||
isMutable:false
|
||||
definedBy:UIViewAttributeId];
|
||||
ClearContextBeforeDrawingAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"clearContextBeforeDrawing"
|
||||
isMutable:false
|
||||
definedBy:UIViewAttributeId];
|
||||
BackgroundColorAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"backgroundColor"
|
||||
isMutable:false
|
||||
definedBy:UIViewAttributeId];
|
||||
TintColorAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"tintColor"
|
||||
isMutable:false
|
||||
definedBy:UIViewAttributeId];
|
||||
|
||||
TagAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"tag"
|
||||
isMutable:false
|
||||
definedBy:UIViewAttributeId];
|
||||
|
||||
CALayerAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"CALayer"];
|
||||
|
||||
CALayerShadowColorAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"shadowColor"
|
||||
isMutable:false
|
||||
definedBy:CALayerAttributeId];
|
||||
CALayerShadowOpacityAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"shadowOpacity"
|
||||
isMutable:false
|
||||
definedBy:CALayerAttributeId];
|
||||
CALayerShadowRadiusAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"shadowRadius"
|
||||
isMutable:false
|
||||
definedBy:CALayerAttributeId];
|
||||
CALayerShadowOffsetAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"shadowOffset"
|
||||
isMutable:false
|
||||
definedBy:CALayerAttributeId];
|
||||
CALayerBackgroundColorAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"shadowBackgroundColor"
|
||||
isMutable:false
|
||||
definedBy:CALayerAttributeId];
|
||||
CALayerBorderColorAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"borderColor"
|
||||
isMutable:false
|
||||
definedBy:CALayerAttributeId];
|
||||
CALayerBorderWidthAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"borderWidth"
|
||||
isMutable:false
|
||||
definedBy:CALayerAttributeId];
|
||||
CALayerCornerRadiusAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"cornerRadius"
|
||||
isMutable:false
|
||||
definedBy:CALayerAttributeId];
|
||||
CALayerMasksToBoundsAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"masksToBounds"
|
||||
isMutable:false
|
||||
definedBy:CALayerAttributeId];
|
||||
|
||||
AccessibilityAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"Accessibility"];
|
||||
|
||||
IsAccessibilityElementAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"isAccessibilityElement"
|
||||
isMutable:false
|
||||
definedBy:AccessibilityAttributeId];
|
||||
AccessibilityLabelAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"accessibilityLabel"
|
||||
isMutable:false
|
||||
definedBy:AccessibilityAttributeId];
|
||||
AccessibilityIdentifierAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"accessibilityIdentifier"
|
||||
isMutable:false
|
||||
definedBy:AccessibilityAttributeId];
|
||||
AccessibilityValueAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"accessibilityValue"
|
||||
isMutable:false
|
||||
definedBy:AccessibilityAttributeId];
|
||||
AccessibilityHintAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"accessibilityHint"
|
||||
isMutable:false
|
||||
definedBy:AccessibilityAttributeId];
|
||||
AccessibilityTraitsAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"accessibilityTraits"
|
||||
isMutable:false
|
||||
definedBy:AccessibilityAttributeId];
|
||||
AccessibilityViewIsModalAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"accessibilityViewIsModal"
|
||||
isMutable:false
|
||||
definedBy:AccessibilityAttributeId];
|
||||
ShouldGroupAccessibilityChildrenAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"shouldGroupAccessibilityChildren"
|
||||
isMutable:false
|
||||
definedBy:AccessibilityAttributeId];
|
||||
|
||||
AccessibilityTraitNoneAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"none"
|
||||
isMutable:false
|
||||
definedBy:AccessibilityTraitsAttributeId];
|
||||
AccessibilityTraitButtonAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"button"
|
||||
isMutable:false
|
||||
definedBy:AccessibilityTraitsAttributeId];
|
||||
AccessibilityTraitLinkAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"link"
|
||||
isMutable:false
|
||||
definedBy:AccessibilityTraitsAttributeId];
|
||||
AccessibilityTraitImageAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"image"
|
||||
isMutable:false
|
||||
definedBy:AccessibilityTraitsAttributeId];
|
||||
AccessibilityTraitSearchFieldAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"searchField"
|
||||
isMutable:false
|
||||
definedBy:AccessibilityTraitsAttributeId];
|
||||
AccessibilityTraitKeyboardKeyAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"keyboardKey"
|
||||
isMutable:false
|
||||
definedBy:AccessibilityTraitsAttributeId];
|
||||
AccessibilityTraitStaticTextAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"staticText"
|
||||
isMutable:false
|
||||
definedBy:AccessibilityTraitsAttributeId];
|
||||
AccessibilityTraitHeaderAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"header"
|
||||
isMutable:false
|
||||
definedBy:AccessibilityTraitsAttributeId];
|
||||
AccessibilityTraitTabBarAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"tabBar"
|
||||
isMutable:false
|
||||
definedBy:AccessibilityTraitsAttributeId];
|
||||
AccessibilityTraitSummaryElementAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"summaryElement"
|
||||
isMutable:false
|
||||
definedBy:AccessibilityTraitsAttributeId];
|
||||
AccessibilityTraitSelectedAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"selected"
|
||||
isMutable:false
|
||||
definedBy:AccessibilityTraitsAttributeId];
|
||||
AccessibilityTraitNotEnabledAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"notEnabled"
|
||||
isMutable:false
|
||||
definedBy:AccessibilityTraitsAttributeId];
|
||||
AccessibilityTraitAdjustableAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"adjustable"
|
||||
isMutable:false
|
||||
definedBy:AccessibilityTraitsAttributeId];
|
||||
AccessibilityTraitAllowsDirectInteractionAttributeId =
|
||||
[[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"directInteraction"
|
||||
isMutable:false
|
||||
definedBy:AccessibilityTraitsAttributeId];
|
||||
AccessibilityTraitUpdatesFrequentlyAttributeId =
|
||||
[[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"updatedFrequently"
|
||||
isMutable:false
|
||||
definedBy:AccessibilityTraitsAttributeId];
|
||||
AccessibilityTraitCausesPageTurnAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"causesPageTurn"
|
||||
isMutable:false
|
||||
definedBy:AccessibilityTraitsAttributeId];
|
||||
AccessibilityTraitPlaysSoundAttributeId = [[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"playsSound"
|
||||
isMutable:false
|
||||
definedBy:AccessibilityTraitsAttributeId];
|
||||
AccessibilityTraitStartsMediaSessionAttributeId =
|
||||
[[UIDMetadataRegister shared]
|
||||
registerMetadataWithType:UIDEBUGGER_METADATA_TYPE_ATTRIBUTE
|
||||
name:@"startsMediaSession"
|
||||
isMutable:false
|
||||
definedBy:AccessibilityTraitsAttributeId];
|
||||
});
|
||||
|
||||
NSMutableDictionary* viewAttributes = [NSMutableDictionary new];
|
||||
|
||||
[viewAttributes setObject:[UIDInspectableBounds fromRect:self.frame]
|
||||
forKey:FrameAttributeId];
|
||||
[viewAttributes setObject:[UIDInspectableBounds fromRect:self.bounds]
|
||||
forKey:BoundsAttributeId];
|
||||
[viewAttributes setObject:[UIDInspectableCoordinate fromPoint:self.center]
|
||||
forKey:CenterAttributeId];
|
||||
if (@available(iOS 16.0, *)) {
|
||||
[viewAttributes
|
||||
setObject:[UIDInspectableCoordinate fromPoint:self.anchorPoint]
|
||||
forKey:AnchorPointAttributeId];
|
||||
}
|
||||
[viewAttributes
|
||||
setObject:[UIDInspectableEdgeInsets fromUIEdgeInsets:self.safeAreaInsets]
|
||||
forKey:SafeAreaInsetsAttributeId];
|
||||
[viewAttributes
|
||||
setObject:[UIDInspectableBoolean fromBoolean:self.clipsToBounds]
|
||||
forKey:ClipsToBoundsAttributeId];
|
||||
[viewAttributes setObject:[UIDInspectableBoolean fromBoolean:self.isHidden]
|
||||
forKey:HiddenAttributeId];
|
||||
[viewAttributes setObject:[UIDInspectableNumber fromCGFloat:self.alpha]
|
||||
forKey:AlphaAttributeId];
|
||||
[viewAttributes setObject:[UIDInspectableBoolean fromBoolean:self.opaque]
|
||||
forKey:OpaqueAttributeId];
|
||||
[viewAttributes setObject:[UIDInspectableBoolean
|
||||
fromBoolean:self.clearsContextBeforeDrawing]
|
||||
forKey:ClearContextBeforeDrawingAttributeId];
|
||||
[viewAttributes setObject:[UIDInspectableColor fromColor:self.backgroundColor]
|
||||
forKey:BackgroundColorAttributeId];
|
||||
[viewAttributes setObject:[UIDInspectableColor fromColor:self.tintColor]
|
||||
forKey:TintColorAttributeId];
|
||||
[viewAttributes setObject:[UIDInspectableNumber fromNumber:@(self.tag)]
|
||||
forKey:TagAttributeId];
|
||||
|
||||
[attributes setObject:[UIDInspectableObject fromFields:viewAttributes]
|
||||
forKey:UIViewAttributeId];
|
||||
|
||||
NSMutableDictionary* layerAttributes = [NSMutableDictionary new];
|
||||
|
||||
[layerAttributes
|
||||
setObject:[UIDInspectableColor
|
||||
fromColor:[UIColor colorWithCGColor:self.layer.shadowColor]]
|
||||
forKey:CALayerShadowColorAttributeId];
|
||||
[layerAttributes
|
||||
setObject:[UIDInspectableNumber fromCGFloat:self.layer.shadowOpacity]
|
||||
forKey:CALayerShadowOpacityAttributeId];
|
||||
[layerAttributes
|
||||
setObject:[UIDInspectableNumber fromCGFloat:self.layer.shadowRadius]
|
||||
forKey:CALayerShadowRadiusAttributeId];
|
||||
[layerAttributes
|
||||
setObject:[UIDInspectableSize fromSize:self.layer.shadowOffset]
|
||||
forKey:CALayerShadowOffsetAttributeId];
|
||||
[layerAttributes
|
||||
setObject:[UIDInspectableColor
|
||||
fromColor:[UIColor
|
||||
colorWithCGColor:self.layer.backgroundColor]]
|
||||
forKey:CALayerBackgroundColorAttributeId];
|
||||
[layerAttributes
|
||||
setObject:[UIDInspectableColor
|
||||
fromColor:[UIColor colorWithCGColor:self.layer.borderColor]]
|
||||
forKey:CALayerBorderColorAttributeId];
|
||||
[layerAttributes
|
||||
setObject:[UIDInspectableNumber fromCGFloat:self.layer.borderWidth]
|
||||
forKey:CALayerBorderWidthAttributeId];
|
||||
[layerAttributes
|
||||
setObject:[UIDInspectableNumber fromCGFloat:self.layer.cornerRadius]
|
||||
forKey:CALayerCornerRadiusAttributeId];
|
||||
[layerAttributes
|
||||
setObject:[UIDInspectableBoolean fromBoolean:self.layer.masksToBounds]
|
||||
forKey:CALayerMasksToBoundsAttributeId];
|
||||
|
||||
[attributes setObject:[UIDInspectableObject fromFields:layerAttributes]
|
||||
forKey:CALayerAttributeId];
|
||||
|
||||
NSMutableDictionary* accessibilityAttributes = [NSMutableDictionary new];
|
||||
|
||||
[accessibilityAttributes
|
||||
setObject:[UIDInspectableBoolean fromBoolean:self.isAccessibilityElement]
|
||||
forKey:IsAccessibilityElementAttributeId];
|
||||
[accessibilityAttributes
|
||||
setObject:[UIDInspectableText fromText:self.accessibilityLabel]
|
||||
forKey:AccessibilityLabelAttributeId];
|
||||
[accessibilityAttributes
|
||||
setObject:[UIDInspectableText fromText:self.accessibilityIdentifier]
|
||||
forKey:AccessibilityIdentifierAttributeId];
|
||||
[accessibilityAttributes
|
||||
setObject:[UIDInspectableText fromText:self.accessibilityValue]
|
||||
forKey:AccessibilityValueAttributeId];
|
||||
[accessibilityAttributes
|
||||
setObject:[UIDInspectableText fromText:self.accessibilityHint]
|
||||
forKey:AccessibilityHintAttributeId];
|
||||
[accessibilityAttributes
|
||||
setObject:[UIDInspectableBoolean
|
||||
fromBoolean:self.accessibilityViewIsModal]
|
||||
forKey:AccessibilityViewIsModalAttributeId];
|
||||
[accessibilityAttributes
|
||||
setObject:[UIDInspectableBoolean
|
||||
fromBoolean:self.shouldGroupAccessibilityChildren]
|
||||
forKey:ShouldGroupAccessibilityChildrenAttributeId];
|
||||
|
||||
NSMutableDictionary* accessibilityTraitsAttributes =
|
||||
[NSMutableDictionary new];
|
||||
[accessibilityTraitsAttributes
|
||||
setObject:[UIDInspectableBoolean fromBoolean:(self.accessibilityTraits &
|
||||
UIAccessibilityTraitNone)]
|
||||
forKey:AccessibilityTraitNoneAttributeId];
|
||||
|
||||
[accessibilityTraitsAttributes
|
||||
setObject:[UIDInspectableBoolean fromBoolean:(self.accessibilityTraits &
|
||||
UIAccessibilityTraitButton)]
|
||||
forKey:AccessibilityTraitButtonAttributeId];
|
||||
[accessibilityTraitsAttributes
|
||||
setObject:[UIDInspectableBoolean fromBoolean:(self.accessibilityTraits &
|
||||
UIAccessibilityTraitLink)]
|
||||
forKey:AccessibilityTraitLinkAttributeId];
|
||||
[accessibilityTraitsAttributes
|
||||
setObject:[UIDInspectableBoolean fromBoolean:(self.accessibilityTraits &
|
||||
UIAccessibilityTraitImage)]
|
||||
forKey:AccessibilityTraitImageAttributeId];
|
||||
[accessibilityTraitsAttributes
|
||||
setObject:[UIDInspectableBoolean
|
||||
fromBoolean:(self.accessibilityTraits &
|
||||
UIAccessibilityTraitSearchField)]
|
||||
forKey:AccessibilityTraitSearchFieldAttributeId];
|
||||
[accessibilityTraitsAttributes
|
||||
setObject:[UIDInspectableBoolean
|
||||
fromBoolean:(self.accessibilityTraits &
|
||||
UIAccessibilityTraitKeyboardKey)]
|
||||
forKey:AccessibilityTraitKeyboardKeyAttributeId];
|
||||
[accessibilityTraitsAttributes
|
||||
setObject:[UIDInspectableBoolean
|
||||
fromBoolean:(self.accessibilityTraits &
|
||||
UIAccessibilityTraitStaticText)]
|
||||
forKey:AccessibilityTraitStaticTextAttributeId];
|
||||
[accessibilityTraitsAttributes
|
||||
setObject:[UIDInspectableBoolean fromBoolean:(self.accessibilityTraits &
|
||||
UIAccessibilityTraitHeader)]
|
||||
forKey:AccessibilityTraitHeaderAttributeId];
|
||||
[accessibilityTraitsAttributes
|
||||
setObject:[UIDInspectableBoolean fromBoolean:(self.accessibilityTraits &
|
||||
UIAccessibilityTraitTabBar)]
|
||||
forKey:AccessibilityTraitTabBarAttributeId];
|
||||
[accessibilityTraitsAttributes
|
||||
setObject:[UIDInspectableBoolean
|
||||
fromBoolean:(self.accessibilityTraits &
|
||||
UIAccessibilityTraitSummaryElement)]
|
||||
forKey:AccessibilityTraitSummaryElementAttributeId];
|
||||
[accessibilityTraitsAttributes
|
||||
setObject:[UIDInspectableBoolean
|
||||
fromBoolean:(self.accessibilityTraits &
|
||||
UIAccessibilityTraitSelected)]
|
||||
forKey:AccessibilityTraitSelectedAttributeId];
|
||||
[accessibilityTraitsAttributes
|
||||
setObject:[UIDInspectableBoolean
|
||||
fromBoolean:(self.accessibilityTraits &
|
||||
UIAccessibilityTraitNotEnabled)]
|
||||
forKey:AccessibilityTraitNotEnabledAttributeId];
|
||||
[accessibilityTraitsAttributes
|
||||
setObject:[UIDInspectableBoolean
|
||||
fromBoolean:(self.accessibilityTraits &
|
||||
UIAccessibilityTraitAdjustable)]
|
||||
forKey:AccessibilityTraitAdjustableAttributeId];
|
||||
[accessibilityTraitsAttributes
|
||||
setObject:[UIDInspectableBoolean
|
||||
fromBoolean:(self.accessibilityTraits &
|
||||
UIAccessibilityTraitAllowsDirectInteraction)]
|
||||
forKey:AccessibilityTraitAllowsDirectInteractionAttributeId];
|
||||
[accessibilityTraitsAttributes
|
||||
setObject:[UIDInspectableBoolean
|
||||
fromBoolean:(self.accessibilityTraits &
|
||||
UIAccessibilityTraitUpdatesFrequently)]
|
||||
forKey:AccessibilityTraitUpdatesFrequentlyAttributeId];
|
||||
[accessibilityTraitsAttributes
|
||||
setObject:[UIDInspectableBoolean
|
||||
fromBoolean:(self.accessibilityTraits &
|
||||
UIAccessibilityTraitCausesPageTurn)]
|
||||
forKey:AccessibilityTraitCausesPageTurnAttributeId];
|
||||
[accessibilityTraitsAttributes
|
||||
setObject:[UIDInspectableBoolean
|
||||
fromBoolean:(self.accessibilityTraits &
|
||||
UIAccessibilityTraitPlaysSound)]
|
||||
forKey:AccessibilityTraitPlaysSoundAttributeId];
|
||||
[accessibilityTraitsAttributes
|
||||
setObject:[UIDInspectableBoolean
|
||||
fromBoolean:(self.accessibilityTraits &
|
||||
UIAccessibilityTraitStartsMediaSession)]
|
||||
forKey:AccessibilityTraitStartsMediaSessionAttributeId];
|
||||
|
||||
[accessibilityAttributes
|
||||
setObject:[UIDInspectableObject fromFields:accessibilityTraitsAttributes]
|
||||
forKey:AccessibilityTraitsAttributeId];
|
||||
|
||||
[attributes
|
||||
setObject:[UIDInspectableObject fromFields:accessibilityAttributes]
|
||||
forKey:AccessibilityAttributeId];
|
||||
}
|
||||
|
||||
- (NSArray<id<NSObject>>*)UID_children {
|
||||
NSMutableArray* children = [NSMutableArray new];
|
||||
|
||||
// Use UIViewControllers for children which responds to a different
|
||||
// view controller than their parent.
|
||||
for (UIView* child in self.subviews) {
|
||||
BOOL isController =
|
||||
[child.nextResponder isKindOfClass:[UIViewController class]];
|
||||
|
||||
if (!child.isHidden) {
|
||||
if (isController && child.nextResponder != self.nextResponder) {
|
||||
[children addObject:child.nextResponder];
|
||||
} else {
|
||||
[children addObject:child];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return children;
|
||||
}
|
||||
|
||||
/**
|
||||
In the context of UIView, the active child is defined as the last view in
|
||||
the subviews collection. If said item's next responder is a UIViewController,
|
||||
then return this instead.
|
||||
*/
|
||||
- (id<NSObject>)UID_activeChild {
|
||||
if (self.subviews && self.subviews.count > 0) {
|
||||
UIView* activeChild = [self.subviews lastObject];
|
||||
BOOL isController =
|
||||
[activeChild.nextResponder isKindOfClass:[UIViewController class]];
|
||||
|
||||
if (!activeChild.isHidden) {
|
||||
if (isController && activeChild.nextResponder != self.nextResponder) {
|
||||
return activeChild.nextResponder;
|
||||
}
|
||||
return activeChild;
|
||||
}
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (UIImage*)UID_snapshot {
|
||||
return UIDViewSnapshot(self);
|
||||
}
|
||||
|
||||
- (UIDBounds*)UID_bounds {
|
||||
if ([self.superview isKindOfClass:[UIScrollView class]]) {
|
||||
UIScrollView* parent = (UIScrollView*)self.superview;
|
||||
|
||||
CGFloat x = self.frame.origin.x - parent.contentOffset.x;
|
||||
CGFloat y = self.frame.origin.y - parent.contentOffset.y;
|
||||
CGFloat width = self.frame.size.width;
|
||||
CGFloat height = self.frame.size.height;
|
||||
|
||||
return [UIDBounds fromRect:CGRectMake(x, y, width, height)];
|
||||
}
|
||||
|
||||
return [UIDBounds fromRect:self.frame];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
* 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 <Foundation/Foundation.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@class UIDFrameworkEventMetadata;
|
||||
|
||||
@interface UIDInitEvent : NSObject
|
||||
|
||||
@property(nonatomic) NSUInteger rootId;
|
||||
@property(nonatomic, strong)
|
||||
NSArray<UIDFrameworkEventMetadata*>* frameworkEventMetadata;
|
||||
|
||||
+ (NSString*)name;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* 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 "UIDInitEvent.h"
|
||||
|
||||
@implementation UIDInitEvent
|
||||
|
||||
+ (NSString*)name {
|
||||
return @"init";
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,27 @@
|
||||
/*
|
||||
* 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 <Foundation/Foundation.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@class UIDMetadata;
|
||||
|
||||
@interface UIDMetadataUpdateEvent : NSObject
|
||||
|
||||
@property(nonatomic, strong)
|
||||
NSDictionary<NSNumber*, UIDMetadata*>* attributeMetadata;
|
||||
|
||||
+ (NSString*)name;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* 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 "UIDMetadataUpdateEvent.h"
|
||||
|
||||
@implementation UIDMetadataUpdateEvent
|
||||
|
||||
+ (NSString*)name {
|
||||
return @"metadataUpdate";
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* 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 <Foundation/Foundation.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface UIDPerfStatsEvent : NSObject
|
||||
|
||||
@property(nonatomic) double txId;
|
||||
@property(nonatomic, strong) NSString* observerType;
|
||||
@property(nonatomic) NSUInteger nodesCount;
|
||||
|
||||
@property(nonatomic) long start;
|
||||
@property(nonatomic) long traversalMS;
|
||||
@property(nonatomic) long snapshotMS;
|
||||
@property(nonatomic) long queuingMS;
|
||||
@property(nonatomic) long deferredComputationMS;
|
||||
@property(nonatomic) long serializationMS;
|
||||
@property(nonatomic) long socketMS;
|
||||
@property(nonatomic) long frameworkEventsMS;
|
||||
@property(nonatomic) long payloadSize;
|
||||
@property(nonatomic) NSUInteger eventsCount;
|
||||
@property(nonatomic) NSDictionary<NSString*, NSNumber*>* dynamicMeasures;
|
||||
|
||||
+ (NSString*)name;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* 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 "UIDPerfStatsEvent.h"
|
||||
|
||||
@implementation UIDPerfStatsEvent
|
||||
|
||||
+ (NSString*)name {
|
||||
return @"performanceStats";
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* 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 <UIKit/UIKit.h>
|
||||
#import "UIDFrameworkEvent.h"
|
||||
#import "UIDNode.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface UIDSubtreeUpdateEvent : NSObject
|
||||
|
||||
@property(nonatomic) double txId;
|
||||
@property(nonatomic, strong) NSString* observerType;
|
||||
@property(nonatomic) NSUInteger rootId;
|
||||
@property(nonatomic, strong) NSArray<UIDNode*>* nodes;
|
||||
@property(nonatomic, strong) UIImage* snapshot;
|
||||
@property(nonatomic, strong) NSArray<UIDFrameworkEvent*>* frameworkEvents;
|
||||
|
||||
+ (NSString*)name;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* 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 "UIDSubtreeUpdateEvent.h"
|
||||
|
||||
@implementation UIDSubtreeUpdateEvent
|
||||
|
||||
+ (NSString*)name {
|
||||
return @"subtreeUpdate";
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
* 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 <FlipperKit/FlipperPlugin.h>
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@class FlipperClient;
|
||||
|
||||
@interface FlipperKitUIDebuggerPlugin : NSObject<FlipperPlugin>
|
||||
|
||||
@end
|
||||
|
||||
FB_EXTERN_C_BEGIN
|
||||
|
||||
void FlipperKitUIDebuggerAddPlugin(FlipperClient*);
|
||||
|
||||
FB_EXTERN_C_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,85 @@
|
||||
/*
|
||||
* 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 "FlipperKitUIDebuggerPlugin.h"
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
#import <FlipperKit/FlipperClient.h>
|
||||
#import <FlipperKit/FlipperConnection.h>
|
||||
#import <FlipperKit/FlipperResponder.h>
|
||||
|
||||
#import "Core/UIDContext.h"
|
||||
#import "PluginSockets.h"
|
||||
#import "Plugins.h"
|
||||
|
||||
#import "Descriptors/UIDDescriptorRegister.h"
|
||||
#import "Observer/UIDTreeObserverFactory.h"
|
||||
#import "Observer/UIDTreeObserverManager.h"
|
||||
|
||||
@implementation FlipperKitUIDebuggerPlugin {
|
||||
UIDContext* _context;
|
||||
}
|
||||
|
||||
- (instancetype)initWithContext:(UIDContext*)context {
|
||||
if (self = [super init]) {
|
||||
self->_context = context;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (instancetype)init {
|
||||
UIDContext* context = [[UIDContext alloc]
|
||||
initWithApplication:[UIApplication sharedApplication]
|
||||
descriptorRegister:[UIDDescriptorRegister defaultRegister]
|
||||
observerFactory:[UIDTreeObserverFactory shared]];
|
||||
return [self initWithContext:context];
|
||||
}
|
||||
|
||||
- (NSString*)identifier {
|
||||
return @"ui-debugger";
|
||||
}
|
||||
|
||||
- (void)didConnect:(id<FlipperConnection>)connection {
|
||||
if (!_context.application) {
|
||||
_context.application = [UIApplication sharedApplication];
|
||||
}
|
||||
|
||||
_context.connection = connection;
|
||||
|
||||
[[UIDTreeObserverManager shared] startWithContext:_context];
|
||||
}
|
||||
|
||||
- (void)didDisconnect {
|
||||
_context.connection = nil;
|
||||
[[UIDTreeObserverManager shared] stop];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
void FlipperKitUIDebuggerAddPlugin(FlipperClient* client) {
|
||||
UIDContext* context = [[UIDContext alloc]
|
||||
initWithApplication:[UIApplication sharedApplication]
|
||||
descriptorRegister:[UIDDescriptorRegister defaultRegister]
|
||||
observerFactory:[UIDTreeObserverFactory shared]];
|
||||
|
||||
FlipperKitUIDebuggerPlugin* plugin =
|
||||
[[FlipperKitUIDebuggerPlugin alloc] initWithContext:context];
|
||||
|
||||
for (const auto& p : FlipperUIDebuggerDescriptorRegisterSocket_Plugins()) {
|
||||
FlipperUIDebuggerDescriptorRegisterSocket_InvokeConfigure(p, context);
|
||||
}
|
||||
|
||||
[client addPlugin:plugin];
|
||||
}
|
||||
|
||||
void FlipperKitUIDebuggerPluginInit(FlipperClient* client) {
|
||||
FlipperKitUIDebuggerAddPlugin(client);
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* 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 <UIKit/UIKit.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface UIDBounds : NSObject
|
||||
|
||||
@property(nonatomic) NSInteger x;
|
||||
@property(nonatomic) NSInteger y;
|
||||
@property(nonatomic) NSInteger width;
|
||||
@property(nonatomic) NSInteger height;
|
||||
|
||||
- (instancetype)initWithX:(NSInteger)x
|
||||
y:(NSInteger)y
|
||||
width:(NSInteger)width
|
||||
height:(NSInteger)height;
|
||||
|
||||
+ (instancetype)fromRect:(CGRect)rect;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* 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 "UIDBounds.h"
|
||||
|
||||
@implementation UIDBounds
|
||||
|
||||
- (instancetype)initWithX:(NSInteger)x
|
||||
y:(NSInteger)y
|
||||
width:(NSInteger)width
|
||||
height:(NSInteger)height {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
self.x = x;
|
||||
self.y = y;
|
||||
self.width = width;
|
||||
self.height = height;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (instancetype)fromRect:(CGRect)rect {
|
||||
return [[UIDBounds alloc] initWithX:rect.origin.x
|
||||
y:rect.origin.y
|
||||
width:rect.size.width
|
||||
height:rect.size.height];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* 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 <UIKit/UIKit.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface UIDEdgeInsets : NSObject
|
||||
|
||||
@property(nonatomic) CGFloat top;
|
||||
@property(nonatomic) CGFloat right;
|
||||
@property(nonatomic) CGFloat bottom;
|
||||
@property(nonatomic) CGFloat left;
|
||||
|
||||
- (instancetype)initWithTop:(CGFloat)top
|
||||
right:(CGFloat)right
|
||||
bottom:(CGFloat)bottom
|
||||
left:(CGFloat)left;
|
||||
|
||||
+ (instancetype)fromUIEdgeInsets:(UIEdgeInsets)edgeInsets;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* 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 "UIDEdgeInsets.h"
|
||||
|
||||
@implementation UIDEdgeInsets
|
||||
|
||||
- (instancetype)initWithTop:(CGFloat)top
|
||||
right:(CGFloat)right
|
||||
bottom:(CGFloat)bottom
|
||||
left:(CGFloat)left {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
_top = top;
|
||||
_right = right;
|
||||
_bottom = bottom;
|
||||
_left = left;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (instancetype)fromUIEdgeInsets:(UIEdgeInsets)edgeInsets {
|
||||
return [[UIDEdgeInsets alloc] initWithTop:edgeInsets.top
|
||||
right:edgeInsets.right
|
||||
bottom:edgeInsets.bottom
|
||||
left:edgeInsets.left];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
* 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 <Foundation/Foundation.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
typedef NSDictionary<NSString*, id>* UIDEventPayload;
|
||||
typedef NSArray<NSString*>* UIDStacktrace;
|
||||
|
||||
@interface UIDFrameworkEvent : NSObject
|
||||
|
||||
@property(nonatomic) NSUInteger nodeIdentifier;
|
||||
@property(nonatomic, strong) NSString* type;
|
||||
@property(nonatomic, strong) NSDate* timestamp;
|
||||
@property(nonatomic, strong) UIDEventPayload payload;
|
||||
@property(nonatomic, strong) UIDStacktrace stacktrace;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,16 @@
|
||||
/*
|
||||
* 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 "UIDFrameworkEvent.h"
|
||||
|
||||
@implementation UIDFrameworkEvent
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -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 <Foundation/Foundation.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface UIDFrameworkEventMetadata : NSObject
|
||||
|
||||
@property(nonatomic, strong) NSString* type;
|
||||
@property(nonatomic, strong) NSString* documentation;
|
||||
|
||||
+ (instancetype)newWithType:(NSString*)type
|
||||
documentation:(NSString*)documentation;
|
||||
|
||||
+ (instancetype)new NS_UNAVAILABLE;
|
||||
|
||||
- (instancetype)init NS_UNAVAILABLE;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -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 "UIDFrameworkEventMetadata.h"
|
||||
|
||||
@implementation UIDFrameworkEventMetadata
|
||||
|
||||
- (instancetype)initWithType:(NSString*)type
|
||||
documentation:(NSString*)documentation {
|
||||
if (self = [super init]) {
|
||||
self->_type = type;
|
||||
self->_documentation = documentation;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (instancetype)newWithType:(NSString*)type
|
||||
documentation:(NSString*)documentation {
|
||||
return [[self alloc] initWithType:type documentation:documentation];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,175 @@
|
||||
/*
|
||||
* 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 <UIKit/UIKit.h>
|
||||
#import "UIDFoundation.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface UIDInspectable : NSObject
|
||||
@end
|
||||
|
||||
/**
|
||||
Lazy inspectables can be used to defer materialisation
|
||||
of the inspectable until a later stage, like for example,
|
||||
during serialisation.
|
||||
*/
|
||||
@interface UIDLazyInspectable : UIDInspectable
|
||||
|
||||
- (UIDInspectable*)value;
|
||||
+ (instancetype)from:(UIDInspectable* (^)(void))loader;
|
||||
|
||||
@end
|
||||
|
||||
@interface UIDInspectableValue : UIDInspectable
|
||||
|
||||
+ (instancetype)createWithText:(NSString*)text;
|
||||
+ (instancetype)createWithBoolean:(bool)boolean;
|
||||
+ (instancetype)createWithNumber:(NSNumber*)number;
|
||||
|
||||
@end
|
||||
|
||||
@interface UIDInspectableObject : UIDInspectable
|
||||
|
||||
@property(nonatomic, strong, readonly)
|
||||
NSDictionary<NSNumber*, UIDInspectable*>* fields;
|
||||
|
||||
- (instancetype)initWithFields:
|
||||
(NSDictionary<NSNumber*, UIDInspectable*>*)fields;
|
||||
|
||||
+ (instancetype)fromFields:(NSDictionary<NSNumber*, UIDInspectable*>*)fields;
|
||||
|
||||
@end
|
||||
|
||||
@interface UIDInspectableArray : UIDInspectable
|
||||
|
||||
@property(nonatomic, strong, readonly) NSArray<UIDInspectable*>* items;
|
||||
|
||||
- (instancetype)initWithItems:(NSArray<UIDInspectable*>*)items;
|
||||
|
||||
+ (instancetype)fromItems:(NSArray<UIDInspectable*>*)items;
|
||||
|
||||
@end
|
||||
|
||||
@interface UIDInspectableText : UIDInspectableValue
|
||||
|
||||
@property(nonatomic, strong, readonly) NSString* value;
|
||||
|
||||
- (instancetype)initWithValue:(NSString*)value;
|
||||
|
||||
+ (instancetype)fromText:(NSString*)value;
|
||||
|
||||
@end
|
||||
|
||||
@interface UIDInspectableBoolean : UIDInspectableValue
|
||||
|
||||
@property(nonatomic, readonly) bool value;
|
||||
|
||||
- (instancetype)initWithValue:(bool)value;
|
||||
|
||||
+ (instancetype)fromBoolean:(bool)value;
|
||||
|
||||
@end
|
||||
|
||||
@interface UIDInspectableNumber : UIDInspectableValue
|
||||
|
||||
@property(nonatomic, strong, readonly) NSNumber* value;
|
||||
|
||||
- (instancetype)initWithValue:(NSNumber*)value;
|
||||
|
||||
+ (instancetype)fromNumber:(NSNumber*)value;
|
||||
+ (instancetype)fromCGFloat:(CGFloat)value;
|
||||
|
||||
@end
|
||||
|
||||
@class UIDBounds;
|
||||
@interface UIDInspectableBounds : UIDInspectableValue
|
||||
|
||||
@property(nonatomic, strong, readonly) UIDBounds* value;
|
||||
|
||||
- (instancetype)initWithValue:(UIDBounds*)value;
|
||||
|
||||
+ (instancetype)fromBounds:(UIDBounds*)value;
|
||||
+ (instancetype)fromRect:(CGRect)rect;
|
||||
|
||||
@end
|
||||
|
||||
@interface UIDInspectableCoordinate : UIDInspectableValue
|
||||
|
||||
@property(nonatomic, readonly) CGPoint value;
|
||||
|
||||
- (instancetype)initWithValue:(CGPoint)value;
|
||||
|
||||
+ (instancetype)fromPoint:(CGPoint)value;
|
||||
|
||||
@end
|
||||
|
||||
@interface UIDInspectableSize : UIDInspectableValue
|
||||
|
||||
@property(nonatomic, readonly) CGSize value;
|
||||
|
||||
- (instancetype)initWithValue:(CGSize)value;
|
||||
|
||||
+ (instancetype)fromSize:(CGSize)value;
|
||||
|
||||
@end
|
||||
|
||||
@interface UIDInspectableUnknown : UIDInspectableValue
|
||||
|
||||
@property(nonatomic, readonly) NSString* value;
|
||||
|
||||
- (instancetype)initWithValue:(NSString*)value;
|
||||
|
||||
+ (instancetype)unknown;
|
||||
+ (instancetype)undefined;
|
||||
+ (instancetype)null;
|
||||
|
||||
@end
|
||||
|
||||
@class UIDEdgeInsets;
|
||||
@interface UIDInspectableEdgeInsets : UIDInspectableValue
|
||||
|
||||
@property(nonatomic, readonly) UIDEdgeInsets* value;
|
||||
|
||||
- (instancetype)initWithValue:(UIDEdgeInsets*)value;
|
||||
|
||||
+ (instancetype)fromEdgeInsets:(UIDEdgeInsets*)value;
|
||||
+ (instancetype)fromUIEdgeInsets:(UIEdgeInsets)value;
|
||||
|
||||
@end
|
||||
|
||||
@interface UIDInspectableColor : UIDInspectableValue
|
||||
|
||||
@property(nonatomic, strong, readonly) UIColor* value;
|
||||
|
||||
- (instancetype)initWithValue:(UIColor*)value;
|
||||
|
||||
+ (instancetype)fromColor:(UIColor*)value;
|
||||
|
||||
@end
|
||||
|
||||
@interface UIDInspectableEnum : UIDInspectableValue
|
||||
|
||||
@property(nonatomic, readonly) NSString* value;
|
||||
|
||||
- (instancetype)initWithValue:(NSString*)value;
|
||||
|
||||
+ (instancetype)from:(NSString*)value;
|
||||
|
||||
@end
|
||||
|
||||
typedef NSDictionary<NSNumber*, UIDInspectable*> UIDAttributes;
|
||||
typedef NSMutableDictionary<NSNumber*, UIDInspectable*> UIDMutableAttributes;
|
||||
typedef NSDictionary<NSString*, NSString*> UIDInlineAttributes;
|
||||
typedef NSMutableDictionary<NSString*, NSString*> UIDMutableInlineAttributes;
|
||||
typedef NSDictionary<NSString*, id<UIDFoundation>> UIDGenericAttributes;
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,275 @@
|
||||
/*
|
||||
* 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 "UIDInspectable.h"
|
||||
#import "UIDBounds.h"
|
||||
#import "UIDEdgeInsets.h"
|
||||
|
||||
@implementation UIDInspectable
|
||||
@end
|
||||
|
||||
@interface UIDLazyInspectable () {
|
||||
UIDInspectable* _value;
|
||||
UIDInspectable* (^_loader)(void);
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation UIDLazyInspectable
|
||||
- (instancetype)initWithLoader:(UIDInspectable* (^)(void))loader {
|
||||
if (self = [super init]) {
|
||||
self->_value = nil;
|
||||
self->_loader = loader;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (UIDInspectable*)value {
|
||||
if (!_value && _loader) {
|
||||
_value = _loader();
|
||||
}
|
||||
return _value;
|
||||
}
|
||||
|
||||
+ (instancetype)from:(UIDInspectable* (^)(void))loader {
|
||||
return [[self alloc] initWithLoader:loader];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation UIDInspectableObject
|
||||
|
||||
- (instancetype)initWithFields:
|
||||
(NSDictionary<NSNumber*, UIDInspectable*>*)fields {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
_fields = fields;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (instancetype)fromFields:(NSDictionary<NSNumber*, UIDInspectable*>*)fields {
|
||||
return [[UIDInspectableObject alloc] initWithFields:fields];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation UIDInspectableArray
|
||||
|
||||
- (instancetype)initWithItems:(NSArray<UIDInspectable*>*)items {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
_items = items;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (instancetype)fromItems:(NSArray<UIDInspectable*>*)items {
|
||||
return [[UIDInspectableArray alloc] initWithItems:items];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation UIDInspectableValue
|
||||
|
||||
+ (instancetype)createWithText:(NSString*)text {
|
||||
return [[UIDInspectableText alloc] initWithValue:text];
|
||||
}
|
||||
|
||||
+ (instancetype)createWithBoolean:(bool)boolean {
|
||||
return [[UIDInspectableBoolean alloc] initWithValue:boolean];
|
||||
}
|
||||
|
||||
+ (instancetype)createWithNumber:(NSNumber*)number {
|
||||
return [[UIDInspectableNumber alloc] initWithValue:number];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation UIDInspectableText
|
||||
|
||||
- (instancetype)initWithValue:(NSString*)value {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
_value = value;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (instancetype)fromText:(NSString*)value {
|
||||
return [[UIDInspectableText alloc] initWithValue:value];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation UIDInspectableBoolean
|
||||
|
||||
- (instancetype)initWithValue:(bool)value {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
_value = value;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (instancetype)fromBoolean:(bool)value {
|
||||
return [[UIDInspectableBoolean alloc] initWithValue:value];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation UIDInspectableNumber
|
||||
|
||||
- (instancetype)initWithValue:(NSNumber*)value {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
_value = value;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (instancetype)fromNumber:(NSNumber*)value {
|
||||
return [[UIDInspectableNumber alloc] initWithValue:value];
|
||||
}
|
||||
|
||||
+ (instancetype)fromCGFloat:(CGFloat)value {
|
||||
return [self fromNumber:[NSNumber numberWithFloat:value]];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation UIDInspectableBounds
|
||||
|
||||
- (instancetype)initWithValue:(UIDBounds*)value {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
_value = value;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (instancetype)fromBounds:(UIDBounds*)bounds {
|
||||
return [[UIDInspectableBounds alloc] initWithValue:bounds];
|
||||
}
|
||||
|
||||
+ (instancetype)fromRect:(CGRect)rect {
|
||||
return [self fromBounds:[UIDBounds fromRect:rect]];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation UIDInspectableCoordinate
|
||||
|
||||
- (instancetype)initWithValue:(CGPoint)value {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
_value = value;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (instancetype)fromPoint:(CGPoint)value {
|
||||
return [[UIDInspectableCoordinate alloc] initWithValue:value];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation UIDInspectableSize
|
||||
|
||||
- (instancetype)initWithValue:(CGSize)value {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
_value = value;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (instancetype)fromSize:(CGSize)value {
|
||||
return [[UIDInspectableSize alloc] initWithValue:value];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation UIDInspectableEdgeInsets
|
||||
|
||||
- (instancetype)initWithValue:(UIDEdgeInsets*)value {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
_value = value;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (instancetype)fromEdgeInsets:(UIDEdgeInsets*)value {
|
||||
return [[UIDInspectableEdgeInsets alloc] initWithValue:value];
|
||||
}
|
||||
|
||||
+ (instancetype)fromUIEdgeInsets:(UIEdgeInsets)value {
|
||||
return [self fromEdgeInsets:[UIDEdgeInsets fromUIEdgeInsets:value]];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation UIDInspectableColor
|
||||
|
||||
- (instancetype)initWithValue:(UIColor*)value {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
_value = value;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (instancetype)fromColor:(UIColor*)value {
|
||||
return [[UIDInspectableColor alloc] initWithValue:value];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation UIDInspectableUnknown
|
||||
|
||||
- (instancetype)initWithValue:(NSString*)value {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
_value = value;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (instancetype)unknown {
|
||||
return [[UIDInspectableUnknown alloc] initWithValue:@"unknown"];
|
||||
}
|
||||
|
||||
+ (instancetype)undefined {
|
||||
return [[UIDInspectableUnknown alloc] initWithValue:@"undefined"];
|
||||
}
|
||||
|
||||
+ (instancetype)null {
|
||||
return [[UIDInspectableUnknown alloc] initWithValue:@"null"];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation UIDInspectableEnum
|
||||
|
||||
- (instancetype)initWithValue:(NSString*)value {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
_value = value;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (instancetype)from:(NSString*)value {
|
||||
return [[UIDInspectableEnum alloc] initWithValue:value ?: @"UNKNOWN"];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
* 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 <Foundation/Foundation.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
typedef NSNumber* UIDMetadataId;
|
||||
|
||||
@class UIDInspectableValue;
|
||||
|
||||
/**
|
||||
Represent metadata associated for an attribute. Metadata identifier is a
|
||||
unique identifier used by attributes to refer to its metadata. Type refers to
|
||||
attribute semantics. It can represent: identity, attributes, layout,
|
||||
documentation, or a custom type.
|
||||
*/
|
||||
@interface UIDMetadata : NSObject
|
||||
|
||||
@property(nonatomic, readonly) UIDMetadataId identifier;
|
||||
@property(nonatomic, strong, readonly) NSString* type;
|
||||
@property(nonatomic, readonly) UIDMetadataId parent;
|
||||
@property(nonatomic, strong, readonly) NSString* name;
|
||||
@property(nonatomic, readonly) bool isMutable;
|
||||
@property(nonatomic, strong, readonly)
|
||||
NSSet<UIDInspectableValue*>* possibleValues;
|
||||
@property(nonatomic, strong, readonly) NSSet<NSString*>* tags;
|
||||
|
||||
- (instancetype)initWithIdentifier:(UIDMetadataId)identifier
|
||||
type:(NSString*)type
|
||||
name:(NSString*)name;
|
||||
|
||||
- (instancetype)initWithIdentifier:(UIDMetadataId)identifier
|
||||
type:(NSString*)type
|
||||
name:(NSString*)name
|
||||
isMutable:(bool)isMutable
|
||||
parent:(UIDMetadataId)parent;
|
||||
|
||||
- (instancetype)initWithIdentifier:(UIDMetadataId)identifier
|
||||
type:(NSString*)type
|
||||
name:(NSString*)name
|
||||
isMutable:(bool)isMutable
|
||||
parent:(UIDMetadataId)parent
|
||||
possibleValues:(NSSet<UIDInspectableValue*>*)possibleValues
|
||||
tags:(NSSet<NSString*>*)tags;
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* 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 "UIDMetadata.h"
|
||||
#import "UIDInspectable.h"
|
||||
|
||||
@implementation UIDMetadata
|
||||
|
||||
- (instancetype)initWithIdentifier:(UIDMetadataId)identifier
|
||||
type:(NSString*)type
|
||||
name:(NSString*)name {
|
||||
return [self initWithIdentifier:identifier
|
||||
type:type
|
||||
name:name
|
||||
isMutable:false
|
||||
parent:@0
|
||||
possibleValues:[NSSet set]
|
||||
tags:[NSSet set]];
|
||||
}
|
||||
|
||||
- (instancetype)initWithIdentifier:(UIDMetadataId)identifier
|
||||
type:(NSString*)type
|
||||
name:(NSString*)name
|
||||
isMutable:(bool)isMutable
|
||||
parent:(UIDMetadataId)parent {
|
||||
return [self initWithIdentifier:identifier
|
||||
type:type
|
||||
name:name
|
||||
isMutable:isMutable
|
||||
parent:parent
|
||||
possibleValues:[NSSet set]
|
||||
tags:[NSSet set]];
|
||||
}
|
||||
|
||||
- (instancetype)initWithIdentifier:(UIDMetadataId)identifier
|
||||
type:(NSString*)type
|
||||
name:(NSString*)name
|
||||
isMutable:(bool)isMutable
|
||||
parent:(UIDMetadataId)parent
|
||||
possibleValues:(NSSet<UIDInspectableValue*>*)possibleValues
|
||||
tags:(NSSet<NSString*>*)tags {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
_identifier = identifier;
|
||||
_type = type;
|
||||
_name = name;
|
||||
_isMutable = isMutable;
|
||||
_parent = parent;
|
||||
_possibleValues = possibleValues;
|
||||
_tags = tags;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* 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 <Foundation/Foundation.h>
|
||||
#import "UIDBounds.h"
|
||||
#import "UIDInspectable.h"
|
||||
#import "UIDMetadata.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface UIDNode : NSObject
|
||||
|
||||
@property(nonatomic) NSUInteger identifier;
|
||||
@property(nonatomic, strong) NSString* qualifiedName;
|
||||
@property(nonatomic, strong) NSString* name;
|
||||
@property(nonatomic, strong) UIDBounds* bounds;
|
||||
@property(nonatomic, strong) NSSet<NSString*>* tags;
|
||||
@property(nonatomic, strong) UIDAttributes* attributes;
|
||||
@property(nonatomic, strong) UIDInlineAttributes* inlineAttributes;
|
||||
@property(nonatomic, strong) UIDGenericAttributes* hiddenAttributes;
|
||||
@property(nonatomic, nullable) NSNumber* parent;
|
||||
@property(nonatomic, strong) NSArray<NSNumber*>* children;
|
||||
@property(nonatomic) NSNumber* activeChild;
|
||||
|
||||
- (instancetype)initWithIdentifier:(NSUInteger)identifier
|
||||
qualifiedName:(NSString*)qualifiedName
|
||||
name:(NSString*)name
|
||||
bounds:(UIDBounds*)bounds
|
||||
tags:(NSSet<NSString*>*)tags;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,36 @@
|
||||
/*
|
||||
* 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 "UIDNode.h"
|
||||
|
||||
@implementation UIDNode
|
||||
|
||||
- (instancetype)initWithIdentifier:(NSUInteger)identifier
|
||||
qualifiedName:(NSString*)qualifiedName
|
||||
name:(NSString*)name
|
||||
bounds:(UIDBounds*)bounds
|
||||
tags:(NSSet<NSString*>*)tags {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
self.identifier = identifier;
|
||||
self.qualifiedName = qualifiedName;
|
||||
self.name = name;
|
||||
self.bounds = bounds;
|
||||
self.tags = tags;
|
||||
self.parent = nil;
|
||||
self.children = [NSArray array];
|
||||
self.attributes = [NSDictionary dictionary];
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* 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 <UIKit/UIKit.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@class UIDContext;
|
||||
|
||||
@interface UIDTreeObserver<__covariant T> : NSObject
|
||||
|
||||
@property(nonatomic, strong)
|
||||
NSMutableDictionary<NSNumber*, UIDTreeObserver<T>*>* children;
|
||||
@property(nonatomic, strong) NSString* type;
|
||||
|
||||
- (void)subscribe:(nullable T)node;
|
||||
- (void)unsubscribe;
|
||||
- (void)processNode:(id)node withContext:(UIDContext*)context;
|
||||
- (void)processNode:(id)node
|
||||
withSnapshot:(BOOL)snapshot
|
||||
withContext:(UIDContext*)context;
|
||||
- (void)cleanup;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,75 @@
|
||||
/*
|
||||
* 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 "UIDTreeObserver.h"
|
||||
#import "UIDContext.h"
|
||||
#import "UIDHierarchyTraversal.h"
|
||||
#import "UIDTimeUtilities.h"
|
||||
|
||||
@implementation UIDTreeObserver
|
||||
|
||||
- (instancetype)init {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
_children = [NSMutableDictionary new];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)subscribe:(id)node {
|
||||
}
|
||||
|
||||
- (void)unsubscribe {
|
||||
}
|
||||
|
||||
- (void)processNode:(id)node withContext:(UIDContext*)context {
|
||||
[self processNode:node withSnapshot:false withContext:context];
|
||||
}
|
||||
|
||||
- (void)processNode:(id)node
|
||||
withSnapshot:(BOOL)snapshot
|
||||
withContext:(UIDContext*)context {
|
||||
NSTimeInterval timestamp = UIDPerformanceTimeIntervalSince1970();
|
||||
|
||||
uint64_t t0 = UIDPerformanceNow();
|
||||
|
||||
UIDHierarchyTraversal* traversal = [UIDHierarchyTraversal
|
||||
createWithDescriptorRegister:context.descriptorRegister];
|
||||
|
||||
UIDNodeDescriptor* descriptor =
|
||||
[context.descriptorRegister descriptorForClass:[node class]];
|
||||
UIDNodeDescriptor* rootDescriptor = [context.descriptorRegister
|
||||
descriptorForClass:[context.application class]];
|
||||
|
||||
NSArray* nodes = [traversal traverse:node];
|
||||
|
||||
uint64_t t1 = UIDPerformanceNow();
|
||||
|
||||
UIImage* screenshot = [rootDescriptor snapshotForNode:context.application];
|
||||
|
||||
uint64_t t2 = UIDPerformanceNow();
|
||||
|
||||
UIDSubtreeUpdate* update = [UIDSubtreeUpdate new];
|
||||
update.observerType = _type;
|
||||
update.rootId = [descriptor identifierForNode:node];
|
||||
update.nodes = nodes;
|
||||
update.snapshot = screenshot;
|
||||
update.timestamp = timestamp;
|
||||
update.traversalMS = UIDMonotonicTimeConvertMachUnitsToMS(t1 - t0);
|
||||
update.snapshotMS = UIDMonotonicTimeConvertMachUnitsToMS(t2 - t1);
|
||||
|
||||
[context.updateDigester digest:update];
|
||||
}
|
||||
|
||||
- (void)cleanup {
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
* 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 <Foundation/Foundation.h>
|
||||
#import "UIDTreeObserver.h"
|
||||
|
||||
@class UIDContext;
|
||||
|
||||
/**
|
||||
UIDTreeObserverBuilder, as the name suggests, can create an observers for a
|
||||
node. Basically, observer builders are registered in the factory. Then, when
|
||||
an observer is needed for a node, builders are asked whether they can create
|
||||
an observer for it. If it can, then it will create an observer for it.
|
||||
*/
|
||||
@protocol UIDTreeObserverBuilder
|
||||
|
||||
- (BOOL)canBuildFor:(id)node;
|
||||
- (UIDTreeObserver*)buildWithContext:(UIDContext*)context;
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* 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 <UIKit/UIKit.h>
|
||||
#import "UIDTreeObserverBuilder.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@class UIDContext;
|
||||
|
||||
/**
|
||||
Factory of TreeObserver. It allows registration of different builders which
|
||||
are the ones responsible of actually building observes for nodes.
|
||||
*/
|
||||
@interface UIDTreeObserverFactory : NSObject
|
||||
|
||||
+ (instancetype)shared;
|
||||
|
||||
- (void)registerBuilder:(id<UIDTreeObserverBuilder>)builder;
|
||||
- (UIDTreeObserver*)createObserverForNode:(id)node
|
||||
withContext:(UIDContext*)context;
|
||||
- (BOOL)hasObserverForNode:(id)node;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,66 @@
|
||||
/*
|
||||
* 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 "UIDTreeObserverFactory.h"
|
||||
#import "UIDUIApplicationObserver.h"
|
||||
|
||||
@interface UIDTreeObserverFactory () {
|
||||
NSMutableArray<id<UIDTreeObserverBuilder>>* _builders;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation UIDTreeObserverFactory
|
||||
|
||||
- (instancetype)init {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
_builders = [NSMutableArray new];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (instancetype)shared {
|
||||
static UIDTreeObserverFactory* factory = nil;
|
||||
|
||||
static dispatch_once_t onceToken;
|
||||
dispatch_once(&onceToken, ^{
|
||||
factory = [UIDTreeObserverFactory new];
|
||||
[factory registerBuilder:[UIDUIApplicationObserverBuilder new]];
|
||||
});
|
||||
|
||||
return factory;
|
||||
}
|
||||
|
||||
- (void)registerBuilder:(id<UIDTreeObserverBuilder>)builder {
|
||||
[_builders addObject:builder];
|
||||
}
|
||||
|
||||
- (UIDTreeObserver*)createObserverForNode:(id)node
|
||||
withContext:(UIDContext*)context {
|
||||
for (id<UIDTreeObserverBuilder> builder in _builders) {
|
||||
if ([builder canBuildFor:node]) {
|
||||
return [builder buildWithContext:context];
|
||||
}
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (BOOL)hasObserverForNode:(id)node {
|
||||
for (id<UIDTreeObserverBuilder> builder in _builders) {
|
||||
if ([builder canBuildFor:node]) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,27 @@
|
||||
/*
|
||||
* 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 <Foundation/Foundation.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@class UIDContext;
|
||||
|
||||
@interface UIDTreeObserverManager : NSObject
|
||||
|
||||
+ (instancetype)shared;
|
||||
|
||||
- (void)startWithContext:(UIDContext*)context;
|
||||
- (void)stop;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,167 @@
|
||||
/*
|
||||
* 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 "UIDTreeObserverManager.h"
|
||||
#import "UIDContext.h"
|
||||
#import "UIDDescriptorRegister.h"
|
||||
#import "UIDInitEvent.h"
|
||||
#import "UIDJSONSerializer.h"
|
||||
#import "UIDMetadataRegister.h"
|
||||
#import "UIDMetadataUpdateEvent.h"
|
||||
#import "UIDPerfStatsEvent.h"
|
||||
#import "UIDPerformance.h"
|
||||
#import "UIDSubtreeUpdateEvent.h"
|
||||
#import "UIDTimeUtilities.h"
|
||||
#import "UIDTreeObserverFactory.h"
|
||||
|
||||
@interface UIDTreeObserverManager ()<UIDUpdateDigester> {
|
||||
dispatch_queue_t _queue;
|
||||
UIDTreeObserver* _rootObserver;
|
||||
|
||||
UIDContext* _context;
|
||||
}
|
||||
|
||||
@property(nonatomic, strong) UIDTreeObserver* viewObserver;
|
||||
|
||||
@end
|
||||
|
||||
@implementation UIDTreeObserverManager
|
||||
|
||||
- (instancetype)init {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
_queue =
|
||||
dispatch_queue_create("ui-debugger.background", DISPATCH_QUEUE_SERIAL);
|
||||
_context = nil;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (instancetype)shared {
|
||||
static UIDTreeObserverManager* instance = nil;
|
||||
|
||||
static dispatch_once_t onceToken;
|
||||
dispatch_once(&onceToken, ^{
|
||||
instance = [UIDTreeObserverManager new];
|
||||
});
|
||||
|
||||
return instance;
|
||||
}
|
||||
|
||||
- (void)startWithContext:(UIDContext*)context {
|
||||
_context = context;
|
||||
_context.updateDigester = self;
|
||||
|
||||
[self sendInit];
|
||||
|
||||
if (!_rootObserver) {
|
||||
_rootObserver =
|
||||
[_context.observerFactory createObserverForNode:context.application
|
||||
withContext:_context];
|
||||
}
|
||||
|
||||
[_rootObserver subscribe:_context.application];
|
||||
|
||||
[_context.frameworkEventManager enable];
|
||||
}
|
||||
|
||||
- (void)stop {
|
||||
[_rootObserver unsubscribe];
|
||||
|
||||
[[UIDMetadataRegister shared] reset];
|
||||
|
||||
[_context.frameworkEventManager disable];
|
||||
}
|
||||
|
||||
- (void)sendInit {
|
||||
UIDNodeDescriptor* descriptor =
|
||||
[_context.descriptorRegister descriptorForClass:[UIApplication class]];
|
||||
|
||||
UIDInitEvent* init = [UIDInitEvent new];
|
||||
init.rootId = [descriptor identifierForNode:_context.application];
|
||||
init.frameworkEventMetadata = [_context.frameworkEventManager eventsMetadata];
|
||||
|
||||
[_context.connection send:[UIDInitEvent name] withRawParams:UID_toJSON(init)];
|
||||
}
|
||||
|
||||
- (void)sendMetadataUpdate {
|
||||
NSDictionary* pendingMetadata =
|
||||
[[UIDMetadataRegister shared] extractPendingMetadata];
|
||||
if (![pendingMetadata count]) {
|
||||
return;
|
||||
}
|
||||
|
||||
UIDMetadataUpdateEvent* metadataUpdateEvent = [UIDMetadataUpdateEvent new];
|
||||
metadataUpdateEvent.attributeMetadata = pendingMetadata;
|
||||
|
||||
id JSON = UID_toJSON(metadataUpdateEvent);
|
||||
|
||||
[_context.connection send:[UIDMetadataUpdateEvent name] withRawParams:JSON];
|
||||
}
|
||||
|
||||
- (void)digest:(nonnull id<UIDUpdate>)update {
|
||||
uint64_t t0 = UIDPerformanceNow();
|
||||
dispatch_async(_queue, ^{
|
||||
uint64_t t1 = UIDPerformanceNow();
|
||||
|
||||
UIDPerformanceClear();
|
||||
|
||||
UIDSubtreeUpdate* subtreeUpdate = (UIDSubtreeUpdate*)update;
|
||||
|
||||
UIDSubtreeUpdateEvent* subtreeUpdateEvent = [UIDSubtreeUpdateEvent new];
|
||||
subtreeUpdateEvent.txId = UIDPerformanceTimeIntervalSince1970();
|
||||
subtreeUpdateEvent.observerType = subtreeUpdate.observerType;
|
||||
subtreeUpdateEvent.rootId = subtreeUpdate.rootId;
|
||||
subtreeUpdateEvent.nodes = subtreeUpdate.nodes;
|
||||
subtreeUpdateEvent.snapshot = subtreeUpdate.snapshot;
|
||||
subtreeUpdateEvent.frameworkEvents =
|
||||
[self->_context.frameworkEventManager events];
|
||||
|
||||
uint64_t t2 = UIDPerformanceNow();
|
||||
|
||||
id intermediate = UID_toFoundation(subtreeUpdateEvent);
|
||||
|
||||
uint64_t t3 = UIDPerformanceNow();
|
||||
|
||||
NSString* JSON = UID_FoundationtoJSON(intermediate);
|
||||
uint64_t t4 = UIDPerformanceNow();
|
||||
NSUInteger payloadSize = JSON.length;
|
||||
|
||||
[self sendMetadataUpdate];
|
||||
|
||||
[self->_context.connection send:[UIDSubtreeUpdateEvent name]
|
||||
withRawParams:JSON];
|
||||
|
||||
uint64_t t5 = UIDPerformanceNow();
|
||||
|
||||
UIDPerfStatsEvent* perfStats = [UIDPerfStatsEvent new];
|
||||
perfStats.txId = subtreeUpdateEvent.txId;
|
||||
perfStats.observerType = subtreeUpdate.observerType;
|
||||
perfStats.nodesCount = subtreeUpdate.nodes.count;
|
||||
perfStats.eventsCount = subtreeUpdateEvent.frameworkEvents.count;
|
||||
perfStats.start = UIDTimeIntervalToMS(subtreeUpdate.timestamp);
|
||||
perfStats.traversalMS = subtreeUpdate.traversalMS;
|
||||
perfStats.snapshotMS = subtreeUpdate.snapshotMS;
|
||||
perfStats.queuingMS = UIDMonotonicTimeConvertMachUnitsToMS(t1 - t0);
|
||||
perfStats.frameworkEventsMS = UIDMonotonicTimeConvertMachUnitsToMS(t2 - t1);
|
||||
perfStats.deferredComputationMS =
|
||||
UIDMonotonicTimeConvertMachUnitsToMS(t3 - t2);
|
||||
perfStats.serializationMS = UIDMonotonicTimeConvertMachUnitsToMS(t4 - t3);
|
||||
perfStats.socketMS = UIDMonotonicTimeConvertMachUnitsToMS(t5 - t4);
|
||||
perfStats.payloadSize = payloadSize;
|
||||
perfStats.dynamicMeasures = UIDPerformanceGet();
|
||||
|
||||
[self->_context.connection send:[UIDPerfStatsEvent name]
|
||||
withRawParams:UID_toJSON(perfStats)];
|
||||
});
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
* 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 <UIKit/UIKit.h>
|
||||
#import "UIDTreeObserverBuilder.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface UIDUIApplicationObserver : UIDTreeObserver<UIApplication*>
|
||||
|
||||
@end
|
||||
|
||||
@interface UIDUIApplicationObserverBuilder : NSObject<UIDTreeObserverBuilder>
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,121 @@
|
||||
/*
|
||||
* 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 "UIDUIApplicationObserver.h"
|
||||
#import "UIDContext.h"
|
||||
#import "UIDMainThread.h"
|
||||
#import "UIDUIViewBasicObserver.h"
|
||||
|
||||
#define UID_THROTTLE_SECONDS 1
|
||||
|
||||
@interface UIDUIApplicationObserver ()<UIDUIViewObserverDelegate> {
|
||||
UIDContext* _context;
|
||||
UIDUIViewBasicObserver* _viewObserver;
|
||||
|
||||
CFRunLoopObserverRef _observer;
|
||||
NSTimeInterval _lastInvocationTimestamp;
|
||||
bool _dirty;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation UIDUIApplicationObserver
|
||||
|
||||
- (instancetype)initWithContext:(UIDContext*)context {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
_context = context;
|
||||
_lastInvocationTimestamp = 0;
|
||||
_dirty = true;
|
||||
_viewObserver = [[UIDUIViewBasicObserver alloc] initWithContext:_context
|
||||
delegate:self];
|
||||
self.type = @"UIApplication";
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)subscribe:(UIApplication*)node {
|
||||
__weak typeof(self) weakSelf = self;
|
||||
_observer = CFRunLoopObserverCreateWithHandler(
|
||||
kCFAllocatorDefault,
|
||||
kCFRunLoopBeforeWaiting,
|
||||
true,
|
||||
INT_MAX,
|
||||
^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
|
||||
typeof(self) strongSelf = weakSelf;
|
||||
if (strongSelf) {
|
||||
NSTimeInterval currentTimestamp =
|
||||
[NSDate timeIntervalSinceReferenceDate];
|
||||
if (strongSelf->_lastInvocationTimestamp == 0 ||
|
||||
(currentTimestamp - strongSelf->_lastInvocationTimestamp >=
|
||||
UID_THROTTLE_SECONDS)) {
|
||||
strongSelf->_lastInvocationTimestamp = currentTimestamp;
|
||||
if (strongSelf->_dirty) {
|
||||
strongSelf->_dirty = false;
|
||||
[self processNode:strongSelf->_context.application
|
||||
withSnapshot:true
|
||||
withContext:strongSelf->_context];
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
CFRunLoopAddObserver(CFRunLoopGetMain(), _observer, kCFRunLoopCommonModes);
|
||||
|
||||
[[NSNotificationCenter defaultCenter]
|
||||
addObserver:self
|
||||
selector:@selector(orientationChanged:)
|
||||
name:UIDeviceOrientationDidChangeNotification
|
||||
object:nil];
|
||||
}
|
||||
|
||||
- (void)unsubscribe {
|
||||
CFRunLoopRemoveObserver(CFRunLoopGetMain(), _observer, kCFRunLoopCommonModes);
|
||||
CFRelease(_observer);
|
||||
_observer = nil;
|
||||
|
||||
[[NSNotificationCenter defaultCenter]
|
||||
removeObserver:self
|
||||
name:UIDeviceOrientationDidChangeNotification
|
||||
object:nil];
|
||||
|
||||
_dirty = true;
|
||||
}
|
||||
|
||||
- (void)orientationChanged:(NSNotification*)notification {
|
||||
/**
|
||||
Do not mark as dirty immediately as the view draws before
|
||||
is animated into position. Dispatch after the same throttle amount
|
||||
achieves the desired effect.
|
||||
*/
|
||||
UIDRunBlockOnMainThreadAfter(
|
||||
^{
|
||||
self->_dirty = true;
|
||||
},
|
||||
UID_THROTTLE_SECONDS);
|
||||
}
|
||||
|
||||
- (void)viewUpdateWith:(UIView*)node {
|
||||
_dirty = true;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation UIDUIApplicationObserverBuilder
|
||||
|
||||
- (BOOL)canBuildFor:(id)node {
|
||||
return [node isKindOfClass:[UIApplication class]];
|
||||
}
|
||||
|
||||
- (UIDTreeObserver*)buildWithContext:(UIDContext*)context {
|
||||
return [[UIDUIApplicationObserver alloc] initWithContext:context];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
* 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 <UIKit/UIKit.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
typedef NS_ENUM(NSUInteger, UIDViewHierarchyUpdate) {
|
||||
UIDViewHierarchyUpdateAddChild,
|
||||
UIDViewHierarchyUpdateRemoveChild,
|
||||
};
|
||||
|
||||
@protocol UIDUIKitObserverDelegate<NSObject>
|
||||
|
||||
- (void)onDisplayLayer:(UIView*)view;
|
||||
- (void)onDrawLayer:(UIView*)view;
|
||||
- (void)onNeedsDisplay:(UIView*)view;
|
||||
- (void)onHidden:(UIView*)view;
|
||||
- (void)onView:(UIView*)view didUpdateHierarchy:(UIDViewHierarchyUpdate)update;
|
||||
|
||||
@end
|
||||
|
||||
@interface UIDUIKitObserver : NSObject
|
||||
|
||||
+ (instancetype)sharedInstance;
|
||||
+ (void)enable;
|
||||
|
||||
- (void)setDrawObservationEnabled:(BOOL)enabled;
|
||||
|
||||
@property(nonatomic, weak) id<UIDUIKitObserverDelegate> delegate;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* 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 "UIDUIKitObserver.h"
|
||||
#import "UIView+Observer.h"
|
||||
|
||||
@implementation UIDUIKitObserver
|
||||
|
||||
+ (instancetype)sharedInstance {
|
||||
static UIDUIKitObserver* instance = nil;
|
||||
|
||||
static dispatch_once_t onceToken;
|
||||
dispatch_once(&onceToken, ^{
|
||||
instance = [UIDUIKitObserver new];
|
||||
});
|
||||
|
||||
return instance;
|
||||
}
|
||||
|
||||
+ (void)enable {
|
||||
static dispatch_once_t onceToken;
|
||||
dispatch_once(&onceToken, ^{
|
||||
[UIView UID_observe];
|
||||
});
|
||||
}
|
||||
|
||||
- (void)setDrawObservationEnabled:(BOOL)enabled {
|
||||
[UIView UID_setDrawObservationEnabled:enabled];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,27 @@
|
||||
/*
|
||||
* 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 <FlipperKit/SKMacros.h>
|
||||
#import <UIKit/UIKit.h>
|
||||
#import "UIDUIViewObserverDelegate.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@class UIDContext;
|
||||
|
||||
@interface UIDUIViewBasicObserver : NSObject
|
||||
|
||||
- (instancetype)initWithContext:(UIDContext*)context
|
||||
delegate:(id<UIDUIViewObserverDelegate>)delegate;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* 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 "UIDUIViewBasicObserver.h"
|
||||
#import "UIDContext.h"
|
||||
#import "UIDUIKitObserver.h"
|
||||
|
||||
@interface UIDUIViewBasicObserver ()<UIDUIKitObserverDelegate> {
|
||||
UIDContext* _context;
|
||||
}
|
||||
|
||||
@property(nonatomic, weak) id<UIDUIViewObserverDelegate> delegate;
|
||||
|
||||
@end
|
||||
|
||||
@implementation UIDUIViewBasicObserver
|
||||
|
||||
- (instancetype)initWithContext:(UIDContext*)context
|
||||
delegate:(id<UIDUIViewObserverDelegate>)delegate {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
_context = context;
|
||||
_delegate = delegate;
|
||||
|
||||
[UIDUIKitObserver sharedInstance].delegate = self;
|
||||
[UIDUIKitObserver enable];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc {
|
||||
[UIDUIKitObserver sharedInstance].delegate = nil;
|
||||
}
|
||||
|
||||
- (void)onDisplayLayer:(nonnull UIView*)view {
|
||||
[self.delegate viewUpdateWith:view];
|
||||
}
|
||||
|
||||
- (void)onDrawLayer:(nonnull UIView*)view {
|
||||
[self.delegate viewUpdateWith:view];
|
||||
}
|
||||
|
||||
- (void)onNeedsDisplay:(nonnull UIView*)view {
|
||||
[self.delegate viewUpdateWith:view];
|
||||
}
|
||||
|
||||
- (void)onHidden:(nonnull UIView*)view {
|
||||
[self.delegate viewUpdateWith:view];
|
||||
}
|
||||
|
||||
- (void)onView:(UIView*)view didUpdateHierarchy:(UIDViewHierarchyUpdate)update {
|
||||
[self.delegate viewUpdateWith:view];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,16 @@
|
||||
/*
|
||||
* 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 <UIKit/UIKit.h>
|
||||
|
||||
@protocol UIDUIViewObserverDelegate<NSObject>
|
||||
- (void)viewUpdateWith:(nonnull UIView*)view;
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
* 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 <FlipperKit/SKMacros.h>
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
FB_LINK_REQUIRE_CATEGORY(UIView_Observer)
|
||||
@interface UIView (Observer)
|
||||
|
||||
+ (void)UID_observe;
|
||||
+ (void)UID_setDrawObservationEnabled:(BOOL)enabled;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,158 @@
|
||||
/*
|
||||
* 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 "UIDSwizzle.h"
|
||||
#import "UIDUIKitObserver.h"
|
||||
#import "UIView+Observer.h"
|
||||
|
||||
static BOOL UID_DrawObserverEnabled = true;
|
||||
|
||||
FB_LINKABLE(UIView_Observer)
|
||||
@implementation UIView (Observer)
|
||||
|
||||
+ (void)UID_setDrawObservationEnabled:(BOOL)enabled {
|
||||
UID_DrawObserverEnabled = enabled;
|
||||
}
|
||||
|
||||
+ (void)UID_observe {
|
||||
static dispatch_once_t onceToken;
|
||||
dispatch_once(&onceToken, ^{
|
||||
UIDSwizzleMethod(
|
||||
[self class],
|
||||
@selector(drawLayer:inContext:),
|
||||
@selector(UID_drawLayer:inContext:),
|
||||
false);
|
||||
UIDSwizzleMethod(
|
||||
[self class],
|
||||
@selector(displayLayer:),
|
||||
@selector(UID_displayLayer:),
|
||||
false);
|
||||
UIDSwizzleMethod(
|
||||
[self class],
|
||||
@selector(setNeedsDisplay),
|
||||
@selector(UID_setNeedsDisplay),
|
||||
false);
|
||||
UIDSwizzleMethod(
|
||||
[self class],
|
||||
@selector(addSubview:),
|
||||
@selector(UID_addSubview:),
|
||||
false);
|
||||
UIDSwizzleMethod(
|
||||
[self class],
|
||||
@selector(insertSubview:atIndex:),
|
||||
@selector(UID_insertSubview:atIndex:),
|
||||
false);
|
||||
UIDSwizzleMethod(
|
||||
[self class],
|
||||
@selector(insertSubview:aboveSubview:),
|
||||
@selector(UID_insertSubview:aboveSubview:),
|
||||
false);
|
||||
UIDSwizzleMethod(
|
||||
[self class],
|
||||
@selector(insertSubview:belowSubview:),
|
||||
@selector(UID_insertSubview:belowSubview:),
|
||||
false);
|
||||
UIDSwizzleMethod(
|
||||
[self class],
|
||||
@selector(removeFromSuperview),
|
||||
@selector(UID_removeFromSuperview),
|
||||
false);
|
||||
UIDSwizzleMethod(
|
||||
[self class], @selector(setHidden:), @selector(UID_setHidden:), true);
|
||||
});
|
||||
}
|
||||
|
||||
- (void)UID_displayLayer:(CALayer*)layer {
|
||||
[self UID_displayLayer:layer];
|
||||
if (UID_DrawObserverEnabled) {
|
||||
[[UIDUIKitObserver sharedInstance].delegate onDisplayLayer:self];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)UID_drawLayer:(CALayer*)layer inContext:(CGContextRef)ctx {
|
||||
[self UID_drawLayer:layer inContext:ctx];
|
||||
if (UID_DrawObserverEnabled) {
|
||||
[[UIDUIKitObserver sharedInstance].delegate onDrawLayer:self];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)UID_setNeedsDisplay {
|
||||
[self UID_setNeedsDisplay];
|
||||
if (UID_DrawObserverEnabled) {
|
||||
[[UIDUIKitObserver sharedInstance].delegate onNeedsDisplay:self];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)UID_setHidden:(BOOL)isHidden {
|
||||
[self UID_setHidden:isHidden];
|
||||
if (UID_DrawObserverEnabled) {
|
||||
[[UIDUIKitObserver sharedInstance].delegate onHidden:self];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)UID_addSubview:(UIView*)view {
|
||||
[self UID_addSubview:view];
|
||||
if (UID_DrawObserverEnabled) {
|
||||
[[UIDUIKitObserver sharedInstance].delegate
|
||||
onView:self
|
||||
didUpdateHierarchy:UIDViewHierarchyUpdateAddChild];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)UID_insertSubview:(UIView*)subview atIndex:(NSInteger)index {
|
||||
[self UID_insertSubview:subview atIndex:index];
|
||||
if (UID_DrawObserverEnabled) {
|
||||
[[UIDUIKitObserver sharedInstance].delegate
|
||||
onView:self
|
||||
didUpdateHierarchy:UIDViewHierarchyUpdateAddChild];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)UID_insertSubview:(UIView*)subview
|
||||
aboveSubview:(UIView*)siblingSubview {
|
||||
[self UID_insertSubview:subview aboveSubview:siblingSubview];
|
||||
if (UID_DrawObserverEnabled) {
|
||||
[[UIDUIKitObserver sharedInstance].delegate
|
||||
onView:self
|
||||
didUpdateHierarchy:UIDViewHierarchyUpdateAddChild];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)UID_insertSubview:(UIView*)subview
|
||||
belowSubview:(UIView*)siblingSubview {
|
||||
[self UID_insertSubview:subview belowSubview:siblingSubview];
|
||||
if (UID_DrawObserverEnabled) {
|
||||
[[UIDUIKitObserver sharedInstance].delegate
|
||||
onView:self
|
||||
didUpdateHierarchy:UIDViewHierarchyUpdateAddChild];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)UID_removeFromSuperview {
|
||||
UIView* oldSuperview = self.superview;
|
||||
[self UID_removeFromSuperview];
|
||||
/**
|
||||
Not enough to check if draw observation is enabled (which is disabled
|
||||
during snapshots). An extra check is needed in case the old superview is
|
||||
_UISnapshotWindow_. The reason is _UIView_removeFromSuperview_ can also be
|
||||
called during deallocation after the screenshot is taken and observation is
|
||||
re-enabled. Without the extra check, it creates a recursive loop in which
|
||||
the view is constantly marked as dirty.
|
||||
*/
|
||||
if (UID_DrawObserverEnabled &&
|
||||
![oldSuperview isKindOfClass:NSClassFromString(@"_UISnapshotWindow")]) {
|
||||
[[UIDUIKitObserver sharedInstance].delegate
|
||||
onView:oldSuperview
|
||||
didUpdateHierarchy:UIDViewHierarchyUpdateRemoveChild];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
* 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 <FlipperKit/SKMacros.h>
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "UIDFoundation.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
FB_LINK_REQUIRE_CATEGORY(NSArray_Foundation)
|
||||
@interface NSArray<UIDFoundation>(Foundation)<UIDFoundation>
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
* 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 "NSArray+Foundation.h"
|
||||
|
||||
FB_LINKABLE(NSArray_Foundation)
|
||||
@implementation NSArray (Foundation)
|
||||
|
||||
- (id)toFoundation {
|
||||
NSMutableArray* copy = [NSMutableArray arrayWithCapacity:self.count];
|
||||
for (id<UIDFoundation> object in self) {
|
||||
[copy addObject:[object toFoundation]];
|
||||
}
|
||||
return copy;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
* 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 <FlipperKit/SKMacros.h>
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "UIDFoundation.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
FB_LINK_REQUIRE_CATEGORY(NSDictionary_Foundation)
|
||||
@interface NSDictionary (Foundation)<UIDFoundation>
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
* 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 "NSDictionary+Foundation.h"
|
||||
|
||||
FB_LINKABLE(NSDictionary_Foundation)
|
||||
@implementation NSDictionary (Foundation)
|
||||
|
||||
- (id)toFoundation {
|
||||
NSMutableDictionary* copy =
|
||||
[NSMutableDictionary dictionaryWithCapacity:self.count];
|
||||
|
||||
for (id key in self) {
|
||||
[copy setObject:[self[key] toFoundation] forKey:[key description]];
|
||||
}
|
||||
|
||||
return copy;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
* 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 <FlipperKit/SKMacros.h>
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "UIDFoundation.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
FB_LINK_REQUIRE_CATEGORY(NSNull_Foundation)
|
||||
@interface NSNull (Foundation)<UIDFoundation>
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,21 @@
|
||||
/*
|
||||
* 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 "NSNull+Foundation.h"
|
||||
|
||||
FB_LINKABLE(NSNull_Foundation)
|
||||
@implementation NSNull (Foundation)
|
||||
|
||||
- (id)toFoundation {
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
* 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 <FlipperKit/SKMacros.h>
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "UIDFoundation.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
FB_LINK_REQUIRE_CATEGORY(NSSet_Foundation)
|
||||
@interface NSSet<UIDFoundation>(Foundation)<UIDFoundation>
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
* 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 "NSSet+Foundation.h"
|
||||
|
||||
FB_LINKABLE(NSSet_Foundation)
|
||||
@implementation NSSet (Foundation)
|
||||
|
||||
- (id)toFoundation {
|
||||
NSMutableArray* copy = [NSMutableArray arrayWithCapacity:self.count];
|
||||
for (id<UIDFoundation> object in self) {
|
||||
[copy addObject:[object toFoundation]];
|
||||
}
|
||||
return copy;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
* 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 <FlipperKit/SKMacros.h>
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "UIDFoundation.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
FB_LINK_REQUIRE_CATEGORY(NSString_Foundation)
|
||||
@interface NSString (Foundation)<UIDFoundation>
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,21 @@
|
||||
/*
|
||||
* 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 "NSString+Foundation.h"
|
||||
|
||||
FB_LINKABLE(NSString_Foundation)
|
||||
@implementation NSString (Foundation)
|
||||
|
||||
- (id)toFoundation {
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
* 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 <FlipperKit/SKMacros.h>
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "UIDFoundation.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
FB_LINK_REQUIRE_CATEGORY(NSValue_Foundation)
|
||||
@interface NSValue (Foundation)<UIDFoundation>
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,21 @@
|
||||
/*
|
||||
* 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 "NSValue+Foundation.h"
|
||||
|
||||
FB_LINKABLE(NSValue_Foundation)
|
||||
@implementation NSValue (Foundation)
|
||||
|
||||
- (id)toFoundation {
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* 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 <FlipperKit/SKMacros.h>
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "UIDBounds.h"
|
||||
#import "UIDFoundation.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
FB_LINK_REQUIRE_CATEGORY(UIDBounds_Foundation)
|
||||
@interface UIDBounds (Foundation)<UIDFoundation>
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* 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 "UIDBounds+Foundation.h"
|
||||
|
||||
FB_LINKABLE(UIDBounds_Foundation)
|
||||
@implementation UIDBounds (Foundation)
|
||||
|
||||
- (id)toFoundation {
|
||||
return @{
|
||||
@"x" : [NSNumber numberWithInt:self.x],
|
||||
@"y" : [NSNumber numberWithInt:self.y],
|
||||
@"width" : [NSNumber numberWithInt:self.width],
|
||||
@"height" : [NSNumber numberWithInt:self.height],
|
||||
};
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* 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 <FlipperKit/SKMacros.h>
|
||||
#import <UIKit/UIKit.h>
|
||||
#import "UIDEdgeInsets.h"
|
||||
#import "UIDFoundation.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
FB_LINK_REQUIRE_CATEGORY(UIDEdgeInsets_Foundation)
|
||||
@interface UIDEdgeInsets (Foundation)<UIDFoundation>
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* 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 "UIDEdgeInsets+Foundation.h"
|
||||
|
||||
FB_LINKABLE(UIDEdgeInsets_Foundation)
|
||||
@implementation UIDEdgeInsets (Foundation)
|
||||
|
||||
- (id)toFoundation {
|
||||
return @{
|
||||
@"top" : [NSNumber numberWithFloat:self.top],
|
||||
@"right" : [NSNumber numberWithFloat:self.right],
|
||||
@"bottom" : [NSNumber numberWithFloat:self.bottom],
|
||||
@"left" : [NSNumber numberWithFloat:self.left],
|
||||
};
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,16 @@
|
||||
/*
|
||||
* 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
|
||||
|
||||
@protocol UIDFoundation
|
||||
|
||||
- (id)toFoundation;
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* 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 <FlipperKit/SKMacros.h>
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "UIDFoundation.h"
|
||||
#import "UIDFrameworkEvent.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
FB_LINK_REQUIRE_CATEGORY(UIDFrameworkEvent_Foundation)
|
||||
@interface UIDFrameworkEvent (Foundation)<UIDFoundation>
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* 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 "UIDFrameworkEvent+Foundation.h"
|
||||
|
||||
FB_LINKABLE(UIDFrameworkEvent_Foundation)
|
||||
@implementation UIDFrameworkEvent (Foundation)
|
||||
|
||||
- (id)toFoundation {
|
||||
NSMutableDictionary* data = [NSMutableDictionary dictionaryWithDictionary:@{
|
||||
@"nodeId" : [NSNumber numberWithUnsignedInt:self.nodeIdentifier],
|
||||
@"type" : self.type,
|
||||
@"timestamp" :
|
||||
[NSNumber numberWithDouble:self.timestamp.timeIntervalSince1970],
|
||||
@"payload" : self.payload ?: @{},
|
||||
}];
|
||||
|
||||
if (self.stacktrace) {
|
||||
[data setObject:@{@"stacktrace" : self.stacktrace, @"type" : @"stacktrace"}
|
||||
forKey:@"attribution"];
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* 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 <FlipperKit/SKMacros.h>
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "UIDFoundation.h"
|
||||
#import "UIDFrameworkEventMetadata.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
FB_LINK_REQUIRE_CATEGORY(UIDFrameworkEventMetadata_Foundation)
|
||||
@interface UIDFrameworkEventMetadata (Foundation)<UIDFoundation>
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
* 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 "NSDictionary+Foundation.h"
|
||||
#import "UIDFrameworkEventMetadata+Foundation.h"
|
||||
|
||||
FB_LINKABLE(UIDFrameworkEventMetadata_Foundation)
|
||||
@implementation UIDFrameworkEventMetadata (Foundation)
|
||||
|
||||
- (id)toFoundation {
|
||||
return @{
|
||||
@"type" : self.type,
|
||||
@"documentation" : self.documentation,
|
||||
};
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* 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 <FlipperKit/SKMacros.h>
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "UIDFoundation.h"
|
||||
#import "UIDInitEvent.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
FB_LINK_REQUIRE_CATEGORY(UIDInitEvent_Foundation)
|
||||
@interface UIDInitEvent (Foundation)<UIDFoundation>
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,27 @@
|
||||
/*
|
||||
* 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 "NSArray+Foundation.h"
|
||||
#import "UIDInitEvent+Foundation.h"
|
||||
|
||||
FB_LINKABLE(UIDInitEvent_Foundation)
|
||||
@implementation UIDInitEvent (Foundation)
|
||||
|
||||
- (id)toFoundation {
|
||||
return @{
|
||||
@"rootId" : [NSNumber numberWithUnsignedInt:self.rootId],
|
||||
@"frameworkEventMetadata" : self.frameworkEventMetadata
|
||||
? [self.frameworkEventMetadata toFoundation]
|
||||
: @[],
|
||||
};
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* 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 <FlipperKit/SKMacros.h>
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "UIDFoundation.h"
|
||||
#import "UIDInspectable.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
FB_LINK_REQUIRE_CATEGORY(UIDInspectable_Foundation)
|
||||
@interface UIDInspectable (Foundation)<UIDFoundation>
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,21 @@
|
||||
/*
|
||||
* 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 "UIDInspectable+Foundation.h"
|
||||
|
||||
FB_LINKABLE(UIDInspectable_Foundation)
|
||||
@implementation UIDInspectable (Foundation)
|
||||
|
||||
- (id)toFoundation {
|
||||
return @{};
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* 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 <FlipperKit/SKMacros.h>
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "UIDFoundation.h"
|
||||
#import "UIDInspectable.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
FB_LINK_REQUIRE_CATEGORY(UIDInspectableArray_Foundation)
|
||||
@interface UIDInspectableArray (Foundation)<UIDFoundation>
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,27 @@
|
||||
/*
|
||||
* 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 "UIDInspectable+Foundation.h"
|
||||
#import "UIDInspectableArray+Foundation.h"
|
||||
|
||||
FB_LINKABLE(UIDInspectableArray_Foundation)
|
||||
@implementation UIDInspectableArray (Foundation)
|
||||
|
||||
- (id)toFoundation {
|
||||
NSMutableArray* items = [NSMutableArray arrayWithCapacity:self.items.count];
|
||||
for (UIDInspectable* object in self.items) {
|
||||
[items addObject:[object toFoundation]];
|
||||
}
|
||||
|
||||
return @{@"type" : @"array", @"items" : items};
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#endif
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user