• 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 "bridge/declarative_frontend/jsview/js_scroller.h"
22 #include "core/components_ng/pattern/scroll/scroll_model.h"
23 #include "frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
24 #include "frameworks/core/components/scroll_bar/scroll_proxy.h"
25 
26 namespace OHOS::Ace::NG {
27 constexpr int NUM_0 = 0;
28 constexpr int NUM_1 = 1;
29 constexpr int NUM_2 = 2;
30 constexpr double FRICTION_DEFAULT = 0.6;
31 constexpr int32_t FROWARD_INITIAL_VALUE = 0;
32 constexpr int32_t BACKWARD_INITIAL_VALUE = 0;
33 
ParsePagination(const EcmaVM * vm,const Local<JSValueRef> & paginationValue,std::vector<ArkUI_Float32> & vPaginationValue,std::vector<int32_t> & vPaginationUnit)34 bool ParsePagination(const EcmaVM* vm, const Local<JSValueRef>& paginationValue,
35     std::vector<ArkUI_Float32>& vPaginationValue,
36     std::vector<int32_t>& vPaginationUnit)
37 {
38     uint32_t pLength = 0;
39     if (paginationValue->IsArray(vm)) {
40         auto paginationArray = panda::Local<panda::ArrayRef>(paginationValue);
41         pLength = paginationArray->Length(vm);
42         if (pLength <= 0) {
43             return false;
44         }
45         for (uint32_t i = 0; i < pLength; i++) {
46             CalcDimension dims;
47             Local<JSValueRef> xValue = panda::ArrayRef::GetValueAt(vm, paginationArray, i);
48             if (!ArkTSUtils::ParseJsDimensionVpNG(vm, xValue, dims, true)) {
49                 return false;
50             }
51             vPaginationValue.push_back(static_cast<ArkUI_Float32>(dims.Value()));
52             vPaginationUnit.push_back(static_cast<int32_t>(dims.Unit()));
53         }
54     } else {
55         CalcDimension intervalSize;
56         if (!ArkTSUtils::ParseJsDimensionVp(vm, paginationValue, intervalSize) || intervalSize.IsNegative()) {
57             intervalSize = CalcDimension(0.0);
58         }
59         vPaginationValue.push_back(static_cast<ArkUI_Float32>(intervalSize.Value()));
60         vPaginationUnit.push_back(static_cast<int32_t>(intervalSize.Unit()));
61     }
62 
63     return true;
64 }
65 
SetNestedScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)66 ArkUINativeModuleValue ScrollBridge::SetNestedScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
67 {
68     EcmaVM* vm = runtimeCallInfo->GetVM();
69     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
70     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
71     Local<JSValueRef> scrollForwardValue = runtimeCallInfo->GetCallArgRef(1);  // 1: index of scroll forward value
72     Local<JSValueRef> scrollBackwardValue = runtimeCallInfo->GetCallArgRef(2); // 2: index of scroll backward value
73     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
74     auto froward = 0;
75     auto backward = 0;
76     ArkTSUtils::ParseJsInteger(vm, scrollForwardValue, froward);
77     if (froward < static_cast<int32_t>(NestedScrollMode::SELF_ONLY) ||
78         froward > static_cast<int32_t>(NestedScrollMode::PARALLEL)) {
79         froward = FROWARD_INITIAL_VALUE;
80     }
81     ArkTSUtils::ParseJsInteger(vm, scrollBackwardValue, backward);
82     if (backward < static_cast<int32_t>(NestedScrollMode::SELF_ONLY) ||
83         backward > static_cast<int32_t>(NestedScrollMode::PARALLEL)) {
84         backward = BACKWARD_INITIAL_VALUE;
85     }
86     GetArkUINodeModifiers()->getScrollModifier()->setScrollNestedScroll(nativeNode, froward, backward);
87     return panda::JSValueRef::Undefined(vm);
88 }
89 
ResetNestedScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)90 ArkUINativeModuleValue ScrollBridge::ResetNestedScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
91 {
92     EcmaVM* vm = runtimeCallInfo->GetVM();
93     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
94     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
95     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
96     GetArkUINodeModifiers()->getScrollModifier()->resetScrollNestedScroll(nativeNode);
97     return panda::JSValueRef::Undefined(vm);
98 }
99 
SetEnableScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)100 ArkUINativeModuleValue ScrollBridge::SetEnableScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
101 {
102     EcmaVM* vm = runtimeCallInfo->GetVM();
103     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
104     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
105     Local<JSValueRef> isEnabledArg = runtimeCallInfo->GetCallArgRef(1);
106     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
107     bool isEnabled = isEnabledArg->IsBoolean() ? isEnabledArg->ToBoolean(vm)->Value() : true;
108     GetArkUINodeModifiers()->getScrollModifier()->setScrollEnableScroll(nativeNode, isEnabled);
109     return panda::JSValueRef::Undefined(vm);
110 }
111 
ResetEnableScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)112 ArkUINativeModuleValue ScrollBridge::ResetEnableScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
113 {
114     EcmaVM* vm = runtimeCallInfo->GetVM();
115     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
116     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
117     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
118     GetArkUINodeModifiers()->getScrollModifier()->resetScrollEnableScroll(nativeNode);
119     return panda::JSValueRef::Undefined(vm);
120 }
121 
SetFriction(ArkUIRuntimeCallInfo * runtimeCallInfo)122 ArkUINativeModuleValue ScrollBridge::SetFriction(ArkUIRuntimeCallInfo* runtimeCallInfo)
123 {
124     EcmaVM* vm = runtimeCallInfo->GetVM();
125     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
126     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
127     Local<JSValueRef> scrollFrictionArg = runtimeCallInfo->GetCallArgRef(1);
128     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
129     double friction = FRICTION_DEFAULT;
130     if (!ArkTSUtils::ParseJsDouble(vm, scrollFrictionArg, friction)) {
131         GetArkUINodeModifiers()->getScrollModifier()->resetScrollFriction(nativeNode);
132     } else {
133         GetArkUINodeModifiers()->getScrollModifier()->setScrollFriction(nativeNode,
134             static_cast<ArkUI_Float32>(friction));
135     }
136     return panda::JSValueRef::Undefined(vm);
137 }
138 
ResetFriction(ArkUIRuntimeCallInfo * runtimeCallInfo)139 ArkUINativeModuleValue ScrollBridge::ResetFriction(ArkUIRuntimeCallInfo* runtimeCallInfo)
140 {
141     EcmaVM* vm = runtimeCallInfo->GetVM();
142     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
143     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
144     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
145     GetArkUINodeModifiers()->getScrollModifier()->resetScrollFriction(nativeNode);
146     return panda::JSValueRef::Undefined(vm);
147 }
148 
SetScrollSnap(ArkUIRuntimeCallInfo * runtimeCallInfo)149 ArkUINativeModuleValue ScrollBridge::SetScrollSnap(ArkUIRuntimeCallInfo* runtimeCallInfo)
150 {
151     EcmaVM* vm = runtimeCallInfo->GetVM();
152     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
153     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
154     Local<JSValueRef> snapAlignValue = runtimeCallInfo->GetCallArgRef(1);         // 1: index of snap align value
155     Local<JSValueRef> paginationValue = runtimeCallInfo->GetCallArgRef(2);        // 2: index of pagination value
156     Local<JSValueRef> enableSnapToStartValue = runtimeCallInfo->GetCallArgRef(3); // 3: index of enableSnapToStart value
157     Local<JSValueRef> enableSnapToEndValue = runtimeCallInfo->GetCallArgRef(4);   // 4: index of enableSnapToEnd value
158     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
159     auto snapAlign = static_cast<int32_t>(ScrollSnapAlign::NONE);
160     if (snapAlignValue->IsNull() || snapAlignValue->IsUndefined() ||
161         !ArkTSUtils::ParseJsInteger(vm, snapAlignValue, snapAlign) ||
162         snapAlign < static_cast<int32_t>(ScrollSnapAlign::NONE) ||
163         snapAlign > static_cast<int32_t>(ScrollSnapAlign::END)) {
164         snapAlign = static_cast<int32_t>(ScrollSnapAlign::NONE);
165     }
166     std::vector<ArkUI_Float32> vPaginationValue;
167     std::vector<int32_t> vPaginationUnit;
168     if (!ParsePagination(vm, paginationValue, vPaginationValue, vPaginationUnit)) {
169         GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollSnap(nativeNode);
170         return panda::JSValueRef::Undefined(vm);
171     }
172     bool isArray = true;
173     if (!paginationValue->IsArray(vm)) {
174         isArray = false;
175     }
176     auto pLength = vPaginationValue.size();
177     vPaginationUnit.push_back(snapAlign);
178     vPaginationUnit.push_back(static_cast<int32_t>(enableSnapToStartValue->ToBoolean(vm)->Value()));
179     vPaginationUnit.push_back(static_cast<int32_t>(enableSnapToEndValue->ToBoolean(vm)->Value()));
180     vPaginationUnit.push_back(static_cast<int32_t>(isArray));
181     auto uLength = pLength + 4;
182     GetArkUINodeModifiers()->getScrollModifier()->setScrollScrollSnap(
183         nativeNode, vPaginationValue.data(), pLength, vPaginationUnit.data(), uLength);
184     return panda::JSValueRef::Undefined(vm);
185 }
186 
ResetScrollSnap(ArkUIRuntimeCallInfo * runtimeCallInfo)187 ArkUINativeModuleValue ScrollBridge::ResetScrollSnap(ArkUIRuntimeCallInfo* runtimeCallInfo)
188 {
189     EcmaVM* vm = runtimeCallInfo->GetVM();
190     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
191     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
192     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
193     GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollSnap(nativeNode);
194     return panda::JSValueRef::Undefined(vm);
195 }
196 
SetScrollBar(ArkUIRuntimeCallInfo * runtimeCallInfo)197 ArkUINativeModuleValue ScrollBridge::SetScrollBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
198 {
199     EcmaVM* vm = runtimeCallInfo->GetVM();
200     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
201     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
202     Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(1);
203     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
204     auto value = static_cast<int32_t>(DisplayMode::AUTO);
205     if (!jsValue->IsUndefined()) {
206         ArkTSUtils::ParseJsInteger(vm, jsValue, value);
207     }
208     GetArkUINodeModifiers()->getScrollModifier()->setScrollScrollBar(nativeNode, value);
209     return panda::JSValueRef::Undefined(vm);
210 }
211 
ResetScrollBar(ArkUIRuntimeCallInfo * runtimeCallInfo)212 ArkUINativeModuleValue ScrollBridge::ResetScrollBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
213 {
214     EcmaVM* vm = runtimeCallInfo->GetVM();
215     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
216     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
217     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
218     GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollBar(nativeNode);
219     return panda::JSValueRef::Undefined(vm);
220 }
221 
SetScrollable(ArkUIRuntimeCallInfo * runtimeCallInfo)222 ArkUINativeModuleValue ScrollBridge::SetScrollable(ArkUIRuntimeCallInfo* runtimeCallInfo)
223 {
224     EcmaVM* vm = runtimeCallInfo->GetVM();
225     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
226     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
227     Local<JSValueRef> scrollDirectionArg = runtimeCallInfo->GetCallArgRef(1);
228     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
229     if (scrollDirectionArg->IsUndefined() || scrollDirectionArg->IsNull()) {
230         GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollable(nativeNode);
231         return panda::JSValueRef::Undefined(vm);
232     }
233 
234     int32_t scrollDirection = scrollDirectionArg->Int32Value(vm);
235     if (scrollDirection != static_cast<int32_t>(Axis::VERTICAL) &&
236         scrollDirection != static_cast<int32_t>(Axis::HORIZONTAL) &&
237         scrollDirection != static_cast<int32_t>(Axis::FREE) && scrollDirection != static_cast<int32_t>(Axis::NONE)) {
238         GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollable(nativeNode);
239     } else {
240         GetArkUINodeModifiers()->getScrollModifier()->setScrollScrollable(nativeNode, scrollDirection);
241     }
242 
243     return panda::JSValueRef::Undefined(vm);
244 }
245 
ResetScrollable(ArkUIRuntimeCallInfo * runtimeCallInfo)246 ArkUINativeModuleValue ScrollBridge::ResetScrollable(ArkUIRuntimeCallInfo* runtimeCallInfo)
247 {
248     EcmaVM* vm = runtimeCallInfo->GetVM();
249     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
250     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
251     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
252     GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollable(nativeNode);
253     return panda::JSValueRef::Undefined(vm);
254 }
255 
SetScrollBarColor(ArkUIRuntimeCallInfo * runtimeCallInfo)256 ArkUINativeModuleValue ScrollBridge::SetScrollBarColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
257 {
258     EcmaVM* vm = runtimeCallInfo->GetVM();
259     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
260     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
261     Local<JSValueRef> barcolorArg = runtimeCallInfo->GetCallArgRef(1);
262     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
263     Color color;
264     if (!ArkTSUtils::ParseJsColorAlpha(vm, barcolorArg, color)) {
265         GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollBarColor(nativeNode);
266     } else {
267         GetArkUINodeModifiers()->getScrollModifier()->setScrollScrollBarColor(nativeNode, color.GetValue());
268     }
269 
270     return panda::JSValueRef::Undefined(vm);
271 }
272 
ResetScrollBarColor(ArkUIRuntimeCallInfo * runtimeCallInfo)273 ArkUINativeModuleValue ScrollBridge::ResetScrollBarColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
274 {
275     EcmaVM* vm = runtimeCallInfo->GetVM();
276     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
277     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
278     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
279     GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollBarColor(nativeNode);
280     return panda::JSValueRef::Undefined(vm);
281 }
282 
SetScrollBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)283 ArkUINativeModuleValue ScrollBridge::SetScrollBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
284 {
285     EcmaVM* vm = runtimeCallInfo->GetVM();
286     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
287     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
288     Local<JSValueRef> scrollBarArg = runtimeCallInfo->GetCallArgRef(1);
289     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
290     CalcDimension scrollBarWidth;
291     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, scrollBarArg, scrollBarWidth, false)) {
292         GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollBarWidth(nativeNode);
293     } else {
294         if (LessNotEqual(scrollBarWidth.Value(), 0.0)) {
295             GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollBarWidth(nativeNode);
296         } else {
297             GetArkUINodeModifiers()->getScrollModifier()->setScrollScrollBarWidth(
298                 nativeNode, scrollBarWidth.Value(), static_cast<int32_t>(scrollBarWidth.Unit()));
299         }
300     }
301 
302     return panda::JSValueRef::Undefined(vm);
303 }
304 
ResetScrollBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)305 ArkUINativeModuleValue ScrollBridge::ResetScrollBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
306 {
307     EcmaVM* vm = runtimeCallInfo->GetVM();
308     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
309     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
310     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
311     GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollBarWidth(nativeNode);
312     return panda::JSValueRef::Undefined(vm);
313 }
314 
SetEdgeEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)315 ArkUINativeModuleValue ScrollBridge::SetEdgeEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
316 {
317     EcmaVM* vm = runtimeCallInfo->GetVM();
318     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
319     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
320     Local<JSValueRef> effectArg = runtimeCallInfo->GetCallArgRef(1);    // 1: index of effect value
321     Local<JSValueRef> isEffectArg = runtimeCallInfo->GetCallArgRef(2);  // 2: index of isEffect value
322     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
323     int32_t effect = static_cast<int32_t>(EdgeEffect::NONE);
324     if (!effectArg->IsUndefined() && !effectArg->IsNull()) {
325         effect = effectArg->Int32Value(vm);
326     }
327 
328     if (effect != static_cast<int32_t>(EdgeEffect::SPRING) && effect != static_cast<int32_t>(EdgeEffect::NONE) &&
329         effect != static_cast<int32_t>(EdgeEffect::FADE)) {
330         effect = static_cast<int32_t>(EdgeEffect::NONE);
331     }
332 
333     if (isEffectArg->IsUndefined() || isEffectArg->IsNull()) {
334         GetArkUINodeModifiers()->getScrollModifier()->setScrollEdgeEffect(nativeNode, effect, true);
335     } else {
336         GetArkUINodeModifiers()->getScrollModifier()->setScrollEdgeEffect(
337             nativeNode, effect, isEffectArg->ToBoolean(vm)->Value());
338     }
339 
340     return panda::JSValueRef::Undefined(vm);
341 }
342 
ResetEdgeEffect(ArkUIRuntimeCallInfo * runtimeCallInfo)343 ArkUINativeModuleValue ScrollBridge::ResetEdgeEffect(ArkUIRuntimeCallInfo* runtimeCallInfo)
344 {
345     EcmaVM* vm = runtimeCallInfo->GetVM();
346     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
347     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
348     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
349     GetArkUINodeModifiers()->getScrollModifier()->resetScrollEdgeEffect(nativeNode);
350     return panda::JSValueRef::Undefined(vm);
351 }
352 
SetEnablePaging(ArkUIRuntimeCallInfo * runtimeCallInfo)353 ArkUINativeModuleValue ScrollBridge::SetEnablePaging(ArkUIRuntimeCallInfo* runtimeCallInfo)
354 {
355     EcmaVM* vm = runtimeCallInfo->GetVM();
356     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
357     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
358     Local<JSValueRef> enablePagingArg = runtimeCallInfo->GetCallArgRef(1);
359     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
360     bool enablePaging;
361     if (enablePagingArg->IsBoolean()) {
362         enablePaging = enablePagingArg->ToBoolean(vm)->Value();
363         GetArkUINodeModifiers()->getScrollModifier()->setScrollEnablePaging(nativeNode, enablePaging);
364     } else {
365         GetArkUINodeModifiers()->getScrollModifier()->resetScrollEnablePaging(nativeNode);
366     }
367     return panda::JSValueRef::Undefined(vm);
368 }
369 
ResetEnablePaging(ArkUIRuntimeCallInfo * runtimeCallInfo)370 ArkUINativeModuleValue ScrollBridge::ResetEnablePaging(ArkUIRuntimeCallInfo* runtimeCallInfo)
371 {
372     EcmaVM* vm = runtimeCallInfo->GetVM();
373     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
374     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
375     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
376     GetArkUINodeModifiers()->getScrollModifier()->resetScrollEnablePaging(nativeNode);
377     return panda::JSValueRef::Undefined(vm);
378 }
379 
SetInitialOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)380 ArkUINativeModuleValue ScrollBridge::SetInitialOffset(ArkUIRuntimeCallInfo* runtimeCallInfo)
381 {
382     EcmaVM* vm = runtimeCallInfo->GetVM();
383     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
384     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
385     Local<JSValueRef> xOffsetArg = runtimeCallInfo->GetCallArgRef(NUM_1);
386     Local<JSValueRef> yOffsetArg = runtimeCallInfo->GetCallArgRef(NUM_2);
387     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
388 
389     CalcDimension x;
390     ArkTSUtils::ParseJsDimensionVpNG(vm, xOffsetArg, x, false);
391     CalcDimension y;
392     ArkTSUtils::ParseJsDimensionVpNG(vm, yOffsetArg, y, false);
393 
394     GetArkUINodeModifiers()->getScrollModifier()->setScrollInitialOffset(nativeNode, x.Value(),
395         static_cast<int32_t>(x.Unit()), y.Value(), static_cast<int32_t>(y.Unit()));
396     return panda::JSValueRef::Undefined(vm);
397 }
398 
ResetInitialOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)399 ArkUINativeModuleValue ScrollBridge::ResetInitialOffset(ArkUIRuntimeCallInfo* runtimeCallInfo)
400 {
401     EcmaVM* vm = runtimeCallInfo->GetVM();
402     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
403     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
404     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
405     GetArkUINodeModifiers()->getScrollModifier()->resetScrollInitialOffset(nativeNode);
406     return panda::JSValueRef::Undefined(vm);
407 }
408 
SetFlingSpeedLimit(ArkUIRuntimeCallInfo * runtimeCallInfo)409 ArkUINativeModuleValue ScrollBridge::SetFlingSpeedLimit(ArkUIRuntimeCallInfo* runtimeCallInfo)
410 {
411     EcmaVM* vm = runtimeCallInfo->GetVM();
412     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
413     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
414     Local<JSValueRef> flingSpeedLimitArg = runtimeCallInfo->GetCallArgRef(NUM_1);
415     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
416     double max = -1.0;
417     if (!ArkTSUtils::ParseJsDouble(vm, flingSpeedLimitArg, max)) {
418         GetArkUINodeModifiers()->getScrollModifier()->resetScrollFlingSpeedLimit(nativeNode);
419     } else {
420         GetArkUINodeModifiers()->getScrollModifier()->setScrollFlingSpeedLimit(nativeNode,
421             static_cast<ArkUI_Float32>(max));
422     }
423     return panda::JSValueRef::Undefined(vm);
424 }
425 
ResetFlingSpeedLimit(ArkUIRuntimeCallInfo * runtimeCallInfo)426 ArkUINativeModuleValue ScrollBridge::ResetFlingSpeedLimit(ArkUIRuntimeCallInfo* runtimeCallInfo)
427 {
428     EcmaVM* vm = runtimeCallInfo->GetVM();
429     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
430     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
431     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
432     GetArkUINodeModifiers()->getScrollModifier()->resetScrollFlingSpeedLimit(nativeNode);
433     return panda::JSValueRef::Undefined(vm);
434 }
435 
SetScrollInitialize(ArkUIRuntimeCallInfo * runtimeCallInfo)436 ArkUINativeModuleValue ScrollBridge::SetScrollInitialize(ArkUIRuntimeCallInfo* runtimeCallInfo)
437 {
438     EcmaVM* vm = runtimeCallInfo->GetVM();
439     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
440     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
441     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
442 
443     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
444     if (!info[1]->IsNull() && info[1]->IsObject()) {
445         Framework::JSScroller* jsScroller =
446             Framework::JSRef<Framework::JSObject>::Cast(info[1])->Unwrap<Framework::JSScroller>();
447         if (jsScroller) {
448             jsScroller->SetInstanceId(Container::CurrentId());
449             auto positionController = GetArkUINodeModifiers()->getScrollModifier()->getScroll(nativeNode);
450             auto nodePositionController =
451                 AceType::Claim(reinterpret_cast<OHOS::Ace::ScrollControllerBase*>(positionController));
452             jsScroller->SetController(nodePositionController);
453             // Init scroll bar proxy.
454             auto proxy = jsScroller->GetScrollBarProxy();
455             if (!proxy) {
456                 proxy = ScrollModel::GetInstance()->CreateScrollBarProxy();
457                 jsScroller->SetScrollBarProxy(proxy);
458             }
459             auto proxyPtr = reinterpret_cast<ArkUINodeHandle>(OHOS::Ace::AceType::RawPtr(proxy));
460             GetArkUINodeModifiers()->getScrollModifier()->setScrollBarProxy(nativeNode, proxyPtr);
461         }
462     }
463     return panda::JSValueRef::Undefined(vm);
464 }
465 
ResetScrollInitialize(ArkUIRuntimeCallInfo * runtimeCallInfo)466 ArkUINativeModuleValue ScrollBridge::ResetScrollInitialize(ArkUIRuntimeCallInfo* runtimeCallInfo)
467 {
468     EcmaVM* vm = runtimeCallInfo->GetVM();
469     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
470     return panda::JSValueRef::Undefined(vm);
471 }
472 
SetScrollOnScrollStart(ArkUIRuntimeCallInfo * runtimeCallInfo)473 ArkUINativeModuleValue ScrollBridge::SetScrollOnScrollStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
474 {
475     EcmaVM *vm = runtimeCallInfo->GetVM();
476     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
477     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
478     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
479     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
480     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
481         GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScrollStart(nativeNode);
482         return panda::JSValueRef::Undefined(vm);
483     }
484     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
485     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
486     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
487 
488     std::function<void()> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)]() {
489         panda::LocalScope pandaScope(vm);
490         panda::TryCatch trycatch(vm);
491         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
492         func->Call(vm, func.ToLocal(), nullptr, 0);
493     };
494     GetArkUINodeModifiers()->getScrollModifier()->setScrollOnScrollStart(
495         nativeNode, reinterpret_cast<void*>(&callback));
496     return panda::JSValueRef::Undefined(vm);
497 }
498 
ResetScrollOnScrollStart(ArkUIRuntimeCallInfo * runtimeCallInfo)499 ArkUINativeModuleValue ScrollBridge::ResetScrollOnScrollStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
500 {
501     EcmaVM* vm = runtimeCallInfo->GetVM();
502     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
503     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
504     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
505     GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScrollStart(nativeNode);
506     return panda::JSValueRef::Undefined(vm);
507 }
508 
SetScrollOnScrollEnd(ArkUIRuntimeCallInfo * runtimeCallInfo)509 ArkUINativeModuleValue ScrollBridge::SetScrollOnScrollEnd(ArkUIRuntimeCallInfo* runtimeCallInfo)
510 {
511     EcmaVM *vm = runtimeCallInfo->GetVM();
512     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
513     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
514     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
515     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
516     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
517         GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScrollEnd(nativeNode);
518         return panda::JSValueRef::Undefined(vm);
519     }
520     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
521     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
522     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
523     std::function<void(void)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)]() {
524         panda::LocalScope pandaScope(vm);
525         panda::TryCatch trycatch(vm);
526         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
527         func->Call(vm, func.ToLocal(), nullptr, 0);
528     };
529     GetArkUINodeModifiers()->getScrollModifier()->setScrollOnScrollEnd(nativeNode, reinterpret_cast<void*>(&callback));
530     return panda::JSValueRef::Undefined(vm);
531 }
532 
ResetScrollOnScrollEnd(ArkUIRuntimeCallInfo * runtimeCallInfo)533 ArkUINativeModuleValue ScrollBridge::ResetScrollOnScrollEnd(ArkUIRuntimeCallInfo* runtimeCallInfo)
534 {
535     EcmaVM* vm = runtimeCallInfo->GetVM();
536     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
537     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
538     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
539     GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScrollEnd(nativeNode);
540     return panda::JSValueRef::Undefined(vm);
541 }
542 
SetScrollOnScrollStop(ArkUIRuntimeCallInfo * runtimeCallInfo)543 ArkUINativeModuleValue ScrollBridge::SetScrollOnScrollStop(ArkUIRuntimeCallInfo* runtimeCallInfo)
544 {
545     EcmaVM *vm = runtimeCallInfo->GetVM();
546     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
547     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
548     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
549     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
550     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
551         GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScrollStop(nativeNode);
552         return panda::JSValueRef::Undefined(vm);
553     }
554     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
555     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
556     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
557     std::function<void(void)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)]() {
558         panda::LocalScope pandaScope(vm);
559         panda::TryCatch trycatch(vm);
560         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
561         func->Call(vm, func.ToLocal(), nullptr, 0);
562     };
563     GetArkUINodeModifiers()->getScrollModifier()->setScrollOnScrollStop(nativeNode, reinterpret_cast<void*>(&callback));
564     return panda::JSValueRef::Undefined(vm);
565 }
566 
ResetScrollOnScrollStop(ArkUIRuntimeCallInfo * runtimeCallInfo)567 ArkUINativeModuleValue ScrollBridge::ResetScrollOnScrollStop(ArkUIRuntimeCallInfo* runtimeCallInfo)
568 {
569     EcmaVM* vm = runtimeCallInfo->GetVM();
570     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
571     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
572     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
573     GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScrollStop(nativeNode);
574     return panda::JSValueRef::Undefined(vm);
575 }
576 
SetScrollOnScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)577 ArkUINativeModuleValue ScrollBridge::SetScrollOnScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
578 {
579     EcmaVM* vm = runtimeCallInfo->GetVM();
580     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
581     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
582     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
583     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
584     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
585         GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScroll(nativeNode);
586         return panda::JSValueRef::Undefined(vm);
587     }
588     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
589     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
590     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
591     std::function<void(OHOS::Ace::Dimension, OHOS::Ace::Dimension)> callback =
592         [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
593         OHOS::Ace::Dimension xOffset, OHOS::Ace::Dimension yOffset) {
594         panda::LocalScope pandaScope(vm);
595         panda::TryCatch trycatch(vm);
596         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
597 
598         panda::Local<panda::NumberRef> xOffsetParam = panda::NumberRef::New(
599             vm, static_cast<int32_t>(xOffset.ConvertToVp()));
600         panda::Local<panda::NumberRef> yOffsetParam = panda::NumberRef::New(
601             vm, static_cast<int32_t>(yOffset.ConvertToVp()));
602         panda::Local<panda::JSValueRef> params[2] = { xOffsetParam, yOffsetParam }; // 2: Array .length
603         func->Call(vm, func.ToLocal(), params, 2); // 2: Array length
604     };
605     GetArkUINodeModifiers()->getScrollModifier()->setScrollOnScroll(nativeNode,
606         reinterpret_cast<void*>(&callback));
607     return panda::JSValueRef::Undefined(vm);
608 }
609 
ResetScrollOnScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)610 ArkUINativeModuleValue ScrollBridge::ResetScrollOnScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
611 {
612     EcmaVM* vm = runtimeCallInfo->GetVM();
613     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
614     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
615     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
616     GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScroll(nativeNode);
617     return panda::JSValueRef::Undefined(vm);
618 }
619 
SetScrollOnScrollEdge(ArkUIRuntimeCallInfo * runtimeCallInfo)620 ArkUINativeModuleValue ScrollBridge::SetScrollOnScrollEdge(ArkUIRuntimeCallInfo* runtimeCallInfo)
621 {
622     EcmaVM* vm = runtimeCallInfo->GetVM();
623     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
624     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
625     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
626     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
627     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
628         GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScrollEdge(nativeNode);
629         return panda::JSValueRef::Undefined(vm);
630     }
631     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
632     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
633     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
634     std::function<void(OHOS::Ace::NG::ScrollEdge)> callback =
635         [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
636         OHOS::Ace::NG::ScrollEdge edge) {
637         panda::LocalScope pandaScope(vm);
638         panda::TryCatch trycatch(vm);
639         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
640 
641         panda::Local<panda::NumberRef> edgeParam = panda::NumberRef::New(vm, static_cast<int32_t>(edge));
642         panda::Local<panda::JSValueRef> params[1] = { edgeParam }; // 1: Array length
643         func->Call(vm, func.ToLocal(), params, 1); // 1: Array length
644     };
645     GetArkUINodeModifiers()->getScrollModifier()->setScrollOnScrollEdge(nativeNode,
646         reinterpret_cast<void*>(&callback));
647     return panda::JSValueRef::Undefined(vm);
648 }
649 
ResetScrollOnScrollEdge(ArkUIRuntimeCallInfo * runtimeCallInfo)650 ArkUINativeModuleValue ScrollBridge::ResetScrollOnScrollEdge(ArkUIRuntimeCallInfo* runtimeCallInfo)
651 {
652     EcmaVM* vm = runtimeCallInfo->GetVM();
653     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
654     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
655     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
656     GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScrollEdge(nativeNode);
657     return panda::JSValueRef::Undefined(vm);
658 }
659 
SetScrollOnDidScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)660 ArkUINativeModuleValue ScrollBridge::SetScrollOnDidScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
661 {
662     EcmaVM* vm = runtimeCallInfo->GetVM();
663     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
664     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
665     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
666     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
667     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
668         GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnDidScroll(nativeNode);
669         return panda::JSValueRef::Undefined(vm);
670     }
671     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
672     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
673     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
674     std::function<void(Dimension, Dimension, ScrollState)> callback =
675         [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
676         Dimension xOffset, Dimension yOffset, ScrollState state) {
677         panda::LocalScope pandaScope(vm);
678         panda::TryCatch trycatch(vm);
679         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
680 
681         panda::Local<panda::NumberRef> xOffsetParam = panda::NumberRef::New(
682             vm, static_cast<int32_t>(xOffset.ConvertToVp()));
683         panda::Local<panda::NumberRef> yOffsetParam = panda::NumberRef::New(
684             vm, static_cast<int32_t>(yOffset.ConvertToVp()));
685         panda::Local<panda::NumberRef> stateParam = panda::NumberRef::New(vm, static_cast<int32_t>(state));
686          // 3: Array length
687         panda::Local<panda::JSValueRef> params[3] = { xOffsetParam, yOffsetParam, stateParam };
688         func->Call(vm, func.ToLocal(), params, 3); // 3: Array length
689     };
690     GetArkUINodeModifiers()->getScrollModifier()->setScrollOnDidScrollCallBack(nativeNode,
691         reinterpret_cast<void*>(&callback));
692     return panda::JSValueRef::Undefined(vm);
693 }
694 
ResetScrollOnDidScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)695 ArkUINativeModuleValue ScrollBridge::ResetScrollOnDidScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
696 {
697     EcmaVM* vm = runtimeCallInfo->GetVM();
698     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
699     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
700     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
701     GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnDidScroll(nativeNode);
702     return panda::JSValueRef::Undefined(vm);
703 }
704 
SetScrollOnWillScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)705 ArkUINativeModuleValue ScrollBridge::SetScrollOnWillScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
706 {
707     EcmaVM* vm = runtimeCallInfo->GetVM();
708     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
709     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
710     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
711     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
712     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
713         GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnWillScrollCallBack(nativeNode);
714         return panda::JSValueRef::Undefined(vm);
715     }
716     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
717     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
718     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
719     std::function<TwoDimensionScrollResult(Dimension, Dimension, ScrollState, ScrollSource)> callback =
720         [vm, frameNode, func = panda::CopyableGlobal(vm, func)](Dimension xOffset,
721             Dimension yOffset, ScrollState state, ScrollSource scrollState) -> TwoDimensionScrollResult {
722         panda::LocalScope pandaScope(vm);
723         panda::TryCatch trycatch(vm);
724         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
725 
726         panda::Local<panda::NumberRef> xOffsetParam = panda::NumberRef::New(
727             vm, static_cast<double>(xOffset.ConvertToVp()));
728         panda::Local<panda::NumberRef> yOffsetParam = panda::NumberRef::New(
729             vm, static_cast<double>(yOffset.ConvertToVp()));
730         panda::Local<panda::NumberRef> stateParam = panda::NumberRef::New(vm, static_cast<double>(state));
731         panda::Local<panda::NumberRef> sourceParam = panda::NumberRef::New(vm, static_cast<double>(scrollState));
732          // 4: Array length
733         panda::Local<panda::JSValueRef> params[4] = { xOffsetParam, yOffsetParam, stateParam, sourceParam};
734         auto result = func->Call(vm, func.ToLocal(), params, 4); // 4: Array length
735         NG::TwoDimensionScrollResult scrollRes { .xOffset = xOffset, .yOffset = yOffset };
736 
737         if (result->IsObject(vm)) {
738             auto resultObj = result->ToObject(vm);
739             panda::Local<panda::JSValueRef> x = resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm, "xOffset"));
740             panda::Local<panda::JSValueRef> y = resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm, "yOffset"));
741             if (x->IsNumber()) {
742                 scrollRes.xOffset = Dimension(x->ToNumber(vm)->Value(), DimensionUnit::VP);
743             }
744             if (y->IsNumber()) {
745                 scrollRes.yOffset = Dimension(y->ToNumber(vm)->Value(), DimensionUnit::VP);
746             }
747         }
748         return scrollRes;
749     };
750     GetArkUINodeModifiers()->getScrollModifier()->setScrollOnWillScrollCallBack(nativeNode,
751         reinterpret_cast<void*>(&callback));
752     return panda::JSValueRef::Undefined(vm);
753 }
754 
ResetScrollOnWillScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)755 ArkUINativeModuleValue ScrollBridge::ResetScrollOnWillScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
756 {
757     EcmaVM* vm = runtimeCallInfo->GetVM();
758     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
759     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
760     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
761     GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnWillScrollCallBack(nativeNode);
762     return panda::JSValueRef::Undefined(vm);
763 }
764 
SetScrollOnScrollFrameBegin(ArkUIRuntimeCallInfo * runtimeCallInfo)765 ArkUINativeModuleValue ScrollBridge::SetScrollOnScrollFrameBegin(ArkUIRuntimeCallInfo* runtimeCallInfo)
766 {
767     EcmaVM* vm = runtimeCallInfo->GetVM();
768     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
769     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
770     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
771     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
772     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
773         GetArkUINodeModifiers()->getScrollModifier()->resetOnScrollFrameBeginCallBack(nativeNode);
774         return panda::JSValueRef::Undefined(vm);
775     }
776     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
777     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
778     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
779     std::function<ScrollFrameResult(Dimension, ScrollState)> callback = [vm, frameNode,
780         func = panda::CopyableGlobal(vm, func)](Dimension offset, ScrollState state) -> ScrollFrameResult {
781         panda::LocalScope pandaScope(vm);
782         panda::TryCatch trycatch(vm);
783         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
784 
785         panda::Local<panda::NumberRef> offsetParam = panda::NumberRef::New(
786             vm, static_cast<double>(offset.ConvertToVp()));
787         panda::Local<panda::NumberRef> stateParam = panda::NumberRef::New(vm, static_cast<double>(state));
788          // 2: Array length
789         panda::Local<panda::JSValueRef> params[2] = { offsetParam, stateParam };
790         auto value = func->Call(vm, func.ToLocal(), params, 2); // 2: Array length
791 
792         OHOS::Ace::ScrollFrameResult scrollRes { .offset = offset };
793         if (value->IsNumber()) {
794             scrollRes.offset = Dimension(value->ToNumber(vm)->Value(), DimensionUnit::VP);
795         }
796         if (value->IsObject(vm)) {
797             auto resultObj = value->ToObject(vm);
798             panda::Local<panda::JSValueRef> remain = resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm,
799                 "offsetRemain"));
800             if (remain->IsNumber()) {
801                 scrollRes.offset = Dimension(remain->ToNumber(vm)->Value(), DimensionUnit::VP);
802             }
803         }
804         return scrollRes;
805     };
806     GetArkUINodeModifiers()->getScrollModifier()->setOnScrollFrameBeginCallBack(nativeNode,
807         reinterpret_cast<void*>(&callback));
808     return panda::JSValueRef::Undefined(vm);
809 }
810 
ResetScrollOnScrollFrameBegin(ArkUIRuntimeCallInfo * runtimeCallInfo)811 ArkUINativeModuleValue ScrollBridge::ResetScrollOnScrollFrameBegin(ArkUIRuntimeCallInfo* runtimeCallInfo)
812 {
813     EcmaVM* vm = runtimeCallInfo->GetVM();
814     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
815     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
816     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
817     GetArkUINodeModifiers()->getScrollModifier()->resetOnScrollFrameBeginCallBack(nativeNode);
818     return panda::JSValueRef::Undefined(vm);
819 }
820 } // namespace OHOS::Ace::NG
821