1 /*
2  * Copyright (c) 2022-2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_BASE_UI_NODE_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_BASE_UI_NODE_H
18 
19 #include <cstdint>
20 #include <list>
21 #include <memory>
22 #include <string>
23 #include <unordered_map>
24 
25 #include "base/geometry/ng/point_t.h"
26 #include "base/geometry/ng/size_t.h"
27 #include "base/log/ace_performance_check.h"
28 #include "base/memory/ace_type.h"
29 #include "base/memory/referenced.h"
30 #include "base/utils/macros.h"
31 #include "base/view_data/view_data_wrap.h"
32 #include "core/common/resource/resource_configuration.h"
33 #include "core/components_ng/event/focus_hub.h"
34 #include "core/components_ng/event/gesture_event_hub.h"
35 #include "core/components_ng/export_texture_info/export_texture_info.h"
36 #include "core/components_ng/layout/layout_wrapper.h"
37 #include "core/components_ng/layout/layout_wrapper_node.h"
38 #include "core/components_ng/property/accessibility_property.h"
39 #include "core/event/touch_event.h"
40 
41 namespace OHOS::Ace::NG {
42 class AccessibilityProperty;
43 
44 struct ExtraInfo {
45     std::string page;
46     int32_t line = 0;
47     int32_t col = 0;
48 };
49 
50 enum class NodeStatus : char {
51     NORMAL_NODE = 0,               // Indicates it is a normal node;
52     BUILDER_NODE_OFF_MAINTREE = 1, // Indicates it is a BuilderNode and is detach from the mainTree;
53     BUILDER_NODE_ON_MAINTREE = 2   // Indicates it is a BuilderNode and is attach to the mainTree;
54 };
55 
56 enum class RootNodeType : int32_t {
57     PAGE_ETS_TAG = 0,
58     NAVDESTINATION_VIEW_ETS_TAG = 1,
59     WINDOW_SCENE_ETS_TAG = 2
60 };
61 
62 class InspectorFilter;
63 class PipelineContext;
64 constexpr int32_t DEFAULT_NODE_SLOT = -1;
65 
66 // UINode is the base class of FrameNode and SyntaxNode.
67 class ACE_FORCE_EXPORT UINode : public virtual AceType {
68     DECLARE_ACE_TYPE(UINode, AceType);
69 
70 public:
71     UINode(const std::string& tag, int32_t nodeId, bool isRoot = false);
72     ~UINode() override;
73 
74     // atomic node is like button, image, custom node and so on.
75     // In ets UI compiler, the atomic node does not Add Pop function, only have Create function.
76     virtual bool IsAtomicNode() const = 0;
77 
78     virtual void AttachContext(PipelineContext* context, bool recursive = false);
79     virtual void DetachContext(bool recursive = false);
80 
81     virtual int32_t FrameCount() const;
82     virtual int32_t CurrentFrameCount() const;
83     virtual RefPtr<LayoutWrapperNode> CreateLayoutWrapper(bool forceMeasure = false, bool forceLayout = false);
84 
85     // Tree operation start.
86     virtual void AddChild(const RefPtr<UINode>& child, int32_t slot = DEFAULT_NODE_SLOT, bool silently = false,
87         bool addDefaultTransition = false, bool addModalUiextension = false);
88     void AddChildAfter(const RefPtr<UINode>& child, const RefPtr<UINode>& siblingNode);
89     void AddChildBefore(const RefPtr<UINode>& child, const RefPtr<UINode>& siblingNode);
90 
91     std::list<RefPtr<UINode>>::iterator RemoveChild(const RefPtr<UINode>& child, bool allowTransition = false);
92     int32_t RemoveChildAndReturnIndex(const RefPtr<UINode>& child);
93     void ReplaceChild(const RefPtr<UINode>& oldNode, const RefPtr<UINode>& newNode);
94     void MovePosition(int32_t slot);
95     void MountToParent(const RefPtr<UINode>& parent, int32_t slot = DEFAULT_NODE_SLOT, bool silently = false,
96         bool addDefaultTransition = false, bool addModalUiextension = false);
97     RefPtr<FrameNode> GetParentFrameNode() const;
98     RefPtr<CustomNode> GetParentCustomNode() const;
99     RefPtr<FrameNode> GetFocusParent() const;
100     RefPtr<FocusHub> GetFirstFocusHubChild() const;
101 
102     // Only for the currently loaded children, do not expand.
103     void GetCurrentChildrenFocusHub(std::list<RefPtr<FocusHub>>& focusNodes);
104 
105     void GetFocusChildren(std::list<RefPtr<FrameNode>>& children) const;
106     void Clean(bool cleanDirectly = false, bool allowTransition = false, int32_t branchId = -1);
107     void RemoveChildAtIndex(int32_t index);
108     RefPtr<UINode> GetChildAtIndex(int32_t index) const;
109     int32_t GetChildIndex(const RefPtr<UINode>& child) const;
110     [[deprecated]] void AttachToMainTree(bool recursive = false);
111     void AttachToMainTree(bool recursive, PipelineContext* context);
112     void DetachFromMainTree(bool recursive = false);
113     virtual void FireCustomDisappear();
114     void UpdateConfigurationUpdate(const ConfigurationChange& configurationChange);
OnConfigurationUpdate(const ConfigurationChange & configurationChange)115     virtual void OnConfigurationUpdate(const ConfigurationChange& configurationChange) {}
116 
117     // process offscreen process.
118     void ProcessOffscreenTask(bool recursive = false);
119 
UpdateModalUiextensionCount(bool addNode)120     void UpdateModalUiextensionCount(bool addNode)
121     {
122         if (addNode) {
123             modalUiextensionCount_++;
124         } else {
125             modalUiextensionCount_--;
126         }
127     }
128 
129     int32_t TotalChildCount() const;
130     virtual void UpdateGeometryTransition();
131 
132     // Returns index in the flatten tree structure
133     // of the node with given id and type
134     // Returns std::pair with
135     // boolean first - indication of node is found
136     // int32_t second - index of the node
137     std::pair<bool, int32_t> GetChildFlatIndex(int32_t id);
138 
139     virtual const std::list<RefPtr<UINode>>& GetChildren(bool notDetach = false) const
140     {
141         return children_;
142     }
143 
GetLastChild()144     RefPtr<UINode> GetLastChild()
145     {
146         if (children_.empty()) {
147             return nullptr;
148         }
149         return children_.back();
150     }
151 
GetFirstChild()152     RefPtr<UINode> GetFirstChild()
153     {
154         if (children_.empty()) {
155             return nullptr;
156         }
157         return children_.front();
158     }
159 
160     void GenerateOneDepthVisibleFrame(std::list<RefPtr<FrameNode>>& visibleList);
161     void GenerateOneDepthVisibleFrameWithTransition(std::list<RefPtr<FrameNode>>& visibleList);
162     void GenerateOneDepthVisibleFrameWithOffset(
163         std::list<RefPtr<FrameNode>>& visibleList, OffsetF& offset);
164     void GenerateOneDepthAllFrame(std::list<RefPtr<FrameNode>>& visibleList);
165 
166     int32_t GetChildIndexById(int32_t id);
167 
GetParent()168     RefPtr<UINode> GetParent() const
169     {
170         return parent_.Upgrade();
171     }
172 
SetNeedCallChildrenUpdate(bool needCallChildrenUpdate)173     void SetNeedCallChildrenUpdate(bool needCallChildrenUpdate)
174     {
175         needCallChildrenUpdate_ = needCallChildrenUpdate;
176     }
177 
SetParent(const WeakPtr<UINode> & parent)178     virtual void SetParent(const WeakPtr<UINode>& parent)
179     {
180         parent_ = parent;
181     }
182     // Tree operation end.
183 
184     // performance.
185     PipelineContext* GetContext() const;
186     PipelineContext* GetAttachedContext() const;
187     PipelineContext* GetContextWithCheck();
188 
189     RefPtr<PipelineContext> GetContextRefPtr() const;
190 
191     // When FrameNode creates a layout task, the corresponding LayoutWrapper tree is created, and UINode needs to update
192     // the corresponding LayoutWrapper tree node at this time like add self wrapper to wrapper tree.
193     virtual void AdjustLayoutWrapperTree(const RefPtr<LayoutWrapperNode>& parent, bool forceMeasure, bool forceLayout);
194 
195     bool IsAutoFillContainerNode();
196     void DumpViewDataPageNodes(
197         RefPtr<ViewDataWrap> viewDataWrap, bool skipSubAutoFillContainer = false, bool needsRecordData = false);
198     bool NeedRequestAutoSave();
199     // DFX info.
200     void DumpTree(int32_t depth);
201     void DumpSimplifyTree(int32_t depth, std::unique_ptr<JsonValue>& current);
202     virtual bool IsContextTransparent();
203 
204     bool DumpTreeById(int32_t depth, const std::string& id);
205 
GetTag()206     const std::string& GetTag() const
207     {
208         return tag_;
209     }
210 
GetId()211     int32_t GetId() const
212     {
213         return nodeId_;
214     }
215 
GetAccessibilityId()216     int64_t GetAccessibilityId() const
217     {
218         return accessibilityId_;
219     }
220 
SetDepth(int32_t depth)221     void SetDepth(int32_t depth)
222     {
223         depth_ = depth;
224         for (auto& child : children_) {
225             child->SetDepth(depth_ + 1);
226         }
227     }
228 
IsRootNode()229     bool IsRootNode() const
230     {
231         return isRoot_;
232     }
233 
GetDepth()234     int32_t GetDepth() const
235     {
236         return depth_;
237     }
238 
GetRootId()239     int32_t GetRootId() const
240     {
241         return hostRootId_;
242     }
243 
GetPageId()244     int32_t GetPageId() const
245     {
246         return hostPageId_;
247     }
248 
249     // TODO: SetHostRootId step on create node.
SetHostRootId(int32_t id)250     void SetHostRootId(int32_t id)
251     {
252         hostRootId_ = id;
253     }
254 
255     // TODO: SetHostPageId step on mount to page.
SetHostPageId(int32_t id)256     void SetHostPageId(int32_t id)
257     {
258         hostPageId_ = id;
259         for (auto& child : children_) {
260             child->SetHostPageId(id);
261         }
262     }
263 
SetRemoveSilently(bool removeSilently)264     void SetRemoveSilently(bool removeSilently)
265     {
266         removeSilently_ = removeSilently;
267     }
268 
SetUndefinedNodeId()269     void SetUndefinedNodeId()
270     {
271         nodeId_ = -1;
272     }
273 
IsRemoving()274     bool IsRemoving() const
275     {
276         return isRemoving_;
277     }
278 
GetLayoutPriority()279     int32_t GetLayoutPriority() const
280     {
281         return layoutPriority_;
282     }
283 
SetLayoutPriority(int32_t priority)284     void SetLayoutPriority(int32_t priority)
285     {
286         layoutPriority_ = priority;
287     }
288 
SetInDestroying()289     void SetInDestroying()
290     {
291         isInDestroying_ = true;
292     }
293 
IsInDestroying()294     bool IsInDestroying() const
295     {
296         return isInDestroying_;
297     }
298 
299     void SetChildrenInDestroying();
300 
301     virtual HitTestResult TouchTest(const PointF& globalPoint, const PointF& parentLocalPoint,
302         const PointF& parentRevertPoint, TouchRestrict& touchRestrict, TouchTestResult& result, int32_t touchId,
303         ResponseLinkResult& responseLinkResult, bool isDispatch = false);
GetHitTestMode()304     virtual HitTestMode GetHitTestMode() const
305     {
306         return HitTestMode::HTMDEFAULT;
307     }
308 
309     virtual HitTestResult MouseTest(const PointF& globalPoint, const PointF& parentLocalPoint,
310         MouseTestResult& onMouseResult, MouseTestResult& onHoverResult, RefPtr<FrameNode>& hoverNode);
311 
312     virtual HitTestResult AxisTest(const PointF& globalPoint, const PointF& parentLocalPoint,
313         const PointF& parentRevertPoint, TouchRestrict& touchRestrict, AxisTestResult& onAxisResult);
314 
315     // In the request to re-layout the scene, needs to obtain the changed state of the child node for the creation
316     // of parent's layout wrapper
317     virtual void UpdateLayoutPropertyFlag();
318 
ForceUpdateLayoutPropertyFlag(PropertyChangeFlag propertyChangeFlag)319     virtual void ForceUpdateLayoutPropertyFlag(PropertyChangeFlag propertyChangeFlag) {}
320 
321     virtual void AdjustParentLayoutFlag(PropertyChangeFlag& flag);
322 
323     virtual void MarkDirtyNode(PropertyChangeFlag extraFlag = PROPERTY_UPDATE_NORMAL);
324 
325     virtual void MarkNeedFrameFlushDirty(PropertyChangeFlag extraFlag = PROPERTY_UPDATE_NORMAL);
326 
FlushUpdateAndMarkDirty()327     virtual void FlushUpdateAndMarkDirty()
328     {
329         for (const auto& child : children_) {
330             child->FlushUpdateAndMarkDirty();
331         }
332     }
333 
334     virtual void MarkNeedSyncRenderTree(bool needRebuild = false);
335 
336     virtual void RebuildRenderContextTree();
337 
OnWindowShow()338     virtual void OnWindowShow() {}
339 
OnWindowHide()340     virtual void OnWindowHide() {}
341     virtual void Build(std::shared_ptr<std::list<ExtraInfo>> extraInfos);
342 
343     virtual bool RenderCustomChild(int64_t deadline);
344 
OnWindowFocused()345     virtual void OnWindowFocused() {}
346 
OnWindowUnfocused()347     virtual void OnWindowUnfocused() {}
348 
OnWindowSizeChanged(int32_t width,int32_t height,WindowSizeChangeReason type)349     virtual void OnWindowSizeChanged(int32_t width, int32_t height, WindowSizeChangeReason type) {}
350 
OnNotifyMemoryLevel(int32_t level)351     virtual void OnNotifyMemoryLevel(int32_t level) {}
352 
353     virtual void SetActive(bool active, bool needRebuildRenderContext = false);
354 
355     virtual void SetJSViewActive(bool active, bool isLazyForEachNode = false);
356 
357     virtual void TryVisibleChangeOnDescendant(VisibleType preVisibility, VisibleType currentVisibility);
358 
359     // call by recycle framework.
360     virtual void OnRecycle();
361     virtual void OnReuse();
362 
363     virtual bool MarkRemoving();
364 
IsOnMainTree()365     bool IsOnMainTree() const
366     {
367         return onMainTree_;
368     }
369 
UseOffscreenProcess()370     bool UseOffscreenProcess() const
371     {
372         return useOffscreenProcess_;
373     }
374 
ToJsonValue(std::unique_ptr<JsonValue> & json,const InspectorFilter & filter)375     virtual void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const {}
376 
FromJson(const std::unique_ptr<JsonValue> & json)377     virtual void FromJson(const std::unique_ptr<JsonValue>& json) {}
378 
379     ACE_DEFINE_PROPERTY_ITEM_FUNC_WITHOUT_GROUP(InspectorId, std::string);
OnInspectorIdUpdate(const std::string &)380     virtual void OnInspectorIdUpdate(const std::string& /*unused*/) {}
381 
382     ACE_DEFINE_PROPERTY_ITEM_FUNC_WITHOUT_GROUP(AutoEventParam, std::string);
OnAutoEventParamUpdate(const std::string &)383     virtual void OnAutoEventParamUpdate(const std::string& /*unused*/) {}
384 
385     template<typename T>
FindChildNodeOfClass()386     RefPtr<T> FindChildNodeOfClass()
387     {
388         const auto& children = GetChildren();
389         for (auto iter = children.rbegin(); iter != children.rend(); ++iter) {
390             auto& child = *iter;
391 
392             auto target = child->FindChildNodeOfClass<T>();
393             if (target) {
394                 return target;
395             }
396         }
397 
398         RefPtr<UINode> uiNode = AceType::Claim<UINode>(this);
399         if (AceType::InstanceOf<T>(uiNode)) {
400             return AceType::DynamicCast<T>(uiNode);
401         }
402         return nullptr;
403     }
404 
405     // utility function for adding child to disappearingChildren_
406     void AddDisappearingChild(const RefPtr<UINode>& child, uint32_t index = UINT32_MAX, int32_t branchId = -1);
407     // utility function for removing child from disappearingChildren_, return true if child is removed
408     bool RemoveDisappearingChild(const RefPtr<UINode>& child);
409     // return if we are in parent's disappearing children
IsDisappearing()410     bool IsDisappearing() const
411     {
412         return isDisappearing_;
413     }
414     RefPtr<UINode> GetDisappearingChildById(const std::string& id, int32_t branchId) const;
415 
416     // These two interfaces are only used for fast preview.
417     // FastPreviewUpdateChild: Replace the old child at the specified slot with the new created node.
418     // FastPreviewUpdateChildDone: the new created node performs some special operations.
FastPreviewUpdateChild(int32_t slot,const RefPtr<UINode> & newChild)419     virtual void FastPreviewUpdateChild(int32_t slot, const RefPtr<UINode>& newChild)
420     {
421         RemoveChildAtIndex(slot);
422         newChild->MountToParent(AceType::Claim(this), slot, false);
423     }
FastPreviewUpdateChildDone()424     virtual void FastPreviewUpdateChildDone() {}
425     virtual RefPtr<UINode> GetFrameChildByIndex(uint32_t index, bool needBuild, bool isCache = false,
426         bool addToRenderTree = false);
427     virtual RefPtr<UINode> GetFrameChildByIndexWithoutExpanded(uint32_t index);
428     // Get current frameNode index with or without expanded all LazyForEachNode;
429     virtual int32_t GetFrameNodeIndex(const RefPtr<FrameNode>& node, bool isExpanded = true);
SetDebugLine(const std::string & line)430     void SetDebugLine(const std::string& line)
431     {
432         debugLine_ = line;
433     }
GetDebugLine()434     std::string GetDebugLine() const
435     {
436         return debugLine_;
437     }
438 
SetViewId(const std::string & viewId)439     void SetViewId(const std::string& viewId)
440     {
441         viewId_ = viewId;
442     }
443 
GetViewId()444     std::string GetViewId() const
445     {
446         return viewId_;
447     }
448 
SetRestoreId(int32_t restoreId)449     void SetRestoreId(int32_t restoreId)
450     {
451         restoreId_ = restoreId;
452     }
453 
GetRestoreId()454     int32_t GetRestoreId()
455     {
456         return restoreId_;
457     }
458 
UpdateRecycleElmtId(int32_t newElmtId)459     void UpdateRecycleElmtId(int32_t newElmtId)
460     {
461         nodeId_ = newElmtId;
462     }
463 
464     // --------------------------------------------------------------------------------
465     // performance check get child count, depth, flex layout times and layout time
466     void GetPerformanceCheckData(PerformanceCheckNodeMap& nodeMap);
SetLayoutTime(int64_t time)467     void SetLayoutTime(int64_t time)
468     {
469         if (nodeInfo_) {
470             nodeInfo_->layoutTime = time;
471         }
472     }
GetLayoutTime()473     int64_t GetLayoutTime()
474     {
475         if (nodeInfo_) {
476             return nodeInfo_->layoutTime;
477         }
478         return 0;
479     }
GetFlexLayouts()480     int32_t GetFlexLayouts()
481     {
482         if (nodeInfo_) {
483             return nodeInfo_->flexLayouts;
484         }
485         return 0;
486     }
GetRow()487     int32_t GetRow() const
488     {
489         if (nodeInfo_) {
490             return nodeInfo_->codeRow;
491         }
492         return 0;
493     }
GetCol()494     int32_t GetCol() const
495     {
496         if (nodeInfo_) {
497             return nodeInfo_->codeCol;
498         }
499         return 0;
500     }
SetRow(const int32_t row)501     void SetRow(const int32_t row)
502     {
503         if (nodeInfo_) {
504             nodeInfo_->codeRow = row;
505         }
506     }
SetCol(const int32_t col)507     void SetCol(const int32_t col)
508     {
509         if (nodeInfo_) {
510             nodeInfo_->codeCol = col;
511         }
512     }
SetForeachItem()513     void SetForeachItem()
514     {
515         if (nodeInfo_) {
516             nodeInfo_->isForEachItem = true;
517         }
518     }
AddFlexLayouts()519     void AddFlexLayouts()
520     {
521         if (nodeInfo_) {
522             nodeInfo_->flexLayouts++;
523         }
524     }
GetCustomTag()525     virtual std::string GetCustomTag()
526     {
527         return GetTag();
528     }
SetBuildByJs(bool isBuildByJS)529     void SetBuildByJs(bool isBuildByJS)
530     {
531         isBuildByJS_ = isBuildByJS;
532     }
533 
GetExternalData()534     void* GetExternalData() const
535     {
536         return externalData_;
537     }
538 
SetExternalData(void * externalData)539     void SetExternalData(void* externalData)
540     {
541         externalData_ = externalData;
542     }
543 
544     // --------------------------------------------------------------------------------
545 
546     virtual void DoRemoveChildInRenderTree(uint32_t index, bool isAll = false);
547     virtual void DoSetActiveChildRange(
548         int32_t start, int32_t end, int32_t cacheStart, int32_t cacheEnd, bool showCache = false);
DoSetActiveChildRange(const std::set<int32_t> & activeItems,const std::set<int32_t> & cachedItems,int32_t baseIndex)549     virtual void DoSetActiveChildRange(
550         const std::set<int32_t>& activeItems, const std::set<int32_t>& cachedItems, int32_t baseIndex)
551     {}
552     virtual void OnSetCacheCount(int32_t cacheCount, const std::optional<LayoutConstraintF>& itemConstraint);
553 
554     // return value: true if the node can be removed immediately.
555     virtual bool OnRemoveFromParent(bool allowTransition);
556 
MarkForceMeasure()557     void MarkForceMeasure()
558     {
559         MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
560         for (const auto& child : children_) {
561             child->MarkForceMeasure();
562         }
563     }
564 
565     std::string GetCurrentCustomNodeInfo();
566     static int64_t GenerateAccessibilityId();
567 
568     // used by BuilderNode
569     NodeStatus GetNodeStatus() const;
570     void UpdateNodeStatus(NodeStatus nodeStatus);
571     void SetIsRootBuilderNode(bool isRootBuilderNode);
572     bool GetIsRootBuilderNode() const;
573 
IsArkTsFrameNode()574     bool IsArkTsFrameNode() const
575     {
576         return isArkTsFrameNode_;
577     }
578 
SetIsArkTsFrameNode(bool isArkTsFrameNode)579     void SetIsArkTsFrameNode(bool isArkTsFrameNode)
580     {
581         isArkTsFrameNode_ = isArkTsFrameNode;
582     }
583 
GetExportTextureInfo()584     const RefPtr<ExportTextureInfo>& GetExportTextureInfo() const
585     {
586         return exportTextureInfo_;
587     }
588 
589     void CreateExportTextureInfoIfNeeded();
590 
591     bool IsNeedExportTexture() const;
592 
593     virtual bool SetParentLayoutConstraint(const SizeF& size) const;
594 
SetNodeIndexOffset(int32_t start,int32_t count)595     virtual void SetNodeIndexOffset(int32_t start, int32_t count) {}
596 
IsLayoutSeperately()597     bool IsLayoutSeperately() const
598     {
599         return layoutSeperately_;
600     }
601 
602     virtual void PaintDebugBoundaryTreeAll(bool flag);
603     static void DFSAllChild(const RefPtr<UINode>& root, std::vector<RefPtr<UINode>>& res);
604     static void GetBestBreakPoint(RefPtr<UINode>& breakPointChild, RefPtr<UINode>& breakPointParent);
605 
SetAccessibilityNodeVirtual()606     void SetAccessibilityNodeVirtual()
607     {
608         isAccessibilityVirtualNode_ = true;
609         for (auto& it : GetChildren()) {
610             it->SetAccessibilityNodeVirtual();
611         }
612     }
613 
IsAccessibilityVirtualNode()614     bool IsAccessibilityVirtualNode() const
615     {
616         return isAccessibilityVirtualNode_;
617     }
618 
SetAccessibilityVirtualNodeParent(const RefPtr<UINode> & parent)619     void SetAccessibilityVirtualNodeParent(const RefPtr<UINode>& parent)
620     {
621         parentForAccessibilityVirtualNode_ = parent;
622         for (auto& it : GetChildren()) {
623             it->SetAccessibilityVirtualNodeParent(parent);
624         }
625     }
626 
GetVirtualNodeParent()627     WeakPtr<UINode> GetVirtualNodeParent() const
628     {
629         return parentForAccessibilityVirtualNode_;
630     }
631 
IsFirstVirtualNode()632     bool IsFirstVirtualNode() const
633     {
634         return isFirstAccessibilityVirtualNode_;
635     }
636 
SetFirstAccessibilityVirtualNode()637     void SetFirstAccessibilityVirtualNode()
638     {
639         isFirstAccessibilityVirtualNode_ = true;
640     }
641 
SetRootNodeId(int32_t rootNodeId)642     void SetRootNodeId(int32_t rootNodeId)
643     {
644         rootNodeId_ = rootNodeId;
645     }
646 
HasVirtualNodeAccessibilityProperty()647     virtual bool HasVirtualNodeAccessibilityProperty()
648     {
649         return false;
650     }
651 
GetRootNodeId()652     int32_t GetRootNodeId() const
653     {
654         return rootNodeId_;
655     }
656 
RootNodeIsPage()657     bool RootNodeIsPage() const
658     {
659         return rootNodeType_ == RootNodeType::PAGE_ETS_TAG;
660     }
661 
SetRootNodeType(RootNodeType rootNodeType)662     void SetRootNodeType(RootNodeType rootNodeType)
663     {
664         rootNodeType_ = rootNodeType;
665     }
666 
GetRootNodeType()667     RootNodeType GetRootNodeType() const
668     {
669         return rootNodeType_;
670     }
671 
672     virtual void ClearSubtreeLayoutAlgorithm(bool includeSelf = true, bool clearEntireTree = false);
673 
674     void GetPageNodeCountAndDepth(int32_t* count, int32_t* depth);
675 
RegisterUpdateJSInstanceCallback(std::function<void (int32_t)> && callback)676     virtual void RegisterUpdateJSInstanceCallback(std::function<void(int32_t)>&& callback)
677     {
678         updateJSInstanceCallback_ = std::move(callback);
679     }
680 
GetInstanceId()681     int32_t GetInstanceId() const
682     {
683         return instanceId_;
684     }
685 
SetGeometryTransitionInRecursive(bool isGeometryTransitionIn)686     virtual void SetGeometryTransitionInRecursive(bool isGeometryTransitionIn)
687     {
688         for (const auto& child : GetChildren()) {
689             child->SetGeometryTransitionInRecursive(isGeometryTransitionIn);
690         }
691     }
692 
SetOnNodeDestroyCallback(std::function<void (int32_t)> && destroyCallback)693     virtual void SetOnNodeDestroyCallback(std::function<void(int32_t)>&& destroyCallback)
694     {
695         destroyCallback_ = std::move(destroyCallback);
696     }
697 
HasOnNodeDestroyCallback()698     virtual bool HasOnNodeDestroyCallback()
699     {
700         return destroyCallback_ != nullptr;
701     }
702 
FireOnNodeDestroyCallback()703     virtual void FireOnNodeDestroyCallback()
704     {
705         CHECK_NULL_VOID(destroyCallback_);
706         destroyCallback_(GetId());
707     }
708 
SetBuilderFunc(std::function<void ()> && lazyBuilderFunc)709     void SetBuilderFunc(std::function<void()>&& lazyBuilderFunc)
710     {
711         lazyBuilderFunc_ = lazyBuilderFunc;
712     }
713 
GetBuilderFunc()714     std::function<void()> GetBuilderFunc() const
715     {
716         return lazyBuilderFunc_;
717     }
718 
SetUpdateNodeFunc(std::function<void (int32_t,RefPtr<UINode> &)> && updateNodeFunc)719     void SetUpdateNodeFunc(std::function<void(int32_t, RefPtr<UINode>&)>&& updateNodeFunc)
720     {
721         updateNodeFunc_ = updateNodeFunc;
722     }
723 
GetUpdateNodeFunc()724     std::function<void(int32_t, RefPtr<UINode>&)> GetUpdateNodeFunc()
725     {
726         return updateNodeFunc_;
727     }
728 
SetUpdateNodeConfig(std::function<void ()> && updateNodeConfig)729     void SetUpdateNodeConfig(std::function<void()>&& updateNodeConfig)
730     {
731         updateNodeConfig_ = updateNodeConfig;
732     }
733 
GetUpdateNodeConfig()734     std::function<void()> GetUpdateNodeConfig()
735     {
736         return updateNodeConfig_;
737     }
738 
AddFlag(uint32_t flag)739     void AddFlag(uint32_t flag)
740     {
741         nodeFlag_ |= flag;
742     }
743 
IsNodeHasFlag(uint32_t flag)744     bool IsNodeHasFlag(uint32_t flag) const
745     {
746         return (flag & nodeFlag_) == flag;
747     }
748 
749     virtual void GetInspectorValue();
750     virtual void NotifyWebPattern(bool isRegister);
751     void GetContainerComponentText(std::string& text);
752 
753     enum class NotificationType : int32_t {
754         START_CHANGE_POSITION = 0,
755         END_CHANGE_POSITION = 1,
756         START_AND_END_CHANGE_POSITION = 2
757     };
758     /**
759      * @brief For a DataChange happened in child [id], notify the corresponding change position to parent.
760      *
761      * @param changeIdx change index in child [id].
762      * @param count change of item count.
763      * @param id the accessibilityId of child who call this function.
764      * @param notificationType the type of notification.
765      */
766     virtual void NotifyChange(int32_t changeIdx, int32_t count, int64_t id, NotificationType notificationType);
767 
768     // Used to mark freeze and block dirty mark.
769     virtual void SetFreeze(bool isFreeze);
IsFreeze()770     bool IsFreeze() const
771     {
772         return isFreeze_;
773     }
774 
IsCNode()775     bool IsCNode() const
776     {
777         return isCNode_;
778     }
779 
setIsCNode(bool createByCapi)780     void setIsCNode(bool createByCapi)
781     {
782         isCNode_ = createByCapi;
783     }
784 
GetCurrentPageRootNode()785     virtual RefPtr<UINode> GetCurrentPageRootNode()
786     {
787         return nullptr;
788     }
789 
AddCustomProperty(const std::string & key,const std::string & value)790     virtual void AddCustomProperty(const std::string& key, const std::string& value) {}
RemoveCustomProperty(const std::string & key)791     virtual void RemoveCustomProperty(const std::string& key) {}
792 
793 protected:
ModifyChildren()794     std::list<RefPtr<UINode>>& ModifyChildren()
795     {
796         return children_;
797     }
798 
OnGenerateOneDepthVisibleFrame(std::list<RefPtr<FrameNode>> & visibleList)799     virtual void OnGenerateOneDepthVisibleFrame(std::list<RefPtr<FrameNode>>& visibleList)
800     {
801         for (const auto& child : GetChildren()) {
802             child->OnGenerateOneDepthVisibleFrame(visibleList);
803         }
804     }
805 
806     virtual void OnGenerateOneDepthVisibleFrameWithTransition(std::list<RefPtr<FrameNode>>& visibleList);
807 
808     virtual void OnGenerateOneDepthVisibleFrameWithOffset(
809         std::list<RefPtr<FrameNode>>& visibleList, OffsetF& offset);
810 
OnGenerateOneDepthAllFrame(std::list<RefPtr<FrameNode>> & allList)811     virtual void OnGenerateOneDepthAllFrame(std::list<RefPtr<FrameNode>>& allList)
812     {
813         for (const auto& child : GetChildren()) {
814             child->OnGenerateOneDepthAllFrame(allList);
815         }
816     }
817 
AfterMountToParent()818     virtual void AfterMountToParent() {}
OnContextAttached()819     virtual void OnContextAttached() {}
820     // dump self info.
DumpInfo()821     virtual void DumpInfo() {}
DumpSimplifyInfo(std::unique_ptr<JsonValue> & json)822     virtual void DumpSimplifyInfo(std::unique_ptr<JsonValue>& json) {}
DumpAdvanceInfo()823     virtual void DumpAdvanceInfo() {}
824     virtual void DumpViewDataPageNode(RefPtr<ViewDataWrap> viewDataWrap, bool needsRecordData = false) {}
CheckAutoSave()825     virtual bool CheckAutoSave()
826     {
827         return false;
828     }
829     // Mount to the main tree to display.
830     virtual void OnAttachToMainTree(bool recursive = false);
831     virtual void OnDetachFromMainTree(bool recursive = false, PipelineContext* context = nullptr);
OnAttachToBuilderNode(NodeStatus nodeStatus)832     virtual void OnAttachToBuilderNode(NodeStatus nodeStatus) {}
833 
OnFreezeStateChange()834     virtual void OnFreezeStateChange() {}
835     virtual void UpdateChildrenFreezeState(bool isFreeze);
836 
837     // run offscreen process.
OnOffscreenProcess(bool recursive)838     virtual void OnOffscreenProcess(bool recursive) {}
839 
840     bool isRemoving_ = false;
841 
842     virtual bool RemoveImmediately() const;
843     void ResetParent();
844     static void RemoveFromParentCleanly(const RefPtr<UINode>& child, const RefPtr<UINode>& parent);
845 
846     // update visible change signal to children
847     void UpdateChildrenVisible(VisibleType preVisibility, VisibleType currentVisibility) const;
848 
849     void CollectRemovedChildren(const std::list<RefPtr<UINode>>& children,
850         std::list<int32_t>& removedElmtId, bool isEntry);
851     void CollectRemovedChild(const RefPtr<UINode>& child, std::list<int32_t>& removedElmtId);
852 
853     bool needCallChildrenUpdate_ = true;
854 
855     bool layoutSeperately_ = false;
856 
PaintDebugBoundary(bool flag)857     virtual void PaintDebugBoundary(bool flag) {}
858 
859     void TraversingCheck(RefPtr<UINode> node = nullptr, bool withAbort = false);
860 
861     PipelineContext* context_ = nullptr;
862 
863     /**
864      * @brief Transform the [changeIdx] given by child [id] to corresponding position in [this] node.
865      *
866      * @param changeIdx change index in child [id].
867      * @param id the accessibilityId of child.
868      */
869     int32_t CalcAbsPosition(int32_t changeIdx, int64_t id) const;
870 
871 private:
872     void DoAddChild(std::list<RefPtr<UINode>>::iterator& it, const RefPtr<UINode>& child, bool silently = false,
873         bool addDefaultTransition = false);
874 
875     std::list<RefPtr<UINode>> children_;
876     // disappearingChild、index、branchId
877     std::list<std::tuple<RefPtr<UINode>, uint32_t, int32_t>> disappearingChildren_;
878     std::unique_ptr<PerformanceCheckNode> nodeInfo_;
879     WeakPtr<UINode> parent_;
880     std::string tag_ = "UINode";
881     int32_t depth_ = INT32_MAX;
882     int32_t hostRootId_ = 0;
883     int32_t hostPageId_ = 0;
884     int32_t nodeId_ = 0;
885     int64_t accessibilityId_ = -1;
886     int32_t layoutPriority_ = 0;
887     int32_t rootNodeId_ = 0; // host is Page or NavDestination
888     bool isRoot_ = false;
889     bool onMainTree_ = false;
890     bool removeSilently_ = true;
891     bool isInDestroying_ = false;
892     bool isDisappearing_ = false;
893     bool isBuildByJS_ = false;
894     bool isRootBuilderNode_ = false;
895     bool isArkTsFrameNode_ = false;
896     bool isTraversing_ = false;
897     NodeStatus nodeStatus_ = NodeStatus::NORMAL_NODE;
898     RootNodeType rootNodeType_ = RootNodeType::PAGE_ETS_TAG;
899     RefPtr<ExportTextureInfo> exportTextureInfo_;
900 
901     uint32_t nodeFlag_ { 0 };
902 
903     int32_t restoreId_ = -1;
904 
905     bool useOffscreenProcess_ = false;
906 
907     bool isCNode_ = false;
908 
909     std::function<void(int32_t)> updateJSInstanceCallback_;
910     std::function<void()> lazyBuilderFunc_;
911     std::function<void(int32_t, RefPtr<UINode>&)> updateNodeFunc_;
912     std::function<void()> updateNodeConfig_;
913 
914     std::string debugLine_;
915     std::string viewId_;
916     int32_t instanceId_ = -1;
917     void* externalData_ = nullptr;
918     std::function<void(int32_t)> destroyCallback_;
919     // Other components cannot be masked above the modal uiextension,
920     // except for the modal uiextension
921     // Used to mark modal uiextension count below the root node
922     int32_t modalUiextensionCount_ = 0;
923     bool isAccessibilityVirtualNode_ = false;
924     WeakPtr<UINode> parentForAccessibilityVirtualNode_;
925     bool isFirstAccessibilityVirtualNode_ = false;
926     // the flag to block dirty mark.
927     bool isFreeze_ = false;
928     friend class RosenRenderContext;
929     ACE_DISALLOW_COPY_AND_MOVE(UINode);
930 };
931 
932 } // namespace OHOS::Ace::NG
933 
934 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_BASE_UI_NODE_H
935