• 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 
ParsePaginationNG(const EcmaVM * vm,const Local<JSValueRef> & paginationValue,std::vector<ArkUI_Float32> & vPaginationValue,std::vector<RefPtr<ResourceObject>> & resObjs,std::vector<int32_t> & vPaginationUnit)65 bool ParsePaginationNG(const EcmaVM* vm, const Local<JSValueRef>& paginationValue,
66     std::vector<ArkUI_Float32>& vPaginationValue, std::vector<RefPtr<ResourceObject>>& resObjs,
67     std::vector<int32_t>& vPaginationUnit)
68 {
69     uint32_t pLength = 0;
70     resObjs.clear();
71     if (paginationValue->IsArray(vm)) {
72         auto paginationArray = panda::Local<panda::ArrayRef>(paginationValue);
73         pLength = paginationArray->Length(vm);
74         if (pLength <= 0) {
75             return false;
76         }
77         resObjs.resize(pLength);
78         for (uint32_t i = 0; i < pLength; i++) {
79             CalcDimension dims;
80             Local<JSValueRef> xValue = panda::ArrayRef::GetValueAt(vm, paginationArray, i);
81             if (!ArkTSUtils::ParseJsDimensionVpNG(vm, xValue, dims, resObjs[i], true)) {
82                 continue;
83             }
84             vPaginationValue.push_back(static_cast<ArkUI_Float32>(dims.Value()));
85             vPaginationUnit.push_back(static_cast<int32_t>(dims.Unit()));
86         }
87     } else {
88         CalcDimension intervalSize;
89         resObjs.resize(1);
90         if (!ArkTSUtils::ParseJsDimensionVp(vm, paginationValue, intervalSize, resObjs[0]) ||
91             intervalSize.IsNegative()) {
92             intervalSize = CalcDimension(0.0);
93         }
94         vPaginationValue.push_back(static_cast<ArkUI_Float32>(intervalSize.Value()));
95         vPaginationUnit.push_back(static_cast<int32_t>(intervalSize.Unit()));
96     }
97 
98     return true;
99 }
100 
SetNestedScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)101 ArkUINativeModuleValue ScrollBridge::SetNestedScroll(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> scrollForwardValue = runtimeCallInfo->GetCallArgRef(1);  // 1: index of scroll forward value
107     Local<JSValueRef> scrollBackwardValue = runtimeCallInfo->GetCallArgRef(2); // 2: index of scroll backward value
108     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
109     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
110     auto froward = 0;
111     auto backward = 0;
112     ArkTSUtils::ParseJsInteger(vm, scrollForwardValue, froward);
113     if (froward < static_cast<int32_t>(NestedScrollMode::SELF_ONLY) ||
114         froward > static_cast<int32_t>(NestedScrollMode::PARALLEL)) {
115         froward = FROWARD_INITIAL_VALUE;
116     }
117     ArkTSUtils::ParseJsInteger(vm, scrollBackwardValue, backward);
118     if (backward < static_cast<int32_t>(NestedScrollMode::SELF_ONLY) ||
119         backward > static_cast<int32_t>(NestedScrollMode::PARALLEL)) {
120         backward = BACKWARD_INITIAL_VALUE;
121     }
122     GetArkUINodeModifiers()->getScrollModifier()->setScrollNestedScroll(nativeNode, froward, backward);
123     return panda::JSValueRef::Undefined(vm);
124 }
125 
ResetNestedScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)126 ArkUINativeModuleValue ScrollBridge::ResetNestedScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
127 {
128     EcmaVM* vm = runtimeCallInfo->GetVM();
129     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
130     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
131     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
132     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
133     GetArkUINodeModifiers()->getScrollModifier()->resetScrollNestedScroll(nativeNode);
134     return panda::JSValueRef::Undefined(vm);
135 }
136 
SetEnableScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)137 ArkUINativeModuleValue ScrollBridge::SetEnableScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
138 {
139     EcmaVM* vm = runtimeCallInfo->GetVM();
140     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
141     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
142     Local<JSValueRef> isEnabledArg = runtimeCallInfo->GetCallArgRef(1);
143     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
144     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
145     bool isEnabled = isEnabledArg->IsBoolean() ? isEnabledArg->ToBoolean(vm)->Value() : true;
146     GetArkUINodeModifiers()->getScrollModifier()->setScrollEnableScroll(nativeNode, isEnabled);
147     return panda::JSValueRef::Undefined(vm);
148 }
149 
ResetEnableScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)150 ArkUINativeModuleValue ScrollBridge::ResetEnableScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
151 {
152     EcmaVM* vm = runtimeCallInfo->GetVM();
153     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
154     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
155     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
156     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
157     GetArkUINodeModifiers()->getScrollModifier()->resetScrollEnableScroll(nativeNode);
158     return panda::JSValueRef::Undefined(vm);
159 }
160 
SetFriction(ArkUIRuntimeCallInfo * runtimeCallInfo)161 ArkUINativeModuleValue ScrollBridge::SetFriction(ArkUIRuntimeCallInfo* runtimeCallInfo)
162 {
163     EcmaVM* vm = runtimeCallInfo->GetVM();
164     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
165     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
166     Local<JSValueRef> scrollFrictionArg = runtimeCallInfo->GetCallArgRef(1);
167     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
168     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
169     double friction = FRICTION_DEFAULT;
170     RefPtr<ResourceObject> resObj;
171     if (!ArkTSUtils::ParseJsDouble(vm, scrollFrictionArg, friction, resObj)) {
172         GetArkUINodeModifiers()->getScrollModifier()->resetScrollFriction(nativeNode);
173     } else {
174         if (SystemProperties::ConfigChangePerform()) {
175             GetArkUINodeModifiers()->getScrollModifier()->createWithResourceObjFriction(
176                 nativeNode, reinterpret_cast<void*>(AceType::RawPtr(resObj)));
177         }
178         GetArkUINodeModifiers()->getScrollModifier()->setScrollFriction(
179             nativeNode, static_cast<ArkUI_Float32>(friction));
180     }
181     return panda::JSValueRef::Undefined(vm);
182 }
183 
ResetFriction(ArkUIRuntimeCallInfo * runtimeCallInfo)184 ArkUINativeModuleValue ScrollBridge::ResetFriction(ArkUIRuntimeCallInfo* runtimeCallInfo)
185 {
186     EcmaVM* vm = runtimeCallInfo->GetVM();
187     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
188     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
189     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
190     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
191     GetArkUINodeModifiers()->getScrollModifier()->resetScrollFriction(nativeNode);
192     if (SystemProperties::ConfigChangePerform()) {
193         GetArkUINodeModifiers()->getScrollModifier()->createWithResourceObjFriction(nativeNode, nullptr);
194     }
195     return panda::JSValueRef::Undefined(vm);
196 }
197 
SetScrollSnap(ArkUIRuntimeCallInfo * runtimeCallInfo)198 ArkUINativeModuleValue ScrollBridge::SetScrollSnap(ArkUIRuntimeCallInfo* runtimeCallInfo)
199 {
200     EcmaVM* vm = runtimeCallInfo->GetVM();
201     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
202     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
203     Local<JSValueRef> snapAlignValue = runtimeCallInfo->GetCallArgRef(1);         // 1: index of snap align value
204     Local<JSValueRef> paginationValue = runtimeCallInfo->GetCallArgRef(2);        // 2: index of pagination value
205     Local<JSValueRef> enableSnapToStartValue = runtimeCallInfo->GetCallArgRef(3); // 3: index of enableSnapToStart value
206     Local<JSValueRef> enableSnapToEndValue = runtimeCallInfo->GetCallArgRef(4);   // 4: index of enableSnapToEnd value
207     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
208     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
209     auto snapAlign = static_cast<int32_t>(ScrollSnapAlign::NONE);
210     if (snapAlignValue->IsNull() || snapAlignValue->IsUndefined() ||
211         !ArkTSUtils::ParseJsInteger(vm, snapAlignValue, snapAlign) ||
212         snapAlign < static_cast<int32_t>(ScrollSnapAlign::NONE) ||
213         snapAlign > static_cast<int32_t>(ScrollSnapAlign::END)) {
214         snapAlign = static_cast<int32_t>(ScrollSnapAlign::NONE);
215     }
216     std::vector<ArkUI_Float32> vPaginationValue;
217     std::vector<int32_t> vPaginationUnit;
218     std::vector<RefPtr<ResourceObject>> resObjs;
219     auto parseOK = ParsePaginationNG(vm, paginationValue, vPaginationValue, resObjs, vPaginationUnit);
220     bool isArray = true;
221     if (!paginationValue->IsArray(vm)) {
222         isArray = false;
223     }
224     auto pLength = vPaginationValue.size();
225     vPaginationUnit.push_back(snapAlign);
226     vPaginationUnit.push_back(static_cast<int32_t>(enableSnapToStartValue->ToBoolean(vm)->Value()));
227     vPaginationUnit.push_back(static_cast<int32_t>(enableSnapToEndValue->ToBoolean(vm)->Value()));
228     vPaginationUnit.push_back(static_cast<int32_t>(isArray));
229     auto uLength = pLength + 4;
230 
231     if (SystemProperties::ConfigChangePerform()) {
232         GetArkUINodeModifiers()->getScrollModifier()->createWithResourceObjSnap(
233             nativeNode, vPaginationValue.data(), pLength, vPaginationUnit.data(), &resObjs);
234     }
235     if (!parseOK) {
236         GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollSnap(nativeNode);
237         return panda::JSValueRef::Undefined(vm);
238     }
239     GetArkUINodeModifiers()->getScrollModifier()->setScrollScrollSnap(
240         nativeNode, vPaginationValue.data(), pLength, vPaginationUnit.data(), uLength);
241     return panda::JSValueRef::Undefined(vm);
242 }
243 
ResetScrollSnap(ArkUIRuntimeCallInfo * runtimeCallInfo)244 ArkUINativeModuleValue ScrollBridge::ResetScrollSnap(ArkUIRuntimeCallInfo* runtimeCallInfo)
245 {
246     EcmaVM* vm = runtimeCallInfo->GetVM();
247     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
248     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
249     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
250     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
251     GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollSnap(nativeNode);
252     if (SystemProperties::ConfigChangePerform()) {
253         GetArkUINodeModifiers()->getScrollModifier()->createWithResourceObjSnap(
254             nativeNode, nullptr, 0, nullptr, nullptr);
255     }
256     return panda::JSValueRef::Undefined(vm);
257 }
258 
SetScrollBar(ArkUIRuntimeCallInfo * runtimeCallInfo)259 ArkUINativeModuleValue ScrollBridge::SetScrollBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
260 {
261     EcmaVM* vm = runtimeCallInfo->GetVM();
262     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
263     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
264     Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(1);
265     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
266     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
267     auto value = static_cast<int32_t>(DisplayMode::AUTO);
268     if (!jsValue->IsUndefined()) {
269         ArkTSUtils::ParseJsInteger(vm, jsValue, value);
270     }
271     GetArkUINodeModifiers()->getScrollModifier()->setScrollScrollBar(nativeNode, value);
272     return panda::JSValueRef::Undefined(vm);
273 }
274 
ResetScrollBar(ArkUIRuntimeCallInfo * runtimeCallInfo)275 ArkUINativeModuleValue ScrollBridge::ResetScrollBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
276 {
277     EcmaVM* vm = runtimeCallInfo->GetVM();
278     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
279     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
280     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
281     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
282     GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollBar(nativeNode);
283     return panda::JSValueRef::Undefined(vm);
284 }
285 
SetScrollable(ArkUIRuntimeCallInfo * runtimeCallInfo)286 ArkUINativeModuleValue ScrollBridge::SetScrollable(ArkUIRuntimeCallInfo* runtimeCallInfo)
287 {
288     EcmaVM* vm = runtimeCallInfo->GetVM();
289     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
290     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
291     Local<JSValueRef> scrollDirectionArg = runtimeCallInfo->GetCallArgRef(1);
292     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
293     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
294     if (scrollDirectionArg->IsUndefined() || scrollDirectionArg->IsNull()) {
295         GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollable(nativeNode);
296         return panda::JSValueRef::Undefined(vm);
297     }
298 
299     int32_t scrollDirection = scrollDirectionArg->Int32Value(vm);
300     if (scrollDirection != static_cast<int32_t>(Axis::VERTICAL) &&
301         scrollDirection != static_cast<int32_t>(Axis::HORIZONTAL) &&
302         scrollDirection != static_cast<int32_t>(Axis::FREE) && scrollDirection != static_cast<int32_t>(Axis::NONE)) {
303         GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollable(nativeNode);
304     } else {
305         GetArkUINodeModifiers()->getScrollModifier()->setScrollScrollable(nativeNode, scrollDirection);
306     }
307 
308     return panda::JSValueRef::Undefined(vm);
309 }
310 
ResetScrollable(ArkUIRuntimeCallInfo * runtimeCallInfo)311 ArkUINativeModuleValue ScrollBridge::ResetScrollable(ArkUIRuntimeCallInfo* runtimeCallInfo)
312 {
313     EcmaVM* vm = runtimeCallInfo->GetVM();
314     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
315     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
316     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
317     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
318     GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollable(nativeNode);
319     return panda::JSValueRef::Undefined(vm);
320 }
321 
SetScrollBarColor(ArkUIRuntimeCallInfo * runtimeCallInfo)322 ArkUINativeModuleValue ScrollBridge::SetScrollBarColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
323 {
324     EcmaVM* vm = runtimeCallInfo->GetVM();
325     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
326     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
327     Local<JSValueRef> barcolorArg = runtimeCallInfo->GetCallArgRef(1);
328     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
329     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
330     Color color;
331     RefPtr<ResourceObject> resObj;
332     auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
333     if (!ArkTSUtils::ParseJsColorAlpha(vm, barcolorArg, color, resObj, nodeInfo)) {
334         GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollBarColor(nativeNode);
335     } else {
336         if (SystemProperties::ConfigChangePerform()) {
337             GetArkUINodeModifiers()->getScrollModifier()->createWithResourceObjScrollBarColor(
338                 nativeNode, reinterpret_cast<void*>(AceType::RawPtr(resObj)));
339         }
340         GetArkUINodeModifiers()->getScrollModifier()->setScrollScrollBarColor(nativeNode, color.GetValue());
341     }
342 
343     return panda::JSValueRef::Undefined(vm);
344 }
345 
ResetScrollBarColor(ArkUIRuntimeCallInfo * runtimeCallInfo)346 ArkUINativeModuleValue ScrollBridge::ResetScrollBarColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
347 {
348     EcmaVM* vm = runtimeCallInfo->GetVM();
349     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
350     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
351     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
352     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
353     GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollBarColor(nativeNode);
354     if (SystemProperties::ConfigChangePerform()) {
355         GetArkUINodeModifiers()->getScrollModifier()->createWithResourceObjScrollBarColor(nativeNode, nullptr);
356     }
357     return panda::JSValueRef::Undefined(vm);
358 }
359 
SetScrollBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)360 ArkUINativeModuleValue ScrollBridge::SetScrollBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
361 {
362     EcmaVM* vm = runtimeCallInfo->GetVM();
363     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
364     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
365     Local<JSValueRef> scrollBarArg = runtimeCallInfo->GetCallArgRef(1);
366     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
367     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
368     CalcDimension scrollBarWidth;
369     if (!ArkTSUtils::ParseJsDimensionVpNG(vm, scrollBarArg, scrollBarWidth, false)) {
370         GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollBarWidth(nativeNode);
371     } else {
372         if (LessNotEqual(scrollBarWidth.Value(), 0.0)) {
373             GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollBarWidth(nativeNode);
374         } else {
375             GetArkUINodeModifiers()->getScrollModifier()->setScrollScrollBarWidth(
376                 nativeNode, scrollBarWidth.Value(), static_cast<int32_t>(scrollBarWidth.Unit()));
377         }
378     }
379 
380     return panda::JSValueRef::Undefined(vm);
381 }
382 
ResetScrollBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)383 ArkUINativeModuleValue ScrollBridge::ResetScrollBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
384 {
385     EcmaVM* vm = runtimeCallInfo->GetVM();
386     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
387     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
388     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
389     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
390     GetArkUINodeModifiers()->getScrollModifier()->resetScrollScrollBarWidth(nativeNode);
391     return panda::JSValueRef::Undefined(vm);
392 }
393 
SetEnablePaging(ArkUIRuntimeCallInfo * runtimeCallInfo)394 ArkUINativeModuleValue ScrollBridge::SetEnablePaging(ArkUIRuntimeCallInfo* runtimeCallInfo)
395 {
396     EcmaVM* vm = runtimeCallInfo->GetVM();
397     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
398     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
399     Local<JSValueRef> enablePagingArg = runtimeCallInfo->GetCallArgRef(1);
400     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
401     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
402     bool enablePaging;
403     if (enablePagingArg->IsBoolean()) {
404         enablePaging = enablePagingArg->ToBoolean(vm)->Value();
405         GetArkUINodeModifiers()->getScrollModifier()->setScrollEnablePaging(nativeNode, enablePaging);
406     } else {
407         GetArkUINodeModifiers()->getScrollModifier()->resetScrollEnablePaging(nativeNode);
408     }
409     return panda::JSValueRef::Undefined(vm);
410 }
411 
ResetEnablePaging(ArkUIRuntimeCallInfo * runtimeCallInfo)412 ArkUINativeModuleValue ScrollBridge::ResetEnablePaging(ArkUIRuntimeCallInfo* runtimeCallInfo)
413 {
414     EcmaVM* vm = runtimeCallInfo->GetVM();
415     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
416     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
417     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
418     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
419     GetArkUINodeModifiers()->getScrollModifier()->resetScrollEnablePaging(nativeNode);
420     return panda::JSValueRef::Undefined(vm);
421 }
422 
SetInitialOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)423 ArkUINativeModuleValue ScrollBridge::SetInitialOffset(ArkUIRuntimeCallInfo* runtimeCallInfo)
424 {
425     EcmaVM* vm = runtimeCallInfo->GetVM();
426     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
427     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
428     Local<JSValueRef> xOffsetArg = runtimeCallInfo->GetCallArgRef(NUM_1);
429     Local<JSValueRef> yOffsetArg = runtimeCallInfo->GetCallArgRef(NUM_2);
430     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
431     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
432 
433     CalcDimension x;
434     ArkTSUtils::ParseJsDimensionVpNG(vm, xOffsetArg, x, false);
435     CalcDimension y;
436     ArkTSUtils::ParseJsDimensionVpNG(vm, yOffsetArg, y, false);
437 
438     GetArkUINodeModifiers()->getScrollModifier()->setScrollInitialOffset(nativeNode, x.Value(),
439         static_cast<int32_t>(x.Unit()), y.Value(), static_cast<int32_t>(y.Unit()));
440     return panda::JSValueRef::Undefined(vm);
441 }
442 
ResetInitialOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)443 ArkUINativeModuleValue ScrollBridge::ResetInitialOffset(ArkUIRuntimeCallInfo* runtimeCallInfo)
444 {
445     EcmaVM* vm = runtimeCallInfo->GetVM();
446     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
447     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
448     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
449     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
450     GetArkUINodeModifiers()->getScrollModifier()->resetScrollInitialOffset(nativeNode);
451     return panda::JSValueRef::Undefined(vm);
452 }
453 
SetScrollInitialize(ArkUIRuntimeCallInfo * runtimeCallInfo)454 ArkUINativeModuleValue ScrollBridge::SetScrollInitialize(ArkUIRuntimeCallInfo* runtimeCallInfo)
455 {
456     EcmaVM* vm = runtimeCallInfo->GetVM();
457     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
458     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
459     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
460     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
461 
462     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
463     if (!info[1]->IsNull() && info[1]->IsObject()) {
464         Framework::JSScroller* jsScroller =
465             Framework::JSRef<Framework::JSObject>::Cast(info[1])->Unwrap<Framework::JSScroller>();
466         if (jsScroller) {
467             jsScroller->SetInstanceId(Container::CurrentId());
468             auto positionController = GetArkUINodeModifiers()->getScrollModifier()->getScroll(nativeNode);
469             auto nodePositionController =
470                 AceType::Claim(reinterpret_cast<OHOS::Ace::ScrollControllerBase*>(positionController));
471             jsScroller->SetController(nodePositionController);
472             // Init scroll bar proxy.
473             auto proxy = jsScroller->GetScrollBarProxy();
474             if (!proxy) {
475                 proxy = ScrollModel::GetInstance()->CreateScrollBarProxy();
476                 jsScroller->SetScrollBarProxy(proxy);
477             }
478             auto proxyPtr = reinterpret_cast<ArkUINodeHandle>(OHOS::Ace::AceType::RawPtr(proxy));
479             GetArkUINodeModifiers()->getScrollModifier()->setScrollBarProxy(nativeNode, proxyPtr);
480         }
481     }
482     return panda::JSValueRef::Undefined(vm);
483 }
484 
ResetScrollInitialize(ArkUIRuntimeCallInfo * runtimeCallInfo)485 ArkUINativeModuleValue ScrollBridge::ResetScrollInitialize(ArkUIRuntimeCallInfo* runtimeCallInfo)
486 {
487     EcmaVM* vm = runtimeCallInfo->GetVM();
488     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
489     return panda::JSValueRef::Undefined(vm);
490 }
491 
SetScrollOnScrollStart(ArkUIRuntimeCallInfo * runtimeCallInfo)492 ArkUINativeModuleValue ScrollBridge::SetScrollOnScrollStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
493 {
494     EcmaVM *vm = runtimeCallInfo->GetVM();
495     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
496     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
497     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
498     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
499     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
500     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
501         GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScrollStart(nativeNode);
502         return panda::JSValueRef::Undefined(vm);
503     }
504     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
505     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
506     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
507 
508     std::function<void()> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)]() {
509         panda::LocalScope pandaScope(vm);
510         panda::TryCatch trycatch(vm);
511         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
512         func->Call(vm, func.ToLocal(), nullptr, 0);
513     };
514     GetArkUINodeModifiers()->getScrollModifier()->setScrollOnScrollStart(
515         nativeNode, reinterpret_cast<void*>(&callback));
516     return panda::JSValueRef::Undefined(vm);
517 }
518 
ResetScrollOnScrollStart(ArkUIRuntimeCallInfo * runtimeCallInfo)519 ArkUINativeModuleValue ScrollBridge::ResetScrollOnScrollStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
520 {
521     EcmaVM* vm = runtimeCallInfo->GetVM();
522     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
523     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
524     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
525     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
526     GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScrollStart(nativeNode);
527     return panda::JSValueRef::Undefined(vm);
528 }
529 
SetScrollOnScrollEnd(ArkUIRuntimeCallInfo * runtimeCallInfo)530 ArkUINativeModuleValue ScrollBridge::SetScrollOnScrollEnd(ArkUIRuntimeCallInfo* runtimeCallInfo)
531 {
532     EcmaVM *vm = runtimeCallInfo->GetVM();
533     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
534     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
535     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
536     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
537     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
538     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
539         GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScrollEnd(nativeNode);
540         return panda::JSValueRef::Undefined(vm);
541     }
542     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
543     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
544     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
545     std::function<void(void)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)]() {
546         panda::LocalScope pandaScope(vm);
547         panda::TryCatch trycatch(vm);
548         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
549         func->Call(vm, func.ToLocal(), nullptr, 0);
550     };
551     GetArkUINodeModifiers()->getScrollModifier()->setScrollOnScrollEnd(nativeNode, reinterpret_cast<void*>(&callback));
552     return panda::JSValueRef::Undefined(vm);
553 }
554 
ResetScrollOnScrollEnd(ArkUIRuntimeCallInfo * runtimeCallInfo)555 ArkUINativeModuleValue ScrollBridge::ResetScrollOnScrollEnd(ArkUIRuntimeCallInfo* runtimeCallInfo)
556 {
557     EcmaVM* vm = runtimeCallInfo->GetVM();
558     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
559     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
560     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
561     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
562     GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScrollEnd(nativeNode);
563     return panda::JSValueRef::Undefined(vm);
564 }
565 
SetScrollOnScrollStop(ArkUIRuntimeCallInfo * runtimeCallInfo)566 ArkUINativeModuleValue ScrollBridge::SetScrollOnScrollStop(ArkUIRuntimeCallInfo* runtimeCallInfo)
567 {
568     EcmaVM *vm = runtimeCallInfo->GetVM();
569     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
570     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
571     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
572     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
573     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
574     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
575         GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScrollStop(nativeNode);
576         return panda::JSValueRef::Undefined(vm);
577     }
578     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
579     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
580     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
581     std::function<void(void)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)]() {
582         panda::LocalScope pandaScope(vm);
583         panda::TryCatch trycatch(vm);
584         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
585         func->Call(vm, func.ToLocal(), nullptr, 0);
586     };
587     GetArkUINodeModifiers()->getScrollModifier()->setScrollOnScrollStop(nativeNode, reinterpret_cast<void*>(&callback));
588     return panda::JSValueRef::Undefined(vm);
589 }
590 
ResetScrollOnScrollStop(ArkUIRuntimeCallInfo * runtimeCallInfo)591 ArkUINativeModuleValue ScrollBridge::ResetScrollOnScrollStop(ArkUIRuntimeCallInfo* runtimeCallInfo)
592 {
593     EcmaVM* vm = runtimeCallInfo->GetVM();
594     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
595     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
596     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
597     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
598     GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScrollStop(nativeNode);
599     return panda::JSValueRef::Undefined(vm);
600 }
601 
SetScrollOnScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)602 ArkUINativeModuleValue ScrollBridge::SetScrollOnScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
603 {
604     EcmaVM* vm = runtimeCallInfo->GetVM();
605     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
606     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
607     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
608     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
609     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
610     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
611         GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScroll(nativeNode);
612         return panda::JSValueRef::Undefined(vm);
613     }
614     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
615     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
616     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
617     std::function<void(OHOS::Ace::Dimension, OHOS::Ace::Dimension)> callback =
618         [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
619         OHOS::Ace::Dimension xOffset, OHOS::Ace::Dimension yOffset) {
620         panda::LocalScope pandaScope(vm);
621         panda::TryCatch trycatch(vm);
622         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
623 
624         panda::Local<panda::NumberRef> xOffsetParam = panda::NumberRef::New(
625             vm, static_cast<int32_t>(xOffset.ConvertToVp()));
626         panda::Local<panda::NumberRef> yOffsetParam = panda::NumberRef::New(
627             vm, static_cast<int32_t>(yOffset.ConvertToVp()));
628         panda::Local<panda::JSValueRef> params[2] = { xOffsetParam, yOffsetParam }; // 2: Array .length
629         func->Call(vm, func.ToLocal(), params, 2); // 2: Array length
630     };
631     GetArkUINodeModifiers()->getScrollModifier()->setScrollOnScroll(nativeNode,
632         reinterpret_cast<void*>(&callback));
633     return panda::JSValueRef::Undefined(vm);
634 }
635 
ResetScrollOnScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)636 ArkUINativeModuleValue ScrollBridge::ResetScrollOnScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
637 {
638     EcmaVM* vm = runtimeCallInfo->GetVM();
639     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
640     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
641     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
642     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
643     GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScroll(nativeNode);
644     return panda::JSValueRef::Undefined(vm);
645 }
646 
SetScrollOnScrollEdge(ArkUIRuntimeCallInfo * runtimeCallInfo)647 ArkUINativeModuleValue ScrollBridge::SetScrollOnScrollEdge(ArkUIRuntimeCallInfo* runtimeCallInfo)
648 {
649     EcmaVM* vm = runtimeCallInfo->GetVM();
650     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
651     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
652     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
653     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
654     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
655     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
656         GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScrollEdge(nativeNode);
657         return panda::JSValueRef::Undefined(vm);
658     }
659     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
660     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
661     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
662     std::function<void(OHOS::Ace::NG::ScrollEdge)> callback =
663         [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
664         OHOS::Ace::NG::ScrollEdge edge) {
665         panda::LocalScope pandaScope(vm);
666         panda::TryCatch trycatch(vm);
667         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
668 
669         panda::Local<panda::NumberRef> edgeParam = panda::NumberRef::New(vm, static_cast<int32_t>(edge));
670         panda::Local<panda::JSValueRef> params[1] = { edgeParam }; // 1: Array length
671         func->Call(vm, func.ToLocal(), params, 1); // 1: Array length
672     };
673     GetArkUINodeModifiers()->getScrollModifier()->setScrollOnScrollEdge(nativeNode,
674         reinterpret_cast<void*>(&callback));
675     return panda::JSValueRef::Undefined(vm);
676 }
677 
ResetScrollOnScrollEdge(ArkUIRuntimeCallInfo * runtimeCallInfo)678 ArkUINativeModuleValue ScrollBridge::ResetScrollOnScrollEdge(ArkUIRuntimeCallInfo* runtimeCallInfo)
679 {
680     EcmaVM* vm = runtimeCallInfo->GetVM();
681     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
682     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
683     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
684     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
685     GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnScrollEdge(nativeNode);
686     return panda::JSValueRef::Undefined(vm);
687 }
688 
SetScrollOnDidScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)689 ArkUINativeModuleValue ScrollBridge::SetScrollOnDidScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
690 {
691     EcmaVM* vm = runtimeCallInfo->GetVM();
692     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
693     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
694     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
695     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
696     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
697     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
698         GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnDidScroll(nativeNode);
699         return panda::JSValueRef::Undefined(vm);
700     }
701     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
702     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
703     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
704     std::function<void(Dimension, Dimension, ScrollState)> callback =
705         [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
706         Dimension xOffset, Dimension yOffset, ScrollState state) {
707         panda::LocalScope pandaScope(vm);
708         panda::TryCatch trycatch(vm);
709         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
710 
711         panda::Local<panda::NumberRef> xOffsetParam = panda::NumberRef::New(
712             vm, static_cast<double>(xOffset.ConvertToVp()));
713         panda::Local<panda::NumberRef> yOffsetParam = panda::NumberRef::New(
714             vm, static_cast<double>(yOffset.ConvertToVp()));
715         panda::Local<panda::NumberRef> stateParam = panda::NumberRef::New(vm, static_cast<int32_t>(state));
716          // 3: Array length
717         panda::Local<panda::JSValueRef> params[3] = { xOffsetParam, yOffsetParam, stateParam };
718         func->Call(vm, func.ToLocal(), params, 3); // 3: Array length
719     };
720     GetArkUINodeModifiers()->getScrollModifier()->setScrollOnDidScrollCallBack(nativeNode,
721         reinterpret_cast<void*>(&callback));
722     return panda::JSValueRef::Undefined(vm);
723 }
724 
ResetScrollOnDidScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)725 ArkUINativeModuleValue ScrollBridge::ResetScrollOnDidScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
726 {
727     EcmaVM* vm = runtimeCallInfo->GetVM();
728     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
729     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
730     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
731     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
732     GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnDidScroll(nativeNode);
733     return panda::JSValueRef::Undefined(vm);
734 }
735 
SetScrollOnWillScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)736 ArkUINativeModuleValue ScrollBridge::SetScrollOnWillScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
737 {
738     EcmaVM* vm = runtimeCallInfo->GetVM();
739     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
740     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
741     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
742     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
743     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
744     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
745         GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnWillScrollCallBack(nativeNode);
746         return panda::JSValueRef::Undefined(vm);
747     }
748     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
749     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
750     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
751     std::function<TwoDimensionScrollResult(Dimension, Dimension, ScrollState, ScrollSource)> callback =
752         [vm, frameNode, func = panda::CopyableGlobal(vm, func)](Dimension xOffset,
753             Dimension yOffset, ScrollState state, ScrollSource scrollState) -> TwoDimensionScrollResult {
754         panda::LocalScope pandaScope(vm);
755         panda::TryCatch trycatch(vm);
756         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
757 
758         panda::Local<panda::NumberRef> xOffsetParam = panda::NumberRef::New(
759             vm, static_cast<double>(xOffset.ConvertToVp()));
760         panda::Local<panda::NumberRef> yOffsetParam = panda::NumberRef::New(
761             vm, static_cast<double>(yOffset.ConvertToVp()));
762         panda::Local<panda::NumberRef> stateParam = panda::NumberRef::New(vm, static_cast<double>(state));
763         panda::Local<panda::NumberRef> sourceParam = panda::NumberRef::New(vm, static_cast<double>(scrollState));
764          // 4: Array length
765         panda::Local<panda::JSValueRef> params[4] = { xOffsetParam, yOffsetParam, stateParam, sourceParam};
766         auto result = func->Call(vm, func.ToLocal(), params, 4); // 4: Array length
767         NG::TwoDimensionScrollResult scrollRes { .xOffset = xOffset, .yOffset = yOffset };
768 
769         if (result->IsObject(vm)) {
770             auto resultObj = result->ToObject(vm);
771             panda::Local<panda::JSValueRef> x = resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm, "xOffset"));
772             panda::Local<panda::JSValueRef> y = resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm, "yOffset"));
773             if (x->IsNumber()) {
774                 scrollRes.xOffset = Dimension(x->ToNumber(vm)->Value(), DimensionUnit::VP);
775             }
776             if (y->IsNumber()) {
777                 scrollRes.yOffset = Dimension(y->ToNumber(vm)->Value(), DimensionUnit::VP);
778             }
779         }
780         return scrollRes;
781     };
782     GetArkUINodeModifiers()->getScrollModifier()->setScrollOnWillScrollCallBack(nativeNode,
783         reinterpret_cast<void*>(&callback));
784     return panda::JSValueRef::Undefined(vm);
785 }
786 
ResetScrollOnWillScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)787 ArkUINativeModuleValue ScrollBridge::ResetScrollOnWillScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
788 {
789     EcmaVM* vm = runtimeCallInfo->GetVM();
790     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
791     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
792     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
793     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
794     GetArkUINodeModifiers()->getScrollModifier()->resetScrollOnWillScrollCallBack(nativeNode);
795     return panda::JSValueRef::Undefined(vm);
796 }
797 
SetScrollOnScrollFrameBegin(ArkUIRuntimeCallInfo * runtimeCallInfo)798 ArkUINativeModuleValue ScrollBridge::SetScrollOnScrollFrameBegin(ArkUIRuntimeCallInfo* runtimeCallInfo)
799 {
800     EcmaVM* vm = runtimeCallInfo->GetVM();
801     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
802     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
803     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
804     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
805     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
806     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
807         GetArkUINodeModifiers()->getScrollModifier()->resetOnScrollFrameBeginCallBack(nativeNode);
808         return panda::JSValueRef::Undefined(vm);
809     }
810     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
811     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
812     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
813     std::function<ScrollFrameResult(Dimension, ScrollState)> callback = [vm, frameNode,
814         func = panda::CopyableGlobal(vm, func)](Dimension offset, ScrollState state) -> ScrollFrameResult {
815         panda::LocalScope pandaScope(vm);
816         panda::TryCatch trycatch(vm);
817         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
818 
819         panda::Local<panda::NumberRef> offsetParam = panda::NumberRef::New(
820             vm, static_cast<double>(offset.ConvertToVp()));
821         panda::Local<panda::NumberRef> stateParam = panda::NumberRef::New(vm, static_cast<double>(state));
822          // 2: Array length
823         panda::Local<panda::JSValueRef> params[2] = { offsetParam, stateParam };
824         auto value = func->Call(vm, func.ToLocal(), params, 2); // 2: Array length
825 
826         OHOS::Ace::ScrollFrameResult scrollRes { .offset = offset };
827         if (value->IsNumber()) {
828             scrollRes.offset = Dimension(value->ToNumber(vm)->Value(), DimensionUnit::VP);
829         }
830         if (value->IsObject(vm)) {
831             auto resultObj = value->ToObject(vm);
832             panda::Local<panda::JSValueRef> remain = resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm,
833                 "offsetRemain"));
834             if (remain->IsNumber()) {
835                 scrollRes.offset = Dimension(remain->ToNumber(vm)->Value(), DimensionUnit::VP);
836             }
837         }
838         return scrollRes;
839     };
840     GetArkUINodeModifiers()->getScrollModifier()->setOnScrollFrameBeginCallBack(nativeNode,
841         reinterpret_cast<void*>(&callback));
842     return panda::JSValueRef::Undefined(vm);
843 }
844 
ResetScrollOnScrollFrameBegin(ArkUIRuntimeCallInfo * runtimeCallInfo)845 ArkUINativeModuleValue ScrollBridge::ResetScrollOnScrollFrameBegin(ArkUIRuntimeCallInfo* runtimeCallInfo)
846 {
847     EcmaVM* vm = runtimeCallInfo->GetVM();
848     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
849     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
850     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
851     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
852     GetArkUINodeModifiers()->getScrollModifier()->resetOnScrollFrameBeginCallBack(nativeNode);
853     return panda::JSValueRef::Undefined(vm);
854 }
855 
SetMaxZoomScale(ArkUIRuntimeCallInfo * runtimeCallInfo)856 ArkUINativeModuleValue ScrollBridge::SetMaxZoomScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
857 {
858     EcmaVM* vm = runtimeCallInfo->GetVM();
859     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
860     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
861     Local<JSValueRef> scaleArg = runtimeCallInfo->GetCallArgRef(1);
862     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
863     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
864     double scale = 1.0;
865     if (!ArkTSUtils::ParseJsDouble(vm, scaleArg, scale)) {
866         GetArkUINodeModifiers()->getScrollModifier()->resetMaxZoomScale(nativeNode);
867     } else {
868         GetArkUINodeModifiers()->getScrollModifier()->setMaxZoomScale(nativeNode, scale);
869     }
870     return panda::JSValueRef::Undefined(vm);
871 }
872 
ResetMaxZoomScale(ArkUIRuntimeCallInfo * runtimeCallInfo)873 ArkUINativeModuleValue ScrollBridge::ResetMaxZoomScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
874 {
875     EcmaVM* vm = runtimeCallInfo->GetVM();
876     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
877     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
878     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
879     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
880     GetArkUINodeModifiers()->getScrollModifier()->resetMaxZoomScale(nativeNode);
881     return panda::JSValueRef::Undefined(vm);
882 }
883 
SetMinZoomScale(ArkUIRuntimeCallInfo * runtimeCallInfo)884 ArkUINativeModuleValue ScrollBridge::SetMinZoomScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
885 {
886     EcmaVM* vm = runtimeCallInfo->GetVM();
887     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
888     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
889     Local<JSValueRef> scaleArg = runtimeCallInfo->GetCallArgRef(1);
890     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
891     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
892     double scale = 1.0;
893     if (!ArkTSUtils::ParseJsDouble(vm, scaleArg, scale)) {
894         GetArkUINodeModifiers()->getScrollModifier()->resetMinZoomScale(nativeNode);
895     } else {
896         GetArkUINodeModifiers()->getScrollModifier()->setMinZoomScale(nativeNode, scale);
897     }
898     return panda::JSValueRef::Undefined(vm);
899 }
900 
ResetMinZoomScale(ArkUIRuntimeCallInfo * runtimeCallInfo)901 ArkUINativeModuleValue ScrollBridge::ResetMinZoomScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
902 {
903     EcmaVM* vm = runtimeCallInfo->GetVM();
904     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
905     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
906     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
907     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
908     GetArkUINodeModifiers()->getScrollModifier()->resetMinZoomScale(nativeNode);
909     return panda::JSValueRef::Undefined(vm);
910 }
911 
SetZoomScale(ArkUIRuntimeCallInfo * runtimeCallInfo)912 ArkUINativeModuleValue ScrollBridge::SetZoomScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
913 {
914     EcmaVM* vm = runtimeCallInfo->GetVM();
915     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
916     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
917     Local<JSValueRef> scaleArg = runtimeCallInfo->GetCallArgRef(1);
918     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
919     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
920     double scale = 1.0;
921     if (!ArkTSUtils::ParseJsDouble(vm, scaleArg, scale)) {
922         GetArkUINodeModifiers()->getScrollModifier()->resetZoomScale(nativeNode);
923     } else {
924         GetArkUINodeModifiers()->getScrollModifier()->setZoomScale(nativeNode, scale);
925     }
926     return panda::JSValueRef::Undefined(vm);
927 }
928 
ResetZoomScale(ArkUIRuntimeCallInfo * runtimeCallInfo)929 ArkUINativeModuleValue ScrollBridge::ResetZoomScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
930 {
931     EcmaVM* vm = runtimeCallInfo->GetVM();
932     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
933     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
934     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
935     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
936     GetArkUINodeModifiers()->getScrollModifier()->resetZoomScale(nativeNode);
937     return panda::JSValueRef::Undefined(vm);
938 }
939 
SetEnableBouncesZoom(ArkUIRuntimeCallInfo * runtimeCallInfo)940 ArkUINativeModuleValue ScrollBridge::SetEnableBouncesZoom(ArkUIRuntimeCallInfo* runtimeCallInfo)
941 {
942     EcmaVM* vm = runtimeCallInfo->GetVM();
943     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
944     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
945     Local<JSValueRef> isEnabledArg = runtimeCallInfo->GetCallArgRef(1);
946     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
947     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
948     bool isEnabled = isEnabledArg->IsBoolean() ? isEnabledArg->ToBoolean(vm)->Value() : true;
949     GetArkUINodeModifiers()->getScrollModifier()->setEnableBouncesZoom(nativeNode, isEnabled);
950     return panda::JSValueRef::Undefined(vm);
951 }
952 
ResetEnableBouncesZoom(ArkUIRuntimeCallInfo * runtimeCallInfo)953 ArkUINativeModuleValue ScrollBridge::ResetEnableBouncesZoom(ArkUIRuntimeCallInfo* runtimeCallInfo)
954 {
955     EcmaVM* vm = runtimeCallInfo->GetVM();
956     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
957     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(0);
958     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
959     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
960     GetArkUINodeModifiers()->getScrollModifier()->resetEnableBouncesZoom(nativeNode);
961     return panda::JSValueRef::Undefined(vm);
962 }
963 
SetScrollOnDidZoom(ArkUIRuntimeCallInfo * runtimeCallInfo)964 ArkUINativeModuleValue ScrollBridge::SetScrollOnDidZoom(ArkUIRuntimeCallInfo* runtimeCallInfo)
965 {
966     EcmaVM* vm = runtimeCallInfo->GetVM();
967     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
968     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
969     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
970     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
971     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
972     if (!callbackArg->IsFunction(vm)) {
973         GetArkUINodeModifiers()->getScrollModifier()->setScrollOnDidZoom(nativeNode, nullptr);
974         return panda::JSValueRef::Undefined(vm);
975     }
976     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
977     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
978     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
979     std::function<void(float)> callback =
980         [vm, weak = AceType::WeakClaim(frameNode), func = panda::CopyableGlobal(vm, func)](float scale) {
981         panda::LocalScope pandaScope(vm);
982         panda::TryCatch trycatch(vm);
983         PipelineContext::SetCallBackNode(weak);
984         panda::Local<panda::NumberRef> scaleParam = panda::NumberRef::New(vm, static_cast<double>(scale));
985         panda::Local<panda::JSValueRef> params[1] = { scaleParam };
986         func->Call(vm, func.ToLocal(), params, 1);
987     };
988     GetArkUINodeModifiers()->getScrollModifier()->setScrollOnDidZoom(nativeNode,
989         reinterpret_cast<void*>(&callback));
990     return panda::JSValueRef::Undefined(vm);
991 }
992 
ResetScrollOnDidZoom(ArkUIRuntimeCallInfo * runtimeCallInfo)993 ArkUINativeModuleValue ScrollBridge::ResetScrollOnDidZoom(ArkUIRuntimeCallInfo* runtimeCallInfo)
994 {
995     EcmaVM* vm = runtimeCallInfo->GetVM();
996     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
997     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
998     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
999     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1000     GetArkUINodeModifiers()->getScrollModifier()->setScrollOnDidZoom(nativeNode, nullptr);
1001     return panda::JSValueRef::Undefined(vm);
1002 }
1003 
SetScrollOnZoomStart(ArkUIRuntimeCallInfo * runtimeCallInfo)1004 ArkUINativeModuleValue ScrollBridge::SetScrollOnZoomStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
1005 {
1006     EcmaVM *vm = runtimeCallInfo->GetVM();
1007     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1008     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1009     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1010     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1011     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1012     if (!callbackArg->IsFunction(vm)) {
1013         GetArkUINodeModifiers()->getScrollModifier()->setScrollOnZoomStart(nativeNode, nullptr);
1014         return panda::JSValueRef::Undefined(vm);
1015     }
1016     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1017     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1018     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1019     std::function<void()> callback =
1020         [vm, weak = AceType::WeakClaim(frameNode), func = panda::CopyableGlobal(vm, func)]() {
1021         panda::LocalScope pandaScope(vm);
1022         panda::TryCatch trycatch(vm);
1023         PipelineContext::SetCallBackNode(weak);
1024         func->Call(vm, func.ToLocal(), nullptr, 0);
1025     };
1026     GetArkUINodeModifiers()->getScrollModifier()->setScrollOnZoomStart(
1027         nativeNode, reinterpret_cast<void*>(&callback));
1028     return panda::JSValueRef::Undefined(vm);
1029 }
1030 
ResetScrollOnZoomStart(ArkUIRuntimeCallInfo * runtimeCallInfo)1031 ArkUINativeModuleValue ScrollBridge::ResetScrollOnZoomStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
1032 {
1033     EcmaVM* vm = runtimeCallInfo->GetVM();
1034     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1035     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1036     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1037     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1038     GetArkUINodeModifiers()->getScrollModifier()->setScrollOnZoomStart(nativeNode, nullptr);
1039     return panda::JSValueRef::Undefined(vm);
1040 }
1041 
SetScrollOnZoomStop(ArkUIRuntimeCallInfo * runtimeCallInfo)1042 ArkUINativeModuleValue ScrollBridge::SetScrollOnZoomStop(ArkUIRuntimeCallInfo* runtimeCallInfo)
1043 {
1044     EcmaVM *vm = runtimeCallInfo->GetVM();
1045     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1046     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1047     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1048     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1049     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1050     if (!callbackArg->IsFunction(vm)) {
1051         GetArkUINodeModifiers()->getScrollModifier()->setScrollOnZoomStop(nativeNode, nullptr);
1052         return panda::JSValueRef::Undefined(vm);
1053     }
1054     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1055     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
1056     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1057     std::function<void(void)> callback =
1058         [vm, weak = AceType::WeakClaim(frameNode), func = panda::CopyableGlobal(vm, func)]() {
1059         panda::LocalScope pandaScope(vm);
1060         panda::TryCatch trycatch(vm);
1061         PipelineContext::SetCallBackNode(weak);
1062         func->Call(vm, func.ToLocal(), nullptr, 0);
1063     };
1064     GetArkUINodeModifiers()->getScrollModifier()->setScrollOnZoomStop(nativeNode, reinterpret_cast<void*>(&callback));
1065     return panda::JSValueRef::Undefined(vm);
1066 }
1067 
ResetScrollOnZoomStop(ArkUIRuntimeCallInfo * runtimeCallInfo)1068 ArkUINativeModuleValue ScrollBridge::ResetScrollOnZoomStop(ArkUIRuntimeCallInfo* runtimeCallInfo)
1069 {
1070     EcmaVM* vm = runtimeCallInfo->GetVM();
1071     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
1072     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1073     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1074     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1075     GetArkUINodeModifiers()->getScrollModifier()->setScrollOnZoomStop(nativeNode, nullptr);
1076     return panda::JSValueRef::Undefined(vm);
1077 }
1078 } // namespace OHOS::Ace::NG
1079