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