Back out "Fabric: Using `SurfaceHandler` on iOS"

Summary:
This is a backout of D24290778 (33d6091cac).
The original diff causes T85097896 and probably T85069775. For now I am going to unland this, and then I will re-land this after the cut with a fix.

Original commit changeset: 62b600c3f1b2
Changelog: [Internal] Fabric-specific internal change.

Reviewed By: sammy-SC

Differential Revision: D26515027

fbshipit-source-id: 057663b092e6b1d74db83c40d656b2ae142bd622
This commit is contained in:
Valentin Shergin 2021-02-18 12:37:05 -08:00 коммит произвёл Facebook GitHub Bot
Родитель 10f8c1a1c0
Коммит 0bb459b149
6 изменённых файлов: 344 добавлений и 156 удалений

Просмотреть файл

@ -14,7 +14,6 @@
#import <react/renderer/core/LayoutContext.h>
#import <react/renderer/mounting/MountingCoordinator.h>
#import <react/renderer/scheduler/SchedulerToolbox.h>
#import <react/renderer/scheduler/SurfaceHandler.h>
#import <react/utils/ContextContainer.h>
NS_ASSUME_NONNULL_BEGIN
@ -48,13 +47,26 @@ NS_ASSUME_NONNULL_BEGIN
- (instancetype)initWithToolbox:(facebook::react::SchedulerToolbox)toolbox;
- (void)registerSurface:(facebook::react::SurfaceHandler const &)surfaceHandler;
- (void)unregisterSurface:(facebook::react::SurfaceHandler const &)surfaceHandler;
- (void)startSurfaceWithSurfaceId:(facebook::react::SurfaceId)surfaceId
moduleName:(NSString *)moduleName
initialProps:(NSDictionary *)initialProps
layoutConstraints:(facebook::react::LayoutConstraints)layoutConstraints
layoutContext:(facebook::react::LayoutContext)layoutContext;
- (void)stopSurfaceWithSurfaceId:(facebook::react::SurfaceId)surfaceId;
- (CGSize)measureSurfaceWithLayoutConstraints:(facebook::react::LayoutConstraints)layoutConstraints
layoutContext:(facebook::react::LayoutContext)layoutContext
surfaceId:(facebook::react::SurfaceId)surfaceId;
- (void)constraintSurfaceLayoutWithLayoutConstraints:(facebook::react::LayoutConstraints)layoutConstraints
layoutContext:(facebook::react::LayoutContext)layoutContext
surfaceId:(facebook::react::SurfaceId)surfaceId;
- (facebook::react::ComponentDescriptor const *)findComponentDescriptorByHandle_DO_NOT_USE_THIS_IS_BROKEN:
(facebook::react::ComponentHandle)handle;
- (void)setupAnimationDriver:(facebook::react::SurfaceHandler const &)surfaceHandler;
- (facebook::react::MountingCoordinator::Shared)mountingCoordinatorWithSurfaceId:(facebook::react::SurfaceId)surfaceId;
- (void)onAnimationStarted;

Просмотреть файл

