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