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