@react-native-ohos/react-native-webview 13.15.1-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.OpenSource +11 -0
- package/README.md +13 -0
- package/harmony/rn_webview/BuildProfile.ets +17 -0
- package/harmony/rn_webview/OAT.xml +45 -0
- package/harmony/rn_webview/build-profile.json5 +28 -0
- package/harmony/rn_webview/hvigorfile.ts +1 -0
- package/harmony/rn_webview/index.ets +13 -0
- package/harmony/rn_webview/oh-package.json5 +13 -0
- package/harmony/rn_webview/src/main/cpp/CMakeLists.txt +9 -0
- package/harmony/rn_webview/src/main/cpp/WebViewPackage.h +17 -0
- package/harmony/rn_webview/src/main/cpp/generated/RNOH/generated/BaseReactNativeWebviewPackage.h +95 -0
- package/harmony/rn_webview/src/main/cpp/generated/RNOH/generated/components/RNCWebViewJSIBinder.h +119 -0
- package/harmony/rn_webview/src/main/cpp/generated/RNOH/generated/turbo_modules/RNCWebView.cpp +18 -0
- package/harmony/rn_webview/src/main/cpp/generated/RNOH/generated/turbo_modules/RNCWebView.h +16 -0
- package/harmony/rn_webview/src/main/cpp/generated/RNOH/generated/turbo_modules/RNCWebViewModule.cpp +17 -0
- package/harmony/rn_webview/src/main/cpp/generated/RNOH/generated/turbo_modules/RNCWebViewModule.h +16 -0
- package/harmony/rn_webview/src/main/cpp/generated/react/renderer/components/react_native_webview/ComponentDescriptors.h +24 -0
- package/harmony/rn_webview/src/main/cpp/generated/react/renderer/components/react_native_webview/EventEmitters.cpp +241 -0
- package/harmony/rn_webview/src/main/cpp/generated/react/renderer/components/react_native_webview/EventEmitters.h +263 -0
- package/harmony/rn_webview/src/main/cpp/generated/react/renderer/components/react_native_webview/Props.cpp +103 -0
- package/harmony/rn_webview/src/main/cpp/generated/react/renderer/components/react_native_webview/Props.h +509 -0
- package/harmony/rn_webview/src/main/cpp/generated/react/renderer/components/react_native_webview/ShadowNodes.cpp +17 -0
- package/harmony/rn_webview/src/main/cpp/generated/react/renderer/components/react_native_webview/ShadowNodes.h +32 -0
- package/harmony/rn_webview/src/main/cpp/generated/react/renderer/components/react_native_webview/States.cpp +16 -0
- package/harmony/rn_webview/src/main/cpp/generated/react/renderer/components/react_native_webview/States.h +29 -0
- package/harmony/rn_webview/src/main/ets/CutomReference.ts +30 -0
- package/harmony/rn_webview/src/main/ets/Logger.ts +44 -0
- package/harmony/rn_webview/src/main/ets/Magic.ets +184 -0
- package/harmony/rn_webview/src/main/ets/RNCWebView.ets +571 -0
- package/harmony/rn_webview/src/main/ets/RNCWebViewPackage.ets +38 -0
- package/harmony/rn_webview/src/main/ets/ShouldRequestUrl.ts +48 -0
- package/harmony/rn_webview/src/main/ets/WebViewBaseOperate.ets +443 -0
- package/harmony/rn_webview/src/main/ets/WebViewTurboModule.ets +58 -0
- package/harmony/rn_webview/src/main/ets/generated/components/RNCWebView.ts +524 -0
- package/harmony/rn_webview/src/main/ets/generated/components/ts.ts +5 -0
- package/harmony/rn_webview/src/main/ets/generated/index.ets +5 -0
- package/harmony/rn_webview/src/main/ets/generated/ts.ts +6 -0
- package/harmony/rn_webview/src/main/ets/generated/turboModules/RNCWebView.ts +18 -0
- package/harmony/rn_webview/src/main/ets/generated/turboModules/RNCWebViewModule.ts +16 -0
- package/harmony/rn_webview/src/main/ets/generated/turboModules/ts.ts +6 -0
- package/harmony/rn_webview/src/main/module.json5 +11 -0
- package/harmony/rn_webview/src/main/resources/base/element/string.json +40 -0
- package/harmony/rn_webview/src/main/resources/en_US/element/string.json +40 -0
- package/harmony/rn_webview/src/main/resources/zh_CN/element/string.json +40 -0
- package/harmony/rn_webview/src/test/List.test.ets +5 -0
- package/harmony/rn_webview/src/test/LocalUnit.test.ets +33 -0
- package/harmony/rn_webview/ts.ets +9 -0
- package/harmony/rn_webview.har +0 -0
- package/package.json +99 -0
- package/src/NativeRNCWebView.ts +22 -0
- package/src/NativeRNCWebViewModule.ts +19 -0
- package/src/RNCWebViewNativeComponent.ts +354 -0
- package/src/WebView.harmony.tsx +343 -0
- package/src/WebView.tsx +10 -0
- package/src/codegenUtils.ts +11 -0
- package/src/index.ts +10 -0
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
// Copyright (c) 2025 Huawei Device Co., Ltd. All rights reserved
|
|
2
|
+
// Use of this source code is governed by a Apache-2.0 license that can be
|
|
3
|
+
// found in the LICENSE file.
|
|
4
|
+
|
|
5
|
+
import { RNC } from './generated/ts'
|
|
6
|
+
import { webview } from '@kit.ArkWeb'
|
|
7
|
+
import { CACHE_MODE, COMMAND_NAME, ONE_HUNDRED, WebViewEventParams } from './Magic';
|
|
8
|
+
import Logger from './Logger';
|
|
9
|
+
import { common, ConfigurationConstant } from '@kit.AbilityKit';
|
|
10
|
+
|
|
11
|
+
export const TAG = "WebView"
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
interface ProgressInterface {
|
|
15
|
+
progress: number;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
interface CreateWebViewEventInterface {
|
|
19
|
+
type: string;
|
|
20
|
+
progress: number;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export class BaseOperate {
|
|
24
|
+
private static LOCK_IDENTIFIER = 0
|
|
25
|
+
private eventEmitter: RNC.RNCWebView.EventEmitter
|
|
26
|
+
private controller: webview.WebviewController
|
|
27
|
+
private lockIdentifier: number = 0
|
|
28
|
+
|
|
29
|
+
constructor(eventEmitter: RNC.RNCWebView.EventEmitter, controller: webview.WebviewController) {
|
|
30
|
+
this.eventEmitter = eventEmitter
|
|
31
|
+
this.controller = controller
|
|
32
|
+
this.lockIdentifier = BaseOperate.generateLockIdentifier()
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
static setThirdPartyCookiesEnabled(status: boolean) {
|
|
36
|
+
try {
|
|
37
|
+
webview.WebCookieManager.putAcceptThirdPartyCookieEnabled(status);
|
|
38
|
+
} catch (error) {
|
|
39
|
+
Logger.error(TAG, `[RNOH] setThirdPartyCookiesEnabled Errorcode: ${error.code}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
static getColorMode(context: common.UIAbilityContext, forceDarkOn: boolean): WebDarkMode {
|
|
44
|
+
try {
|
|
45
|
+
return ((context.config.colorMode === ConfigurationConstant.ColorMode.COLOR_MODE_DARK) && forceDarkOn) ?
|
|
46
|
+
WebDarkMode.On : WebDarkMode.Off
|
|
47
|
+
} catch (error) {
|
|
48
|
+
Logger.error(TAG, `[RNOH] getColorMode Errorcode: ${error.code}`);
|
|
49
|
+
return WebDarkMode.Off
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
static generateLockIdentifier(): number {
|
|
54
|
+
BaseOperate.LOCK_IDENTIFIER = BaseOperate.LOCK_IDENTIFIER + 1
|
|
55
|
+
return BaseOperate.LOCK_IDENTIFIER
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
getLockIdentifier():number {
|
|
59
|
+
return this.lockIdentifier
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
setLockIdentifier(lockIdentifier: number) {
|
|
63
|
+
this.lockIdentifier = lockIdentifier
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
emitProgressChange(params: ProgressInterface) {
|
|
67
|
+
try {
|
|
68
|
+
this.eventEmitter!.emit('loadingProgress', {
|
|
69
|
+
url: this.controller.getUrl(),
|
|
70
|
+
loading: params.progress != ONE_HUNDRED,
|
|
71
|
+
title: this.controller.getTitle(),
|
|
72
|
+
canGoBack: this.controller.accessBackward(),
|
|
73
|
+
canGoForward: this.controller.accessForward(),
|
|
74
|
+
lockIdentifier: this.lockIdentifier,
|
|
75
|
+
progress: params.progress / ONE_HUNDRED
|
|
76
|
+
})
|
|
77
|
+
} catch (error) {
|
|
78
|
+
Logger.error(TAG, `[RNOH] emitProgressChange Errorcode: ${error.code}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
emitLoadingStart(params: ProgressInterface) {
|
|
83
|
+
try {
|
|
84
|
+
this.eventEmitter!.emit('loadingStart', {
|
|
85
|
+
url: this.controller.getUrl(),
|
|
86
|
+
loading: params.progress != ONE_HUNDRED,
|
|
87
|
+
title: this.controller.getTitle(),
|
|
88
|
+
canGoBack: this.controller.accessBackward(),
|
|
89
|
+
canGoForward: this.controller.accessForward(),
|
|
90
|
+
lockIdentifier: this.lockIdentifier,
|
|
91
|
+
navigationType: "other",
|
|
92
|
+
mainDocumentURL: ""
|
|
93
|
+
})
|
|
94
|
+
} catch (error) {
|
|
95
|
+
Logger.error(TAG, `[RNOH] emitLoadingStart Errorcode: ${error.code}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
emitLoadingFinish(params: ProgressInterface) {
|
|
100
|
+
try {
|
|
101
|
+
this.eventEmitter!.emit('loadingFinish', {
|
|
102
|
+
url: this.controller.getUrl(),
|
|
103
|
+
loading: params.progress != ONE_HUNDRED,
|
|
104
|
+
title: this.controller.getTitle(),
|
|
105
|
+
canGoBack: this.controller.accessBackward(),
|
|
106
|
+
canGoForward: this.controller.accessForward(),
|
|
107
|
+
lockIdentifier: this.lockIdentifier,
|
|
108
|
+
navigationType: "other",
|
|
109
|
+
mainDocumentURL: ""
|
|
110
|
+
})
|
|
111
|
+
} catch (error) {
|
|
112
|
+
Logger.error(TAG, `[RNOH] emitLoadingFinish Errorcode: ${error.code}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
emitLoadingError(event: OnErrorReceiveEvent) {
|
|
117
|
+
try {
|
|
118
|
+
if (!event.request.isMainFrame()) {
|
|
119
|
+
Logger.debug(TAG, "[RNOH] Not Main Frame Error");
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
this.eventEmitter!.emit('loadingError', {
|
|
123
|
+
url: this.controller.getUrl(),
|
|
124
|
+
loading: false,
|
|
125
|
+
title: this.controller.getTitle(),
|
|
126
|
+
canGoBack: this.controller.accessBackward(),
|
|
127
|
+
canGoForward: this.controller.accessForward(),
|
|
128
|
+
lockIdentifier: this.lockIdentifier,
|
|
129
|
+
domain: "",
|
|
130
|
+
code: event.error.getErrorCode(),
|
|
131
|
+
description: event.error.getErrorInfo()
|
|
132
|
+
})
|
|
133
|
+
} catch (error) {
|
|
134
|
+
Logger.error(TAG, `[RNOH] emitLoadingError Errorcode: ${error.code}`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
emitHttpError(event: OnHttpErrorReceiveEvent) {
|
|
139
|
+
try {
|
|
140
|
+
this.eventEmitter!.emit('httpError', {
|
|
141
|
+
url: this.controller.getUrl(),
|
|
142
|
+
loading: false,
|
|
143
|
+
title: this.controller.getTitle(),
|
|
144
|
+
canGoBack: this.controller.accessBackward(),
|
|
145
|
+
canGoForward: this.controller.accessForward(),
|
|
146
|
+
lockIdentifier: this.lockIdentifier,
|
|
147
|
+
description: event.response.getResponseData(),
|
|
148
|
+
statusCode: event.response.getResponseCode()
|
|
149
|
+
})
|
|
150
|
+
} catch (error) {
|
|
151
|
+
Logger.error(TAG, `[RNOH] emitHttpError Errorcode: ${error.code}`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
emitScroll(event: OnScrollEvent) {
|
|
156
|
+
try {
|
|
157
|
+
this.eventEmitter!.emit('scroll', {
|
|
158
|
+
contentInset: {
|
|
159
|
+
bottom: 0,
|
|
160
|
+
left: 0,
|
|
161
|
+
right: 0,
|
|
162
|
+
top: 0
|
|
163
|
+
},
|
|
164
|
+
contentOffset: { y: event.yOffset, x: event.xOffset },
|
|
165
|
+
contentSize: { height: 0, width: 0 },
|
|
166
|
+
layoutMeasurement: { height: 0, width: 0 }
|
|
167
|
+
})
|
|
168
|
+
} catch (error) {
|
|
169
|
+
Logger.error(TAG, `[RNOH] emitScroll Errorcode: ${error.code}`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
emitShouldStartLoadWithRequest(event: OnLoadInterceptEvent) {
|
|
174
|
+
try {
|
|
175
|
+
this.eventEmitter!.emit('shouldStartLoadWithRequest', {
|
|
176
|
+
url: event.data.getRequestUrl(),
|
|
177
|
+
loading: false,
|
|
178
|
+
title: this.controller.getTitle(),
|
|
179
|
+
canGoBack: this.controller.accessBackward(),
|
|
180
|
+
canGoForward: this.controller.accessForward(),
|
|
181
|
+
lockIdentifier: this.lockIdentifier,
|
|
182
|
+
navigationType: "other",
|
|
183
|
+
mainDocumentURL: "",
|
|
184
|
+
isTopFrame: false
|
|
185
|
+
})
|
|
186
|
+
} catch (error) {
|
|
187
|
+
Logger.error(TAG, `[RNOH] emitShouldStartLoadWithRequest Errorcode: ${error.code}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
emitShouldStartLoadWithRequestOverrideUrlLoading(event: WebResourceRequest) {
|
|
192
|
+
try {
|
|
193
|
+
this.eventEmitter!.emit('shouldStartLoadWithRequest', {
|
|
194
|
+
url: event.getRequestUrl(),
|
|
195
|
+
loading: false,
|
|
196
|
+
title: this.controller.getTitle(),
|
|
197
|
+
canGoBack: this.controller.accessBackward(),
|
|
198
|
+
canGoForward: this.controller.accessForward(),
|
|
199
|
+
lockIdentifier: this.lockIdentifier,
|
|
200
|
+
navigationType: "other",
|
|
201
|
+
mainDocumentURL: "",
|
|
202
|
+
isTopFrame: false
|
|
203
|
+
})
|
|
204
|
+
} catch (error) {
|
|
205
|
+
Logger.error(TAG, `[RNOH] emitShouldStartLoadWithRequest Errorcode: ${error.code}`);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
transCacheMode(cacheMode: CACHE_MODE): CacheMode {
|
|
210
|
+
let mode = CacheMode.Default
|
|
211
|
+
switch (cacheMode) {
|
|
212
|
+
case CACHE_MODE.LOAD_DEFAULT:
|
|
213
|
+
mode = CacheMode.Default
|
|
214
|
+
break;
|
|
215
|
+
case CACHE_MODE.LOAD_CACHE_ELSE_NETWORK:
|
|
216
|
+
mode = CacheMode.None
|
|
217
|
+
break;
|
|
218
|
+
case CACHE_MODE.LOAD_NO_CACHE:
|
|
219
|
+
mode = CacheMode.Online
|
|
220
|
+
break;
|
|
221
|
+
case CACHE_MODE.LOAD_CACHE_ONLY:
|
|
222
|
+
mode = CacheMode.Only
|
|
223
|
+
break;
|
|
224
|
+
default:
|
|
225
|
+
break;
|
|
226
|
+
}
|
|
227
|
+
return mode
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
createWebViewEvent(param: CreateWebViewEventInterface): WebViewEventParams {
|
|
231
|
+
let result: WebViewEventParams = new WebViewEventParams(param.type);
|
|
232
|
+
result.loading = param.progress != ONE_HUNDRED
|
|
233
|
+
try {
|
|
234
|
+
result.url = this.controller.getUrl();
|
|
235
|
+
result.title = this.controller.getTitle();
|
|
236
|
+
result.canGoBack = this.controller.accessBackward();
|
|
237
|
+
result.canGoForward = this.controller.accessForward();
|
|
238
|
+
} catch (error) {
|
|
239
|
+
result.url = "";
|
|
240
|
+
result.title = "";
|
|
241
|
+
result.canGoBack = false;
|
|
242
|
+
result.canGoForward = false;
|
|
243
|
+
}
|
|
244
|
+
return result;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// 与OS web同事 对齐 默认false 是取消静音
|
|
248
|
+
ignoreSilentHardwareSwitchMethods(ignoreSilentHardwareSwitch: boolean) {
|
|
249
|
+
this.controller.setAudioMuted(!ignoreSilentHardwareSwitch)
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
setCustomUserAgent(customUserAgent?: string, applicationNameForUserAgent?: string): void {
|
|
253
|
+
try {
|
|
254
|
+
if (customUserAgent) {
|
|
255
|
+
let userAgent: string = customUserAgent;
|
|
256
|
+
this.controller.setCustomUserAgent(userAgent);
|
|
257
|
+
}
|
|
258
|
+
if (applicationNameForUserAgent) {
|
|
259
|
+
this.controller.setCustomUserAgent(`${this.controller.getUserAgent()}${applicationNameForUserAgent}`);
|
|
260
|
+
}
|
|
261
|
+
} catch (error) {
|
|
262
|
+
Logger.debug(TAG,
|
|
263
|
+
`[RNOH] setCustomUserAgent ErrorCode: ${error.code}, userAgent: ${customUserAgent}`);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
injectJavaScript(args: string[]) {
|
|
268
|
+
try {
|
|
269
|
+
this.controller.runJavaScript(args[0])
|
|
270
|
+
} catch (error) {
|
|
271
|
+
Logger.error(TAG, `[RNOH] injectJavaScript Errorcode: ${error.code}`);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
postMessage(args: string[]) {
|
|
276
|
+
let data = JSON.stringify({ data: args[0] })
|
|
277
|
+
let result: string = "(function () {" +
|
|
278
|
+
"var event;" +
|
|
279
|
+
"var data = " + data.toString() + ";" +
|
|
280
|
+
"try {" +
|
|
281
|
+
"event = new MessageEvent('message', data);" +
|
|
282
|
+
"} catch (e) {" +
|
|
283
|
+
"event = document.createEvent('MessageEvent');" +
|
|
284
|
+
"event.initMessageEvent('message', true, true, data.data, data.origin, data.lastEventId, data.source);" +
|
|
285
|
+
"}" +
|
|
286
|
+
"document.dispatchEvent(event);" +
|
|
287
|
+
"})();"
|
|
288
|
+
try {
|
|
289
|
+
this.controller.runJavaScript(result)
|
|
290
|
+
} catch (error) {
|
|
291
|
+
Logger.error(TAG, `[RNOH] postMessage Errorcode: ${error.code}`);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
reload() {
|
|
296
|
+
try {
|
|
297
|
+
this.controller.refresh();
|
|
298
|
+
} catch (error) {
|
|
299
|
+
Logger.error(TAG, `[RNOH] reload Errorcode: ${error.code}`);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
goBack() {
|
|
304
|
+
try {
|
|
305
|
+
this.controller.backward();
|
|
306
|
+
} catch (error) {
|
|
307
|
+
Logger.error(TAG, `[RNOH] goBack Errorcode: ${error.code}`);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
goForward() {
|
|
312
|
+
try {
|
|
313
|
+
this.controller.forward();
|
|
314
|
+
} catch (error) {
|
|
315
|
+
Logger.error(TAG, `[RNOH] goForward Errorcode: ${error.code}`);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
requestFocus() {
|
|
320
|
+
try {
|
|
321
|
+
this.controller.requestFocus();
|
|
322
|
+
} catch (error) {
|
|
323
|
+
Logger.error(TAG, `[RNOH] requestFocus Errorcode: ${error.code}`);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
clearCache(args: string[]) {
|
|
328
|
+
try {
|
|
329
|
+
const removeFlag = !!args[0] === true;
|
|
330
|
+
this.controller.removeCache(removeFlag);
|
|
331
|
+
} catch (error) {
|
|
332
|
+
Logger.error(TAG, `[RNOH] clearCache Errorcode: ${error.code}`);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
clearHistory() {
|
|
337
|
+
try {
|
|
338
|
+
this.controller.clearHistory();
|
|
339
|
+
} catch (error) {
|
|
340
|
+
Logger.error(TAG, `[RNOH] clearHistory Errorcode: ${error.code}`);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
stopLoading() {
|
|
345
|
+
try {
|
|
346
|
+
this.controller.stop();
|
|
347
|
+
} catch (error) {
|
|
348
|
+
Logger.error(TAG, `[RNOH] stopLoading Errorcode: ${error.code}`);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
loadUrl(args: string[]) {
|
|
353
|
+
try {
|
|
354
|
+
this.controller.loadUrl(args[0]);
|
|
355
|
+
} catch (error) {
|
|
356
|
+
Logger.error(TAG, `[RNOH] loadUrl Errorcode: ${error.code}`);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
registerCommandCallback(commandName: COMMAND_NAME, args: string[]) {
|
|
361
|
+
switch (commandName) {
|
|
362
|
+
case COMMAND_NAME.INJECTJAVASCRIPT:
|
|
363
|
+
this.injectJavaScript(args)
|
|
364
|
+
break
|
|
365
|
+
case COMMAND_NAME.POSTMESSAGE:
|
|
366
|
+
this.postMessage(args)
|
|
367
|
+
break
|
|
368
|
+
case COMMAND_NAME.RELOAD:
|
|
369
|
+
this.reload()
|
|
370
|
+
break
|
|
371
|
+
case COMMAND_NAME.GOBACK:
|
|
372
|
+
this.goBack()
|
|
373
|
+
break
|
|
374
|
+
case COMMAND_NAME.GOFORWARD:
|
|
375
|
+
this.goForward()
|
|
376
|
+
break
|
|
377
|
+
case COMMAND_NAME.REQUESTFOCUS:
|
|
378
|
+
this.requestFocus()
|
|
379
|
+
case COMMAND_NAME.CLEARCACHE:
|
|
380
|
+
this.clearCache(args)
|
|
381
|
+
case COMMAND_NAME.CLEARHISTORY:
|
|
382
|
+
this.clearHistory()
|
|
383
|
+
break
|
|
384
|
+
case COMMAND_NAME.STOPLOADING:
|
|
385
|
+
this.stopLoading()
|
|
386
|
+
break
|
|
387
|
+
case COMMAND_NAME.LOADURL:
|
|
388
|
+
this.loadUrl(args)
|
|
389
|
+
break
|
|
390
|
+
default:
|
|
391
|
+
break
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
setOriginWhitelist(uris: string) {
|
|
396
|
+
try {
|
|
397
|
+
this.controller.setUrlTrustList(uris);
|
|
398
|
+
} catch (error) {
|
|
399
|
+
Logger.error(TAG, `[RNOH] setOriginWhitelist Errorcode: ${error.code}`);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
setIncognito() {
|
|
404
|
+
this.controller.clearHistory()
|
|
405
|
+
webview.WebCookieManager.clearAllCookiesSync(true);
|
|
406
|
+
webview.WebCookieManager.clearSessionCookieSync()
|
|
407
|
+
webview.WebStorage.deleteAllData();
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
setFraudulentWebsiteWarningEnabled(status: boolean) {
|
|
411
|
+
try {
|
|
412
|
+
this.controller.enableSafeBrowsing(status);
|
|
413
|
+
} catch (error) {
|
|
414
|
+
Logger.error(TAG, `[RNOH] setFraudulentWebsiteWarningEnabled Errorcode: ${error.code}`);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
onDownloadStart(event: OnDownloadStartEvent) {
|
|
419
|
+
try {
|
|
420
|
+
this.eventEmitter!.emit('fileDownload', {
|
|
421
|
+
downloadUrl: event.url
|
|
422
|
+
})
|
|
423
|
+
} catch (error) {
|
|
424
|
+
Logger.error(TAG, `[RNOH] onDownloadStart Errorcode: ${error.code}`);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
onRenderExited(event: OnRenderExitedEvent) {
|
|
429
|
+
try {
|
|
430
|
+
|
|
431
|
+
} catch (error) {
|
|
432
|
+
Logger.error(TAG, `[RNOH] onRenderExited Errorcode: ${error.code}`);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
onTitleReceive(event: OnTitleReceiveEvent) {
|
|
437
|
+
try {
|
|
438
|
+
|
|
439
|
+
} catch (error) {
|
|
440
|
+
Logger.error(TAG, `[RNOH] onTitleReceive Errorcode: ${error.code}`);
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// Copyright (c) 2025 Huawei Device Co., Ltd. All rights reserved
|
|
2
|
+
// Use of this source code is governed by a Apache-2.0 license that can be
|
|
3
|
+
// found in the LICENSE file.
|
|
4
|
+
|
|
5
|
+
import { TM } from './generated/ts';
|
|
6
|
+
import { AnyThreadTurboModule } from '@rnoh/react-native-openharmony/ts';
|
|
7
|
+
import Logger from './Logger';
|
|
8
|
+
|
|
9
|
+
const TAG = "WebViewTurboModule"
|
|
10
|
+
|
|
11
|
+
export class WebViewTurboModule extends AnyThreadTurboModule implements TM.RNCWebViewModule.Spec {
|
|
12
|
+
private shouldStartParamsMap : Map<number,ShouldStartParams> = new Map();
|
|
13
|
+
|
|
14
|
+
isFileUploadSupported(): Promise<boolean> {
|
|
15
|
+
return Promise.resolve(true)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
shouldStartLoadWithLockIdentifier(shouldStart: boolean, lockIdentifier: number): void {
|
|
19
|
+
Logger.debug("shouldStartLoadWithLockIdentifier:" + shouldStart + " lockIdentifier:" + lockIdentifier)
|
|
20
|
+
let shouldStartParams = this.shouldStartParamsMap.get(lockIdentifier)
|
|
21
|
+
Logger.debug("shouldStartLoadWithLockIdentifier setShouldStartParams:" + JSON.stringify(shouldStartParams))
|
|
22
|
+
if (shouldStartParams) {
|
|
23
|
+
shouldStartParams.shouldStart = shouldStart
|
|
24
|
+
shouldStartParams.lockState = shouldStart ? ShouldOverrideCallbackState.ALLOW_LOADING : ShouldOverrideCallbackState.SHOULD_OVERRIDE;
|
|
25
|
+
}
|
|
26
|
+
this.shouldStartParamsMap.set(lockIdentifier,shouldStartParams || new ShouldStartParams())
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
setShouldStartParams(params: ShouldStartParams){
|
|
31
|
+
Logger.debug("setShouldStartParams:" + JSON.stringify(params))
|
|
32
|
+
this.shouldStartParamsMap.set(params.lockIdentifier,params)
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// 锁状态
|
|
37
|
+
export enum ShouldOverrideCallbackState {
|
|
38
|
+
/**
|
|
39
|
+
* 初始状态
|
|
40
|
+
*/
|
|
41
|
+
UNDECIDED,
|
|
42
|
+
/**
|
|
43
|
+
* 阻止加载
|
|
44
|
+
*/
|
|
45
|
+
SHOULD_OVERRIDE,
|
|
46
|
+
/**
|
|
47
|
+
* 允许加载
|
|
48
|
+
*/
|
|
49
|
+
ALLOW_LOADING,
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
@Sendable
|
|
53
|
+
export class ShouldStartParams {
|
|
54
|
+
shouldStart: boolean = true
|
|
55
|
+
lockIdentifier: number = -1
|
|
56
|
+
// 对应ShouldOverrideCallbackState
|
|
57
|
+
lockState: number = 0
|
|
58
|
+
}
|