• 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 
16 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_scroll_bridge.h"
17 
18 #include "base/log/log.h"
19 #include "base/utils/string_utils.h"
20 #include "base/utils/utils.h"
21 #include "core/interfaces/native/node/api.h"
22 #include "frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
23 
24 namespace OHOS::Ace::NG {
25 constexpr double FRICTION_DEFAULT = 0.6;
26 constexpr int32_t FROWARD_INITIAL_VALUE = 0;
27 constexpr int32_t BACKWARD_INITIAL_VALUE = 0;
28 
ParsePagination(const EcmaVM * vm,const Local<JSValueRef> & paginationValue,std::vector<double> & vPaginationValue,std::vector<int32_t> & vPaginationUnit)29 bool ParsePagination(const EcmaVM* vm, const Local<JSValueRef>& paginationValue, std::vector<double>& vPaginationValue,
30     std::vector<int32_t>& vPaginationUnit)
31 {
32     uint32_t pLength = 0;
33     if (paginationValue->IsArray(vm)) {
34         auto paginationArray = panda::Local<panda::ArrayRef>(paginationValue);
35         pLength = paginationArray->Length(vm);
36         if (pLength <= 0) {
37             return false;
38         }
39         for (uint32_t i = 0; i < pLength; i++) {
40             CalcDimension dims;
41             Local<JSValueRef> xValue = panda::ArrayRef::GetValueAt(vm, paginationArray, i);
42             if (!ArkTSUtils::ParseJsDimensionVpNG(vm, xValue, dims, true)) {
43                 return false;
44             }
45             vPaginationValue.push_back(dims.Value());
46             vPaginationUnit.push_back(static_cast<int32_t>(dims.Unit()));
47         }
48     } else {
49         CalcDimension intervalSize;
50         if (!ArkTSUtils::ParseJsDimensionVp(vm, paginationValue, intervalSize) || intervalSize.IsNegative()) {
51             intervalSize = CalcDimension(0.0);
52         }
53         vPaginationValue.push_back(intervalSize.Value());
54         vPaginationUnit.push_back(static_cast<int32_t>(intervalSize.Unit()));
55     }
56 
57     return true;
58 }
59 
SetNestedScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)60 ArkUINativeModuleValue ScrollBridge::SetNestedScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
61 {
62     EcmaVM* vm = runtimeCallInfo->GetVM();
63     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
64     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
65     Local<JSValueRef> scrollForwardValue = runtimeCallInfo->GetCallArgRef(1);  // 1: index of scroll forward value
66     Local<JSValueRef> scrollBackwardValue = runtimeCallInfo->GetCallArgRef(2); // 2: index of scroll backward value
67     void* nativeNode = nativeNodeArg->ToNativePointer(vm)->Value();
68     auto froward = 0;
69     auto backward = 0;
70     ArkTSUtils::ParseJsInteger(vm, scrollForwardValue, froward);
71     if (froward < static_cast<int32_t>(NestedScrollMode::SELF_ONLY) ||
72         froward > static_cast<int32_t>(NestedScrollMode::PARALLEL)) {
73         froward = FROWARD_INITIAL_VALUE;
74     }
75     ArkTSUtils::ParseJsInteger(vm, scrollBackwardValue, backward);
76     if (backward < static_cast<int32_t>(NestedScrollMode::SELF_ONLY) ||
77         backward > static_cast<int32_t>(NestedScrollMode::PARALLEL)) {
78         backward = BACKWARD_INITIAL_VALUE;
79     }
80     GetArkUIInternalNodeAPI()->GetScrollModifier().SetScrollNestedScroll(nativeNode, froward, backward);
81     return panda::JSValueRef::Undefined(vm);
82 }
83 
ResetNestedScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)84 ArkUINativeModuleValue ScrollBridge::ResetNestedScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
85 {
86     EcmaVM* vm = runtimeCallInfo->GetVM();
87     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
88     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
89     void* nativeNode = nativeNodeArg->ToNativePointer(vm)->Value();
90     GetArkUIInternalNodeAPI()->GetScrollModifier().ResetScrollNestedScroll(nativeNode);
91     return panda::JSValueRef::Undefined(vm);
92 }
93 
SetEnableScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)94 ArkUINativeModuleValue ScrollBridge::SetEnableScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
95 {
96     EcmaVM* vm = runtimeCallInfo->GetVM();
97     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
98     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
99     Local<JSValueRef> isEnabledArg = runtimeCallInfo->GetCallArgRef(1);
100     void* nativeNode = nativeNodeArg->ToNativePointer(vm)->Value();
101     bool isEnabled = isEnabledArg->IsBoolean() ? isEnabledArg->ToBoolean(vm)->Value() : true;
102     GetArkUIInternalNodeAPI()->GetScrollModifier().SetScrollEnableScroll(nativeNode, isEnabled);
103     return panda::JSValueRef::Undefined(vm);
104 }
105 
ResetEnableScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)106 ArkUINativeModuleValue ScrollBridge::ResetEnableScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
107 {
108     EcmaVM* vm = runtimeCallInfo->GetVM();
109     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
110     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
111     void* nativeNode = nativeNodeArg->ToNativePointer(vm)->Value();
112     GetArkUIInternalNodeAPI()->GetScrollModifier().ResetScrollEnableScroll(nativeNode);
113     return panda::JSValueRef::Undefined(vm);
114 }
115 
SetFriction(ArkUIRuntimeCallInfo * runtimeCallInfo)116 ArkUINativeModuleValue ScrollBridge::SetFriction(ArkUIRuntimeCallInfo* runtimeCallInfo)
117 {
118     EcmaVM* vm = runtimeCallInfo->GetVM();
119     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
120     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
121     Local<JSValueRef> scrollFrictionArg = runtimeCallInfo->GetCallArgRef(1);
122     void* nativeNode = nativeNodeArg->ToNativePointer(vm)->Value();
123     double friction = FRICTION_DEFAULT;
124     if (!ArkTSUtils::ParseJsDouble(vm, scrollFrictionArg, friction)) {
125         GetArkUIInternalNodeAPI()->GetScrollModifier().ResetScrollFriction(nativeNode);
126     } else {
127         GetArkUIInternalNodeAPI()->GetScrollModifier().SetScrollFriction(nativeNode, friction);
128     }
129     return panda::JSValueRef::Undefined(vm);
130 }
131 
ResetFriction(ArkUIRuntimeCallInfo * runtimeCallInfo)132 ArkUINativeModuleValue ScrollBridge::ResetFriction(ArkUIRuntimeCallInfo* runtimeCallInfo)
133 {
134     EcmaVM* vm = runtimeCallInfo->GetVM();
135     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
136     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
137     void* nativeNode = nativeNodeArg->ToNativePointer(vm)->Value();
138     GetArkUIInternalNodeAPI()->GetScrollModifier().ResetScrollFriction(nativeNode);
139     return panda::JSValueRef::Undefined(vm);
140 }
141 
SetScrollSnap(ArkUIRuntimeCallInfo * runtimeCallInfo)142 ArkUINativeModuleValue ScrollBridge::SetScrollSnap(ArkUIRuntimeCallInfo* runtimeCallInfo)
143 {
144     EcmaVM* vm = runtimeCallInfo->GetVM();
145     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
146     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
147     Local<JSValueRef> snapAlignValue = runtimeCallInfo->GetCallArgRef(1);         // 1: index of snap align value
148     Local<JSValueRef> paginationValue = runtimeCallInfo->GetCallArgRef(2);        // 2: index of pagination value
149     Local<JSValueRef> enableSnapToStartValue = runtimeCallInfo->GetCallArgRef(3); // 3: index of enableSnapToStart value
150     Local<JSValueRef> enableSnapToEndValue = runtimeCallInfo->GetCallArgRef(4);   // 4: index of enableSnapToEnd value
151     void* nativeNode = nativeNodeArg->ToNativePointer(vm)->Value();
152     auto snapAlign = static_cast<int32_t>(ScrollSnapAlign::NONE);
153     if (snapAlignValue->IsNull() || snapAlignValue->IsUndefined() ||
154         !ArkTSUtils::ParseJsInteger(vm, snapAlignValue, snapAlign) ||
155         snapAlign < static_cast<int32_t>(ScrollSnapAlign::NONE) ||
156         snapAlign > static_cast<int32_t>(ScrollSnapAlign::END)) {
157         snapAlign = static_cast<int32_t>(ScrollSnapAlign::NONE);
158     }
159     std::vector<double> vPaginationValue;
160     std::vector<int32_t> vPaginationUnit;
161     if (!ParsePagination(vm, paginationValue, vPaginationValue, vPaginationUnit)) {
162         GetArkUIInternalNodeAPI()->GetScrollModifier().ResetScrollScrollSnap(nativeNode);
163         return panda::JSValueRef::Undefined(vm);
164     }
165     bool isArray = true;
166     if (!paginationValue->IsArray(vm)) {
167         isArray = false;
168     }
169     auto pLength = vPaginationValue.size();
170     vPaginationUnit.push_back(snapAlign);
171     vPaginationUnit.push_back(static_cast<int32_t>(enableSnapToStartValue->ToBoolean(vm)->Value()));
172     vPaginationUnit.push_back(static_cast<int32_t>(enableSnapToEndValue->ToBoolean(vm)->Value()));
173     vPaginationUnit.push_back(static_cast<int32_t>(isArray));
174     auto uLength = pLength + 4;
175     GetArkUIInternalNodeAPI()->GetScrollModifier().SetScrollScrollSnap(
176         nativeNode, vPaginationValue.data(), pLength, vPaginationUnit.data(), uLength);
177     return panda::JSValueRef::Undefined(vm);
178 }
179 
ResetScrollSnap(ArkUIRuntimeCallInfo * runtimeCallInfo)180 ArkUINativeModuleValue ScrollBridge::ResetScrollSnap(ArkUIRuntimeCallInfo* runtimeCallInfo)
181 {
182     EcmaVM* vm = runtimeCallInfo->GetVM();
183     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
184     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
185     void* nativeNode = nativeNodeArg->ToNativePointer(vm)->Value();
186     GetArkUIInternalNodeAPI()->GetScrollModifier().ResetScrollScrollSnap(nativeNode);
187     return panda::JSValueRef::Undefined(vm);
188 }
189 
SetScrollBar(ArkUIRuntimeCallInfo * runtimeCallInfo)190 ArkUINativeModuleValue ScrollBridge::SetScrollBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
191 {
192     EcmaVM* vm = runtimeCallInfo->GetVM();
193     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
194     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
195     Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(1);
196     void* nativeNode = nativeNodeArg->ToNativePointer(vm)->Value();
197     auto value = static_cast<int32_t>(DisplayMode::AUTO);
198     if (!jsValue->IsUndefined()) {
199         ArkTSUtils::ParseJsInteger(vm, jsValue, value);
200     }
201     GetArkUIInternalNodeAPI()->GetScrollModifier().SetScrollScrollBar(nativeNode, value);
202     return panda::JSValueRef::Undefined(vm);
203 }
204 
ResetScrollBar(ArkUIRuntimeCallInfo * runtimeCallInfo)205 ArkUINativeModuleValue ScrollBridge::ResetScrollBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
206 {
207     EcmaVM* vm = runtimeCallInfo->GetVM();
208     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
209     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
210     void* nativeNode = nativeNodeArg->ToNativePointer(vm)->Value();
211     GetArkUIInternalNodeAPI()->GetScrollModifier().ResetScrollScrollBar(nativeNode);
212     return panda::JSValueRef::Undefined(vm);
213 }
214 
SetScrollable(ArkUIRuntimeCallInfo * runtimeCallInfo)215 ArkUINativeModuleValue ScrollBridge::SetScrollable(ArkUIRuntimeCallInfo* runtimeCallInfo)
216 {
217     EcmaVM* vm = runtimeCallInfo->GetVM();
218     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
219     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
220     Local<JSValueRef> scrollDirectionArg = runtimeCallInfo->GetCallArgRef(1);
221     void* nativeNode = nativeNodeArg->ToNativePointer(vm)->Value();
222     if (scrollDirectionArg->IsUndefined() || scrollDirectionArg->IsNull()) {
223         GetArkUIInternalNodeAPI()->GetScrollModifier().ResetScrollScrollable(nativeNode);
224         return panda::JSValueRef::Undefined(vm);
225     }
226 
227     int32_t scrollDirection = scrollDirectionArg->Int32Value(vm);
228     if (scrollDirection != static_cast<int32_t>(Axis::VERTICAL) &&
229         scrollDirection != static_cast<int32_t>(Axis::HORIZONTAL) &&
230         scrollDirection != static_cast<int32_t>(Axis::FREE) && scrollDirection != static_cast<int32_t>(Axis::NONE)) {
231         GetArkUIInternalNodeAPI()->GetScrollModifier().ResetScrollScrollable(nativeNode);
232     } else {
233         GetArkUIInternalNodeAPI()->GetScrollModifier().SetScrollScrollable(nativeNode, scrollDirection);
234     }
235 
236     return panda::JSValueRef::Undefined(vm);
237 }
238 
ResetScrollable(ArkUIRuntimeCallInfo * runtimeCallInfo)239 ArkUINativeModuleValue ScrollBridge::ResetScrollable(ArkUIRuntimeCallInfo* runtimeCallInfo)
240 {
241     EcmaVM* vm = runtimeCallInfo->GetVM();
242     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
243     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
244     void* nativeNode = nativeNodeArg->ToNativePointer(vm)->Value();
245     GetArkUIInternalNodeAPI()->GetScrollModifier().ResetScrollScrollable(nativeNode);
246     return panda::JSValueRef::Undefined(vm);
247 }
248 
SetScrollBarColor(ArkUIRuntimeCallInfo * runtimeCallInfo)249 ArkUINativeModuleValue ScrollBridge::SetScrollBarColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
250 {
251     EcmaVM* vm = runtimeCallInfo->GetVM();
252     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
253     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
254     Local<JSValueRef> barcolorArg = runtimeCallInfo->GetCallArgRef(1);
255     void* nativeNode = nativeNodeArg->ToNativePointer(vm)->Value();
256     Color color;
257     if (!ArkTSUtils::ParseJsColorAlpha(vm, barcolorArg, color)) {
258         GetArkUIInternalNodeAPI()->GetScrollModifier().ResetScrollScrollBarColor(nativeNode);
259     } else {
260         GetArkUIInternalNodeAPI()->GetScrollModifier().SetScrollScrollBarColor(nativeNode, color.GetValue());
261     }
262 
263     return panda::JSValueRef::Undefined(vm);
264 }
265 
ResetScrollBarColor(ArkUIRuntimeCallInfo * runtimeCallInfo)266 ArkUINativeModuleValue ScrollBridge::ResetScrollBarColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
267 {
268     EcmaVM* vm = runtimeCallInfo->GetVM();
269     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
270     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
271     void* nativeNode = nativeNodeArg->ToNativePointer(vm)->Value();
272     GetArkUIInternalNodeAPI()->GetScrollModifier().ResetScrollScrollBarColor(nativeNode);
273     return panda::JSValueRef::Undefined(vm);
274 }
275 
SetScrollBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)276 ArkUINativeModuleValue ScrollBridge::SetScrollBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
277 {
278     EcmaVM* vm = runtimeCallInfo->GetVM();
279     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
280     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
281     Local<JSValueRef> scrollBarArg = runtimeCallInfo->GetCallArgRef(1);
282     void* nativeNode = nativeNodeArg->ToNativePointer(vm)->Value();
283     CalcDimension scrollBarWidth;
284     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, scrollBarArg, scrollBarWidth, false)) {
285         GetArkUIInternalNodeAPI()->GetScrollModifier().ResetScrollScrollBarWidth(nativeNode);
286     } else {
287         if (LessNotEqual(scrollBarWidth.Value(), 0.0)) {
288             GetArkUIInternalNodeAPI()->GetScrollModifier().ResetScrollScrollBarWidth(nativeNode);
289         } else {
290             GetArkUIInternalNodeAPI()->GetScrollModifier().SetScrollScrollBarWidth(
291                 nativeNode, scrollBarWidth.Value(), static_cast<int32_t>(scrollBarWidth.Unit()));
292         }
293     }
294 
295     return panda::JSValueRef::Undefined(vm);
296 }
297 
ResetScrollBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)298 ArkUINativeModuleValue ScrollBridge::ResetScrollBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
299 {
300     EcmaVM* vm = runtimeCallInfo->GetVM();
301     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
302     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
303     void* nativeNode = nativeNodeArg->ToNativePointer(vm)->Value();
304     GetArkUIInternalNodeAPI()->GetScrollModifier().ResetScrollScrollBarWidth(nativeNode);
305     return panda::JSValueRef::Undefined(vm);
306 }
307 
SetEdgeEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)308 ArkUINativeModuleValue ScrollBridge::SetEdgeEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
309 {
310     EcmaVM* vm = runtimeCallInfo->GetVM();
311     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
312     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
313     Local<JSValueRef> effectArg = runtimeCallInfo->GetCallArgRef(1);    // 1: index of effect value
314     Local<JSValueRef> isEffectArg = runtimeCallInfo->GetCallArgRef(2);  // 2: index of isEffect value
315     void* nativeNode = nativeNodeArg->ToNativePointer(vm)->Value();
316     int32_t effect = static_cast<int32_t>(EdgeEffect::NONE);
317     if (!effectArg->IsUndefined() && !effectArg->IsNull()) {
318         effect = effectArg->Int32Value(vm);
319     }
320 
321     if (effect != static_cast<int32_t>(EdgeEffect::SPRING) && effect != static_cast<int32_t>(EdgeEffect::NONE) &&
322         effect != static_cast<int32_t>(EdgeEffect::FADE)) {
323         effect = static_cast<int32_t>(EdgeEffect::NONE);
324     }
325 
326     if (isEffectArg->IsUndefined() || isEffectArg->IsNull()) {
327         GetArkUIInternalNodeAPI()->GetScrollModifier().SetScrollEdgeEffect(nativeNode, effect, true);
328     } else {
329         GetArkUIInternalNodeAPI()->GetScrollModifier().SetScrollEdgeEffect(
330             nativeNode, effect, isEffectArg->ToBoolean(vm)->Value());
331     }
332 
333     return panda::JSValueRef::Undefined(vm);
334 }
335 
ResetEdgeEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)336 ArkUINativeModuleValue ScrollBridge::ResetEdgeEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
337 {
338     EcmaVM* vm = runtimeCallInfo->GetVM();
339     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
340     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
341     void* nativeNode = nativeNodeArg->ToNativePointer(vm)->Value();
342     GetArkUIInternalNodeAPI()->GetScrollModifier().ResetScrollEdgeEffect(nativeNode);
343     return panda::JSValueRef::Undefined(vm);
344 }
345 
SetEnablePaging(ArkUIRuntimeCallInfo * runtimeCallInfo)346 ArkUINativeModuleValue ScrollBridge::SetEnablePaging(ArkUIRuntimeCallInfo* runtimeCallInfo)
347 {
348     EcmaVM* vm = runtimeCallInfo->GetVM();
349     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
350     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
351     Local<JSValueRef> enablePagingArg = runtimeCallInfo->GetCallArgRef(1);
352     void* nativeNode = nativeNodeArg->ToNativePointer(vm)->Value();
353     bool enablePaging;
354     if (enablePagingArg->IsBoolean()) {
355         enablePaging = enablePagingArg->ToBoolean(vm)->Value();
356         GetArkUIInternalNodeAPI()->GetScrollModifier().SetEnablePaging(nativeNode, enablePaging);
357     } else {
358         GetArkUIInternalNodeAPI()->GetScrollModifier().ResetEnablePaging(nativeNode);
359     }
360     return panda::JSValueRef::Undefined(vm);
361 }
362 
ResetEnablePaging(ArkUIRuntimeCallInfo * runtimeCallInfo)363 ArkUINativeModuleValue ScrollBridge::ResetEnablePaging(ArkUIRuntimeCallInfo* runtimeCallInfo)
364 {
365     EcmaVM* vm = runtimeCallInfo->GetVM();
366     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
367     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
368     void* nativeNode = nativeNodeArg->ToNativePointer(vm)->Value();
369     GetArkUIInternalNodeAPI()->GetScrollModifier().ResetEnablePaging(nativeNode);
370     return panda::JSValueRef::Undefined(vm);
371 }
372 } // namespace OHOS::Ace::NG
373