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