Files
Fluxup_PAP/node_modules/react-native/ReactCommon/react/renderer/uimanager/UIManager.h
2026-03-10 16:18:05 +00:00

255 lines
8.8 KiB
C++

/*
* 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.
*/
#pragma once
#include <folly/dynamic.h>
#include <jsi/jsi.h>
#include <ReactCommon/RuntimeExecutor.h>
#include <shared_mutex>
#include <react/renderer/componentregistry/ComponentDescriptorRegistry.h>
#include <react/renderer/consistency/ShadowTreeRevisionConsistencyManager.h>
#include <react/renderer/core/InstanceHandle.h>
#include <react/renderer/core/RawValue.h>
#include <react/renderer/core/ShadowNode.h>
#include <react/renderer/core/StateData.h>
#include <react/renderer/leakchecker/LeakChecker.h>
#include <react/renderer/mounting/ShadowTree.h>
#include <react/renderer/mounting/ShadowTreeDelegate.h>
#include <react/renderer/mounting/ShadowTreeRegistry.h>
#include <react/renderer/uimanager/UIManagerAnimationBackend.h>
#include <react/renderer/uimanager/UIManagerAnimationDelegate.h>
#include <react/renderer/uimanager/UIManagerDelegate.h>
#include <react/renderer/uimanager/UIManagerNativeAnimatedDelegate.h>
#include <react/renderer/uimanager/consistency/LazyShadowTreeRevisionConsistencyManager.h>
#include <react/renderer/uimanager/consistency/ShadowTreeRevisionProvider.h>
#include <react/renderer/uimanager/primitives.h>
#include <react/utils/ContextContainer.h>
namespace facebook::react {
class UIManagerBinding;
class UIManagerCommitHook;
class UIManagerMountHook;
class UIManager final : public ShadowTreeDelegate {
public:
UIManager(const RuntimeExecutor &runtimeExecutor, std::shared_ptr<const ContextContainer> contextContainer);
~UIManager() override;
void setComponentDescriptorRegistry(const SharedComponentDescriptorRegistry &componentDescriptorRegistry);
/*
* Sets and gets the UIManager's delegate.
* The delegate is stored as a raw pointer, so the owner must null
* the pointer before being destroyed.
*/
void setDelegate(UIManagerDelegate *delegate);
UIManagerDelegate *getDelegate();
/**
* Sets and gets the UIManager's Animation APIs delegate.
* The delegate is stored as a raw pointer, so the owner must null
* the pointer before being destroyed.
*/
void setAnimationDelegate(UIManagerAnimationDelegate *delegate);
/**
* Sets and gets UIManager's AnimationBackend reference.
*/
void unstable_setAnimationBackend(std::weak_ptr<UIManagerAnimationBackend> animationBackend);
std::weak_ptr<UIManagerAnimationBackend> unstable_getAnimationBackend();
/**
* Execute stopSurface on any UIMAnagerAnimationDelegate.
*/
void stopSurfaceForAnimationDelegate(SurfaceId surfaceId) const;
void setNativeAnimatedDelegate(std::weak_ptr<UIManagerNativeAnimatedDelegate> delegate);
void animationTick() const;
void synchronouslyUpdateViewOnUIThread(Tag tag, const folly::dynamic &props);
/*
* Provides access to a UIManagerBindging.
* The `callback` methods will not be called if the internal pointer to
* `UIManagerBindging` is `nullptr`.
* The callback is called synchronously on the same thread.
*/
void visitBinding(
const std::function<void(const UIManagerBinding &uiManagerBinding)> &callback,
jsi::Runtime &runtime) const;
/*
* Registers and unregisters a commit hook.
*/
void registerCommitHook(UIManagerCommitHook &commitHook);
void unregisterCommitHook(UIManagerCommitHook &commitHook);
/*
* Registers and unregisters a mount hook.
*/
void registerMountHook(UIManagerMountHook &mountHook);
void unregisterMountHook(UIManagerMountHook &mountHook);
std::shared_ptr<const ShadowNode> getNewestCloneOfShadowNode(const ShadowNode &shadowNode) const;
ShadowTreeRevisionConsistencyManager *getShadowTreeRevisionConsistencyManager();
ShadowTreeRevisionProvider *getShadowTreeRevisionProvider();
#pragma mark - Surface Start & Stop
void startSurface(
ShadowTree::Unique &&shadowTree,
const std::string &moduleName,
const folly::dynamic &props,
DisplayMode displayMode) const noexcept;
void startEmptySurface(ShadowTree::Unique &&shadowTree) const noexcept;
void setSurfaceProps(
SurfaceId surfaceId,
const std::string &moduleName,
const folly::dynamic &props,
DisplayMode displayMode) const noexcept;
ShadowTree::Unique stopSurface(SurfaceId surfaceId) const;
#pragma mark - ShadowTreeDelegate
void shadowTreeDidFinishTransaction(
std::shared_ptr<const MountingCoordinator> mountingCoordinator,
bool mountSynchronously) const override;
RootShadowNode::Unshared shadowTreeWillCommit(
const ShadowTree &shadowTree,
const RootShadowNode::Shared &oldRootShadowNode,
const RootShadowNode::Unshared &newRootShadowNode,
const ShadowTree::CommitOptions &commitOptions) const override;
std::shared_ptr<ShadowNode> createNode(
Tag tag,
const std::string &componentName,
SurfaceId surfaceId,
RawProps props,
InstanceHandle::Shared instanceHandle) const;
std::shared_ptr<ShadowNode>
cloneNode(const ShadowNode &shadowNode, const ShadowNode::SharedListOfShared &children, RawProps rawProps) const;
void appendChild(
const std::shared_ptr<const ShadowNode> &parentShadowNode,
const std::shared_ptr<const ShadowNode> &childShadowNode) const;
void completeSurface(
SurfaceId surfaceId,
const ShadowNode::UnsharedListOfShared &rootChildren,
ShadowTree::CommitOptions commitOptions);
void setIsJSResponder(
const std::shared_ptr<const ShadowNode> &shadowNode,
bool isJSResponder,
bool blockNativeResponder) const;
std::shared_ptr<const ShadowNode> findNodeAtPoint(const std::shared_ptr<const ShadowNode> &shadowNode, Point point)
const;
/*
* Returns layout metrics of given `shadowNode` relative to
* `ancestorShadowNode` (relative to the root node in case if provided
* `ancestorShadowNode` is nullptr).
*/
LayoutMetrics getRelativeLayoutMetrics(
const ShadowNode &shadowNode,
const ShadowNode *ancestorShadowNode,
LayoutableShadowNode::LayoutInspectingPolicy policy) const;
/*
* Creates a new shadow node with given state data, clones what's necessary
* and performs a commit.
*/
void updateState(const StateUpdate &stateUpdate) const;
void dispatchCommand(
const std::shared_ptr<const ShadowNode> &shadowNode,
const std::string &commandName,
const folly::dynamic &args) const;
void setNativeProps_DEPRECATED(const std::shared_ptr<const ShadowNode> &shadowNode, RawProps rawProps) const;
void sendAccessibilityEvent(const std::shared_ptr<const ShadowNode> &shadowNode, const std::string &eventType);
/*
* Iterates over all shadow nodes which are parts of all registered surfaces
* and find the one that has given `tag`. Returns `nullptr` if the node
* wasn't found. This is a temporary workaround that should not be used in
* any core functionality.
*/
std::shared_ptr<const ShadowNode> findShadowNodeByTag_DEPRECATED(Tag tag) const;
const ShadowTreeRegistry &getShadowTreeRegistry() const;
void reportMount(SurfaceId surfaceId) const;
void updateShadowTree(std::unordered_map<Tag, folly::dynamic> &&tagToProps);
#pragma mark - Add & Remove event listener
void addEventListener(std::shared_ptr<const EventListener> listener);
void removeEventListener(const std::shared_ptr<const EventListener> &listener);
#pragma mark - Set on surface start callback
void setOnSurfaceStartCallback(UIManagerDelegate::OnSurfaceStartCallback &&callback);
private:
friend class UIManagerBinding;
friend class Scheduler;
friend class SurfaceHandler;
/**
* Configure a LayoutAnimation to happen on the next commit.
* This API configures a global LayoutAnimation starting from the root node.
*/
void configureNextLayoutAnimation(
jsi::Runtime &runtime,
const RawValue &config,
const jsi::Value &successCallback,
const jsi::Value &failureCallback) const;
std::shared_ptr<const ShadowNode> getShadowNodeInSubtree(
const ShadowNode &shadowNode,
const std::shared_ptr<const ShadowNode> &ancestorShadowNode) const;
SharedComponentDescriptorRegistry componentDescriptorRegistry_;
UIManagerDelegate *delegate_{};
UIManagerAnimationDelegate *animationDelegate_{nullptr};
std::weak_ptr<UIManagerNativeAnimatedDelegate> nativeAnimatedDelegate_;
const RuntimeExecutor runtimeExecutor_{};
ShadowTreeRegistry shadowTreeRegistry_{};
std::shared_ptr<const ContextContainer> contextContainer_;
mutable std::shared_mutex commitHookMutex_;
mutable std::vector<UIManagerCommitHook *> commitHooks_;
mutable std::shared_mutex mountHookMutex_;
mutable std::vector<UIManagerMountHook *> mountHooks_;
std::unique_ptr<LeakChecker> leakChecker_;
std::unique_ptr<LazyShadowTreeRevisionConsistencyManager> lazyShadowTreeRevisionConsistencyManager_;
std::weak_ptr<UIManagerAnimationBackend> animationBackend_;
};
} // namespace facebook::react