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