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