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