• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 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 
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_frame_node_bridge.h"
17 
18 #include "jsnapi_expo.h"
19 
20 #include "base/memory/ace_type.h"
21 #include "base/memory/referenced.h"
22 #include "base/utils/utils.h"
23 #include "bridge/declarative_frontend/engine/jsi/jsi_types.h"
24 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_render_node_bridge.h"
25 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_utils_bridge.h"
26 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_xcomponent_bridge.h"
27 #include "core/components_ng/base/view_abstract.h"
28 #include "core/components_ng/pattern/custom_frame_node/custom_frame_node.h"
29 #include "core/components_ng/pattern/custom_frame_node/custom_frame_node_pattern.h"
30 #include "core/components_ng/pattern/xcomponent/xcomponent_model_ng.h"
31 #include "core/components_ng/syntax/node_content.h"
32 #include "core/interfaces/arkoala/arkoala_api.h"
33 #include "core/interfaces/native/node/extension_custom_node.h"
34 #include "frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
35 
36 namespace OHOS::Ace::NG {
37 namespace {
38 
39 constexpr double VISIBLE_RATIO_MIN = 0.0;
40 constexpr double VISIBLE_RATIO_MAX = 1.0;
41 constexpr int32_t INDEX_OF_INTERVAL = 4;
42 constexpr int32_t INDEX_OF_OPTION_OF_VISIBLE = 3;
43 
GetIsExpanded(ArkUIRuntimeCallInfo * runtimeCallInfo,ArkUI_Int32 index)44 ArkUI_Bool GetIsExpanded(ArkUIRuntimeCallInfo* runtimeCallInfo, ArkUI_Int32 index)
45 {
46     EcmaVM* vm = runtimeCallInfo->GetVM();
47     Local<JSValueRef> isExpandedArg = runtimeCallInfo->GetCallArgRef(index);
48     CHECK_NULL_RETURN(!isExpandedArg.IsNull(), true);
49     return isExpandedArg->IsBoolean() ? isExpandedArg->ToBoolean(vm)->Value() : true;
50 }
51 } // namespace
IsCustomFrameNode(FrameNode * node)52 ArkUI_Bool FrameNodeBridge::IsCustomFrameNode(FrameNode* node)
53 {
54     return node && (node->IsArkTsFrameNode() || node->GetIsRootBuilderNode());
55 }
56 
GetFrameNode(ArkUIRuntimeCallInfo * runtimeCallInfo)57 ArkUINodeHandle FrameNodeBridge::GetFrameNode(ArkUIRuntimeCallInfo* runtimeCallInfo)
58 {
59     EcmaVM* vm = runtimeCallInfo->GetVM();
60     CHECK_NULL_RETURN(vm, nullptr);
61     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
62     CHECK_NULL_RETURN(!firstArg.IsNull(), nullptr);
63     auto* nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
64     return nativeNode;
65 }
GetInstanceId(ArkUIRuntimeCallInfo * runtimeCallInfo)66 int FrameNodeBridge::GetInstanceId(ArkUIRuntimeCallInfo* runtimeCallInfo)
67 {
68     EcmaVM* vm = runtimeCallInfo->GetVM();
69     CHECK_NULL_RETURN(vm, -1);
70     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(2); // index of instanceId
71     CHECK_NULL_RETURN(!thirdArg.IsNull(), -1);
72     return thirdArg->ToNumber(vm)->Value();
73 }
74 
CreateEventTargetObject(EcmaVM * vm,const BaseEventInfo & info)75 Local<panda::ObjectRef> FrameNodeBridge::CreateEventTargetObject(EcmaVM* vm, const BaseEventInfo& info)
76 {
77     const auto& localOffset = info.GetTarget().area.GetOffset();
78     const auto& origin = info.GetTarget().origin;
79     const char* keysOfOffset[] = { "x", "y" };
80     Local<JSValueRef> valuesOfOffset[] = { panda::NumberRef::New(vm, localOffset.GetX().ConvertToVp()),
81         panda::NumberRef::New(vm, localOffset.GetY().ConvertToVp()) };
82     auto offset = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keysOfOffset), keysOfOffset, valuesOfOffset);
83 
84     const char* keysOfGlobalOffset[] = { "x", "y" };
85     Local<JSValueRef> valuesOfGlobalOffset[] = { panda::NumberRef::New(
86         vm, (origin.GetX() + localOffset.GetX()).ConvertToVp()),
87         panda::NumberRef::New(vm, (origin.GetY() + localOffset.GetY()).ConvertToVp()) };
88     auto globalOffset = panda::ObjectRef::NewWithNamedProperties(
89         vm, ArraySize(keysOfGlobalOffset), keysOfGlobalOffset, valuesOfGlobalOffset);
90     const char* keysOfArea[] = { "position", "globalPosition", "width", "height" };
91     Local<JSValueRef> valuesOfArea[] = { offset, globalOffset,
92         panda::NumberRef::New(vm, info.GetTarget().area.GetWidth().ConvertToVp()),
93         panda::NumberRef::New(vm, info.GetTarget().area.GetHeight().ConvertToVp()) };
94     auto area = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keysOfArea), keysOfArea, valuesOfArea);
95     auto target = panda::ObjectRef::New(vm);
96     target->Set(vm, panda::StringRef::NewFromUtf8(vm, "area"), area);
97     return target;
98 }
99 
CreateTouchInfo(EcmaVM * vm,const TouchLocationInfo & touchInfo,TouchEventInfo & info)100 Local<panda::ObjectRef> FrameNodeBridge::CreateTouchInfo(
101     EcmaVM* vm, const TouchLocationInfo& touchInfo, TouchEventInfo& info)
102 {
103     double density = PipelineBase::GetCurrentDensity();
104     const Offset& globalOffset = touchInfo.GetGlobalLocation();
105     const Offset& localOffset = touchInfo.GetLocalLocation();
106     const Offset& screenOffset = touchInfo.GetScreenLocation();
107     const char* keys[] = { "type", "id", "displayX", "displayY", "windowX", "windowY", "screenX", "screenY", "x", "y" };
108     Local<JSValueRef> values[] = { panda::NumberRef::New(vm, static_cast<int32_t>(touchInfo.GetTouchType())),
109         panda::NumberRef::New(vm, touchInfo.GetFingerId()), panda::NumberRef::New(vm, screenOffset.GetX() / density),
110         panda::NumberRef::New(vm, screenOffset.GetY() / density),
111         panda::NumberRef::New(vm, globalOffset.GetX() / density),
112         panda::NumberRef::New(vm, globalOffset.GetY() / density),
113         panda::NumberRef::New(vm, globalOffset.GetX() / density),
114         panda::NumberRef::New(vm, globalOffset.GetY() / density),
115         panda::NumberRef::New(vm, localOffset.GetX() / density),
116         panda::NumberRef::New(vm, localOffset.GetY() / density) };
117     auto touchInfoObj = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
118     touchInfoObj->SetNativePointerFieldCount(vm, 1);
119     touchInfoObj->SetNativePointerField(vm, 0, static_cast<void*>(&info));
120     return touchInfoObj;
121 }
122 
IsModifiable(ArkUIRuntimeCallInfo * runtimeCallInfo)123 ArkUINativeModuleValue FrameNodeBridge::IsModifiable(ArkUIRuntimeCallInfo* runtimeCallInfo)
124 {
125     EcmaVM* vm = runtimeCallInfo->GetVM();
126     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
127     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::BooleanRef::New(vm, false));
128     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
129     auto result = GetArkUINodeModifiers()->getFrameNodeModifier()->isModifiable(nativeNode);
130     return panda::BooleanRef::New(vm, result);
131 }
132 
MakeFrameNodeInfo(EcmaVM * vm,ArkUINodeHandle frameNode)133 ArkUINativeModuleValue FrameNodeBridge::MakeFrameNodeInfo(EcmaVM* vm, ArkUINodeHandle frameNode)
134 {
135     const char* keys[] = { "nodeId", "nodePtr" };
136     auto nodeId = GetArkUINodeModifiers()->getFrameNodeModifier()->getIdByNodePtr(frameNode);
137     Local<JSValueRef> values[] = { panda::NumberRef::New(vm, nodeId), panda::NativePointerRef::New(vm, frameNode) };
138     auto obj = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
139     return obj;
140 }
141 
CreateFrameNode(ArkUIRuntimeCallInfo * runtimeCallInfo)142 ArkUINativeModuleValue FrameNodeBridge::CreateFrameNode(ArkUIRuntimeCallInfo* runtimeCallInfo)
143 {
144     EcmaVM* vm = runtimeCallInfo->GetVM();
145     auto nodeId = ElementRegister::GetInstance()->MakeUniqueId();
146     auto node = NG::CustomFrameNode::GetOrCreateCustomFrameNode(nodeId);
147     node->SetExclusiveEventForChild(true);
148     node->SetIsArkTsFrameNode(true);
149     FrameNodeBridge::SetDrawFunc(node, runtimeCallInfo);
150     FrameNodeBridge::SetCustomFunc(node, runtimeCallInfo);
151     const char* keys[] = { "nodeId", "nativeStrongRef" };
152     Local<JSValueRef> values[] = { panda::NumberRef::New(vm, nodeId), NativeUtilsBridge::CreateStrongRef(vm, node) };
153     auto reslut = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
154     return reslut;
155 }
156 
SetCustomFunc(const RefPtr<FrameNode> & frameNode,ArkUIRuntimeCallInfo * runtimeCallInfo)157 void FrameNodeBridge::SetCustomFunc(const RefPtr<FrameNode>& frameNode, ArkUIRuntimeCallInfo* runtimeCallInfo)
158 {
159     CHECK_NULL_VOID(frameNode);
160     EcmaVM* vm = runtimeCallInfo->GetVM();
161     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
162     CHECK_NULL_VOID(firstArg->IsObject(vm));
163     auto obj = Local<panda::ObjectRef>(firstArg);
164 
165     auto customFuncExisted = false;
166     auto measureFuncName = panda::StringRef::NewFromUtf8(vm, "onMeasure");
167     auto measureFuncObj = obj->Get(vm, measureFuncName);
168     auto customNode = AceType::MakeRefPtr<ExtensionCustomNode>();
169     if (measureFuncObj->IsFunction(vm)) {
170         customFuncExisted = true;
171         customNode->SetMeasureCallback(FrameNodeBridge::GetMeasureFunc(vm, obj));
172     }
173     auto layoutFuncName = panda::StringRef::NewFromUtf8(vm, "onLayout");
174     auto layoutFuncObj = obj->Get(vm, layoutFuncName);
175     if (layoutFuncObj->IsFunction(vm)) {
176         customFuncExisted = true;
177         customNode->SetLayoutCallback(FrameNodeBridge::GetLayoutFunc(vm, obj));
178     }
179 
180     if (!customFuncExisted) {
181         return;
182     }
183 
184     frameNode->SetExtensionHandler(customNode);
185 }
186 
GetMeasureFunc(EcmaVM * vm,Local<panda::ObjectRef> obj)187 std::function<void(LayoutConstraintF& layoutConstraint)> FrameNodeBridge::GetMeasureFunc(
188     EcmaVM* vm, Local<panda::ObjectRef> obj)
189 {
190     return [vm, object = JsWeak(panda::CopyableGlobal(vm, obj))](LayoutConstraintF& layoutConstraint) {
191         panda::LocalScope pandaScope(vm);
192         panda::TryCatch trycatch(vm);
193         auto funcName = panda::StringRef::NewFromUtf8(vm, "onMeasure");
194         FrameNodeBridge::FireMeasureCallback(vm, object, layoutConstraint, funcName);
195     };
196 }
197 
GetLayoutFunc(EcmaVM * vm,Local<panda::ObjectRef> obj)198 std::function<void(OffsetF& position)> FrameNodeBridge::GetLayoutFunc(EcmaVM* vm, Local<panda::ObjectRef> obj)
199 {
200     return [vm, object = JsWeak(panda::CopyableGlobal(vm, obj))](OffsetF& position) {
201         panda::LocalScope pandaScope(vm);
202         panda::TryCatch trycatch(vm);
203         auto funcName = panda::StringRef::NewFromUtf8(vm, "onLayout");
204         FrameNodeBridge::FireLayoutCallback(vm, object, position, funcName);
205     };
206 }
207 
FireMeasureCallback(EcmaVM * vm,JsWeak<panda::CopyableGlobal<panda::ObjectRef>> object,LayoutConstraintF & layoutConstraint,Local<panda::StringRef> funcName)208 void FrameNodeBridge::FireMeasureCallback(EcmaVM* vm, JsWeak<panda::CopyableGlobal<panda::ObjectRef>> object,
209     LayoutConstraintF& layoutConstraint, Local<panda::StringRef> funcName)
210 {
211     auto obj = object.Lock();
212     CHECK_NULL_VOID(!obj.IsEmpty());
213     CHECK_NULL_VOID(obj->IsObject(vm));
214     auto funcObj = obj->Get(vm, funcName);
215     CHECK_NULL_VOID(funcObj->IsFunction(vm));
216     panda::Local<panda::FunctionRef> func = funcObj;
217     auto replaceInfinityFunc = [](float value) -> double {
218         double res = static_cast<double>(value);
219         if (GreatOrEqual(res, Infinity<double>())) {
220             return std::numeric_limits<double>::infinity();
221         }
222 
223         if (LessOrEqual(res, -Infinity<double>())) {
224             return -std::numeric_limits<double>::infinity();
225         }
226 
227         return res;
228     };
229 
230     const char* keysOfSize[] = { "height", "width" };
231     Local<JSValueRef> valuesOfMaxSize[] = {
232         panda::NumberRef::New(vm, replaceInfinityFunc(layoutConstraint.maxSize.Height())),
233         panda::NumberRef::New(vm, replaceInfinityFunc(layoutConstraint.maxSize.Width())) };
234     Local<JSValueRef> valuesOfMinSize[] = {
235         panda::NumberRef::New(vm, replaceInfinityFunc(layoutConstraint.minSize.Height())),
236         panda::NumberRef::New(vm, replaceInfinityFunc(layoutConstraint.minSize.Width())) };
237     Local<JSValueRef> valuesOfPercentReference[] = {
238         panda::NumberRef::New(vm, replaceInfinityFunc(layoutConstraint.percentReference.Height())),
239         panda::NumberRef::New(vm, replaceInfinityFunc(layoutConstraint.percentReference.Width()))
240     };
241     auto maxSizeObj = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keysOfSize), keysOfSize, valuesOfMaxSize);
242     auto minSizeObj = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keysOfSize), keysOfSize, valuesOfMinSize);
243     auto percentReferenceObj =
244         panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keysOfSize), keysOfSize, valuesOfPercentReference);
245 
246     Local<JSValueRef> values[] = { maxSizeObj, minSizeObj, percentReferenceObj };
247     const char* keys[] = { "maxSize", "minSize", "percentReference" };
248     auto constraintObj = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
249     panda::Local<panda::JSValueRef> params[1] = { constraintObj };
250     func->Call(vm, obj.ToLocal(), params, 1);
251 }
252 
FireLayoutCallback(EcmaVM * vm,JsWeak<panda::CopyableGlobal<panda::ObjectRef>> object,OffsetF & position,Local<panda::StringRef> funcName)253 void FrameNodeBridge::FireLayoutCallback(EcmaVM* vm, JsWeak<panda::CopyableGlobal<panda::ObjectRef>> object,
254     OffsetF& position, Local<panda::StringRef> funcName)
255 {
256     auto obj = object.Lock();
257     CHECK_NULL_VOID(!obj.IsEmpty());
258     CHECK_NULL_VOID(obj->IsObject(vm));
259     auto funcObj = obj->Get(vm, funcName);
260     CHECK_NULL_VOID(funcObj->IsFunction(vm));
261     panda::Local<panda::FunctionRef> func = funcObj;
262 
263     const char* keys[] = { "x", "y" };
264     Local<JSValueRef> valuesOfPosition[] = { panda::NumberRef::New(vm, static_cast<double>(position.GetX())),
265         panda::NumberRef::New(vm, static_cast<double>(position.GetY())) };
266 
267     auto positionObj = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, valuesOfPosition);
268     panda::Local<panda::JSValueRef> params[1] = { positionObj };
269     func->Call(vm, obj.ToLocal(), params, 1);
270 }
271 
CreateTypedFrameNode(ArkUIRuntimeCallInfo * runtimeCallInfo)272 ArkUINativeModuleValue FrameNodeBridge::CreateTypedFrameNode(ArkUIRuntimeCallInfo* runtimeCallInfo)
273 {
274     EcmaVM* vm = runtimeCallInfo->GetVM();
275     auto nodeId = ElementRegister::GetInstance()->MakeUniqueId();
276     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(1);
277     std::string type = firstArg->IsString(vm) ? firstArg->ToString(vm)->ToString(vm) : "";
278     static const std::unordered_map<std::string, ArkUINodeType> typeMap = { { "Text", ARKUI_TEXT },
279         { "Column", ARKUI_COLUMN }, { "Row", ARKUI_ROW }, { "Stack", ARKUI_STACK }, { "Blank", ARKUI_BLANK },
280         { "Image", ARKUI_IMAGE }, { "GridRow", ARKUI_GRID_ROW }, { "GridCol", ARKUI_GRID_COL }, { "Flex", ARKUI_FLEX },
281         { "Swiper", ARKUI_SWIPER }, { "Progress", ARKUI_PROGRESS }, { "List", ARKUI_LIST },
282         { "ListItem", ARKUI_LIST_ITEM }, { "Scroll", ARKUI_SCROLL }, { "RelativeContainer", ARKUI_RELATIVE_CONTAINER },
283         { "Divider", ARKUI_DIVIDER }, { "LoadingProgress", ARKUI_LOADING_PROGRESS }, { "TextInput", ARKUI_TEXT_INPUT },
284         { "Search", ARKUI_SEARCH }, { "Button", ARKUI_BUTTON }, { "XComponent", ARKUI_XCOMPONENT },
285         { "ListItemGroup", ARKUI_LIST_ITEM_GROUP }, { "WaterFlow", ARKUI_WATER_FLOW },
286         { "FlowItem", ARKUI_FLOW_ITEM} };
287     ArkUINodeType nodeType = ARKUI_CUSTOM;
288     RefPtr<FrameNode> node;
289     ArkUINodeHandle nodePtr = nullptr;
290     auto iter = typeMap.find(type);
291     if (iter != typeMap.end()) {
292         nodeType = iter->second;
293         if (nodeType != ARKUI_CUSTOM) {
294             if (nodeType == ARKUI_XCOMPONENT) {
295 #ifdef XCOMPONENT_SUPPORTED
296                 ArkUI_XComponent_Params params;
297                 XComponentBridge::ParseParams(runtimeCallInfo, params);
298                 params.nodeType = ARKUI_XCOMPONENT;
299                 nodePtr = GetArkUIFullNodeAPI()->getBasicAPI()->createNodeWithParams(nodeType, nodeId, 0, params);
300                 XComponentBridge::SetControllerCallback(runtimeCallInfo, reinterpret_cast<FrameNode*>(nodePtr));
301 #else
302                 nodePtr = GetArkUIFullNodeAPI()->getBasicAPI()->createNode(nodeType, nodeId, 0);
303 #endif
304             } else {
305                 nodePtr = GetArkUIFullNodeAPI()->getBasicAPI()->createNode(nodeType, nodeId, 0);
306             }
307             if (nodePtr) {
308                 node = AceType::Claim(reinterpret_cast<FrameNode*>(nodePtr));
309                 node->SetIsArkTsFrameNode(true);
310                 // let 'node' take the reference, so decrease ref of C node
311                 node->DecRefCount();
312             }
313         }
314     }
315 
316     const char* keys[] = { "nodeId", "nativeStrongRef" };
317     Local<JSValueRef> values[] = { panda::NumberRef::New(vm, nodeId), NativeUtilsBridge::CreateStrongRef(vm, node) };
318     auto reslut = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
319     return reslut;
320 } // namespace OHOS::Ace::NG
321 
Invalidate(ArkUIRuntimeCallInfo * runtimeCallInfo)322 ArkUINativeModuleValue FrameNodeBridge::Invalidate(ArkUIRuntimeCallInfo* runtimeCallInfo)
323 {
324     EcmaVM* vm = runtimeCallInfo->GetVM();
325     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
326     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
327     GetArkUINodeModifiers()->getFrameNodeModifier()->invalidate(nativeNode);
328     return panda::JSValueRef::Undefined(vm);
329 }
330 
SetDrawFunc(const RefPtr<FrameNode> & frameNode,ArkUIRuntimeCallInfo * runtimeCallInfo)331 void FrameNodeBridge::SetDrawFunc(const RefPtr<FrameNode>& frameNode, ArkUIRuntimeCallInfo* runtimeCallInfo)
332 {
333     CHECK_NULL_VOID(frameNode);
334     EcmaVM* vm = runtimeCallInfo->GetVM();
335     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
336     CHECK_NULL_VOID(firstArg->IsObject(vm));
337     auto obj = Local<panda::ObjectRef>(firstArg);
338     auto funcName = panda::StringRef::NewFromUtf8(vm, "onDraw");
339     auto funcObj = obj->Get(vm, funcName);
340     CHECK_NULL_VOID(funcObj->IsFunction(vm));
341     auto drawCallback = [vm, object = JsWeak(panda::CopyableGlobal(vm, obj))](NG::DrawingContext& context) {
342         panda::LocalScope pandaScope(vm);
343         panda::TryCatch trycatch(vm);
344         auto funcName = panda::StringRef::NewFromUtf8(vm, "onDraw");
345         RenderNodeBridge::FireDrawCallback(vm, object, context, funcName);
346     };
347     auto pattern = frameNode->GetPattern<NG::CustomFrameNodePattern>();
348     pattern->SetDrawCallback(std::move(drawCallback));
349 }
350 
AppendChild(ArkUIRuntimeCallInfo * runtimeCallInfo)351 ArkUINativeModuleValue FrameNodeBridge::AppendChild(ArkUIRuntimeCallInfo* runtimeCallInfo)
352 {
353     EcmaVM* vm = runtimeCallInfo->GetVM();
354     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
355     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::BooleanRef::New(vm, true));
356     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
357     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
358     auto childNativeNode = nodePtr(secondArg->ToNativePointer(vm)->Value());
359     auto result = GetArkUINodeModifiers()->getFrameNodeModifier()->appendChild(nativeNode, childNativeNode);
360     return panda::BooleanRef::New(vm, result);
361 }
InsertChildAfter(ArkUIRuntimeCallInfo * runtimeCallInfo)362 ArkUINativeModuleValue FrameNodeBridge::InsertChildAfter(ArkUIRuntimeCallInfo* runtimeCallInfo)
363 {
364     EcmaVM* vm = runtimeCallInfo->GetVM();
365     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
366     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::BooleanRef::New(vm, true));
367     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
368     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
369     auto child = nodePtr(secondArg->ToNativePointer(vm)->Value());
370     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(2); // 2 : index to get the insert node
371     if (thirdArg.IsNull()) {
372         GetArkUINodeModifiers()->getFrameNodeModifier()->insertChildAfter(nativeNode, child, nullptr);
373         return panda::JSValueRef::Undefined(vm);
374     }
375     auto sibling = nodePtr(thirdArg->ToNativePointer(vm)->Value());
376     auto result = GetArkUINodeModifiers()->getFrameNodeModifier()->insertChildAfter(nativeNode, child, sibling);
377     return panda::BooleanRef::New(vm, result);
378 }
RemoveChild(ArkUIRuntimeCallInfo * runtimeCallInfo)379 ArkUINativeModuleValue FrameNodeBridge::RemoveChild(ArkUIRuntimeCallInfo* runtimeCallInfo)
380 {
381     EcmaVM* vm = runtimeCallInfo->GetVM();
382     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
383     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::JSValueRef::Undefined(vm));
384     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
385     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
386     auto childNativeNode = nodePtr(secondArg->ToNativePointer(vm)->Value());
387     GetArkUINodeModifiers()->getFrameNodeModifier()->removeChild(nativeNode, childNativeNode);
388     return panda::JSValueRef::Undefined(vm);
389 }
ClearChildren(ArkUIRuntimeCallInfo * runtimeCallInfo)390 ArkUINativeModuleValue FrameNodeBridge::ClearChildren(ArkUIRuntimeCallInfo* runtimeCallInfo)
391 {
392     EcmaVM* vm = runtimeCallInfo->GetVM();
393     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
394     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::JSValueRef::Undefined(vm));
395     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
396     GetArkUINodeModifiers()->getFrameNodeModifier()->clearChildren(nativeNode);
397     return panda::JSValueRef::Undefined(vm);
398 }
399 
GetChildrenCount(ArkUIRuntimeCallInfo * runtimeCallInfo)400 ArkUINativeModuleValue FrameNodeBridge::GetChildrenCount(ArkUIRuntimeCallInfo* runtimeCallInfo)
401 {
402     EcmaVM* vm = runtimeCallInfo->GetVM();
403     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
404     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::NumberRef::New(vm, 0));
405     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
406     int isExpanded = GetIsExpanded(runtimeCallInfo, 1);
407     auto number = GetArkUINodeModifiers()->getFrameNodeModifier()->getChildrenCount(nativeNode, isExpanded);
408     return panda::NumberRef::New(vm, number);
409 }
410 
GetChild(ArkUIRuntimeCallInfo * runtimeCallInfo)411 ArkUINativeModuleValue FrameNodeBridge::GetChild(ArkUIRuntimeCallInfo* runtimeCallInfo)
412 {
413     EcmaVM* vm = runtimeCallInfo->GetVM();
414     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
415     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::JSValueRef::Undefined(vm));
416     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
417     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
418     int index = secondArg->ToNumber(vm)->Value();
419     int isExpanded = GetIsExpanded(runtimeCallInfo, 2);
420     auto nodePtr = GetArkUINodeModifiers()->getFrameNodeModifier()->getChild(nativeNode, index, isExpanded);
421     CHECK_NULL_RETURN(nodePtr, panda::JSValueRef::Undefined(vm));
422     return FrameNodeBridge::MakeFrameNodeInfo(vm, nodePtr);
423 }
424 
GetFirst(ArkUIRuntimeCallInfo * runtimeCallInfo)425 ArkUINativeModuleValue FrameNodeBridge::GetFirst(ArkUIRuntimeCallInfo* runtimeCallInfo)
426 {
427     EcmaVM* vm = runtimeCallInfo->GetVM();
428     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
429     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::JSValueRef::Undefined(vm));
430     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
431     int isExpanded = GetIsExpanded(runtimeCallInfo, 1);
432     auto nodePtr = GetArkUINodeModifiers()->getFrameNodeModifier()->getFirst(nativeNode, isExpanded);
433     CHECK_NULL_RETURN(nodePtr, panda::JSValueRef::Undefined(vm));
434     return FrameNodeBridge::MakeFrameNodeInfo(vm, nodePtr);
435 }
436 
GetNextSibling(ArkUIRuntimeCallInfo * runtimeCallInfo)437 ArkUINativeModuleValue FrameNodeBridge::GetNextSibling(ArkUIRuntimeCallInfo* runtimeCallInfo)
438 {
439     EcmaVM* vm = runtimeCallInfo->GetVM();
440     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
441     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::JSValueRef::Undefined(vm));
442     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
443     int isExpanded = GetIsExpanded(runtimeCallInfo, 1);
444     auto nodePtr = GetArkUINodeModifiers()->getFrameNodeModifier()->getNextSibling(nativeNode, isExpanded);
445     CHECK_NULL_RETURN(nodePtr, panda::JSValueRef::Undefined(vm));
446     return FrameNodeBridge::MakeFrameNodeInfo(vm, nodePtr);
447 }
448 
GetPreviousSibling(ArkUIRuntimeCallInfo * runtimeCallInfo)449 ArkUINativeModuleValue FrameNodeBridge::GetPreviousSibling(ArkUIRuntimeCallInfo* runtimeCallInfo)
450 {
451     EcmaVM* vm = runtimeCallInfo->GetVM();
452     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
453     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::JSValueRef::Undefined(vm));
454     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
455     int isExpanded = GetIsExpanded(runtimeCallInfo, 1);
456     auto nodePtr = GetArkUINodeModifiers()->getFrameNodeModifier()->getPreviousSibling(nativeNode, isExpanded);
457     CHECK_NULL_RETURN(nodePtr, panda::JSValueRef::Undefined(vm));
458     return FrameNodeBridge::MakeFrameNodeInfo(vm, nodePtr);
459 }
460 
GetParent(ArkUIRuntimeCallInfo * runtimeCallInfo)461 ArkUINativeModuleValue FrameNodeBridge::GetParent(ArkUIRuntimeCallInfo* runtimeCallInfo)
462 {
463     EcmaVM* vm = runtimeCallInfo->GetVM();
464     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
465     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::JSValueRef::Undefined(vm));
466     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
467     auto nodePtr = GetArkUINodeModifiers()->getFrameNodeModifier()->getParent(nativeNode);
468     CHECK_NULL_RETURN(nodePtr, panda::JSValueRef::Undefined(vm));
469     return FrameNodeBridge::MakeFrameNodeInfo(vm, nodePtr);
470 }
GetIdByNodePtr(ArkUIRuntimeCallInfo * runtimeCallInfo)471 ArkUINativeModuleValue FrameNodeBridge::GetIdByNodePtr(ArkUIRuntimeCallInfo* runtimeCallInfo)
472 {
473     EcmaVM* vm = runtimeCallInfo->GetVM();
474     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
475     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::NumberRef::New(vm, -1));
476     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
477     auto nodeId = GetArkUINodeModifiers()->getFrameNodeModifier()->getIdByNodePtr(nativeNode);
478     return panda::NumberRef::New(vm, nodeId);
479 }
CreateGestureEventInfo(EcmaVM * vm,GestureEvent & info)480 Local<panda::ObjectRef> FrameNodeBridge::CreateGestureEventInfo(EcmaVM* vm, GestureEvent& info)
481 {
482     const Offset& globalOffset = info.GetGlobalLocation();
483     const Offset& localOffset = info.GetLocalLocation();
484     const Offset& screenOffset = info.GetScreenLocation();
485     double density = PipelineBase::GetCurrentDensity();
486 
487     const char* keys[] = { "displayX", "displayY", "windowX", "windowY", "screenX", "screenY", "x", "y", "timestamp",
488         "source", "pressure", "deviceId" };
489     Local<JSValueRef> values[] = { panda::NumberRef::New(vm, screenOffset.GetX() / density),
490         panda::NumberRef::New(vm, screenOffset.GetY() / density),
491         panda::NumberRef::New(vm, globalOffset.GetX() / density),
492         panda::NumberRef::New(vm, globalOffset.GetY() / density),
493         panda::NumberRef::New(vm, globalOffset.GetX() / density),
494         panda::NumberRef::New(vm, globalOffset.GetY() / density),
495         panda::NumberRef::New(vm, localOffset.GetX() / density),
496         panda::NumberRef::New(vm, localOffset.GetY() / density),
497         panda::NumberRef::New(vm, static_cast<double>(info.GetTimeStamp().time_since_epoch().count())),
498         panda::NumberRef::New(vm, static_cast<int32_t>(info.GetSourceDevice())),
499         panda::NumberRef::New(vm, info.GetForce()),
500         panda::NumberRef::New(vm, info.GetDeviceId()) };
501     auto obj = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
502     if (info.GetTiltX().has_value()) {
503         obj->Set(vm, panda::StringRef::NewFromUtf8(vm, "tiltX"),
504             panda::NumberRef::New(vm, static_cast<int32_t>(info.GetTiltX().value())));
505     }
506     if (info.GetTiltY().has_value()) {
507         obj->Set(vm, panda::StringRef::NewFromUtf8(vm, "tiltY"),
508             panda::NumberRef::New(vm, static_cast<int32_t>(info.GetTiltY().value())));
509     }
510     obj->Set(vm, panda::StringRef::NewFromUtf8(vm, "sourceTool"),
511         panda::NumberRef::New(vm, static_cast<int32_t>(static_cast<int32_t>(info.GetSourceTool()))));
512     obj->Set(vm, panda::StringRef::NewFromUtf8(vm, "target"), CreateEventTargetObject(vm, info));
513     return obj;
514 }
515 
SetOnClick(ArkUIRuntimeCallInfo * runtimeCallInfo)516 ArkUINativeModuleValue FrameNodeBridge::SetOnClick(ArkUIRuntimeCallInfo* runtimeCallInfo)
517 {
518 EcmaVM* vm = runtimeCallInfo->GetVM();
519     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
520     auto* nativeNode = GetFrameNode(runtimeCallInfo);
521     CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm));
522     auto* frameNode = reinterpret_cast<NG::FrameNode*>(nativeNode);
523     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
524     Local<JSValueRef> secondeArg = runtimeCallInfo->GetCallArgRef(1);
525     if (secondeArg->IsUndefined()) {
526         NG::ViewAbstract::ClearJSFrameNodeOnClick(frameNode);
527         return panda::JSValueRef::Undefined(vm);
528     }
529     CHECK_NULL_RETURN(secondeArg->IsFunction(vm), panda::JSValueRef::Undefined(vm));
530     auto obj = secondeArg->ToObject(vm);
531     auto containerId = GetInstanceId(runtimeCallInfo);
532     CHECK_NULL_RETURN(containerId != -1, panda::JSValueRef::Undefined(vm));
533     panda::Local<panda::FunctionRef> func = obj;
534     auto flag = IsCustomFrameNode(frameNode);
535     auto onClick = [vm, func = JSFuncObjRef(panda::CopyableGlobal(vm, func), flag),
536                        node = AceType::WeakClaim(frameNode), containerId](GestureEvent& info) {
537         panda::LocalScope pandaScope(vm);
538         panda::TryCatch trycatch(vm);
539         ContainerScope scope(containerId);
540         auto function = func.Lock();
541         CHECK_NULL_VOID(!function.IsEmpty());
542         CHECK_NULL_VOID(function->IsFunction(vm));
543         PipelineContext::SetCallBackNode(node);
544         auto obj = CreateGestureEventInfo(vm, info);
545         panda::Local<panda::JSValueRef> params[1] = { obj };
546         function->Call(vm, function.ToLocal(), params, 1);
547     };
548     NG::ViewAbstract::SetJSFrameNodeOnClick(frameNode, std::move(onClick));
549     return panda::JSValueRef::Undefined(vm);
550 }
551 
CreateTouchEventInfo(EcmaVM * vm,TouchEventInfo & info)552 Local<panda::ObjectRef> FrameNodeBridge::CreateTouchEventInfo(EcmaVM* vm, TouchEventInfo& info)
553 {
554     const char* keys[] = { "source", "timestamp", "target", "pressure", "deviceId" };
555     Local<JSValueRef> values[] = { panda::NumberRef::New(vm, static_cast<int32_t>(info.GetSourceDevice())),
556         panda::NumberRef::New(vm, static_cast<double>(info.GetTimeStamp().time_since_epoch().count())),
557         CreateEventTargetObject(vm, info), panda::NumberRef::New(vm, info.GetForce()),
558         panda::NumberRef::New(vm, info.GetDeviceId()) };
559     auto eventObj = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
560     eventObj->SetNativePointerFieldCount(vm, 1);
561     eventObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "tiltX"),
562         panda::NumberRef::New(vm, static_cast<int32_t>(info.GetTiltX().value_or(0.0f))));
563     eventObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "tiltY"),
564         panda::NumberRef::New(vm, static_cast<int32_t>(info.GetTiltY().value_or(0.0f))));
565     eventObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "sourceTool"),
566         panda::NumberRef::New(vm, static_cast<int32_t>(static_cast<int32_t>(info.GetSourceTool()))));
567 
568     auto touchArr = panda::ArrayRef::New(vm);
569     const std::list<TouchLocationInfo>& touchList = info.GetTouches();
570     uint32_t idx = 0;
571     for (const TouchLocationInfo& location : touchList) {
572         panda::ArrayRef::SetValueAt(vm, touchArr, idx++, CreateTouchInfo(vm, location, info));
573     }
574     eventObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "touches"), touchArr);
575 
576     auto changeTouchArr = panda::ArrayRef::New(vm);
577     idx = 0; // reset index counter
578     const std::list<TouchLocationInfo>& changeTouch = info.GetChangedTouches();
579     for (const TouchLocationInfo& change : changeTouch) {
580         panda::ArrayRef::SetValueAt(vm, changeTouchArr, idx++, CreateTouchInfo(vm, change, info));
581     }
582     if (changeTouch.size() > 0) {
583         eventObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "type"),
584             panda::NumberRef::New(vm, static_cast<int32_t>(changeTouch.front().GetTouchType())));
585     }
586     eventObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "changedTouches"), changeTouchArr);
587     eventObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "stopPropagation"),
588         panda::FunctionRef::New(vm, Framework::JsStopPropagation));
589     eventObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "getHistoricalPoints"),
590         panda::FunctionRef::New(vm, Framework::JsGetHistoricalPoints));
591     eventObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "axisVertical"),
592         panda::NumberRef::New(vm, static_cast<int32_t>(0.0f)));
593     eventObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "axisHorizontal"),
594         panda::NumberRef::New(vm, static_cast<int32_t>(0.0f)));
595     eventObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "preventDefault"),
596         panda::FunctionRef::New(vm, Framework::JsTouchPreventDefault));
597     eventObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "getModifierKeyState"),
598         panda::FunctionRef::New(vm, ArkTSUtils::JsGetModifierKeyState));
599     eventObj->SetNativePointerField(vm, 0, static_cast<void*>(&info));
600     return eventObj;
601 }
602 
SetOnTouch(ArkUIRuntimeCallInfo * runtimeCallInfo)603 ArkUINativeModuleValue FrameNodeBridge::SetOnTouch(ArkUIRuntimeCallInfo* runtimeCallInfo)
604 {
605     EcmaVM* vm = runtimeCallInfo->GetVM();
606     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
607     auto* nativeNode = GetFrameNode(runtimeCallInfo);
608     CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm));
609     auto* frameNode = reinterpret_cast<NG::FrameNode*>(nativeNode);
610     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
611     Local<JSValueRef> secondeArg = runtimeCallInfo->GetCallArgRef(1);
612     if (secondeArg->IsUndefined()) {
613         NG::ViewAbstract::ClearJSFrameNodeOnTouch(frameNode);
614         return panda::JSValueRef::Undefined(vm);
615     }
616     CHECK_NULL_RETURN(secondeArg->IsFunction(vm), panda::JSValueRef::Undefined(vm));
617     auto obj = secondeArg->ToObject(vm);
618     auto containerId = Container::CurrentId();
619     panda::Local<panda::FunctionRef> func = obj;
620     auto flag = IsCustomFrameNode(frameNode);
621     auto onTouch = [vm, func = JSFuncObjRef(panda::CopyableGlobal(vm, func), flag),
622                        node = AceType::WeakClaim(frameNode), containerId](TouchEventInfo& info) {
623         panda::LocalScope pandaScope(vm);
624         panda::TryCatch trycatch(vm);
625         ContainerScope scope(containerId);
626         auto function = func.Lock();
627         CHECK_NULL_VOID(!function.IsEmpty());
628         CHECK_NULL_VOID(function->IsFunction(vm));
629         PipelineContext::SetCallBackNode(node);
630         auto eventObj = CreateTouchEventInfo(vm, info);
631         panda::Local<panda::JSValueRef> params[1] = { eventObj };
632         function->Call(vm, function.ToLocal(), params, 1);
633     };
634     NG::ViewAbstract::SetJSFrameNodeOnTouch(frameNode, std::move(onTouch));
635     return panda::JSValueRef::Undefined(vm);
636 }
637 
SetOnAppear(ArkUIRuntimeCallInfo * runtimeCallInfo)638 ArkUINativeModuleValue FrameNodeBridge::SetOnAppear(ArkUIRuntimeCallInfo* runtimeCallInfo)
639 {
640     EcmaVM* vm = runtimeCallInfo->GetVM();
641     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
642     auto* nativeNode = GetFrameNode(runtimeCallInfo);
643     CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm));
644     auto* frameNode = reinterpret_cast<NG::FrameNode*>(nativeNode);
645     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
646     Local<JSValueRef> secondeArg = runtimeCallInfo->GetCallArgRef(1);
647     if (secondeArg->IsUndefined()) {
648         NG::ViewAbstract::ClearJSFrameNodeOnAppear(frameNode);
649         return panda::JSValueRef::Undefined(vm);
650     }
651     CHECK_NULL_RETURN(secondeArg->IsFunction(vm), panda::JSValueRef::Undefined(vm));
652     auto obj = secondeArg->ToObject(vm);
653     auto containerId = GetInstanceId(runtimeCallInfo);
654     CHECK_NULL_RETURN(containerId != -1, panda::JSValueRef::Undefined(vm));
655     panda::Local<panda::FunctionRef> func = obj;
656     auto flag = IsCustomFrameNode(frameNode);
657     auto onAppear = [vm, func = JSFuncObjRef(panda::CopyableGlobal(vm, func), flag),
658                         node = AceType::WeakClaim(frameNode), containerId]() {
659         panda::LocalScope pandaScope(vm);
660         panda::TryCatch trycatch(vm);
661         ContainerScope scope(containerId);
662         auto function = func.Lock();
663         CHECK_NULL_VOID(!function.IsEmpty());
664         CHECK_NULL_VOID(function->IsFunction(vm));
665         PipelineContext::SetCallBackNode(node);
666         function->Call(vm, function.ToLocal(), nullptr, 0);
667     };
668     NG::ViewAbstract::SetJSFrameNodeOnAppear(frameNode, std::move(onAppear));
669     return panda::JSValueRef::Undefined(vm);
670 }
671 
SetOnDisappear(ArkUIRuntimeCallInfo * runtimeCallInfo)672 ArkUINativeModuleValue FrameNodeBridge::SetOnDisappear(ArkUIRuntimeCallInfo* runtimeCallInfo)
673 {
674     EcmaVM* vm = runtimeCallInfo->GetVM();
675     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
676     auto* nativeNode = GetFrameNode(runtimeCallInfo);
677     CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm));
678     auto* frameNode = reinterpret_cast<NG::FrameNode*>(nativeNode);
679     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
680     Local<JSValueRef> secondeArg = runtimeCallInfo->GetCallArgRef(1);
681     if (secondeArg->IsUndefined()) {
682         NG::ViewAbstract::ClearJSFrameNodeOnDisappear(frameNode);
683         return panda::JSValueRef::Undefined(vm);
684     }
685     CHECK_NULL_RETURN(secondeArg->IsFunction(vm), panda::JSValueRef::Undefined(vm));
686     auto obj = secondeArg->ToObject(vm);
687     auto containerId = GetInstanceId(runtimeCallInfo);
688     CHECK_NULL_RETURN(containerId != -1, panda::JSValueRef::Undefined(vm));
689     panda::Local<panda::FunctionRef> func = obj;
690     auto flag = IsCustomFrameNode(frameNode);
691     auto onDisappear = [vm, func = JSFuncObjRef(panda::CopyableGlobal(vm, func), flag),
692                            node = AceType::WeakClaim(frameNode), containerId]() {
693         panda::LocalScope pandaScope(vm);
694         panda::TryCatch trycatch(vm);
695         ContainerScope scope(containerId);
696         auto function = func.Lock();
697         CHECK_NULL_VOID(!function.IsEmpty());
698         CHECK_NULL_VOID(function->IsFunction(vm));
699         PipelineContext::SetCallBackNode(node);
700         function->Call(vm, function.ToLocal(), nullptr, 0);
701     };
702     NG::ViewAbstract::SetJSFrameNodeOnDisappear(frameNode, std::move(onDisappear));
703     return panda::JSValueRef::Undefined(vm);
704 }
705 
SetOnKeyEvent(ArkUIRuntimeCallInfo * runtimeCallInfo)706 ArkUINativeModuleValue FrameNodeBridge::SetOnKeyEvent(ArkUIRuntimeCallInfo* runtimeCallInfo)
707 {
708     EcmaVM* vm = runtimeCallInfo->GetVM();
709     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
710     auto* nativeNode = GetFrameNode(runtimeCallInfo);
711     CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm));
712     auto* frameNode = reinterpret_cast<NG::FrameNode*>(nativeNode);
713     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
714     Local<JSValueRef> secondeArg = runtimeCallInfo->GetCallArgRef(1);
715     if (secondeArg->IsUndefined()) {
716         NG::ViewAbstract::ClearJSFrameNodeOnKeyCallback(frameNode);
717         return panda::JSValueRef::Undefined(vm);
718     }
719     CHECK_NULL_RETURN(secondeArg->IsFunction(vm), panda::JSValueRef::Undefined(vm));
720     auto obj = secondeArg->ToObject(vm);
721     auto containerId = GetInstanceId(runtimeCallInfo);
722     CHECK_NULL_RETURN(containerId != -1, panda::JSValueRef::Undefined(vm));
723     panda::Local<panda::FunctionRef> func = obj;
724     auto flag = IsCustomFrameNode(frameNode);
725     auto onKeyEvent = [vm, func = JSFuncObjRef(panda::CopyableGlobal(vm, func), flag),
726                           node = AceType::WeakClaim(frameNode), containerId](KeyEventInfo& info) {
727         panda::LocalScope pandaScope(vm);
728         panda::TryCatch trycatch(vm);
729         ContainerScope scope(containerId);
730         auto function = func.Lock();
731         CHECK_NULL_VOID(!function.IsEmpty());
732         CHECK_NULL_VOID(function->IsFunction(vm));
733         PipelineContext::SetCallBackNode(node);
734         const char* keys[] = { "type", "keyCode", "keyText", "keySource", "deviceId", "metaKey", "timestamp",
735             "stopPropagation", "getModifierKeyState", "intentionCode" };
736         Local<JSValueRef> values[] = { panda::NumberRef::New(vm, static_cast<int32_t>(info.GetKeyType())),
737             panda::NumberRef::New(vm, static_cast<int32_t>(info.GetKeyCode())),
738             panda::StringRef::NewFromUtf8(vm, info.GetKeyText()),
739             panda::NumberRef::New(vm, static_cast<int32_t>(info.GetKeySource())),
740             panda::NumberRef::New(vm, info.GetDeviceId()), panda::NumberRef::New(vm, info.GetMetaKey()),
741             panda::NumberRef::New(vm, static_cast<double>(info.GetTimeStamp().time_since_epoch().count())),
742             panda::FunctionRef::New(vm, Framework::JsStopPropagation),
743             panda::FunctionRef::New(vm, NG::ArkTSUtils::JsGetModifierKeyState),
744             panda::NumberRef::New(vm, static_cast<int32_t>(info.GetKeyIntention())) };
745         auto obj = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
746         obj->SetNativePointerFieldCount(vm, 1);
747         obj->SetNativePointerField(vm, 0, static_cast<void*>(&info));
748         panda::Local<panda::JSValueRef> params[] = { obj };
749         function->Call(vm, function.ToLocal(), params, 1);
750     };
751 
752     NG::ViewAbstract::SetJSFrameNodeOnKeyCallback(frameNode, std::move(onKeyEvent));
753     return panda::JSValueRef::Undefined(vm);
754 }
755 
SetOnFocus(ArkUIRuntimeCallInfo * runtimeCallInfo)756 ArkUINativeModuleValue FrameNodeBridge::SetOnFocus(ArkUIRuntimeCallInfo* runtimeCallInfo)
757 {
758     EcmaVM* vm = runtimeCallInfo->GetVM();
759     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
760     auto* nativeNode = GetFrameNode(runtimeCallInfo);
761     CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm));
762     auto* frameNode = reinterpret_cast<NG::FrameNode*>(nativeNode);
763     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
764     Local<JSValueRef> secondeArg = runtimeCallInfo->GetCallArgRef(1);
765     if (secondeArg->IsUndefined()) {
766         NG::ViewAbstract::ClearJSFrameNodeOnFocusCallback(frameNode);
767         return panda::JSValueRef::Undefined(vm);
768     }
769     CHECK_NULL_RETURN(secondeArg->IsFunction(vm), panda::JSValueRef::Undefined(vm));
770     auto obj = secondeArg->ToObject(vm);
771     auto containerId = GetInstanceId(runtimeCallInfo);
772     CHECK_NULL_RETURN(containerId != -1, panda::JSValueRef::Undefined(vm));
773     panda::Local<panda::FunctionRef> func = obj;
774     auto flag = IsCustomFrameNode(frameNode);
775     auto onFocus = [vm, func = JSFuncObjRef(panda::CopyableGlobal(vm, func), flag),
776                        node = AceType::WeakClaim(frameNode), containerId]() {
777         panda::LocalScope pandaScope(vm);
778         panda::TryCatch trycatch(vm);
779         ContainerScope scope(containerId);
780         auto function = func.Lock();
781         CHECK_NULL_VOID(!function.IsEmpty());
782         CHECK_NULL_VOID(function->IsFunction(vm));
783         PipelineContext::SetCallBackNode(node);
784         function->Call(vm, function.ToLocal(), nullptr, 0);
785     };
786     NG::ViewAbstract::SetJSFrameNodeOnFocusCallback(frameNode, std::move(onFocus));
787     return panda::JSValueRef::Undefined(vm);
788 }
789 
SetOnBlur(ArkUIRuntimeCallInfo * runtimeCallInfo)790 ArkUINativeModuleValue FrameNodeBridge::SetOnBlur(ArkUIRuntimeCallInfo* runtimeCallInfo)
791 {
792     EcmaVM* vm = runtimeCallInfo->GetVM();
793     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
794     auto* nativeNode = GetFrameNode(runtimeCallInfo);
795     CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm));
796     auto* frameNode = reinterpret_cast<NG::FrameNode*>(nativeNode);
797     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
798     Local<JSValueRef> secondeArg = runtimeCallInfo->GetCallArgRef(1);
799     if (secondeArg->IsUndefined()) {
800         NG::ViewAbstract::ClearJSFrameNodeOnBlurCallback(frameNode);
801         return panda::JSValueRef::Undefined(vm);
802     }
803     CHECK_NULL_RETURN(secondeArg->IsFunction(vm), panda::JSValueRef::Undefined(vm));
804     auto obj = secondeArg->ToObject(vm);
805     auto containerId = GetInstanceId(runtimeCallInfo);
806     CHECK_NULL_RETURN(containerId != -1, panda::JSValueRef::Undefined(vm));
807     panda::Local<panda::FunctionRef> func = obj;
808     auto flag = IsCustomFrameNode(frameNode);
809     auto onBlur = [vm, func = JSFuncObjRef(panda::CopyableGlobal(vm, func), flag), node = AceType::WeakClaim(frameNode),
810                       containerId]() {
811         panda::LocalScope pandaScope(vm);
812         panda::TryCatch trycatch(vm);
813         ContainerScope scope(containerId);
814         auto function = func.Lock();
815         CHECK_NULL_VOID(!function.IsEmpty());
816         CHECK_NULL_VOID(function->IsFunction(vm));
817         PipelineContext::SetCallBackNode(node);
818         function->Call(vm, function.ToLocal(), nullptr, 0);
819     };
820     NG::ViewAbstract::SetJSFrameNodeOnBlurCallback(frameNode, std::move(onBlur));
821     return panda::JSValueRef::Undefined(vm);
822 }
823 
SetOnHover(ArkUIRuntimeCallInfo * runtimeCallInfo)824 ArkUINativeModuleValue FrameNodeBridge::SetOnHover(ArkUIRuntimeCallInfo* runtimeCallInfo)
825 {
826     EcmaVM* vm = runtimeCallInfo->GetVM();
827     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
828     auto* nativeNode = GetFrameNode(runtimeCallInfo);
829     CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm));
830     auto* frameNode = reinterpret_cast<NG::FrameNode*>(nativeNode);
831     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
832     Local<JSValueRef> secondeArg = runtimeCallInfo->GetCallArgRef(1);
833     if (secondeArg->IsUndefined()) {
834         NG::ViewAbstract::ClearJSFrameNodeOnHover(frameNode);
835         return panda::JSValueRef::Undefined(vm);
836     }
837     CHECK_NULL_RETURN(secondeArg->IsFunction(vm), panda::JSValueRef::Undefined(vm));
838     auto obj = secondeArg->ToObject(vm);
839     auto containerId = GetInstanceId(runtimeCallInfo);
840     CHECK_NULL_RETURN(containerId != -1, panda::JSValueRef::Undefined(vm));
841     panda::Local<panda::FunctionRef> func = obj;
842     auto flag = IsCustomFrameNode(frameNode);
843     auto onHover = [vm, func = JSFuncObjRef(panda::CopyableGlobal(vm, func), flag),
844                        node = AceType::WeakClaim(frameNode), containerId](bool isHover, HoverInfo& hoverInfo) {
845         panda::LocalScope pandaScope(vm);
846         panda::TryCatch trycatch(vm);
847         ContainerScope scope(containerId);
848         auto function = func.Lock();
849         CHECK_NULL_VOID(!function.IsEmpty());
850         CHECK_NULL_VOID(function->IsFunction(vm));
851         PipelineContext::SetCallBackNode(node);
852         auto isHoverParam = panda::BooleanRef::New(vm, isHover);
853         const char* keys[] = { "stopPropagation", "getModifierKeyState",
854             "timestamp", "source", "target", "deviceId" };
855         Local<JSValueRef> values[] = { panda::FunctionRef::New(vm, Framework::JsStopPropagation),
856             panda::FunctionRef::New(vm, ArkTSUtils::JsGetModifierKeyState),
857             panda::NumberRef::New(vm, static_cast<double>(hoverInfo.GetTimeStamp().time_since_epoch().count())),
858             panda::NumberRef::New(vm, static_cast<int32_t>(hoverInfo.GetSourceDevice())),
859             CreateEventTargetObject(vm, hoverInfo),
860             panda::NumberRef::New(vm, static_cast<int32_t>(hoverInfo.GetDeviceId())) };
861         auto obj = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
862         obj->SetNativePointerFieldCount(vm, 1);
863         obj->SetNativePointerField(vm, 0, static_cast<void*>(&hoverInfo));
864         panda::Local<panda::JSValueRef> params[] = { isHoverParam, obj };
865         function->Call(vm, function.ToLocal(), params, ArraySize(params));
866     };
867     NG::ViewAbstract::SetJSFrameNodeOnHover(frameNode, std::move(onHover));
868     return panda::JSValueRef::Undefined(vm);
869 }
870 
CreateMouseInfo(EcmaVM * vm,MouseInfo & info)871 Local<panda::ObjectRef> FrameNodeBridge::CreateMouseInfo(EcmaVM* vm, MouseInfo& info)
872 {
873     const Offset& globalOffset = info.GetGlobalLocation();
874     const Offset& localOffset = info.GetLocalLocation();
875     const Offset& screenOffset = info.GetScreenLocation();
876     double density = PipelineBase::GetCurrentDensity();
877     const char* keys[] = { "button", "action", "displayX", "displayY", "windowX", "windowY", "screenX", "screenY", "x",
878         "y", "timestamp", "stopPropagation", "getModifierKeyState", "source", "pressure", "deviceId" };
879     Local<JSValueRef> values[] = { panda::NumberRef::New(vm, static_cast<int32_t>(info.GetButton())),
880         panda::NumberRef::New(vm, static_cast<int32_t>(info.GetAction())),
881         panda::NumberRef::New(vm, screenOffset.GetX() / density),
882         panda::NumberRef::New(vm, screenOffset.GetY() / density),
883         panda::NumberRef::New(vm, globalOffset.GetX() / density),
884         panda::NumberRef::New(vm, globalOffset.GetY() / density),
885         panda::NumberRef::New(vm, globalOffset.GetX() / density),
886         panda::NumberRef::New(vm, globalOffset.GetY() / density),
887         panda::NumberRef::New(vm, localOffset.GetX() / density),
888         panda::NumberRef::New(vm, localOffset.GetY() / density),
889         panda::NumberRef::New(vm, static_cast<double>(info.GetTimeStamp().time_since_epoch().count())),
890         panda::FunctionRef::New(vm, Framework::JsStopPropagation),
891         panda::FunctionRef::New(vm, ArkTSUtils::JsGetModifierKeyState),
892         panda::NumberRef::New(vm, static_cast<int32_t>(info.GetSourceDevice())),
893         panda::NumberRef::New(vm, info.GetForce()),
894         panda::NumberRef::New(vm, info.GetDeviceId()) };
895     auto obj = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
896     obj->SetNativePointerFieldCount(vm, 1);
897     if (info.GetTiltX().has_value()) {
898         obj->Set(vm, panda::StringRef::NewFromUtf8(vm, "tiltX"),
899             panda::NumberRef::New(vm, static_cast<int32_t>(info.GetTiltX().value())));
900     }
901     if (info.GetTiltY().has_value()) {
902         obj->Set(vm, panda::StringRef::NewFromUtf8(vm, "tiltY"),
903             panda::NumberRef::New(vm, static_cast<int32_t>(info.GetTiltY().value())));
904     }
905     obj->Set(vm, panda::StringRef::NewFromUtf8(vm, "sourceTool"),
906         panda::NumberRef::New(vm, static_cast<int32_t>(static_cast<int32_t>(info.GetSourceTool()))));
907     obj->Set(vm, panda::StringRef::NewFromUtf8(vm, "target"), CreateEventTargetObject(vm, info));
908     obj->SetNativePointerField(vm, 0, static_cast<void*>(&info));
909     return obj;
910 }
911 
SetOnMouse(ArkUIRuntimeCallInfo * runtimeCallInfo)912 ArkUINativeModuleValue FrameNodeBridge::SetOnMouse(ArkUIRuntimeCallInfo* runtimeCallInfo)
913 {
914     EcmaVM* vm = runtimeCallInfo->GetVM();
915     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
916     auto* nativeNode = GetFrameNode(runtimeCallInfo);
917     CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm));
918     auto* frameNode = reinterpret_cast<NG::FrameNode*>(nativeNode);
919     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
920     Local<JSValueRef> secondeArg = runtimeCallInfo->GetCallArgRef(1);
921     if (secondeArg->IsUndefined()) {
922         NG::ViewAbstract::ClearJSFrameNodeOnMouse(frameNode);
923         return panda::JSValueRef::Undefined(vm);
924     }
925     CHECK_NULL_RETURN(secondeArg->IsFunction(vm), panda::JSValueRef::Undefined(vm));
926     auto obj = secondeArg->ToObject(vm);
927     auto containerId = GetInstanceId(runtimeCallInfo);
928     CHECK_NULL_RETURN(containerId != -1, panda::JSValueRef::Undefined(vm));
929     panda::Local<panda::FunctionRef> func = obj;
930     auto flag = IsCustomFrameNode(frameNode);
931     auto onMouse = [vm, func = JSFuncObjRef(panda::CopyableGlobal(vm, func), flag),
932                        node = AceType::WeakClaim(frameNode), containerId](MouseInfo& info) {
933         panda::LocalScope pandaScope(vm);
934         panda::TryCatch trycatch(vm);
935         ContainerScope scope(containerId);
936         auto function = func.Lock();
937         CHECK_NULL_VOID(!function.IsEmpty());
938         CHECK_NULL_VOID(function->IsFunction(vm));
939         PipelineContext::SetCallBackNode(node);
940         auto obj = CreateMouseInfo(vm, info);
941         panda::Local<panda::JSValueRef> params[1] = { obj };
942         function->Call(vm, function.ToLocal(), params, 1);
943     };
944     NG::ViewAbstract::SetJSFrameNodeOnMouse(frameNode, std::move(onMouse));
945     return panda::JSValueRef::Undefined(vm);
946 }
947 
GetPositionToParent(ArkUIRuntimeCallInfo * runtimeCallInfo)948 ArkUINativeModuleValue FrameNodeBridge::GetPositionToParent(ArkUIRuntimeCallInfo* runtimeCallInfo)
949 {
950     EcmaVM* vm = runtimeCallInfo->GetVM();
951     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
952     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
953     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::JSValueRef::Undefined(vm));
954     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
955     Local<Framework::ArrayRef> valueArray = Framework::ArrayRef::New(vm, 2);
956     ArkUI_Float32 parentOffset[2];
957     GetArkUINodeModifiers()->getFrameNodeModifier()->getPositionToParent(nativeNode, &parentOffset, true);
958     CHECK_NULL_RETURN(parentOffset, panda::JSValueRef::Undefined(vm));
959     Framework::ArrayRef::SetValueAt(vm, valueArray, 0, panda::NumberRef::New(vm, parentOffset[0]));
960     Framework::ArrayRef::SetValueAt(vm, valueArray, 1, panda::NumberRef::New(vm, parentOffset[1]));
961     return valueArray;
962 }
963 
GetPositionToWindow(ArkUIRuntimeCallInfo * runtimeCallInfo)964 ArkUINativeModuleValue FrameNodeBridge::GetPositionToWindow(ArkUIRuntimeCallInfo* runtimeCallInfo)
965 {
966     EcmaVM* vm = runtimeCallInfo->GetVM();
967     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
968     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
969     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::JSValueRef::Undefined(vm));
970     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
971     Local<Framework::ArrayRef> valueArray = Framework::ArrayRef::New(vm, 2);
972     ArkUI_Float32 windowOffset[2];
973     GetArkUINodeModifiers()->getFrameNodeModifier()->getPositionToWindow(nativeNode, &windowOffset, true);
974     CHECK_NULL_RETURN(windowOffset, panda::JSValueRef::Undefined(vm));
975     Framework::ArrayRef::SetValueAt(vm, valueArray, 0, panda::NumberRef::New(vm, windowOffset[0]));
976     Framework::ArrayRef::SetValueAt(vm, valueArray, 1, panda::NumberRef::New(vm, windowOffset[1]));
977     return valueArray;
978 }
979 
GetPositionToScreen(ArkUIRuntimeCallInfo * runtimeCallInfo)980 ArkUINativeModuleValue FrameNodeBridge::GetPositionToScreen(ArkUIRuntimeCallInfo* runtimeCallInfo)
981 {
982     EcmaVM* vm = runtimeCallInfo->GetVM();
983     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
984     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
985     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::JSValueRef::Undefined(vm));
986     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
987     Local<Framework::ArrayRef> valueArray = Framework::ArrayRef::New(vm, 2);
988     ArkUI_Float32 screenPosition[2];
989     GetArkUINodeModifiers()->getFrameNodeModifier()->getPositionToScreen(nativeNode, &screenPosition, true);
990     CHECK_NULL_RETURN(screenPosition, panda::JSValueRef::Undefined(vm));
991     Framework::ArrayRef::SetValueAt(vm, valueArray, 0, panda::NumberRef::New(vm, screenPosition[0]));
992     Framework::ArrayRef::SetValueAt(vm, valueArray, 1, panda::NumberRef::New(vm, screenPosition[1]));
993     return valueArray;
994 }
995 
GetPositionToParentWithTransform(ArkUIRuntimeCallInfo * runtimeCallInfo)996 ArkUINativeModuleValue FrameNodeBridge::GetPositionToParentWithTransform(ArkUIRuntimeCallInfo* runtimeCallInfo)
997 {
998     EcmaVM* vm = runtimeCallInfo->GetVM();
999     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1000     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1001     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::JSValueRef::Undefined(vm));
1002     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1003     Local<Framework::ArrayRef> valueArray = Framework::ArrayRef::New(vm, 2);
1004     ArkUI_Float32 parentPosition[2];
1005     GetArkUINodeModifiers()->getFrameNodeModifier()->getPositionToParentWithTransform(
1006         nativeNode, &parentPosition, true);
1007     CHECK_NULL_RETURN(parentPosition, panda::JSValueRef::Undefined(vm));
1008     Framework::ArrayRef::SetValueAt(vm, valueArray, 0, panda::NumberRef::New(vm, parentPosition[0]));
1009     Framework::ArrayRef::SetValueAt(vm, valueArray, 1, panda::NumberRef::New(vm, parentPosition[1]));
1010     return valueArray;
1011 }
1012 
GetPositionToScreenWithTransform(ArkUIRuntimeCallInfo * runtimeCallInfo)1013 ArkUINativeModuleValue FrameNodeBridge::GetPositionToScreenWithTransform(ArkUIRuntimeCallInfo* runtimeCallInfo)
1014 {
1015     EcmaVM* vm = runtimeCallInfo->GetVM();
1016     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1017     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1018     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::JSValueRef::Undefined(vm));
1019     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1020     Local<Framework::ArrayRef> valueArray = Framework::ArrayRef::New(vm, 2);
1021     ArkUI_Float32 screenPosition[2];
1022     GetArkUINodeModifiers()->getFrameNodeModifier()->getPositionToScreenWithTransform(
1023         nativeNode, &screenPosition, true);
1024     CHECK_NULL_RETURN(screenPosition, panda::JSValueRef::Undefined(vm));
1025     Framework::ArrayRef::SetValueAt(vm, valueArray, 0, panda::NumberRef::New(vm, screenPosition[0]));
1026     Framework::ArrayRef::SetValueAt(vm, valueArray, 1, panda::NumberRef::New(vm, screenPosition[1]));
1027     return valueArray;
1028 }
1029 
GetPositionToWindowWithTransform(ArkUIRuntimeCallInfo * runtimeCallInfo)1030 ArkUINativeModuleValue FrameNodeBridge::GetPositionToWindowWithTransform(ArkUIRuntimeCallInfo* runtimeCallInfo)
1031 {
1032     EcmaVM* vm = runtimeCallInfo->GetVM();
1033     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1034     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1035     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::JSValueRef::Undefined(vm));
1036     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1037     Local<Framework::ArrayRef> valueArray = Framework::ArrayRef::New(vm, 2);
1038     ArkUI_Float32 windowPosition[2];
1039     GetArkUINodeModifiers()->getFrameNodeModifier()->getPositionToWindowWithTransform(
1040         nativeNode, &windowPosition, true);
1041     CHECK_NULL_RETURN(windowPosition, panda::JSValueRef::Undefined(vm));
1042     Framework::ArrayRef::SetValueAt(vm, valueArray, 0, panda::NumberRef::New(vm, windowPosition[0]));
1043     Framework::ArrayRef::SetValueAt(vm, valueArray, 1, panda::NumberRef::New(vm, windowPosition[1]));
1044     return valueArray;
1045 }
1046 
GetMeasuredSize(ArkUIRuntimeCallInfo * runtimeCallInfo)1047 ArkUINativeModuleValue FrameNodeBridge::GetMeasuredSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
1048 {
1049     EcmaVM* vm = runtimeCallInfo->GetVM();
1050     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1051     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1052     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::JSValueRef::Undefined(vm));
1053     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1054     Local<Framework::ArrayRef> valueArray = Framework::ArrayRef::New(vm, 2);
1055     auto size = GetArkUINodeModifiers()->getFrameNodeModifier()->getMeasuredSize(nativeNode);
1056     CHECK_NULL_RETURN(size, panda::JSValueRef::Undefined(vm));
1057     Framework::ArrayRef::SetValueAt(vm, valueArray, 0, panda::NumberRef::New(vm, size[0]));
1058     Framework::ArrayRef::SetValueAt(vm, valueArray, 1, panda::NumberRef::New(vm, size[1]));
1059     return valueArray;
1060 }
SetOnAttach(ArkUIRuntimeCallInfo * runtimeCallInfo)1061 ArkUINativeModuleValue FrameNodeBridge::SetOnAttach(ArkUIRuntimeCallInfo* runtimeCallInfo)
1062 {
1063     EcmaVM* vm = runtimeCallInfo->GetVM();
1064     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1065     auto* nativeNode = GetFrameNode(runtimeCallInfo);
1066     CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm));
1067     auto* frameNode = reinterpret_cast<NG::FrameNode*>(nativeNode);
1068     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1069     Local<JSValueRef> secondeArg = runtimeCallInfo->GetCallArgRef(1);
1070     if (secondeArg->IsUndefined()) {
1071         NG::ViewAbstract::DisableOnAttach(frameNode);
1072         return panda::JSValueRef::Undefined(vm);
1073     }
1074     CHECK_NULL_RETURN(secondeArg->IsFunction(vm), panda::JSValueRef::Undefined(vm));
1075     auto obj = secondeArg->ToObject(vm);
1076     auto containerId = GetInstanceId(runtimeCallInfo);
1077     CHECK_NULL_RETURN(containerId != -1, panda::JSValueRef::Undefined(vm));
1078     panda::Local<panda::FunctionRef> func = obj;
1079     auto onAttach = [vm, func = JsWeak(panda::CopyableGlobal(vm, func)), node = AceType::WeakClaim(frameNode),
1080                         containerId]() {
1081         panda::LocalScope pandaScope(vm);
1082         panda::TryCatch trycatch(vm);
1083         ContainerScope scope(containerId);
1084         auto function = func.Lock();
1085         CHECK_NULL_VOID(!function.IsEmpty());
1086         CHECK_NULL_VOID(function->IsFunction(vm));
1087         PipelineContext::SetCallBackNode(node);
1088         function->Call(vm, function.ToLocal(), nullptr, 0);
1089     };
1090     NG::ViewAbstract::SetOnAttach(frameNode, std::move(onAttach));
1091     return panda::JSValueRef::Undefined(vm);
1092 }
1093 
SetOnDetach(ArkUIRuntimeCallInfo * runtimeCallInfo)1094 ArkUINativeModuleValue FrameNodeBridge::SetOnDetach(ArkUIRuntimeCallInfo* runtimeCallInfo)
1095 {
1096     EcmaVM* vm = runtimeCallInfo->GetVM();
1097     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1098     auto* nativeNode = GetFrameNode(runtimeCallInfo);
1099     CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm));
1100     auto* frameNode = reinterpret_cast<NG::FrameNode*>(nativeNode);
1101     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1102     Local<JSValueRef> secondeArg = runtimeCallInfo->GetCallArgRef(1);
1103     if (secondeArg->IsUndefined()) {
1104         NG::ViewAbstract::DisableOnDetach(frameNode);
1105         return panda::JSValueRef::Undefined(vm);
1106     }
1107     CHECK_NULL_RETURN(secondeArg->IsFunction(vm), panda::JSValueRef::Undefined(vm));
1108     auto obj = secondeArg->ToObject(vm);
1109     auto containerId = GetInstanceId(runtimeCallInfo);
1110     CHECK_NULL_RETURN(containerId != -1, panda::JSValueRef::Undefined(vm));
1111     panda::Local<panda::FunctionRef> func = obj;
1112     auto onDetach = [vm, func = JsWeak(panda::CopyableGlobal(vm, func)), node = AceType::WeakClaim(frameNode),
1113                            containerId]() {
1114         panda::LocalScope pandaScope(vm);
1115         panda::TryCatch trycatch(vm);
1116         ContainerScope scope(containerId);
1117         auto function = func.Lock();
1118         CHECK_NULL_VOID(!function.IsEmpty());
1119         CHECK_NULL_VOID(function->IsFunction(vm));
1120         PipelineContext::SetCallBackNode(node);
1121         function->Call(vm, function.ToLocal(), nullptr, 0);
1122     };
1123     NG::ViewAbstract::SetOnDetach(frameNode, std::move(onDetach));
1124     return panda::JSValueRef::Undefined(vm);
1125 }
1126 
GetLayoutPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)1127 ArkUINativeModuleValue FrameNodeBridge::GetLayoutPosition(ArkUIRuntimeCallInfo* runtimeCallInfo)
1128 {
1129     EcmaVM* vm = runtimeCallInfo->GetVM();
1130     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1131     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1132     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::JSValueRef::Undefined(vm));
1133     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1134     Local<Framework::ArrayRef> valueArray = Framework::ArrayRef::New(vm, 2);
1135     auto position = GetArkUINodeModifiers()->getFrameNodeModifier()->getLayoutPosition(nativeNode);
1136     CHECK_NULL_RETURN(position, panda::JSValueRef::Undefined(vm));
1137     Framework::ArrayRef::SetValueAt(vm, valueArray, 0, panda::NumberRef::New(vm, position[0]));
1138     Framework::ArrayRef::SetValueAt(vm, valueArray, 1, panda::NumberRef::New(vm, position[1]));
1139     return valueArray;
1140 }
GetConfigBorderWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)1141 ArkUINativeModuleValue FrameNodeBridge::GetConfigBorderWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
1142 {
1143     EcmaVM* vm = runtimeCallInfo->GetVM();
1144     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1145     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1146     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::JSValueRef::Undefined(vm));
1147     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1148     Local<Framework::ArrayRef> valueArray = Framework::ArrayRef::New(vm, 8);
1149     ArkUI_Float32 borderWidthValue[4];
1150     ArkUI_Int32 borderWidthUnit[4];
1151     GetArkUINodeModifiers()->getCommonModifier()->getBorderWidthDimension(
1152         nativeNode, &borderWidthValue, &borderWidthUnit);
1153     for (int i = 0; i < 4; i++) {
1154         Framework::ArrayRef::SetValueAt(vm, valueArray, i * 2, panda::NumberRef::New(vm, borderWidthValue[i]));
1155         Framework::ArrayRef::SetValueAt(vm, valueArray, i * 2 + 1, panda::NumberRef::New(vm, borderWidthUnit[i]));
1156     }
1157     return valueArray;
1158 }
GetConfigPadding(ArkUIRuntimeCallInfo * runtimeCallInfo)1159 ArkUINativeModuleValue FrameNodeBridge::GetConfigPadding(ArkUIRuntimeCallInfo* runtimeCallInfo)
1160 {
1161     EcmaVM* vm = runtimeCallInfo->GetVM();
1162     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1163     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1164     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::JSValueRef::Undefined(vm));
1165     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1166     Local<Framework::ArrayRef> valueArray = Framework::ArrayRef::New(vm, 8);
1167     ArkUI_Float32 paddingValue[4];
1168     ArkUI_Int32 paddingUnit[4];
1169     GetArkUINodeModifiers()->getCommonModifier()->getPaddingDimension(nativeNode, &paddingValue, &paddingUnit);
1170     for (int i = 0; i < 4; i++) {
1171         Framework::ArrayRef::SetValueAt(vm, valueArray, i * 2, panda::NumberRef::New(vm, paddingValue[i]));
1172         Framework::ArrayRef::SetValueAt(vm, valueArray, i * 2 + 1, panda::NumberRef::New(vm, paddingUnit[i]));
1173     }
1174     return valueArray;
1175 }
GetConfigMargin(ArkUIRuntimeCallInfo * runtimeCallInfo)1176 ArkUINativeModuleValue FrameNodeBridge::GetConfigMargin(ArkUIRuntimeCallInfo* runtimeCallInfo)
1177 {
1178     EcmaVM* vm = runtimeCallInfo->GetVM();
1179     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1180     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1181     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::JSValueRef::Undefined(vm));
1182     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1183     Local<Framework::ArrayRef> valueArray = Framework::ArrayRef::New(vm, 8);
1184     ArkUI_Float32 marginValue[4];
1185     ArkUI_Int32 marginUnit[4];
1186     GetArkUINodeModifiers()->getCommonModifier()->getMarginDimension(nativeNode, &marginValue, &marginUnit);
1187     for (int i = 0; i < 4; i++) {
1188         Framework::ArrayRef::SetValueAt(vm, valueArray, i * 2, panda::NumberRef::New(vm, marginValue[i]));
1189         Framework::ArrayRef::SetValueAt(vm, valueArray, i * 2 + 1, panda::NumberRef::New(vm, marginUnit[i]));
1190     }
1191     return valueArray;
1192 }
GetConfigSize(ArkUIRuntimeCallInfo * runtimeCallInfo)1193 ArkUINativeModuleValue FrameNodeBridge::GetConfigSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
1194 {
1195     EcmaVM* vm = runtimeCallInfo->GetVM();
1196     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1197     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1198     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::JSValueRef::Undefined(vm));
1199     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1200     Local<Framework::ArrayRef> valueArray = Framework::ArrayRef::New(vm, 4);
1201     ArkUI_Float32 sizeValue[2];
1202     ArkUI_Int32 sizeUnit[2];
1203     GetArkUINodeModifiers()->getCommonModifier()->getConfigSize(nativeNode, &sizeValue, &sizeUnit);
1204     for (int i = 0; i < 2; i++) {
1205         Framework::ArrayRef::SetValueAt(vm, valueArray, i * 2, panda::NumberRef::New(vm, sizeValue[i]));
1206         Framework::ArrayRef::SetValueAt(vm, valueArray, i * 2 + 1, panda::NumberRef::New(vm, sizeUnit[i]));
1207     }
1208     return valueArray;
1209 }
GetId(ArkUIRuntimeCallInfo * runtimeCallInfo)1210 ArkUINativeModuleValue FrameNodeBridge::GetId(ArkUIRuntimeCallInfo* runtimeCallInfo)
1211 {
1212     EcmaVM* vm = runtimeCallInfo->GetVM();
1213     CHECK_NULL_RETURN(vm, panda::StringRef::NewFromUtf8(vm, ""));
1214     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1215     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::StringRef::NewFromUtf8(vm, ""));
1216     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1217     auto inspectorId = GetArkUINodeModifiers()->getFrameNodeModifier()->getInspectorId(nativeNode);
1218     return panda::StringRef::NewFromUtf8(vm, inspectorId);
1219 }
GetNodeType(ArkUIRuntimeCallInfo * runtimeCallInfo)1220 ArkUINativeModuleValue FrameNodeBridge::GetNodeType(ArkUIRuntimeCallInfo* runtimeCallInfo)
1221 {
1222     EcmaVM* vm = runtimeCallInfo->GetVM();
1223     CHECK_NULL_RETURN(vm, panda::StringRef::NewFromUtf8(vm, ""));
1224     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1225     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::StringRef::NewFromUtf8(vm, ""));
1226     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1227     auto nodeType = GetArkUINodeModifiers()->getFrameNodeModifier()->getNodeType(nativeNode);
1228     return panda::StringRef::NewFromUtf8(vm, nodeType);
1229 }
GetOpacity(ArkUIRuntimeCallInfo * runtimeCallInfo)1230 ArkUINativeModuleValue FrameNodeBridge::GetOpacity(ArkUIRuntimeCallInfo* runtimeCallInfo)
1231 {
1232     EcmaVM* vm = runtimeCallInfo->GetVM();
1233     CHECK_NULL_RETURN(vm, panda::NumberRef::New(vm, 0));
1234     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1235     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::NumberRef::New(vm, 0));
1236     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1237     auto opacity = GetArkUINodeModifiers()->getCommonModifier()->getOpacity(nativeNode);
1238     return panda::NumberRef::New(vm, opacity);
1239 }
IsVisible(ArkUIRuntimeCallInfo * runtimeCallInfo)1240 ArkUINativeModuleValue FrameNodeBridge::IsVisible(ArkUIRuntimeCallInfo* runtimeCallInfo)
1241 {
1242     EcmaVM* vm = runtimeCallInfo->GetVM();
1243     CHECK_NULL_RETURN(vm, panda::BooleanRef::New(vm, false));
1244     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1245     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::BooleanRef::New(vm, false));
1246     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1247     auto visible = GetArkUINodeModifiers()->getFrameNodeModifier()->isVisible(nativeNode);
1248     return panda::BooleanRef::New(vm, visible);
1249 }
IsClipToFrame(ArkUIRuntimeCallInfo * runtimeCallInfo)1250 ArkUINativeModuleValue FrameNodeBridge::IsClipToFrame(ArkUIRuntimeCallInfo* runtimeCallInfo)
1251 {
1252     EcmaVM* vm = runtimeCallInfo->GetVM();
1253     CHECK_NULL_RETURN(vm, panda::BooleanRef::New(vm, false));
1254     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1255     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::BooleanRef::New(vm, false));
1256     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1257     auto clip = GetArkUINodeModifiers()->getCommonModifier()->getClip(nativeNode);
1258     return panda::BooleanRef::New(vm, clip != 0);
1259 }
IsAttached(ArkUIRuntimeCallInfo * runtimeCallInfo)1260 ArkUINativeModuleValue FrameNodeBridge::IsAttached(ArkUIRuntimeCallInfo* runtimeCallInfo)
1261 {
1262     EcmaVM* vm = runtimeCallInfo->GetVM();
1263     CHECK_NULL_RETURN(vm, panda::BooleanRef::New(vm, false));
1264     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1265     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::BooleanRef::New(vm, false));
1266     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1267     auto isAttached = GetArkUINodeModifiers()->getFrameNodeModifier()->isVisible(nativeNode);
1268     return panda::BooleanRef::New(vm, isAttached);
1269 }
GetInspectorInfo(ArkUIRuntimeCallInfo * runtimeCallInfo)1270 ArkUINativeModuleValue FrameNodeBridge::GetInspectorInfo(ArkUIRuntimeCallInfo* runtimeCallInfo)
1271 {
1272     EcmaVM* vm = runtimeCallInfo->GetVM();
1273     CHECK_NULL_RETURN(vm, panda::StringRef::NewFromUtf8(vm, "{}"));
1274     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1275     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::StringRef::NewFromUtf8(vm, "{}"));
1276     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1277     auto inspectorInfo = GetArkUINodeModifiers()->getFrameNodeModifier()->getInspectorInfo(nativeNode);
1278     return panda::StringRef::NewFromUtf8(vm, inspectorInfo);
1279 }
GetCustomPropertyCapiByKey(ArkUIRuntimeCallInfo * runtimeCallInfo)1280 ArkUINativeModuleValue FrameNodeBridge::GetCustomPropertyCapiByKey(ArkUIRuntimeCallInfo* runtimeCallInfo)
1281 {
1282     EcmaVM* vm = runtimeCallInfo->GetVM();
1283     auto defaultReturnValue = panda::JSValueRef::Undefined(vm);
1284     CHECK_NULL_RETURN(vm, defaultReturnValue);
1285     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1286     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1287     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), defaultReturnValue);
1288     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1289     CHECK_NULL_RETURN(!secondArg.IsNull(), defaultReturnValue);
1290     if (!secondArg->IsString(vm)) {
1291         return defaultReturnValue;
1292     }
1293     auto key = secondArg->ToString(vm)->ToString(vm);
1294     uint32_t size = 0;
1295     char* valuePtr = nullptr;
1296     if (GetArkUINodeModifiers()->getFrameNodeModifier()->getCustomPropertyCapiByKey(
1297         nativeNode, key.c_str(), &valuePtr, &size)) {
1298         CHECK_NULL_RETURN(valuePtr, defaultReturnValue);
1299         auto returnValue = panda::StringRef::NewFromUtf8(vm, valuePtr);
1300         GetArkUINodeModifiers()->getFrameNodeModifier()->freeCustomPropertyCharPtr(valuePtr, size);
1301         return returnValue;
1302     }
1303     GetArkUINodeModifiers()->getFrameNodeModifier()->freeCustomPropertyCharPtr(valuePtr, size);
1304     return defaultReturnValue;
1305 }
1306 
ParseGetFunc(ArkUIRuntimeCallInfo * runtimeCallInfo,int32_t nodeId)1307 std::function<std::string(const std::string&)> ParseGetFunc(ArkUIRuntimeCallInfo* runtimeCallInfo, int32_t nodeId)
1308 {
1309     EcmaVM* vm = runtimeCallInfo->GetVM();
1310     return [vm, nodeId](const std::string& key) -> std::string {
1311         std::string resultString = std::string();
1312         CHECK_NULL_RETURN(vm, resultString);
1313         panda::LocalScope scope(vm);
1314         auto global = JSNApi::GetGlobalObject(vm);
1315         if (global.IsNull()) {
1316             return resultString;
1317         }
1318         auto getCustomProperty = global->Get(vm, panda::StringRef::NewFromUtf8(vm, "__getCustomPropertyString__"));
1319         if (getCustomProperty->IsUndefined() || !getCustomProperty->IsFunction(vm)) {
1320             return resultString;
1321         }
1322         auto obj = getCustomProperty->ToObject(vm);
1323         panda::Local<panda::FunctionRef> func = obj;
1324         panda::Local<panda::JSValueRef> params2[2] = { panda::NumberRef::New(vm, nodeId), // 2 number of parameters
1325             panda::StringRef::NewFromUtf8(vm, key.c_str()) };
1326         auto function = panda::CopyableGlobal(vm, func);
1327         auto callValue = function->Call(vm, function.ToLocal(), params2, 2);
1328         if (callValue.IsNull() || callValue->IsUndefined() || !callValue->IsString(vm)) {
1329             return resultString;
1330         }
1331         auto value = callValue->ToString(vm)->ToString(vm);
1332         return value;
1333     };
1334 }
1335 
ParseFunc(ArkUIRuntimeCallInfo * runtimeCallInfo)1336 std::function<bool()> ParseFunc(ArkUIRuntimeCallInfo* runtimeCallInfo)
1337 {
1338     EcmaVM* vm = runtimeCallInfo->GetVM();
1339     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1340     Local<JSValueRef> keyArg = runtimeCallInfo->GetCallArgRef(1); // 1 key
1341     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(2); // 2 value
1342     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), nullptr);
1343     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1344     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1345     CHECK_NULL_RETURN(frameNode, nullptr);
1346     auto nodeId = frameNode->GetId();
1347     panda::Local<panda::JSValueRef> params3[3] = { panda::NumberRef::New(vm, nodeId), keyArg, // 3 number of parameters
1348         valueArg };
1349     return [vm, frameNode, params3]() -> bool {
1350         CHECK_NULL_RETURN(vm, false);
1351         panda::LocalScope scope(vm);
1352         auto global = JSNApi::GetGlobalObject(vm);
1353         auto setCustomProperty = global->Get(vm, panda::StringRef::NewFromUtf8(vm, "__setCustomProperty__"));
1354         if (setCustomProperty->IsUndefined() || !setCustomProperty->IsFunction(vm)) {
1355             return false;
1356         }
1357         auto obj = setCustomProperty->ToObject(vm);
1358         panda::Local<panda::FunctionRef> func = obj;
1359         auto nodeId = frameNode->GetId();
1360         auto function = panda::CopyableGlobal(vm, func);
1361         auto customPropertyExisted = function->Call(vm, function.ToLocal(), params3, 3)->ToBoolean(vm)->Value();
1362         if (customPropertyExisted) {
1363             frameNode->SetRemoveCustomProperties([vm, nodeId]() -> void {
1364                 CHECK_NULL_VOID(vm);
1365                 panda::LocalScope scope(vm);
1366                 auto global = JSNApi::GetGlobalObject(vm);
1367                 auto removeCustomProperty =
1368                     global->Get(vm, panda::StringRef::NewFromUtf8(vm, "__removeCustomProperties__"));
1369                 if (removeCustomProperty->IsUndefined() || !removeCustomProperty->IsFunction(vm)) {
1370                     return;
1371                 }
1372                 auto obj = removeCustomProperty->ToObject(vm);
1373                 panda::Local<panda::FunctionRef> func = obj;
1374                 panda::Local<panda::JSValueRef> params[1] = { panda::NumberRef::New(vm, nodeId) };
1375                 auto function = panda::CopyableGlobal(vm, func);
1376                 function->Call(vm, function.ToLocal(), params, 1);
1377             });
1378         }
1379         return true;
1380     };
1381 }
1382 
SetCustomPropertyModiferByKey(ArkUIRuntimeCallInfo * runtimeCallInfo)1383 ArkUINativeModuleValue FrameNodeBridge::SetCustomPropertyModiferByKey(ArkUIRuntimeCallInfo* runtimeCallInfo)
1384 {
1385     EcmaVM* vm = runtimeCallInfo->GetVM();
1386     CHECK_NULL_RETURN(vm, panda::BooleanRef::New(vm, false));
1387     if (!AceApplicationInfo::GetInstance().GreatOrEqualTargetAPIVersion(PlatformVersion::VERSION_THIRTEEN)) {
1388         return panda::BooleanRef::New(vm, false);
1389     }
1390     auto defaultReturnValue = panda::BooleanRef::New(vm, true);
1391     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1392     Local<JSValueRef> keyArg = runtimeCallInfo->GetCallArgRef(1); // 1 key
1393     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::BooleanRef::New(vm, false));
1394     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1395     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1396     CHECK_NULL_RETURN(frameNode, defaultReturnValue);
1397     if (keyArg->IsUndefined() || keyArg->IsNull() || !keyArg->IsString(vm)) {
1398         return defaultReturnValue;
1399     }
1400     auto nodeId = frameNode->GetId();
1401     std::function<bool()> funcCallback = ParseFunc(runtimeCallInfo);
1402     CHECK_NULL_RETURN(funcCallback, panda::BooleanRef::New(vm, false));
1403     std::function<std::string(const std::string&)> getFuncCallback = ParseGetFunc(runtimeCallInfo, nodeId);
1404     GetArkUINodeModifiers()->getFrameNodeModifier()->setCustomPropertyModiferByKey(
1405         nativeNode, reinterpret_cast<void*>(&funcCallback), reinterpret_cast<void*>(&getFuncCallback));
1406     return defaultReturnValue;
1407 }
1408 
SetMeasuredSize(ArkUIRuntimeCallInfo * runtimeCallInfo)1409 ArkUINativeModuleValue FrameNodeBridge::SetMeasuredSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
1410 {
1411     EcmaVM* vm = runtimeCallInfo->GetVM();
1412     auto defaultReturnValue = panda::JSValueRef::Undefined(vm);
1413     CHECK_NULL_RETURN(vm, defaultReturnValue);
1414     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1415     CHECK_NULL_RETURN(!firstArg.IsNull(), defaultReturnValue);
1416     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1417     Local<JSValueRef> width = runtimeCallInfo->GetCallArgRef(1);
1418     CHECK_NULL_RETURN(width->IsNumber(), defaultReturnValue);
1419     Local<JSValueRef> height = runtimeCallInfo->GetCallArgRef(2);
1420     CHECK_NULL_RETURN(height->IsNumber(), defaultReturnValue);
1421     GetArkUIFullNodeAPI()->getExtendedAPI()->setMeasureWidth(nativeNode, width->ToNumber(vm)->Value());
1422     GetArkUIFullNodeAPI()->getExtendedAPI()->setMeasureHeight(nativeNode, height->ToNumber(vm)->Value());
1423     return defaultReturnValue;
1424 }
SetLayoutPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)1425 ArkUINativeModuleValue FrameNodeBridge::SetLayoutPosition(ArkUIRuntimeCallInfo* runtimeCallInfo)
1426 {
1427     EcmaVM* vm = runtimeCallInfo->GetVM();
1428     auto defaultReturnValue = panda::JSValueRef::Undefined(vm);
1429     CHECK_NULL_RETURN(vm, defaultReturnValue);
1430     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1431     CHECK_NULL_RETURN(!firstArg.IsNull(), defaultReturnValue);
1432     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1433     Local<JSValueRef> x = runtimeCallInfo->GetCallArgRef(1);
1434     CHECK_NULL_RETURN(x->IsNumber(), defaultReturnValue);
1435     Local<JSValueRef> y = runtimeCallInfo->GetCallArgRef(2);
1436     CHECK_NULL_RETURN(y->IsNumber(), defaultReturnValue);
1437     GetArkUIFullNodeAPI()->getExtendedAPI()->setX(nativeNode, x->ToNumber(vm)->Value());
1438     GetArkUIFullNodeAPI()->getExtendedAPI()->setY(nativeNode, y->ToNumber(vm)->Value());
1439     return defaultReturnValue;
1440 }
GetObjectValueByKey(EcmaVM * vm,Local<JSValueRef> object,const char * key)1441 Local<JSValueRef> FrameNodeBridge::GetObjectValueByKey(EcmaVM* vm, Local<JSValueRef> object, const char* key)
1442 {
1443     CHECK_NULL_RETURN(object->IsObject(vm), panda::JSValueRef::Undefined(vm));
1444     return object->ToObject(vm)->Get(vm, panda::StringRef::NewFromUtf8(vm, key));
1445 }
MeasureNode(ArkUIRuntimeCallInfo * runtimeCallInfo)1446 ArkUINativeModuleValue FrameNodeBridge::MeasureNode(ArkUIRuntimeCallInfo* runtimeCallInfo)
1447 {
1448     EcmaVM* vm = runtimeCallInfo->GetVM();
1449     auto defaultReturnValue = panda::JSValueRef::Undefined(vm);
1450     CHECK_NULL_RETURN(vm, defaultReturnValue);
1451     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1452     CHECK_NULL_RETURN(!firstArg.IsNull(), defaultReturnValue);
1453     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1454     ArkUI_Float32 constraintValues[6];
1455     for (int i = 0; i < 6; i++) {
1456         Local<JSValueRef> constraintValue = runtimeCallInfo->GetCallArgRef(i + 1);
1457         CHECK_NULL_RETURN(constraintValue->IsNumber(), defaultReturnValue);
1458         constraintValues[i] = constraintValue->ToNumber(vm)->Value();
1459     }
1460 
1461     ArkUIVMContext vmContext = nullptr;
1462     GetArkUIFullNodeAPI()->getExtendedAPI()->measureNode(vmContext, nativeNode, constraintValues);
1463     return defaultReturnValue;
1464 }
LayoutNode(ArkUIRuntimeCallInfo * runtimeCallInfo)1465 ArkUINativeModuleValue FrameNodeBridge::LayoutNode(ArkUIRuntimeCallInfo* runtimeCallInfo)
1466 {
1467     EcmaVM* vm = runtimeCallInfo->GetVM();
1468     auto defaultReturnValue = panda::JSValueRef::Undefined(vm);
1469     CHECK_NULL_RETURN(vm, defaultReturnValue);
1470     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1471     CHECK_NULL_RETURN(!firstArg.IsNull(), defaultReturnValue);
1472     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1473     Local<JSValueRef> x = runtimeCallInfo->GetCallArgRef(1);
1474     CHECK_NULL_RETURN(x->IsNumber(), defaultReturnValue);
1475     Local<JSValueRef> y = runtimeCallInfo->GetCallArgRef(2);
1476     CHECK_NULL_RETURN(y->IsNumber(), defaultReturnValue);
1477     ArkUI_Float32 positionValue[2] = { x->ToNumber(vm)->Value(), y->ToNumber(vm)->Value() };
1478 
1479     ArkUIVMContext vmContext = nullptr;
1480     GetArkUIFullNodeAPI()->getExtendedAPI()->layoutNode(vmContext, nativeNode, &positionValue);
1481     return defaultReturnValue;
1482 }
SetNeedsLayout(ArkUIRuntimeCallInfo * runtimeCallInfo)1483 ArkUINativeModuleValue FrameNodeBridge::SetNeedsLayout(ArkUIRuntimeCallInfo* runtimeCallInfo)
1484 {
1485     EcmaVM* vm = runtimeCallInfo->GetVM();
1486     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1487     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1488     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::JSValueRef::Undefined(vm));
1489     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1490     GetArkUIFullNodeAPI()->getBasicAPI()->markDirty(nativeNode, ARKUI_DIRTY_FLAG_MEASURE_SELF_AND_PARENT);
1491     return panda::JSValueRef::Undefined(vm);
1492 }
1493 
SetOnSizeChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1494 ArkUINativeModuleValue FrameNodeBridge::SetOnSizeChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1495 {
1496     EcmaVM* vm = runtimeCallInfo->GetVM();
1497     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1498     auto* nativeNode = GetFrameNode(runtimeCallInfo);
1499     CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm));
1500     auto* frameNode = reinterpret_cast<NG::FrameNode*>(nativeNode);
1501     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1502     Local<JSValueRef> secondeArg = runtimeCallInfo->GetCallArgRef(1);
1503     if (secondeArg->IsUndefined()) {
1504         NG::ViewAbstract::ClearJSFrameNodeOnSizeChange(frameNode);
1505         return panda::JSValueRef::Undefined(vm);
1506     }
1507     CHECK_NULL_RETURN(secondeArg->IsFunction(vm), panda::JSValueRef::Undefined(vm));
1508     auto obj = secondeArg->ToObject(vm);
1509     auto containerId = GetInstanceId(runtimeCallInfo);
1510     CHECK_NULL_RETURN(containerId != -1, panda::JSValueRef::Undefined(vm));
1511     panda::Local<panda::FunctionRef> func = obj;
1512     auto flag = IsCustomFrameNode(frameNode);
1513     auto onSizeChange = [vm, func = JSFuncObjRef(panda::CopyableGlobal(vm, func), flag),
1514                             node = AceType::WeakClaim(frameNode),
1515                             containerId](const NG::RectF& oldRect, const NG::RectF& rect) {
1516         panda::LocalScope pandaScope(vm);
1517         panda::TryCatch trycatch(vm);
1518         ContainerScope scope(containerId);
1519         auto function = func.Lock();
1520         CHECK_NULL_VOID(!function.IsEmpty());
1521         CHECK_NULL_VOID(function->IsFunction(vm));
1522         PipelineContext::SetCallBackNode(node);
1523         double density = PipelineBase::GetCurrentDensity();
1524         const char* keys[] = { "width", "height" };
1525         Local<JSValueRef> oldValues[] = { panda::NumberRef::New(vm, oldRect.Width() / density),
1526             panda::NumberRef::New(vm, oldRect.Height() / density) };
1527         auto oldSize = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, oldValues);
1528         Local<JSValueRef> newValues[] = { panda::NumberRef::New(vm, rect.Width() / density),
1529             panda::NumberRef::New(vm, rect.Height() / density) };
1530         auto newSize = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, newValues);
1531         panda::Local<panda::JSValueRef> params[2] = { oldSize, newSize };
1532         function->Call(vm, function.ToLocal(), params, 2);
1533     };
1534     NG::ViewAbstract::SetJSFrameNodeOnSizeChange(frameNode, std::move(onSizeChange));
1535     return panda::JSValueRef::Undefined(vm);
1536 }
1537 
SetOnVisibleAreaApproximateChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1538 ArkUINativeModuleValue FrameNodeBridge::SetOnVisibleAreaApproximateChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1539 {
1540     EcmaVM* vm = runtimeCallInfo->GetVM();
1541     auto* nativeNode = GetFrameNode(runtimeCallInfo);
1542     CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm));
1543     auto* frameNode = reinterpret_cast<NG::FrameNode*>(nativeNode);
1544     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1545     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1546     if (secondArg->IsUndefined()) {
1547         NG::ViewAbstract::ClearJSFrameNodeOnVisibleAreaApproximateChange(frameNode);
1548         return panda::JSValueRef::Undefined(vm);
1549     }
1550     CHECK_NULL_RETURN(secondArg->IsFunction(vm), panda::JSValueRef::Undefined(vm));
1551     auto obj = secondArg->ToObject(vm);
1552     auto containerId = GetInstanceId(runtimeCallInfo);
1553     CHECK_NULL_RETURN(containerId != -1, panda::JSValueRef::Undefined(vm));
1554     panda::Local<panda::FunctionRef> func = obj;
1555     auto flag = IsCustomFrameNode(frameNode);
1556     auto onVisibleAreaApproximateChange = [vm, func = JSFuncObjRef(panda::CopyableGlobal(vm, func), flag),
1557                                               node = AceType::WeakClaim(frameNode),
1558                                               containerId](bool visible, double ratio) {
1559         panda::LocalScope pandaScope(vm);
1560         panda::TryCatch trycatch(vm);
1561         ContainerScope scope(containerId);
1562         auto function = func.Lock();
1563         CHECK_NULL_VOID(!function.IsEmpty() && function->IsFunction(vm));
1564 
1565         Local<JSValueRef> visibleValues = panda::BooleanRef::New(vm, visible);
1566         Local<JSValueRef> ratioValues = panda::NumberRef::New(vm, ratio);
1567         panda::Local<panda::JSValueRef> params[2] = { visibleValues, ratioValues };
1568         function->Call(vm, function.ToLocal(), params, 2);
1569     };
1570     Local<JSValueRef> ratiosArg = runtimeCallInfo->GetCallArgRef(INDEX_OF_OPTION_OF_VISIBLE);
1571     if (ratiosArg->IsUndefined() || !ratiosArg->IsArray(vm)) {
1572         return panda::JSValueRef::Undefined(vm);
1573     }
1574     panda::Local<panda::ArrayRef> ratioList = ratiosArg;
1575     uint32_t size = ratioList->Length(vm);
1576     std::vector<double> ratioVec(size);
1577     for (uint32_t i = 0; i < size; i++) {
1578         double radioNumber = 0.0;
1579         auto const radio = panda::ArrayRef::GetValueAt(vm, ratioList, i);
1580         radioNumber = radio->IsNumber() ? radio->ToNumber(vm)->Value() : 0.0;
1581         radioNumber = std::clamp(radioNumber, VISIBLE_RATIO_MIN, VISIBLE_RATIO_MAX);
1582         ratioVec.push_back(radioNumber);
1583     }
1584     Local<JSValueRef> intervalArg = runtimeCallInfo->GetCallArgRef(INDEX_OF_INTERVAL);
1585     if (intervalArg->IsUndefined() || !intervalArg->IsNumber()) {
1586         return panda::JSValueRef::Undefined(vm);
1587     }
1588     int32_t intervalMs = static_cast<int32_t>(intervalArg->ToNumber(vm)->Value());
1589     NG::ViewAbstract::SetJSFrameNodeOnVisibleAreaApproximateChange(
1590         frameNode, std::move(onVisibleAreaApproximateChange), ratioVec, intervalMs);
1591     return panda::JSValueRef::Undefined(vm);
1592 }
1593 
PropertyUpdate(ArkUIRuntimeCallInfo * runtimeCallInfo)1594 ArkUINativeModuleValue FrameNodeBridge::PropertyUpdate(ArkUIRuntimeCallInfo* runtimeCallInfo)
1595 {
1596     EcmaVM* vm = runtimeCallInfo->GetVM();
1597     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1598     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1599     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::JSValueRef::Undefined(vm));
1600     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1601     GetArkUINodeModifiers()->getFrameNodeModifier()->propertyUpdate(nativeNode);
1602     return panda::JSValueRef::Undefined(vm);
1603 }
1604 
RegisterFrameCallback(ArkUIRuntimeCallInfo * runtimeCallInfo)1605 ArkUINativeModuleValue FrameNodeBridge::RegisterFrameCallback(ArkUIRuntimeCallInfo* runtimeCallInfo)
1606 {
1607     EcmaVM* vm = runtimeCallInfo->GetVM();
1608     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1609     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1610     CHECK_NULL_RETURN(firstArg->IsFunction(vm), panda::JSValueRef::Undefined(vm));
1611     auto obj = firstArg->ToObject(vm);
1612     auto containerId = Container::CurrentIdSafely();
1613     panda::Local<panda::FunctionRef> func = obj;
1614     auto getVsyncFunc = [vm, func = panda::CopyableGlobal(vm, func), containerId]() {
1615         panda::LocalScope pandaScope(vm);
1616         ContainerScope scope(containerId);
1617         auto container = Container::Current();
1618         CHECK_NULL_VOID(container);
1619         auto frontend = container->GetFrontend();
1620         CHECK_NULL_VOID(frontend);
1621         func->Call(vm, func.ToLocal(), nullptr, 0);
1622     };
1623     auto pipelineContext = PipelineContext::GetCurrentContextSafely();
1624     CHECK_NULL_RETURN(pipelineContext, panda::JSValueRef::Undefined(vm));
1625     pipelineContext->SetOnceVsyncListener(std::move(getVsyncFunc));
1626     return panda::JSValueRef::Undefined(vm);
1627 }
1628 
MarkDirty(ArkUIRuntimeCallInfo * runtimeCallInfo)1629 ArkUINativeModuleValue FrameNodeBridge::MarkDirty(ArkUIRuntimeCallInfo* runtimeCallInfo)
1630 {
1631     EcmaVM* vm = runtimeCallInfo->GetVM();
1632     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1633     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1634     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::JSValueRef::Undefined(vm));
1635     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1636     Local<JSValueRef> secondeArg = runtimeCallInfo->GetCallArgRef(1);
1637     CHECK_NULL_RETURN(secondeArg->IsNumber(), panda::JSValueRef::Undefined(vm));
1638     ArkUIDirtyFlag dirtyFlag = static_cast<ArkUIDirtyFlag>(secondeArg->ToNumber(vm)->Value());
1639     GetArkUIFullNodeAPI()->getBasicAPI()->markDirty(nativeNode, dirtyFlag);
1640     return panda::JSValueRef::Undefined(vm);
1641 }
1642 
CreateNodeContent(ArkUIRuntimeCallInfo * runtimeCallInfo)1643 ArkUINativeModuleValue FrameNodeBridge::CreateNodeContent(ArkUIRuntimeCallInfo* runtimeCallInfo)
1644 {
1645     EcmaVM* vm = runtimeCallInfo->GetVM();
1646     auto content = Referenced::MakeRefPtr<NodeContent>();
1647     return NativeUtilsBridge::CreateStrongRef(vm, content);
1648 }
1649 
AddFrameNodeToNodeContent(ArkUIRuntimeCallInfo * runtimeCallInfo)1650 ArkUINativeModuleValue FrameNodeBridge::AddFrameNodeToNodeContent(ArkUIRuntimeCallInfo* runtimeCallInfo)
1651 {
1652     EcmaVM* vm = runtimeCallInfo->GetVM();
1653     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1654     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::BooleanRef::New(vm, true));
1655     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1656     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1657     auto nativeContent = reinterpret_cast<ArkUINodeContentHandle>(secondArg->ToNativePointer(vm)->Value());
1658     auto result = GetArkUINodeModifiers()->getNodeContentModifier()->addChild(nativeContent, nativeNode);
1659     GetArkUIFullNodeAPI()->getBasicAPI()->markDirty(nativeNode, ARKUI_DIRTY_FLAG_MEASURE_SELF_AND_PARENT);
1660     if (result != ERROR_CODE_NO_ERROR) {
1661         LOGW("AddFrameNodeToNodeContent failed error:%{public}d", result);
1662     }
1663     return panda::BooleanRef::New(vm, !result);
1664 }
1665 
RemoveFrameNodeFromNodeContent(ArkUIRuntimeCallInfo * runtimeCallInfo)1666 ArkUINativeModuleValue FrameNodeBridge::RemoveFrameNodeFromNodeContent(ArkUIRuntimeCallInfo* runtimeCallInfo)
1667 {
1668     EcmaVM* vm = runtimeCallInfo->GetVM();
1669     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1670     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::BooleanRef::New(vm, true));
1671     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1672     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1673     auto nativeContent = reinterpret_cast<ArkUINodeContentHandle>(secondArg->ToNativePointer(vm)->Value());
1674     GetArkUIFullNodeAPI()->getBasicAPI()->markDirty(nativeNode, ARKUI_DIRTY_FLAG_MEASURE_SELF_AND_PARENT);
1675     auto result = GetArkUINodeModifiers()->getNodeContentModifier()->removeChild(nativeContent, nativeNode);
1676     if (result != ERROR_CODE_NO_ERROR) {
1677         LOGW("RemoveFrameNodeFromNodeContent failed error:%{public}d", result);
1678     }
1679     return panda::BooleanRef::New(vm, !result);
1680 }
1681 
GetFirstUINode(ArkUIRuntimeCallInfo * runtimeCallInfo)1682 ArkUINativeModuleValue FrameNodeBridge::GetFirstUINode(ArkUIRuntimeCallInfo* runtimeCallInfo)
1683 {
1684     EcmaVM* vm = runtimeCallInfo->GetVM();
1685     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1686     CHECK_NULL_RETURN(!firstArg.IsNull(), panda::JSValueRef::Undefined(vm));
1687     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1688     auto nodePtr = GetArkUINodeModifiers()->getFrameNodeModifier()->getFirstUINode(nativeNode);
1689     CHECK_NULL_RETURN(nodePtr, panda::JSValueRef::Undefined(vm));
1690     return panda::NativePointerRef::New(vm, nodePtr);
1691 }
1692 
1693 } // namespace OHOS::Ace::NG
1694