@ -139,14 +139,43 @@ class LayoutAnimationDelegateProxy : public LayoutAnimationStatusDelegate, publi
_animationDriver = nullptr;
}
- (void)registerSurface:(facebook::react::SurfaceHandler const &)surfaceHandler
- (void)startSurfaceWithSurfaceId:(SurfaceId)surfaceId
moduleName:(NSString *)moduleName
initialProps:(NSDictionary *)initialProps
layoutConstraints:(LayoutConstraints)layoutConstraints
layoutContext:(LayoutContext)layoutContext
{
_scheduler->registerSurface(surfaceHandler);
SystraceSection s("-[RCTScheduler startSurfaceWithSurfaceId:...]");
auto props = convertIdToFollyDynamic(initialProps);
_scheduler->startSurface(surfaceId, RCTStringFromNSString(moduleName), props, layoutConstraints, layoutContext);
_scheduler->findMountingCoordinator(surfaceId)->setMountingOverrideDelegate(_animationDriver);
_scheduler->renderTemplateToSurface(
surfaceId, props.getDefault("navigationConfig").getDefault("initialUITemplate", "").getString());
}
- (void)unregisterSurface:(facebook::react::SurfaceHandler const &)surfaceHandler
- (void)stopSurfaceWithSurfaceId:(SurfaceId)surfaceId
{
_scheduler->unregisterSurface(surfaceHandler);
SystraceSection s("-[RCTScheduler stopSurfaceWithSurfaceId:]");
_scheduler->stopSurface(surfaceId);
}
- (CGSize)measureSurfaceWithLayoutConstraints:(LayoutConstraints)layoutConstraints
layoutContext:(LayoutContext)layoutContext
surfaceId:(SurfaceId)surfaceId
{
SystraceSection s("-[RCTScheduler measureSurfaceWithLayoutConstraints:]");
return RCTCGSizeFromSize(_scheduler->measureSurface(surfaceId, layoutConstraints, layoutContext));
}
- (void)constraintSurfaceLayoutWithLayoutConstraints:(LayoutConstraints)layoutConstraints
layoutContext:(LayoutContext)layoutContext
surfaceId:(SurfaceId)surfaceId
{
SystraceSection s("-[RCTScheduler constraintSurfaceLayoutWithLayoutConstraints:]");
_scheduler->constraintSurfaceLayout(surfaceId, layoutConstraints, layoutContext);
}
- (ComponentDescriptor const *)findComponentDescriptorByHandle_DO_NOT_USE_THIS_IS_BROKEN:(ComponentHandle)handle
@ -154,9 +183,9 @@ class LayoutAnimationDelegateProxy : public LayoutAnimationStatusDelegate, publi
return _scheduler->findComponentDescriptorByHandle_DO_NOT_USE_THIS_IS_BROKEN(handle);
}
- (void)setupAnimationDriver:(facebook::react::SurfaceHandler const &)surfaceHandler
- (MountingCoordinator::Shared)mountingCoordinatorWithSurfaceId:(SurfaceId)surfaceId
{
surfaceHandler.getMountingCoordinator()->setMountingOverrideDelegate(_animationDriver);
return _scheduler->findMountingCoordinator(surfaceId);
}
- (void)onAnimationStarted

Просмотреть файл

