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