• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2025 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_web_bridge.h"
16 
17 #include "securec.h"
18 
19 #include "base/log/log.h"
20 #include "base/utils/string_utils.h"
21 #include "base/utils/utils.h"
22 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
23 #include "bridge/declarative_frontend/jsview/js_web.h"
24 #include "core/components_ng/pattern/web/web_model_ng.h"
25 
26 namespace OHOS::Ace::NG {
27 constexpr int32_t CALL_ARG_0 = 0;
28 constexpr int32_t CALL_ARG_1 = 1;
29 constexpr int32_t CALL_ARG_2 = 2;
30 constexpr int32_t CALL_ARG_3 = 3;
31 constexpr int32_t CALL_ARG_4 = 4;
32 constexpr int32_t CALL_ARG_5 = 5;
33 constexpr int32_t CALL_ARG_6 = 6;
34 constexpr char END_CHAR = '\0';
35 
SetJavaScriptAccess(ArkUIRuntimeCallInfo * runtimeCallInfo)36 ArkUINativeModuleValue WebBridge::SetJavaScriptAccess(ArkUIRuntimeCallInfo* runtimeCallInfo)
37 {
38     EcmaVM* vm = runtimeCallInfo->GetVM();
39     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
40     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
41     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
42     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
43     if (secondArg->IsBoolean()) {
44         bool enable = secondArg->ToBoolean(vm)->Value();
45         GetArkUINodeModifiers()->getWebModifier()->setJavaScriptAccess(nativeNode, enable);
46     } else {
47         GetArkUINodeModifiers()->getWebModifier()->resetJavaScriptAccess(nativeNode);
48     }
49     return panda::JSValueRef::Undefined(vm);
50 }
51 
ResetJavaScriptAccess(ArkUIRuntimeCallInfo * runtimeCallInfo)52 ArkUINativeModuleValue WebBridge::ResetJavaScriptAccess(ArkUIRuntimeCallInfo* runtimeCallInfo)
53 {
54     EcmaVM* vm = runtimeCallInfo->GetVM();
55     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
56     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
57     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
58     GetArkUINodeModifiers()->getWebModifier()->resetJavaScriptAccess(nativeNode);
59     return panda::JSValueRef::Undefined(vm);
60 }
61 
SetFileAccessEnabled(ArkUIRuntimeCallInfo * runtimeCallInfo)62 ArkUINativeModuleValue WebBridge::SetFileAccessEnabled(ArkUIRuntimeCallInfo* runtimeCallInfo)
63 {
64     EcmaVM* vm = runtimeCallInfo->GetVM();
65     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
66     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
67     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
68     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
69     if (secondArg->IsBoolean()) {
70         bool enable = secondArg->ToBoolean(vm)->Value();
71         GetArkUINodeModifiers()->getWebModifier()->setFileAccessEnabled(nativeNode, enable);
72     } else {
73         GetArkUINodeModifiers()->getWebModifier()->resetFileAccessEnabled(nativeNode);
74     }
75     return panda::JSValueRef::Undefined(vm);
76 }
77 
ResetFileAccessEnabled(ArkUIRuntimeCallInfo * runtimeCallInfo)78 ArkUINativeModuleValue WebBridge::ResetFileAccessEnabled(ArkUIRuntimeCallInfo* runtimeCallInfo)
79 {
80     EcmaVM* vm = runtimeCallInfo->GetVM();
81     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
82     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
83     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
84     GetArkUINodeModifiers()->getWebModifier()->resetFileAccessEnabled(nativeNode);
85     return panda::JSValueRef::Undefined(vm);
86 }
87 
SetDomStorageAccessEnabled(ArkUIRuntimeCallInfo * runtimeCallInfo)88 ArkUINativeModuleValue WebBridge::SetDomStorageAccessEnabled(ArkUIRuntimeCallInfo* runtimeCallInfo)
89 {
90     EcmaVM* vm = runtimeCallInfo->GetVM();
91     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
92     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
93     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
94     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
95     if (secondArg->IsBoolean()) {
96         bool enable = secondArg->ToBoolean(vm)->Value();
97         GetArkUINodeModifiers()->getWebModifier()->setDomStorageAccessEnabled(nativeNode, enable);
98     } else {
99         GetArkUINodeModifiers()->getWebModifier()->resetDomStorageAccessEnabled(nativeNode);
100     }
101     return panda::JSValueRef::Undefined(vm);
102 }
103 
ResetDomStorageAccessEnabled(ArkUIRuntimeCallInfo * runtimeCallInfo)104 ArkUINativeModuleValue WebBridge::ResetDomStorageAccessEnabled(ArkUIRuntimeCallInfo* runtimeCallInfo)
105 {
106     EcmaVM* vm = runtimeCallInfo->GetVM();
107     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
108     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
109     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
110     GetArkUINodeModifiers()->getWebModifier()->resetDomStorageAccessEnabled(nativeNode);
111     return panda::JSValueRef::Undefined(vm);
112 }
113 
SetMixedMode(ArkUIRuntimeCallInfo * runtimeCallInfo)114 ArkUINativeModuleValue WebBridge::SetMixedMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
115 {
116     EcmaVM* vm = runtimeCallInfo->GetVM();
117     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
118     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
119     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
120     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
121     int mode = secondArg->Int32Value(vm);
122     GetArkUINodeModifiers()->getWebModifier()->setMixedMode(nativeNode, mode);
123     return panda::JSValueRef::Undefined(vm);
124 }
125 
ResetMixedMode(ArkUIRuntimeCallInfo * runtimeCallInfo)126 ArkUINativeModuleValue WebBridge::ResetMixedMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
127 {
128     EcmaVM* vm = runtimeCallInfo->GetVM();
129     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
130     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
131     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
132     GetArkUINodeModifiers()->getWebModifier()->resetMixedMode(nativeNode);
133     return panda::JSValueRef::Undefined(vm);
134 }
135 
SetZoomAccessEnabled(ArkUIRuntimeCallInfo * runtimeCallInfo)136 ArkUINativeModuleValue WebBridge::SetZoomAccessEnabled(ArkUIRuntimeCallInfo* runtimeCallInfo)
137 {
138     EcmaVM* vm = runtimeCallInfo->GetVM();
139     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
140     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
141     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
142     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
143     if (secondArg->IsBoolean()) {
144         bool enable = secondArg->ToBoolean(vm)->Value();
145         GetArkUINodeModifiers()->getWebModifier()->setZoomAccessEnabled(nativeNode, enable);
146     } else {
147         GetArkUINodeModifiers()->getWebModifier()->resetZoomAccessEnabled(nativeNode);
148     }
149     return panda::JSValueRef::Undefined(vm);
150 }
151 
ResetZoomAccessEnabled(ArkUIRuntimeCallInfo * runtimeCallInfo)152 ArkUINativeModuleValue WebBridge::ResetZoomAccessEnabled(ArkUIRuntimeCallInfo* runtimeCallInfo)
153 {
154     EcmaVM* vm = runtimeCallInfo->GetVM();
155     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
156     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
157     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
158     GetArkUINodeModifiers()->getWebModifier()->resetZoomAccessEnabled(nativeNode);
159     return panda::JSValueRef::Undefined(vm);
160 }
161 
SetCacheMode(ArkUIRuntimeCallInfo * runtimeCallInfo)162 ArkUINativeModuleValue WebBridge::SetCacheMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
163 {
164     EcmaVM* vm = runtimeCallInfo->GetVM();
165     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
166     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
167     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
168     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
169     int mode = secondArg->Int32Value(vm);
170     GetArkUINodeModifiers()->getWebModifier()->setCacheMode(nativeNode, mode);
171     return panda::JSValueRef::Undefined(vm);
172 }
173 
ResetCacheMode(ArkUIRuntimeCallInfo * runtimeCallInfo)174 ArkUINativeModuleValue WebBridge::ResetCacheMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
175 {
176     EcmaVM* vm = runtimeCallInfo->GetVM();
177     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
178     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
179     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
180     GetArkUINodeModifiers()->getWebModifier()->resetCacheMode(nativeNode);
181     return panda::JSValueRef::Undefined(vm);
182 }
183 
SetDarkMode(ArkUIRuntimeCallInfo * runtimeCallInfo)184 ArkUINativeModuleValue WebBridge::SetDarkMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
185 {
186     EcmaVM* vm = runtimeCallInfo->GetVM();
187     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
188     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
189     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
190     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
191     int mode = secondArg->Int32Value(vm);
192     GetArkUINodeModifiers()->getWebModifier()->setDarkMode(nativeNode, mode);
193     return panda::JSValueRef::Undefined(vm);
194 }
195 
ResetDarkMode(ArkUIRuntimeCallInfo * runtimeCallInfo)196 ArkUINativeModuleValue WebBridge::ResetDarkMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
197 {
198     EcmaVM* vm = runtimeCallInfo->GetVM();
199     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
200     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
201     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
202     GetArkUINodeModifiers()->getWebModifier()->resetDarkMode(nativeNode);
203     return panda::JSValueRef::Undefined(vm);
204 }
205 
SetMultiWindowAccessEnabled(ArkUIRuntimeCallInfo * runtimeCallInfo)206 ArkUINativeModuleValue WebBridge::SetMultiWindowAccessEnabled(ArkUIRuntimeCallInfo* runtimeCallInfo)
207 {
208     EcmaVM* vm = runtimeCallInfo->GetVM();
209     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
210     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
211     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
212     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
213     if (secondArg->IsBoolean()) {
214         bool enable = secondArg->ToBoolean(vm)->Value();
215         GetArkUINodeModifiers()->getWebModifier()->setMultiWindowAccessEnabled(nativeNode, enable);
216     } else {
217         GetArkUINodeModifiers()->getWebModifier()->resetMultiWindowAccessEnabled(nativeNode);
218     }
219     return panda::JSValueRef::Undefined(vm);
220 }
221 
ResetMultiWindowAccessEnabled(ArkUIRuntimeCallInfo * runtimeCallInfo)222 ArkUINativeModuleValue WebBridge::ResetMultiWindowAccessEnabled(ArkUIRuntimeCallInfo* runtimeCallInfo)
223 {
224     EcmaVM* vm = runtimeCallInfo->GetVM();
225     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
226     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
227     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
228     GetArkUINodeModifiers()->getWebModifier()->resetMultiWindowAccessEnabled(nativeNode);
229     return panda::JSValueRef::Undefined(vm);
230 }
231 
SetAllowWindowOpenMethod(ArkUIRuntimeCallInfo * runtimeCallInfo)232 ArkUINativeModuleValue WebBridge::SetAllowWindowOpenMethod(ArkUIRuntimeCallInfo* runtimeCallInfo)
233 {
234     EcmaVM* vm = runtimeCallInfo->GetVM();
235     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
236     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
237     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
238     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
239     if (secondArg->IsBoolean()) {
240         bool enable = secondArg->ToBoolean(vm)->Value();
241         GetArkUINodeModifiers()->getWebModifier()->setAllowWindowOpenMethod(nativeNode, enable);
242     } else {
243         GetArkUINodeModifiers()->getWebModifier()->resetAllowWindowOpenMethod(nativeNode);
244     }
245     return panda::JSValueRef::Undefined(vm);
246 }
247 
ResetAllowWindowOpenMethod(ArkUIRuntimeCallInfo * runtimeCallInfo)248 ArkUINativeModuleValue WebBridge::ResetAllowWindowOpenMethod(ArkUIRuntimeCallInfo* runtimeCallInfo)
249 {
250     EcmaVM* vm = runtimeCallInfo->GetVM();
251     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
252     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
253     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
254     GetArkUINodeModifiers()->getWebModifier()->resetAllowWindowOpenMethod(nativeNode);
255     return panda::JSValueRef::Undefined(vm);
256 }
257 
SetKeyboardAvoidMode(ArkUIRuntimeCallInfo * runtimeCallInfo)258 ArkUINativeModuleValue WebBridge::SetKeyboardAvoidMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
259 {
260     EcmaVM* vm = runtimeCallInfo->GetVM();
261     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
262     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
263     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
264     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
265     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
266     int mode = secondArg->Int32Value(vm);
267     GetArkUINodeModifiers()->getWebModifier()->setKeyboardAvoidMode(nativeNode, mode);
268     return panda::JSValueRef::Undefined(vm);
269 }
270 
ResetKeyboardAvoidMode(ArkUIRuntimeCallInfo * runtimeCallInfo)271 ArkUINativeModuleValue WebBridge::ResetKeyboardAvoidMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
272 {
273     EcmaVM* vm = runtimeCallInfo->GetVM();
274     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
275     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
276     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
277     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
278     GetArkUINodeModifiers()->getWebModifier()->resetKeyboardAvoidMode(nativeNode);
279     return panda::JSValueRef::Undefined(vm);
280 }
281 
SetOnControllerAttached(ArkUIRuntimeCallInfo * runtimeCallInfo)282 ArkUINativeModuleValue WebBridge::SetOnControllerAttached(ArkUIRuntimeCallInfo* runtimeCallInfo)
283 {
284     EcmaVM* vm = runtimeCallInfo->GetVM();
285     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
286     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
287     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
288     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
289     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
290     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
291         GetArkUINodeModifiers()->getWebModifier()->resetOnControllerAttached(nativeNode);
292         return panda::JSValueRef::Undefined(vm);
293     }
294     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
295     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
296     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
297 
298     std::function<void()> callback = [vm, weak = AceType::WeakClaim(frameNode),
299                                          func = panda::CopyableGlobal(vm, func)]() {
300         panda::LocalScope pandaScope(vm);
301         panda::TryCatch trycatch(vm);
302         PipelineContext::SetCallBackNode(weak);
303         func->Call(vm, func.ToLocal(), nullptr, CALL_ARG_0);
304     };
305     GetArkUINodeModifiers()->getWebModifier()->setOnControllerAttached(nativeNode, reinterpret_cast<void*>(&callback));
306     return panda::JSValueRef::Undefined(vm);
307 }
308 
ResetOnControllerAttached(ArkUIRuntimeCallInfo * runtimeCallInfo)309 ArkUINativeModuleValue WebBridge::ResetOnControllerAttached(ArkUIRuntimeCallInfo* runtimeCallInfo)
310 {
311     EcmaVM* vm = runtimeCallInfo->GetVM();
312     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
313     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
314     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
315     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
316     GetArkUINodeModifiers()->getWebModifier()->resetOnControllerAttached(nativeNode);
317     return panda::JSValueRef::Undefined(vm);
318 }
319 
SetVerticalScrollBarAccessEnabled(ArkUIRuntimeCallInfo * runtimeCallInfo)320 ArkUINativeModuleValue WebBridge::SetVerticalScrollBarAccessEnabled(ArkUIRuntimeCallInfo* runtimeCallInfo)
321 {
322     EcmaVM* vm = runtimeCallInfo->GetVM();
323     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
324     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
325     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
326     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
327     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
328     if (secondArg->IsBoolean()) {
329         bool enable = secondArg->ToBoolean(vm)->Value();
330         GetArkUINodeModifiers()->getWebModifier()->setVerticalScrollBarAccessEnabled(nativeNode, enable);
331     } else {
332         GetArkUINodeModifiers()->getWebModifier()->resetVerticalScrollBarAccessEnabled(nativeNode);
333     }
334     return panda::JSValueRef::Undefined(vm);
335 }
336 
ResetVerticalScrollBarAccessEnabled(ArkUIRuntimeCallInfo * runtimeCallInfo)337 ArkUINativeModuleValue WebBridge::ResetVerticalScrollBarAccessEnabled(ArkUIRuntimeCallInfo* runtimeCallInfo)
338 {
339     EcmaVM* vm = runtimeCallInfo->GetVM();
340     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
341     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
342     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
343     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
344     GetArkUINodeModifiers()->getWebModifier()->resetVerticalScrollBarAccessEnabled(nativeNode);
345     return panda::JSValueRef::Undefined(vm);
346 }
347 
SetHorizontalScrollBarAccessEnabled(ArkUIRuntimeCallInfo * runtimeCallInfo)348 ArkUINativeModuleValue WebBridge::SetHorizontalScrollBarAccessEnabled(ArkUIRuntimeCallInfo* runtimeCallInfo)
349 {
350     EcmaVM* vm = runtimeCallInfo->GetVM();
351     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
352     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
353     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
354     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
355     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
356     if (secondArg->IsBoolean()) {
357         bool enable = secondArg->ToBoolean(vm)->Value();
358         GetArkUINodeModifiers()->getWebModifier()->setHorizontalScrollBarAccessEnabled(nativeNode, enable);
359     } else {
360         GetArkUINodeModifiers()->getWebModifier()->resetHorizontalScrollBarAccessEnabled(nativeNode);
361     }
362     return panda::JSValueRef::Undefined(vm);
363 }
364 
ResetHorizontalScrollBarAccessEnabled(ArkUIRuntimeCallInfo * runtimeCallInfo)365 ArkUINativeModuleValue WebBridge::ResetHorizontalScrollBarAccessEnabled(ArkUIRuntimeCallInfo* runtimeCallInfo)
366 {
367     EcmaVM* vm = runtimeCallInfo->GetVM();
368     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
369     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
370     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
371     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
372     GetArkUINodeModifiers()->getWebModifier()->resetHorizontalScrollBarAccessEnabled(nativeNode);
373     return panda::JSValueRef::Undefined(vm);
374 }
375 
SetTextZoomRatio(ArkUIRuntimeCallInfo * runtimeCallInfo)376 ArkUINativeModuleValue WebBridge::SetTextZoomRatio(ArkUIRuntimeCallInfo* runtimeCallInfo)
377 {
378     EcmaVM* vm = runtimeCallInfo->GetVM();
379     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
380     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
381     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
382     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
383     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
384     int mode = secondArg->Int32Value(vm);
385     GetArkUINodeModifiers()->getWebModifier()->setTextZoomRatio(nativeNode, mode);
386     return panda::JSValueRef::Undefined(vm);
387 }
388 
ResetTextZoomRatio(ArkUIRuntimeCallInfo * runtimeCallInfo)389 ArkUINativeModuleValue WebBridge::ResetTextZoomRatio(ArkUIRuntimeCallInfo* runtimeCallInfo)
390 {
391     EcmaVM* vm = runtimeCallInfo->GetVM();
392     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
393     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
394     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
395     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
396     GetArkUINodeModifiers()->getWebModifier()->resetTextZoomRatio(nativeNode);
397     return panda::JSValueRef::Undefined(vm);
398 }
399 
SetInitialScale(ArkUIRuntimeCallInfo * runtimeCallInfo)400 ArkUINativeModuleValue WebBridge::SetInitialScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
401 {
402     EcmaVM* vm = runtimeCallInfo->GetVM();
403     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
404     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
405     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
406     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
407     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
408     if (secondArg->IsNumber()) {
409         float value = static_cast<float>(secondArg->ToNumber(vm)->Value());
410         GetArkUINodeModifiers()->getWebModifier()->setInitialScale(nativeNode, value);
411     } else {
412         GetArkUINodeModifiers()->getWebModifier()->resetInitialScale(nativeNode);
413     }
414     return panda::JSValueRef::Undefined(vm);
415 }
416 
ResetInitialScale(ArkUIRuntimeCallInfo * runtimeCallInfo)417 ArkUINativeModuleValue WebBridge::ResetInitialScale(ArkUIRuntimeCallInfo* runtimeCallInfo)
418 {
419     EcmaVM* vm = runtimeCallInfo->GetVM();
420     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
421     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
422     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
423     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
424     GetArkUINodeModifiers()->getWebModifier()->resetInitialScale(nativeNode);
425     return panda::JSValueRef::Undefined(vm);
426 }
427 
SetOnScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)428 ArkUINativeModuleValue WebBridge::SetOnScroll(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()->getWebModifier()->resetOnScrollCallBack(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(WebOnScrollEvent&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
445                                                           func = panda::CopyableGlobal(vm, func)](
446                                                           WebOnScrollEvent& event) {
447         panda::LocalScope pandaScope(vm);
448         panda::TryCatch trycatch(vm);
449         PipelineContext::SetCallBackNode(weak);
450 
451         const char* keys[] = { "xOffset", "yOffset" };
452         Local<JSValueRef> values[] = { panda::NumberRef::New(vm, event.GetX()),
453             panda::NumberRef::New(vm, event.GetY()) };
454         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
455         eventObject->SetNativePointerFieldCount(vm, 1);
456         eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&event));
457         panda::Local<panda::JSValueRef> params[1] = { eventObject };
458         func->Call(vm, func.ToLocal(), params, 1);
459     };
460     GetArkUINodeModifiers()->getWebModifier()->setOnScrollCallBack(nativeNode, reinterpret_cast<void*>(&callback));
461     return panda::JSValueRef::Undefined(vm);
462 }
463 
ResetOnScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)464 ArkUINativeModuleValue WebBridge::ResetOnScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
465 {
466     EcmaVM* vm = runtimeCallInfo->GetVM();
467     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
468     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
469     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
470     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
471     GetArkUINodeModifiers()->getWebModifier()->resetOnScrollCallBack(nativeNode);
472     return panda::JSValueRef::Undefined(vm);
473 }
474 
SetOnOverScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)475 ArkUINativeModuleValue WebBridge::SetOnOverScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
476 {
477     EcmaVM* vm = runtimeCallInfo->GetVM();
478     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
479     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
480     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
481     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
482     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
483     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
484         GetArkUINodeModifiers()->getWebModifier()->resetOnOverScrollCallBack(nativeNode);
485         return panda::JSValueRef::Undefined(vm);
486     }
487     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
488     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
489     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
490 
491     std::function<void(WebOnOverScrollEvent&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
492                                                               func = panda::CopyableGlobal(vm, func)](
493                                                               WebOnOverScrollEvent& event) {
494         panda::LocalScope pandaScope(vm);
495         panda::TryCatch trycatch(vm);
496         PipelineContext::SetCallBackNode(weak);
497 
498         const char* keys[] = { "xOffset", "yOffset" };
499         Local<JSValueRef> values[] = { panda::NumberRef::New(vm, event.GetX()),
500             panda::NumberRef::New(vm, event.GetY()) };
501         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
502         eventObject->SetNativePointerFieldCount(vm, 1);
503         eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&event));
504         panda::Local<panda::JSValueRef> params[1] = { eventObject };
505         func->Call(vm, func.ToLocal(), params, 1);
506     };
507     GetArkUINodeModifiers()->getWebModifier()->setOnOverScrollCallBack(nativeNode, reinterpret_cast<void*>(&callback));
508     return panda::JSValueRef::Undefined(vm);
509 }
510 
ResetOnOverScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)511 ArkUINativeModuleValue WebBridge::ResetOnOverScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
512 {
513     EcmaVM* vm = runtimeCallInfo->GetVM();
514     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
515     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
516     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
517     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
518     GetArkUINodeModifiers()->getWebModifier()->resetOnOverScrollCallBack(nativeNode);
519     return panda::JSValueRef::Undefined(vm);
520 }
521 
SetOnRequestSelected(ArkUIRuntimeCallInfo * runtimeCallInfo)522 ArkUINativeModuleValue WebBridge::SetOnRequestSelected(ArkUIRuntimeCallInfo* runtimeCallInfo)
523 {
524     EcmaVM* vm = runtimeCallInfo->GetVM();
525     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
526     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
527     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
528     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
529     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
530     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
531         GetArkUINodeModifiers()->getWebModifier()->resetOnRequestSelectedCallBack(nativeNode);
532         return panda::JSValueRef::Undefined(vm);
533     }
534     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
535     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
536     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
537 
538     std::function<void()> callback = [vm, weak = AceType::WeakClaim(frameNode),
539                                          func = panda::CopyableGlobal(vm, func)]() {
540         panda::LocalScope pandaScope(vm);
541         panda::TryCatch trycatch(vm);
542         PipelineContext::SetCallBackNode(weak);
543         func->Call(vm, func.ToLocal(), nullptr, 0);
544     };
545     GetArkUINodeModifiers()->getWebModifier()->setOnRequestSelectedCallBack(
546         nativeNode, reinterpret_cast<void*>(&callback));
547     return panda::JSValueRef::Undefined(vm);
548 }
549 
RetsetOnRequestSelected(ArkUIRuntimeCallInfo * runtimeCallInfo)550 ArkUINativeModuleValue WebBridge::RetsetOnRequestSelected(ArkUIRuntimeCallInfo* runtimeCallInfo)
551 {
552     EcmaVM* vm = runtimeCallInfo->GetVM();
553     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
554     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
555     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
556     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
557     GetArkUINodeModifiers()->getWebModifier()->resetOnRequestSelectedCallBack(nativeNode);
558     return panda::JSValueRef::Undefined(vm);
559 }
560 
SetOnScaleChange(ArkUIRuntimeCallInfo * runtimeCallInfo)561 ArkUINativeModuleValue WebBridge::SetOnScaleChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
562 {
563     EcmaVM* vm = runtimeCallInfo->GetVM();
564     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
565     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
566     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
567     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
568     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
569     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
570         GetArkUINodeModifiers()->getWebModifier()->resetOnScaleChangeCallBack(nativeNode);
571         return panda::JSValueRef::Undefined(vm);
572     }
573     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
574     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
575     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
576 
577     std::function<void(ScaleChangeEvent&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
578                                                           func = panda::CopyableGlobal(vm, func)](
579                                                           ScaleChangeEvent& event) {
580         panda::LocalScope pandaScope(vm);
581         panda::TryCatch trycatch(vm);
582         PipelineContext::SetCallBackNode(weak);
583         const char* keys[] = { "oldScale", "newScale" };
584         Local<JSValueRef> values[] = { panda::NumberRef::New(vm, event.GetOnScaleChangeOldScale()),
585             panda::NumberRef::New(vm, event.GetOnScaleChangeNewScale()) };
586         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
587         eventObject->SetNativePointerFieldCount(vm, 1);
588         eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&event));
589         panda::Local<panda::JSValueRef> params[1] = { eventObject };
590         func->Call(vm, func.ToLocal(), params, 1);
591     };
592     GetArkUINodeModifiers()->getWebModifier()->setOnScaleChangeCallBack(nativeNode, reinterpret_cast<void*>(&callback));
593     return panda::JSValueRef::Undefined(vm);
594 }
595 
ResetOnScaleChange(ArkUIRuntimeCallInfo * runtimeCallInfo)596 ArkUINativeModuleValue WebBridge::ResetOnScaleChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
597 {
598     EcmaVM* vm = runtimeCallInfo->GetVM();
599     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
600     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
601     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
602     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
603     GetArkUINodeModifiers()->getWebModifier()->resetOnScaleChangeCallBack(nativeNode);
604     return panda::JSValueRef::Undefined(vm);
605 }
606 
SetOnContextMenuHide(ArkUIRuntimeCallInfo * runtimeCallInfo)607 ArkUINativeModuleValue WebBridge::SetOnContextMenuHide(ArkUIRuntimeCallInfo* runtimeCallInfo)
608 {
609     EcmaVM* vm = runtimeCallInfo->GetVM();
610     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
611     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
612     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
613     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
614     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
615     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
616         GetArkUINodeModifiers()->getWebModifier()->resetOnContextMenuHideCallBack(nativeNode);
617         return panda::JSValueRef::Undefined(vm);
618     }
619     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
620     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
621     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
622 
623     std::function<void()> callback = [vm, weak = AceType::WeakClaim(frameNode),
624                                          func = panda::CopyableGlobal(vm, func)]() {
625         panda::LocalScope pandaScope(vm);
626         panda::TryCatch trycatch(vm);
627         PipelineContext::SetCallBackNode(weak);
628         func->Call(vm, func.ToLocal(), nullptr, 0);
629     };
630     GetArkUINodeModifiers()->getWebModifier()->setOnContextMenuHideCallBack(
631         nativeNode, reinterpret_cast<void*>(&callback));
632     return panda::JSValueRef::Undefined(vm);
633 }
634 
ResetOnContextMenuHide(ArkUIRuntimeCallInfo * runtimeCallInfo)635 ArkUINativeModuleValue WebBridge::ResetOnContextMenuHide(ArkUIRuntimeCallInfo* runtimeCallInfo)
636 {
637     EcmaVM* vm = runtimeCallInfo->GetVM();
638     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
639     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
640     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
641     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
642     GetArkUINodeModifiers()->getWebModifier()->resetOnContextMenuHideCallBack(nativeNode);
643     return panda::JSValueRef::Undefined(vm);
644 }
SetGeolocationAccess(ArkUIRuntimeCallInfo * runtimeCallInfo)645 ArkUINativeModuleValue WebBridge::SetGeolocationAccess(ArkUIRuntimeCallInfo* runtimeCallInfo)
646 {
647     EcmaVM* vm = runtimeCallInfo->GetVM();
648     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
649     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
650     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
651     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
652     if (secondArg->IsBoolean()) {
653         bool enable = secondArg->ToBoolean(vm)->Value();
654         GetArkUINodeModifiers()->getWebModifier()->setGeolocationAccess(nativeNode, enable);
655     } else {
656         GetArkUINodeModifiers()->getWebModifier()->resetGeolocationAccess(nativeNode);
657     }
658     return panda::JSValueRef::Undefined(vm);
659 }
660 
ResetGeolocationAccess(ArkUIRuntimeCallInfo * runtimeCallInfo)661 ArkUINativeModuleValue WebBridge::ResetGeolocationAccess(ArkUIRuntimeCallInfo* runtimeCallInfo)
662 {
663     EcmaVM* vm = runtimeCallInfo->GetVM();
664     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
665     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
666     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
667     GetArkUINodeModifiers()->getWebModifier()->resetGeolocationAccess(nativeNode);
668     return panda::JSValueRef::Undefined(vm);
669 }
670 
SetDatabaseAccess(ArkUIRuntimeCallInfo * runtimeCallInfo)671 ArkUINativeModuleValue WebBridge::SetDatabaseAccess(ArkUIRuntimeCallInfo* runtimeCallInfo)
672 {
673     EcmaVM* vm = runtimeCallInfo->GetVM();
674     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
675     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
676     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
677     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
678     if (secondArg->IsBoolean()) {
679         bool enable = secondArg->ToBoolean(vm)->Value();
680         GetArkUINodeModifiers()->getWebModifier()->setDatabaseAccess(nativeNode, enable);
681     } else {
682         GetArkUINodeModifiers()->getWebModifier()->resetDatabaseAccess(nativeNode);
683     }
684     return panda::JSValueRef::Undefined(vm);
685 }
686 
ResetDatabaseAccess(ArkUIRuntimeCallInfo * runtimeCallInfo)687 ArkUINativeModuleValue WebBridge::ResetDatabaseAccess(ArkUIRuntimeCallInfo* runtimeCallInfo)
688 {
689     EcmaVM* vm = runtimeCallInfo->GetVM();
690     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
691     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
692     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
693     GetArkUINodeModifiers()->getWebModifier()->resetDatabaseAccess(nativeNode);
694     return panda::JSValueRef::Undefined(vm);
695 }
696 
SetOverviewModeAccess(ArkUIRuntimeCallInfo * runtimeCallInfo)697 ArkUINativeModuleValue WebBridge::SetOverviewModeAccess(ArkUIRuntimeCallInfo* runtimeCallInfo)
698 {
699     EcmaVM* vm = runtimeCallInfo->GetVM();
700     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
701     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
702     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
703     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
704     if (secondArg->IsBoolean()) {
705         bool enable = secondArg->ToBoolean(vm)->Value();
706         GetArkUINodeModifiers()->getWebModifier()->setOverviewModeAccess(nativeNode, enable);
707     } else {
708         GetArkUINodeModifiers()->getWebModifier()->resetOverviewModeAccess(nativeNode);
709     }
710     return panda::JSValueRef::Undefined(vm);
711 }
712 
ResetOverviewModeAccess(ArkUIRuntimeCallInfo * runtimeCallInfo)713 ArkUINativeModuleValue WebBridge::ResetOverviewModeAccess(ArkUIRuntimeCallInfo* runtimeCallInfo)
714 {
715     EcmaVM* vm = runtimeCallInfo->GetVM();
716     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
717     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
718     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
719     GetArkUINodeModifiers()->getWebModifier()->resetOverviewModeAccess(nativeNode);
720     return panda::JSValueRef::Undefined(vm);
721 }
722 
SetForceDarkAccess(ArkUIRuntimeCallInfo * runtimeCallInfo)723 ArkUINativeModuleValue WebBridge::SetForceDarkAccess(ArkUIRuntimeCallInfo* runtimeCallInfo)
724 {
725     EcmaVM* vm = runtimeCallInfo->GetVM();
726     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
727     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
728     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
729     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
730     if (secondArg->IsBoolean()) {
731         bool enable = secondArg->ToBoolean(vm)->Value();
732         GetArkUINodeModifiers()->getWebModifier()->setForceDarkAccess(nativeNode, enable);
733     } else {
734         GetArkUINodeModifiers()->getWebModifier()->resetForceDarkAccess(nativeNode);
735     }
736     return panda::JSValueRef::Undefined(vm);
737 }
738 
ResetForceDarkAccess(ArkUIRuntimeCallInfo * runtimeCallInfo)739 ArkUINativeModuleValue WebBridge::ResetForceDarkAccess(ArkUIRuntimeCallInfo* runtimeCallInfo)
740 {
741     EcmaVM* vm = runtimeCallInfo->GetVM();
742     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
743     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
744     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
745     GetArkUINodeModifiers()->getWebModifier()->resetForceDarkAccess(nativeNode);
746     return panda::JSValueRef::Undefined(vm);
747 }
748 
SetPinchSmooth(ArkUIRuntimeCallInfo * runtimeCallInfo)749 ArkUINativeModuleValue WebBridge::SetPinchSmooth(ArkUIRuntimeCallInfo* runtimeCallInfo)
750 {
751     EcmaVM* vm = runtimeCallInfo->GetVM();
752     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
753     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
754     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
755     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
756     if (secondArg->IsBoolean()) {
757         bool enable = secondArg->ToBoolean(vm)->Value();
758         GetArkUINodeModifiers()->getWebModifier()->setPinchSmooth(nativeNode, enable);
759     } else {
760         GetArkUINodeModifiers()->getWebModifier()->resetPinchSmooth(nativeNode);
761     }
762     return panda::JSValueRef::Undefined(vm);
763 }
764 
ResetPinchSmooth(ArkUIRuntimeCallInfo * runtimeCallInfo)765 ArkUINativeModuleValue WebBridge::ResetPinchSmooth(ArkUIRuntimeCallInfo* runtimeCallInfo)
766 {
767     EcmaVM* vm = runtimeCallInfo->GetVM();
768     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
769     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
770     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
771     GetArkUINodeModifiers()->getWebModifier()->resetPinchSmooth(nativeNode);
772     return panda::JSValueRef::Undefined(vm);
773 }
774 
SetMetaViewport(ArkUIRuntimeCallInfo * runtimeCallInfo)775 ArkUINativeModuleValue WebBridge::SetMetaViewport(ArkUIRuntimeCallInfo* runtimeCallInfo)
776 {
777     EcmaVM* vm = runtimeCallInfo->GetVM();
778     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
779     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
780     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
781     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
782     if (secondArg->IsBoolean()) {
783         bool enable = secondArg->ToBoolean(vm)->Value();
784         GetArkUINodeModifiers()->getWebModifier()->setMetaViewport(nativeNode, enable);
785     } else {
786         GetArkUINodeModifiers()->getWebModifier()->resetMetaViewport(nativeNode);
787     }
788     return panda::JSValueRef::Undefined(vm);
789 }
790 
ResetMetaViewport(ArkUIRuntimeCallInfo * runtimeCallInfo)791 ArkUINativeModuleValue WebBridge::ResetMetaViewport(ArkUIRuntimeCallInfo* runtimeCallInfo)
792 {
793     EcmaVM* vm = runtimeCallInfo->GetVM();
794     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
795     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
796     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
797     GetArkUINodeModifiers()->getWebModifier()->resetMetaViewport(nativeNode);
798     return panda::JSValueRef::Undefined(vm);
799 }
800 
SetEnableFollowSystemFontWeight(ArkUIRuntimeCallInfo * runtimeCallInfo)801 ArkUINativeModuleValue WebBridge::SetEnableFollowSystemFontWeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
802 {
803     EcmaVM* vm = runtimeCallInfo->GetVM();
804     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
805     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
806     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
807     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
808     if (secondArg->IsBoolean()) {
809         bool enable = secondArg->ToBoolean(vm)->Value();
810         GetArkUINodeModifiers()->getWebModifier()->setEnableFollowSystemFontWeight(nativeNode, enable);
811     } else {
812         GetArkUINodeModifiers()->getWebModifier()->resetEnableFollowSystemFontWeight(nativeNode);
813     }
814     return panda::JSValueRef::Undefined(vm);
815 }
816 
ResetEnableFollowSystemFontWeight(ArkUIRuntimeCallInfo * runtimeCallInfo)817 ArkUINativeModuleValue WebBridge::ResetEnableFollowSystemFontWeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
818 {
819     EcmaVM* vm = runtimeCallInfo->GetVM();
820     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
821     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
822     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
823     GetArkUINodeModifiers()->getWebModifier()->resetEnableFollowSystemFontWeight(nativeNode);
824     return panda::JSValueRef::Undefined(vm);
825 }
826 
SetEnableNativeEmbedMode(ArkUIRuntimeCallInfo * runtimeCallInfo)827 ArkUINativeModuleValue WebBridge::SetEnableNativeEmbedMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
828 {
829     EcmaVM* vm = runtimeCallInfo->GetVM();
830     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
831     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
832     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
833     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
834     if (secondArg->IsBoolean()) {
835         bool enable = secondArg->ToBoolean(vm)->Value();
836         GetArkUINodeModifiers()->getWebModifier()->setEnableNativeEmbedMode(nativeNode, enable);
837     } else {
838         GetArkUINodeModifiers()->getWebModifier()->resetEnableNativeEmbedMode(nativeNode);
839     }
840     return panda::JSValueRef::Undefined(vm);
841 }
842 
ResetEnableNativeEmbedMode(ArkUIRuntimeCallInfo * runtimeCallInfo)843 ArkUINativeModuleValue WebBridge::ResetEnableNativeEmbedMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
844 {
845     EcmaVM* vm = runtimeCallInfo->GetVM();
846     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
847     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
848     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
849     GetArkUINodeModifiers()->getWebModifier()->resetEnableNativeEmbedMode(nativeNode);
850     return panda::JSValueRef::Undefined(vm);
851 }
852 
SetMinFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)853 ArkUINativeModuleValue WebBridge::SetMinFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
854 {
855     EcmaVM* vm = runtimeCallInfo->GetVM();
856     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
857     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
858     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
859     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
860     if (secondArg->IsNumber()) {
861         int mode = secondArg->Int32Value(vm);
862         GetArkUINodeModifiers()->getWebModifier()->setMinFontSize(nativeNode, mode);
863     } else {
864         GetArkUINodeModifiers()->getWebModifier()->resetMinFontSize(nativeNode);
865     }
866     return panda::JSValueRef::Undefined(vm);
867 }
868 
ResetMinFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)869 ArkUINativeModuleValue WebBridge::ResetMinFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
870 {
871     EcmaVM* vm = runtimeCallInfo->GetVM();
872     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
873     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
874     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
875     GetArkUINodeModifiers()->getWebModifier()->resetMinFontSize(nativeNode);
876     return panda::JSValueRef::Undefined(vm);
877 }
878 
SetDefaultFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)879 ArkUINativeModuleValue WebBridge::SetDefaultFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
880 {
881     EcmaVM* vm = runtimeCallInfo->GetVM();
882     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
883     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
884     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
885     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
886     if (secondArg->IsNumber()) {
887         int mode = secondArg->Int32Value(vm);
888         GetArkUINodeModifiers()->getWebModifier()->setDefaultFontSize(nativeNode, mode);
889     } else {
890         GetArkUINodeModifiers()->getWebModifier()->resetDefaultFontSize(nativeNode);
891     }
892     return panda::JSValueRef::Undefined(vm);
893 }
894 
ResetDefaultFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)895 ArkUINativeModuleValue WebBridge::ResetDefaultFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
896 {
897     EcmaVM* vm = runtimeCallInfo->GetVM();
898     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
899     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
900     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
901     GetArkUINodeModifiers()->getWebModifier()->resetDefaultFontSize(nativeNode);
902     return panda::JSValueRef::Undefined(vm);
903 }
904 
SetDefaultFixedFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)905 ArkUINativeModuleValue WebBridge::SetDefaultFixedFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
906 {
907     EcmaVM* vm = runtimeCallInfo->GetVM();
908     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
909     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
910     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
911     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
912     if (secondArg->IsNumber()) {
913         int mode = secondArg->Int32Value(vm);
914         GetArkUINodeModifiers()->getWebModifier()->setDefaultFixedFontSize(nativeNode, mode);
915     } else {
916         GetArkUINodeModifiers()->getWebModifier()->resetDefaultFixedFontSize(nativeNode);
917     }
918     return panda::JSValueRef::Undefined(vm);
919 }
920 
ResetDefaultFixedFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)921 ArkUINativeModuleValue WebBridge::ResetDefaultFixedFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
922 {
923     EcmaVM* vm = runtimeCallInfo->GetVM();
924     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
925     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
926     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
927     GetArkUINodeModifiers()->getWebModifier()->resetDefaultFixedFontSize(nativeNode);
928     return panda::JSValueRef::Undefined(vm);
929 }
930 
SetMinLogicalFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)931 ArkUINativeModuleValue WebBridge::SetMinLogicalFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
932 {
933     EcmaVM* vm = runtimeCallInfo->GetVM();
934     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
935     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
936     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
937     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
938     if (secondArg->IsNumber()) {
939         int mode = secondArg->Int32Value(vm);
940         GetArkUINodeModifiers()->getWebModifier()->setMinLogicalFontSize(nativeNode, mode);
941     } else {
942         GetArkUINodeModifiers()->getWebModifier()->resetMinLogicalFontSize(nativeNode);
943     }
944     return panda::JSValueRef::Undefined(vm);
945 }
946 
ResetMinLogicalFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)947 ArkUINativeModuleValue WebBridge::ResetMinLogicalFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
948 {
949     EcmaVM* vm = runtimeCallInfo->GetVM();
950     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
951     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
952     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
953     GetArkUINodeModifiers()->getWebModifier()->resetMinLogicalFontSize(nativeNode);
954     return panda::JSValueRef::Undefined(vm);
955 }
956 
SetWebStandardFont(ArkUIRuntimeCallInfo * runtimeCallInfo)957 ArkUINativeModuleValue WebBridge::SetWebStandardFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
958 {
959     EcmaVM* vm = runtimeCallInfo->GetVM();
960     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
961     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
962     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
963     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
964     if (secondArg->IsString(vm)) {
965         auto mode = secondArg->ToString(vm)->ToString(vm);
966         GetArkUINodeModifiers()->getWebModifier()->setWebStandardFont(nativeNode, mode.c_str());
967     } else {
968         GetArkUINodeModifiers()->getWebModifier()->resetWebStandardFont(nativeNode);
969     }
970     return panda::JSValueRef::Undefined(vm);
971 }
972 
ResetWebStandardFont(ArkUIRuntimeCallInfo * runtimeCallInfo)973 ArkUINativeModuleValue WebBridge::ResetWebStandardFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
974 {
975     EcmaVM* vm = runtimeCallInfo->GetVM();
976     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
977     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
978     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
979     GetArkUINodeModifiers()->getWebModifier()->resetWebStandardFont(nativeNode);
980     return panda::JSValueRef::Undefined(vm);
981 }
982 
SetWebSerifFont(ArkUIRuntimeCallInfo * runtimeCallInfo)983 ArkUINativeModuleValue WebBridge::SetWebSerifFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
984 {
985     EcmaVM* vm = runtimeCallInfo->GetVM();
986     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
987     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
988     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
989     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
990     if (secondArg->IsString(vm)) {
991         auto mode = secondArg->ToString(vm)->ToString(vm);
992         GetArkUINodeModifiers()->getWebModifier()->setWebSerifFont(nativeNode, mode.c_str());
993     } else {
994         GetArkUINodeModifiers()->getWebModifier()->resetWebSerifFont(nativeNode);
995     }
996     return panda::JSValueRef::Undefined(vm);
997 }
998 
ResetWebSerifFont(ArkUIRuntimeCallInfo * runtimeCallInfo)999 ArkUINativeModuleValue WebBridge::ResetWebSerifFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
1000 {
1001     EcmaVM* vm = runtimeCallInfo->GetVM();
1002     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1003     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1004     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1005     GetArkUINodeModifiers()->getWebModifier()->resetWebSerifFont(nativeNode);
1006     return panda::JSValueRef::Undefined(vm);
1007 }
1008 
SetWebSansSerifFont(ArkUIRuntimeCallInfo * runtimeCallInfo)1009 ArkUINativeModuleValue WebBridge::SetWebSansSerifFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
1010 {
1011     EcmaVM* vm = runtimeCallInfo->GetVM();
1012     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1013     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1014     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
1015     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1016     if (secondArg->IsString(vm)) {
1017         auto mode = secondArg->ToString(vm)->ToString(vm);
1018         GetArkUINodeModifiers()->getWebModifier()->setWebSansSerifFont(nativeNode, mode.c_str());
1019     } else {
1020         GetArkUINodeModifiers()->getWebModifier()->resetWebSansSerifFont(nativeNode);
1021     }
1022     return panda::JSValueRef::Undefined(vm);
1023 }
1024 
ResetWebSansSerifFont(ArkUIRuntimeCallInfo * runtimeCallInfo)1025 ArkUINativeModuleValue WebBridge::ResetWebSansSerifFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
1026 {
1027     EcmaVM* vm = runtimeCallInfo->GetVM();
1028     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1029     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1030     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1031     GetArkUINodeModifiers()->getWebModifier()->resetWebSansSerifFont(nativeNode);
1032     return panda::JSValueRef::Undefined(vm);
1033 }
1034 
SetWebFixedFont(ArkUIRuntimeCallInfo * runtimeCallInfo)1035 ArkUINativeModuleValue WebBridge::SetWebFixedFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
1036 {
1037     EcmaVM* vm = runtimeCallInfo->GetVM();
1038     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1039     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1040     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
1041     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1042     if (secondArg->IsString(vm)) {
1043         auto mode = secondArg->ToString(vm)->ToString(vm);
1044         GetArkUINodeModifiers()->getWebModifier()->setWebFixedFont(nativeNode, mode.c_str());
1045     } else {
1046         GetArkUINodeModifiers()->getWebModifier()->resetWebFixedFont(nativeNode);
1047     }
1048     return panda::JSValueRef::Undefined(vm);
1049 }
1050 
ResetWebFixedFont(ArkUIRuntimeCallInfo * runtimeCallInfo)1051 ArkUINativeModuleValue WebBridge::ResetWebFixedFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
1052 {
1053     EcmaVM* vm = runtimeCallInfo->GetVM();
1054     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1055     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1056     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1057     GetArkUINodeModifiers()->getWebModifier()->resetWebFixedFont(nativeNode);
1058     return panda::JSValueRef::Undefined(vm);
1059 }
1060 
SetWebFantasyFont(ArkUIRuntimeCallInfo * runtimeCallInfo)1061 ArkUINativeModuleValue WebBridge::SetWebFantasyFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
1062 {
1063     EcmaVM* vm = runtimeCallInfo->GetVM();
1064     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1065     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1066     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
1067     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1068     if (secondArg->IsString(vm)) {
1069         auto mode = secondArg->ToString(vm)->ToString(vm);
1070         GetArkUINodeModifiers()->getWebModifier()->setWebFantasyFont(nativeNode, mode.c_str());
1071     } else {
1072         GetArkUINodeModifiers()->getWebModifier()->resetWebFantasyFont(nativeNode);
1073     }
1074     return panda::JSValueRef::Undefined(vm);
1075 }
1076 
ResetWebFantasyFont(ArkUIRuntimeCallInfo * runtimeCallInfo)1077 ArkUINativeModuleValue WebBridge::ResetWebFantasyFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
1078 {
1079     EcmaVM* vm = runtimeCallInfo->GetVM();
1080     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1081     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1082     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1083     GetArkUINodeModifiers()->getWebModifier()->resetWebFantasyFont(nativeNode);
1084     return panda::JSValueRef::Undefined(vm);
1085 }
1086 
SetWebCursiveFont(ArkUIRuntimeCallInfo * runtimeCallInfo)1087 ArkUINativeModuleValue WebBridge::SetWebCursiveFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
1088 {
1089     EcmaVM* vm = runtimeCallInfo->GetVM();
1090     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1091     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1092     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
1093     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1094     auto mode = secondArg->ToString(vm)->ToString(vm);
1095     GetArkUINodeModifiers()->getWebModifier()->setWebCursiveFont(nativeNode, mode.c_str());
1096     return panda::JSValueRef::Undefined(vm);
1097 }
1098 
ResetWebCursiveFont(ArkUIRuntimeCallInfo * runtimeCallInfo)1099 ArkUINativeModuleValue WebBridge::ResetWebCursiveFont(ArkUIRuntimeCallInfo* runtimeCallInfo)
1100 {
1101     EcmaVM* vm = runtimeCallInfo->GetVM();
1102     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1103     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1104     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1105     GetArkUINodeModifiers()->getWebModifier()->resetWebCursiveFont(nativeNode);
1106     return panda::JSValueRef::Undefined(vm);
1107 }
1108 
SetLayoutMode(ArkUIRuntimeCallInfo * runtimeCallInfo)1109 ArkUINativeModuleValue WebBridge::SetLayoutMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
1110 {
1111     EcmaVM* vm = runtimeCallInfo->GetVM();
1112     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1113     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1114     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
1115     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1116     int mode = secondArg->Int32Value(vm);
1117     GetArkUINodeModifiers()->getWebModifier()->setLayoutMode(nativeNode, mode);
1118     return panda::JSValueRef::Undefined(vm);
1119 }
1120 
ResetLayoutMode(ArkUIRuntimeCallInfo * runtimeCallInfo)1121 ArkUINativeModuleValue WebBridge::ResetLayoutMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
1122 {
1123     EcmaVM* vm = runtimeCallInfo->GetVM();
1124     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1125     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1126     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1127     GetArkUINodeModifiers()->getWebModifier()->resetLayoutMode(nativeNode);
1128     return panda::JSValueRef::Undefined(vm);
1129 }
1130 
SetOnNativeEmbedLifecycleChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1131 ArkUINativeModuleValue WebBridge::SetOnNativeEmbedLifecycleChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1132 {
1133     EcmaVM* vm = runtimeCallInfo->GetVM();
1134     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1135     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1136     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
1137     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1138     auto obj = secondArg->ToObject(vm);
1139     panda::Local<panda::FunctionRef> func = obj;
1140     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1141     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::Undefined(vm));
1142     std::function<void(NativeEmbedDataInfo&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
1143                                                              func = panda::CopyableGlobal(vm, func)](
1144                                                              NativeEmbedDataInfo& event) -> void {
1145         panda::LocalScope pandaScope(vm);
1146         panda::TryCatch trycatch(vm);
1147         PipelineContext::SetCallBackNode(weak.Upgrade());
1148         const char* keyPosition[] = { "x", "y" };
1149         Local<JSValueRef> valuesPosition[] = { panda::NumberRef::New(vm, static_cast<int32_t>(event.GetEmebdInfo().x)),
1150             panda::NumberRef::New(vm, static_cast<int32_t>(event.GetEmebdInfo().y)) };
1151         auto positionObject =
1152             panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keyPosition), keyPosition, valuesPosition);
1153         const char* keysInfo[] = { "id", "type", "src", "tag", "width", "height", "url", "position", "params" };
1154         auto paramsObject = panda::ObjectRef::New(vm);
1155         for (const auto& item : event.GetEmebdInfo().params) {
1156             paramsObject->Set(vm, panda::StringRef::NewFromUtf8(vm, item.first.c_str()),
1157                 panda::StringRef::NewFromUtf8(vm, item.second.c_str()));
1158         }
1159         Local<JSValueRef> valuesInfo[] = { panda::StringRef::NewFromUtf8(vm, event.GetEmebdInfo().id.c_str()),
1160             panda::StringRef::NewFromUtf8(vm, event.GetEmebdInfo().type.c_str()),
1161             panda::StringRef::NewFromUtf8(vm, event.GetEmebdInfo().src.c_str()),
1162             panda::StringRef::NewFromUtf8(vm, event.GetEmebdInfo().tag.c_str()),
1163             panda::NumberRef::New(vm, static_cast<int32_t>(event.GetEmebdInfo().width)),
1164             panda::NumberRef::New(vm, static_cast<int32_t>(event.GetEmebdInfo().height)),
1165             panda::StringRef::NewFromUtf8(vm, event.GetEmebdInfo().url.c_str()), positionObject, paramsObject };
1166         auto resultObj = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keysInfo), keysInfo, valuesInfo);
1167         const char* keysEvent[] = { "status", "surfaceId", "embedId", "info" };
1168         Local<JSValueRef> valuesEvent[] = { panda::NumberRef::New(vm, static_cast<int32_t>(event.GetStatus())),
1169             panda::StringRef::NewFromUtf8(vm, event.GetSurfaceId().c_str()),
1170             panda::StringRef::NewFromUtf8(vm, event.GetEmbedId().c_str()), resultObj };
1171         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keysEvent), keysEvent, valuesEvent);
1172         eventObject->SetNativePointerFieldCount(vm, CALL_ARG_1);
1173         eventObject->SetNativePointerField(vm, CALL_ARG_0, static_cast<void*>(&event));
1174         panda::Local<panda::JSValueRef> params[CALL_ARG_1] = { eventObject };
1175         func->Call(vm, func.ToLocal(), params, CALL_ARG_1);
1176     };
1177     GetArkUINodeModifiers()->getWebModifier()->setOnNativeEmbedLifecycleChange(
1178         nativeNode, reinterpret_cast<void*>(&callback));
1179     return panda::JSValueRef::Undefined(vm);
1180 }
1181 
ResetOnNativeEmbedLifecycleChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1182 ArkUINativeModuleValue WebBridge::ResetOnNativeEmbedLifecycleChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1183 {
1184     EcmaVM* vm = runtimeCallInfo->GetVM();
1185     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1186     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1187     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1188     GetArkUINodeModifiers()->getWebModifier()->resetOnNativeEmbedLifecycleChange(nativeNode);
1189     return panda::JSValueRef::Undefined(vm);
1190 }
1191 
CreateEventTargetObject(EcmaVM * vm,const BaseEventInfo & info)1192 Local<panda::ObjectRef> WebBridge::CreateEventTargetObject(EcmaVM* vm, const BaseEventInfo& info)
1193 {
1194     const auto& localOffset = info.GetTarget().area.GetOffset();
1195     const auto& origin = info.GetTarget().origin;
1196     const char* keysOfOffset[] = { "x", "y" };
1197     Local<JSValueRef> valuesOfOffset[] = { panda::NumberRef::New(vm, localOffset.GetX().ConvertToVp()),
1198         panda::NumberRef::New(vm, localOffset.GetY().ConvertToVp()) };
1199     auto offset = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keysOfOffset), keysOfOffset, valuesOfOffset);
1200 
1201     const char* keysOfGlobalOffset[] = { "x", "y" };
1202     Local<JSValueRef> valuesOfGlobalOffset[] = { panda::NumberRef::New(
1203         vm, (origin.GetX() + localOffset.GetX()).ConvertToVp()),
1204         panda::NumberRef::New(vm, (origin.GetY() + localOffset.GetY()).ConvertToVp()) };
1205     auto globalOffset = panda::ObjectRef::NewWithNamedProperties(
1206         vm, ArraySize(keysOfGlobalOffset), keysOfGlobalOffset, valuesOfGlobalOffset);
1207     const char* keysOfArea[] = { "position", "globalPosition", "width", "height" };
1208     Local<JSValueRef> valuesOfArea[] = { offset, globalOffset,
1209         panda::NumberRef::New(vm, info.GetTarget().area.GetWidth().ConvertToVp()),
1210         panda::NumberRef::New(vm, info.GetTarget().area.GetHeight().ConvertToVp()) };
1211     auto area = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keysOfArea), keysOfArea, valuesOfArea);
1212     auto target = panda::ObjectRef::New(vm);
1213     target->Set(vm, panda::StringRef::NewFromUtf8(vm, "area"), area);
1214     if (info.GetTarget().id.empty()) {
1215         target->Set(vm, panda::StringRef::NewFromUtf8(vm, "id"), panda::JSValueRef().Undefined(vm));
1216     } else {
1217         target->Set(vm, panda::StringRef::NewFromUtf8(vm, "id"),
1218             panda::StringRef::NewFromUtf8(vm, info.GetTarget().id.c_str()));
1219     }
1220     return target;
1221 }
1222 
CreateTouchEventInfoObj(EcmaVM * vm,TouchEventInfo & info)1223 Local<panda::ObjectRef> WebBridge::CreateTouchEventInfoObj(EcmaVM* vm, TouchEventInfo& info)
1224 {
1225     const char* keys[] = { "source", "timestamp", "target", "pressure", "sourceTool", "targetDisplayId", "deviceId" };
1226     Local<JSValueRef> values[] = { panda::NumberRef::New(vm, static_cast<int32_t>(info.GetSourceDevice())),
1227         panda::NumberRef::New(vm, static_cast<double>(info.GetTimeStamp().time_since_epoch().count())),
1228         CreateEventTargetObject(vm, info), panda::NumberRef::New(vm, info.GetForce()),
1229         panda::NumberRef::New(vm, static_cast<int32_t>(info.GetSourceTool())),
1230         panda::NumberRef::New(vm, static_cast<int32_t>(info.GetTargetDisplayId())),
1231         panda::NumberRef::New(vm, info.GetDeviceId()) };
1232 
1233     return panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1234 }
1235 
CreateTouchInfo(EcmaVM * vm,const TouchLocationInfo & touchInfo,TouchEventInfo & info)1236 Local<panda::ObjectRef> WebBridge::CreateTouchInfo(EcmaVM* vm, const TouchLocationInfo& touchInfo, TouchEventInfo& info)
1237 {
1238     const Offset& globalOffset = touchInfo.GetGlobalLocation();
1239     const Offset& localOffset = touchInfo.GetLocalLocation();
1240     const Offset& screenOffset = touchInfo.GetScreenLocation();
1241     const char* keys[] = { "type", "id", "displayX", "displayY", "windowX", "windowY", "screenX", "screenY", "x", "y" };
1242     Local<JSValueRef> values[] = { panda::NumberRef::New(vm, static_cast<int32_t>(touchInfo.GetTouchType())),
1243         panda::NumberRef::New(vm, touchInfo.GetFingerId()), panda::NumberRef::New(vm, screenOffset.GetX()),
1244         panda::NumberRef::New(vm, screenOffset.GetY()), panda::NumberRef::New(vm, globalOffset.GetX()),
1245         panda::NumberRef::New(vm, globalOffset.GetY()), panda::NumberRef::New(vm, globalOffset.GetX()),
1246         panda::NumberRef::New(vm, globalOffset.GetY()), panda::NumberRef::New(vm, localOffset.GetX()),
1247         panda::NumberRef::New(vm, localOffset.GetY()) };
1248     auto touchInfoObj = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1249     touchInfoObj->SetNativePointerFieldCount(vm, 1);
1250     touchInfoObj->SetNativePointerField(vm, 0, static_cast<void*>(&info));
1251     return touchInfoObj;
1252 }
1253 
CreateTouchEventInfo(EcmaVM * vm,TouchEventInfo & info)1254 Local<panda::ObjectRef> WebBridge::CreateTouchEventInfo(EcmaVM* vm, TouchEventInfo& info)
1255 {
1256     auto eventObj = CreateTouchEventInfoObj(vm, info);
1257     eventObj->SetNativePointerFieldCount(vm, 1);
1258     auto touchArr = panda::ArrayRef::New(vm);
1259     const std::list<TouchLocationInfo>& touchList = info.GetTouches();
1260     uint32_t idx = 0;
1261     for (const TouchLocationInfo& location : touchList) {
1262         panda::ArrayRef::SetValueAt(vm, touchArr, idx++, CreateTouchInfo(vm, location, info));
1263     }
1264     eventObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "touches"), touchArr);
1265     auto changeTouchArr = panda::ArrayRef::New(vm);
1266     idx = 0;
1267     const std::list<TouchLocationInfo>& changeTouch = info.GetChangedTouches();
1268     for (const TouchLocationInfo& change : changeTouch) {
1269         panda::ArrayRef::SetValueAt(vm, changeTouchArr, idx++, CreateTouchInfo(vm, change, info));
1270     }
1271     if (changeTouch.size() > 0) {
1272         eventObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "type"),
1273             panda::NumberRef::New(vm, static_cast<int32_t>(changeTouch.front().GetTouchType())));
1274     }
1275     eventObj->Set(vm, panda::StringRef::NewFromUtf8(vm, "changedTouches"), changeTouchArr);
1276 
1277     eventObj->SetNativePointerField(vm, 0, static_cast<void*>(&info));
1278     return eventObj;
1279 }
1280 
SetOnNativeEmbedGestureEvent(ArkUIRuntimeCallInfo * runtimeCallInfo)1281 ArkUINativeModuleValue WebBridge::SetOnNativeEmbedGestureEvent(ArkUIRuntimeCallInfo* runtimeCallInfo)
1282 {
1283     EcmaVM* vm = runtimeCallInfo->GetVM();
1284     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1285     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1286     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
1287     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1288     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1289         GetArkUINodeModifiers()->getWebModifier()->resetOnFirstContentfulPaint(nativeNode);
1290         return panda::JSValueRef::Undefined(vm);
1291     }
1292     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1293     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1294     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1295 
1296     std::function<void(NativeEmbeadTouchInfo&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
1297                                                                func = panda::CopyableGlobal(vm, func)](
1298                                                                NativeEmbeadTouchInfo& event) {
1299         panda::LocalScope pandaScope(vm);
1300         panda::TryCatch trycatch(vm);
1301         PipelineContext::SetCallBackNode(weak);
1302         auto info = event.GetTouchEventInfo();
1303         auto touchEventObject = CreateTouchEventInfo(vm, info);
1304 
1305         const char* keysFinal[] = { "embedId", "touchEvent", "result" };
1306         Framework::JSRef<Framework::JSObject> handlerObj = Framework::JSWeb::CreateNativeEmbedGestureHandler(event);
1307         Local<JSValueRef> valuesFinal[] = { panda::StringRef::NewFromUtf8(vm, event.GetEmbedId().c_str()),
1308             touchEventObject, handlerObj->GetLocalHandle() };
1309 
1310         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keysFinal), keysFinal, valuesFinal);
1311         eventObject->SetNativePointerFieldCount(vm, CALL_ARG_1);
1312         eventObject->SetNativePointerField(vm, CALL_ARG_0, static_cast<void*>(&event));
1313         panda::Local<panda::JSValueRef> params[1] = { eventObject };
1314         func->Call(vm, func.ToLocal(), params, CALL_ARG_1);
1315     };
1316     GetArkUINodeModifiers()->getWebModifier()->setOnNativeEmbedGestureEvent(
1317         nativeNode, reinterpret_cast<void*>(&callback));
1318     return panda::JSValueRef::Undefined(vm);
1319 }
1320 
ResetOnNativeEmbedGestureEvent(ArkUIRuntimeCallInfo * runtimeCallInfo)1321 ArkUINativeModuleValue WebBridge::ResetOnNativeEmbedGestureEvent(ArkUIRuntimeCallInfo* runtimeCallInfo)
1322 {
1323     EcmaVM* vm = runtimeCallInfo->GetVM();
1324     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1325     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1326     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1327     GetArkUINodeModifiers()->getWebModifier()->resetOnNativeEmbedGestureEvent(nativeNode);
1328     return panda::JSValueRef::Undefined(vm);
1329 }
1330 
SetRegisterNativeEmbedRule(ArkUIRuntimeCallInfo * runtimeCallInfo)1331 ArkUINativeModuleValue WebBridge::SetRegisterNativeEmbedRule(ArkUIRuntimeCallInfo* runtimeCallInfo)
1332 {
1333     EcmaVM* vm = runtimeCallInfo->GetVM();
1334     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1335     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1336     Local<JSValueRef> tagArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
1337     Local<JSValueRef> typeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_2);
1338     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1339     std::string tag;
1340     std::string type;
1341     if (!tagArg->IsNull() && !tagArg->IsUndefined() && tagArg->IsString(vm)) {
1342         tag = tagArg->ToString(vm)->ToString(vm);
1343     }
1344     if (!typeArg->IsNull() && !typeArg->IsUndefined() && typeArg->IsString(vm)) {
1345         type = typeArg->ToString(vm)->ToString(vm);
1346     }
1347     GetArkUINodeModifiers()->getWebModifier()->setRegisterNativeEmbedRule(nativeNode, tag.c_str(), type.c_str());
1348     return panda::JSValueRef::Undefined(vm);
1349 }
1350 
ResetRegisterNativeEmbedRule(ArkUIRuntimeCallInfo * runtimeCallInfo)1351 ArkUINativeModuleValue WebBridge::ResetRegisterNativeEmbedRule(ArkUIRuntimeCallInfo* runtimeCallInfo)
1352 {
1353     EcmaVM* vm = runtimeCallInfo->GetVM();
1354     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1355     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1356     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1357     GetArkUINodeModifiers()->getWebModifier()->resetRegisterNativeEmbedRule(nativeNode);
1358     return panda::JSValueRef::Undefined(vm);
1359 }
1360 
SetNativeEmbedOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)1361 ArkUINativeModuleValue WebBridge::SetNativeEmbedOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
1362 {
1363     EcmaVM* vm = runtimeCallInfo->GetVM();
1364     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1365     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1366     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
1367     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1368     bool enable = secondArg->ToBoolean(vm)->Value();
1369     GetArkUINodeModifiers()->getWebModifier()->setNativeEmbedOptions(nativeNode, enable);
1370     return panda::JSValueRef::Undefined(vm);
1371 }
1372 
ResetNativeEmbedOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)1373 ArkUINativeModuleValue WebBridge::ResetNativeEmbedOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
1374 {
1375     EcmaVM* vm = runtimeCallInfo->GetVM();
1376     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1377     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1378     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1379     GetArkUINodeModifiers()->getWebModifier()->resetNativeEmbedOptions(nativeNode);
1380     return panda::JSValueRef::Undefined(vm);
1381 }
1382 
SetOnFirstContentfulPaint(ArkUIRuntimeCallInfo * runtimeCallInfo)1383 ArkUINativeModuleValue WebBridge::SetOnFirstContentfulPaint(ArkUIRuntimeCallInfo* runtimeCallInfo)
1384 {
1385     EcmaVM* vm = runtimeCallInfo->GetVM();
1386     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1387     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1388     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
1389     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1390     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1391         GetArkUINodeModifiers()->getWebModifier()->resetOnFirstContentfulPaint(nativeNode);
1392         return panda::JSValueRef::Undefined(vm);
1393     }
1394     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1395     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::Undefined(vm));
1396     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1397     std::function<void(FirstContentfulPaintEvent&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
1398                                                                    func = panda::CopyableGlobal(vm, func)](
1399                                                                    FirstContentfulPaintEvent& event) -> void {
1400         panda::LocalScope pandaScope(vm);
1401         panda::TryCatch trycatch(vm);
1402         PipelineContext::SetCallBackNode(weak);
1403         const char* keys[] = { "navigationStartTick", "firstContentfulPaintMs" };
1404         Local<JSValueRef> values[] = { panda::NumberRef::New(vm, static_cast<int64_t>(event.GetNavigationStartTick())),
1405             panda::NumberRef::New(vm, static_cast<int64_t>(event.GetFirstContentfulPaintMs())) };
1406         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1407         eventObject->SetNativePointerFieldCount(vm, CALL_ARG_1);
1408         eventObject->SetNativePointerField(vm, CALL_ARG_0, static_cast<void*>(&event));
1409         panda::Local<panda::JSValueRef> params[1] = { eventObject };
1410         func->Call(vm, func.ToLocal(), params, CALL_ARG_1);
1411     };
1412     GetArkUINodeModifiers()->getWebModifier()->setOnFirstContentfulPaint(
1413         nativeNode, reinterpret_cast<void*>(&callback));
1414     return panda::JSValueRef::Undefined(vm);
1415 }
1416 
ResetOnFirstContentfulPaint(ArkUIRuntimeCallInfo * runtimeCallInfo)1417 ArkUINativeModuleValue WebBridge::ResetOnFirstContentfulPaint(ArkUIRuntimeCallInfo* runtimeCallInfo)
1418 {
1419     EcmaVM* vm = runtimeCallInfo->GetVM();
1420     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1421     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1422     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1423     GetArkUINodeModifiers()->getWebModifier()->resetOnFirstContentfulPaint(nativeNode);
1424     return panda::JSValueRef::Undefined(vm);
1425 }
1426 
SetOnAudioStateChanged(ArkUIRuntimeCallInfo * runtimeCallInfo)1427 ArkUINativeModuleValue WebBridge::SetOnAudioStateChanged(ArkUIRuntimeCallInfo* runtimeCallInfo)
1428 {
1429     EcmaVM* vm = runtimeCallInfo->GetVM();
1430     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1431     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1432     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
1433     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
1434     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1435     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1436     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1437         GetArkUINodeModifiers()->getWebModifier()->resetOnAudioStateChanged(nativeNode);
1438         return panda::JSValueRef::Undefined(vm);
1439     }
1440     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1441     std::function<void(AudioStateChangedEvent&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
1442                                                                 func = panda::CopyableGlobal(vm, func)](
1443                                                                 AudioStateChangedEvent& event) {
1444         panda::LocalScope pandaScope(vm);
1445         panda::TryCatch trycatch(vm);
1446         PipelineContext::SetCallBackNode(weak);
1447         const char* keys[] = { "playing" };
1448         Local<JSValueRef> values[] = {
1449             panda::BooleanRef::New(vm, event.IsPlaying()),
1450         };
1451         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1452         eventObject->SetNativePointerFieldCount(vm, CALL_ARG_1);
1453         eventObject->SetNativePointerField(vm, CALL_ARG_0, static_cast<void*>(&event));
1454         panda::Local<panda::JSValueRef> params[1] = { eventObject };
1455         func->Call(vm, func.ToLocal(), params, CALL_ARG_1);
1456     };
1457     GetArkUINodeModifiers()->getWebModifier()->setOnAudioStateChanged(nativeNode, reinterpret_cast<void*>(&callback));
1458     return panda::JSValueRef::Undefined(vm);
1459 }
1460 
ResetOnAudioStateChanged(ArkUIRuntimeCallInfo * runtimeCallInfo)1461 ArkUINativeModuleValue WebBridge::ResetOnAudioStateChanged(ArkUIRuntimeCallInfo* runtimeCallInfo)
1462 {
1463     EcmaVM* vm = runtimeCallInfo->GetVM();
1464     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1465     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1466     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1467     GetArkUINodeModifiers()->getWebModifier()->resetOnAudioStateChanged(nativeNode);
1468     return panda::JSValueRef::Undefined(vm);
1469 }
1470 
SetOnFullScreenExit(ArkUIRuntimeCallInfo * runtimeCallInfo)1471 ArkUINativeModuleValue WebBridge::SetOnFullScreenExit(ArkUIRuntimeCallInfo* runtimeCallInfo)
1472 {
1473     EcmaVM* vm = runtimeCallInfo->GetVM();
1474     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1475     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1476     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
1477     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
1478     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1479         GetArkUINodeModifiers()->getWebModifier()->resetOnFullScreenExit(nativeNode);
1480         return panda::JSValueRef::Undefined(vm);
1481     }
1482     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1483     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1484     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1485     std::function<void()> callback = [vm, weak = AceType::WeakClaim(frameNode),
1486                                          func = panda::CopyableGlobal(vm, func)]() {
1487         panda::LocalScope pandaScope(vm);
1488         panda::TryCatch trycatch(vm);
1489         PipelineContext::SetCallBackNode(weak);
1490         func->Call(vm, func.ToLocal(), nullptr, CALL_ARG_0);
1491     };
1492     GetArkUINodeModifiers()->getWebModifier()->setOnFullScreenExit(nativeNode, reinterpret_cast<void*>(&callback));
1493     return panda::JSValueRef::Undefined(vm);
1494 }
1495 
ResetOnFullScreenExit(ArkUIRuntimeCallInfo * runtimeCallInfo)1496 ArkUINativeModuleValue WebBridge::ResetOnFullScreenExit(ArkUIRuntimeCallInfo* runtimeCallInfo)
1497 {
1498     EcmaVM* vm = runtimeCallInfo->GetVM();
1499     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1500     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1501     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1502     GetArkUINodeModifiers()->getWebModifier()->resetOnFullScreenExit(nativeNode);
1503     return panda::JSValueRef::Undefined(vm);
1504 }
1505 
SetImageAccess(ArkUIRuntimeCallInfo * runtimeCallInfo)1506 ArkUINativeModuleValue WebBridge::SetImageAccess(ArkUIRuntimeCallInfo* runtimeCallInfo)
1507 {
1508     EcmaVM* vm = runtimeCallInfo->GetVM();
1509     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1510     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1511     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
1512     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1513     if (secondArg->IsBoolean()) {
1514         bool enable = secondArg->ToBoolean(vm)->Value();
1515         GetArkUINodeModifiers()->getWebModifier()->setImageAccess(nativeNode, enable);
1516     } else {
1517         GetArkUINodeModifiers()->getWebModifier()->resetImageAccess(nativeNode);
1518     }
1519     return panda::JSValueRef::Undefined(vm);
1520 }
1521 
ResetImageAccess(ArkUIRuntimeCallInfo * runtimeCallInfo)1522 ArkUINativeModuleValue WebBridge::ResetImageAccess(ArkUIRuntimeCallInfo* runtimeCallInfo)
1523 {
1524     EcmaVM* vm = runtimeCallInfo->GetVM();
1525     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1526     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1527     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1528     GetArkUINodeModifiers()->getWebModifier()->resetImageAccess(nativeNode);
1529     return panda::JSValueRef::Undefined(vm);
1530 }
1531 
SetOnlineImageAccess(ArkUIRuntimeCallInfo * runtimeCallInfo)1532 ArkUINativeModuleValue WebBridge::SetOnlineImageAccess(ArkUIRuntimeCallInfo* runtimeCallInfo)
1533 {
1534     EcmaVM* vm = runtimeCallInfo->GetVM();
1535     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1536     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1537     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
1538     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1539     if (secondArg->IsBoolean()) {
1540         bool enable = secondArg->ToBoolean(vm)->Value();
1541         GetArkUINodeModifiers()->getWebModifier()->setOnlineImageAccess(nativeNode, enable);
1542     } else {
1543         GetArkUINodeModifiers()->getWebModifier()->resetOnlineImageAccess(nativeNode);
1544     }
1545     return panda::JSValueRef::Undefined(vm);
1546 }
1547 
ResetOnlineImageAccess(ArkUIRuntimeCallInfo * runtimeCallInfo)1548 ArkUINativeModuleValue WebBridge::ResetOnlineImageAccess(ArkUIRuntimeCallInfo* runtimeCallInfo)
1549 {
1550     EcmaVM* vm = runtimeCallInfo->GetVM();
1551     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1552     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1553     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1554     GetArkUINodeModifiers()->getWebModifier()->resetOnlineImageAccess(nativeNode);
1555     return panda::JSValueRef::Undefined(vm);
1556 }
1557 
SetMediaPlayGestureAccess(ArkUIRuntimeCallInfo * runtimeCallInfo)1558 ArkUINativeModuleValue WebBridge::SetMediaPlayGestureAccess(ArkUIRuntimeCallInfo* runtimeCallInfo)
1559 {
1560     EcmaVM* vm = runtimeCallInfo->GetVM();
1561     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1562     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1563     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
1564     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1565     if (secondArg->IsBoolean()) {
1566         bool enable = secondArg->ToBoolean(vm)->Value();
1567         GetArkUINodeModifiers()->getWebModifier()->setMediaPlayGestureAccess(nativeNode, enable);
1568     } else {
1569         GetArkUINodeModifiers()->getWebModifier()->resetMediaPlayGestureAccess(nativeNode);
1570     }
1571     return panda::JSValueRef::Undefined(vm);
1572 }
1573 
ResetMediaPlayGestureAccess(ArkUIRuntimeCallInfo * runtimeCallInfo)1574 ArkUINativeModuleValue WebBridge::ResetMediaPlayGestureAccess(ArkUIRuntimeCallInfo* runtimeCallInfo)
1575 {
1576     EcmaVM* vm = runtimeCallInfo->GetVM();
1577     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1578     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1579     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1580     GetArkUINodeModifiers()->getWebModifier()->resetMediaPlayGestureAccess(nativeNode);
1581     return panda::JSValueRef::Undefined(vm);
1582 }
1583 
SetMediaOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)1584 ArkUINativeModuleValue WebBridge::SetMediaOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
1585 {
1586     EcmaVM* vm = runtimeCallInfo->GetVM();
1587     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1588     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1589     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
1590     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_2);
1591     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1592     if (!secondArg->IsNumber() && !thirdArg->IsBoolean()) {
1593         return panda::JSValueRef::Undefined(vm);
1594     }
1595     int mode = secondArg->Int32Value(vm);
1596     bool enable = thirdArg->ToBoolean(vm)->Value();
1597     GetArkUINodeModifiers()->getWebModifier()->setMediaOptions(nativeNode, mode, enable);
1598     return panda::JSValueRef::Undefined(vm);
1599 }
1600 
ResetMediaOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)1601 ArkUINativeModuleValue WebBridge::ResetMediaOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
1602 {
1603     EcmaVM* vm = runtimeCallInfo->GetVM();
1604     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1605     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1606     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1607     GetArkUINodeModifiers()->getWebModifier()->resetMediaOptions(nativeNode);
1608     return panda::JSValueRef::Undefined(vm);
1609 }
1610 
SetOnPageEnd(ArkUIRuntimeCallInfo * runtimeCallInfo)1611 ArkUINativeModuleValue WebBridge::SetOnPageEnd(ArkUIRuntimeCallInfo* runtimeCallInfo)
1612 {
1613     EcmaVM* vm = runtimeCallInfo->GetVM();
1614     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1615     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1616     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
1617     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1618     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
1619     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1620     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1621     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1622         GetArkUINodeModifiers()->getWebModifier()->resetOnPageEnd(nativeNode);
1623         return panda::JSValueRef::Undefined(vm);
1624     }
1625     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1626     std::function<void(LoadWebPageFinishEvent&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
1627                                                                 func = panda::CopyableGlobal(vm, func)](
1628                                                                 LoadWebPageFinishEvent& event) {
1629         panda::LocalScope pandaScope(vm);
1630         panda::TryCatch trycatch(vm);
1631         PipelineContext::SetCallBackNode(weak);
1632         const char* keys[] = { "url" };
1633         Local<JSValueRef> values[] = {
1634             panda::StringRef::NewFromUtf8(vm, event.GetLoadedUrl().c_str()),
1635         };
1636         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1637         eventObject->SetNativePointerFieldCount(vm, CALL_ARG_1);
1638         eventObject->SetNativePointerField(vm, CALL_ARG_0, static_cast<void*>(&event));
1639         panda::Local<panda::JSValueRef> params[1] = { eventObject };
1640         func->Call(vm, func.ToLocal(), params, CALL_ARG_1);
1641     };
1642     GetArkUINodeModifiers()->getWebModifier()->setOnPageEnd(nativeNode, reinterpret_cast<void*>(&callback));
1643     return panda::JSValueRef::Undefined(vm);
1644 }
1645 
ResetOnPageEnd(ArkUIRuntimeCallInfo * runtimeCallInfo)1646 ArkUINativeModuleValue WebBridge::ResetOnPageEnd(ArkUIRuntimeCallInfo* runtimeCallInfo)
1647 {
1648     EcmaVM* vm = runtimeCallInfo->GetVM();
1649     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1650     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1651     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1652     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1653     GetArkUINodeModifiers()->getWebModifier()->resetOnPageEnd(nativeNode);
1654     return panda::JSValueRef::Undefined(vm);
1655 }
1656 
SetOnPageBegin(ArkUIRuntimeCallInfo * runtimeCallInfo)1657 ArkUINativeModuleValue WebBridge::SetOnPageBegin(ArkUIRuntimeCallInfo* runtimeCallInfo)
1658 {
1659     EcmaVM* vm = runtimeCallInfo->GetVM();
1660     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1661     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1662     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
1663     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1664     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
1665     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1666     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1667     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1668         GetArkUINodeModifiers()->getWebModifier()->resetOnPageBegin(nativeNode);
1669         return panda::JSValueRef::Undefined(vm);
1670     }
1671     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1672     std::function<void(LoadWebPageStartEvent&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
1673                                                                func = panda::CopyableGlobal(vm, func)](
1674                                                                LoadWebPageStartEvent& event) {
1675         panda::LocalScope pandaScope(vm);
1676         panda::TryCatch trycatch(vm);
1677         PipelineContext::SetCallBackNode(weak);
1678         const char* keys[] = { "url" };
1679         Local<JSValueRef> values[] = {
1680             panda::StringRef::NewFromUtf8(vm, event.GetLoadedUrl().c_str()),
1681         };
1682         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1683         eventObject->SetNativePointerFieldCount(vm, CALL_ARG_1);
1684         eventObject->SetNativePointerField(vm, CALL_ARG_0, static_cast<void*>(&event));
1685         panda::Local<panda::JSValueRef> params[1] = { eventObject };
1686         func->Call(vm, func.ToLocal(), params, CALL_ARG_1);
1687     };
1688     GetArkUINodeModifiers()->getWebModifier()->setOnPageBegin(nativeNode, reinterpret_cast<void*>(&callback));
1689     return panda::JSValueRef::Undefined(vm);
1690 }
1691 
ResetOnPageBegin(ArkUIRuntimeCallInfo * runtimeCallInfo)1692 ArkUINativeModuleValue WebBridge::ResetOnPageBegin(ArkUIRuntimeCallInfo* runtimeCallInfo)
1693 {
1694     EcmaVM* vm = runtimeCallInfo->GetVM();
1695     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1696     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1697     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1698     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1699     GetArkUINodeModifiers()->getWebModifier()->resetOnPageBegin(nativeNode);
1700     return panda::JSValueRef::Undefined(vm);
1701 }
1702 
SetOnProgressChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1703 ArkUINativeModuleValue WebBridge::SetOnProgressChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1704 {
1705     EcmaVM* vm = runtimeCallInfo->GetVM();
1706     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1707     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1708     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
1709     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1710     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
1711     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1712     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1713     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1714         GetArkUINodeModifiers()->getWebModifier()->resetOnProgressChange(nativeNode);
1715         return panda::JSValueRef::Undefined(vm);
1716     }
1717     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1718     std::function<void(LoadWebProgressChangeEvent&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
1719                                                                     func = panda::CopyableGlobal(vm, func)](
1720                                                                     LoadWebProgressChangeEvent& event) {
1721         panda::LocalScope pandaScope(vm);
1722         panda::TryCatch trycatch(vm);
1723         PipelineContext::SetCallBackNode(weak);
1724         const char* keys[] = { "newProgress" };
1725         Local<JSValueRef> values[] = {
1726             panda::NumberRef::New(vm, event.GetNewProgress()),
1727         };
1728         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1729         eventObject->SetNativePointerFieldCount(vm, CALL_ARG_1);
1730         eventObject->SetNativePointerField(vm, CALL_ARG_0, static_cast<void*>(&event));
1731         panda::Local<panda::JSValueRef> params[1] = { eventObject };
1732         func->Call(vm, func.ToLocal(), params, CALL_ARG_1);
1733     };
1734     GetArkUINodeModifiers()->getWebModifier()->setOnProgressChange(nativeNode, reinterpret_cast<void*>(&callback));
1735     return panda::JSValueRef::Undefined(vm);
1736 }
1737 
ResetOnProgressChange(ArkUIRuntimeCallInfo * runtimeCallInfo)1738 ArkUINativeModuleValue WebBridge::ResetOnProgressChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
1739 {
1740     EcmaVM* vm = runtimeCallInfo->GetVM();
1741     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1742     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1743     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1744     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1745     GetArkUINodeModifiers()->getWebModifier()->resetOnProgressChange(nativeNode);
1746     return panda::JSValueRef::Undefined(vm);
1747 }
1748 
SetOnTitleReceive(ArkUIRuntimeCallInfo * runtimeCallInfo)1749 ArkUINativeModuleValue WebBridge::SetOnTitleReceive(ArkUIRuntimeCallInfo* runtimeCallInfo)
1750 {
1751     EcmaVM* vm = runtimeCallInfo->GetVM();
1752     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1753     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1754     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
1755     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1756     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
1757     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1758     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1759     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1760         GetArkUINodeModifiers()->getWebModifier()->resetOnTitleReceive(nativeNode);
1761         return panda::JSValueRef::Undefined(vm);
1762     }
1763     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1764     std::function<void(LoadWebTitleReceiveEvent&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
1765                                                                   func = panda::CopyableGlobal(vm, func)](
1766                                                                   LoadWebTitleReceiveEvent& event) {
1767         panda::LocalScope pandaScope(vm);
1768         panda::TryCatch trycatch(vm);
1769         PipelineContext::SetCallBackNode(weak);
1770         const char* keys[] = { "title" };
1771         Local<JSValueRef> values[] = {
1772             panda::StringRef::NewFromUtf8(vm, event.GetTitle().c_str()),
1773         };
1774         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1775         eventObject->SetNativePointerFieldCount(vm, CALL_ARG_1);
1776         eventObject->SetNativePointerField(vm, CALL_ARG_0, static_cast<void*>(&event));
1777         panda::Local<panda::JSValueRef> params[1] = { eventObject };
1778         func->Call(vm, func.ToLocal(), params, CALL_ARG_1);
1779     };
1780     GetArkUINodeModifiers()->getWebModifier()->setOnTitleReceive(nativeNode, reinterpret_cast<void*>(&callback));
1781     return panda::JSValueRef::Undefined(vm);
1782 }
1783 
ResetOnTitleReceive(ArkUIRuntimeCallInfo * runtimeCallInfo)1784 ArkUINativeModuleValue WebBridge::ResetOnTitleReceive(ArkUIRuntimeCallInfo* runtimeCallInfo)
1785 {
1786     EcmaVM* vm = runtimeCallInfo->GetVM();
1787     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1788     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1789     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1790     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1791     GetArkUINodeModifiers()->getWebModifier()->resetOnTitleReceive(nativeNode);
1792     return panda::JSValueRef::Undefined(vm);
1793 }
1794 
SetOnDownloadStart(ArkUIRuntimeCallInfo * runtimeCallInfo)1795 ArkUINativeModuleValue WebBridge::SetOnDownloadStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
1796 {
1797     EcmaVM* vm = runtimeCallInfo->GetVM();
1798     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1799     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1800     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
1801     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1802     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
1803     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1804     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1805     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1806         GetArkUINodeModifiers()->getWebModifier()->resetOnTitleReceive(nativeNode);
1807         return panda::JSValueRef::Undefined(vm);
1808     }
1809     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1810     std::function<void(DownloadStartEvent&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
1811                                                             func = panda::CopyableGlobal(vm, func)](
1812                                                             DownloadStartEvent& event) {
1813         panda::LocalScope pandaScope(vm);
1814         panda::TryCatch trycatch(vm);
1815         PipelineContext::SetCallBackNode(weak);
1816         const char* keys[] = { "url", "userAgent", "contentDisposition", "mimetype", "contentLength" };
1817         Local<JSValueRef> values[] = {
1818             panda::StringRef::NewFromUtf8(vm, event.GetUrl().c_str()),
1819             panda::StringRef::NewFromUtf8(vm, event.GetUserAgent().c_str()),
1820             panda::StringRef::NewFromUtf8(vm, event.GetContentDisposition().c_str()),
1821             panda::StringRef::NewFromUtf8(vm, event.GetMimetype().c_str()),
1822             panda::NumberRef::New(vm, static_cast<double>(event.GetContentLength())),
1823         };
1824         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1825         eventObject->SetNativePointerFieldCount(vm, CALL_ARG_1);
1826         eventObject->SetNativePointerField(vm, CALL_ARG_0, static_cast<void*>(&event));
1827         panda::Local<panda::JSValueRef> params[1] = { eventObject };
1828         func->Call(vm, func.ToLocal(), params, CALL_ARG_1);
1829     };
1830     GetArkUINodeModifiers()->getWebModifier()->setOnDownloadStart(nativeNode, reinterpret_cast<void*>(&callback));
1831     return panda::JSValueRef::Undefined(vm);
1832 }
1833 
ResetOnDownloadStart(ArkUIRuntimeCallInfo * runtimeCallInfo)1834 ArkUINativeModuleValue WebBridge::ResetOnDownloadStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
1835 {
1836     EcmaVM* vm = runtimeCallInfo->GetVM();
1837     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1838     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1839     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1840     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1841     GetArkUINodeModifiers()->getWebModifier()->resetOnDownloadStart(nativeNode);
1842     return panda::JSValueRef::Undefined(vm);
1843 }
1844 
ParseStringToCharPtr(std::string str)1845 ArkUI_CharPtr ParseStringToCharPtr(std::string str)
1846 {
1847     char* script = static_cast<char*>(malloc((str.length() + 1) * sizeof(char)));
1848     CHECK_NULL_RETURN(script, nullptr);
1849     str.copy(script, str.length());
1850     script[str.length()] = END_CHAR;
1851     return script;
1852 }
1853 
ParseReferencedId(EcmaVM * vm,int32_t scriptRuleSize,const panda::Local<panda::ArrayRef> & array,std::vector<ArkUI_CharPtr> & scriptRules)1854 void ParseReferencedId(EcmaVM* vm, int32_t scriptRuleSize,
1855     const panda::Local<panda::ArrayRef>& array, std::vector<ArkUI_CharPtr>& scriptRules)
1856 {
1857     for (int32_t i = 0; i < scriptRuleSize; i++) {
1858         Local<JSValueRef> scriptRule = panda::ArrayRef::GetValueAt(vm, array, i);
1859         if (scriptRule->IsString(vm)) {
1860             std::string str = scriptRule->ToString(vm)->ToString(vm);
1861             scriptRules.push_back(ParseStringToCharPtr(str));
1862         }
1863     }
1864 }
1865 
FreeScriptItemCharPtr(ArkUI_ScriptItemArray * values,ArkUI_Int32 size)1866 void FreeScriptItemCharPtr(ArkUI_ScriptItemArray* values, ArkUI_Int32 size)
1867 {
1868     for (int32_t i = 0; i < size; ++i) {
1869         free(const_cast<char*>(values[i].script));
1870         values[i].script = nullptr;
1871         auto referencedIdChar = values[i].scriptRules;
1872         auto referencedIdSize = values[i].scriptRulesSize;
1873         for (int32_t j = 0; j < referencedIdSize; ++j) {
1874             free(const_cast<char*>(referencedIdChar[j]));
1875             referencedIdChar[j] = nullptr;
1876         }
1877     }
1878 }
1879 
SetJavaScriptCommon(ArkUIRuntimeCallInfo * runtimeCallInfo,std::function<void (ArkUINodeHandle,ArkUI_ScriptItemArray *,int32_t)> setter,std::function<void (ArkUINodeHandle)> resetter)1880 ArkUINativeModuleValue SetJavaScriptCommon(ArkUIRuntimeCallInfo* runtimeCallInfo,
1881     std::function<void(ArkUINodeHandle, ArkUI_ScriptItemArray*, int32_t)> setter,
1882     std::function<void(ArkUINodeHandle)> resetter)
1883 {
1884     EcmaVM* vm = runtimeCallInfo->GetVM();
1885     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1886     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1887     Local<JSValueRef> scriptsArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
1888     Local<JSValueRef> scriptRulesArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_2);
1889 
1890     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1891     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1892     if (!scriptsArg->IsArray(vm) || !scriptRulesArg->IsArray(vm)) {
1893         resetter(nativeNode);
1894         return panda::JSValueRef::Undefined(vm);
1895     }
1896 
1897     auto scriptsArr = panda::Local<panda::ArrayRef>(scriptsArg);
1898     auto scriptRulesArr = panda::Local<panda::ArrayRef>(scriptRulesArg);
1899     int32_t size = static_cast<int32_t>(scriptsArr->Length(vm));
1900     std::vector<ArkUI_ScriptItemArray> scriptInfos;
1901     std::vector<std::vector<ArkUI_CharPtr>> allScriptRules;
1902 
1903     for (int32_t i = 0; i < size; i++) {
1904         ArkUI_ScriptItemArray info { nullptr, nullptr, 0 };
1905         Local<JSValueRef> scriptVal = panda::ArrayRef::GetValueAt(vm, scriptsArr, i);
1906         if (scriptVal->IsString(vm)) {
1907             std::string str = scriptVal->ToString(vm)->ToString(vm);
1908             info.script = ParseStringToCharPtr(str);
1909         }
1910 
1911         Local<JSValueRef> scriptRulesVal = panda::ArrayRef::GetValueAt(vm, scriptRulesArr, i);
1912         if (scriptRulesVal->IsArray(vm)) {
1913             auto array = panda::Local<panda::ArrayRef>(scriptRulesVal);
1914             uint32_t scriptRuleSize = array->Length(vm);
1915             std::vector<ArkUI_CharPtr> itemRules;
1916             ParseReferencedId(vm, static_cast<int32_t>(scriptRuleSize), array, itemRules);
1917             allScriptRules.push_back(std::move(itemRules));
1918             auto& lastRules = allScriptRules.back();
1919             info.scriptRules = lastRules.data();
1920             info.scriptRulesSize = static_cast<int32_t>(lastRules.size());
1921         }
1922         scriptInfos.push_back(info);
1923     }
1924 
1925     setter(nativeNode, scriptInfos.data(), size);
1926     FreeScriptItemCharPtr(scriptInfos.data(), size);
1927     return panda::JSValueRef::Undefined(vm);
1928 }
1929 
SetJavaScriptOnDocumentStart(ArkUIRuntimeCallInfo * runtimeCallInfo)1930 ArkUINativeModuleValue WebBridge::SetJavaScriptOnDocumentStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
1931 {
1932     auto setter = [](ArkUINodeHandle node, ArkUI_ScriptItemArray* values, int32_t size) {
1933         GetArkUINodeModifiers()->getWebModifier()->setJavaScriptOnDocumentStart(node, values, size);
1934     };
1935     auto resetter = [](ArkUINodeHandle node) {
1936         GetArkUINodeModifiers()->getWebModifier()->resetJavaScriptOnDocumentStart(node);
1937     };
1938     return SetJavaScriptCommon(runtimeCallInfo, setter, resetter);
1939 }
1940 
ResetJavaScriptOnDocumentStart(ArkUIRuntimeCallInfo * runtimeCallInfo)1941 ArkUINativeModuleValue WebBridge::ResetJavaScriptOnDocumentStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
1942 {
1943     EcmaVM* vm = runtimeCallInfo->GetVM();
1944     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1945     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1946     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1947     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1948     GetArkUINodeModifiers()->getWebModifier()->resetJavaScriptOnDocumentStart(nativeNode);
1949     return panda::JSValueRef::Undefined(vm);
1950 }
1951 
SetJavaScriptOnDocumentEnd(ArkUIRuntimeCallInfo * runtimeCallInfo)1952 ArkUINativeModuleValue WebBridge::SetJavaScriptOnDocumentEnd(ArkUIRuntimeCallInfo* runtimeCallInfo)
1953 {
1954     auto setter = [](ArkUINodeHandle node, ArkUI_ScriptItemArray* values, int32_t size) {
1955         GetArkUINodeModifiers()->getWebModifier()->setJavaScriptOnDocumentEnd(node, values, size);
1956     };
1957     auto resetter = [](ArkUINodeHandle node) {
1958         GetArkUINodeModifiers()->getWebModifier()->resetJavaScriptOnDocumentEnd(node);
1959     };
1960     return SetJavaScriptCommon(runtimeCallInfo, setter, resetter);
1961 }
1962 
ResetJavaScriptOnDocumentEnd(ArkUIRuntimeCallInfo * runtimeCallInfo)1963 ArkUINativeModuleValue WebBridge::ResetJavaScriptOnDocumentEnd(ArkUIRuntimeCallInfo* runtimeCallInfo)
1964 {
1965     EcmaVM* vm = runtimeCallInfo->GetVM();
1966     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1967     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1968     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1969     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1970     GetArkUINodeModifiers()->getWebModifier()->resetJavaScriptOnDocumentEnd(nativeNode);
1971     return panda::JSValueRef::Undefined(vm);
1972 }
1973 
SetCopyOptionMode(ArkUIRuntimeCallInfo * runtimeCallInfo)1974 ArkUINativeModuleValue WebBridge::SetCopyOptionMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
1975 {
1976     EcmaVM* vm = runtimeCallInfo->GetVM();
1977     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1978     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1979     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
1980     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1981     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1982     auto copyOptions = CopyOptions::Local;
1983     uint32_t value = static_cast<uint32_t>(copyOptions);
1984     if (secondArg->IsNumber()) {
1985         value = secondArg->Uint32Value(vm);
1986     } else if (!secondArg->IsNumber() && !secondArg->IsUndefined()) {
1987         copyOptions = CopyOptions::Local;
1988         value = static_cast<uint32_t>(copyOptions);
1989     }
1990     GetArkUINodeModifiers()->getWebModifier()->setCopyOptionMode(nativeNode, value);
1991     return panda::JSValueRef::Undefined(vm);
1992 }
1993 
ResetCopyOptionMode(ArkUIRuntimeCallInfo * runtimeCallInfo)1994 ArkUINativeModuleValue WebBridge::ResetCopyOptionMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
1995 {
1996     EcmaVM* vm = runtimeCallInfo->GetVM();
1997     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1998     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
1999     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2000     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2001     GetArkUINodeModifiers()->getWebModifier()->resetCopyOptionMode(nativeNode);
2002     return panda::JSValueRef::Undefined(vm);
2003 }
2004 
SetOnRenderProcessNotResponding(ArkUIRuntimeCallInfo * runtimeCallInfo)2005 ArkUINativeModuleValue WebBridge::SetOnRenderProcessNotResponding(ArkUIRuntimeCallInfo* runtimeCallInfo)
2006 {
2007     EcmaVM* vm = runtimeCallInfo->GetVM();
2008     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2009     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2010     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
2011     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
2012     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
2013     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
2014     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
2015         GetArkUINodeModifiers()->getWebModifier()->resetRenderProcessNotResponding(nativeNode);
2016         return panda::JSValueRef::Undefined(vm);
2017     }
2018     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
2019     std::function<void(RenderProcessNotRespondingEvent&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
2020                                                                          func = panda::CopyableGlobal(vm, func)](
2021                                                                          RenderProcessNotRespondingEvent& event) {
2022         panda::LocalScope pandaScope(vm);
2023         panda::TryCatch trycatch(vm);
2024         PipelineContext::SetCallBackNode(weak);
2025         const char* keys[] = { "jsStack", "pid", "reason"};
2026         Local<JSValueRef> values[] = {
2027             panda::StringRef::NewFromUtf8(vm, event.GetJsStack().c_str()),
2028             panda::NumberRef::New(vm, event.GetPid()),
2029             panda::NumberRef::New(vm, event.GetReason()),
2030         };
2031         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
2032         eventObject->SetNativePointerFieldCount(vm, CALL_ARG_1);
2033         eventObject->SetNativePointerField(vm, CALL_ARG_0, static_cast<void*>(&event));
2034         panda::Local<panda::JSValueRef> params[1] = { eventObject };
2035         func->Call(vm, func.ToLocal(), params, CALL_ARG_1);
2036     };
2037     GetArkUINodeModifiers()->getWebModifier()->setRenderProcessNotResponding(nativeNode, reinterpret_cast<void*>(&callback));
2038     return panda::JSValueRef::Undefined(vm);
2039 }
2040 
ResetOnRenderProcessNotResponding(ArkUIRuntimeCallInfo * runtimeCallInfo)2041 ArkUINativeModuleValue WebBridge::ResetOnRenderProcessNotResponding(ArkUIRuntimeCallInfo* runtimeCallInfo)
2042 {
2043     EcmaVM* vm = runtimeCallInfo->GetVM();
2044     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2045     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2046     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2047     GetArkUINodeModifiers()->getWebModifier()->resetRenderProcessNotResponding(nativeNode);
2048     return panda::JSValueRef::Undefined(vm);
2049 }
2050 
SetOnPageVisible(ArkUIRuntimeCallInfo * runtimeCallInfo)2051 ArkUINativeModuleValue WebBridge::SetOnPageVisible(ArkUIRuntimeCallInfo* runtimeCallInfo)
2052 {
2053     EcmaVM* vm = runtimeCallInfo->GetVM();
2054     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2055     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2056     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
2057     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2058     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2059     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
2060         GetArkUINodeModifiers()->getWebModifier()->resetOnPageVisibleCallBack(nativeNode);
2061         return panda::JSValueRef::Undefined(vm);
2062     }
2063     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
2064     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
2065     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
2066 
2067     std::function<void(PageVisibleEvent&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
2068                                                           func = panda::CopyableGlobal(vm, func)](
2069                                                           PageVisibleEvent& event) {
2070         panda::LocalScope pandaScope(vm);
2071         panda::TryCatch trycatch(vm);
2072         PipelineContext::SetCallBackNode(weak);
2073         auto eventObject = panda::ObjectRef::New(vm);
2074         eventObject->Set(
2075             vm, panda::StringRef::NewFromUtf8(vm, "url"), panda::StringRef::NewFromUtf8(vm, event.GetUrl().c_str()));
2076         panda::Local<panda::JSValueRef> params[1] = { eventObject };
2077         func->Call(vm, func.ToLocal(), params, 1);
2078     };
2079     GetArkUINodeModifiers()->getWebModifier()->setOnPageVisibleCallBack(nativeNode, reinterpret_cast<void*>(&callback));
2080     return panda::JSValueRef::Undefined(vm);
2081 }
2082 
ResetOnPageVisible(ArkUIRuntimeCallInfo * runtimeCallInfo)2083 ArkUINativeModuleValue WebBridge::ResetOnPageVisible(ArkUIRuntimeCallInfo* runtimeCallInfo)
2084 {
2085     EcmaVM* vm = runtimeCallInfo->GetVM();
2086     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2087     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2088     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2089     GetArkUINodeModifiers()->getWebModifier()->resetOnPageVisibleCallBack(nativeNode);
2090     return panda::JSValueRef::Undefined(vm);
2091 }
2092 
SetOnRenderExited(ArkUIRuntimeCallInfo * runtimeCallInfo)2093 ArkUINativeModuleValue WebBridge::SetOnRenderExited(ArkUIRuntimeCallInfo* runtimeCallInfo)
2094 {
2095     EcmaVM* vm = runtimeCallInfo->GetVM();
2096     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2097     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2098     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
2099     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2100     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2101     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
2102         GetArkUINodeModifiers()->getWebModifier()->resetOnRenderExitedCallBack(nativeNode);
2103         return panda::JSValueRef::Undefined(vm);
2104     }
2105     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
2106     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
2107     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
2108 
2109     std::function<void(RenderExitedEvent&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
2110                                                            func = panda::CopyableGlobal(vm, func)](
2111                                                            RenderExitedEvent& event) {
2112         panda::LocalScope pandaScope(vm);
2113         panda::TryCatch trycatch(vm);
2114         PipelineContext::SetCallBackNode(weak);
2115         const char* keys[] = { "renderExitReason" };
2116         Local<JSValueRef> values[] = { panda::NumberRef::New(vm, event.GetExitedReason()) };
2117         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
2118         eventObject->SetNativePointerFieldCount(vm, 1);
2119         eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&event));
2120         panda::Local<panda::JSValueRef> params[1] = { eventObject };
2121         func->Call(vm, func.ToLocal(), params, 1);
2122     };
2123     GetArkUINodeModifiers()->getWebModifier()->setOnRenderExitedCallBack(
2124         nativeNode, reinterpret_cast<void*>(&callback));
2125     return panda::JSValueRef::Undefined(vm);
2126 }
2127 
ResetOnRenderExited(ArkUIRuntimeCallInfo * runtimeCallInfo)2128 ArkUINativeModuleValue WebBridge::ResetOnRenderExited(ArkUIRuntimeCallInfo* runtimeCallInfo)
2129 {
2130     EcmaVM* vm = runtimeCallInfo->GetVM();
2131     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2132     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2133     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2134     GetArkUINodeModifiers()->getWebModifier()->resetOnRenderExitedCallBack(nativeNode);
2135     return panda::JSValueRef::Undefined(vm);
2136 }
2137 
SetBlockNetwork(ArkUIRuntimeCallInfo * runtimeCallInfo)2138 ArkUINativeModuleValue WebBridge::SetBlockNetwork(ArkUIRuntimeCallInfo* runtimeCallInfo)
2139 {
2140     EcmaVM* vm = runtimeCallInfo->GetVM();
2141     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2142     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2143     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
2144     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2145     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2146     if (secondArg->IsBoolean()) {
2147         bool enable = secondArg->ToBoolean(vm)->Value();
2148         GetArkUINodeModifiers()->getWebModifier()->setBlockNetwork(nativeNode, enable);
2149     } else {
2150         GetArkUINodeModifiers()->getWebModifier()->resetBlockNetwork(nativeNode);
2151     }
2152     return panda::JSValueRef::Undefined(vm);
2153 }
2154 
ResetBlockNetwork(ArkUIRuntimeCallInfo * runtimeCallInfo)2155 ArkUINativeModuleValue WebBridge::ResetBlockNetwork(ArkUIRuntimeCallInfo* runtimeCallInfo)
2156 {
2157     EcmaVM* vm = runtimeCallInfo->GetVM();
2158     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2159     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2160     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2161     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2162     GetArkUINodeModifiers()->getWebModifier()->resetBlockNetwork(nativeNode);
2163     return panda::JSValueRef::Undefined(vm);
2164 }
2165 
SetOnResourceLoad(ArkUIRuntimeCallInfo * runtimeCallInfo)2166 ArkUINativeModuleValue WebBridge::SetOnResourceLoad(ArkUIRuntimeCallInfo* runtimeCallInfo)
2167 {
2168     EcmaVM* vm = runtimeCallInfo->GetVM();
2169     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2170     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2171     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
2172     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2173     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2174     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
2175         GetArkUINodeModifiers()->getWebModifier()->resetOnResourceLoadCallBack(nativeNode);
2176         return panda::JSValueRef::Undefined(vm);
2177     }
2178     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
2179     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
2180     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
2181 
2182     std::function<void(ResourceLoadEvent&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
2183                                                            func = panda::CopyableGlobal(vm, func)](
2184                                                            ResourceLoadEvent& event) {
2185         panda::LocalScope pandaScope(vm);
2186         panda::TryCatch trycatch(vm);
2187         PipelineContext::SetCallBackNode(weak);
2188         auto eventObject = panda::ObjectRef::New(vm);
2189         eventObject->Set(vm, panda::StringRef::NewFromUtf8(vm, "url"),
2190             panda::StringRef::NewFromUtf8(vm, event.GetOnResourceLoadUrl().c_str()));
2191         panda::Local<panda::JSValueRef> params[1] = { eventObject };
2192         func->Call(vm, func.ToLocal(), params, 1);
2193     };
2194     GetArkUINodeModifiers()->getWebModifier()->setOnResourceLoadCallBack(
2195         nativeNode, reinterpret_cast<void*>(&callback));
2196     return panda::JSValueRef::Undefined(vm);
2197 }
2198 
ResetOnResourceLoad(ArkUIRuntimeCallInfo * runtimeCallInfo)2199 ArkUINativeModuleValue WebBridge::ResetOnResourceLoad(ArkUIRuntimeCallInfo* runtimeCallInfo)
2200 {
2201     EcmaVM* vm = runtimeCallInfo->GetVM();
2202     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2203     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2204     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2205     GetArkUINodeModifiers()->getWebModifier()->resetOnResourceLoadCallBack(nativeNode);
2206     return panda::JSValueRef::Undefined(vm);
2207 }
2208 
SetOnRefreshAccessedHistory(ArkUIRuntimeCallInfo * runtimeCallInfo)2209 ArkUINativeModuleValue WebBridge::SetOnRefreshAccessedHistory(ArkUIRuntimeCallInfo* runtimeCallInfo)
2210 {
2211     EcmaVM* vm = runtimeCallInfo->GetVM();
2212     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2213     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2214     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
2215     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2216     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2217     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
2218         GetArkUINodeModifiers()->getWebModifier()->resetOnRefreshAccessedHistoryCallBack(nativeNode);
2219         return panda::JSValueRef::Undefined(vm);
2220     }
2221     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
2222     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
2223     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
2224 
2225     std::function<void(RefreshAccessedHistoryEvent&)> callback =
2226         [vm, weak = AceType::WeakClaim(frameNode),
2227             func = panda::CopyableGlobal(vm, func)](RefreshAccessedHistoryEvent& event) {
2228             panda::LocalScope pandaScope(vm);
2229             panda::TryCatch trycatch(vm);
2230             PipelineContext::SetCallBackNode(weak);
2231             const char* keys[] = { "url", "isRefreshed" };
2232             Local<JSValueRef> values[] = { panda::StringRef::NewFromUtf8(vm, event.GetVisitedUrl().c_str()),
2233                 panda::BooleanRef::New(vm, event.IsRefreshed()) };
2234             auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
2235             eventObject->SetNativePointerFieldCount(vm, 1);
2236             eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&event));
2237             panda::Local<panda::JSValueRef> params[1] = { eventObject };
2238             func->Call(vm, func.ToLocal(), params, 1);
2239         };
2240     GetArkUINodeModifiers()->getWebModifier()->setOnRefreshAccessedHistoryCallBack(
2241         nativeNode, reinterpret_cast<void*>(&callback));
2242     return panda::JSValueRef::Undefined(vm);
2243 }
2244 
ResetOnRefreshAccessedHistory(ArkUIRuntimeCallInfo * runtimeCallInfo)2245 ArkUINativeModuleValue WebBridge::ResetOnRefreshAccessedHistory(ArkUIRuntimeCallInfo* runtimeCallInfo)
2246 {
2247     EcmaVM* vm = runtimeCallInfo->GetVM();
2248     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2249     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2250     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2251     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2252     GetArkUINodeModifiers()->getWebModifier()->resetOnRefreshAccessedHistoryCallBack(nativeNode);
2253     return panda::JSValueRef::Undefined(vm);
2254 }
2255 
SetOnNavigationEntryCommitted(ArkUIRuntimeCallInfo * runtimeCallInfo)2256 ArkUINativeModuleValue WebBridge::SetOnNavigationEntryCommitted(ArkUIRuntimeCallInfo* runtimeCallInfo)
2257 {
2258     EcmaVM* vm = runtimeCallInfo->GetVM();
2259     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2260     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2261     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
2262     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2263     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2264     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
2265         GetArkUINodeModifiers()->getWebModifier()->resetOnNavigationEntryCommittedCallBack(nativeNode);
2266         return panda::JSValueRef::Undefined(vm);
2267     }
2268     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
2269     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
2270     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
2271 
2272     std::function<void(NavigationEntryCommittedEvent&)> callback =
2273         [vm, weak = AceType::WeakClaim(frameNode),
2274             func = panda::CopyableGlobal(vm, func)](NavigationEntryCommittedEvent& event) {
2275             panda::LocalScope pandaScope(vm);
2276             panda::TryCatch trycatch(vm);
2277             PipelineContext::SetCallBackNode(weak);
2278             const char* keys[] = { "isMainFrame", "isSameDocument", "didReplaceEntry", "navigationType", "url" };
2279             Local<JSValueRef> values[] = { panda::BooleanRef::New(vm, event.IsMainFrame()),
2280                 panda::BooleanRef::New(vm, event.IsSameDocument()), panda::BooleanRef::New(vm, event.DidReplaceEntry()),
2281                 panda::NumberRef::New(vm, static_cast<int>(event.GetNavigationType())),
2282                 panda::StringRef::NewFromUtf8(vm, event.GetUrl().c_str()) };
2283             auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
2284             eventObject->SetNativePointerFieldCount(vm, 1);
2285             eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&event));
2286             panda::Local<panda::JSValueRef> params[1] = { eventObject };
2287             func->Call(vm, func.ToLocal(), params, 1);
2288         };
2289     GetArkUINodeModifiers()->getWebModifier()->setOnNavigationEntryCommittedCallBack(
2290         nativeNode, reinterpret_cast<void*>(&callback));
2291     return panda::JSValueRef::Undefined(vm);
2292 }
2293 
ResetOnNavigationEntryCommitted(ArkUIRuntimeCallInfo * runtimeCallInfo)2294 ArkUINativeModuleValue WebBridge::ResetOnNavigationEntryCommitted(ArkUIRuntimeCallInfo* runtimeCallInfo)
2295 {
2296     EcmaVM* vm = runtimeCallInfo->GetVM();
2297     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2298     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2299     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2300     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2301     GetArkUINodeModifiers()->getWebModifier()->resetOnNavigationEntryCommittedCallBack(nativeNode);
2302     return panda::JSValueRef::Undefined(vm);
2303 }
2304 
SetOnSearchResultReceive(ArkUIRuntimeCallInfo * runtimeCallInfo)2305 ArkUINativeModuleValue WebBridge::SetOnSearchResultReceive(ArkUIRuntimeCallInfo* runtimeCallInfo)
2306 {
2307     EcmaVM* vm = runtimeCallInfo->GetVM();
2308     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2309     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2310     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
2311     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2312     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2313     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
2314         GetArkUINodeModifiers()->getWebModifier()->resetOnSearchResultReceiveCallBack(nativeNode);
2315         return panda::JSValueRef::Undefined(vm);
2316     }
2317     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
2318     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
2319     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
2320 
2321     std::function<void(SearchResultReceiveEvent&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
2322                                                                   func = panda::CopyableGlobal(vm, func)](
2323                                                                   SearchResultReceiveEvent& event) {
2324         panda::LocalScope pandaScope(vm);
2325         panda::TryCatch trycatch(vm);
2326         PipelineContext::SetCallBackNode(weak);
2327         const char* keys[] = { "activeMatchOrdinal", "numberOfMatches", "isDoneCounting" };
2328         Local<JSValueRef> values[] = { panda::NumberRef::New(vm, event.GetActiveMatchOrdinal()),
2329             panda::NumberRef::New(vm, event.GetNumberOfMatches()),
2330             panda::BooleanRef::New(vm, event.GetIsDoneCounting()) };
2331         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
2332         panda::Local<panda::JSValueRef> params[1] = { eventObject };
2333         func->Call(vm, func.ToLocal(), params, 1);
2334     };
2335     GetArkUINodeModifiers()->getWebModifier()->setOnSearchResultReceiveCallBack(
2336         nativeNode, reinterpret_cast<void*>(&callback));
2337     return panda::JSValueRef::Undefined(vm);
2338 }
2339 
ResetOnSearchResultReceive(ArkUIRuntimeCallInfo * runtimeCallInfo)2340 ArkUINativeModuleValue WebBridge::ResetOnSearchResultReceive(ArkUIRuntimeCallInfo* runtimeCallInfo)
2341 {
2342     EcmaVM* vm = runtimeCallInfo->GetVM();
2343     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2344     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2345     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2346     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2347     GetArkUINodeModifiers()->getWebModifier()->resetOnSearchResultReceiveCallBack(nativeNode);
2348     return panda::JSValueRef::Undefined(vm);
2349 }
2350 
SetOverScrollMode(ArkUIRuntimeCallInfo * runtimeCallInfo)2351 ArkUINativeModuleValue WebBridge::SetOverScrollMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
2352 {
2353     EcmaVM* vm = runtimeCallInfo->GetVM();
2354     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2355     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2356     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
2357     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2358     int mode = secondArg->Int32Value(vm);
2359     GetArkUINodeModifiers()->getWebModifier()->setOverScrollMode(nativeNode, mode);
2360     return panda::JSValueRef::Undefined(vm);
2361 }
2362 
ResetOverScrollMode(ArkUIRuntimeCallInfo * runtimeCallInfo)2363 ArkUINativeModuleValue WebBridge::ResetOverScrollMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
2364 {
2365     EcmaVM* vm = runtimeCallInfo->GetVM();
2366     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2367     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2368     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2369     GetArkUINodeModifiers()->getWebModifier()->resetOverScrollMode(nativeNode);
2370     return panda::JSValueRef::Undefined(vm);
2371 }
2372 
SetOnTouchIconUrlReceived(ArkUIRuntimeCallInfo * runtimeCallInfo)2373 ArkUINativeModuleValue WebBridge::SetOnTouchIconUrlReceived(ArkUIRuntimeCallInfo* runtimeCallInfo)
2374 {
2375     EcmaVM* vm = runtimeCallInfo->GetVM();
2376     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2377     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2378     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
2379     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2380     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2381     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
2382         GetArkUINodeModifiers()->getWebModifier()->resetOnTouchIconUrlReceivedCallBack(nativeNode);
2383         return panda::JSValueRef::Undefined(vm);
2384     }
2385     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
2386     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
2387     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
2388 
2389     std::function<void(TouchIconUrlEvent&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
2390                                                            func = panda::CopyableGlobal(vm, func)](
2391                                                            TouchIconUrlEvent& event) {
2392         panda::LocalScope pandaScope(vm);
2393         panda::TryCatch trycatch(vm);
2394         PipelineContext::SetCallBackNode(weak);
2395         const char* keys[] = { "url", "precomposed" };
2396         Local<JSValueRef> values[] = { panda::StringRef::NewFromUtf8(vm, event.GetUrl().c_str()),
2397             panda::BooleanRef::New(vm, event.GetPreComposed()) };
2398         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
2399         eventObject->SetNativePointerFieldCount(vm, 1);
2400         eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&event));
2401         panda::Local<panda::JSValueRef> params[1] = { eventObject };
2402         func->Call(vm, func.ToLocal(), params, 1);
2403     };
2404     GetArkUINodeModifiers()->getWebModifier()->setOnTouchIconUrlReceivedCallBack(
2405         nativeNode, reinterpret_cast<void*>(&callback));
2406     return panda::JSValueRef::Undefined(vm);
2407 }
2408 
ResetOnTouchIconUrlReceived(ArkUIRuntimeCallInfo * runtimeCallInfo)2409 ArkUINativeModuleValue WebBridge::ResetOnTouchIconUrlReceived(ArkUIRuntimeCallInfo* runtimeCallInfo)
2410 {
2411     EcmaVM* vm = runtimeCallInfo->GetVM();
2412     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2413     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2414     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2415     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2416     GetArkUINodeModifiers()->getWebModifier()->resetOnTouchIconUrlReceivedCallBack(nativeNode);
2417     return panda::JSValueRef::Undefined(vm);
2418 }
2419 
SetOnRenderProcessResponding(ArkUIRuntimeCallInfo * runtimeCallInfo)2420 ArkUINativeModuleValue WebBridge::SetOnRenderProcessResponding(ArkUIRuntimeCallInfo* runtimeCallInfo)
2421 {
2422     EcmaVM* vm = runtimeCallInfo->GetVM();
2423     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2424     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2425     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
2426     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2427     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2428     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
2429         GetArkUINodeModifiers()->getWebModifier()->resetOnRenderProcessRespondingCallBack(nativeNode);
2430         return panda::JSValueRef::Undefined(vm);
2431     }
2432     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
2433     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
2434     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
2435 
2436     std::function<void()> callback = [vm, weak = AceType::WeakClaim(frameNode),
2437                                          func = panda::CopyableGlobal(vm, func)]() {
2438         panda::LocalScope pandaScope(vm);
2439         panda::TryCatch trycatch(vm);
2440         PipelineContext::SetCallBackNode(weak);
2441         func->Call(vm, func.ToLocal(), nullptr, 0);
2442     };
2443     GetArkUINodeModifiers()->getWebModifier()->setOnRenderProcessRespondingCallBack(
2444         nativeNode, reinterpret_cast<void*>(&callback));
2445     return panda::JSValueRef::Undefined(vm);
2446 }
2447 
ResetOnRenderProcessResponding(ArkUIRuntimeCallInfo * runtimeCallInfo)2448 ArkUINativeModuleValue WebBridge::ResetOnRenderProcessResponding(ArkUIRuntimeCallInfo* runtimeCallInfo)
2449 {
2450     EcmaVM* vm = runtimeCallInfo->GetVM();
2451     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2452     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2453     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2454     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2455     GetArkUINodeModifiers()->getWebModifier()->resetOnRenderProcessRespondingCallBack(nativeNode);
2456     return panda::JSValueRef::Undefined(vm);
2457 }
2458 
SetOnWindowNew(ArkUIRuntimeCallInfo * runtimeCallInfo)2459 ArkUINativeModuleValue WebBridge::SetOnWindowNew(ArkUIRuntimeCallInfo* runtimeCallInfo)
2460 {
2461     EcmaVM* vm = runtimeCallInfo->GetVM();
2462     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2463     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2464     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
2465     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
2466     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
2467         GetArkUINodeModifiers()->getWebModifier()->resetOnWindowNew(nativeNode);
2468         return panda::JSValueRef::Undefined(vm);
2469     }
2470     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
2471     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
2472     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
2473     std::function<void(WebWindowNewEvent&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
2474                                                            func = panda::CopyableGlobal(vm, func)](
2475                                                            WebWindowNewEvent& event) {
2476         panda::LocalScope pandaScope(vm);
2477         panda::TryCatch trycatch(vm);
2478         PipelineContext::SetCallBackNode(weak);
2479         const char* keys[] = { "isAlert", "isUserTrigger", "targeturl", "handler" };
2480         Framework::JSRef<Framework::JSObject> handlerObj = Framework::JSWeb::CreateJSWindowNewHandler(event);
2481         Local<JSValueRef> values[] = { panda::BooleanRef::New(vm, event.IsAlert()),
2482                                        panda::BooleanRef::New(vm, event.IsUserTrigger()),
2483                                        panda::StringRef::NewFromUtf8(vm, event.GetTargetUrl().c_str()),
2484                                        handlerObj->GetLocalHandle() };
2485         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
2486         eventObject->SetNativePointerFieldCount(vm, CALL_ARG_1);
2487         eventObject->SetNativePointerField(vm, CALL_ARG_0, static_cast<void*>(&event));
2488         panda::Local<panda::JSValueRef> params[1] = { eventObject };
2489         func->Call(vm, func.ToLocal(), params, CALL_ARG_1);
2490     };
2491     GetArkUINodeModifiers()->getWebModifier()->setOnWindowNew(nativeNode, reinterpret_cast<void*>(&callback));
2492     return panda::JSValueRef::Undefined(vm);
2493 }
2494 
ResetOnWindowNew(ArkUIRuntimeCallInfo * runtimeCallInfo)2495 ArkUINativeModuleValue WebBridge::ResetOnWindowNew(ArkUIRuntimeCallInfo* runtimeCallInfo)
2496 {
2497     EcmaVM* vm = runtimeCallInfo->GetVM();
2498     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2499     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2500     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2501     GetArkUINodeModifiers()->getWebModifier()->resetOnWindowNew(nativeNode);
2502     return panda::JSValueRef::Undefined(vm);
2503 }
2504 
SetOnGeolocationShow(ArkUIRuntimeCallInfo * runtimeCallInfo)2505 ArkUINativeModuleValue WebBridge::SetOnGeolocationShow(ArkUIRuntimeCallInfo* runtimeCallInfo)
2506 {
2507     EcmaVM* vm = runtimeCallInfo->GetVM();
2508     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2509     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2510     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
2511     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2512     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
2513         GetArkUINodeModifiers()->getWebModifier()->resetOnFirstContentfulPaint(nativeNode);
2514         return panda::JSValueRef::Undefined(vm);
2515     }
2516     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
2517     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
2518     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
2519 
2520     std::function<void(LoadWebGeolocationShowEvent&)> callback =
2521         [vm, weak = AceType::WeakClaim(frameNode),
2522             func = panda::CopyableGlobal(vm, func)](LoadWebGeolocationShowEvent& event) {
2523             panda::LocalScope pandaScope(vm);
2524             panda::TryCatch trycatch(vm);
2525             PipelineContext::SetCallBackNode(weak);
2526             const char* keys[] = { "origin", "geolocation" };
2527 
2528             Framework::JSRef<Framework::JSObject> handlerObj = Framework::JSWeb::CreateGeolocationShowHandler(event);
2529             Local<JSValueRef> values[] = { panda::StringRef::NewFromUtf8(vm, event.GetOrigin().c_str()),
2530                 handlerObj->GetLocalHandle() };
2531             auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
2532             eventObject->SetNativePointerFieldCount(vm, CALL_ARG_1);
2533             eventObject->SetNativePointerField(vm, CALL_ARG_0, static_cast<void*>(&event));
2534             panda::Local<panda::JSValueRef> params[1] = { eventObject };
2535             func->Call(vm, func.ToLocal(), params, CALL_ARG_1);
2536         };
2537     GetArkUINodeModifiers()->getWebModifier()->setOnGeolocationShow(nativeNode, reinterpret_cast<void*>(&callback));
2538     return panda::JSValueRef::Undefined(vm);
2539 }
2540 
ResetOnGeolocationShow(ArkUIRuntimeCallInfo * runtimeCallInfo)2541 ArkUINativeModuleValue WebBridge::ResetOnGeolocationShow(ArkUIRuntimeCallInfo* runtimeCallInfo)
2542 {
2543     EcmaVM* vm = runtimeCallInfo->GetVM();
2544     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2545     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2546     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2547     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2548     GetArkUINodeModifiers()->getWebModifier()->resetOnGeolocationShow(nativeNode);
2549     return panda::JSValueRef::Undefined(vm);
2550 }
2551 
SetOnPermissionRequest(ArkUIRuntimeCallInfo * runtimeCallInfo)2552 ArkUINativeModuleValue WebBridge::SetOnPermissionRequest(ArkUIRuntimeCallInfo* runtimeCallInfo)
2553 {
2554     EcmaVM* vm = runtimeCallInfo->GetVM();
2555     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2556     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2557     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
2558     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2559     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
2560         GetArkUINodeModifiers()->getWebModifier()->resetOnFirstContentfulPaint(nativeNode);
2561         return panda::JSValueRef::Undefined(vm);
2562     }
2563     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
2564     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
2565     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
2566 
2567     std::function<void(WebPermissionRequestEvent&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
2568                                                                    func = panda::CopyableGlobal(vm, func)](
2569                                                                    WebPermissionRequestEvent& event) {
2570         panda::LocalScope pandaScope(vm);
2571         panda::TryCatch trycatch(vm);
2572         PipelineContext::SetCallBackNode(weak);
2573         const char* keys[] = { "request" };
2574 
2575         Framework::JSRef<Framework::JSObject> handlerObj = Framework::JSWeb::CreatePermissionRequestHandler(event);
2576         Local<JSValueRef> values[] = { handlerObj->GetLocalHandle() };
2577         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
2578         eventObject->SetNativePointerFieldCount(vm, CALL_ARG_1);
2579         eventObject->SetNativePointerField(vm, CALL_ARG_0, static_cast<void*>(&event));
2580         panda::Local<panda::JSValueRef> params[1] = { eventObject };
2581         func->Call(vm, func.ToLocal(), params, CALL_ARG_1);
2582     };
2583     GetArkUINodeModifiers()->getWebModifier()->setOnPermissionRequest(nativeNode, reinterpret_cast<void*>(&callback));
2584     return panda::JSValueRef::Undefined(vm);
2585 }
2586 
ResetOnPermissionRequest(ArkUIRuntimeCallInfo * runtimeCallInfo)2587 ArkUINativeModuleValue WebBridge::ResetOnPermissionRequest(ArkUIRuntimeCallInfo* runtimeCallInfo)
2588 {
2589     EcmaVM* vm = runtimeCallInfo->GetVM();
2590     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2591     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2592     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2593     GetArkUINodeModifiers()->getWebModifier()->resetOnPermissionRequest(nativeNode);
2594     return panda::JSValueRef::Undefined(vm);
2595 }
2596 
SetOnScreenCaptureRequest(ArkUIRuntimeCallInfo * runtimeCallInfo)2597 ArkUINativeModuleValue WebBridge::SetOnScreenCaptureRequest(ArkUIRuntimeCallInfo* runtimeCallInfo)
2598 {
2599     EcmaVM* vm = runtimeCallInfo->GetVM();
2600     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2601     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2602     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
2603     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2604     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
2605         GetArkUINodeModifiers()->getWebModifier()->resetOnFirstContentfulPaint(nativeNode);
2606         return panda::JSValueRef::Undefined(vm);
2607     }
2608     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
2609     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
2610     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
2611 
2612     std::function<void(WebScreenCaptureRequestEvent&)> callback =
2613         [vm, weak = AceType::WeakClaim(frameNode),
2614             func = panda::CopyableGlobal(vm, func)](WebScreenCaptureRequestEvent& event) {
2615             panda::LocalScope pandaScope(vm);
2616             panda::TryCatch trycatch(vm);
2617             PipelineContext::SetCallBackNode(weak);
2618             const char* keys[] = { "handler" };
2619 
2620             Framework::JSRef<Framework::JSObject> handlerObj = Framework::JSWeb::CreateScreenCaptureHandler(event);
2621             Local<JSValueRef> values[] = { handlerObj->GetLocalHandle() };
2622             auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
2623             eventObject->SetNativePointerFieldCount(vm, CALL_ARG_1);
2624             eventObject->SetNativePointerField(vm, CALL_ARG_0, static_cast<void*>(&event));
2625             panda::Local<panda::JSValueRef> params[1] = { eventObject };
2626             func->Call(vm, func.ToLocal(), params, CALL_ARG_1);
2627         };
2628     GetArkUINodeModifiers()->getWebModifier()->setOnScreenCaptureRequest(
2629         nativeNode, reinterpret_cast<void*>(&callback));
2630     return panda::JSValueRef::Undefined(vm);
2631 }
2632 
ResetOnScreenCaptureRequest(ArkUIRuntimeCallInfo * runtimeCallInfo)2633 ArkUINativeModuleValue WebBridge::ResetOnScreenCaptureRequest(ArkUIRuntimeCallInfo* runtimeCallInfo)
2634 {
2635     EcmaVM* vm = runtimeCallInfo->GetVM();
2636     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2637     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2638     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2639     GetArkUINodeModifiers()->getWebModifier()->resetOnScreenCaptureRequest(nativeNode);
2640     return panda::JSValueRef::Undefined(vm);
2641 }
2642 
SetOnFullScreenEnter(ArkUIRuntimeCallInfo * runtimeCallInfo)2643 ArkUINativeModuleValue WebBridge::SetOnFullScreenEnter(ArkUIRuntimeCallInfo* runtimeCallInfo)
2644 {
2645     EcmaVM* vm = runtimeCallInfo->GetVM();
2646     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2647     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2648     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
2649     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
2650     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
2651         GetArkUINodeModifiers()->getWebModifier()->resetOnFullScreenEnter(nativeNode);
2652         return panda::JSValueRef::Undefined(vm);
2653     }
2654     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
2655     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
2656     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
2657     std::function<void(FullScreenEnterEvent&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
2658                                                               func = panda::CopyableGlobal(vm, func)](
2659                                                               FullScreenEnterEvent& event) {
2660         panda::LocalScope pandaScope(vm);
2661         panda::TryCatch trycatch(vm);
2662         PipelineContext::SetCallBackNode(weak);
2663         const char* keys[] = { "videoWidth", "videoHeight", "handler" };
2664         Framework::JSRef<Framework::JSObject> handlerObj = Framework::JSWeb::CreateFullScreenEnterHandler(event);
2665         Local<JSValueRef> values[] = { panda::NumberRef::New(vm, static_cast<int64_t>(event.GetVideoNaturalWidth())),
2666             panda::NumberRef::New(vm, static_cast<int64_t>(event.GetVideoNaturalHeight())),
2667             handlerObj->GetLocalHandle() };
2668 
2669         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
2670         eventObject->SetNativePointerFieldCount(vm, CALL_ARG_1);
2671         eventObject->SetNativePointerField(vm, CALL_ARG_0, static_cast<void*>(&event));
2672         panda::Local<panda::JSValueRef> params[1] = { eventObject };
2673         func->Call(vm, func.ToLocal(), params, CALL_ARG_1);
2674     };
2675     GetArkUINodeModifiers()->getWebModifier()->setOnFullScreenEnter(nativeNode, reinterpret_cast<void*>(&callback));
2676     return panda::JSValueRef::Undefined(vm);
2677 }
2678 
ResetOnFullScreenEnter(ArkUIRuntimeCallInfo * runtimeCallInfo)2679 ArkUINativeModuleValue WebBridge::ResetOnFullScreenEnter(ArkUIRuntimeCallInfo* runtimeCallInfo)
2680 {
2681     EcmaVM* vm = runtimeCallInfo->GetVM();
2682     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2683     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2684     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2685     GetArkUINodeModifiers()->getWebModifier()->resetOnFullScreenEnter(nativeNode);
2686     return panda::JSValueRef::Undefined(vm);
2687 }
2688 
SetOnWindowExit(ArkUIRuntimeCallInfo * runtimeCallInfo)2689 ArkUINativeModuleValue WebBridge::SetOnWindowExit(ArkUIRuntimeCallInfo* runtimeCallInfo)
2690 {
2691     EcmaVM* vm = runtimeCallInfo->GetVM();
2692     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2693     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2694     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
2695     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
2696     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
2697         GetArkUINodeModifiers()->getWebModifier()->resetOnWindowExit(nativeNode);
2698         return panda::JSValueRef::Undefined(vm);
2699     }
2700     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
2701     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
2702     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
2703 
2704     std::function<void()> callback = [vm, weak = AceType::WeakClaim(frameNode),
2705         func = panda::CopyableGlobal(vm, func)]() {
2706         panda::LocalScope pandaScope(vm);
2707         panda::TryCatch trycatch(vm);
2708         PipelineContext::SetCallBackNode(weak);
2709         func->Call(vm, func.ToLocal(), nullptr, CALL_ARG_0);
2710     };
2711     GetArkUINodeModifiers()->getWebModifier()->setOnWindowExit(nativeNode, reinterpret_cast<void*>(&callback));
2712     return panda::JSValueRef::Undefined(vm);
2713 }
2714 
ResetOnWindowExit(ArkUIRuntimeCallInfo * runtimeCallInfo)2715 ArkUINativeModuleValue WebBridge::ResetOnWindowExit(ArkUIRuntimeCallInfo* runtimeCallInfo)
2716 {
2717     EcmaVM* vm = runtimeCallInfo->GetVM();
2718     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2719     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2720     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2721     GetArkUINodeModifiers()->getWebModifier()->resetOnWindowExit(nativeNode);
2722     return panda::JSValueRef::Undefined(vm);
2723 }
2724 
SetOnAlert(ArkUIRuntimeCallInfo * runtimeCallInfo)2725 ArkUINativeModuleValue WebBridge::SetOnAlert(ArkUIRuntimeCallInfo* runtimeCallInfo)
2726 {
2727     EcmaVM* vm = runtimeCallInfo->GetVM();
2728     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2729     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2730     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
2731     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2732     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2733     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
2734         GetArkUINodeModifiers()->getWebModifier()->resetOnAlertlCallBack(nativeNode);
2735         return panda::JSValueRef::Undefined(vm);
2736     }
2737     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
2738     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
2739     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
2740 
2741     std::function<bool(WebDialogEvent&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
2742                                                         func = panda::CopyableGlobal(vm, func)](
2743                                                         WebDialogEvent& event) {
2744         panda::LocalScope pandaScope(vm);
2745         panda::TryCatch trycatch(vm);
2746         PipelineContext::SetCallBackNode(weak);
2747         const char* keys[] = { "url", "message", "result" };
2748         Framework::JSRef<Framework::JSObject> handlerObj = Framework::JSWeb::CreateCommonDialogResultHandler(event);
2749         Local<JSValueRef> values[] = { panda::StringRef::NewFromUtf8(vm, event.GetUrl().c_str()),
2750             panda::StringRef::NewFromUtf8(vm, event.GetMessage().c_str()), handlerObj->GetLocalHandle() };
2751         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
2752         eventObject->SetNativePointerFieldCount(vm, 1);
2753         eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&event));
2754         panda::Local<panda::JSValueRef> params[1] = { eventObject };
2755         auto ret = func->Call(vm, func.ToLocal(), params, 1);
2756         if (ret->IsBoolean()) {
2757             return ret->ToBoolean(vm)->Value();
2758         }
2759         return false;
2760     };
2761 
2762     GetArkUINodeModifiers()->getWebModifier()->setOnAlertlCallBack(nativeNode, reinterpret_cast<void*>(&callback));
2763     return panda::JSValueRef::Undefined(vm);
2764 }
2765 
ResetOnAlert(ArkUIRuntimeCallInfo * runtimeCallInfo)2766 ArkUINativeModuleValue WebBridge::ResetOnAlert(ArkUIRuntimeCallInfo* runtimeCallInfo)
2767 {
2768     EcmaVM* vm = runtimeCallInfo->GetVM();
2769     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2770     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2771     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2772     GetArkUINodeModifiers()->getWebModifier()->resetOnAlertlCallBack(nativeNode);
2773     return panda::JSValueRef::Undefined(vm);
2774 }
2775 
SetOnConfirm(ArkUIRuntimeCallInfo * runtimeCallInfo)2776 ArkUINativeModuleValue WebBridge::SetOnConfirm(ArkUIRuntimeCallInfo* runtimeCallInfo)
2777 {
2778     EcmaVM* vm = runtimeCallInfo->GetVM();
2779     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2780     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2781     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
2782     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2783     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2784     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
2785         GetArkUINodeModifiers()->getWebModifier()->resetOnConfirmCallBack(nativeNode);
2786         return panda::JSValueRef::Undefined(vm);
2787     }
2788     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
2789     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
2790     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
2791 
2792     std::function<bool(WebDialogEvent&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
2793                                                         func = panda::CopyableGlobal(vm, func)](
2794                                                         WebDialogEvent& event) {
2795         panda::LocalScope pandaScope(vm);
2796         panda::TryCatch trycatch(vm);
2797         PipelineContext::SetCallBackNode(weak);
2798         const char* keys[] = { "url", "message", "result" };
2799         Framework::JSRef<Framework::JSObject> handlerObj = Framework::JSWeb::CreateCommonDialogResultHandler(event);
2800         Local<JSValueRef> values[] = { panda::StringRef::NewFromUtf8(vm, event.GetUrl().c_str()),
2801             panda::StringRef::NewFromUtf8(vm, event.GetMessage().c_str()), handlerObj->GetLocalHandle() };
2802         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
2803         eventObject->SetNativePointerFieldCount(vm, 1);
2804         eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&event));
2805         panda::Local<panda::JSValueRef> params[1] = { eventObject };
2806         auto ret = func->Call(vm, func.ToLocal(), params, 1);
2807         if (ret->IsBoolean()) {
2808             return ret->ToBoolean(vm)->Value();
2809         }
2810         return false;
2811     };
2812 
2813     GetArkUINodeModifiers()->getWebModifier()->setOnConfirmCallBack(nativeNode, reinterpret_cast<void*>(&callback));
2814     return panda::JSValueRef::Undefined(vm);
2815 }
2816 
ResetOnConfirm(ArkUIRuntimeCallInfo * runtimeCallInfo)2817 ArkUINativeModuleValue WebBridge::ResetOnConfirm(ArkUIRuntimeCallInfo* runtimeCallInfo)
2818 {
2819     EcmaVM* vm = runtimeCallInfo->GetVM();
2820     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2821     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2822     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2823     GetArkUINodeModifiers()->getWebModifier()->resetOnConfirmCallBack(nativeNode);
2824     return panda::JSValueRef::Undefined(vm);
2825 }
2826 
SetOnPrompt(ArkUIRuntimeCallInfo * runtimeCallInfo)2827 ArkUINativeModuleValue WebBridge::SetOnPrompt(ArkUIRuntimeCallInfo* runtimeCallInfo)
2828 {
2829     EcmaVM* vm = runtimeCallInfo->GetVM();
2830     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2831     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2832     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
2833     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2834     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2835     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
2836         GetArkUINodeModifiers()->getWebModifier()->resetOnPromptCallBack(nativeNode);
2837         return panda::JSValueRef::Undefined(vm);
2838     }
2839     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
2840     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
2841     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
2842     std::function<bool(WebDialogEvent&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
2843                                                         func = panda::CopyableGlobal(vm, func)](
2844                                                         WebDialogEvent& event) {
2845         panda::LocalScope pandaScope(vm);
2846         panda::TryCatch trycatch(vm);
2847         PipelineContext::SetCallBackNode(weak);
2848         const char* keys[] = { "url", "message", "value", "result" };
2849         Framework::JSRef<Framework::JSObject> handlerObj = Framework::JSWeb::CreateCommonDialogResultHandler(event);
2850         Local<JSValueRef> values[] = { panda::StringRef::NewFromUtf8(vm, event.GetUrl().c_str()),
2851             panda::StringRef::NewFromUtf8(vm, event.GetMessage().c_str()),
2852             panda::StringRef::NewFromUtf8(vm, event.GetValue().c_str()), handlerObj->GetLocalHandle() };
2853         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
2854         eventObject->SetNativePointerFieldCount(vm, 1);
2855         eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&event));
2856         panda::Local<panda::JSValueRef> params[1] = { eventObject };
2857         auto ret = func->Call(vm, func.ToLocal(), params, 1);
2858         if (ret->IsBoolean()) {
2859             return ret->ToBoolean(vm)->Value();
2860         }
2861         return false;
2862     };
2863     GetArkUINodeModifiers()->getWebModifier()->setOnPromptCallBack(nativeNode, reinterpret_cast<void*>(&callback));
2864     return panda::JSValueRef::Undefined(vm);
2865 }
2866 
ResetOnPrompt(ArkUIRuntimeCallInfo * runtimeCallInfo)2867 ArkUINativeModuleValue WebBridge::ResetOnPrompt(ArkUIRuntimeCallInfo* runtimeCallInfo)
2868 {
2869     EcmaVM* vm = runtimeCallInfo->GetVM();
2870     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2871     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2872     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2873     GetArkUINodeModifiers()->getWebModifier()->resetOnPromptCallBack(nativeNode);
2874     return panda::JSValueRef::Undefined(vm);
2875 }
2876 
SetOnShowFileSelector(ArkUIRuntimeCallInfo * runtimeCallInfo)2877 ArkUINativeModuleValue WebBridge::SetOnShowFileSelector(ArkUIRuntimeCallInfo* runtimeCallInfo)
2878 {
2879     EcmaVM* vm = runtimeCallInfo->GetVM();
2880     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2881     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2882     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
2883     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2884     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
2885     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
2886         GetArkUINodeModifiers()->getWebModifier()->resetOnShowFileSelector(nativeNode);
2887         return panda::JSValueRef::Undefined(vm);
2888     }
2889     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
2890     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
2891     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
2892     std::function<bool(FileSelectorEvent&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
2893                                                            func = panda::CopyableGlobal(vm, func)](
2894                                                            FileSelectorEvent& event) {
2895         panda::LocalScope pandaScope(vm);
2896         panda::TryCatch trycatch(vm);
2897         PipelineContext::SetCallBackNode(weak);
2898         const char* keys[] = { "fileSelector", "result" };
2899         Framework::JSRef<Framework::JSObject> handlerParamObj = Framework::JSWeb::CreateFileSelectorParamHandler(event);
2900         Framework::JSRef<Framework::JSObject> handlerresultObj =
2901             Framework::JSWeb::CreateFileSelectorResultHandler(event);
2902         Local<JSValueRef> values[] = { handlerParamObj->GetLocalHandle(), handlerresultObj->GetLocalHandle() };
2903 
2904         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
2905         eventObject->SetNativePointerFieldCount(vm, CALL_ARG_1);
2906         eventObject->SetNativePointerField(vm, CALL_ARG_0, static_cast<void*>(&event));
2907         panda::Local<panda::JSValueRef> params[1] = { eventObject };
2908         auto ret = func->Call(vm, func.ToLocal(), params, CALL_ARG_1);
2909         return ret->IsBoolean() && ret->ToBoolean(vm)->Value();
2910     };
2911     GetArkUINodeModifiers()->getWebModifier()->setOnShowFileSelector(nativeNode, reinterpret_cast<void*>(&callback));
2912     return panda::JSValueRef::Undefined(vm);
2913 }
2914 
ResetOnShowFileSelector(ArkUIRuntimeCallInfo * runtimeCallInfo)2915 ArkUINativeModuleValue WebBridge::ResetOnShowFileSelector(ArkUIRuntimeCallInfo* runtimeCallInfo)
2916 {
2917     EcmaVM* vm = runtimeCallInfo->GetVM();
2918     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2919     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2920     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2921     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2922     GetArkUINodeModifiers()->getWebModifier()->resetOnShowFileSelector(nativeNode);
2923     return panda::JSValueRef::Undefined(vm);
2924 }
2925 
SetOnContextMenuShow(ArkUIRuntimeCallInfo * runtimeCallInfo)2926 ArkUINativeModuleValue WebBridge::SetOnContextMenuShow(ArkUIRuntimeCallInfo* runtimeCallInfo)
2927 {
2928     EcmaVM* vm = runtimeCallInfo->GetVM();
2929     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2930     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2931     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
2932     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2933     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
2934     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
2935         GetArkUINodeModifiers()->getWebModifier()->resetOnContextMenuShow(nativeNode);
2936         return panda::JSValueRef::Undefined(vm);
2937     }
2938     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
2939     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
2940     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
2941     std::function<bool(ContextMenuEvent&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
2942                                                           func = panda::CopyableGlobal(vm, func)](
2943                                                           ContextMenuEvent& event) {
2944         panda::LocalScope pandaScope(vm);
2945         panda::TryCatch trycatch(vm);
2946         PipelineContext::SetCallBackNode(weak);
2947         const char* keys[] = { "param", "result" };
2948         Framework::JSRef<Framework::JSObject> handlerParamObj = Framework::JSWeb::CreateContextMenuParamHandler(event);
2949         Framework::JSRef<Framework::JSObject> handlerResultObj =
2950             Framework::JSWeb::CreateContextMenuResultHandler(event);
2951         Local<JSValueRef> values[] = { handlerParamObj->GetLocalHandle(), handlerResultObj->GetLocalHandle() };
2952         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
2953         eventObject->SetNativePointerFieldCount(vm, CALL_ARG_1);
2954         eventObject->SetNativePointerField(vm, CALL_ARG_0, static_cast<void*>(&event));
2955         panda::Local<panda::JSValueRef> params[1] = { eventObject };
2956         auto ret = func->Call(vm, func.ToLocal(), params, CALL_ARG_1);
2957         return ret->IsBoolean() && ret->ToBoolean(vm)->Value();
2958     };
2959     GetArkUINodeModifiers()->getWebModifier()->setOnContextMenuShow(nativeNode, reinterpret_cast<void*>(&callback));
2960     return panda::JSValueRef::Undefined(vm);
2961 }
2962 
ResetOnContextMenuShow(ArkUIRuntimeCallInfo * runtimeCallInfo)2963 ArkUINativeModuleValue WebBridge::ResetOnContextMenuShow(ArkUIRuntimeCallInfo* runtimeCallInfo)
2964 {
2965     EcmaVM* vm = runtimeCallInfo->GetVM();
2966     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
2967     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
2968     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2969     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2970     GetArkUINodeModifiers()->getWebModifier()->resetOnContextMenuShow(nativeNode);
2971     return panda::JSValueRef::Undefined(vm);
2972 }
2973 
SetOnSafeBrowsingCheckResult(ArkUIRuntimeCallInfo * runtimeCallInfo)2974 ArkUINativeModuleValue WebBridge::SetOnSafeBrowsingCheckResult(ArkUIRuntimeCallInfo* runtimeCallInfo)
2975 {
2976     EcmaVM* vm = runtimeCallInfo->GetVM();
2977     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
2978     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
2979     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
2980     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
2981     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
2982     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
2983         GetArkUINodeModifiers()->getWebModifier()->resetOnSafeBrowsingCheckResultCallBack(nativeNode);
2984         return panda::JSValueRef::Undefined(vm);
2985     }
2986     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
2987     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
2988     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
2989 
2990     std::function<void(SafeBrowsingCheckResultEvent&)> callback =
2991         [vm, weak = AceType::WeakClaim(frameNode),
2992             func = panda::CopyableGlobal(vm, func)](SafeBrowsingCheckResultEvent& event) {
2993             panda::LocalScope pandaScope(vm);
2994             panda::TryCatch trycatch(vm);
2995             PipelineContext::SetCallBackNode(weak);
2996             auto eventObject = panda::ObjectRef::New(vm);
2997             eventObject->Set(
2998                 vm, panda::StringRef::NewFromUtf8(vm, "threatType"), panda::NumberRef::New(vm, event.GetThreatType()));
2999             panda::Local<panda::JSValueRef> params[1] = { eventObject };
3000             func->Call(vm, func.ToLocal(), params, 1);
3001         };
3002     GetArkUINodeModifiers()->getWebModifier()->setOnSafeBrowsingCheckResultCallBack(
3003         nativeNode, reinterpret_cast<void*>(&callback));
3004     return panda::JSValueRef::Undefined(vm);
3005 }
3006 
ResetOnSafeBrowsingCheckResult(ArkUIRuntimeCallInfo * runtimeCallInfo)3007 ArkUINativeModuleValue WebBridge::ResetOnSafeBrowsingCheckResult(ArkUIRuntimeCallInfo* runtimeCallInfo)
3008 {
3009     EcmaVM* vm = runtimeCallInfo->GetVM();
3010     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
3011     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
3012     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
3013     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
3014     GetArkUINodeModifiers()->getWebModifier()->resetOnSafeBrowsingCheckResultCallBack(nativeNode);
3015     return panda::JSValueRef::Undefined(vm);
3016 }
3017 
SetNestedScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)3018 ArkUINativeModuleValue WebBridge::SetNestedScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
3019 {
3020     EcmaVM* vm = runtimeCallInfo->GetVM();
3021     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
3022     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
3023     Local<JSValueRef> scrollUpValue = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
3024     Local<JSValueRef> scrollDownValue = runtimeCallInfo->GetCallArgRef(CALL_ARG_2);
3025     Local<JSValueRef> scrollLeftValue = runtimeCallInfo->GetCallArgRef(CALL_ARG_3);
3026     Local<JSValueRef> scrollRightValue = runtimeCallInfo->GetCallArgRef(CALL_ARG_4);
3027     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
3028     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
3029     int32_t up = static_cast<int32_t>(NestedScrollMode::SELF_ONLY);
3030     int32_t down = static_cast<int32_t>(NestedScrollMode::SELF_ONLY);
3031     int32_t left = static_cast<int32_t>(NestedScrollMode::SELF_ONLY);
3032     int32_t right = static_cast<int32_t>(NestedScrollMode::SELF_ONLY);
3033     ArkTSUtils::ParseJsInteger(vm, scrollUpValue, up);
3034     if (up < static_cast<int32_t>(NestedScrollMode::SELF_ONLY) ||
3035         up > static_cast<int32_t>(NestedScrollMode::PARALLEL)) {
3036         up = static_cast<int32_t>(NestedScrollMode::SELF_FIRST);
3037     }
3038     ArkTSUtils::ParseJsInteger(vm, scrollDownValue, down);
3039     if (down < static_cast<int32_t>(NestedScrollMode::SELF_ONLY) ||
3040         down > static_cast<int32_t>(NestedScrollMode::PARALLEL)) {
3041         down = static_cast<int32_t>(NestedScrollMode::SELF_FIRST);
3042     }
3043     ArkTSUtils::ParseJsInteger(vm, scrollLeftValue, left);
3044     if (left < static_cast<int32_t>(NestedScrollMode::SELF_ONLY) ||
3045         left > static_cast<int32_t>(NestedScrollMode::PARALLEL)) {
3046         left = static_cast<int32_t>(NestedScrollMode::SELF_FIRST);
3047     }
3048     ArkTSUtils::ParseJsInteger(vm, scrollRightValue, right);
3049     if (right < static_cast<int32_t>(NestedScrollMode::SELF_ONLY) ||
3050         right > static_cast<int32_t>(NestedScrollMode::PARALLEL)) {
3051         right = static_cast<int32_t>(NestedScrollMode::SELF_FIRST);
3052     }
3053     GetArkUINodeModifiers()->getWebModifier()->setWebNestedScrollExt(nativeNode, up, down, left, right);
3054     return panda::JSValueRef::Undefined(vm);
3055 }
3056 
ResetNestedScroll(ArkUIRuntimeCallInfo * runtimeCallInfo)3057 ArkUINativeModuleValue WebBridge::ResetNestedScroll(ArkUIRuntimeCallInfo* runtimeCallInfo)
3058 {
3059     EcmaVM* vm = runtimeCallInfo->GetVM();
3060     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
3061     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
3062     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
3063     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
3064     GetArkUINodeModifiers()->getWebModifier()->resetWebNestedScrollExt(nativeNode);
3065     return panda::JSValueRef::Undefined(vm);
3066 }
3067 
SetOnInterceptKeyEvent(ArkUIRuntimeCallInfo * runtimeCallInfo)3068 ArkUINativeModuleValue WebBridge::SetOnInterceptKeyEvent(ArkUIRuntimeCallInfo* runtimeCallInfo)
3069 {
3070     EcmaVM* vm = runtimeCallInfo->GetVM();
3071     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
3072     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
3073     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
3074     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
3075     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
3076     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
3077         GetArkUINodeModifiers()->getWebModifier()->resetOnInterceptKeyEventCallBack(nativeNode);
3078         return panda::JSValueRef::Undefined(vm);
3079     }
3080     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
3081     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
3082     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
3083 
3084     std::function<bool(KeyEventInfo&)> onKeyEvent = [vm, weak = AceType::WeakClaim(frameNode),
3085                                                         func = panda::CopyableGlobal(vm, func)](
3086                                                         KeyEventInfo& info) -> bool {
3087         panda::LocalScope pandaScope(vm);
3088         panda::TryCatch trycatch(vm);
3089         PipelineContext::SetCallBackNode(weak);
3090         const char* keys[] = { "type", "keyCode", "keyText", "keySource", "deviceId", "metaKey", "unicode", "timestamp",
3091             "stopPropagation", "getModifierKeyState", "intentionCode", "isNumLockOn", "isCapsLockOn",
3092             "isScrollLockOn" };
3093         Local<JSValueRef> values[] = { panda::NumberRef::New(vm, static_cast<int32_t>(info.GetKeyType())),
3094             panda::NumberRef::New(vm, static_cast<int32_t>(info.GetKeyCode())),
3095             panda::StringRef::NewFromUtf8(vm, info.GetKeyText().c_str()),
3096             panda::NumberRef::New(vm, static_cast<int32_t>(info.GetKeySource())),
3097             panda::NumberRef::New(vm, info.GetDeviceId()), panda::NumberRef::New(vm, info.GetMetaKey()),
3098             panda::NumberRef::New(vm, info.GetUnicode()),
3099             panda::NumberRef::New(vm, static_cast<double>(info.GetTimeStamp().time_since_epoch().count())),
3100             panda::FunctionRef::New(vm, Framework::JsStopPropagation),
3101             panda::FunctionRef::New(vm, ArkTSUtils::JsGetModifierKeyState),
3102             panda::NumberRef::New(vm, static_cast<int32_t>(info.GetKeyIntention())),
3103             panda::BooleanRef::New(vm, info.GetNumLock()), panda::BooleanRef::New(vm, info.GetCapsLock()),
3104             panda::BooleanRef::New(vm, info.GetScrollLock()) };
3105         auto obj = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
3106         obj->SetNativePointerFieldCount(vm, 1);
3107         obj->SetNativePointerField(vm, 0, static_cast<void*>(&info));
3108         panda::Local<panda::JSValueRef> params[1] = { obj };
3109         auto ret = func->Call(vm, func.ToLocal(), params, 1);
3110         if (ret->IsBoolean()) {
3111             return ret->ToBoolean(vm)->Value();
3112         }
3113         return false;
3114     };
3115     GetArkUINodeModifiers()->getWebModifier()->setOnInterceptKeyEventCallBack(
3116         nativeNode, reinterpret_cast<void*>(&onKeyEvent));
3117     return panda::JSValueRef::Undefined(vm);
3118 }
3119 
ResetOnInterceptKeyEvent(ArkUIRuntimeCallInfo * runtimeCallInfo)3120 ArkUINativeModuleValue WebBridge::ResetOnInterceptKeyEvent(ArkUIRuntimeCallInfo* runtimeCallInfo)
3121 {
3122     EcmaVM* vm = runtimeCallInfo->GetVM();
3123     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
3124     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
3125     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
3126     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
3127     GetArkUINodeModifiers()->getWebModifier()->resetOnInterceptKeyEventCallBack(nativeNode);
3128     return panda::JSValueRef::Undefined(vm);
3129 }
3130 
SetOnErrorReceive(ArkUIRuntimeCallInfo * runtimeCallInfo)3131 ArkUINativeModuleValue WebBridge::SetOnErrorReceive(ArkUIRuntimeCallInfo* runtimeCallInfo)
3132 {
3133     EcmaVM* vm = runtimeCallInfo->GetVM();
3134     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
3135     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
3136     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
3137     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
3138     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
3139     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
3140         GetArkUINodeModifiers()->getWebModifier()->resetOnErrorReceive(nativeNode);
3141         return panda::JSValueRef::Undefined(vm);
3142     }
3143     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
3144     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
3145     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
3146     std::function<void(ReceivedErrorEvent&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
3147                                                             func = panda::CopyableGlobal(vm, func)](
3148                                                             ReceivedErrorEvent& event) {
3149         panda::LocalScope pandaScope(vm);
3150         panda::TryCatch trycatch(vm);
3151         PipelineContext::SetCallBackNode(weak);
3152         const char* keys[] = { "request", "error" };
3153         Framework::JSRef<Framework::JSObject> handlerRequestObj =
3154             Framework::JSWeb::CreateRequestErrorHandler(event);
3155         Framework::JSRef<Framework::JSObject> handlerErrorObj = Framework::JSWeb::CreateResponseErrorHandler(event);
3156         Local<JSValueRef> values[] = { handlerRequestObj->GetLocalHandle(), handlerErrorObj->GetLocalHandle() };
3157 
3158         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
3159         eventObject->SetNativePointerFieldCount(vm, CALL_ARG_1);
3160         eventObject->SetNativePointerField(vm, CALL_ARG_0, static_cast<void*>(&event));
3161         panda::Local<panda::JSValueRef> params[1] = { eventObject };
3162         func->Call(vm, func.ToLocal(), params, CALL_ARG_1);
3163     };
3164     GetArkUINodeModifiers()->getWebModifier()->setOnErrorReceive(nativeNode, reinterpret_cast<void*>(&callback));
3165     return panda::JSValueRef::Undefined(vm);
3166 }
3167 
ResetOnErrorReceive(ArkUIRuntimeCallInfo * runtimeCallInfo)3168 ArkUINativeModuleValue WebBridge::ResetOnErrorReceive(ArkUIRuntimeCallInfo* runtimeCallInfo)
3169 {
3170     EcmaVM* vm = runtimeCallInfo->GetVM();
3171     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
3172     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
3173     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
3174     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
3175     GetArkUINodeModifiers()->getWebModifier()->resetOnErrorReceive(nativeNode);
3176     return panda::JSValueRef::Undefined(vm);
3177 }
3178 
SetOnLoadIntercept(ArkUIRuntimeCallInfo * runtimeCallInfo)3179 ArkUINativeModuleValue WebBridge::SetOnLoadIntercept(ArkUIRuntimeCallInfo* runtimeCallInfo)
3180 {
3181     EcmaVM* vm = runtimeCallInfo->GetVM();
3182     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
3183     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
3184     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
3185     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
3186     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
3187     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
3188         GetArkUINodeModifiers()->getWebModifier()->resetOnLoadIntercept(nativeNode);
3189         return panda::JSValueRef::Undefined(vm);
3190     }
3191     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
3192     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
3193     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
3194     std::function<bool(LoadInterceptEvent&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
3195                                                             func = panda::CopyableGlobal(vm, func)](
3196                                                             LoadInterceptEvent& event) {
3197         panda::LocalScope pandaScope(vm);
3198         panda::TryCatch trycatch(vm);
3199         PipelineContext::SetCallBackNode(weak);
3200         const char* keys[] = { "data" };
3201         Framework::JSRef<Framework::JSObject> handlerObj = Framework::JSWeb::CreateLoadInterceptHandler(event);
3202         Local<JSValueRef> values[] = { handlerObj->GetLocalHandle() };
3203 
3204         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
3205         eventObject->SetNativePointerFieldCount(vm, CALL_ARG_1);
3206         eventObject->SetNativePointerField(vm, CALL_ARG_0, static_cast<void*>(&event));
3207         panda::Local<panda::JSValueRef> params[1] = { eventObject };
3208         auto ret = func->Call(vm, func.ToLocal(), params, CALL_ARG_1);
3209         return ret->IsBoolean() && ret->ToBoolean(vm)->Value();
3210     };
3211     GetArkUINodeModifiers()->getWebModifier()->setOnLoadIntercept(nativeNode, reinterpret_cast<void*>(&callback));
3212     return panda::JSValueRef::Undefined(vm);
3213 }
3214 
ResetOnLoadIntercept(ArkUIRuntimeCallInfo * runtimeCallInfo)3215 ArkUINativeModuleValue WebBridge::ResetOnLoadIntercept(ArkUIRuntimeCallInfo* runtimeCallInfo)
3216 {
3217     EcmaVM* vm = runtimeCallInfo->GetVM();
3218     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
3219     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
3220     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
3221     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
3222     GetArkUINodeModifiers()->getWebModifier()->resetOnLoadIntercept(nativeNode);
3223     return panda::JSValueRef::Undefined(vm);
3224 }
3225 
SetOnHttpErrorReceive(ArkUIRuntimeCallInfo * runtimeCallInfo)3226 ArkUINativeModuleValue WebBridge::SetOnHttpErrorReceive(ArkUIRuntimeCallInfo* runtimeCallInfo)
3227 {
3228     EcmaVM* vm = runtimeCallInfo->GetVM();
3229     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
3230     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
3231     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
3232     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
3233     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
3234     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
3235         GetArkUINodeModifiers()->getWebModifier()->resetOnHttpErrorReceive(nativeNode);
3236         return panda::JSValueRef::Undefined(vm);
3237     }
3238     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
3239     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
3240     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
3241     std::function<void(ReceivedHttpErrorEvent&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
3242                                                                 func = panda::CopyableGlobal(vm, func)](
3243                                                                 ReceivedHttpErrorEvent& event) {
3244         panda::LocalScope pandaScope(vm);
3245         panda::TryCatch trycatch(vm);
3246         PipelineContext::SetCallBackNode(weak);
3247         const char* keys[] = { "request", "response" };
3248         Framework::JSRef<Framework::JSObject> handlerRequestObj =
3249             Framework::JSWeb::CreateHttpErrorReceiveRequestHandler(event);
3250         Framework::JSRef<Framework::JSObject> handlerResponseObj =
3251             Framework::JSWeb::CreateHttpErrorReceiveResponseHandler(event);
3252         Local<JSValueRef> values[] = { handlerRequestObj->GetLocalHandle(), handlerResponseObj->GetLocalHandle() };
3253 
3254         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
3255         eventObject->SetNativePointerFieldCount(vm, CALL_ARG_1);
3256         eventObject->SetNativePointerField(vm, CALL_ARG_0, static_cast<void*>(&event));
3257         panda::Local<panda::JSValueRef> params[1] = { eventObject };
3258         func->Call(vm, func.ToLocal(), params, CALL_ARG_1);
3259     };
3260     GetArkUINodeModifiers()->getWebModifier()->setOnHttpErrorReceive(nativeNode, reinterpret_cast<void*>(&callback));
3261     return panda::JSValueRef::Undefined(vm);
3262 }
3263 
ResetOnHttpErrorReceive(ArkUIRuntimeCallInfo * runtimeCallInfo)3264 ArkUINativeModuleValue WebBridge::ResetOnHttpErrorReceive(ArkUIRuntimeCallInfo* runtimeCallInfo)
3265 {
3266     EcmaVM* vm = runtimeCallInfo->GetVM();
3267     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
3268     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
3269     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
3270     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
3271     GetArkUINodeModifiers()->getWebModifier()->resetOnHttpErrorReceive(nativeNode);
3272     return panda::JSValueRef::Undefined(vm);
3273 }
3274 
SetOnOverrideUrlLoading(ArkUIRuntimeCallInfo * runtimeCallInfo)3275 ArkUINativeModuleValue WebBridge::SetOnOverrideUrlLoading(ArkUIRuntimeCallInfo* runtimeCallInfo)
3276 {
3277     EcmaVM* vm = runtimeCallInfo->GetVM();
3278     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
3279     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
3280     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
3281     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
3282     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
3283     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
3284         GetArkUINodeModifiers()->getWebModifier()->resetOnOverrideUrlLoading(nativeNode);
3285         return panda::JSValueRef::Undefined(vm);
3286     }
3287     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
3288     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
3289     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
3290     std::function<bool(LoadOverrideEvent&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
3291                                                            func = panda::CopyableGlobal(vm, func)](
3292                                                            LoadOverrideEvent& event) {
3293         panda::LocalScope pandaScope(vm);
3294         panda::TryCatch trycatch(vm);
3295         PipelineContext::SetCallBackNode(weak);
3296         Framework::JSRef<Framework::JSObject> handlerObj = Framework::JSWeb::CreateOverrideUrlLoadingHandler(event);
3297         panda::Local<panda::JSValueRef> params[1] = { handlerObj->GetLocalHandle() };
3298         auto ret = func->Call(vm, func.ToLocal(), params, CALL_ARG_1);
3299         return ret->IsBoolean() && ret->ToBoolean(vm)->Value();
3300     };
3301     GetArkUINodeModifiers()->getWebModifier()->setOnOverrideUrlLoading(nativeNode, reinterpret_cast<void*>(&callback));
3302     return panda::JSValueRef::Undefined(vm);
3303 }
3304 
ResetOnOverrideUrlLoading(ArkUIRuntimeCallInfo * runtimeCallInfo)3305 ArkUINativeModuleValue WebBridge::ResetOnOverrideUrlLoading(ArkUIRuntimeCallInfo* runtimeCallInfo)
3306 {
3307     EcmaVM* vm = runtimeCallInfo->GetVM();
3308     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
3309     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
3310     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
3311     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
3312     GetArkUINodeModifiers()->getWebModifier()->resetOnOverrideUrlLoading(nativeNode);
3313     return panda::JSValueRef::Undefined(vm);
3314 }
3315 
SetOnHttpAuthRequest(ArkUIRuntimeCallInfo * runtimeCallInfo)3316 ArkUINativeModuleValue WebBridge::SetOnHttpAuthRequest(ArkUIRuntimeCallInfo* runtimeCallInfo)
3317 {
3318     EcmaVM* vm = runtimeCallInfo->GetVM();
3319     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
3320     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
3321     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
3322     CHECK_NULL_RETURN(nativeNodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
3323     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
3324     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
3325         GetArkUINodeModifiers()->getWebModifier()->resetOnHttpAuthRequest(nativeNode);
3326         return panda::JSValueRef::Undefined(vm);
3327     }
3328     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
3329     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
3330     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
3331     std::function<bool(WebHttpAuthEvent&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
3332                                                           func = panda::CopyableGlobal(vm, func)](
3333                                                           WebHttpAuthEvent& event) {
3334         panda::LocalScope pandaScope(vm);
3335         panda::TryCatch trycatch(vm);
3336         PipelineContext::SetCallBackNode(weak);
3337         const char* keys[] = { "host", "realm", "handler" };
3338         Framework::JSRef<Framework::JSObject> handlerObj = Framework::JSWeb::CreateHttpAuthRequestHandler(event);
3339         Local<JSValueRef> values[] = { panda::StringRef::NewFromUtf8(vm, event.GetHost().c_str()),
3340             panda::StringRef::NewFromUtf8(vm, event.GetRealm().c_str()), handlerObj->GetLocalHandle() };
3341 
3342         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
3343         eventObject->SetNativePointerFieldCount(vm, CALL_ARG_1);
3344         eventObject->SetNativePointerField(vm, CALL_ARG_0, static_cast<void*>(&event));
3345         panda::Local<panda::JSValueRef> params[1] = { eventObject };
3346         auto ret = func->Call(vm, func.ToLocal(), params, CALL_ARG_1);
3347         return ret->IsBoolean() && ret->ToBoolean(vm)->Value();
3348     };
3349     GetArkUINodeModifiers()->getWebModifier()->setOnHttpAuthRequest(nativeNode, reinterpret_cast<void*>(&callback));
3350     return panda::JSValueRef::Undefined(vm);
3351 }
3352 
ResetOnHttpAuthRequest(ArkUIRuntimeCallInfo * runtimeCallInfo)3353 ArkUINativeModuleValue WebBridge::ResetOnHttpAuthRequest(ArkUIRuntimeCallInfo* runtimeCallInfo)
3354 {
3355     EcmaVM* vm = runtimeCallInfo->GetVM();
3356     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
3357     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
3358     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
3359     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
3360     GetArkUINodeModifiers()->getWebModifier()->resetOnHttpAuthRequest(nativeNode);
3361     return panda::JSValueRef::Undefined(vm);
3362 }
3363 
SetOnConsole(ArkUIRuntimeCallInfo * runtimeCallInfo)3364 ArkUINativeModuleValue WebBridge::SetOnConsole(ArkUIRuntimeCallInfo* runtimeCallInfo)
3365 {
3366     EcmaVM* vm = runtimeCallInfo->GetVM();
3367     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
3368     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
3369     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
3370     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
3371     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
3372     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
3373         GetArkUINodeModifiers()->getWebModifier()->resetOnConsole(nativeNode);
3374         return panda::JSValueRef::Undefined(vm);
3375     }
3376     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
3377     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
3378     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
3379     std::function<bool(LoadWebConsoleLogEvent&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
3380                                                                 func = panda::CopyableGlobal(vm, func)](
3381                                                                 LoadWebConsoleLogEvent& event) -> bool {
3382         panda::LocalScope pandaScope(vm);
3383         panda::TryCatch trycatch(vm);
3384         PipelineContext::SetCallBackNode(weak);
3385         Framework::JSRef<Framework::JSObject> handlerObj = Framework::JSWeb::CreateConsoleHandler(event);
3386         auto eventObject = panda::ObjectRef::New(vm);
3387         eventObject->Set(vm, panda::StringRef::NewFromUtf8(vm, "message"), handlerObj->GetLocalHandle());
3388         eventObject->SetNativePointerFieldCount(vm, 1);
3389         eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&event));
3390         panda::Local<panda::JSValueRef> params[1] = { eventObject };
3391         auto ret = func->Call(vm, func.ToLocal(), params, 1);
3392         return ret->IsBoolean() && ret->ToBoolean(vm)->Value();
3393     };
3394     GetArkUINodeModifiers()->getWebModifier()->setOnConsole(nativeNode, reinterpret_cast<void*>(&callback));
3395     return panda::JSValueRef::Undefined(vm);
3396 }
3397 
ResetOnConsole(ArkUIRuntimeCallInfo * runtimeCallInfo)3398 ArkUINativeModuleValue WebBridge::ResetOnConsole(ArkUIRuntimeCallInfo* runtimeCallInfo)
3399 {
3400     EcmaVM* vm = runtimeCallInfo->GetVM();
3401     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
3402     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
3403     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
3404     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
3405     GetArkUINodeModifiers()->getWebModifier()->resetOnConsole(nativeNode);
3406     return panda::JSValueRef::Undefined(vm);
3407 }
3408 
SetOnSslErrorEvent(ArkUIRuntimeCallInfo * runtimeCallInfo)3409 ArkUINativeModuleValue WebBridge::SetOnSslErrorEvent(ArkUIRuntimeCallInfo* runtimeCallInfo)
3410 {
3411     EcmaVM* vm = runtimeCallInfo->GetVM();
3412     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
3413     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
3414     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
3415     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
3416     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
3417     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
3418         GetArkUINodeModifiers()->getWebModifier()->resetOnSslErrorEvent(nativeNode);
3419         return panda::JSValueRef::Undefined(vm);
3420     }
3421     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
3422     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
3423     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
3424     std::function<void(WebAllSslErrorEvent&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
3425                                                              func = panda::CopyableGlobal(vm, func)](
3426                                                              WebAllSslErrorEvent& event) -> void {
3427         panda::LocalScope pandaScope(vm);
3428         panda::TryCatch trycatch(vm);
3429         PipelineContext::SetCallBackNode(weak);
3430         const char* keys[] = { "handler", "error", "url", "originalUrl", "referrer", "isFatalError", "isMainFrame" };
3431         Framework::JSRef<Framework::JSObject> handlerObj = Framework::JSWeb::CreateSslErrorEventHandler(event);
3432         Local<JSValueRef> values[] = { handlerObj->GetLocalHandle(), panda::NumberRef::New(vm, event.GetError()),
3433             panda::StringRef::NewFromUtf8(vm, event.GetUrl().c_str()),
3434             panda::StringRef::NewFromUtf8(vm, event.GetOriginalUrl().c_str()),
3435             panda::StringRef::NewFromUtf8(vm, event.GetReferrer().c_str()),
3436             panda::BooleanRef::New(vm, event.GetIsFatalError()), panda::BooleanRef::New(vm, event.GetIsMainFrame()) };
3437         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
3438         eventObject->SetNativePointerFieldCount(vm, 1);
3439         eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&event));
3440         panda::Local<panda::JSValueRef> params[1] = { eventObject };
3441         func->Call(vm, func.ToLocal(), params, 1);
3442     };
3443     GetArkUINodeModifiers()->getWebModifier()->setOnSslErrorEvent(nativeNode, reinterpret_cast<void*>(&callback));
3444     return panda::JSValueRef::Undefined(vm);
3445 }
3446 
ResetOnSslErrorEvent(ArkUIRuntimeCallInfo * runtimeCallInfo)3447 ArkUINativeModuleValue WebBridge::ResetOnSslErrorEvent(ArkUIRuntimeCallInfo* runtimeCallInfo)
3448 {
3449     EcmaVM* vm = runtimeCallInfo->GetVM();
3450     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
3451     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
3452     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
3453     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
3454     GetArkUINodeModifiers()->getWebModifier()->resetOnSslErrorEvent(nativeNode);
3455     return panda::JSValueRef::Undefined(vm);
3456 }
3457 
SetOnDataResubmitted(ArkUIRuntimeCallInfo * runtimeCallInfo)3458 ArkUINativeModuleValue WebBridge::SetOnDataResubmitted(ArkUIRuntimeCallInfo* runtimeCallInfo)
3459 {
3460     EcmaVM* vm = runtimeCallInfo->GetVM();
3461     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
3462     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
3463     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
3464     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
3465     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
3466     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
3467         GetArkUINodeModifiers()->getWebModifier()->resetOnDataResubmitted(nativeNode);
3468         return panda::JSValueRef::Undefined(vm);
3469     }
3470     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
3471     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
3472     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
3473     std::function<void(DataResubmittedEvent&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
3474                                                               func = panda::CopyableGlobal(vm, func)](
3475                                                               DataResubmittedEvent& event) {
3476         panda::LocalScope pandaScope(vm);
3477         panda::TryCatch trycatch(vm);
3478         PipelineContext::SetCallBackNode(weak);
3479         Framework::JSRef<Framework::JSObject> handlerObj = Framework::JSWeb::CreateDataResubmittedHandler(event);
3480         auto eventObject = panda::ObjectRef::New(vm);
3481         eventObject->Set(vm, panda::StringRef::NewFromUtf8(vm, "handler"), handlerObj->GetLocalHandle());
3482         eventObject->SetNativePointerFieldCount(vm, 1);
3483         eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&event));
3484         panda::Local<panda::JSValueRef> params[1] = { eventObject };
3485         func->Call(vm, func.ToLocal(), params, 1);
3486     };
3487     GetArkUINodeModifiers()->getWebModifier()->setOnDataResubmitted(nativeNode, reinterpret_cast<void*>(&callback));
3488     return panda::JSValueRef::Undefined(vm);
3489 }
3490 
ResetOnDataResubmitted(ArkUIRuntimeCallInfo * runtimeCallInfo)3491 ArkUINativeModuleValue WebBridge::ResetOnDataResubmitted(ArkUIRuntimeCallInfo* runtimeCallInfo)
3492 {
3493     EcmaVM* vm = runtimeCallInfo->GetVM();
3494     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
3495     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
3496     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
3497     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
3498     GetArkUINodeModifiers()->getWebModifier()->resetOnDataResubmitted(nativeNode);
3499     return panda::JSValueRef::Undefined(vm);
3500 }
3501 
SetGestureFocusMode(ArkUIRuntimeCallInfo * runtimeCallInfo)3502 ArkUINativeModuleValue WebBridge::SetGestureFocusMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
3503 {
3504     EcmaVM* vm = runtimeCallInfo->GetVM();
3505     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
3506     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
3507     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
3508     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
3509     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
3510     int mode = secondArg->Int32Value(vm);
3511     GetArkUINodeModifiers()->getWebModifier()->setGestureFocusMode(nativeNode, mode);
3512     return panda::JSValueRef::Undefined(vm);
3513 }
3514 
ResetGestureFocusMode(ArkUIRuntimeCallInfo * runtimeCallInfo)3515 ArkUINativeModuleValue WebBridge::ResetGestureFocusMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
3516 {
3517     EcmaVM* vm = runtimeCallInfo->GetVM();
3518     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
3519     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
3520     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
3521     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
3522     GetArkUINodeModifiers()->getWebModifier()->resetGestureFocusMode(nativeNode);
3523     return panda::JSValueRef::Undefined(vm);
3524 }
3525 
ConvertCertChainDataToArray(EcmaVM * vm,const std::vector<std::string> & certChainData)3526 auto ConvertCertChainDataToArray(EcmaVM* vm, const std::vector<std::string>& certChainData)
3527 {
3528     auto certChainArray = panda::ArrayRef::New(vm, certChainData.size());
3529     if (certChainArray.IsEmpty() || certChainArray->IsNull()) {
3530         return panda::ArrayRef::New(vm, 0);
3531     }
3532     for (size_t i = 0; i < certChainData.size(); i++) {
3533         const std::string& certData = certChainData[i];
3534         auto arrayBuffer = panda::ArrayBufferRef::New(vm, certData.size());
3535         void* buffer = arrayBuffer->GetBuffer(vm);
3536         CHECK_NULL_RETURN(buffer, panda::ArrayRef::New(vm, 0));
3537 
3538         auto ret = memcpy_s(buffer, arrayBuffer->ByteLength(vm), certData.data(), certData.size());
3539         CHECK_NE_RETURN(ret, 0, panda::ArrayRef::New(vm, 0));
3540         auto uint8Array = panda::Uint8ArrayRef::New(vm, arrayBuffer, 0, certData.size());
3541         panda::ArrayRef::SetValueAt(vm, certChainArray, i, uint8Array);
3542     }
3543     return certChainArray;
3544 }
3545 
SetOnSslErrorEventReceive(ArkUIRuntimeCallInfo * runtimeCallInfo)3546 ArkUINativeModuleValue WebBridge::SetOnSslErrorEventReceive(ArkUIRuntimeCallInfo* runtimeCallInfo)
3547 {
3548     EcmaVM* vm = runtimeCallInfo->GetVM();
3549     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
3550     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
3551     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
3552     if (!firstArg->IsNativePointer(vm)) {
3553         return panda::NativePointerRef::New(vm, nullptr);
3554     }
3555     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
3556     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
3557         GetArkUINodeModifiers()->getWebModifier()->resetOnSslErrorEventReceive(nativeNode);
3558         return panda::JSValueRef::Undefined(vm);
3559     }
3560     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
3561     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
3562     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
3563     std::function<bool(WebSslErrorEvent&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
3564                                                           func = panda::CopyableGlobal(vm, func)](
3565                                                           WebSslErrorEvent& event) {
3566         panda::LocalScope pandaScope(vm);
3567         panda::TryCatch trycatch(vm);
3568         PipelineContext::SetCallBackNode(weak);
3569         auto certChainDataArray = ConvertCertChainDataToArray(vm, event.GetCertChainData());
3570         const char* keys[] = { "handler", "error", "certChainData" };
3571         Framework::JSRef<Framework::JSObject> handlerObj = Framework::JSWeb::CreateSslErrorEventReceiveHandler(event);
3572         auto errorCode = panda::NumberRef::New(vm, static_cast<int32_t>(event.GetError()));
3573         Local<JSValueRef> values[] = { handlerObj->GetLocalHandle(), errorCode, certChainDataArray };
3574         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
3575         eventObject->SetNativePointerFieldCount(vm, CALL_ARG_1);
3576         eventObject->SetNativePointerField(vm, CALL_ARG_0, static_cast<void*>(new WebSslErrorEvent(event)));
3577         panda::Local<panda::JSValueRef> params[CALL_ARG_1] = { eventObject };
3578         auto ret = func->Call(vm, func.ToLocal(), params, CALL_ARG_1);
3579         bool result = ret->IsBoolean() && ret->ToBoolean(vm)->Value();
3580         WebSslErrorEvent* eventPtr =
3581             static_cast<WebSslErrorEvent*>(eventObject->GetNativePointerField(vm, CALL_ARG_0));
3582         delete eventPtr;
3583         eventObject->SetNativePointerField(vm, CALL_ARG_1, static_cast<void*>(nullptr));
3584         return result;
3585     };
3586     GetArkUINodeModifiers()->getWebModifier()->setOnSslErrorEventReceive(
3587         nativeNode, reinterpret_cast<void*>(&callback));
3588     return panda::JSValueRef::Undefined(vm);
3589 }
3590 
ResetOnSslErrorEventReceive(ArkUIRuntimeCallInfo * runtimeCallInfo)3591 ArkUINativeModuleValue WebBridge::ResetOnSslErrorEventReceive(ArkUIRuntimeCallInfo* runtimeCallInfo)
3592 {
3593     EcmaVM* vm = runtimeCallInfo->GetVM();
3594     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
3595     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
3596     if (!firstArg->IsNativePointer(vm)) {
3597         return panda::NativePointerRef::New(vm, nullptr);
3598     }
3599     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
3600     GetArkUINodeModifiers()->getWebModifier()->resetOnSslErrorEventReceive(nativeNode);
3601     return panda::JSValueRef::Undefined(vm);
3602 }
3603 
3604 template<typename T>
String2StringValueWithVM(const EcmaVM * vm,T val)3605 panda::Local<panda::JSValueRef> String2StringValueWithVM(const EcmaVM* vm, T val)
3606 {
3607     if constexpr (std::is_same_v<T, std::string>) {
3608         return panda::StringRef::NewFromUtf8(vm, val.c_str());
3609     } else if constexpr (std::is_same_v<T, const char*>) {
3610         return panda::StringRef::NewFromUtf8(vm, val);
3611     } else if constexpr (std::is_same_v<T, std::u16string>) {
3612         return panda::StringRef::NewFromUtf16(vm, val.c_str());
3613     }
3614     return panda::JSValueRef::Undefined(vm);
3615 }
3616 
SetOnClientAuthenticationRequest(ArkUIRuntimeCallInfo * runtimeCallInfo)3617 ArkUINativeModuleValue WebBridge::SetOnClientAuthenticationRequest(ArkUIRuntimeCallInfo* runtimeCallInfo)
3618 {
3619     EcmaVM* vm = runtimeCallInfo->GetVM();
3620     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
3621     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
3622     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
3623     if (!firstArg->IsNativePointer(vm)) {
3624         return panda::NativePointerRef::New(vm, nullptr);
3625     }
3626     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
3627     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
3628         GetArkUINodeModifiers()->getWebModifier()->resetOnClientAuthenticationRequest(nativeNode);
3629         return panda::JSValueRef::Undefined(vm);
3630     }
3631     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
3632     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
3633     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
3634     std::function<bool(WebSslSelectCertEvent&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
3635                                                                func = panda::CopyableGlobal(vm, func)](
3636                                                                WebSslSelectCertEvent& event) -> bool {
3637         panda::LocalScope pandaScope(vm);
3638         panda::TryCatch trycatch(vm);
3639         PipelineContext::SetCallBackNode(weak);
3640 
3641         auto keyTypesArr = panda::ArrayRef::New(vm);
3642         if (keyTypesArr.IsEmpty() || keyTypesArr->IsNull()) {
3643             return false;
3644         }
3645         uint32_t idx = 0;
3646         for (const std::string& str : event.GetKeyTypes()) {
3647             panda::Local<panda::StringRef> item = String2StringValueWithVM(vm, str.c_str());
3648             panda::ArrayRef::SetValueAt(vm, keyTypesArr, idx++, item);
3649         }
3650         auto issuersArr = panda::ArrayRef::New(vm);
3651         if (issuersArr.IsEmpty() || issuersArr->IsNull()) {
3652             return false;
3653         }
3654         idx = 0;
3655         for (const std::string& str : event.GetIssuers_()) {
3656             panda::Local<panda::StringRef> item = String2StringValueWithVM(vm, str.c_str());
3657             panda::ArrayRef::SetValueAt(vm, issuersArr, idx++, item);
3658         }
3659         const char* keys[] = { "handler", "host", "port", "keyTypes", "issuers" };
3660         Framework::JSRef<Framework::JSObject> handlerObj =
3661             Framework::JSWeb::CreateClientAuthenticationRequestHandler(event);
3662         Local<JSValueRef> values[] = { handlerObj->GetLocalHandle(),
3663             panda::StringRef::NewFromUtf8(vm, event.GetHost().c_str()), panda::NumberRef::New(vm, event.GetPort()),
3664             keyTypesArr, issuersArr };
3665         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
3666         eventObject->SetNativePointerFieldCount(vm, CALL_ARG_1);
3667         eventObject->SetNativePointerField(vm, CALL_ARG_0, static_cast<void*>(&event));
3668         panda::Local<panda::JSValueRef> params[CALL_ARG_1] = { eventObject };
3669         auto ret = func->Call(vm, func.ToLocal(), params, CALL_ARG_1);
3670         return ret->IsBoolean() && ret->ToBoolean(vm)->Value();
3671     };
3672     GetArkUINodeModifiers()->getWebModifier()->setOnClientAuthenticationRequest(
3673         nativeNode, reinterpret_cast<void*>(&callback));
3674     return panda::JSValueRef::Undefined(vm);
3675 }
3676 
ResetOnClientAuthenticationRequest(ArkUIRuntimeCallInfo * runtimeCallInfo)3677 ArkUINativeModuleValue WebBridge::ResetOnClientAuthenticationRequest(ArkUIRuntimeCallInfo* runtimeCallInfo)
3678 {
3679     EcmaVM* vm = runtimeCallInfo->GetVM();
3680     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
3681     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
3682     if (!firstArg->IsNativePointer(vm)) {
3683         return panda::NativePointerRef::New(vm, nullptr);
3684     }
3685     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
3686     GetArkUINodeModifiers()->getWebModifier()->resetOnClientAuthenticationRequest(nativeNode);
3687     return panda::JSValueRef::Undefined(vm);
3688 }
3689 
IsValidJSObject(EcmaVM * vm,const panda::Local<panda::JSValueRef> & value)3690 bool IsValidJSObject(EcmaVM* vm, const panda::Local<panda::JSValueRef>& value)
3691 {
3692     if (value->IsUndefined() || value->IsNull() || !value->IsObject(vm)) {
3693         return false;
3694     }
3695     return true;
3696 }
3697 
ProcessStatusCode(EcmaVM * vm,panda::Local<panda::ObjectRef> jsObj,RefPtr<WebResponse> response)3698 void ProcessStatusCode(EcmaVM* vm, panda::Local<panda::ObjectRef> jsObj, RefPtr<WebResponse> response)
3699 {
3700     auto key = panda::StringRef::NewFromUtf8(vm, "code");
3701     if (jsObj->Has(vm, key)) {
3702         auto value = jsObj->Get(vm, key);
3703         if (value->IsNumber()) {
3704             double codeValue = value->ToNumber(vm)->Value();
3705             if (codeValue >= std::numeric_limits<int32_t>::min() &&
3706                 codeValue <= std::numeric_limits<int32_t>::max() &&
3707                 std::isfinite(codeValue)) {
3708                 response->SetStatusCode(static_cast<int32_t>(codeValue));
3709             }
3710         }
3711     }
3712 }
3713 
ProcessReason(EcmaVM * vm,panda::Local<panda::ObjectRef> jsObj,RefPtr<WebResponse> response)3714 void ProcessReason(EcmaVM* vm, panda::Local<panda::ObjectRef> jsObj, RefPtr<WebResponse> response)
3715 {
3716     auto key = panda::StringRef::NewFromUtf8(vm, "reason");
3717     if (jsObj->Has(vm, key)) {
3718         auto value = jsObj->Get(vm, key);
3719         if (value->IsString(vm)) {
3720             std::string reason = value->ToString(vm)->ToString(vm);
3721             response->SetReason(reason);
3722         }
3723     }
3724 }
3725 
IsValidHeaderName(const std::string & headerName)3726 bool IsValidHeaderName(const std::string& headerName)
3727 {
3728     if (headerName.empty()) {
3729         return false;
3730     }
3731 
3732     for (size_t i = 0; i < headerName.size(); ++i) {
3733         char c = headerName[i];
3734         if (!isalnum(c) && c != '-' && c != '_' && c != '!' && c != '*' && c != '\'' && c != '.' && c != ':') {
3735             return false;
3736         }
3737         if (c == ':' && i != headerName.size() - 1) {
3738             return false;
3739         }
3740     }
3741     return true;
3742 }
3743 
ProcessHeaders(EcmaVM * vm,panda::Local<panda::ObjectRef> jsObj,RefPtr<WebResponse> response)3744 void ProcessHeaders(EcmaVM* vm, panda::Local<panda::ObjectRef> jsObj, RefPtr<WebResponse> response)
3745 {
3746     auto key = panda::StringRef::NewFromUtf8(vm, "headers");
3747     if (!jsObj->Has(vm, key)) {
3748         return;
3749     }
3750     auto value = jsObj->Get(vm, key);
3751     if (!value->IsObject(vm)) {
3752         return;
3753     }
3754 
3755     auto headersObj = value->ToObject(vm);
3756     auto keys = headersObj->GetOwnPropertyNames(vm);
3757 
3758     for (size_t i = 0; i < keys->Length(vm); i++) {
3759         auto key = keys->Get(vm, i);
3760         auto val = headersObj->Get(vm, key);
3761         if (key->IsString(vm) && val->IsString(vm)) {
3762             std::string headerName = key->ToString(vm)->ToString(vm);
3763             std::string headerValue = val->ToString(vm)->ToString(vm);
3764             if (IsValidHeaderName(headerName)) {
3765                 response->SetHeadersVal(headerName, headerValue);
3766             }
3767         }
3768     }
3769 }
3770 
ProcessBody(EcmaVM * vm,panda::Local<panda::ObjectRef> jsObj,RefPtr<WebResponse> response)3771 void ProcessBody(EcmaVM* vm, panda::Local<panda::ObjectRef> jsObj, RefPtr<WebResponse> response)
3772 {
3773     auto key = panda::StringRef::NewFromUtf8(vm, "body");
3774     if (jsObj->Has(vm, key)) {
3775         auto value = jsObj->Get(vm, key);
3776         if (value->IsString(vm)) {
3777             std::string body = value->ToString(vm)->ToString(vm);
3778             response->SetData(body);
3779         }
3780     }
3781 }
3782 
ProcessFileHandle(EcmaVM * vm,panda::Local<panda::ObjectRef> jsObj,RefPtr<WebResponse> response)3783 void ProcessFileHandle(EcmaVM* vm, panda::Local<panda::ObjectRef> jsObj, RefPtr<WebResponse> response)
3784 {
3785     auto key = panda::StringRef::NewFromUtf8(vm, "fd");
3786     if (jsObj->Has(vm, key)) {
3787         auto value = jsObj->Get(vm, key);
3788         if (value->IsNumber()) {
3789             response->SetFileHandle(static_cast<int32_t>(value->ToNumber(vm)->Value()));
3790         }
3791     }
3792 }
3793 
ProcessResourceUrl(EcmaVM * vm,panda::Local<panda::ObjectRef> jsObj,RefPtr<WebResponse> response)3794 void ProcessResourceUrl(EcmaVM* vm, panda::Local<panda::ObjectRef> jsObj, RefPtr<WebResponse> response)
3795 {
3796     auto key = panda::StringRef::NewFromUtf8(vm, "resourceUrl");
3797     if (jsObj->Has(vm, key)) {
3798         auto value = jsObj->Get(vm, key);
3799         if (value->IsString(vm)) {
3800             response->SetResourceUrl(value->ToString(vm)->ToString(vm));
3801         }
3802     }
3803 }
3804 
ProcessMimeType(EcmaVM * vm,panda::Local<panda::ObjectRef> jsObj,RefPtr<WebResponse> response)3805 void ProcessMimeType(EcmaVM* vm, panda::Local<panda::ObjectRef> jsObj, RefPtr<WebResponse> response)
3806 {
3807     auto key = panda::StringRef::NewFromUtf8(vm, "mimeType");
3808     if (jsObj->Has(vm, key)) {
3809         auto value = jsObj->Get(vm, key);
3810         if (value->IsString(vm)) {
3811             std::string mimeType = value->ToString(vm)->ToString(vm);
3812             response->SetMimeType(mimeType);
3813         }
3814     }
3815 }
3816 
ProcessEncoding(EcmaVM * vm,panda::Local<panda::ObjectRef> jsObj,RefPtr<WebResponse> response)3817 void ProcessEncoding(EcmaVM* vm, panda::Local<panda::ObjectRef> jsObj, RefPtr<WebResponse> response)
3818 {
3819     auto key = panda::StringRef::NewFromUtf8(vm, "encoding");
3820     if (jsObj->Has(vm, key)) {
3821         auto value = jsObj->Get(vm, key);
3822         if (value->IsString(vm)) {
3823             std::string encoding = value->ToString(vm)->ToString(vm);
3824             response->SetEncoding(encoding);
3825         }
3826     }
3827 }
3828 
ProcessBuffer(EcmaVM * vm,panda::Local<panda::ObjectRef> jsObj,RefPtr<WebResponse> response)3829 void ProcessBuffer(EcmaVM* vm, panda::Local<panda::ObjectRef> jsObj, RefPtr<WebResponse> response)
3830 {
3831     auto key = panda::StringRef::NewFromUtf8(vm, "buffer");
3832     if (!jsObj->Has(vm, key))
3833         return;
3834 
3835     auto value = jsObj->Get(vm, key);
3836     if (!value->IsArrayBuffer(vm))
3837         return;
3838 
3839     panda::Local<panda::ArrayBufferRef> arrayBuffer = value->ToObject(vm);
3840     auto size = arrayBuffer->ByteLength(vm);
3841     if (size > 0) {
3842         auto copyPtr = std::make_unique<char[]>(size);
3843         CHECK_NULL_VOID(copyPtr);
3844         if (memcpy_s(copyPtr.get(), size, arrayBuffer->GetBuffer(vm), size) != 0) {
3845             response->SetBuffer(nullptr, 0);
3846             return;
3847         }
3848         response->SetBuffer(copyPtr.release(), size);
3849     }
3850 }
3851 
ProcessReadyState(EcmaVM * vm,panda::Local<panda::ObjectRef> jsObj,RefPtr<WebResponse> response)3852 void ProcessReadyState(EcmaVM* vm, panda::Local<panda::ObjectRef> jsObj, RefPtr<WebResponse> response)
3853 {
3854     auto key = panda::StringRef::NewFromUtf8(vm, "isReady");
3855     if (jsObj->Has(vm, key)) {
3856         auto value = jsObj->Get(vm, key);
3857         if (value->IsBoolean()) {
3858             response->SetResponseStatus(value->ToBoolean(vm)->Value());
3859         }
3860     }
3861 }
3862 
ConvertJSValueToWebResponse(EcmaVM * vm,const panda::Local<panda::JSValueRef> & value)3863 RefPtr<WebResponse> ConvertJSValueToWebResponse(EcmaVM* vm, const panda::Local<panda::JSValueRef>& value)
3864 {
3865     if (!IsValidJSObject(vm, value)) {
3866         return nullptr;
3867     }
3868 
3869     auto jsObj = value->ToObject(vm);
3870     RefPtr<WebResponse> response = AceType::MakeRefPtr<WebResponse>();
3871     response->SetResponseStatus(true);
3872 
3873     ProcessStatusCode(vm, jsObj, response);
3874     ProcessReason(vm, jsObj, response);
3875     ProcessHeaders(vm, jsObj, response);
3876     ProcessBody(vm, jsObj, response);
3877     ProcessFileHandle(vm, jsObj, response);
3878     ProcessResourceUrl(vm, jsObj, response);
3879     ProcessMimeType(vm, jsObj, response);
3880     ProcessEncoding(vm, jsObj, response);
3881     ProcessBuffer(vm, jsObj, response);
3882     ProcessReadyState(vm, jsObj, response);
3883     return response;
3884 }
3885 
SetOnInterceptRequest(ArkUIRuntimeCallInfo * runtimeCallInfo)3886 ArkUINativeModuleValue WebBridge::SetOnInterceptRequest(ArkUIRuntimeCallInfo* runtimeCallInfo)
3887 {
3888     EcmaVM* vm = runtimeCallInfo->GetVM();
3889     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
3890     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
3891     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
3892     if (!nativeNodeArg->IsNativePointer(vm)) {
3893         return panda::NativePointerRef::New(vm, nullptr);
3894     }
3895     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
3896     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
3897         GetArkUINodeModifiers()->getWebModifier()->resetOnInterceptRequest(nativeNode);
3898         return panda::JSValueRef::Undefined(vm);
3899     }
3900     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
3901     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
3902     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
3903     std::function<RefPtr<WebResponse>(OnInterceptRequestEvent&)> callback =
3904         [vm, weak = AceType::WeakClaim(frameNode),
3905             func = panda::CopyableGlobal(vm, func)](OnInterceptRequestEvent& event) {
3906             panda::LocalScope pandaScope(vm);
3907             panda::TryCatch trycatch(vm);
3908             PipelineContext::SetCallBackNode(weak);
3909             const char* keys[] = { "request" };
3910             Framework::JSRef<Framework::JSObject> handlerObj = Framework::JSWeb::CreateInterceptRequestHandler(event);
3911             Local<JSValueRef> values[] = { handlerObj->GetLocalHandle() };
3912 
3913             auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
3914             eventObject->SetNativePointerFieldCount(vm, CALL_ARG_1);
3915             eventObject->SetNativePointerField(vm, CALL_ARG_0, static_cast<void*>(&event));
3916             panda::Local<panda::JSValueRef> params[1] = { eventObject };
3917 
3918             auto ret = func->Call(vm, func.ToLocal(), params, CALL_ARG_1);
3919             RefPtr<WebResponse> response = ConvertJSValueToWebResponse(vm, ret);
3920             return response;
3921         };
3922     GetArkUINodeModifiers()->getWebModifier()->setOnInterceptRequest(nativeNode, reinterpret_cast<void*>(&callback));
3923     return panda::JSValueRef::Undefined(vm);
3924 }
3925 
ResetOnInterceptRequest(ArkUIRuntimeCallInfo * runtimeCallInfo)3926 ArkUINativeModuleValue WebBridge::ResetOnInterceptRequest(ArkUIRuntimeCallInfo* runtimeCallInfo)
3927 {
3928     EcmaVM* vm = runtimeCallInfo->GetVM();
3929     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
3930     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
3931     if (!firstArg->IsNativePointer(vm)) {
3932         return panda::NativePointerRef::New(vm, nullptr);
3933     }
3934     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
3935     GetArkUINodeModifiers()->getWebModifier()->resetOnInterceptRequest(nativeNode);
3936     return panda::JSValueRef::Undefined(vm);
3937 }
3938 
SetOnFaviconReceived(ArkUIRuntimeCallInfo * runtimeCallInfo)3939 ArkUINativeModuleValue WebBridge::SetOnFaviconReceived(ArkUIRuntimeCallInfo* runtimeCallInfo)
3940 {
3941     EcmaVM* vm = runtimeCallInfo->GetVM();
3942     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
3943     Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
3944     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
3945     if (!nativeNodeArg->IsNativePointer(vm)) {
3946         return panda::NativePointerRef::New(vm, nullptr);
3947     }
3948     auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
3949     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
3950         GetArkUINodeModifiers()->getWebModifier()->resetOnFaviconReceived(nativeNode);
3951         return panda::JSValueRef::Undefined(vm);
3952     }
3953     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
3954     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
3955     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
3956     std::function<void(FaviconReceivedEvent&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
3957                                                               func = panda::CopyableGlobal(vm, func)](
3958                                                               FaviconReceivedEvent& event) {
3959         panda::LocalScope pandaScope(vm);
3960         panda::TryCatch trycatch(vm);
3961         PipelineContext::SetCallBackNode(weak);
3962         const char* keys[] = { "favicon" };
3963         Framework::JSRef<Framework::JSObject> handlerObj = Framework::JSWeb::CreateFaviconReceivedHandler(event);
3964         if (handlerObj.IsEmpty()) {
3965             return;
3966         }
3967         Local<JSValueRef> values[] = { handlerObj->GetLocalHandle() };
3968 
3969         Local<panda::ObjectRef> eventObject = panda::ObjectRef::NewWithNamedProperties(
3970             vm, ArraySize(keys), keys, values);
3971         eventObject->SetNativePointerFieldCount(vm, CALL_ARG_1);
3972         eventObject->SetNativePointerField(vm, CALL_ARG_0, static_cast<void*>(&event));
3973         panda::Local<panda::JSValueRef> params[1] = { eventObject };
3974         func->Call(vm, func.ToLocal(), params, CALL_ARG_1);
3975     };
3976     GetArkUINodeModifiers()->getWebModifier()->setOnFaviconReceived(nativeNode, reinterpret_cast<void*>(&callback));
3977     return panda::JSValueRef::Undefined(vm);
3978 }
3979 
ResetOnFaviconReceived(ArkUIRuntimeCallInfo * runtimeCallInfo)3980 ArkUINativeModuleValue WebBridge::ResetOnFaviconReceived(ArkUIRuntimeCallInfo* runtimeCallInfo)
3981 {
3982     EcmaVM* vm = runtimeCallInfo->GetVM();
3983     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
3984     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
3985     if (!firstArg->IsNativePointer(vm)) {
3986         return panda::NativePointerRef::New(vm, nullptr);
3987     }
3988     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
3989     GetArkUINodeModifiers()->getWebModifier()->resetOnFaviconReceived(nativeNode);
3990     return panda::JSValueRef::Undefined(vm);
3991 }
3992 
SetOnBeforeUnload(ArkUIRuntimeCallInfo * runtimeCallInfo)3993 ArkUINativeModuleValue WebBridge::SetOnBeforeUnload(ArkUIRuntimeCallInfo* runtimeCallInfo)
3994 {
3995     EcmaVM* vm = runtimeCallInfo->GetVM();
3996     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
3997     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
3998     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
3999     if (!firstArg->IsNativePointer(vm)) {
4000         return panda::NativePointerRef::New(vm, nullptr);
4001     }
4002     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
4003     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
4004         GetArkUINodeModifiers()->getWebModifier()->resetOnBeforeUnload(nativeNode);
4005         return panda::JSValueRef::Undefined(vm);
4006     }
4007     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
4008     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
4009     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
4010     std::function<bool(WebDialogEvent&)> callback = [vm, weak = AceType::WeakClaim(frameNode),
4011                                                         func = panda::CopyableGlobal(vm, func)](
4012                                                         WebDialogEvent& event) {
4013         panda::LocalScope pandaScope(vm);
4014         panda::TryCatch trycatch(vm);
4015         PipelineContext::SetCallBackNode(weak);
4016         const char* keys[] = { "url", "message", "result", "isReload" };
4017         Framework::JSRef<Framework::JSObject> handlerObj = Framework::JSWeb::CreateCommonDialogResultHandler(event);
4018         Local<JSValueRef> values[] = { panda::StringRef::NewFromUtf8(vm, event.GetUrl().c_str()),
4019             panda::StringRef::NewFromUtf8(vm, event.GetMessage().c_str()), handlerObj->GetLocalHandle(),
4020             panda::BooleanRef::New(vm, event.GetIsReload()) };
4021         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
4022         eventObject->SetNativePointerFieldCount(vm, 1);
4023         eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&event));
4024         panda::Local<panda::JSValueRef> params[1] = { eventObject };
4025         auto ret = func->Call(vm, func.ToLocal(), params, 1);
4026         bool result = false;
4027         if (ret->IsBoolean()) {
4028             result = ret->IsBoolean() && ret->ToBoolean(vm)->Value();
4029         }
4030         return result;
4031     };
4032     GetArkUINodeModifiers()->getWebModifier()->setOnBeforeUnload(nativeNode, reinterpret_cast<void*>(&callback));
4033     return panda::JSValueRef::Undefined(vm);
4034 }
4035 
ResetOnBeforeUnload(ArkUIRuntimeCallInfo * runtimeCallInfo)4036 ArkUINativeModuleValue WebBridge::ResetOnBeforeUnload(ArkUIRuntimeCallInfo* runtimeCallInfo)
4037 {
4038     EcmaVM* vm = runtimeCallInfo->GetVM();
4039     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
4040     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
4041     if (!firstArg->IsNativePointer(vm)) {
4042         return panda::NativePointerRef::New(vm, nullptr);
4043     }
4044     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
4045     GetArkUINodeModifiers()->getWebModifier()->resetOnBeforeUnload(nativeNode);
4046     return panda::JSValueRef::Undefined(vm);
4047 }
4048 
SetJavaScriptProxy(ArkUIRuntimeCallInfo * runtimeCallInfo)4049 ArkUINativeModuleValue WebBridge::SetJavaScriptProxy(ArkUIRuntimeCallInfo* runtimeCallInfo)
4050 {
4051     EcmaVM* vm = runtimeCallInfo->GetVM();
4052     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
4053     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
4054     Local<JSValueRef> objectArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
4055     Local<JSValueRef> nameArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_2);
4056     Local<JSValueRef> methodListArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_3);
4057     Local<JSValueRef> controllerArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_4);
4058     Local<JSValueRef> asyncMethodListArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_5);
4059     Local<JSValueRef> permissionArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_6);
4060     if (!nodeArg->IsNativePointer(vm)) {
4061         return panda::NativePointerRef::New(vm, nullptr);
4062     }
4063     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
4064     auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
4065     if (frameNode == nullptr) {
4066         TAG_LOGE(AceLogTag::ACE_WEB, "SetJavaScriptProxy: frameNode is null");
4067         return panda::JSValueRef::Undefined(vm);
4068     }
4069     auto runtime = Framework::JsiDeclarativeEngineInstance::GetCurrentRuntime();
4070     if (!runtime) {
4071         TAG_LOGE(AceLogTag::ACE_WEB, "SetJavaScriptProxy: JsiRuntime not found");
4072         return panda::JSValueRef::Undefined(vm);
4073     }
4074 
4075     std::function<void()> callback = [runtime, frameNodeWeak = AceType::WeakClaim(frameNode),
4076                                          persistentObject = panda::CopyableGlobal(vm, objectArg),
4077                                          persistentName = panda::CopyableGlobal(vm, nameArg),
4078                                          persistentMethodList = panda::CopyableGlobal(vm, methodListArg),
4079                                          persistentController = panda::CopyableGlobal(vm, controllerArg),
4080                                          persistentAsyncMethodList = panda::CopyableGlobal(vm, asyncMethodListArg),
4081                                          persistentPermission = panda::CopyableGlobal(vm, permissionArg)]() mutable {
4082         const EcmaVM* vm = runtime->GetEcmaVm();
4083         if (!vm) {
4084             TAG_LOGE(AceLogTag::ACE_WEB, "JavaScriptProxy: vm is null");
4085             return;
4086         }
4087         panda::LocalScope scope(vm);
4088         panda::TryCatch trycatch(vm);
4089         PipelineContext::SetCallBackNode(frameNodeWeak.Upgrade());
4090         Local<JSValueRef> localController = persistentController.ToLocal();
4091         Local<JSValueRef> localObject = persistentObject.ToLocal();
4092         Local<JSValueRef> localName = persistentName.ToLocal();
4093         Local<JSValueRef> localMethodList = persistentMethodList.ToLocal();
4094         Local<JSValueRef> localAsyncMethodList = persistentAsyncMethodList.ToLocal();
4095         Local<JSValueRef> localPermission = persistentPermission.ToLocal();
4096         if (!localController->IsObject(vm)) {
4097             TAG_LOGE(AceLogTag::ACE_WEB, "JavaScriptProxy: controller is not an object");
4098             return;
4099         }
4100         Local<panda::ObjectRef> controllerObj = localController->ToObject(vm);
4101         Local<panda::StringRef> jsProxyKey = panda::StringRef::NewFromUtf8(vm, "jsProxy");
4102         Local<panda::JSValueRef> jsProxyFuncVal = controllerObj->Get(vm, jsProxyKey);
4103         if (!jsProxyFuncVal->IsFunction(vm)) {
4104             TAG_LOGE(AceLogTag::ACE_WEB, "JavaScriptProxy: jsProxy is not a function");
4105             return;
4106         }
4107         Local<panda::FunctionRef> jsProxyFunc = jsProxyFuncVal->ToObject(vm);
4108         auto func = panda::CopyableGlobal(vm, Local<panda::FunctionRef>(jsProxyFunc));
4109         Local<JSValueRef> argv[] = { localObject, localName, localMethodList, localAsyncMethodList, localPermission };
4110         func->Call(vm, controllerObj, argv, CALL_ARG_5);
4111     };
4112     GetArkUINodeModifiers()->getWebModifier()->setJavaScriptProxy(nativeNode, reinterpret_cast<void*>(&callback));
4113     return panda::JSValueRef::Undefined(vm);
4114 }
4115 
ResetJavaScriptProxy(ArkUIRuntimeCallInfo * runtimeCallInfo)4116 ArkUINativeModuleValue WebBridge::ResetJavaScriptProxy(ArkUIRuntimeCallInfo* runtimeCallInfo)
4117 {
4118     EcmaVM* vm = runtimeCallInfo->GetVM();
4119     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
4120     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
4121     if (!nodeArg->IsNativePointer(vm)) {
4122         return panda::NativePointerRef::New(vm, nullptr);
4123     }
4124     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
4125     GetArkUINodeModifiers()->getWebModifier()->resetJavaScriptProxy(nativeNode);
4126     return panda::JSValueRef::Undefined(vm);
4127 }
4128 } // namespace OHOS::Ace::NG