From 812b49e7d58f9cbe770b307f58145946d29a4801 Mon Sep 17 00:00:00 2001 From: wangchensu Date: Tue, 12 Aug 2025 21:33:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DBuilderNode=E4=B8=AD=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E8=8E=B7=E5=8F=96RenderNode=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wangchensu Change-Id: I6e7051c9928d857577ebe7c5b9966e65f1f1fade --- .gitee/CODEOWNERS | 6 ++++ .../arkui-ohos/src/BuilderNode.ts | 1 + .../arkoala-arkts/arkui-ohos/src/FrameNode.ts | 36 +++++++++++++++---- .../arkui-ohos/src/RenderNode.ts | 11 ++++-- .../implementation/frame_node_accessor.cpp | 2 +- .../implementation/frame_node_peer_impl.h | 2 +- .../implementation/render_node_accessor.cpp | 5 ++- 7 files changed, 52 insertions(+), 11 deletions(-) diff --git a/.gitee/CODEOWNERS b/.gitee/CODEOWNERS index 553d0ac7859..9d016cff927 100644 --- a/.gitee/CODEOWNERS +++ b/.gitee/CODEOWNERS @@ -3166,6 +3166,12 @@ frameworks/core/interfaces/native/implementation/dismiss_popup_action_peer.h @ar frameworks/core/interfaces/native/implementation/level_order_accessor.cpp @arkuipopupwindow frameworks/core/interfaces/native/implementation/level_order_peer.h @arkuipopupwindow +frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/BuilderNode.ts @arkuiframework +frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/FrameNode.ts @arkuiframework +frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/RenderNode.ts @arkuiframework +frameworks/core/interfaces/native/implementation/frame_node_accessor.cpp @arkuiframework +frameworks/core/interfaces/native/implementation/frame_node_peer_impl.h @arkuiframework + frameworks/core/interfaces/native/implementation/calendar_controller_accessor.cpp @arkui_image frameworks/core/interfaces/native/implementation/calendar_controller_peer.h @arkui_image frameworks/core/interfaces/native/implementation/calendar_modifier.cpp @arkui_image diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/BuilderNode.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/BuilderNode.ts index a45c4265603..ca282bc1a95 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/BuilderNode.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/BuilderNode.ts @@ -415,6 +415,7 @@ export class JSBuilderNode extends BuilderNodeOps { public disposeNode(): void { ArkUIAniModule._Common_Sync_InstanceId(this._instanceId); this.disposeAll(); + this.__frameNode?.disposeNode(); this.__frameNode = null; ArkUIAniModule._Common_Restore_InstanceId(); } diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/FrameNode.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/FrameNode.ts index 12a9e4adc3e..25b5626fb24 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/FrameNode.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/FrameNode.ts @@ -220,6 +220,9 @@ export class FrameNode implements MaterializedBase { this.nodePtr_ = this.peer?.ptr } this.renderNode_?.setFrameNode(new WeakRef(this)) + if (this.renderNode_ && this.getType() === "CustomFrameNode") { + this.renderNode_!.peer = new Finalizable(ArkUIGeneratedNativeModule._FrameNode_getRenderNode(this.peer!.ptr), RenderNode.getFinalizer()); + } this._nodeId = this.getIdByFrameNode_serialize(this); ArkUIAniModule._Common_Restore_InstanceId(); FrameNodeFinalizationRegisterProxy.ElementIdToOwningFrameNode_.set(this._nodeId, this); @@ -405,9 +408,16 @@ export class FrameNode implements MaterializedBase { return this.getChildrenCount_serialize(); } public dispose(): void { - this.dispose_serialize(); + if (this.peer?.ptr) { + this.peer?.close(); + } this.nodePtr_ = undefined; - return + this.renderNode_?.resetNodePtr(); + } + public resetNodePtr(): void { + if (this.peer?.ptr) { + this.peer?.close(); + } } public getOpacity(): number { return this.getOpacity_serialize(); @@ -842,8 +852,7 @@ export class FrameNode implements MaterializedBase { ArkUIGeneratedNativeModule._FrameNode_recycle(this.peer!.ptr); } public getRenderNode(): RenderNode | null { - const retval = ArkUIGeneratedNativeModule._FrameNode_getRenderNode(this.peer!.ptr) - return RenderNodeInternal.fromPtr(retval) + return this.renderNode_ ? this.renderNode_! : null; } public static getFrameNodePtr(node: FrameNode): KPointer { const node_casted = node as (FrameNode) @@ -930,11 +939,22 @@ export class ProxyFrameNode extends ImmutableFrameNode { const error = Error('The FrameNode is not modifiable.'); throw new BusinessError(100021, error); } + public getRenderNode(): RenderNode | null { + return null; + } } export class BuilderRootFrameNode extends ImmutableFrameNode { private __BuilderNodeOpt: JSBuilderNode | undefined = undefined; constructor(uiContext: UIContext, type: string = 'BuilderRootFrameNode', ptr?: KPointer) { super(uiContext, type, ptr); + if (!ptr) { + return; + } + this.peer = new Finalizable(ptr!, FrameNode.getFinalizer()); + this.nodePtr_ = this.peer?.ptr; + if (this.renderNode_) { + this.renderNode_!.peer = new Finalizable(ArkUIGeneratedNativeModule._FrameNode_getRenderNode(ptr), RenderNode.getFinalizer()); + } } getType(): string { return 'BuilderRootFrameNode'; @@ -942,6 +962,12 @@ export class BuilderRootFrameNode extends ImmutableFrameNode { setJsBuilderNode(weak?: JSBuilderNode) { this.__BuilderNodeOpt = weak; } + public resetNodePtr(): void { + super.resetNodePtr(); + this.__BuilderNodeOpt?.disposeNode(); + this.__BuilderNodeOpt = undefined; + this._nodeId = -1; + } public disposeNode(): void { super.dispose(); this.__BuilderNodeOpt = undefined; @@ -986,8 +1012,6 @@ export class FrameNodeUtils { if (nodeId !== -1 && !ArkUIGeneratedNativeModule._FrameNode_isModifiable(ptr)) { let frameNode = new BuilderRootFrameNode(uiContext, "BuilderRootFrameNode", ptr); frameNode._nodeId = nodeId; - frameNode.peer = new Finalizable(ptr, FrameNode.getFinalizer()); - frameNode.nodePtr_ = frameNode.peer?.ptr; FrameNodeFinalizationRegisterProxy.ElementIdToOwningFrameNode_.set(nodeId, frameNode); return frameNode; } diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/RenderNode.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/RenderNode.ts index f7ed71b8ea9..a186d4eba69 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/RenderNode.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/RenderNode.ts @@ -460,8 +460,15 @@ export class RenderNode implements MaterializedBase { return } dispose() { - this.frameNode_?.deref()?.dispose() - this.peer?.release() + this.frameNode_?.deref()?.resetNodePtr() + if (this.peer?.ptr) { + this.peer?.close(); + } + } + resetNodePtr() { + if (this.peer?.ptr) { + this.peer?.close(); + } } private getBackgroundColor(): number { return this.getBackgroundColor_serialize() diff --git a/frameworks/core/interfaces/native/implementation/frame_node_accessor.cpp b/frameworks/core/interfaces/native/implementation/frame_node_accessor.cpp index 3a065d19bf9..91db3323884 100644 --- a/frameworks/core/interfaces/native/implementation/frame_node_accessor.cpp +++ b/frameworks/core/interfaces/native/implementation/frame_node_accessor.cpp @@ -453,7 +453,7 @@ void RecycleImpl(Ark_FrameNode peer) } Ark_RenderNode GetRenderNodeImpl(Ark_FrameNode peer) { - CHECK_NULL_RETURN(peer && peer->node, nullptr); + CHECK_NULL_RETURN(peer, nullptr); return peer->GetRenderNodePeer(); } Ark_NativePointer GetFrameNodePtrImpl(Ark_FrameNode node) diff --git a/frameworks/core/interfaces/native/implementation/frame_node_peer_impl.h b/frameworks/core/interfaces/native/implementation/frame_node_peer_impl.h index 516f31c096c..7f33e4fc2fd 100644 --- a/frameworks/core/interfaces/native/implementation/frame_node_peer_impl.h +++ b/frameworks/core/interfaces/native/implementation/frame_node_peer_impl.h @@ -95,7 +95,7 @@ struct FrameNodePeer { RenderNodePeer* GetRenderNodePeer() { - return RenderNodePeer::Create(node); + return RenderNodePeer::Create(GetFrameNodeByPeer(this)); } }; #endif // FOUNDATION_ARKUI_ACE_ENGINE_FRAMEWORKS_CORE_INTERFACES_NATIVE_IMPL_FRAME_NODE_PEER_IMPL_H diff --git a/frameworks/core/interfaces/native/implementation/render_node_accessor.cpp b/frameworks/core/interfaces/native/implementation/render_node_accessor.cpp index b1880a1f4da..f8fa0411ccd 100644 --- a/frameworks/core/interfaces/native/implementation/render_node_accessor.cpp +++ b/frameworks/core/interfaces/native/implementation/render_node_accessor.cpp @@ -47,7 +47,10 @@ DimensionUnit ConvertLengthMetricsUnitToDimensionUnit(Ark_Int32 unitValue, Dimen } } // namespace namespace RenderNodeAccessor { -void DestroyPeerImpl(Ark_RenderNode peer) {} +void DestroyPeerImpl(Ark_RenderNode peer) +{ + RenderNodePeer::Destroy(peer); +} Ark_RenderNode CtorImpl(Ark_Int32 nodeId, const DrawCallbackFunc* value) { auto frameNode = NG::FrameNode::GetOrCreateFrameNode( -- Gitee