• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 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  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_span_bridge.h"
16 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_frame_node_bridge.h"
17 
18 #include <string>
19 #include "base/geometry/calc_dimension.h"
20 #include "base/geometry/dimension.h"
21 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
22 #include "core/components/common/layout/constants.h"
23 #include "bridge/declarative_frontend/engine/jsi/jsi_types.h"
24 
25 #include "core/common/resource/resource_object.h"
26 #include "core/common/resource/resource_parse_utils.h"
27 
28 namespace OHOS::Ace::NG {
29 namespace {
30 constexpr int SIZE_OF_TEXT_CASES = 2;
31 constexpr TextDecorationStyle DEFAULT_DECORATION_STYLE = TextDecorationStyle::SOLID;
32 constexpr Ace::FontStyle DEFAULT_FONT_STYLE = Ace::FontStyle::NORMAL;
33 constexpr Color DEFAULT_DECORATION_COLOR = Color(0xff000000);
34 const std::string DEFAULT_FONT_WEIGHT = "400";
35 constexpr int NUM_0 = 0;
36 constexpr int NUM_1 = 1;
37 constexpr int NUM_2 = 2;
38 constexpr int NUM_3 = 3;
39 constexpr int NUM_4 = 4;
40 constexpr int NUM_5 = 5;
41 constexpr int NUM_6 = 6;
42 constexpr int NUM_7 = 7;
43 const std::vector<OHOS::Ace::FontStyle> FONT_STYLES = { OHOS::Ace::FontStyle::NORMAL, OHOS::Ace::FontStyle::ITALIC };
44 
ParseTextShadow(ArkUIRuntimeCallInfo * runtimeCallInfo,uint32_t length,std::vector<ArkUITextShadowStruct> & textShadowArray,std::vector<RefPtr<ResourceObject>> & radiusResArr,std::vector<RefPtr<ResourceObject>> & colorResArr,std::vector<RefPtr<ResourceObject>> & offsetXResArr,std::vector<RefPtr<ResourceObject>> & offsetYResArr,const std::optional<NodeInfo> & nodeInfo=std::nullopt)45 bool ParseTextShadow(ArkUIRuntimeCallInfo* runtimeCallInfo, uint32_t length,
46     std::vector<ArkUITextShadowStruct>& textShadowArray,
47     std::vector<RefPtr<ResourceObject>>& radiusResArr, std::vector<RefPtr<ResourceObject>>& colorResArr,
48     std::vector<RefPtr<ResourceObject>>& offsetXResArr, std::vector<RefPtr<ResourceObject>>& offsetYResArr,
49     const std::optional<NodeInfo>& nodeInfo = std::nullopt)
50 {
51     EcmaVM* vm = runtimeCallInfo->GetVM();
52     CHECK_NULL_RETURN(vm, false);
53     Local<JSValueRef> radiusArg = runtimeCallInfo->GetCallArgRef(NUM_1);
54     Local<JSValueRef> typeArg = runtimeCallInfo->GetCallArgRef(NUM_2);
55     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(NUM_3);
56     Local<JSValueRef> offsetXArg = runtimeCallInfo->GetCallArgRef(NUM_4);
57     Local<JSValueRef> offsetYArg = runtimeCallInfo->GetCallArgRef(NUM_5);
58     Local<JSValueRef> fillArg = runtimeCallInfo->GetCallArgRef(NUM_6);
59     auto radiusArray = std::make_unique<double[]>(length);
60     auto typeArray = std::make_unique<uint32_t[]>(length);
61     auto colorArray = std::make_unique<uint32_t[]>(length);
62     auto offsetXArray = std::make_unique<double[]>(length);
63     auto offsetYArray = std::make_unique<double[]>(length);
64     auto fillArray = std::make_unique<uint32_t[]>(length);
65 
66     bool radiusParseResult = ArkTSUtils::ParseArrayWithResObj<double>(vm, radiusArg, radiusArray.get(), length,
67         ArkTSUtils::parseShadowRadiusWithResObj, radiusResArr);
68     bool typeParseResult = ArkTSUtils::ParseArray<uint32_t>(vm, typeArg, typeArray.get(), length,
69         ArkTSUtils::parseShadowType);
70     bool colorParseResult = ArkTSUtils::ParseArrayWithResObj<uint32_t>(vm, colorArg, colorArray.get(), length,
71         ArkTSUtils::parseShadowColorWithResObj, colorResArr, nodeInfo);
72     bool offsetXParseResult = ArkTSUtils::ParseArrayWithResObj<double>(vm, offsetXArg, offsetXArray.get(), length,
73         ArkTSUtils::parseShadowOffsetWithResObj, offsetXResArr);
74     bool offsetYParseResult = ArkTSUtils::ParseArrayWithResObj<double>(vm, offsetYArg, offsetYArray.get(), length,
75         ArkTSUtils::parseShadowOffsetWithResObj, offsetYResArr);
76     bool fillParseResult =
77         ArkTSUtils::ParseArray<uint32_t>(vm, fillArg, fillArray.get(), length, ArkTSUtils::parseShadowFill);
78     if (!radiusParseResult || !colorParseResult || !offsetXParseResult || !offsetYParseResult || !fillParseResult ||
79         !typeParseResult) {
80         return false;
81     }
82     for (uint32_t i = 0; i < length; i++) {
83         ArkUITextShadowStruct textShadow;
84         textShadow.radius = radiusArray[i];
85         textShadow.type = typeArray[i];
86         textShadow.color = colorArray[i];
87         textShadow.offsetX = offsetXArray[i];
88         textShadow.offsetY = offsetYArray[i];
89         textShadow.fill = fillArray[i];
90         textShadowArray.emplace_back(textShadow);
91     }
92     return true;
93 }
94 } // namespace
95 
SetSpanSrc(ArkUIRuntimeCallInfo * runtimeCallInfo)96 ArkUINativeModuleValue SpanBridge::SetSpanSrc(ArkUIRuntimeCallInfo *runtimeCallInfo)
97 {
98     EcmaVM *vm = runtimeCallInfo->GetVM();
99     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
100     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
101     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
102     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
103     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
104     std::string src;
105     if (!ArkTSUtils::ParseJsString(vm, secondArg, src)) {
106         return panda::JSValueRef::Undefined(vm);
107     }
108     GetArkUINodeModifiers()->getSpanModifier()->setSpanSrc(nativeNode, src.c_str());
109     return panda::JSValueRef::Undefined(vm);
110 }
111 
SetTextCase(ArkUIRuntimeCallInfo * runtimeCallInfo)112 ArkUINativeModuleValue SpanBridge::SetTextCase(ArkUIRuntimeCallInfo *runtimeCallInfo)
113 {
114     EcmaVM *vm = runtimeCallInfo->GetVM();
115     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
116     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
117     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
118     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
119     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
120     if (secondArg->IsNumber() && secondArg->Int32Value(vm) >= NUM_0 &&
121         secondArg->Int32Value(vm) <= SIZE_OF_TEXT_CASES) {
122         GetArkUINodeModifiers()->getSpanModifier()->setSpanTextCase(nativeNode, secondArg->Int32Value(vm));
123     } else {
124         GetArkUINodeModifiers()->getSpanModifier()->resetSpanTextCase(nativeNode);
125     }
126     return panda::JSValueRef::Undefined(vm);
127 }
128 
ResetTextCase(ArkUIRuntimeCallInfo * runtimeCallInfo)129 ArkUINativeModuleValue SpanBridge::ResetTextCase(ArkUIRuntimeCallInfo *runtimeCallInfo)
130 {
131     EcmaVM *vm = runtimeCallInfo->GetVM();
132     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
133     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
134     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
135     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
136     GetArkUINodeModifiers()->getSpanModifier()->resetSpanTextCase(nativeNode);
137     return panda::JSValueRef::Undefined(vm);
138 }
139 
SetFontWeight(ArkUIRuntimeCallInfo * runtimeCallInfo)140 ArkUINativeModuleValue SpanBridge::SetFontWeight(ArkUIRuntimeCallInfo *runtimeCallInfo)
141 {
142     EcmaVM *vm = runtimeCallInfo->GetVM();
143     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
144     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
145     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
146     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
147     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
148 
149     std::string weight = DEFAULT_FONT_WEIGHT;
150     RefPtr<ResourceObject> resObj;
151     if (!secondArg->IsNull()) {
152         if (secondArg->IsNumber()) {
153             weight = std::to_string(secondArg->Int32Value(vm));
154         } else if ((secondArg->IsString(vm) || secondArg->IsObject(vm)) &&
155             (!(ArkTSUtils::ParseJsString(vm, secondArg, weight, resObj)))) {
156             return panda::JSValueRef::Undefined(vm);
157         }
158     }
159 
160     GetArkUINodeModifiers()->getSpanModifier()->setSpanFontWeight(nativeNode,
161         static_cast<ArkUI_Int32>(Framework::ConvertStrToFontWeight(weight)), AceType::RawPtr(resObj));
162     return panda::JSValueRef::Undefined(vm);
163 }
164 
ResetFontWeight(ArkUIRuntimeCallInfo * runtimeCallInfo)165 ArkUINativeModuleValue SpanBridge::ResetFontWeight(ArkUIRuntimeCallInfo *runtimeCallInfo)
166 {
167     EcmaVM *vm = runtimeCallInfo->GetVM();
168     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
169     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
170     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
171     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
172     GetArkUINodeModifiers()->getSpanModifier()->resetSpanFontWeight(nativeNode);
173     return panda::JSValueRef::Undefined(vm);
174 }
175 
SetLineHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)176 ArkUINativeModuleValue SpanBridge::SetLineHeight(ArkUIRuntimeCallInfo *runtimeCallInfo)
177 {
178     EcmaVM *vm = runtimeCallInfo->GetVM();
179     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
180     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
181     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
182     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
183     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
184     CalcDimension lineHeight(0.0, DimensionUnit::PX);
185     RefPtr<ResourceObject> lineHeightObj;
186     if (!ArkTSUtils::ParseJsDimensionFpNG(vm, secondArg, lineHeight, lineHeightObj) || lineHeight.IsNegative()) {
187         lineHeight.Reset();
188     }
189     GetArkUINodeModifiers()->getSpanModifier()->setSpanLineHeight(
190         nativeNode, lineHeight.Value(), static_cast<int8_t>(lineHeight.Unit()), AceType::RawPtr(lineHeightObj));
191     return panda::JSValueRef::Undefined(vm);
192 }
193 
ResetLineHeight(ArkUIRuntimeCallInfo * runtimeCallInfo)194 ArkUINativeModuleValue SpanBridge::ResetLineHeight(ArkUIRuntimeCallInfo *runtimeCallInfo)
195 {
196     EcmaVM *vm = runtimeCallInfo->GetVM();
197     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
198     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
199     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
200     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
201     GetArkUINodeModifiers()->getSpanModifier()->resetSpanLineHeight(nativeNode);
202     return panda::JSValueRef::Undefined(vm);
203 }
204 
SetFontStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)205 ArkUINativeModuleValue SpanBridge::SetFontStyle(ArkUIRuntimeCallInfo *runtimeCallInfo)
206 {
207     EcmaVM *vm = runtimeCallInfo->GetVM();
208     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
209     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
210     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
211     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
212     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
213     if (secondArg->IsNumber()) {
214         int32_t value = secondArg->Int32Value(vm);
215         if (value >= 0 && value < static_cast<int32_t>(FONT_STYLES.size())) {
216             GetArkUINodeModifiers()->getSpanModifier()->setSpanFontStyle(nativeNode, value);
217         } else {
218             GetArkUINodeModifiers()->getSpanModifier()->resetSpanFontStyle(nativeNode);
219             return panda::JSValueRef::Undefined(vm);
220         }
221     } else {
222         GetArkUINodeModifiers()->getSpanModifier()->resetSpanFontStyle(nativeNode);
223     }
224     return panda::JSValueRef::Undefined(vm);
225 }
226 
ResetFontStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)227 ArkUINativeModuleValue SpanBridge::ResetFontStyle(ArkUIRuntimeCallInfo *runtimeCallInfo)
228 {
229     EcmaVM *vm = runtimeCallInfo->GetVM();
230     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
231     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
232     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
233     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
234     GetArkUINodeModifiers()->getSpanModifier()->resetSpanFontStyle(nativeNode);
235     return panda::JSValueRef::Undefined(vm);
236 }
237 
SetFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)238 ArkUINativeModuleValue SpanBridge::SetFontSize(ArkUIRuntimeCallInfo *runtimeCallInfo)
239 {
240     EcmaVM *vm = runtimeCallInfo->GetVM();
241     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
242     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
243     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
244     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
245     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
246     auto theme = GetTheme<TextTheme>();
247     CHECK_NULL_RETURN(theme, panda::JSValueRef::Undefined(vm));
248 
249     CalcDimension fontSize = theme->GetTextStyle().GetFontSize();
250     RefPtr<ResourceObject> fontSizeResObj;
251     if (!ArkTSUtils::ParseJsDimensionFpNG(vm, secondArg, fontSize, fontSizeResObj, false) || fontSize.IsNegative()) {
252         fontSize = theme->GetTextStyle().GetFontSize();
253     }
254     GetArkUINodeModifiers()->getSpanModifier()->setSpanFontSize(nativeNode, fontSize.Value(),
255         static_cast<int8_t>(fontSize.Unit()), AceType::RawPtr(fontSizeResObj));
256     return panda::JSValueRef::Undefined(vm);
257 }
258 
ResetFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)259 ArkUINativeModuleValue SpanBridge::ResetFontSize(ArkUIRuntimeCallInfo *runtimeCallInfo)
260 {
261     EcmaVM *vm = runtimeCallInfo->GetVM();
262     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
263     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
264     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
265     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
266     GetArkUINodeModifiers()->getSpanModifier()->resetSpanFontSize(nativeNode);
267     return panda::JSValueRef::Undefined(vm);
268 }
269 
SetFontFamily(ArkUIRuntimeCallInfo * runtimeCallInfo)270 ArkUINativeModuleValue SpanBridge::SetFontFamily(ArkUIRuntimeCallInfo *runtimeCallInfo)
271 {
272     EcmaVM *vm = runtimeCallInfo->GetVM();
273     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
274     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
275     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
276     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
277     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
278 
279     std::vector<std::string> fontFamilies;
280     RefPtr<ResourceObject> resourceObject;
281     if (!ArkTSUtils::ParseJsFontFamilies(vm, secondArg, fontFamilies, resourceObject)) {
282         GetArkUINodeModifiers()->getSpanModifier()->resetSpanFontFamily(nativeNode);
283         return panda::JSValueRef::Undefined(vm);
284     }
285     auto families = std::make_unique<char *[]>(fontFamilies.size());
286     for (uint32_t i = 0; i < fontFamilies.size(); i++) {
287         families[i] = const_cast<char *>(fontFamilies.at(i).c_str());
288     }
289     GetArkUINodeModifiers()->getSpanModifier()->setSpanFontFamily(nativeNode,
290         const_cast<const char **>(families.get()), fontFamilies.size(), AceType::RawPtr(resourceObject));
291     return panda::JSValueRef::Undefined(vm);
292 }
293 
ResetFontFamily(ArkUIRuntimeCallInfo * runtimeCallInfo)294 ArkUINativeModuleValue SpanBridge::ResetFontFamily(ArkUIRuntimeCallInfo *runtimeCallInfo)
295 {
296     EcmaVM *vm = runtimeCallInfo->GetVM();
297     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
298     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
299     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
300     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
301 
302     GetArkUINodeModifiers()->getSpanModifier()->resetSpanFontFamily(nativeNode);
303     return panda::JSValueRef::Undefined(vm);
304 }
305 
SetDecoration(ArkUIRuntimeCallInfo * runtimeCallInfo)306 ArkUINativeModuleValue SpanBridge::SetDecoration(ArkUIRuntimeCallInfo *runtimeCallInfo)
307 {
308     EcmaVM *vm = runtimeCallInfo->GetVM();
309     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
310     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
311     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
312     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(NUM_2);
313     Local<JSValueRef> fourthArg = runtimeCallInfo->GetCallArgRef(NUM_3);
314     Local<JSValueRef> fifthArg = runtimeCallInfo->GetCallArgRef(NUM_4);
315     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
316     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
317     int32_t textDecoration = static_cast<int32_t>(TextDecoration::NONE);
318     Color color = DEFAULT_DECORATION_COLOR;
319     int32_t style = static_cast<int32_t>(DEFAULT_DECORATION_STYLE);
320     double lineThicknessScale = 1.0;
321     if (secondArg->IsInt()) {
322         textDecoration = secondArg->Int32Value(vm);
323     }
324     RefPtr<ResourceObject> resourceObject;
325     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
326     if (!ArkTSUtils::ParseJsColorAlpha(vm, thirdArg, color, resourceObject, nodeInfo)) {
327         color = DEFAULT_DECORATION_COLOR;
328     }
329     if (fourthArg->IsInt()) {
330         style = fourthArg->Int32Value(vm);
331     }
332     if (!ArkTSUtils::ParseJsDouble(vm, fifthArg, lineThicknessScale)) {
333         lineThicknessScale = 1.0;
334     }
335     lineThicknessScale = lineThicknessScale < 0 ? 1.0 : lineThicknessScale;
336     GetArkUINodeModifiers()->getSpanModifier()->setSpanDecoration(
337         nativeNode, textDecoration, color.GetValue(), AceType::RawPtr(resourceObject),
338         style, static_cast<float>(lineThicknessScale));
339     return panda::JSValueRef::Undefined(vm);
340 }
341 
ResetDecoration(ArkUIRuntimeCallInfo * runtimeCallInfo)342 ArkUINativeModuleValue SpanBridge::ResetDecoration(ArkUIRuntimeCallInfo *runtimeCallInfo)
343 {
344     EcmaVM *vm = runtimeCallInfo->GetVM();
345     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
346     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
347     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
348     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
349     GetArkUINodeModifiers()->getSpanModifier()->resetSpanDecoration(nativeNode);
350     return panda::JSValueRef::Undefined(vm);
351 }
352 
SetFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)353 ArkUINativeModuleValue SpanBridge::SetFontColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
354 {
355     EcmaVM *vm = runtimeCallInfo->GetVM();
356     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
357     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
358     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
359     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
360     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
361     auto theme = GetTheme<TextTheme>();
362     CHECK_NULL_RETURN(theme, panda::JSValueRef::Undefined(vm));
363 
364     Color textColor = theme->GetTextStyle().GetTextColor();
365     RefPtr<ResourceObject> colorResObj;
366     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
367     if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, textColor, colorResObj, nodeInfo)) {
368         textColor = theme->GetTextStyle().GetTextColor();
369     }
370     GetArkUINodeModifiers()->getSpanModifier()->setSpanFontColor(
371         nativeNode, textColor.GetValue(), AceType::RawPtr(colorResObj));
372     return panda::JSValueRef::Undefined(vm);
373 }
374 
ResetFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)375 ArkUINativeModuleValue SpanBridge::ResetFontColor(ArkUIRuntimeCallInfo *runtimeCallInfo)
376 {
377     EcmaVM *vm = runtimeCallInfo->GetVM();
378     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
379     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
380     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
381     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
382 
383     GetArkUINodeModifiers()->getSpanModifier()->resetSpanFontColor(nativeNode);
384     return panda::JSValueRef::Undefined(vm);
385 }
386 
SetLetterSpacing(ArkUIRuntimeCallInfo * runtimeCallInfo)387 ArkUINativeModuleValue SpanBridge::SetLetterSpacing(ArkUIRuntimeCallInfo *runtimeCallInfo)
388 {
389     EcmaVM *vm = runtimeCallInfo->GetVM();
390     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
391     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
392     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
393     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
394     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
395     struct ArkUIStringAndFloat letterSpacingValue = { 0.0, nullptr };
396     std::string tempValueStr = "";
397     RefPtr<ResourceObject> resObj;
398     if (secondArg->IsNumber()) {
399         letterSpacingValue.value = secondArg->ToNumber(vm)->Value();
400         GetArkUINodeModifiers()->getSpanModifier()->setSpanLetterSpacing(nativeNode, &letterSpacingValue,
401             AceType::RawPtr(resObj));
402     } else if ((secondArg->IsString(vm) || secondArg->IsObject(vm)) &&
403         ArkTSUtils::ParseJsString(vm, secondArg, tempValueStr, resObj)) {
404         letterSpacingValue.valueStr = tempValueStr.c_str();
405         GetArkUINodeModifiers()->getSpanModifier()->setSpanLetterSpacing(nativeNode, &letterSpacingValue,
406             AceType::RawPtr(resObj));
407     } else {
408         GetArkUINodeModifiers()->getSpanModifier()->resetSpanLetterSpacing(nativeNode);
409     }
410     return panda::JSValueRef::Undefined(vm);
411 }
412 
ResetLetterSpacing(ArkUIRuntimeCallInfo * runtimeCallInfo)413 ArkUINativeModuleValue SpanBridge::ResetLetterSpacing(ArkUIRuntimeCallInfo *runtimeCallInfo)
414 {
415     EcmaVM *vm = runtimeCallInfo->GetVM();
416     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
417     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
418     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
419     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
420     GetArkUINodeModifiers()->getSpanModifier()->resetSpanLetterSpacing(nativeNode);
421     return panda::JSValueRef::Undefined(vm);
422 }
423 
SetBaselineOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)424 ArkUINativeModuleValue SpanBridge::SetBaselineOffset(ArkUIRuntimeCallInfo *runtimeCallInfo)
425 {
426     EcmaVM *vm = runtimeCallInfo->GetVM();
427     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
428     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
429     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
430     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
431     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
432     CalcDimension result;
433     RefPtr<ResourceObject> resourceObject;
434     if (secondArg->IsObject(vm) && ArkTSUtils::ParseJsLengthMetrics(vm, secondArg, result, resourceObject) &&
435         result.Unit() != DimensionUnit::PERCENT && !std::isnan(result.Value())) {
436         GetArkUINodeModifiers()->getSpanModifier()->setSpanBaselineOffset(
437             nativeNode, result.Value(), static_cast<int8_t>(result.Unit()), AceType::RawPtr(resourceObject));
438     } else {
439         GetArkUINodeModifiers()->getSpanModifier()->resetSpanBaselineOffset(nativeNode);
440     }
441     return panda::JSValueRef::Undefined(vm);
442 }
443 
ResetBaselineOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)444 ArkUINativeModuleValue SpanBridge::ResetBaselineOffset(ArkUIRuntimeCallInfo* runtimeCallInfo)
445 {
446     EcmaVM* vm = runtimeCallInfo->GetVM();
447     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
448     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
449     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
450     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
451     GetArkUINodeModifiers()->getSpanModifier()->resetSpanBaselineOffset(nativeNode);
452     return panda::JSValueRef::Undefined(vm);
453 }
454 
SetFont(ArkUIRuntimeCallInfo * runtimeCallInfo)455 ArkUINativeModuleValue SpanBridge::SetFont(ArkUIRuntimeCallInfo *runtimeCallInfo)
456 {
457     EcmaVM *vm = runtimeCallInfo->GetVM();
458     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
459     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
460     Local<JSValueRef> sizeArg = runtimeCallInfo->GetCallArgRef(NUM_1);
461     Local<JSValueRef> weightArg = runtimeCallInfo->GetCallArgRef(NUM_2);
462     Local<JSValueRef> familyArg = runtimeCallInfo->GetCallArgRef(NUM_3);
463     Local<JSValueRef> styleArg = runtimeCallInfo->GetCallArgRef(NUM_4);
464     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
465     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
466     ArkUIFontStruct fontInfo;
467     auto theme = GetTheme<TextTheme>();
468     CHECK_NULL_RETURN(theme, panda::JSValueRef::Undefined(vm));
469 
470     CalcDimension fontSize = theme->GetTextStyle().GetFontSize();
471     RefPtr<ResourceObject> fontSizeObj;
472     if (sizeArg->IsNull() || !ArkTSUtils::ParseJsDimensionFpNG(vm, sizeArg, fontSize, fontSizeObj, false) ||
473         fontSize.IsNegative()) {
474         fontSize = theme->GetTextStyle().GetFontSize();
475     }
476     fontInfo.fontSizeNumber = fontSize.Value();
477     fontInfo.fontSizeUnit = static_cast<int8_t>(fontSize.Unit());
478 
479     std::string weight = DEFAULT_FONT_WEIGHT;
480     if (!weightArg->IsNull()) {
481         if (weightArg->IsNumber()) {
482             weight = std::to_string(weightArg->Int32Value(vm));
483         } else if (weightArg->IsString(vm)) {
484             weight = weightArg->ToString(vm)->ToString(vm);
485         }
486     }
487     fontInfo.fontWeight = static_cast<uint8_t>(Framework::ConvertStrToFontWeight(weight));
488     int32_t style = static_cast<int32_t>(DEFAULT_FONT_STYLE);
489     if (styleArg->IsInt()) {
490         style = styleArg->Int32Value(vm);
491         if (style <= 0 || style > static_cast<int32_t>(FONT_STYLES.size())) {
492             style = static_cast<int32_t>(DEFAULT_FONT_STYLE);
493         }
494     }
495     fontInfo.fontStyle = static_cast<uint8_t>(style);
496     std::vector<std::string> fontFamilies;
497     RefPtr<ResourceObject> fontFamiliesObject;
498     fontInfo.fontFamilies = nullptr;
499     if (!familyArg->IsNull() && ArkTSUtils::ParseJsFontFamilies(vm, familyArg, fontFamilies, fontFamiliesObject)) {
500         fontInfo.familyLength = fontFamilies.size();
501         auto families = std::make_unique<const char* []>(fontInfo.familyLength);
502         for (uint32_t i = 0; i < fontFamilies.size(); i++) {
503             families[i] = fontFamilies[i].c_str();
504         }
505         fontInfo.fontFamilies = families.get();
506         GetArkUINodeModifiers()->getSpanModifier()->setSpanFont(nativeNode, &fontInfo);
507     } else {
508         GetArkUINodeModifiers()->getSpanModifier()->setSpanFont(nativeNode, &fontInfo);
509     }
510     return panda::JSValueRef::Undefined(vm);
511 }
512 
ResetFont(ArkUIRuntimeCallInfo * runtimeCallInfo)513 ArkUINativeModuleValue SpanBridge::ResetFont(ArkUIRuntimeCallInfo *runtimeCallInfo)
514 {
515     EcmaVM *vm = runtimeCallInfo->GetVM();
516     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
517     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
518     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
519     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
520     GetArkUINodeModifiers()->getSpanModifier()->resetSpanFont(nativeNode);
521     return panda::JSValueRef::Undefined(vm);
522 }
523 
SetTextBackgroundStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)524 ArkUINativeModuleValue SpanBridge::SetTextBackgroundStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
525 {
526     EcmaVM* vm = runtimeCallInfo->GetVM();
527     Color color;
528     std::vector<ArkUI_Float32> radiusArray;
529     std::vector<ArkUI_Int32> valueUnits;
530     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
531     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
532     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
533     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
534     std::shared_ptr<TextBackgroundStyle> style = std::make_shared<TextBackgroundStyle>();
535     RefPtr<ResourceObject> colorResObj;
536     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
537     if (!(ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color, colorResObj, nodeInfo))) {
538         color = Color::TRANSPARENT;
539     }
540     ArkTSUtils::ParseOuterBorderRadius(runtimeCallInfo, vm, radiusArray, valueUnits, NUM_2, style);
541     ArkTSUtils::SetTextBackgroundStyle(style, color, colorResObj, radiusArray.data(), valueUnits.data());
542     GetArkUINodeModifiers()->getSpanModifier()->setSpanTextBackgroundStyle(
543         nativeNode, color.GetValue(), radiusArray.data(), valueUnits.data(), static_cast<int32_t>(radiusArray.size()),
544         style.get());
545     return panda::JSValueRef::Undefined(vm);
546 }
547 
ResetTextBackgroundStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)548 ArkUINativeModuleValue SpanBridge::ResetTextBackgroundStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
549 {
550     EcmaVM* vm = runtimeCallInfo->GetVM();
551     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
552     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
553     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
554     GetArkUINodeModifiers()->getSpanModifier()->resetSpanTextBackgroundStyle(nativeNode);
555     return panda::JSValueRef::Undefined(vm);
556 }
557 
SetTextShadow(ArkUIRuntimeCallInfo * runtimeCallInfo)558 ArkUINativeModuleValue SpanBridge::SetTextShadow(ArkUIRuntimeCallInfo* runtimeCallInfo)
559 {
560     EcmaVM* vm = runtimeCallInfo->GetVM();
561     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
562     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
563     Local<JSValueRef> lengthArg = runtimeCallInfo->GetCallArgRef(NUM_7);
564     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
565     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
566     uint32_t length;
567     if (!lengthArg->IsNumber() || lengthArg->Uint32Value(vm) == 0) {
568         return panda::JSValueRef::Undefined(vm);
569     }
570     length = lengthArg->Uint32Value(vm);
571     std::vector<ArkUITextShadowStruct> textShadowArray;
572     std::vector<RefPtr<ResourceObject>> radiusResArr;
573     std::vector<RefPtr<ResourceObject>> colorResArr;
574     std::vector<RefPtr<ResourceObject>> offsetXResArr;
575     std::vector<RefPtr<ResourceObject>> offsetYResArr;
576     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
577     ParseTextShadow(runtimeCallInfo, length, textShadowArray, radiusResArr, colorResArr, offsetXResArr, offsetYResArr,
578         nodeInfo);
579     GetArkUINodeModifiers()->getSpanModifier()->setTextShadow(nativeNode, textShadowArray.data(), length,
580         static_cast<void*>(&radiusResArr), static_cast<void*>(&colorResArr),
581         static_cast<void*>(&offsetXResArr), static_cast<void*>(&offsetYResArr));
582     return panda::JSValueRef::Undefined(vm);
583 }
584 
ResetTextShadow(ArkUIRuntimeCallInfo * runtimeCallInfo)585 ArkUINativeModuleValue SpanBridge::ResetTextShadow(ArkUIRuntimeCallInfo* runtimeCallInfo)
586 {
587     EcmaVM* vm = runtimeCallInfo->GetVM();
588     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
589     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
590     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
591     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
592     GetArkUINodeModifiers()->getSpanModifier()->resetTextShadow(nativeNode);
593     return panda::JSValueRef::Undefined(vm);
594 }
595 
SetAccessibilityText(ArkUIRuntimeCallInfo * runtimeCallInfo)596 ArkUINativeModuleValue SpanBridge::SetAccessibilityText(ArkUIRuntimeCallInfo *runtimeCallInfo)
597 {
598     EcmaVM* vm = runtimeCallInfo->GetVM();
599     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
600     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
601     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
602     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
603     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
604     if (secondArg->IsString(vm)) {
605         std::string stringValue = secondArg->ToString(vm)->ToString(vm);
606         GetArkUINodeModifiers()->getSpanModifier()->setAccessibilityText(nativeNode, stringValue.c_str());
607     } else {
608         GetArkUINodeModifiers()->getSpanModifier()->resetAccessibilityText(nativeNode);
609     }
610     return panda::JSValueRef::Undefined(vm);
611 }
612 
ResetAccessibilityText(ArkUIRuntimeCallInfo * runtimeCallInfo)613 ArkUINativeModuleValue SpanBridge::ResetAccessibilityText(ArkUIRuntimeCallInfo *runtimeCallInfo)
614 {
615     EcmaVM* vm = runtimeCallInfo->GetVM();
616     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
617     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
618     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
619     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
620     GetArkUINodeModifiers()->getSpanModifier()->resetAccessibilityText(nativeNode);
621     return panda::JSValueRef::Undefined(vm);
622 }
623 
SetAccessibilityDescription(ArkUIRuntimeCallInfo * runtimeCallInfo)624 ArkUINativeModuleValue SpanBridge::SetAccessibilityDescription(ArkUIRuntimeCallInfo *runtimeCallInfo)
625 {
626     EcmaVM* vm = runtimeCallInfo->GetVM();
627     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
628     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
629     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
630     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
631     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
632     if (secondArg->IsString(vm)) {
633         std::string stringValue = secondArg->ToString(vm)->ToString(vm);
634         GetArkUINodeModifiers()->getSpanModifier()->setAccessibilityDescription(nativeNode, stringValue.c_str());
635     } else {
636         GetArkUINodeModifiers()->getSpanModifier()->resetAccessibilityDescription(nativeNode);
637     }
638     return panda::JSValueRef::Undefined(vm);
639 }
640 
ResetAccessibilityDescription(ArkUIRuntimeCallInfo * runtimeCallInfo)641 ArkUINativeModuleValue SpanBridge::ResetAccessibilityDescription(ArkUIRuntimeCallInfo *runtimeCallInfo)
642 {
643     EcmaVM* vm = runtimeCallInfo->GetVM();
644     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
645     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
646     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
647     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
648     GetArkUINodeModifiers()->getSpanModifier()->resetAccessibilityDescription(nativeNode);
649     return panda::JSValueRef::Undefined(vm);
650 }
651 
SetAccessibilityLevel(ArkUIRuntimeCallInfo * runtimeCallInfo)652 ArkUINativeModuleValue SpanBridge::SetAccessibilityLevel(ArkUIRuntimeCallInfo *runtimeCallInfo)
653 {
654     EcmaVM* vm = runtimeCallInfo->GetVM();
655     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
656     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
657     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
658     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
659     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
660     if (secondArg->IsString(vm)) {
661         std::string stringValue = secondArg->ToString(vm)->ToString(vm);
662         GetArkUINodeModifiers()->getSpanModifier()->setAccessibilityLevel(nativeNode, stringValue.c_str());
663     } else {
664         GetArkUINodeModifiers()->getSpanModifier()->resetAccessibilityLevel(nativeNode);
665     }
666     return panda::JSValueRef::Undefined(vm);
667 }
668 
ResetAccessibilityLevel(ArkUIRuntimeCallInfo * runtimeCallInfo)669 ArkUINativeModuleValue SpanBridge::ResetAccessibilityLevel(ArkUIRuntimeCallInfo *runtimeCallInfo)
670 {
671     EcmaVM* vm = runtimeCallInfo->GetVM();
672     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
673     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
674     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
675     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
676     GetArkUINodeModifiers()->getSpanModifier()->resetAccessibilityLevel(nativeNode);
677     return panda::JSValueRef::Undefined(vm);
678 }
679 
SetOnHover(ArkUIRuntimeCallInfo * runtimeCallInfo)680 ArkUINativeModuleValue SpanBridge::SetOnHover(ArkUIRuntimeCallInfo *runtimeCallInfo)
681 {
682     EcmaVM* vm = runtimeCallInfo->GetVM();
683     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
684     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
685     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
686     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
687     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
688     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
689     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
690     if (secondArg->IsFunction(vm)) {
691         panda::Local<panda::FunctionRef> func = secondArg->ToObject(vm);
692         OnHoverFunc callback = [vm, frameNode,
693             func = panda::CopyableGlobal(vm, func)](bool isHover, HoverInfo& info) {
694             panda::LocalScope pandaScope(vm);
695             panda::TryCatch trycatch(vm);
696             PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
697 
698             auto obj = FrameNodeBridge::CreateHoverInfo(vm, info);
699             obj->SetNativePointerFieldCount(vm, 1);
700             obj->SetNativePointerField(vm, 0, static_cast<void*>(&info));
701 
702             panda::Local<panda::JSValueRef> params[NUM_2] = {
703                 panda::BooleanRef::New(vm, isHover), obj };
704             func->Call(vm, func.ToLocal(), params, NUM_2);
705         };
706         GetArkUINodeModifiers()->getSpanModifier()->setSpanOnHover(nativeNode, reinterpret_cast<void*>(&callback));
707     } else {
708         GetArkUINodeModifiers()->getSpanModifier()->resetSpanOnHover(nativeNode);
709     }
710     return panda::JSValueRef::Undefined(vm);
711 }
712 
ResetOnHover(ArkUIRuntimeCallInfo * runtimeCallInfo)713 ArkUINativeModuleValue SpanBridge::ResetOnHover(ArkUIRuntimeCallInfo *runtimeCallInfo)
714 {
715     EcmaVM* vm = runtimeCallInfo->GetVM();
716     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
717     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
718     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
719     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
720     GetArkUINodeModifiers()->getSpanModifier()->resetSpanOnHover(nativeNode);
721     return panda::JSValueRef::Undefined(vm);
722 }
723 } // namespace OHOS::Ace::NG
724