@ -11,7 +11,6 @@
#import <React/RCTSurfacePresenterStub.h>
#import <React/RCTSurfaceStage.h>
#import <ReactCommon/RuntimeExecutor.h>
#import <react/renderer/scheduler/SurfaceHandler.h>
#import <react/utils/ContextContainer.h>
NS_ASSUME_NONNULL_BEGIN
@ -46,25 +45,34 @@ NS_ASSUME_NONNULL_BEGIN
@interface RCTSurfacePresenter (Surface) <RCTSurfacePresenterStub>
/*
/**
* Surface uses these methods to register itself in the Presenter.
*/
- (void)registerSurface:(RCTFabricSurface *)surface;
- (void)unregisterSurface:(RCTFabricSurface *)surface;
@property (readonly) RCTMountingManager *mountingManager;
- (void)setProps:(NSDictionary *)props surface:(RCTFabricSurface *)surface;
- (nullable RCTFabricSurface *)surfaceForRootTag:(ReactTag)rootTag;
/**
* Measures the Surface with given constraints.
*/
- (CGSize)sizeThatFitsMinimumSize:(CGSize)minimumSize
maximumSize:(CGSize)maximumSize
surface:(RCTFabricSurface *)surface;
/**
* Sets `minimumSize` and `maximumSize` layout constraints for the Surface.
*/
- (void)setMinimumSize:(CGSize)minimumSize maximumSize:(CGSize)maximumSize surface:(RCTFabricSurface *)surface;
- (BOOL)synchronouslyUpdateViewOnUIThread:(NSNumber *)reactTag props:(NSDictionary *)props;
- (void)setupAnimationDriverWithSurfaceHandler:(facebook::react::SurfaceHandler const &)surfaceHandler;
- (BOOL)synchronouslyWaitSurface:(RCTFabricSurface *)surface timeout:(NSTimeInterval)timeout;
/*
* Deprecated.
* Use `RCTMountingTransactionObserverCoordinator` instead.
*/
- (void)addObserver:(id<RCTSurfacePresenterObserver>)observer;
- (void)removeObserver:(id<RCTSurfacePresenterObserver>)observer;
/*

Просмотреть файл

@ -40,6 +40,25 @@
using namespace facebook::react;
static inline LayoutConstraints RCTGetLayoutConstraintsForSize(CGSize minimumSize, CGSize maximumSize)
{
return {
.minimumSize = RCTSizeFromCGSize(minimumSize),
.maximumSize = RCTSizeFromCGSize(maximumSize),
.layoutDirection = RCTLayoutDirection([[RCTI18nUtil sharedInstance] isRTL]),
};
}
static inline LayoutContext RCTGetLayoutContext(CGPoint viewportOffset)
{
return {
.pointScaleFactor = RCTScreenScale(),
.swapLeftAndRightInRTL =
[[RCTI18nUtil sharedInstance] isRTL] && [[RCTI18nUtil sharedInstance] doLeftAndRightSwapInRTL],
.fontSizeMultiplier = RCTFontSizeMultiplier(),
.viewportOffset = RCTPointFromCGPoint(viewportOffset)};
}
static dispatch_queue_t RCTGetBackgroundQueue()
{
static dispatch_queue_t queue;
@ -100,16 +119,16 @@ static BackgroundExecutor RCTGetBackgroundExecutor()
_observers = [NSMutableArray array];
_scheduler = [self _createScheduler];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(_handleContentSizeCategoryDidChangeNotification:)
name:UIContentSizeCategoryDidChangeNotification
object:nil];
}
return self;
}
- (RCTMountingManager *)mountingManager
{
return _mountingManager;
}
- (RCTScheduler *_Nullable)_scheduler
{
std::lock_guard<std::mutex> lock(_schedulerAccessMutex);
@ -144,10 +163,10 @@ static BackgroundExecutor RCTGetBackgroundExecutor()
- (void)registerSurface:(RCTFabricSurface *)surface
{
[_surfaceRegistry registerSurface:surface];
RCTScheduler *scheduler = [self _scheduler];
[_surfaceRegistry registerSurface:surface];
if (scheduler) {
[scheduler registerSurface:surface.surfaceHandler];
[self _startSurface:surface scheduler:scheduler];
}
}
@ -155,16 +174,54 @@ static BackgroundExecutor RCTGetBackgroundExecutor()
{
RCTScheduler *scheduler = [self _scheduler];
if (scheduler) {
[scheduler unregisterSurface:surface.surfaceHandler];
[self _stopSurface:surface scheduler:scheduler];
}
[_surfaceRegistry unregisterSurface:surface];
}
- (void)setProps:(NSDictionary *)props surface:(RCTFabricSurface *)surface
{
RCTScheduler *scheduler = [self _scheduler];
if (scheduler) {
[self _stopSurface:surface scheduler:scheduler];
[self _startSurface:surface scheduler:scheduler];
}
}
- (RCTFabricSurface *)surfaceForRootTag:(ReactTag)rootTag
{
return [_surfaceRegistry surfaceForRootTag:rootTag];
}
- (CGSize)sizeThatFitsMinimumSize:(CGSize)minimumSize
maximumSize:(CGSize)maximumSize
surface:(RCTFabricSurface *)surface
{
RCTScheduler *scheduler = [self _scheduler];
if (!scheduler) {
return minimumSize;
}
LayoutContext layoutContext = RCTGetLayoutContext(surface.viewportOffset);
LayoutConstraints layoutConstraints = RCTGetLayoutConstraintsForSize(minimumSize, maximumSize);
return [scheduler measureSurfaceWithLayoutConstraints:layoutConstraints
layoutContext:layoutContext
surfaceId:surface.rootTag];
}
- (void)setMinimumSize:(CGSize)minimumSize maximumSize:(CGSize)maximumSize surface:(RCTFabricSurface *)surface
{
RCTScheduler *scheduler = [self _scheduler];
if (!scheduler) {
return;
}
LayoutContext layoutContext = RCTGetLayoutContext(surface.viewportOffset);
LayoutConstraints layoutConstraints = RCTGetLayoutConstraintsForSize(minimumSize, maximumSize);
[scheduler constraintSurfaceLayoutWithLayoutConstraints:layoutConstraints
layoutContext:layoutContext
surfaceId:surface.rootTag];
}
- (UIView *)findComponentViewWithTag_DO_NOT_USE_DEPRECATED:(NSInteger)tag
{
UIView<RCTComponentViewProtocol> *componentView =
@ -196,9 +253,22 @@ static BackgroundExecutor RCTGetBackgroundExecutor()
return YES;
}
- (void)setupAnimationDriverWithSurfaceHandler:(facebook::react::SurfaceHandler const &)surfaceHandler
- (BOOL)synchronouslyWaitSurface:(RCTFabricSurface *)surface timeout:(NSTimeInterval)timeout
{
[[self _scheduler] setupAnimationDriver:surfaceHandler];
RCTScheduler *scheduler = [self _scheduler];
if (!scheduler) {
return NO;
}
auto mountingCoordinator = [scheduler mountingCoordinatorWithSurfaceId:surface.rootTag];
if (!mountingCoordinator->waitForTransaction(std::chrono::duration<NSTimeInterval>(timeout))) {
return NO;
}
[_mountingManager scheduleTransaction:mountingCoordinator];
return YES;
}
- (BOOL)suspend
@ -307,12 +377,39 @@ static BackgroundExecutor RCTGetBackgroundExecutor()
return scheduler;
}
- (void)_startSurface:(RCTFabricSurface *)surface scheduler:(RCTScheduler *)scheduler
{
RCTMountingManager *mountingManager = _mountingManager;
RCTExecuteOnMainQueue(^{
[mountingManager attachSurfaceToView:surface.view surfaceId:surface.rootTag];
});
LayoutContext layoutContext = RCTGetLayoutContext(surface.viewportOffset);
LayoutConstraints layoutConstraints = RCTGetLayoutConstraintsForSize(surface.minimumSize, surface.maximumSize);
[scheduler startSurfaceWithSurfaceId:surface.rootTag
moduleName:surface.moduleName
initialProps:surface.properties
layoutConstraints:layoutConstraints
layoutContext:layoutContext];
}
- (void)_stopSurface:(RCTFabricSurface *)surface scheduler:(RCTScheduler *)scheduler
{
[scheduler stopSurfaceWithSurfaceId:surface.rootTag];
RCTMountingManager *mountingManager = _mountingManager;
RCTExecuteOnMainQueue(^{
[mountingManager detachSurfaceFromView:surface.view surfaceId:surface.rootTag];
});
}
- (void)_startAllSurfacesWithScheduler:(RCTScheduler *)scheduler
{
[_surfaceRegistry enumerateWithBlock:^(NSEnumerator<RCTFabricSurface *> *enumerator) {
for (RCTFabricSurface *surface in enumerator) {
[scheduler registerSurface:surface.surfaceHandler];
[surface start];
[self _startSurface:surface scheduler:scheduler];
}
}];
}
@ -321,8 +418,24 @@ static BackgroundExecutor RCTGetBackgroundExecutor()
{
[_surfaceRegistry enumerateWithBlock:^(NSEnumerator<RCTFabricSurface *> *enumerator) {
for (RCTFabricSurface *surface in enumerator) {
[surface stop];
[scheduler unregisterSurface:surface.surfaceHandler];
[self _stopSurface:surface scheduler:scheduler];
}
}];
}
- (void)_handleContentSizeCategoryDidChangeNotification:(NSNotification *)notification
{
RCTScheduler *scheduler = [self _scheduler];
[_surfaceRegistry enumerateWithBlock:^(NSEnumerator<RCTFabricSurface *> *enumerator) {
for (RCTFabricSurface *surface in enumerator) {
LayoutContext layoutContext = RCTGetLayoutContext(surface.viewportOffset);
LayoutConstraints layoutConstraints = RCTGetLayoutConstraintsForSize(surface.minimumSize, surface.maximumSize);
[scheduler constraintSurfaceLayoutWithLayoutConstraints:layoutConstraints
layoutContext:layoutContext
surfaceId:surface.rootTag];
}
}];
}

Просмотреть файл

@ -8,7 +8,6 @@
#import <React/RCTSurfaceProtocol.h>
#import <React/RCTSurfaceStage.h>
#import <react/renderer/mounting/MountingCoordinator.h>
#import <react/renderer/scheduler/SurfaceHandler.h>
NS_ASSUME_NONNULL_BEGIN
@ -129,7 +128,12 @@ NS_ASSUME_NONNULL_BEGIN
@interface RCTFabricSurface (Internal)
- (facebook::react::SurfaceHandler const &)surfaceHandler;
/**
* Sets and clears given stage flags (bitmask).
* Returns `YES` if the actual state was changed.
*/
- (BOOL)_setStage:(RCTSurfaceStage)stage;
- (BOOL)_unsetStage:(RCTSurfaceStage)stage;
@end

