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