Просмотреть файл

@ -10,10 +10,6 @@
#import <mutex>
#import <React/RCTAssert.h>
#import <React/RCTConversions.h>
#import <React/RCTFollyConvert.h>
#import <React/RCTI18nUtil.h>
#import <React/RCTMountingManager.h>
#import <React/RCTSurfaceDelegate.h>
#import <React/RCTSurfaceRootView.h>
#import <React/RCTSurfaceTouchHandler.h>
@ -27,19 +23,26 @@
using namespace facebook::react;
@implementation RCTFabricSurface {
// Immutable
__weak RCTSurfacePresenter *_surfacePresenter;
NSString *_moduleName;
// `SurfaceHandler` is a thread-safe object, so we don't need additional synchronization.
// Objective-C++ classes cannot have instance variables without default constructors,
// hence we wrap a value into `optional` to workaround it.
better::optional<SurfaceHandler> _surfaceHandler;
// Protected by the `_mutex`
std::mutex _mutex;
RCTSurfaceStage _stage;
NSDictionary *_properties;
CGSize _minimumSize;
CGSize _maximumSize;
CGPoint _viewportOffset;
CGSize _intrinsicSize;
// Can be accessed from the main thread only.
// The Main thread only
RCTSurfaceView *_Nullable _view;
RCTSurfaceTouchHandler *_Nullable _touchHandler;
}
@synthesize delegate = _delegate;
@synthesize rootTag = _rootTag;
- (instancetype)initWithSurfacePresenter:(RCTSurfacePresenter *)surfacePresenter
moduleName:(NSString *)moduleName
@ -47,19 +50,15 @@ using namespace facebook::react;
{
if (self = [super init]) {
_surfacePresenter = surfacePresenter;
_moduleName = moduleName;
_properties = [initialProperties copy];
_rootTag = [RCTAllocateRootViewTag() integerValue];
_surfaceHandler =
SurfaceHandler{RCTStringFromNSString(moduleName), (SurfaceId)[RCTAllocateRootViewTag() integerValue]};
_surfaceHandler->setProps(convertIdToFollyDynamic(initialProperties));
_minimumSize = CGSizeZero;
[_surfacePresenter registerSurface:self];
_maximumSize = CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX);
[self _updateLayoutContext];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleContentSizeCategoryDidChangeNotification:)
name:UIContentSizeCategoryDidChangeNotification
object:nil];
_stage = RCTSurfaceStageSurfaceDidInitialize;
}
return self;
@ -67,50 +66,41 @@ using namespace facebook::react;
- (void)resetWithSurfacePresenter:(RCTSurfacePresenter *)surfacePresenter
{
_view = nil;
_surfacePresenter = surfacePresenter;
[_surfacePresenter registerSurface:self];
_stage = RCTSurfaceStageSurfaceDidInitialize;
_view = nil;
}
- (void)dealloc
{
[_surfacePresenter unregisterSurface:self];
}
#pragma mark - Life-cycle management
- (BOOL)start
{
_surfaceHandler->start();
[self _propagateStageChange];
if (![self _setStage:RCTSurfaceStageRunning]) {
return NO;
}
RCTExecuteOnMainQueue(^{
[self->_surfacePresenter.mountingManager attachSurfaceToView:self.view
surfaceId:self->_surfaceHandler->getSurfaceId()];
});
[_surfacePresenter setupAnimationDriverWithSurfaceHandler:*_surfaceHandler];
[_surfacePresenter registerSurface:self];
return YES;
}
- (BOOL)stop
{
_surfaceHandler->stop();
[self _propagateStageChange];
RCTExecuteOnMainQueue(^{
[self->_surfacePresenter.mountingManager detachSurfaceFromView:self.view
surfaceId:self->_surfaceHandler->getSurfaceId()];
});
if (![self _unsetStage:RCTSurfaceStageRunning]) {
return NO;
}
[_surfacePresenter unregisterSurface:self];
return YES;
}
- (void)dealloc
{
[self stop];
}
#pragma mark - Immutable Properties (no need to enforce synchronization)
- (NSString *)moduleName
{
return RCTNSStringFromString(_surfaceHandler->getModuleName());
return _moduleName;
}
#pragma mark - Main-Threaded Routines
@ -132,13 +122,49 @@ using namespace facebook::react;
- (RCTSurfaceStage)stage
{
return _surfaceHandler->getStatus() == SurfaceHandler::Status::Running ? RCTSurfaceStageRunning
: RCTSurfaceStagePreparing;
std::lock_guard<std::mutex> lock(_mutex);
return _stage;
}
- (void)_propagateStageChange
- (BOOL)_setStage:(RCTSurfaceStage)stage
{
RCTSurfaceStage stage = self.stage;
return [self _setStage:stage setOrUnset:YES];
}
- (BOOL)_unsetStage:(RCTSurfaceStage)stage
{
return [self _setStage:stage setOrUnset:NO];
}
- (BOOL)_setStage:(RCTSurfaceStage)stage setOrUnset:(BOOL)setOrUnset
{
RCTSurfaceStage updatedStage;
{
std::lock_guard<std::mutex> lock(_mutex);
if (setOrUnset) {
updatedStage = (RCTSurfaceStage)(_stage | stage);
} else {
updatedStage = (RCTSurfaceStage)(_stage & ~stage);
}
if (updatedStage == _stage) {
return NO;
}
_stage = updatedStage;
}
[self _propagateStageChange:updatedStage];
return YES;
}
- (void)_propagateStageChange:(RCTSurfaceStage)stage
{
// Updating the `view`
RCTExecuteOnMainQueue(^{
self->_view.stage = stage;
});
// Notifying the `delegate`
id<RCTSurfaceDelegate> delegate = self.delegate;
@ -147,113 +173,114 @@ using namespace facebook::react;
}
}
- (void)_updateLayoutContext
{
auto layoutConstraints = _surfaceHandler->getLayoutConstraints();
auto layoutContext = _surfaceHandler->getLayoutContext();
layoutContext.pointScaleFactor = RCTScreenScale();
layoutContext.swapLeftAndRightInRTL =
[[RCTI18nUtil sharedInstance] isRTL] && [[RCTI18nUtil sharedInstance] doLeftAndRightSwapInRTL];
layoutContext.fontSizeMultiplier = RCTFontSizeMultiplier();
_surfaceHandler->constraintLayout(layoutConstraints, layoutContext);
}
#pragma mark - Properties Management
- (NSDictionary *)properties
{
return convertFollyDynamicToId(_surfaceHandler->getProps());
std::lock_guard<std::mutex> lock(_mutex);
return _properties;
}
- (void)setProperties:(NSDictionary *)properties
{
_surfaceHandler->setProps(convertIdToFollyDynamic(properties));
{
std::lock_guard<std::mutex> lock(_mutex);
if ([properties isEqualToDictionary:_properties]) {
return;
}
_properties = [properties copy];
}
[_surfacePresenter setProps:properties surface:self];
}
#pragma mark - Layout
- (CGSize)sizeThatFitsMinimumSize:(CGSize)minimumSize maximumSize:(CGSize)maximumSize
{
return [_surfacePresenter sizeThatFitsMinimumSize:minimumSize maximumSize:maximumSize surface:self];
}
#pragma mark - Size Constraints
- (void)setSize:(CGSize)size
{
[self setMinimumSize:size maximumSize:size viewportOffset:_viewportOffset];
}
- (void)setMinimumSize:(CGSize)minimumSize maximumSize:(CGSize)maximumSize viewportOffset:(CGPoint)viewportOffset
{
auto layoutConstraints = _surfaceHandler->getLayoutConstraints();
auto layoutContext = _surfaceHandler->getLayoutContext();
layoutConstraints.minimumSize = RCTSizeFromCGSize(minimumSize);
layoutConstraints.maximumSize = RCTSizeFromCGSize(maximumSize);
if (!isnan(viewportOffset.x) && !isnan(viewportOffset.y)) {
layoutContext.viewportOffset = RCTPointFromCGPoint(viewportOffset);
{
std::lock_guard<std::mutex> lock(_mutex);
if (CGSizeEqualToSize(minimumSize, _minimumSize) && CGSizeEqualToSize(maximumSize, _maximumSize) &&
CGPointEqualToPoint(viewportOffset, _viewportOffset)) {
return;
}
_surfaceHandler->constraintLayout(layoutConstraints, layoutContext);
_maximumSize = maximumSize;
_minimumSize = minimumSize;
_viewportOffset = viewportOffset;
}
[_surfacePresenter setMinimumSize:minimumSize maximumSize:maximumSize surface:self];
}
- (void)setMinimumSize:(CGSize)minimumSize maximumSize:(CGSize)maximumSize
{
[self setMinimumSize:minimumSize maximumSize:maximumSize viewportOffset:CGPointMake(NAN, NAN)];
}
- (void)setSize:(CGSize)size
{
[self setMinimumSize:size maximumSize:size];
}
- (CGSize)sizeThatFitsMinimumSize:(CGSize)minimumSize maximumSize:(CGSize)maximumSize
{
auto layoutConstraints = _surfaceHandler->getLayoutConstraints();
auto layoutContext = _surfaceHandler->getLayoutContext();
layoutConstraints.minimumSize = RCTSizeFromCGSize(minimumSize);
layoutConstraints.maximumSize = RCTSizeFromCGSize(maximumSize);
return RCTCGSizeFromSize(_surfaceHandler->measure(layoutConstraints, layoutContext));
[self setMinimumSize:minimumSize maximumSize:maximumSize viewportOffset:_viewportOffset];
}
- (CGSize)minimumSize
{
return RCTCGSizeFromSize(_surfaceHandler->getLayoutConstraints().minimumSize);
std::lock_guard<std::mutex> lock(_mutex);
return _minimumSize;
}
- (CGSize)maximumSize
{
return RCTCGSizeFromSize(_surfaceHandler->getLayoutConstraints().maximumSize);
std::lock_guard<std::mutex> lock(_mutex);
return _maximumSize;
}
- (CGPoint)viewportOffset
{
return RCTCGPointFromPoint(_surfaceHandler->getLayoutContext().viewportOffset);
std::lock_guard<std::mutex> lock(_mutex);
return _viewportOffset;
}
#pragma mark - intrinsicSize
- (void)setIntrinsicSize:(CGSize)intrinsicSize
{
{
std::lock_guard<std::mutex> lock(_mutex);
if (CGSizeEqualToSize(intrinsicSize, _intrinsicSize)) {
return;
}
_intrinsicSize = intrinsicSize;
}
// Notifying `delegate`
id<RCTSurfaceDelegate> delegate = self.delegate;
if ([delegate respondsToSelector:@selector(surface:didChangeIntrinsicSize:)]) {
[delegate surface:(RCTSurface *)(id)self didChangeIntrinsicSize:intrinsicSize];
}
}
- (CGSize)intrinsicSize
{
std::lock_guard<std::mutex> lock(_mutex);
return _intrinsicSize;
}
#pragma mark - Synchronous Waiting
- (BOOL)synchronouslyWaitFor:(NSTimeInterval)timeout
{
auto mountingCoordinator = _surfaceHandler->getMountingCoordinator();
if (!mountingCoordinator) {
return NO;
}
if (!mountingCoordinator->waitForTransaction(std::chrono::duration<NSTimeInterval>(timeout))) {
return NO;
}
[_surfacePresenter.mountingManager scheduleTransaction:mountingCoordinator];
return YES;
}
- (void)handleContentSizeCategoryDidChangeNotification:(NSNotification *)notification
{
[self _updateLayoutContext];
}
#pragma mark - Private
- (SurfaceHandler const &)surfaceHandler;
{
return *_surfaceHandler;
return [_surfacePresenter synchronouslyWaitSurface:self timeout:timeout];
}
#pragma mark - Deprecated
@ -269,12 +296,7 @@ using namespace facebook::react;
- (NSNumber *)rootViewTag
{
return @(_surfaceHandler->getSurfaceId());
}
- (NSInteger)rootTag
{
return (NSInteger)(_surfaceHandler->getSurfaceId());
return @(_rootTag);
}
@end