• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Class (WebviewController)
2<!--Kit: ArkWeb-->
3<!--Subsystem: Web-->
4<!--Owner: @yp99ustc; @aohui; @zourongchun-->
5<!--Designer: @LongLie; @yaomingliu; @zhufenghao-->
6<!--Tester: @ghiker-->
7<!--Adviser: @HelloCrease-->
8
9通过WebviewController可以控制Web组件各种行为(包括页面导航、生命周期状态、JavaScript交互等行为)。一个WebviewController对象只能控制一个Web组件,且必须在Web组件和WebviewController绑定后,才能调用WebviewController上的方法(静态方法除外)。
10
11> **说明:**
12>
13> - 本模块首批接口从API version 9开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
14>
15> - 本Class首批接口从API version 9开始支持。
16>
17> - 示例效果请以真机运行为准,当前DevEco Studio预览器不支持。
18
19## 导入模块
20
21```ts
22import { webview } from '@kit.ArkWeb';
23```
24
25## constructor<sup>11+</sup>
26
27constructor(webTag?: string)
28
29用于创建 WebviewController 对象的构造函数。
30
31> **说明:**
32>
33> 不传参:new webview.WebviewController()表示构造函数为空,不使用C API时不需要传参。
34>
35> 传参且参数是合法字符串:new webview.WebviewController("xxx"),用于开发者区分多实例,并调用对应实例下的方法。
36>
37> 传入参数为空:new webview.WebviewController("")或new webview.WebviewController(undefined),该场景下参数无意义,无法区分多个实例,直接返回undefined,需要开发者判断返回值是否正常。
38>
39> Web组件销毁后会解绑WebViewController,之后调用WebviewController的非静态方法会抛出17100001异常,应注意调用时机和捕获异常,防止进程异常退出。
40
41**系统能力:** SystemCapability.Web.Webview.Core
42
43**参数:**
44
45| 参数名     | 类型   | 必填 | 说明                               |
46| ---------- | ------ | ---- | -------------------------------- |
47| webTag   | string | 否   | 指定了 Web 组件的名称。 |
48
49**示例:**
50
51```ts
52// xxx.ets
53import { webview } from '@kit.ArkWeb';
54import { BusinessError } from '@kit.BasicServicesKit';
55
56class WebObj {
57  constructor() {
58  }
59
60  webTest(): string {
61    console.info('Web test');
62    return "Web test";
63  }
64
65  webString(): void {
66    console.info('Web test toString');
67  }
68}
69
70@Entry
71@Component
72struct WebComponent {
73  controller: webview.WebviewController = new webview.WebviewController()
74  @State webTestObj: WebObj = new WebObj();
75
76  build() {
77    Column() {
78      Button('refresh')
79        .onClick(() => {
80          try {
81            this.controller.refresh();
82          } catch (error) {
83            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
84          }
85        })
86      Button('deleteJavaScriptRegister')
87        .onClick(() => {
88          try {
89            this.controller.deleteJavaScriptRegister("objTestName");
90          } catch (error) {
91            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
92          }
93        })
94      Web({ src: '', controller: this.controller })
95        .javaScriptAccess(true)
96        .onControllerAttached(() => {
97          this.controller.loadUrl($rawfile("index.html"));
98          this.controller.registerJavaScriptProxy(this.webTestObj, "objTestName", ["webTest", "webString"]);
99        })
100    }
101  }
102}
103```
104
105加载的html文件。
106```html
107<!-- index.html -->
108<!DOCTYPE html>
109<html>
110    <head>
111      <meta charset="utf-8">
112    </head>
113    <body>
114      <button type="button" onclick="htmlTest()">Click Me!</button>
115      <p id="demo"></p>
116      <p id="webDemo"></p>
117      <script type="text/javascript">
118        function htmlTest() {
119          // This function call expects to return "Web test"
120          let webStr = objTestName.webTest();
121          document.getElementById("webDemo").innerHTML=webStr;
122          console.info('objTestName.webTest result:'+ webStr)
123        }
124      </script>
125    </body>
126</html>
127```
128
129## initializeWebEngine
130
131static initializeWebEngine(): void
132
133在 Web 组件初始化之前,通过此接口加载 Web 引擎的动态库文件,以提高启动性能。自动预连接历史访问过的高频网站。
134
135> **说明:**
136>
137> - initializeWebEngine不支持在异步线程中调用,否则会造成崩溃。
138> - initializeWebEngine全局生效,在整个APP生命周期中调用一次即可,不需要重复调用。
139
140**系统能力:** SystemCapability.Web.Webview.Core
141
142**示例:**
143
144本示例以EntryAbility为例,描述了在 Ability 创建阶段完成 Web 组件动态库加载的功能。
145
146```ts
147// xxx.ets
148import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
149import { webview } from '@kit.ArkWeb';
150
151export default class EntryAbility extends UIAbility {
152  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
153    console.info("EntryAbility onCreate")
154    webview.WebviewController.initializeWebEngine()
155    console.info("EntryAbility onCreate done")
156  }
157}
158```
159
160## setHttpDns<sup>10+</sup>
161
162static setHttpDns(secureDnsMode:SecureDnsMode, secureDnsConfig:string): void
163
164设置Web组件是否使用HTTPDNS解析DNS。
165
166**系统能力:** SystemCapability.Web.Webview.Core
167
168**参数:**
169
170| 参数名              | 类型    | 必填   |  说明 |
171| ------------------ | ------- | ---- | ------------- |
172| secureDnsMode         |   [SecureDnsMode](./arkts-apis-webview-e.md#securednsmode10)   | 是   | 使用HTTPDNS的模式。|
173| secureDnsConfig       | string | 是 | HTTPDNS server的配置,必须是https协议并且只允许配置一个server。 |
174
175**错误码:**
176
177以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
178
179| 错误码ID | 错误信息                  |
180| -------- | ----------------------- |
181| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3. Parameter verification failed.                                   |
182
183**示例:**
184
185```ts
186// xxx.ets
187import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
188import { webview } from '@kit.ArkWeb';
189import { BusinessError } from '@kit.BasicServicesKit';
190
191export default class EntryAbility extends UIAbility {
192  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
193    console.info("EntryAbility onCreate")
194    try {
195      webview.WebviewController.setHttpDns(webview.SecureDnsMode.AUTO, "https://example1.test")
196    } catch (error) {
197      console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
198    }
199
200    AppStorage.setOrCreate("abilityWant", want);
201    console.info("EntryAbility onCreate done")
202  }
203}
204```
205
206## setWebDebuggingAccess
207
208static setWebDebuggingAccess(webDebuggingAccess: boolean): void
209
210设置是否启用网页调试功能。详情请参考[DevTools工具](../../web/web-debugging-with-devtools.md)。
211
212安全提示:启用网页调试功能可以让用户检查修改Web页面内部状态,存在安全隐患,不建议在应用正式发布版本中启用。
213
214**系统能力:** SystemCapability.Web.Webview.Core
215
216**参数:**
217
218| 参数名              | 类型    | 必填   |  说明 |
219| ------------------ | ------- | ---- | ------------- |
220| webDebuggingAccess | boolean | 是   | 设置是否启用网页调试功能。<br>true表示启用网页调试功能。false表示不启用网页调试功能。<br>默认值:false。 |
221
222**错误码:**
223
224以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
225
226| 错误码ID  | 错误信息                                                      |
227| -------- | ------------------------------------------------------------ |
228| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. |
229
230**示例:**
231
232```ts
233// xxx.ets
234import { webview } from '@kit.ArkWeb';
235import { BusinessError } from '@kit.BasicServicesKit';
236
237@Entry
238@Component
239struct WebComponent {
240  controller: webview.WebviewController = new webview.WebviewController();
241
242  aboutToAppear(): void {
243    try {
244      webview.WebviewController.setWebDebuggingAccess(true);
245    } catch (error) {
246      console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
247    }
248  }
249
250  build() {
251    Column() {
252      Web({ src: 'www.example.com', controller: this.controller })
253    }
254  }
255}
256```
257
258## loadUrl
259
260loadUrl(url: string | Resource, headers?: Array\<WebHeader>): void
261
262加载指定的URL。
263
264**系统能力:** SystemCapability.Web.Webview.Core
265
266**参数:**
267
268| 参数名  | 类型             | 必填 | 说明                  |
269| ------- | ---------------- | ---- | :-------------------- |
270| url     | string \| Resource | 是   | 需要加载的 URL。      |
271| headers | Array\<[WebHeader](./arkts-apis-webview-i.md#webheader)> | 否   | URL的附加HTTP请求头。<br>默认值: [] |
272
273**错误码:**
274
275以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
276
277| 错误码ID | 错误信息                                                     |
278| -------- | ------------------------------------------------------------ |
279| 17100001 | Init error. The WebviewController must be associated with a Web component. |
280| 17100002 | URL error. The webpage corresponding to the URL is invalid, or the URL length exceeds 2048.                                                 |
281| 17100003 | Invalid resource path or file type.                          |
282| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. |
283
284**示例:**
285
286```ts
287// xxx.ets
288import { webview } from '@kit.ArkWeb';
289import { BusinessError } from '@kit.BasicServicesKit';
290
291@Entry
292@Component
293struct WebComponent {
294  controller: webview.WebviewController = new webview.WebviewController();
295
296  build() {
297    Column() {
298      Button('loadUrl')
299        .onClick(() => {
300          try {
301            // 需要加载的URL是string类型。
302            this.controller.loadUrl('www.example.com');
303          } catch (error) {
304            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
305          }
306        })
307      Web({ src: 'www.example.com', controller: this.controller })
308    }
309  }
310}
311```
312
313```ts
314// xxx.ets
315import { webview } from '@kit.ArkWeb';
316import { BusinessError } from '@kit.BasicServicesKit';
317
318@Entry
319@Component
320struct WebComponent {
321  controller: webview.WebviewController = new webview.WebviewController();
322
323  build() {
324    Column() {
325      Button('loadUrl')
326        .onClick(() => {
327          try {
328            // 带参数headers。
329            this.controller.loadUrl('www.example.com', [{ headerKey: "headerKey", headerValue: "headerValue" }]);
330          } catch (error) {
331            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
332          }
333        })
334      Web({ src: 'www.example.com', controller: this.controller })
335    }
336  }
337}
338```
339
340加载本地网页,加载本地资源文件有三种方式。
341
3421.$rawfile方式。
343```ts
344// xxx.ets
345import { webview } from '@kit.ArkWeb';
346import { BusinessError } from '@kit.BasicServicesKit';
347
348@Entry
349@Component
350struct WebComponent {
351  controller: webview.WebviewController = new webview.WebviewController();
352
353  build() {
354    Column() {
355      Button('loadUrl')
356        .onClick(() => {
357          try {
358            // 通过$rawfile加载本地资源文件。
359            this.controller.loadUrl($rawfile('index.html'));
360          } catch (error) {
361            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
362          }
363        })
364      Web({ src: 'www.example.com', controller: this.controller })
365    }
366  }
367}
368```
369
3702.resources协议,适用Webview加载带有"#"路由的链接。
371```ts
372// xxx.ets
373import { webview } from '@kit.ArkWeb';
374import { BusinessError } from '@kit.BasicServicesKit';
375
376@Entry
377@Component
378struct WebComponent {
379  controller: webview.WebviewController = new webview.WebviewController();
380
381  build() {
382    Column() {
383      Button('loadUrl')
384        .onClick(() => {
385          try {
386            // 通过resource协议加载本地资源文件。
387            this.controller.loadUrl("resource://rawfile/index.html");
388          } catch (error) {
389            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
390          }
391        })
392      Web({ src: 'www.example.com', controller: this.controller })
393    }
394  }
395}
396```
397
3983.通过沙箱路径加载本地文件,可以参考[web](../../web/web-page-loading-with-web-components.md#加载本地页面)加载沙箱路径的示例代码。
399
400加载的html文件。
401```html
402<!-- index.html -->
403<!DOCTYPE html>
404<html>
405  <body>
406    <p>Hello World</p>
407  </body>
408</html>
409```
410
411## loadData
412
413loadData(data: string, mimeType: string, encoding: string, baseUrl?: string, historyUrl?: string): void
414
415加载指定的数据。
416
417baseUrl与historyUrl同时为空的情况下:
418
419encoding如果为非base64(包括空值),则假定数据对安全URL字符范围内的八位字节使用ASCII编码,对该范围外的八位字节使用URL的标准%xx十六进制编码。
420
421data数据必须使用base64编码或将内容中的任何#字符编码为%23。否则#将被视为内容的结尾而剩余的文本将被用作文档片段标识符。
422
423> **说明:**
424>
425> - 若加载本地图片,可以给baseUrl或historyUrl任一参数赋值空格,详情请参考示例代码。
426>
427> - 加载本地图片场景,baseUrl和historyUrl不能同时为空,否则图片无法成功加载。
428>
429> - 若html中的富文本中带有注入#等特殊字符,建议将baseUrl和historyUrl两个参数的值设置为"空格"。
430>
431> - 加载文字场景,需主动设置`<meta name="viewport" content="width=device-width, initial-scale=1.0" charset="utf-8">`避免文本字体大小不一致。
432
433**系统能力:** SystemCapability.Web.Webview.Core
434
435**参数:**
436
437| 参数名     | 类型   | 必填 | 说明                                                         |
438| ---------- | ------ | ---- | ------------------------------------------------------------ |
439| data       | string | 是   | 按照"base64"或者"URL"编码后的一段字符串。                    |
440| mimeType   | string | 是   | 媒体类型(MIME)。                                           |
441| encoding   | string | 是   | 编码类型,具体为"base64"或者"URL"编码。                       |
442| baseUrl    | string | 否   | 指定的一个URL路径("http"/"https"/"data"协议),并由Web组件赋值给`window.origin`。当加载大量html文件时,需设置为"data"。 |
443| historyUrl | string | 否   | 用作历史记录所使用的URL。非空时,历史记录以此URL进行管理。当baseUrl为空时,此属性无效。 |
444
445**错误码:**
446
447以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
448
449| 错误码ID | 错误信息                                                     |
450| -------- | ------------------------------------------------------------ |
451| 17100001 | Init error. The WebviewController must be associated with a Web component. |
452| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. |
453
454**示例:**
455
456baseUrl与historyUrl同时为空。
457```ts
458// xxx.ets
459import { webview } from '@kit.ArkWeb';
460import { BusinessError } from '@kit.BasicServicesKit';
461
462@Entry
463@Component
464struct WebComponent {
465  controller: webview.WebviewController = new webview.WebviewController();
466
467  build() {
468    Column() {
469      Button('loadData')
470        .onClick(() => {
471          try {
472            this.controller.loadData(
473              "<html><body bgcolor=\"white\">Source:<pre>source</pre></body></html>",
474              "text/html",
475              // UTF-8为charset。
476              "UTF-8"
477            );
478          } catch (error) {
479            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
480          }
481        })
482      Web({ src: 'www.example.com', controller: this.controller })
483    }
484  }
485}
486```
487
488```ts
489// xxx.ets
490import { webview } from '@kit.ArkWeb';
491import { BusinessError } from '@kit.BasicServicesKit';
492
493@Entry
494@Component
495struct WebComponent {
496  controller: webview.WebviewController = new webview.WebviewController();
497
498  build() {
499    Column() {
500      Button('loadData')
501        .onClick(() => {
502          try {
503            this.controller.loadData(
504              // Coding tests通过base64编码后的字符串。
505              "Q29kaW5nIHRlc3Rz",
506              "text/html",
507              "base64"
508            );
509          } catch (error) {
510            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
511          }
512        })
513      Web({ src: 'www.example.com', controller: this.controller })
514    }
515  }
516}
517```
518
519指定baseURL。
520```ts
521// xxx.ets
522import { webview } from '@kit.ArkWeb';
523import { BusinessError } from '@kit.BasicServicesKit';
524
525@Entry
526@Component
527struct WebComponent {
528  controller: webview.WebviewController = new webview.WebviewController();
529
530  build() {
531    Column() {
532      Button('loadData')
533        .onClick(() => {
534          try {
535            this.controller.loadData(
536              "<img src=aa/bb.jpg>", // 会尝试从"https://xxx.com/" + "aa/bb.jpg"加载该图片
537              "text/html",
538              "UTF-8",
539              "https://xxx.com/",
540              "about:blank"
541            );
542          } catch (error) {
543            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
544          }
545        })
546      Web({ src: 'www.example.com', controller: this.controller })
547    }
548  }
549}
550```
551
552加载本地资源。
553```ts
554// xxx.ets
555import { webview } from '@kit.ArkWeb';
556import { BusinessError } from '@kit.BasicServicesKit';
557
558@Entry
559@Component
560struct WebComponent {
561  controller: webview.WebviewController = new webview.WebviewController();
562  updataContent: string = '<body><div><image src="resource://rawfile/xxx.png" alt="image -- end" width="500" height="250"></image></div></body>'
563
564  build() {
565    Column() {
566      Button('loadData')
567        .onClick(() => {
568          try {
569            // UTF-8为charset。
570            this.controller.loadData(this.updataContent, "text/html", "UTF-8", " ", " ");
571          } catch (error) {
572            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
573          }
574        })
575      Web({ src: 'www.example.com', controller: this.controller })
576    }
577  }
578}
579```
580
581加载沙箱图片。
582```ts
583// xxx.ets
584import { webview } from '@kit.ArkWeb';
585import { BusinessError } from '@kit.BasicServicesKit';
586
587@Entry
588@Component
589struct WebComponent {
590  controller: webview.WebviewController = new webview.WebviewController();
591
592  build() {
593    Column() {
594      Button('loadData')
595        .onClick(() => {
596          try {
597            this.controller.loadData(
598              "<img src=bb.jpg>", // 尝试从"file:///xxx/" + "bb.jpg"加载该图片。
599              "text/html",
600              "UTF-8",
601              // 加载本地应用沙箱内的图片路径,请将路径改为实际使用的沙箱路径。
602              "file:///data/storage/el2/base/haps/entry/files/data/.cache_dir/",
603              ""
604            );
605          } catch (error) {
606            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
607          }
608        })
609      Web({ src: 'www.example.com', controller: this.controller })
610        .fileAccess(true) // 为了加载应用沙箱内的图片,需要启用文件访问功能。
611    }
612  }
613}
614```
615
616## accessForward
617
618accessForward(): boolean
619
620当前页面是否可前进,即当前页面是否有前进历史记录。
621
622可以结合使用[getBackForwardEntries](#getbackforwardentries)来获取当前WebView的历史信息列表,以及使用[accessStep](#accessstep)来判断是否可以按照给定的步数前进或后退。
623
624**系统能力:** SystemCapability.Web.Webview.Core
625
626**返回值:**
627
628| 类型    | 说明                              |
629| ------- | --------------------------------- |
630| boolean | 可以前进返回true,否则返回false。 |
631
632**错误码:**
633
634以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
635
636| 错误码ID | 错误信息                                                     |
637| -------- | ------------------------------------------------------------ |
638| 17100001 | Init error. The WebviewController must be associated with a Web component. |
639
640**示例:**
641
642```ts
643// xxx.ets
644import { webview } from '@kit.ArkWeb';
645import { BusinessError } from '@kit.BasicServicesKit';
646
647@Entry
648@Component
649struct WebComponent {
650  controller: webview.WebviewController = new webview.WebviewController();
651
652  build() {
653    Column() {
654      Button('accessForward')
655        .onClick(() => {
656          try {
657            let result = this.controller.accessForward();
658            console.info('result:' + result);
659          } catch (error) {
660            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
661          }
662        })
663      Web({ src: 'www.example.com', controller: this.controller })
664    }
665  }
666}
667```
668
669## forward
670
671forward(): void
672
673按照历史栈,前进一个页面。一般结合accessForward一起使用。
674
675**系统能力:** SystemCapability.Web.Webview.Core
676
677**错误码:**
678
679以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
680
681| 错误码ID | 错误信息                                                     |
682| -------- | ------------------------------------------------------------ |
683| 17100001 | Init error. The WebviewController must be associated with a Web component. |
684
685**示例:**
686
687```ts
688// xxx.ets
689import { webview } from '@kit.ArkWeb';
690import { BusinessError } from '@kit.BasicServicesKit';
691
692@Entry
693@Component
694struct WebComponent {
695  controller: webview.WebviewController = new webview.WebviewController();
696
697  build() {
698    Column() {
699      Button('forward')
700        .onClick(() => {
701          try {
702            this.controller.forward();
703          } catch (error) {
704            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
705          }
706        })
707      Web({ src: 'www.example.com', controller: this.controller })
708    }
709  }
710}
711```
712
713## accessBackward
714
715accessBackward(): boolean
716
717当前页面是否可后退,即当前页面是否有返回历史记录。
718
719可以结合使用[getBackForwardEntries](#getbackforwardentries)来获取当前WebView的历史信息列表,以及使用[accessStep](#accessstep)来判断是否可以按照给定的步数前进或后退。
720
721> **说明:**
722>
723> 在Web组件首次加载过程中调用[setCustomUserAgent](#setcustomuseragent10),可能会导致在当前存在多个历史节点的情况下,获取的accessBackward实际为false,即没有后退节点。建议先调用setCustomUserAgent方法设置UserAgent,再通过loadUrl加载具体页面。
724>
725> 该现象是由于在Web组件首次加载时,调用[setCustomUserAgent](#setcustomuseragent10)会导致组件重新加载并保持初始历史节点的状态。随后新增的节点将替换初始历史节点,不会生成新的历史节点,导致accessBackward为false。
726
727**系统能力:** SystemCapability.Web.Webview.Core
728
729**返回值:**
730
731| 类型    | 说明                             |
732| ------- | -------------------------------- |
733| boolean | 当前页面可以后退返回true,否则返回false。 |
734
735**错误码:**
736
737以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
738
739| 错误码ID | 错误信息                                                     |
740| -------- | ------------------------------------------------------------ |
741| 17100001 | Init error. The WebviewController must be associated with a Web component. |
742
743**示例:**
744
745```ts
746// xxx.ets
747import { webview } from '@kit.ArkWeb';
748import { BusinessError } from '@kit.BasicServicesKit';
749
750@Entry
751@Component
752struct WebComponent {
753  controller: webview.WebviewController = new webview.WebviewController();
754
755  build() {
756    Column() {
757      Button('accessBackward')
758        .onClick(() => {
759          try {
760            let result = this.controller.accessBackward();
761            console.info('result:' + result);
762          } catch (error) {
763            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
764          }
765        })
766      Web({ src: 'www.example.com', controller: this.controller })
767    }
768  }
769}
770```
771
772## backward
773
774backward(): void
775
776按照历史栈,后退一个页面。一般结合[accessBackward](#accessbackward)一起使用。
777
778**系统能力:** SystemCapability.Web.Webview.Core
779
780**错误码:**
781
782以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
783
784| 错误码ID | 错误信息                                                     |
785| -------- | ------------------------------------------------------------ |
786| 17100001 | Init error. The WebviewController must be associated with a Web component. |
787
788**示例:**
789
790```ts
791// xxx.ets
792import { webview } from '@kit.ArkWeb';
793import { BusinessError } from '@kit.BasicServicesKit';
794
795@Entry
796@Component
797struct WebComponent {
798  controller: webview.WebviewController = new webview.WebviewController();
799
800  build() {
801    Column() {
802      Button('backward')
803        .onClick(() => {
804          try {
805            this.controller.backward();
806          } catch (error) {
807            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
808          }
809        })
810      Web({ src: 'www.example.com', controller: this.controller })
811    }
812  }
813}
814```
815
816## onActive
817
818onActive(): void
819
820调用此接口通知Web组件进入前台激活状态。
821<br />激活状态是应用与用户互动的状态。应用会保持这种状态,直到发生某些事件(例如收到来电或设备屏幕关闭)时将焦点从应用移开。
822
823**系统能力:** SystemCapability.Web.Webview.Core
824
825**错误码:**
826
827以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
828
829| 错误码ID | 错误信息                                                     |
830| -------- | ------------------------------------------------------------ |
831| 17100001 | Init error. The WebviewController must be associated with a Web component. |
832
833**示例:**
834
835```ts
836// xxx.ets
837import { webview } from '@kit.ArkWeb';
838import { BusinessError } from '@kit.BasicServicesKit';
839
840@Entry
841@Component
842struct WebComponent {
843  controller: webview.WebviewController = new webview.WebviewController();
844
845  build() {
846    Column() {
847      Button('onActive')
848        .onClick(() => {
849          try {
850            this.controller.onActive();
851          } catch (error) {
852            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
853          }
854        })
855      Web({ src: 'www.example.com', controller: this.controller })
856    }
857  }
858}
859```
860
861## onInactive
862
863onInactive(): void
864
865调用此接口通知Web组件进入未激活状态。开发者可以在此回调中实现应用失去焦点时应表现的恰当行为。
866
867此状态下会尽可能的暂停任何可以安全暂停的内容,例如动画和地理位置。但不会暂停JavaScript,要全局暂停JavaScript,请使用[pauseAllTimers](#pausealltimers12)。要重新激活Web组件,请调用[onActive](#onactive)。
868
869**系统能力:** SystemCapability.Web.Webview.Core
870
871**错误码:**
872
873以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
874
875| 错误码ID | 错误信息                                                     |
876| -------- | ------------------------------------------------------------ |
877| 17100001 | Init error. The WebviewController must be associated with a Web component. |
878
879**示例:**
880
881```ts
882// xxx.ets
883import { webview } from '@kit.ArkWeb';
884import { BusinessError } from '@kit.BasicServicesKit';
885
886@Entry
887@Component
888struct WebComponent {
889  controller: webview.WebviewController = new webview.WebviewController();
890
891  build() {
892    Column() {
893      Button('onInactive')
894        .onClick(() => {
895          try {
896            this.controller.onInactive();
897          } catch (error) {
898            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
899          }
900        })
901      Web({ src: 'www.example.com', controller: this.controller })
902    }
903  }
904}
905```
906
907## refresh
908
909refresh(): void
910
911调用此接口通知Web组件刷新网页。
912
913**系统能力:** SystemCapability.Web.Webview.Core
914
915**错误码:**
916
917以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
918
919| 错误码ID | 错误信息                                                     |
920| -------- | ------------------------------------------------------------ |
921| 17100001 | Init error. The WebviewController must be associated with a Web component. |
922
923**示例:**
924
925```ts
926// xxx.ets
927import { webview } from '@kit.ArkWeb';
928import { BusinessError } from '@kit.BasicServicesKit';
929
930@Entry
931@Component
932struct WebComponent {
933  controller: webview.WebviewController = new webview.WebviewController();
934
935  build() {
936    Column() {
937      Button('refresh')
938        .onClick(() => {
939          try {
940            this.controller.refresh();
941          } catch (error) {
942            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
943          }
944        })
945      Web({ src: 'www.example.com', controller: this.controller })
946    }
947  }
948}
949```
950
951## accessStep
952
953accessStep(step: number): boolean
954
955当前页面是否可前进或者后退给定的step步。
956
957**系统能力:** SystemCapability.Web.Webview.Core
958
959**参数:**
960
961| 参数名 | 类型 | 必填 | 说明                                   |
962| ------ | -------- | ---- | ------------------------------------------ |
963| step   | number   | 是   | 要跳转的步数,正数代表前进,负数代表后退。 |
964
965**返回值:**
966
967| 类型    | 说明               |
968| ------- | ------------------ |
969| boolean | 页面是否前进或后退。<br>返回true表示可以前进或者后退,返回false表示不可以前进或后退。 |
970
971**错误码:**
972
973以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
974
975| 错误码ID | 错误信息                                                     |
976| -------- | ------------------------------------------------------------ |
977| 17100001 | Init error. The WebviewController must be associated with a Web component. |
978| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. |
979
980**示例:**
981
982```ts
983// xxx.ets
984import { webview } from '@kit.ArkWeb';
985import { BusinessError } from '@kit.BasicServicesKit';
986
987@Entry
988@Component
989struct WebComponent {
990  controller: webview.WebviewController = new webview.WebviewController();
991  @State steps: number = 2;
992
993  build() {
994    Column() {
995      Button('accessStep')
996        .onClick(() => {
997          try {
998            let result = this.controller.accessStep(this.steps);
999            console.info('result:' + result);
1000          } catch (error) {
1001            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
1002          }
1003        })
1004      Web({ src: 'www.example.com', controller: this.controller })
1005    }
1006  }
1007}
1008```
1009
1010## clearHistory
1011
1012clearHistory(): void
1013
1014删除所有前进后退记录,不建议在onErrorReceive与onPageBegin中调用clearHistory,会造成异常退出。
1015
1016**系统能力:** SystemCapability.Web.Webview.Core
1017
1018**错误码:**
1019
1020以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
1021
1022| 错误码ID | 错误信息                                                     |
1023| -------- | ------------------------------------------------------------ |
1024| 17100001 | Init error. The WebviewController must be associated with a Web component. |
1025
1026**示例:**
1027
1028```ts
1029// xxx.ets
1030import { webview } from '@kit.ArkWeb';
1031import { BusinessError } from '@kit.BasicServicesKit';
1032
1033@Entry
1034@Component
1035struct WebComponent {
1036  controller: webview.WebviewController = new webview.WebviewController();
1037
1038  build() {
1039    Column() {
1040      Button('clearHistory')
1041        .onClick(() => {
1042          try {
1043            this.controller.clearHistory();
1044          } catch (error) {
1045            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
1046          }
1047        })
1048      Web({ src: 'www.example.com', controller: this.controller })
1049    }
1050  }
1051}
1052```
1053
1054## registerJavaScriptProxy
1055
1056registerJavaScriptProxy(object: object, name: string, methodList: Array\<string>, asyncMethodList?: Array\<string>, permission?: string): void
1057
1058registerJavaScriptProxy提供了应用与Web组件加载的网页之间强大的交互能力。
1059<br>注入JavaScript对象到window对象中,并在window对象中调用该对象的方法。注册后,须调用[refresh](#refresh)接口生效。
1060<br>示例请参考[前端页面调用应用侧函数](../../web/web-in-page-app-function-invoking.md)。
1061
1062> **说明:**
1063>
1064> - registerJavaScriptProxy需要和deleteJavaScriptRegister接口配合使用,防止内存泄漏。
1065> - 请尽可能只在可信的URL及安全通信HTTPS场景下进行registerJavaScriptProxy注册。在非可信的Web组件中注入JavaScript对象,可能会导致应用被恶意攻击。
1066> - 在注册registerJavaScriptProxy后,应用会将JavaScript对象暴露给所有的页面frames。
1067> - 同一方法在同步与异步列表中重复注册,将默认异步调用。
1068> - 同步函数列表和异步函数列表不可同时为空,否则此次调用接口注册失败。
1069> - 异步的作用在于:H5线程将异步JavaScript任务提交给ETS主线程后,无需等待任务执行完成并返回结果,H5线程即可继续执行后续任务。这在执行耗时较长的JavaScript任务或ETS线程较为拥堵的情况下,可以有效减少H5线程因JavaScript任务而被阻塞的情况。然而,异步JavaScript任务无法返回值,且任务执行的顺序无法保证,因此需要根据具体情境判断是否使用同步或异步方式。
1070
1071**系统能力:** SystemCapability.Web.Webview.Core
1072
1073**参数:**
1074
1075| 参数名     | 类型       | 必填 | 说明                                        |
1076| ---------- | -------------- | ---- | ------------------------------------------------------------ |
1077| object     | object         | 是   | 参与注册的应用侧JavaScript对象。可以单独声明方法和属性,但无法同时进行注册与使用。对象只包含属性时,H5可以访问对象中的属性。对象只包含方法时,H5可以访问对象中的方法。<br>1. 方法的参数和返回类型可以为string,number,boolean。<br>2. 方法的参数和返回类型支持Dictionary,Array,最多嵌套10层,每层1w个数据。<br>3. 方法的参数和返回类型支持Object,需要在Object里添加属性methodNameListForJsProxy:[fun1, fun2],fun1和fun2为可被调用的方法。<br>4. 方法的参数支持Function,Promise,它们的Callback不能有返回值。<br>5. 方法的返回类型支持Promise,Promise的Callback不能有返回值。 |
1078| name       | string         | 是   | 注册对象的名称,与window中调用的对象名一致。注册后window对象可以通过此名字访问应用侧JavaScript对象。 |
1079| methodList | Array\<string> | 是   | 参与注册的应用侧JavaScript对象的同步方法。                       |
1080| asyncMethodList<sup>12+</sup> | Array\<string> | 否   | 参与注册的应用侧JavaScript对象的异步方法,默认为空。异步方法无法获取返回值。  |
1081| permission<sup>12+</sup> | string | 否   | JSON字符串,默认为空,通过该字符串配置JSBridge的权限管控,可以定义object和method级别的URL白名单。<br>1. scheme(协议)和host(域名)参数不可为空,且host不支持通配符,只能填写完整的host。<br>2. 可以仅配置object级别的白名单,该白名单对所有JSBridge方法生效。<br>3. 若JSBridge方法A设置了method级别的白名单,那么方法A最终的白名单是object级别白名单与method级别白名单的交集。|
1082
1083**错误码:**
1084
1085以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
1086
1087| 错误码ID | 错误信息                                                     |
1088| -------- | ------------------------------------------------------------ |
1089| 17100001 | Init error. The WebviewController must be associated with a Web component. |
1090| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. |
1091
1092**示例:**
1093
1094```ts
1095// xxx.ets
1096import { webview } from '@kit.ArkWeb';
1097import { BusinessError } from '@kit.BasicServicesKit';
1098
1099class TestObj {
1100  constructor() {
1101  }
1102
1103  test(testStr: string): string {
1104    console.info('Web Component str' + testStr);
1105    return testStr;
1106  }
1107
1108  toString(): void {
1109    console.info('Web Component toString');
1110  }
1111
1112  testNumber(testNum: number): number {
1113    console.info('Web Component number' + testNum);
1114    return testNum;
1115  }
1116
1117  asyncTestBool(testBol: boolean): void {
1118    console.info('Web Component boolean' + testBol);
1119  }
1120}
1121
1122class WebObj {
1123  constructor() {
1124  }
1125
1126  webTest(): string {
1127    console.info('Web test');
1128    return "Web test";
1129  }
1130
1131  webString(): void {
1132    console.info('Web test toString');
1133  }
1134}
1135
1136class AsyncObj {
1137  constructor() {
1138  }
1139
1140  asyncTest(): void {
1141    console.info('Async test');
1142  }
1143
1144  asyncString(testStr: string): void {
1145    console.info('Web async string' + testStr);
1146  }
1147}
1148
1149@Entry
1150@Component
1151struct Index {
1152  controller: webview.WebviewController = new webview.WebviewController();
1153  @State testObjtest: TestObj = new TestObj();
1154  @State webTestObj: WebObj = new WebObj();
1155  @State asyncTestObj: AsyncObj = new AsyncObj();
1156
1157  build() {
1158    Column() {
1159      Button('refresh')
1160        .onClick(() => {
1161          try {
1162            this.controller.refresh();
1163          } catch (error) {
1164            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
1165          }
1166        })
1167      Button('Register JavaScript To Window')
1168        .onClick(() => {
1169          try {
1170            // 同时注册同步和异步函数
1171            this.controller.registerJavaScriptProxy(this.testObjtest, "objName", ["test", "toString", "testNumber"], ["asyncTestBool"]);
1172            // 仅注册同步函数
1173            this.controller.registerJavaScriptProxy(this.webTestObj, "objTestName", ["webTest", "webString"]);
1174            // 仅注册异步函数
1175            this.controller.registerJavaScriptProxy(this.asyncTestObj, "objAsyncName", [], ["asyncTest", "asyncString"]);
1176          } catch (error) {
1177            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
1178          }
1179        })
1180      Button('deleteJavaScriptRegister')
1181        .onClick(() => {
1182          try {
1183            this.controller.deleteJavaScriptRegister("objName");
1184            this.controller.deleteJavaScriptRegister("objTestName");
1185            this.controller.deleteJavaScriptRegister("objAsyncName");
1186          } catch (error) {
1187            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
1188          }
1189        })
1190      Web({ src: $rawfile('index.html'), controller: this.controller })
1191        .javaScriptAccess(true)
1192    }
1193  }
1194}
1195```
1196
1197加载的html文件。
1198```html
1199<!-- index.html -->
1200<!DOCTYPE html>
1201<html>
1202    <head>
1203      <meta charset="utf-8">
1204    </head>
1205    <body>
1206      <button type="button" onclick="htmlTest()">Click Me!</button>
1207      <p id="demo"></p>
1208      <p id="webDemo"></p>
1209      <p id="asyncDemo"></p>
1210      <script type="text/javascript">
1211        function htmlTest() {
1212          // This function call expects to return "ArkUI Web Component"
1213          let str=objName.test("webtest data");
1214          objName.testNumber(1);
1215          objName.asyncTestBool(true);
1216          document.getElementById("demo").innerHTML=str;
1217          console.info('objName.test result:'+ str)
1218
1219          // This function call expects to return "Web test"
1220          let webStr = objTestName.webTest();
1221          document.getElementById("webDemo").innerHTML=webStr;
1222          console.info('objTestName.webTest result:'+ webStr)
1223
1224          objAsyncName.asyncTest();
1225          objAsyncName.asyncString("async test data");
1226        }
1227      </script>
1228    </body>
1229</html>
1230```
1231更多示例,请参考[前端页面调用应用侧函数](../../web/web-in-page-app-function-invoking.md)。
1232
1233## runJavaScript
1234
1235runJavaScript(script: string, callback : AsyncCallback\<string>): void
1236
1237在当前显示页面的上下文中异步执行JavaScript脚本,脚本执行的结果将通过异步回调方式返回。此方法必须在用户界面(UI)线程上使用 ,并且回调也将在用户界面(UI)线程上调用。
1238
1239> **说明:**
1240>
1241> - 跨导航操作(如loadUrl)时,JavaScript状态将不再保留。例如,调用loadUrl前定义的全局变量和函数在加载的页面中将不存在。
1242> - 建议应用程序使用registerJavaScriptProxy来确保JavaScript状态能够在页面导航间保持。
1243> - 目前不支持传递对象,支持传递结构体。
1244> - 执行异步方法无法获取返回值,需要根据具体情境判断是否使用同步或异步方式。
1245> - 前端页面传到Native的string数据类型会被视为json格式的数据,需要调用JSON.parse反序列化。
1246
1247**系统能力:** SystemCapability.Web.Webview.Core
1248
1249**参数:**
1250
1251| 参数名   | 类型                 | 必填 | 说明                         |
1252| -------- | -------------------- | ---- | ---------------------------- |
1253| script   | string                   | 是   | JavaScript脚本。                                             |
1254| callback | AsyncCallback\<string> | 是   | 回调执行JavaScript脚本结果。JavaScript脚本若执行失败或无返回值时,返回null。 |
1255
1256**错误码:**
1257
1258以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
1259
1260| 错误码ID | 错误信息                                                     |
1261| -------- | ------------------------------------------------------------ |
1262| 17100001 | Init error. The WebviewController must be associated with a Web component. |
1263| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. |
1264
1265**示例:**
1266
1267```ts
1268import { webview } from '@kit.ArkWeb';
1269import { BusinessError } from '@kit.BasicServicesKit';
1270
1271@Entry
1272@Component
1273struct WebComponent {
1274  controller: webview.WebviewController = new webview.WebviewController();
1275  @State webResult: string = '';
1276
1277  build() {
1278    Column() {
1279      Text(this.webResult).fontSize(20)
1280      Web({ src: $rawfile('index.html'), controller: this.controller })
1281        .javaScriptAccess(true)
1282        .onPageEnd(e => {
1283          try {
1284            this.controller.runJavaScript(
1285              'test()',
1286              (error, result) => {
1287                if (error) {
1288                  console.error(`run JavaScript error, ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
1289                  return;
1290                }
1291                if (result) {
1292                  this.webResult = result;
1293                  console.info(`The test() return value is: ${result}`);
1294                }
1295              });
1296            if (e) {
1297              console.info('url: ', e.url);
1298            }
1299          } catch (error) {
1300            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
1301          }
1302        })
1303    }
1304  }
1305}
1306```
1307
1308加载的html文件。
1309```html
1310<!-- index.html -->
1311<!DOCTYPE html>
1312<html>
1313  <head>
1314    <meta charset="utf-8">
1315  </head>
1316  <body>
1317    Hello world!
1318    <script type="text/javascript">
1319      function test() {
1320        console.info('Ark WebComponent')
1321        return "This value is from index.html"
1322      }
1323    </script>
1324  </body>
1325</html>
1326```
1327
1328## runJavaScript
1329
1330runJavaScript(script: string): Promise\<string>
1331
1332在当前显示页面的上下文中异步执行JavaScript脚本,脚本执行的结果将通过Promise方式返回。此方法必须在用户界面(UI)线程上使用 ,并且回调也将在用户界面(UI)线程上调用。
1333
1334> **说明:**
1335>
1336> - 跨导航操作(如loadUrl)时,JavaScript状态 将不再保留,例如,调用loadUrl前定义的全局变量和函数在加载的页面中将不存在。
1337> - 建议应用程序使用registerJavaScriptProxy来确保JavaScript状态能够在页面导航间保持。
1338> - 目前不支持传递对象,支持传递结构体。
1339> - 执行异步方法无法获取返回值,需要根据具体情境判断是否使用同步或异步方式。
1340> - 前端页面传到Native的string数据类型会被视为json格式的数据,需要调用JSON.parse反序列化。
1341
1342**系统能力:** SystemCapability.Web.Webview.Core
1343
1344**参数:**
1345
1346| 参数名 | 类型 | 必填 | 说明         |
1347| ------ | -------- | ---- | ---------------- |
1348| script | string   | 是   | JavaScript脚本。 |
1349
1350**返回值:**
1351
1352| 类型            | 说明                                                |
1353| --------------- | --------------------------------------------------- |
1354| Promise\<string> | Promise实例,返回脚本执行的结果,执行失败返回null。 |
1355
1356**错误码:**
1357
1358以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
1359
1360| 错误码ID | 错误信息                                                     |
1361| -------- | ------------------------------------------------------------ |
1362| 17100001 | Init error. The WebviewController must be associated with a Web component. |
1363| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. |
1364
1365**示例:**
1366
1367```ts
1368// xxx.ets
1369import { webview } from '@kit.ArkWeb';
1370import { BusinessError } from '@kit.BasicServicesKit';
1371
1372@Entry
1373@Component
1374struct WebComponent {
1375  controller: webview.WebviewController = new webview.WebviewController();
1376
1377  build() {
1378    Column() {
1379      Web({ src: $rawfile('index.html'), controller: this.controller })
1380        .javaScriptAccess(true)
1381        .onPageEnd(e => {
1382          try {
1383            this.controller.runJavaScript('test()')
1384              .then((result) => {
1385                console.info('result: ' + result);
1386              })
1387              .catch((error: BusinessError) => {
1388                console.error("error: " + error);
1389              })
1390            if (e) {
1391              console.info('url: ', e.url);
1392            }
1393          } catch (error) {
1394            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
1395          }
1396        })
1397    }
1398  }
1399}
1400```
1401
1402加载的html文件。
1403```html
1404<!-- index.html -->
1405<!DOCTYPE html>
1406<html>
1407  <head>
1408    <meta charset="utf-8">
1409  </head>
1410  <body>
1411    Hello world!
1412    <script type="text/javascript">
1413      function test() {
1414        console.info('Ark WebComponent')
1415        return "This value is from index.html"
1416      }
1417    </script>
1418  </body>
1419</html>
1420```
1421
1422## runJavaScriptExt<sup>10+</sup>
1423
1424runJavaScriptExt(script: string | ArrayBuffer, callback : AsyncCallback\<JsMessageExt>): void
1425
1426异步执行JavaScript脚本,并通过回调方式返回脚本执行的结果。runJavaScriptExt需要在loadUrl完成后,比如onPageEnd中调用。
1427
1428> **说明:**
1429>
1430> - 前端页面传到Native的string数据类型会被视为json格式的数据,需要调用JSON.parse反序列化。
1431
1432**系统能力:** SystemCapability.Web.Webview.Core
1433
1434**参数:**
1435
1436| 参数名   | 类型                 | 必填 | 说明                         |
1437| -------- | -------------------- | ---- | ---------------------------- |
1438| script   | string \| ArrayBuffer<sup>12+</sup>         | 是   | JavaScript脚本。 |
1439| callback | AsyncCallback\<[JsMessageExt](./arkts-apis-webview-JsMessageExt.md)\> | 是   | 回调执行JavaScript脚本结果。 |
1440
1441**错误码:**
1442
1443以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
1444
1445| 错误码ID | 错误信息                                                     |
1446| -------- | ------------------------------------------------------------ |
1447| 17100001 | Init error. The WebviewController must be associated with a Web component. |
1448| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. |
1449
1450**示例:**
1451
1452```ts
1453import { webview } from '@kit.ArkWeb';
1454import { BusinessError } from '@kit.BasicServicesKit';
1455
1456@Entry
1457@Component
1458struct WebComponent {
1459  controller: webview.WebviewController = new webview.WebviewController();
1460  @State msg1: string = '';
1461  @State msg2: string = '';
1462
1463  build() {
1464    Column() {
1465      Text(this.msg1).fontSize(20)
1466      Text(this.msg2).fontSize(20)
1467      Web({ src: $rawfile('index.html'), controller: this.controller })
1468        .javaScriptAccess(true)
1469        .onPageEnd(e => {
1470          try {
1471            this.controller.runJavaScriptExt(
1472              'test()',
1473              (error, result) => {
1474                if (error) {
1475                  console.error(`run JavaScript error, ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`)
1476                  return;
1477                }
1478                if (result) {
1479                  try {
1480                    let type = result.getType();
1481                    switch (type) {
1482                      case webview.JsMessageType.STRING: {
1483                        this.msg1 = "result type:" + typeof (result.getString());
1484                        this.msg2 = "result getString:" + ((result.getString()));
1485                        break;
1486                      }
1487                      case webview.JsMessageType.NUMBER: {
1488                        this.msg1 = "result type:" + typeof (result.getNumber());
1489                        this.msg2 = "result getNumber:" + ((result.getNumber()));
1490                        break;
1491                      }
1492                      case webview.JsMessageType.BOOLEAN: {
1493                        this.msg1 = "result type:" + typeof (result.getBoolean());
1494                        this.msg2 = "result getBoolean:" + ((result.getBoolean()));
1495                        break;
1496                      }
1497                      case webview.JsMessageType.ARRAY_BUFFER: {
1498                        this.msg1 = "result type:" + typeof (result.getArrayBuffer());
1499                        this.msg2 = "result getArrayBuffer byteLength:" + ((result.getArrayBuffer().byteLength));
1500                        break;
1501                      }
1502                      case webview.JsMessageType.ARRAY: {
1503                        this.msg1 = "result type:" + typeof (result.getArray());
1504                        this.msg2 = "result getArray:" + result.getArray();
1505                        break;
1506                      }
1507                      default: {
1508                        this.msg1 = "default break, type:" + type;
1509                        break;
1510                      }
1511                    }
1512                  }
1513                  catch (resError) {
1514                    console.error(`ErrorCode: ${(resError as BusinessError).code},  Message: ${(resError as BusinessError).message}`);
1515                  }
1516                }
1517              });
1518            if (e) {
1519              console.info('url: ', e.url);
1520            }
1521          } catch (resError) {
1522            console.error(`ErrorCode: ${(resError as BusinessError).code},  Message: ${(resError as BusinessError).message}`);
1523          }
1524        })
1525    }
1526  }
1527}
1528```
1529
1530```ts
1531// 使用ArrayBuffer入参,从文件中获取JavaScript脚本数据。
1532import { webview } from '@kit.ArkWeb';
1533import { BusinessError } from '@kit.BasicServicesKit';
1534import { fileIo } from '@kit.CoreFileKit';
1535import { common } from '@kit.AbilityKit';
1536
1537@Entry
1538@Component
1539struct WebComponent {
1540  controller: webview.WebviewController = new webview.WebviewController();
1541  @State msg1: string = ''
1542  @State msg2: string = ''
1543
1544  build() {
1545    Column() {
1546      Text(this.msg1).fontSize(20)
1547      Text(this.msg2).fontSize(20)
1548      Button('runJavaScriptExt')
1549        .onClick(() => {
1550          try {
1551            let uiContext : UIContext = this.getUIContext();
1552            let context : Context | undefined = uiContext.getHostContext() as common.UIAbilityContext;
1553            let filePath = context!.filesDir + 'test.txt';
1554            // 新建并打开文件。
1555            let file = fileIo.openSync(filePath, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);
1556            // 写入一段内容至文件。
1557            fileIo.writeSync(file.fd, "test()");
1558            // 从文件中读取内容。
1559            let arrayBuffer: ArrayBuffer = new ArrayBuffer(6);
1560            fileIo.readSync(file.fd, arrayBuffer, { offset: 0, length: arrayBuffer.byteLength });
1561            // 关闭文件。
1562            fileIo.closeSync(file);
1563            this.controller.runJavaScriptExt(
1564              arrayBuffer,
1565              (error, result) => {
1566                if (error) {
1567                  console.error(`run JavaScript error, ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`)
1568                  return;
1569                }
1570                if (result) {
1571                  try {
1572                    let type = result.getType();
1573                    switch (type) {
1574                      case webview.JsMessageType.STRING: {
1575                        this.msg1 = "result type:" + typeof (result.getString());
1576                        this.msg2 = "result getString:" + ((result.getString()));
1577                        break;
1578                      }
1579                      case webview.JsMessageType.NUMBER: {
1580                        this.msg1 = "result type:" + typeof (result.getNumber());
1581                        this.msg2 = "result getNumber:" + ((result.getNumber()));
1582                        break;
1583                      }
1584                      case webview.JsMessageType.BOOLEAN: {
1585                        this.msg1 = "result type:" + typeof (result.getBoolean());
1586                        this.msg2 = "result getBoolean:" + ((result.getBoolean()));
1587                        break;
1588                      }
1589                      case webview.JsMessageType.ARRAY_BUFFER: {
1590                        this.msg1 = "result type:" + typeof (result.getArrayBuffer());
1591                        this.msg2 = "result getArrayBuffer byteLength:" + ((result.getArrayBuffer().byteLength));
1592                        break;
1593                      }
1594                      case webview.JsMessageType.ARRAY: {
1595                        this.msg1 = "result type:" + typeof (result.getArray());
1596                        this.msg2 = "result getArray:" + result.getArray();
1597                        break;
1598                      }
1599                      default: {
1600                        this.msg1 = "default break, type:" + type;
1601                        break;
1602                      }
1603                    }
1604                  }
1605                  catch (resError) {
1606                    console.error(`ErrorCode: ${(resError as BusinessError).code},  Message: ${(resError as BusinessError).message}`);
1607                  }
1608                }
1609              });
1610          } catch (resError) {
1611            console.error(`ErrorCode: ${(resError as BusinessError).code},  Message: ${(resError as BusinessError).message}`);
1612          }
1613        })
1614      Web({ src: $rawfile('index.html'), controller: this.controller })
1615        .javaScriptAccess(true)
1616    }
1617  }
1618}
1619```
1620
1621加载的html文件。
1622```html
1623<!-- index.html -->
1624<!DOCTYPE html>
1625<html lang="en-gb">
1626<body>
1627<h1>run JavaScript Ext demo</h1>
1628</body>
1629<script type="text/javascript">
1630function test() {
1631  return "hello, world";
1632}
1633</script>
1634</html>
1635```
1636
1637## runJavaScriptExt<sup>10+</sup>
1638
1639runJavaScriptExt(script: string | ArrayBuffer): Promise\<JsMessageExt>
1640
1641异步执行JavaScript脚本,并通过Promise方式返回脚本执行的结果。runJavaScriptExt需要在loadUrl完成后,比如onPageEnd中调用。
1642
1643> **说明:**
1644>
1645> - 前端页面传到Native的string数据类型会被视为json格式的数据,需要调用JSON.parse反序列化。
1646
1647**系统能力:** SystemCapability.Web.Webview.Core
1648
1649**参数:**
1650
1651| 参数名 | 类型 | 必填 | 说明         |
1652| ------ | -------- | ---- | ---------------- |
1653| script | string \| ArrayBuffer<sup>12+</sup> | 是   | JavaScript脚本。 |
1654
1655**返回值:**
1656
1657| 类型            | 说明                                                |
1658| --------------- | --------------------------------------------------- |
1659| Promise\<[JsMessageExt](./arkts-apis-webview-JsMessageExt.md)> | Promise实例,返回脚本执行的结果。 |
1660
1661**错误码:**
1662
1663以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
1664
1665| 错误码ID | 错误信息                                                     |
1666| -------- | ------------------------------------------------------------ |
1667| 17100001 | Init error. The WebviewController must be associated with a Web component. |
1668| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. |
1669
1670**示例:**
1671
1672```ts
1673// xxx.ets
1674import { webview } from '@kit.ArkWeb';
1675import { BusinessError } from '@kit.BasicServicesKit';
1676
1677@Entry
1678@Component
1679struct WebComponent {
1680  controller: webview.WebviewController = new webview.WebviewController();
1681  @State webResult: string = '';
1682  @State msg1: string = '';
1683  @State msg2: string = '';
1684
1685  build() {
1686    Column() {
1687      Text(this.webResult).fontSize(20)
1688      Text(this.msg1).fontSize(20)
1689      Text(this.msg2).fontSize(20)
1690      Web({ src: $rawfile('index.html'), controller: this.controller })
1691        .javaScriptAccess(true)
1692        .onPageEnd(() => {
1693          this.controller.runJavaScriptExt('test()')
1694            .then((result) => {
1695              try {
1696                let type = result.getType();
1697                switch (type) {
1698                  case webview.JsMessageType.STRING: {
1699                    this.msg1 = "result type:" + typeof (result.getString());
1700                    this.msg2 = "result getString:" + ((result.getString()));
1701                    break;
1702                  }
1703                  case webview.JsMessageType.NUMBER: {
1704                    this.msg1 = "result type:" + typeof (result.getNumber());
1705                    this.msg2 = "result getNumber:" + ((result.getNumber()));
1706                    break;
1707                  }
1708                  case webview.JsMessageType.BOOLEAN: {
1709                    this.msg1 = "result type:" + typeof (result.getBoolean());
1710                    this.msg2 = "result getBoolean:" + ((result.getBoolean()));
1711                    break;
1712                  }
1713                  case webview.JsMessageType.ARRAY_BUFFER: {
1714                    this.msg1 = "result type:" + typeof (result.getArrayBuffer());
1715                    this.msg2 = "result getArrayBuffer byteLength:" + ((result.getArrayBuffer().byteLength));
1716                    break;
1717                  }
1718                  case webview.JsMessageType.ARRAY: {
1719                    this.msg1 = "result type:" + typeof (result.getArray());
1720                    this.msg2 = "result getArray:" + result.getArray();
1721                    break;
1722                  }
1723                  default: {
1724                    this.msg1 = "default break, type:" + type;
1725                    break;
1726                  }
1727                }
1728              }
1729              catch (resError) {
1730                console.error(`ErrorCode: ${(resError as BusinessError).code},  Message: ${(resError as BusinessError).message}`);
1731              }
1732            }).catch((error: BusinessError) => {
1733            console.error("error: " + error);
1734          })
1735        })
1736    }
1737  }
1738}
1739```
1740
1741```ts
1742// 使用ArrayBuffer入参,从文件中获取JavaScript脚本数据。
1743import { webview } from '@kit.ArkWeb';
1744import { BusinessError } from '@kit.BasicServicesKit';
1745import { fileIo } from '@kit.CoreFileKit';
1746import { common } from '@kit.AbilityKit';
1747
1748@Entry
1749@Component
1750struct WebComponent {
1751  controller: webview.WebviewController = new webview.WebviewController();
1752  @State msg1: string = '';
1753  @State msg2: string = '';
1754
1755  build() {
1756    Column() {
1757      Text(this.msg1).fontSize(20)
1758      Text(this.msg2).fontSize(20)
1759      Button('runJavaScriptExt')
1760        .onClick(() => {
1761          try {
1762            let uiContext : UIContext = this.getUIContext();
1763            let context : Context | undefined = uiContext.getHostContext() as common.UIAbilityContext;
1764            let filePath = context!.filesDir + 'test.txt';
1765            // 新建并打开文件。
1766            let file = fileIo.openSync(filePath, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);
1767            // 写入一段内容至文件。
1768            fileIo.writeSync(file.fd, "test()");
1769            // 从文件中读取内容。
1770            let arrayBuffer: ArrayBuffer = new ArrayBuffer(6);
1771            fileIo.readSync(file.fd, arrayBuffer, { offset: 0, length: arrayBuffer.byteLength });
1772            // 关闭文件。
1773            fileIo.closeSync(file);
1774            this.controller.runJavaScriptExt(arrayBuffer)
1775              .then((result) => {
1776                try {
1777                  let type = result.getType();
1778                  switch (type) {
1779                    case webview.JsMessageType.STRING: {
1780                      this.msg1 = "result type:" + typeof (result.getString());
1781                      this.msg2 = "result getString:" + ((result.getString()));
1782                      break;
1783                    }
1784                    case webview.JsMessageType.NUMBER: {
1785                      this.msg1 = "result type:" + typeof (result.getNumber());
1786                      this.msg2 = "result getNumber:" + ((result.getNumber()));
1787                      break;
1788                    }
1789                    case webview.JsMessageType.BOOLEAN: {
1790                      this.msg1 = "result type:" + typeof (result.getBoolean());
1791                      this.msg2 = "result getBoolean:" + ((result.getBoolean()));
1792                      break;
1793                    }
1794                    case webview.JsMessageType.ARRAY_BUFFER: {
1795                      this.msg1 = "result type:" + typeof (result.getArrayBuffer());
1796                      this.msg2 = "result getArrayBuffer byteLength:" + ((result.getArrayBuffer().byteLength));
1797                      break;
1798                    }
1799                    case webview.JsMessageType.ARRAY: {
1800                      this.msg1 = "result type:" + typeof (result.getArray());
1801                      this.msg2 = "result getArray:" + result.getArray();
1802                      break;
1803                    }
1804                    default: {
1805                      this.msg1 = "default break, type:" + type;
1806                      break;
1807                    }
1808                  }
1809                }
1810                catch (resError) {
1811                  console.error(`ErrorCode: ${(resError as BusinessError).code},  Message: ${(resError as BusinessError).message}`);
1812                }
1813              })
1814              .catch((error: BusinessError) => {
1815                console.error("error: " + error);
1816              })
1817          } catch (error) {
1818            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
1819          }
1820        })
1821      Web({ src: $rawfile('index.html'), controller: this.controller })
1822        .javaScriptAccess(true)
1823    }
1824  }
1825}
1826```
1827
1828加载的html文件。
1829```html
1830<!-- index.html -->
1831<!DOCTYPE html>
1832<html lang="en-gb">
1833<body>
1834<h1>run JavaScript Ext demo</h1>
1835</body>
1836<script type="text/javascript">
1837function test() {
1838  return "hello, world";
1839}
1840</script>
1841</html>
1842```
1843
1844## deleteJavaScriptRegister
1845
1846deleteJavaScriptRegister(name: string): void
1847
1848删除通过registerJavaScriptProxy注册到window上的指定name的应用侧JavaScript对象。删除后,须调用[refresh](#refresh)接口。
1849
1850**系统能力:** SystemCapability.Web.Webview.Core
1851
1852**参数:**
1853
1854| 参数名 | 类型 | 必填 | 说明  |
1855| ------ | -------- | ---- | ---- |
1856| name   | string   | 是   | 注册对象的名称,可在网页侧JavaScript中通过此名称调用应用侧JavaScript对象。 |
1857
1858**错误码:**
1859
1860以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
1861
1862| 错误码ID | 错误信息                                                     |
1863| -------- | ------------------------------------------------------------ |
1864| 17100001 | Init error. The WebviewController must be associated with a Web component. |
1865| 17100008 | Failed to delete JavaScriptProxy because it does not exist.                               |
1866| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. |
1867
1868**示例:**
1869
1870```ts
1871// xxx.ets
1872import { webview } from '@kit.ArkWeb';
1873import { BusinessError } from '@kit.BasicServicesKit';
1874
1875class TestObj {
1876  constructor() {
1877  }
1878
1879  test(): string {
1880    return "ArkUI Web Component";
1881  }
1882
1883  toString(): void {
1884    console.info('Web Component toString');
1885  }
1886}
1887
1888@Entry
1889@Component
1890struct WebComponent {
1891  controller: webview.WebviewController = new webview.WebviewController();
1892  @State testObjtest: TestObj = new TestObj();
1893  @State name: string = 'objName';
1894  build() {
1895    Column() {
1896      Button('refresh')
1897        .onClick(() => {
1898          try {
1899            this.controller.refresh();
1900          } catch (error) {
1901            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
1902          }
1903        })
1904      Button('Register JavaScript To Window')
1905        .onClick(() => {
1906          try {
1907            this.controller.registerJavaScriptProxy(this.testObjtest, this.name, ["test", "toString"]);
1908          } catch (error) {
1909            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
1910          }
1911        })
1912      Button('deleteJavaScriptRegister')
1913        .onClick(() => {
1914          try {
1915            this.controller.deleteJavaScriptRegister(this.name);
1916          } catch (error) {
1917            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
1918          }
1919        })
1920      Web({ src: $rawfile('index.html'), controller: this.controller })
1921        .javaScriptAccess(true)
1922    }
1923  }
1924}
1925```
1926
1927加载的html文件。
1928```html
1929<!-- index.html -->
1930<!DOCTYPE html>
1931<html>
1932    <head>
1933      <meta charset="utf-8">
1934    </head>
1935    <body>
1936      <button type="button" onclick="htmlTest()">Click Me!</button>
1937      <p id="demo"></p>
1938      <script type="text/javascript">
1939        function htmlTest() {
1940          let str=objName.test();
1941          document.getElementById("demo").innerHTML=str;
1942          console.info('objName.test result:'+ str)
1943        }
1944      </script>
1945    </body>
1946</html>
1947```
1948
1949## zoom
1950
1951zoom(factor: number): void
1952
1953调整当前网页的缩放比例,[zoomAccess](arkts-basic-components-web-attributes.md#zoomaccess)需为true。
1954
1955**系统能力:** SystemCapability.Web.Webview.Core
1956
1957**参数:**
1958
1959| 参数名 | 类型 | 必填 | 说明 |
1960| ------ | -------- | ---- | ------------------------------------------------------------ |
1961| factor | number   | 是   | 基于当前网页所需调整的相对缩放比例,入参要求大于0,当入参为1时为默认加载网页的缩放比例,入参小于1为缩小,入参大于1为放大。<br>取值范围:(0,100]。 |
1962
1963**错误码:**
1964
1965以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
1966
1967| 错误码ID | 错误信息                                                     |
1968| -------- | ------------------------------------------------------------ |
1969| 17100001 | Init error. The WebviewController must be associated with a Web component. |
1970| 17100004 | Function not enabled.                                         |
1971| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. |
1972
1973**示例:**
1974
1975```ts
1976// xxx.ets
1977import { webview } from '@kit.ArkWeb';
1978import { BusinessError } from '@kit.BasicServicesKit';
1979
1980@Entry
1981@Component
1982struct WebComponent {
1983  controller: webview.WebviewController = new webview.WebviewController();
1984  @State factor: number = 2;
1985
1986  build() {
1987    Column() {
1988      Button('zoom')
1989        .onClick(() => {
1990          try {
1991            this.controller.zoom(this.factor);
1992          } catch (error) {
1993            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
1994          }
1995        })
1996      Web({ src: 'www.example.com', controller: this.controller })
1997        .zoomAccess(true)
1998    }
1999  }
2000}
2001```
2002
2003## searchAllAsync
2004
2005searchAllAsync(searchString: string): void
2006
2007异步查找网页中所有匹配关键字'searchString'的内容并高亮,结果通过[onSearchResultReceive](./arkts-basic-components-web-events.md#onsearchresultreceive9)异步返回。
2008
2009**系统能力:** SystemCapability.Web.Webview.Core
2010
2011**参数:**
2012
2013| 参数名       | 类型 | 必填 | 说明       |
2014| ------------ | -------- | ---- | -------------- |
2015| searchString | string   | 是   | 查找的关键字。 |
2016
2017**错误码:**
2018
2019以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
2020
2021| 错误码ID | 错误信息                                                     |
2022| -------- | ------------------------------------------------------------ |
2023| 17100001 | Init error. The WebviewController must be associated with a Web component. |
2024| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. |
2025
2026**示例:**
2027
2028```ts
2029// xxx.ets
2030import { webview } from '@kit.ArkWeb';
2031import { BusinessError } from '@kit.BasicServicesKit';
2032
2033@Entry
2034@Component
2035struct WebComponent {
2036  controller: webview.WebviewController = new webview.WebviewController();
2037  @State searchString: string = "Hello World";
2038
2039  build() {
2040    Column() {
2041      Button('searchString')
2042        .onClick(() => {
2043          try {
2044            this.controller.searchAllAsync(this.searchString);
2045          } catch (error) {
2046            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
2047          }
2048        })
2049      Web({ src: $rawfile('index.html'), controller: this.controller })
2050        .onSearchResultReceive(ret => {
2051          if (ret) {
2052            console.info("on search result receive:" + "[cur]" + ret.activeMatchOrdinal +
2053              "[total]" + ret.numberOfMatches + "[isDone]" + ret.isDoneCounting);
2054          }
2055        })
2056    }
2057  }
2058}
2059```
2060
2061加载的html文件。
2062```html
2063<!-- index.html -->
2064<!DOCTYPE html>
2065<html>
2066  <body>
2067    <p>Hello World Highlight Hello World</p>
2068  </body>
2069</html>
2070```
2071
2072## clearMatches
2073
2074clearMatches(): void
2075
2076清除所有通过[searchAllAsync](#searchallasync)匹配到的高亮字符查找结果。
2077
2078**系统能力:** SystemCapability.Web.Webview.Core
2079
2080**错误码:**
2081
2082以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
2083
2084| 错误码ID | 错误信息                                                     |
2085| -------- | ------------------------------------------------------------ |
2086| 17100001 | Init error. The WebviewController must be associated with a Web component. |
2087
2088**示例:**
2089
2090```ts
2091// xxx.ets
2092import { webview } from '@kit.ArkWeb';
2093import { BusinessError } from '@kit.BasicServicesKit';
2094
2095@Entry
2096@Component
2097struct WebComponent {
2098  controller: webview.WebviewController = new webview.WebviewController();
2099
2100  build() {
2101    Column() {
2102      Button('clearMatches')
2103        .onClick(() => {
2104          try {
2105            this.controller.clearMatches();
2106          } catch (error) {
2107            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
2108          }
2109        })
2110      Web({ src: $rawfile('index.html'), controller: this.controller })
2111    }
2112  }
2113}
2114```
2115
2116加载的html文件,请参考[searchAllAsync](#searchallasync)接口下加载的html文件。
2117
2118## searchNext
2119
2120searchNext(forward: boolean): void
2121
2122滚动到下一个匹配的查找结果并高亮。
2123
2124**系统能力:** SystemCapability.Web.Webview.Core
2125
2126**参数:**
2127
2128| 参数名  | 类型 | 必填 | 说明               |
2129| ------- | -------- | ---- | ---------------------- |
2130| forward | boolean  | 是   | 从前向后或者逆向查找方式。<br>true表示从前向后查找,false表示从后向前查找。 |
2131
2132**错误码:**
2133
2134以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
2135
2136| 错误码ID | 错误信息                                                     |
2137| -------- | ------------------------------------------------------------ |
2138| 17100001 | Init error. The WebviewController must be associated with a Web component. |
2139| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. |
2140
2141**示例:**
2142
2143```ts
2144// xxx.ets
2145import { webview } from '@kit.ArkWeb';
2146import { BusinessError } from '@kit.BasicServicesKit';
2147
2148@Entry
2149@Component
2150struct WebComponent {
2151  controller: webview.WebviewController = new webview.WebviewController();
2152
2153  build() {
2154    Column() {
2155      Button('searchNext')
2156        .onClick(() => {
2157          try {
2158            this.controller.searchNext(true);
2159          } catch (error) {
2160            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
2161          }
2162        })
2163      Web({ src: $rawfile('index.html'), controller: this.controller })
2164    }
2165  }
2166}
2167```
2168
2169加载的html文件,请参考[searchAllAsync](#searchallasync)接口下加载的html文件。
2170
2171## clearSslCache
2172
2173clearSslCache(): void
2174
2175清除Web组件记录的SSL证书错误事件对应的用户操作行为。
2176
2177**系统能力:** SystemCapability.Web.Webview.Core
2178
2179**错误码:**
2180
2181以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
2182
2183| 错误码ID | 错误信息                                                     |
2184| -------- | ------------------------------------------------------------ |
2185| 17100001 | Init error. The WebviewController must be associated with a Web component. |
2186
2187**示例:**
2188
2189```ts
2190// xxx.ets
2191import { webview } from '@kit.ArkWeb';
2192import { BusinessError } from '@kit.BasicServicesKit';
2193
2194@Entry
2195@Component
2196struct WebComponent {
2197  controller: webview.WebviewController = new webview.WebviewController();
2198
2199  build() {
2200    Column() {
2201      Button('clearSslCache')
2202        .onClick(() => {
2203          try {
2204            this.controller.clearSslCache();
2205          } catch (error) {
2206            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
2207          }
2208        })
2209      Web({ src: 'www.example.com', controller: this.controller })
2210    }
2211  }
2212}
2213```
2214
2215## clearClientAuthenticationCache
2216
2217clearClientAuthenticationCache(): void
2218
2219清除Web组件记录的客户端证书请求事件对应的用户操作行为。
2220
2221**系统能力:** SystemCapability.Web.Webview.Core
2222
2223**错误码:**
2224
2225以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
2226
2227| 错误码ID | 错误信息                                                     |
2228| -------- | ------------------------------------------------------------ |
2229| 17100001 | Init error. The WebviewController must be associated with a Web component. |
2230
2231**示例:**
2232
2233```ts
2234// xxx.ets
2235import { webview } from '@kit.ArkWeb';
2236import { BusinessError } from '@kit.BasicServicesKit';
2237
2238@Entry
2239@Component
2240struct WebComponent {
2241  controller: webview.WebviewController = new webview.WebviewController();
2242
2243  build() {
2244    Column() {
2245      Button('clearClientAuthenticationCache')
2246        .onClick(() => {
2247          try {
2248            this.controller.clearClientAuthenticationCache();
2249          } catch (error) {
2250            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
2251          }
2252        })
2253      Web({ src: 'www.example.com', controller: this.controller })
2254    }
2255  }
2256}
2257```
2258
2259## createWebMessagePorts
2260
2261createWebMessagePorts(isExtentionType?: boolean): Array\<WebMessagePort>
2262
2263创建Web消息端口。
2264
2265**系统能力:** SystemCapability.Web.Webview.Core
2266
2267**参数:**
2268
2269| 参数名 | 类型                   | 必填 | 说明                             |
2270| ------ | ---------------------- | ---- | :------------------------------|
2271| isExtentionType<sup>10+</sup>   | boolean     | 否  | 是否使用扩展增强接口。<br>true表示使用扩展增强接口,false表示不使用扩展增强接口。<br>默认值:false。 |
2272
2273**返回值:**
2274
2275| 类型                   | 说明              |
2276| ---------------------- | ----------------- |
2277| Array\<[WebMessagePort](./arkts-apis-webview-WebMessagePort.md)> | web消息端口列表。 |
2278
2279**错误码:**
2280
2281以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
2282
2283| 错误码ID | 错误信息                                                     |
2284| -------- | ------------------------------------------------------------ |
2285| 17100001 | Init error. The WebviewController must be associated with a Web component. |
2286| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. |
2287
2288**示例:**
2289
2290完整示例代码参考[onMessageEventExt](./arkts-apis-webview-WebMessagePort.md#onmessageeventext10)。
2291
2292## postMessage
2293
2294postMessage(name: string, ports: Array\<WebMessagePort>, uri: string): void
2295
2296发送Web消息端口到HTML。
2297
2298**系统能力:** SystemCapability.Web.Webview.Core
2299
2300**参数:**
2301
2302| 参数名 | 类型                   | 必填 | 说明                             |
2303| ------ | ---------------------- | ---- | :------------------------------- |
2304| name   | string                 | 是   | 要发送的消息名称。            |
2305| ports  | Array\<[WebMessagePort](./arkts-apis-webview-WebMessagePort.md)> | 是   | 要发送的消息端口。            |
2306| uri    | string                 | 是   | 接收该消息的URI。                |
2307
2308**错误码:**
2309
2310以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
2311
2312| 错误码ID | 错误信息                                                     |
2313| -------- | ------------------------------------------------------------ |
2314| 17100001 | Init error. The WebviewController must be associated with a Web component. |
2315| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. |
2316
2317**示例:**
2318
2319```ts
2320// xxx.ets
2321import { webview } from '@kit.ArkWeb';
2322import { BusinessError } from '@kit.BasicServicesKit';
2323
2324@Entry
2325@Component
2326struct WebComponent {
2327  controller: webview.WebviewController = new webview.WebviewController();
2328  ports: webview.WebMessagePort[] = [];
2329  @State sendFromEts: string = 'Send this message from ets to HTML';
2330  @State receivedFromHtml: string = 'Display received message send from HTML';
2331
2332  build() {
2333    Column() {
2334      // 展示接收到的来自HTML的内容
2335      Text(this.receivedFromHtml)
2336      // 输入框的内容发送到html
2337      TextInput({ placeholder: 'Send this message from ets to HTML' })
2338        .onChange((value: string) => {
2339          this.sendFromEts = value;
2340        })
2341
2342      Button('postMessage')
2343        .onClick(() => {
2344          try {
2345            // 1、创建两个消息端口。
2346            this.ports = this.controller.createWebMessagePorts();
2347            // 2、在应用侧的消息端口(如端口1)上注册回调事件。
2348            this.ports[1].onMessageEvent((result: webview.WebMessage) => {
2349              let msg = 'Got msg from HTML:';
2350              if (typeof (result) == "string") {
2351                console.info("received string message from html5, string is:" + result);
2352                msg = msg + result;
2353              } else if (typeof (result) == "object") {
2354                if (result instanceof ArrayBuffer) {
2355                  console.info("received arraybuffer from html5, length is:" + result.byteLength);
2356                  msg = msg + "length is " + result.byteLength;
2357                } else {
2358                  console.info("not support");
2359                }
2360              } else {
2361                console.info("not support");
2362              }
2363              this.receivedFromHtml = msg;
2364            })
2365            // 3、将另一个消息端口(如端口0)发送到HTML侧,由HTML侧保存并使用。
2366            this.controller.postMessage('__init_port__', [this.ports[0]], '*');
2367          } catch (error) {
2368            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
2369          }
2370        })
2371
2372      // 4、使用应用侧的端口给另一个已经发送到html的端口发送消息。
2373      Button('SendDataToHTML')
2374        .onClick(() => {
2375          try {
2376            if (this.ports && this.ports[1]) {
2377              this.ports[1].postMessageEvent(this.sendFromEts);
2378            } else {
2379              console.error(`ports is null, Please initialize first`);
2380            }
2381          } catch (error) {
2382            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
2383          }
2384        })
2385      Web({ src: $rawfile('index.html'), controller: this.controller })
2386    }
2387  }
2388}
2389```
2390
2391加载的html文件。
2392```html
2393<!--index.html-->
2394<!DOCTYPE html>
2395<html>
2396<head>
2397    <meta name="viewport" content="width=device-width, initial-scale=1.0">
2398    <title>WebView Message Port Demo</title>
2399</head>
2400
2401  <body>
2402    <h1>WebView Message Port Demo</h1>
2403    <div>
2404        <input type="button" value="SendToEts" onclick="PostMsgToEts(msgFromJS.value);"/><br/>
2405        <input id="msgFromJS" type="text" value="send this message from HTML to ets"/><br/>
2406    </div>
2407    <p class="output">display received message send from ets</p>
2408  </body>
2409  <script src="xxx.js"></script>
2410</html>
2411```
2412
2413<!--code_no_check-->
2414```js
2415//xxx.js
2416var h5Port;
2417var output = document.querySelector('.output');
2418window.addEventListener('message', function (event) {
2419    if (event.data == '__init_port__') {
2420        if (event.ports[0] != null) {
2421            h5Port = event.ports[0]; // 1. 保存从ets侧发送过来的端口
2422            h5Port.onmessage = function (event) {
2423              // 2. 接收ets侧发送过来的消息.
2424              var msg = 'Got message from ets:';
2425              var result = event.data;
2426              if (typeof(result) == "string") {
2427                console.info("received string message from html5, string is:" + result);
2428                msg = msg + result;
2429              } else if (typeof(result) == "object") {
2430                if (result instanceof ArrayBuffer) {
2431                  console.info("received arraybuffer from html5, length is:" + result.byteLength);
2432                  msg = msg + "length is " + result.byteLength;
2433                } else {
2434                  console.info("not support");
2435                }
2436              } else {
2437                console.info("not support");
2438              }
2439              output.innerHTML = msg;
2440            }
2441        }
2442    }
2443})
2444
2445// 3. 使用h5Port往ets侧发送消息.
2446function PostMsgToEts(data) {
2447    if (h5Port) {
2448      h5Port.postMessage(data);
2449    } else {
2450      console.error("h5Port is null, Please initialize first");
2451    }
2452}
2453```
2454
2455## requestFocus
2456
2457requestFocus(): void
2458
2459使当前web页面获取焦点。
2460
2461**系统能力:** SystemCapability.Web.Webview.Core
2462
2463**错误码:**
2464
2465以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
2466
2467| 错误码ID | 错误信息                                                     |
2468| -------- | ------------------------------------------------------------ |
2469| 17100001 | Init error. The WebviewController must be associated with a Web component. |
2470
2471**示例:**
2472
2473```ts
2474// xxx.ets
2475import { webview } from '@kit.ArkWeb';
2476import { BusinessError } from '@kit.BasicServicesKit';
2477
2478@Entry
2479@Component
2480struct WebComponent {
2481  controller: webview.WebviewController = new webview.WebviewController();
2482
2483  build() {
2484    Column() {
2485      Button('requestFocus')
2486        .onClick(() => {
2487          try {
2488            this.controller.requestFocus();
2489          } catch (error) {
2490            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
2491          }
2492        });
2493      Web({ src: 'www.example.com', controller: this.controller })
2494    }
2495  }
2496}
2497```
2498
2499## zoomIn
2500
2501zoomIn(): void
2502
2503调用此接口将当前网页进行放大,比例为25%。
2504
2505**系统能力:** SystemCapability.Web.Webview.Core
2506
2507**错误码:**
2508
2509以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
2510
2511| 错误码ID | 错误信息                                                     |
2512| -------- | ------------------------------------------------------------ |
2513| 17100001 | Init error. The WebviewController must be associated with a Web component. |
2514| 17100004 | Function not enabled.                                         |
2515
2516**示例:**
2517
2518```ts
2519// xxx.ets
2520import { webview } from '@kit.ArkWeb';
2521import { BusinessError } from '@kit.BasicServicesKit';
2522
2523@Entry
2524@Component
2525struct WebComponent {
2526  controller: webview.WebviewController = new webview.WebviewController();
2527
2528  build() {
2529    Column() {
2530      Button('zoomIn')
2531        .onClick(() => {
2532          try {
2533            this.controller.zoomIn();
2534          } catch (error) {
2535            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
2536          }
2537        })
2538      Web({ src: 'www.example.com', controller: this.controller })
2539    }
2540  }
2541}
2542```
2543
2544## zoomOut
2545
2546zoomOut(): void
2547
2548调用此接口将当前网页进行缩小,比例为20%。
2549
2550**系统能力:** SystemCapability.Web.Webview.Core
2551
2552**错误码:**
2553
2554以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
2555
2556| 错误码ID | 错误信息                                                     |
2557| -------- | ------------------------------------------------------------ |
2558| 17100001 | Init error. The WebviewController must be associated with a Web component. |
2559| 17100004 | Function not enabled.                                         |
2560
2561**示例:**
2562
2563```ts
2564// xxx.ets
2565import { webview } from '@kit.ArkWeb';
2566import { BusinessError } from '@kit.BasicServicesKit';
2567
2568@Entry
2569@Component
2570struct WebComponent {
2571  controller: webview.WebviewController = new webview.WebviewController();
2572
2573  build() {
2574    Column() {
2575      Button('zoomOut')
2576        .onClick(() => {
2577          try {
2578            this.controller.zoomOut();
2579          } catch (error) {
2580            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
2581          }
2582        })
2583      Web({ src: 'www.example.com', controller: this.controller })
2584    }
2585  }
2586}
2587```
2588
2589## getWebId
2590
2591getWebId(): number
2592
2593获取当前Web组件的索引值,用于多个Web组件的管理。
2594
2595**系统能力:** SystemCapability.Web.Webview.Core
2596
2597**返回值:**
2598
2599| 类型   | 说明                  |
2600| ------ | --------------------- |
2601| number | 当前Web组件的索引值。 |
2602
2603**错误码:**
2604
2605以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
2606
2607| 错误码ID | 错误信息                                                     |
2608| -------- | ------------------------------------------------------------ |
2609| 17100001 | Init error. The WebviewController must be associated with a Web component. |
2610
2611**示例:**
2612
2613```ts
2614// xxx.ets
2615import { webview } from '@kit.ArkWeb';
2616import { BusinessError } from '@kit.BasicServicesKit';
2617
2618@Entry
2619@Component
2620struct WebComponent {
2621  controller: webview.WebviewController = new webview.WebviewController();
2622
2623  build() {
2624    Column() {
2625      Button('getWebId')
2626        .onClick(() => {
2627          try {
2628            let id = this.controller.getWebId();
2629            console.info("id: " + id);
2630          } catch (error) {
2631            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
2632          }
2633        })
2634      Web({ src: 'www.example.com', controller: this.controller })
2635    }
2636  }
2637}
2638```
2639
2640## getUserAgent
2641
2642getUserAgent(): string
2643
2644获取当前默认用户代理。
2645
2646默认User-Agent定义与使用场景请参考[User-Agent开发指导](../../web/web-default-userAgent.md)
2647
2648**系统能力:** SystemCapability.Web.Webview.Core
2649
2650**返回值:**
2651
2652| 类型   | 说明           |
2653| ------ | -------------- |
2654| string | 默认用户代理。 |
2655
2656**错误码:**
2657
2658以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
2659
2660| 错误码ID | 错误信息                                                     |
2661| -------- | ------------------------------------------------------------ |
2662| 17100001 | Init error. The WebviewController must be associated with a Web component. |
2663
2664**示例:**
2665
2666```ts
2667// xxx.ets
2668import { webview } from '@kit.ArkWeb';
2669import { BusinessError } from '@kit.BasicServicesKit';
2670
2671@Entry
2672@Component
2673struct WebComponent {
2674  controller: webview.WebviewController = new webview.WebviewController();
2675
2676  build() {
2677    Column() {
2678      Button('getUserAgent')
2679        .onClick(() => {
2680          try {
2681            let userAgent = this.controller.getUserAgent();
2682            console.info("userAgent: " + userAgent);
2683          } catch (error) {
2684            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
2685          }
2686        })
2687      Web({ src: 'www.example.com', controller: this.controller })
2688    }
2689  }
2690}
2691```
2692
2693支持开发者基于默认的User-Agent去定制User-Agent。
2694```ts
2695// xxx.ets
2696import { webview } from '@kit.ArkWeb';
2697import { BusinessError } from '@kit.BasicServicesKit';
2698
2699@Entry
2700@Component
2701struct WebComponent {
2702  controller: webview.WebviewController = new webview.WebviewController();
2703  @State ua: string = "";
2704
2705  aboutToAppear(): void {
2706    webview.once('webInited', () => {
2707      try {
2708        // 应用侧用法示例,定制User-Agent。
2709        this.ua = this.controller.getUserAgent() + 'xxx';
2710        this.controller.setCustomUserAgent(this.ua);
2711      } catch (error) {
2712        console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
2713      }
2714    })
2715  }
2716
2717  build() {
2718    Column() {
2719      Web({ src: 'www.example.com', controller: this.controller })
2720    }
2721  }
2722}
2723```
2724
2725## getTitle
2726
2727getTitle(): string
2728
2729获取当前网页的标题。
2730
2731**系统能力:** SystemCapability.Web.Webview.Core
2732
2733**返回值:**
2734
2735| 类型   | 说明                 |
2736| ------ | -------------------- |
2737| string | 当前网页的标题。 |
2738
2739**错误码:**
2740
2741以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
2742
2743| 错误码ID | 错误信息                                                     |
2744| -------- | ------------------------------------------------------------ |
2745| 17100001 | Init error. The WebviewController must be associated with a Web component. |
2746
2747**示例:**
2748
2749```ts
2750// xxx.ets
2751import { webview } from '@kit.ArkWeb';
2752import { BusinessError } from '@kit.BasicServicesKit';
2753
2754@Entry
2755@Component
2756struct WebComponent {
2757  controller: webview.WebviewController = new webview.WebviewController();
2758
2759  build() {
2760    Column() {
2761      Button('getTitle')
2762        .onClick(() => {
2763          try {
2764            let title = this.controller.getTitle();
2765            console.info("title: " + title);
2766          } catch (error) {
2767            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
2768          }
2769        })
2770      Web({ src: 'www.example.com', controller: this.controller })
2771    }
2772  }
2773}
2774```
2775
2776## getPageHeight
2777
2778getPageHeight(): number
2779
2780获取当前网页的页面高度。
2781
2782**系统能力:** SystemCapability.Web.Webview.Core
2783
2784**返回值:**
2785
2786| 类型   | 说明                 |
2787| ------ | -------------------- |
2788| number | 当前网页的页面高度。单位:vp。 |
2789
2790**错误码:**
2791
2792以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
2793
2794| 错误码ID | 错误信息                                                     |
2795| -------- | ------------------------------------------------------------ |
2796| 17100001 | Init error. The WebviewController must be associated with a Web component. |
2797
2798**示例:**
2799
2800```ts
2801// xxx.ets
2802import { webview } from '@kit.ArkWeb';
2803import { BusinessError } from '@kit.BasicServicesKit';
2804
2805@Entry
2806@Component
2807struct WebComponent {
2808  controller: webview.WebviewController = new webview.WebviewController();
2809
2810  build() {
2811    Column() {
2812      Button('getPageHeight')
2813        .onClick(() => {
2814          try {
2815            let pageHeight = this.controller.getPageHeight();
2816            console.log("pageHeight : " + pageHeight);
2817          } catch (error) {
2818            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
2819          }
2820        })
2821      Web({ src: 'www.example.com', controller: this.controller })
2822    }
2823  }
2824}
2825```
2826
2827## storeWebArchive
2828
2829storeWebArchive(baseName: string, autoName: boolean, callback: AsyncCallback\<string>): void
2830
2831以回调方式异步保存当前页面。
2832
2833**系统能力:** SystemCapability.Web.Webview.Core
2834
2835**参数:**
2836
2837| 参数名   | 类型              | 必填 | 说明                                                         |
2838| -------- | --------------------- | ---- | ------------------------------------------------------------ |
2839| baseName | string                | 是   | 生成的离线网页存储位置,该值不能为空。                                 |
2840| autoName | boolean               | 是   | 决定是否自动生成文件名。<br>false表示按baseName的文件名存储,true表示根据当前Url自动生成文件名,并按baseName的文件目录存储。 |
2841| callback | AsyncCallback\<string> | 是   | 返回文件存储路径,保存网页失败会返回null。                   |
2842
2843**错误码:**
2844
2845以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
2846
2847| 错误码ID | 错误信息                                                     |
2848| -------- | ------------------------------------------------------------ |
2849| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3. Parameter verification failed.                                   |
2850| 17100001 | Init error. The WebviewController must be associated with a Web component. |
2851| 17100003 | Invalid resource path or file type.                          |
2852
2853**示例:**
2854
2855```ts
2856// xxx.ets
2857import { webview } from '@kit.ArkWeb';
2858import { BusinessError } from '@kit.BasicServicesKit';
2859
2860@Entry
2861@Component
2862struct WebComponent {
2863  controller: webview.WebviewController = new webview.WebviewController();
2864
2865  build() {
2866    Column() {
2867      Button('storeWebArchive')
2868        .onClick(() => {
2869          try {
2870            this.controller.storeWebArchive("/data/storage/el2/base/", true, (error, filename) => {
2871              if (error) {
2872                console.error(`save web archive error, ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
2873                return;
2874              }
2875              if (filename != null) {
2876                console.info(`save web archive success: ${filename}`);
2877              }
2878            });
2879          } catch (error) {
2880            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
2881          }
2882        })
2883      Web({ src: 'www.example.com', controller: this.controller })
2884    }
2885  }
2886}
2887```
2888
2889## storeWebArchive
2890
2891storeWebArchive(baseName: string, autoName: boolean): Promise\<string>
2892
2893以Promise方式异步保存当前页面。
2894
2895**系统能力:** SystemCapability.Web.Webview.Core
2896
2897**参数:**
2898
2899| 参数名   | 类型 | 必填 | 说明                                                         |
2900| -------- | -------- | ---- | ------------------------------------------------------------ |
2901| baseName | string   | 是   | 生成的离线网页存储位置,该值不能为空。                                 |
2902| autoName | boolean  | 是   | 决定是否自动生成文件名。<br>false表示按baseName的文件名存储,true表示根据当前Url自动生成文件名,并按baseName的文件目录存储。 |
2903
2904**返回值:**
2905
2906| 类型            | 说明                                                  |
2907| --------------- | ----------------------------------------------------- |
2908| Promise\<string> | Promise实例,保存成功返回文件路径,保存失败返回null。 |
2909
2910**错误码:**
2911
2912以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
2913
2914| 错误码ID | 错误信息                                                     |
2915| -------- | ------------------------------------------------------------ |
2916| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3. Parameter verification failed.                                   |
2917| 17100001 | Init error. The WebviewController must be associated with a Web component. |
2918| 17100003 | Invalid resource path or file type.                          |
2919
2920**示例:**
2921
2922```ts
2923// xxx.ets
2924import { webview } from '@kit.ArkWeb';
2925import { BusinessError } from '@kit.BasicServicesKit';
2926
2927@Entry
2928@Component
2929struct WebComponent {
2930  controller: webview.WebviewController = new webview.WebviewController();
2931
2932  build() {
2933    Column() {
2934      Button('storeWebArchive')
2935        .onClick(() => {
2936          try {
2937            this.controller.storeWebArchive("/data/storage/el2/base/", true)
2938              .then(filename => {
2939                if (filename != null) {
2940                  console.info(`save web archive success: ${filename}`)
2941                }
2942              })
2943              .catch((error: BusinessError) => {
2944                console.error(`ErrorCode: ${error.code},  Message: ${error.message}`);
2945              })
2946          } catch (error) {
2947            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
2948          }
2949        })
2950      Web({ src: 'www.example.com', controller: this.controller })
2951    }
2952  }
2953}
2954```
2955
2956## getUrl
2957
2958getUrl(): string
2959
2960获取当前页面的url地址。
2961
2962**系统能力:** SystemCapability.Web.Webview.Core
2963
2964**返回值:**
2965
2966| 类型   | 说明                |
2967| ------ | ------------------- |
2968| string | 当前页面的url地址。 |
2969
2970**错误码:**
2971
2972以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
2973
2974| 错误码ID | 错误信息                                                     |
2975| -------- | ------------------------------------------------------------ |
2976| 17100001 | Init error. The WebviewController must be associated with a Web component. |
2977
2978**示例:**
2979
2980```ts
2981// xxx.ets
2982import { webview } from '@kit.ArkWeb';
2983import { BusinessError } from '@kit.BasicServicesKit';
2984
2985@Entry
2986@Component
2987struct WebComponent {
2988  controller: webview.WebviewController = new webview.WebviewController();
2989
2990  build() {
2991    Column() {
2992      Button('getUrl')
2993        .onClick(() => {
2994          try {
2995            let url = this.controller.getUrl();
2996            console.info("url: " + url);
2997          } catch (error) {
2998            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
2999          }
3000        })
3001      Web({ src: 'www.example.com', controller: this.controller })
3002    }
3003  }
3004}
3005```
3006
3007## stop
3008
3009stop(): void
3010
3011停止页面加载。
3012
3013**系统能力:** SystemCapability.Web.Webview.Core
3014
3015**错误码:**
3016
3017以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
3018
3019| 错误码ID | 错误信息                                                     |
3020| -------- | ------------------------------------------------------------ |
3021| 17100001 | Init error. The WebviewController must be associated with a Web component. |
3022
3023**示例:**
3024
3025```ts
3026// xxx.ets
3027import { webview } from '@kit.ArkWeb';
3028import { BusinessError } from '@kit.BasicServicesKit';
3029
3030@Entry
3031@Component
3032struct WebComponent {
3033  controller: webview.WebviewController = new webview.WebviewController();
3034
3035  build() {
3036    Column() {
3037      Button('stop')
3038        .onClick(() => {
3039          try {
3040            this.controller.stop();
3041          } catch (error) {
3042            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
3043          }
3044        });
3045      Web({ src: 'www.example.com', controller: this.controller })
3046    }
3047  }
3048}
3049```
3050
3051## backOrForward
3052
3053backOrForward(step: number): void
3054
3055按照历史栈,前进或者后退指定步长的页面,当历史栈中不存在对应步长的页面时,不会进行页面跳转。
3056
3057前进或者后退页面时,直接使用已加载过的网页,无需重新加载网页。
3058
3059**系统能力:** SystemCapability.Web.Webview.Core
3060
3061**参数:**
3062
3063| 参数名 | 类型 | 必填 | 说明               |
3064| ------ | -------- | ---- | ---------------------- |
3065| step   | number   | 是   | 需要前进或后退的步长。 |
3066
3067**错误码:**
3068
3069以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
3070
3071| 错误码ID | 错误信息                                                     |
3072| -------- | ------------------------------------------------------------ |
3073| 17100001 | Init error. The WebviewController must be associated with a Web component. |
3074| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. |
3075
3076**示例:**
3077
3078```ts
3079// xxx.ets
3080import { webview } from '@kit.ArkWeb';
3081import { BusinessError } from '@kit.BasicServicesKit';
3082
3083@Entry
3084@Component
3085struct WebComponent {
3086  controller: webview.WebviewController = new webview.WebviewController();
3087  @State step: number = -2;
3088
3089  build() {
3090    Column() {
3091      Button('backOrForward')
3092        .onClick(() => {
3093          try {
3094            this.controller.backOrForward(this.step);
3095          } catch (error) {
3096            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
3097          }
3098        })
3099      Web({ src: 'www.example.com', controller: this.controller })
3100    }
3101  }
3102}
3103```
3104
3105## scrollTo
3106
3107scrollTo(x:number, y:number, duration?:number): void
3108
3109在指定时间内,将页面滚动到指定的绝对位置。
3110
3111**系统能力:** SystemCapability.Web.Webview.Core
3112
3113**参数:**
3114
3115| 参数名 | 类型 | 必填 | 说明               |
3116| ------ | -------- | ---- | ---------------------- |
3117| x   | number   | 是   | 绝对位置的水平坐标,当传入数值为负数时,按照传入0处理。<br>单位:vp。 |
3118| y   | number   | 是   | 绝对位置的垂直坐标,当传入数值为负数时,按照传入0处理。<br>单位:vp。|
3119| duration<sup>14+</sup> | number | 否 | 滚动动画时间。<br>单位:ms。<br>不传入为无动画,当传入数值为负数或传入0时,按照不传入处理。 |
3120
3121**错误码:**
3122
3123以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
3124
3125| 错误码ID | 错误信息                                                     |
3126| -------- | ------------------------------------------------------------ |
3127| 17100001 | Init error. The WebviewController must be associated with a Web component. |
3128| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. |
3129
3130**示例:**
3131
3132```ts
3133// xxx.ets
3134import { webview } from '@kit.ArkWeb';
3135import { BusinessError } from '@kit.BasicServicesKit';
3136
3137@Entry
3138@Component
3139struct WebComponent {
3140  controller: webview.WebviewController = new webview.WebviewController();
3141
3142  build() {
3143    Column() {
3144      Button('scrollTo')
3145        .onClick(() => {
3146          try {
3147            this.controller.scrollTo(50, 50, 500);
3148          } catch (error) {
3149            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
3150          }
3151        })
3152        Button('stopScroll')
3153        .onClick(() => {
3154          try {
3155            this.controller.scrollBy(0, 0, 1); //如果想停止当前scroll产生的动画,可再次生成一个1ms的动画去打断该动画。
3156          } catch (error) {
3157            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
3158          }
3159        })
3160      Web({ src: $rawfile('index.html'), controller: this.controller })
3161    }
3162  }
3163}
3164```
3165
3166加载的html文件。
3167```html
3168<!--index.html-->
3169<!DOCTYPE html>
3170<html>
3171<head>
3172    <title>Demo</title>
3173    <style>
3174        body {
3175            width:2000px;
3176            height:2000px;
3177            padding-right:170px;
3178            padding-left:170px;
3179            border:5px solid blueviolet;
3180        }
3181    </style>
3182</head>
3183<body>
3184Scroll Test
3185</body>
3186</html>
3187```
3188
3189## scrollBy
3190
3191scrollBy(deltaX:number, deltaY:number,duration?:number): void
3192
3193在指定时间内将页面滚动指定的偏移量。
3194
3195**系统能力:** SystemCapability.Web.Webview.Core
3196
3197**参数:**
3198
3199| 参数名 | 类型 | 必填 | 说明               |
3200| ------ | -------- | ---- | ---------------------- |
3201| deltaX | number   | 是   | 水平偏移量,其中水平向右为正方向。<br>单位:vp。 |
3202| deltaY | number   | 是   | 垂直偏移量,其中垂直向下为正方向。<br>单位:vp。 |
3203| duration<sup>14+</sup> | number | 否 | 滚动动画时间。<br>单位:ms。<br>不传入为无动画,当传入数值为负数或传入0时,按照不传入处理。 |
3204
3205**错误码:**
3206
3207以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
3208
3209| 错误码ID | 错误信息                                                     |
3210| -------- | ------------------------------------------------------------ |
3211| 17100001 | Init error. The WebviewController must be associated with a Web component. |
3212| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. |
3213
3214> **说明:**
3215>
3216> 嵌套滚动场景中,调用scrollBy不会触发父组件的嵌套滚动。
3217
3218**示例:**
3219
3220```ts
3221// xxx.ets
3222import { webview } from '@kit.ArkWeb';
3223import { BusinessError } from '@kit.BasicServicesKit';
3224
3225@Entry
3226@Component
3227struct WebComponent {
3228  controller: webview.WebviewController = new webview.WebviewController();
3229
3230  build() {
3231    Column() {
3232      Button('scrollBy')
3233        .onClick(() => {
3234          try {
3235            this.controller.scrollBy(50, 50, 500);
3236          } catch (error) {
3237            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
3238          }
3239        })
3240      Button('stopScroll')
3241        .onClick(() => {
3242          try {
3243            this.controller.scrollBy(0, 0, 1); //如果想停止当前scroll产生的动画,可再次生成一个1ms的动画去打断该动画。
3244          } catch (error) {
3245            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
3246          }
3247        })
3248      Web({ src: $rawfile('index.html'), controller: this.controller })
3249    }
3250  }
3251}
3252```
3253
3254加载的html文件。
3255```html
3256<!--index.html-->
3257<!DOCTYPE html>
3258<html>
3259<head>
3260    <title>Demo</title>
3261    <style>
3262        body {
3263            width:2000px;
3264            height:2000px;
3265            padding-right:170px;
3266            padding-left:170px;
3267            border:5px solid blueviolet;
3268        }
3269    </style>
3270</head>
3271<body>
3272Scroll Test
3273</body>
3274</html>
3275```
3276## scrollByWithResult<sup>12+</sup>
3277
3278scrollByWithResult(deltaX: number, deltaY: number): boolean
3279
3280将页面滚动指定的偏移量,返回值表示此次滚动是否执行成功。
3281
3282**系统能力:** SystemCapability.Web.Webview.Core
3283
3284**参数:**
3285
3286| 参数名 | 类型 | 必填 | 说明               |
3287| ------ | -------- | ---- | ---------------------- |
3288| deltaX | number   | 是   | 水平偏移量,其中水平向右为正方向。 <br>单位:vp。 |
3289| deltaY | number   | 是   | 垂直偏移量,其中垂直向下为正方向。 <br>单位:vp。 |
3290
3291**返回值:**
3292
3293| 类型    | 说明                                     |
3294| ------- | --------------------------------------- |
3295| boolean | true表示当前网页可以滑动,false表示当前网页不可以滑动。<br>默认为false。 |
3296
3297**错误码:**
3298
3299以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
3300
3301| 错误码ID | 错误信息                                                     |
3302| -------- | ------------------------------------------------------------ |
3303| 17100001 | Init error. The WebviewController must be associated with a Web component. |
3304| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. |
3305
3306> **说明:**
3307>
3308> - 返回值场景:Web页面处于触摸中状态时,返回false,否则返回true。
3309> - 同层渲染场景中,Web的同层渲染区域处于触摸中状态时,返回值为true。
3310> - 嵌套滚动场景中,调用scrollByWithResult不会触发父组件的嵌套滚动。
3311> - 此接口不保证滑动帧率性能。
3312
3313**示例:**
3314
3315```ts
3316// xxx.ets
3317import { webview } from '@kit.ArkWeb';
3318import { BusinessError } from '@kit.BasicServicesKit';
3319
3320@Entry
3321@Component
3322struct WebComponent {
3323  controller: webview.WebviewController = new webview.WebviewController();
3324
3325  build() {
3326    Column() {
3327      Button('scrollByWithResult')
3328        .onClick(() => {
3329          try {
3330          let result = this.controller.scrollByWithResult(50, 50);
3331          console.info("original result: " + result);
3332          } catch (error) {
3333            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
3334          }
3335        })
3336      Web({ src: $rawfile('index.html'), controller: this.controller })
3337    }
3338  }
3339}
3340```
3341
3342加载的html文件。
3343```html
3344<!--index.html-->
3345<!DOCTYPE html>
3346<html>
3347<head>
3348    <title>Demo</title>
3349    <style>
3350        body {
3351            width:2000px;
3352            height:2000px;
3353            padding-right:170px;
3354            padding-left:170px;
3355            border:5px solid blueviolet;
3356        }
3357    </style>
3358</head>
3359<body>
3360Scroll Test
3361</body>
3362</html>
3363```
3364## slideScroll
3365
3366slideScroll(vx:number, vy:number): void
3367
3368按照指定速度模拟对页面的轻扫滚动动作。
3369
3370**系统能力:** SystemCapability.Web.Webview.Core
3371
3372**参数:**
3373
3374| 参数名 | 类型 | 必填 | 说明               |
3375| ------ | -------- | ---- | ---------------------- |
3376| vx     | number   | 是   | 轻扫滚动的水平速度分量,其中水平向右为速度正方向。<br>单位:vp/ms。 |
3377| vy     | number   | 是   | 轻扫滚动的垂直速度分量,其中垂直向下为速度正方向。<br>单位:vp/ms。 |
3378
3379**错误码:**
3380
3381以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
3382
3383| 错误码ID | 错误信息                                                     |
3384| -------- | ------------------------------------------------------------ |
3385| 17100001 | Init error. The WebviewController must be associated with a Web component. |
3386| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. |
3387
3388**示例:**
3389
3390```ts
3391// xxx.ets
3392import { webview } from '@kit.ArkWeb';
3393import { BusinessError } from '@kit.BasicServicesKit';
3394
3395@Entry
3396@Component
3397struct WebComponent {
3398  controller: webview.WebviewController = new webview.WebviewController();
3399
3400  build() {
3401    Column() {
3402      Button('slideScroll')
3403        .onClick(() => {
3404          try {
3405            this.controller.slideScroll(500, 500);
3406          } catch (error) {
3407            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
3408          }
3409        })
3410      Web({ src: $rawfile('index.html'), controller: this.controller })
3411    }
3412  }
3413}
3414```
3415
3416加载的html文件。
3417```html
3418<!--index.html-->
3419<!DOCTYPE html>
3420<html>
3421<head>
3422    <title>Demo</title>
3423    <style>
3424        body {
3425            width:3000px;
3426            height:3000px;
3427            padding-right:170px;
3428            padding-left:170px;
3429            border:5px solid blueviolet;
3430        }
3431    </style>
3432</head>
3433<body>
3434Scroll Test
3435</body>
3436</html>
3437```
3438
3439## getOriginalUrl
3440
3441getOriginalUrl(): string
3442
3443获取当前页面的原始url地址。
3444风险提示:如果想获取url来做JavascriptProxy通信接口认证,请使用[getLastJavascriptProxyCallingFrameUrl<sup>12+</sup>](#getlastjavascriptproxycallingframeurl12)
3445
3446**系统能力:** SystemCapability.Web.Webview.Core
3447
3448**返回值:**
3449
3450| 类型   | 说明                    |
3451| ------ | ----------------------- |
3452| string | 当前页面的原始url地址。 |
3453
3454**错误码:**
3455
3456以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
3457
3458| 错误码ID | 错误信息                                                     |
3459| -------- | ------------------------------------------------------------ |
3460| 17100001 | Init error. The WebviewController must be associated with a Web component. |
3461
3462**示例:**
3463
3464```ts
3465// xxx.ets
3466import { webview } from '@kit.ArkWeb';
3467import { BusinessError } from '@kit.BasicServicesKit';
3468
3469@Entry
3470@Component
3471struct WebComponent {
3472  controller: webview.WebviewController = new webview.WebviewController();
3473
3474  build() {
3475    Column() {
3476      Button('getOrgUrl')
3477        .onClick(() => {
3478          try {
3479            let url = this.controller.getOriginalUrl();
3480            console.info("original url: " + url);
3481          } catch (error) {
3482            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
3483          }
3484        })
3485      Web({ src: 'www.example.com', controller: this.controller })
3486    }
3487  }
3488}
3489```
3490
3491## getFavicon
3492
3493getFavicon(): image.PixelMap
3494
3495获取页面的favicon图标。
3496
3497**系统能力:** SystemCapability.Web.Webview.Core
3498
3499**返回值:**
3500
3501| 类型                                   | 说明                            |
3502| -------------------------------------- | ------------------------------- |
3503| image.[PixelMap](../apis-image-kit/arkts-apis-image-PixelMap.md) | 页面favicon图标的PixelMap对象。 |
3504
3505**错误码:**
3506
3507以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
3508
3509| 错误码ID | 错误信息                                                     |
3510| -------- | ------------------------------------------------------------ |
3511| 17100001 | Init error. The WebviewController must be associated with a Web component. |
3512
3513**示例:**
3514
3515```ts
3516// xxx.ets
3517import { webview } from '@kit.ArkWeb';
3518import { BusinessError } from '@kit.BasicServicesKit';
3519import { image } from '@kit.ImageKit';
3520
3521@Entry
3522@Component
3523struct WebComponent {
3524  controller: webview.WebviewController = new webview.WebviewController();
3525  @State pixelmap: image.PixelMap | undefined = undefined;
3526
3527  build() {
3528    Column() {
3529      Button('getFavicon')
3530        .onClick(() => {
3531          try {
3532            this.pixelmap = this.controller.getFavicon();
3533          } catch (error) {
3534            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
3535          }
3536        })
3537      Web({ src: 'www.example.com', controller: this.controller })
3538    }
3539  }
3540}
3541```
3542
3543## setNetworkAvailable
3544
3545setNetworkAvailable(enable: boolean): void
3546
3547设置JavaScript中的`window.navigator.onLine`属性。
3548
3549**系统能力:** SystemCapability.Web.Webview.Core
3550
3551**参数:**
3552
3553| 参数名 | 类型    | 必填 | 说明                              |
3554| ------ | ------- | ---- | --------------------------------- |
3555| enable | boolean | 是   | 设置JavaScript中的`window.navigator.onLine`属性。<br>true表示设置JavaScript中的`window.navigator.onLine`属性为true,false表示设置JavaScript中的`window.navigator.onLine`属性为false。<br>默认值:true。 |
3556
3557**错误码:**
3558
3559以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
3560
3561| 错误码ID | 错误信息                                                     |
3562| -------- | ------------------------------------------------------------ |
3563| 17100001 | Init error. The WebviewController must be associated with a Web component. |
3564| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. |
3565
3566**示例:**
3567
3568```ts
3569// xxx.ets
3570import { webview } from '@kit.ArkWeb';
3571import { BusinessError } from '@kit.BasicServicesKit';
3572
3573@Entry
3574@Component
3575struct WebComponent {
3576  controller: webview.WebviewController = new webview.WebviewController();
3577
3578  build() {
3579    Column() {
3580      Button('setNetworkAvailable')
3581        .onClick(() => {
3582          try {
3583            this.controller.setNetworkAvailable(true);
3584          } catch (error) {
3585            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
3586          }
3587        })
3588      Web({ src: $rawfile('index.html'), controller: this.controller })
3589    }
3590  }
3591}
3592```
3593
3594加载的html文件。
3595```html
3596<!-- index.html -->
3597<!DOCTYPE html>
3598<html>
3599<body>
3600<h1>online 属性</h1>
3601<p id="demo"></p>
3602<button onclick="func()">click</button>
3603<script>
3604    // 检测浏览器是否在线。
3605    var online1 = navigator.onLine;
3606    document.getElementById("demo").innerHTML = "浏览器在线:" + online1;
3607
3608    function func(){
3609      var online2 = navigator.onLine;
3610      document.getElementById("demo").innerHTML = "浏览器在线:" + online2;
3611    }
3612</script>
3613</body>
3614</html>
3615```
3616
3617## hasImage
3618
3619hasImage(callback: AsyncCallback\<boolean>): void
3620
3621通过Callback方式异步查找当前页面是否存在图像。
3622
3623**系统能力:** SystemCapability.Web.Webview.Core
3624
3625**参数:**
3626
3627| 参数名   | 类型                    | 必填 | 说明                       |
3628| -------- | ----------------------- | ---- | -------------------------- |
3629| callback | AsyncCallback\<boolean> | 是   | 返回查找页面是否存在图像。<br> true表示页面存在图像;false表示页面不存在图像。 |
3630
3631**错误码:**
3632
3633以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
3634
3635| 错误码ID | 错误信息                                                     |
3636| -------- | ------------------------------------------------------------ |
3637| 17100001 | Init error. The WebviewController must be associated with a Web component. |
3638| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. |
3639
3640**示例:**
3641
3642```ts
3643// xxx.ets
3644import { webview } from '@kit.ArkWeb';
3645import { BusinessError } from '@kit.BasicServicesKit';
3646
3647@Entry
3648@Component
3649struct WebComponent {
3650  controller: webview.WebviewController = new webview.WebviewController();
3651
3652  build() {
3653    Column() {
3654      Button('hasImageCb')
3655        .onClick(() => {
3656          try {
3657            this.controller.hasImage((error, data) => {
3658              if (error) {
3659                console.error(`hasImage error, ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
3660                return;
3661              }
3662              console.info("hasImage: " + data);
3663            });
3664          } catch (error) {
3665            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
3666          }
3667        })
3668      Web({ src: 'www.example.com', controller: this.controller })
3669    }
3670  }
3671}
3672```
3673
3674## hasImage
3675
3676hasImage(): Promise\<boolean>
3677
3678通过Promise方式异步查找当前页面是否存在图像。
3679
3680**系统能力:** SystemCapability.Web.Webview.Core
3681
3682**返回值:**
3683
3684| 类型              | 说明                                    |
3685| ----------------- | --------------------------------------- |
3686| Promise\<boolean> | Promise实例,返回查找页面是否存在图像。<br> true表示页面存在图像;false表示页面不存在图像。 |
3687
3688**错误码:**
3689
3690以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
3691
3692| 错误码ID | 错误信息                                                     |
3693| -------- | ------------------------------------------------------------ |
3694| 17100001 | Init error. The WebviewController must be associated with a Web component. |
3695| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. |
3696
3697**示例:**
3698
3699```ts
3700// xxx.ets
3701import { webview } from '@kit.ArkWeb';
3702import { BusinessError } from '@kit.BasicServicesKit';
3703
3704@Entry
3705@Component
3706struct WebComponent {
3707  controller: webview.WebviewController = new webview.WebviewController();
3708
3709  build() {
3710    Column() {
3711      Button('hasImagePm')
3712        .onClick(() => {
3713          try {
3714            this.controller.hasImage().then((data) => {
3715              console.info('hasImage: ' + data);
3716            }).catch((error: BusinessError) => {
3717              console.error("error: " + error);
3718            })
3719          } catch (error) {
3720            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
3721          }
3722        })
3723      Web({ src: 'www.example.com', controller: this.controller })
3724    }
3725  }
3726}
3727```
3728
3729## removeCache
3730
3731removeCache(clearRom: boolean): void
3732
3733清除应用中的资源缓存文件,此方法将会清除同一应用中所有Webview的缓存文件。
3734
3735> **说明:**
3736>
3737> 可以通过在data/storage/el2/base/cache/web/Cache目录下查看Webview的缓存。
3738
3739**系统能力:** SystemCapability.Web.Webview.Core
3740
3741**参数:**
3742
3743| 参数名   | 类型    | 必填 | 说明                                                     |
3744| -------- | ------- | ---- | -------------------------------------------------------- |
3745| clearRom | boolean | 是   | 设置为true时同时清除ROM和RAM中的缓存,设置为false时只清除RAM中的缓存。 |
3746
3747**错误码:**
3748
3749以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
3750
3751| 错误码ID | 错误信息                                                     |
3752| -------- | ------------------------------------------------------------ |
3753| 17100001 | Init error. The WebviewController must be associated with a Web component. |
3754| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. |
3755
3756**示例:**
3757
3758```ts
3759// xxx.ets
3760import { webview } from '@kit.ArkWeb';
3761import { BusinessError } from '@kit.BasicServicesKit';
3762
3763@Entry
3764@Component
3765struct WebComponent {
3766  controller: webview.WebviewController = new webview.WebviewController();
3767
3768  build() {
3769    Column() {
3770      Button('removeCache')
3771        .onClick(() => {
3772          try {
3773            this.controller.removeCache(false);
3774          } catch (error) {
3775            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
3776          }
3777        })
3778      Web({ src: 'www.example.com', controller: this.controller })
3779    }
3780  }
3781}
3782```
3783
3784## removeAllCache<sup>18+</sup>
3785
3786static removeAllCache(clearRom: boolean): void
3787
3788清除应用中的资源缓存文件,此方法将会清除同一应用中所有Webview的缓存文件。
3789
3790> **说明:**
3791>
3792> 可以通过在data/app/el2/100/base/\<applicationPackageName\>/cache/web/目录下查看Webview的缓存。
3793
3794**系统能力:** SystemCapability.Web.Webview.Core
3795
3796**参数:**
3797
3798| 参数名   | 类型    | 必填 | 说明                                                     |
3799| -------- | ------- | ---- | -------------------------------------------------------- |
3800| clearRom | boolean | 是   | 设置为true时同时清除ROM和RAM中的缓存,设置为false时只清除RAM中的缓存。 |
3801
3802**错误码:**
3803
3804以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
3805
3806| 错误码ID | 错误信息                                                     |
3807| -------- | ------------------------------------------------------------ |
3808| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. |
3809
3810**示例:**
3811
3812```ts
3813// xxx.ets
3814import { webview } from '@kit.ArkWeb';
3815import { BusinessError } from '@kit.BasicServicesKit';
3816
3817@Entry
3818@Component
3819struct WebComponent {
3820  controller: webview.WebviewController = new webview.WebviewController();
3821
3822  build() {
3823    Column() {
3824      Button('removeAllCache')
3825        .onClick(() => {
3826          try {
3827            webview.WebviewController.removeAllCache(false);
3828          } catch (error) {
3829            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
3830          }
3831        })
3832      Web({ src: 'www.example.com', controller: this.controller })
3833    }
3834  }
3835}
3836```
3837
3838## pageUp
3839
3840pageUp(top: boolean): void
3841
3842将Webview的内容向上滚动半个视框大小或者跳转到页面最顶部,通过top入参控制。
3843
3844**系统能力:** SystemCapability.Web.Webview.Core
3845
3846**参数:**
3847
3848| 参数名 | 类型    | 必填 | 说明                                                         |
3849| ------ | ------- | ---- | ------------------------------------------------------------ |
3850| top    | boolean | 是   | 是否跳转到页面最顶部。<br>false表示将页面内容向上滚动半个视框大小,true表示跳转到页面最顶部。 |
3851
3852**错误码:**
3853
3854以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
3855
3856| 错误码ID | 错误信息                                                     |
3857| -------- | ------------------------------------------------------------ |
3858| 17100001 | Init error. The WebviewController must be associated with a Web component. |
3859| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. |
3860
3861**示例:**
3862
3863```ts
3864// xxx.ets
3865import { webview } from '@kit.ArkWeb';
3866import { BusinessError } from '@kit.BasicServicesKit';
3867
3868@Entry
3869@Component
3870struct WebComponent {
3871  controller: webview.WebviewController = new webview.WebviewController();
3872
3873  build() {
3874    Column() {
3875      Button('pageUp')
3876        .onClick(() => {
3877          try {
3878            this.controller.pageUp(false);
3879          } catch (error) {
3880            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
3881          }
3882        })
3883      Web({ src: $rawfile("index.html"), controller: this.controller })
3884    }
3885  }
3886}
3887```
3888```html
3889<!-- index.html -->
3890<!DOCTYPE html>
3891<html>
3892<head>
3893    <meta name="viewport" id="viewport" content="width=device-width, initial-scale=1.0">
3894    <style>
3895        .blue {
3896          background-color: lightblue;
3897        }
3898        .green {
3899          background-color: lightgreen;
3900        }
3901        .blue, .green {
3902         font-size:16px;
3903         height:200px;
3904         text-align: center;       /* 水平居中 */
3905         line-height: 200px;       /* 垂直居中(值等于容器高度) */
3906        }
3907    </style>
3908</head>
3909<body>
3910<div class="blue" >webArea</div>
3911<div class="green">webArea</div>
3912<div class="blue">webArea</div>
3913<div class="green">webArea</div>
3914<div class="blue">webArea</div>
3915<div class="green">webArea</div>
3916<div class="blue">webArea</div>
3917</body>
3918</html>
3919```
3920
3921## pageDown
3922
3923pageDown(bottom: boolean): void
3924
3925将Webview的内容向下滚动半个视框大小或者跳转到页面最底部,通过bottom入参控制。
3926
3927**系统能力:** SystemCapability.Web.Webview.Core
3928
3929**参数:**
3930
3931| 参数名 | 类型    | 必填 | 说明                                                         |
3932| ------ | ------- | ---- | ------------------------------------------------------------ |
3933| bottom | boolean | 是   | 是否跳转到页面最底部。<br>false时表示将页面内容向下滚动半个视框大小,true表示跳转到页面最底部。 |
3934
3935**错误码:**
3936
3937以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
3938
3939| 错误码ID | 错误信息                                                     |
3940| -------- | ------------------------------------------------------------ |
3941| 17100001 | Init error. The WebviewController must be associated with a Web component. |
3942| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. |
3943
3944**示例:**
3945
3946```ts
3947// xxx.ets
3948import { webview } from '@kit.ArkWeb';
3949import { BusinessError } from '@kit.BasicServicesKit';
3950
3951@Entry
3952@Component
3953struct WebComponent {
3954  controller: webview.WebviewController = new webview.WebviewController();
3955
3956  build() {
3957    Column() {
3958      Button('pageDown')
3959        .onClick(() => {
3960          try {
3961            this.controller.pageDown(false);
3962          } catch (error) {
3963            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
3964          }
3965        })
3966      Web({ src: $rawfile("index.html"), controller: this.controller })
3967    }
3968  }
3969}
3970```
3971
3972加载的html文件。
3973
3974```html
3975<!-- index.html -->
3976<!DOCTYPE html>
3977<html>
3978<head>
3979    <meta name="viewport" id="viewport" content="width=device-width, initial-scale=1.0">
3980    <style>
3981        .blue {
3982          background-color: lightblue;
3983        }
3984        .green {
3985          background-color: lightgreen;
3986        }
3987        .blue, .green {
3988         font-size:16px;
3989         height:200px;
3990         text-align: center;       /* 水平居中 */
3991         line-height: 200px;       /* 垂直居中(值等于容器高度) */
3992        }
3993    </style>
3994</head>
3995<body>
3996<div class="blue" >webArea</div>
3997<div class="green">webArea</div>
3998<div class="blue">webArea</div>
3999<div class="green">webArea</div>
4000<div class="blue">webArea</div>
4001<div class="green">webArea</div>
4002<div class="blue">webArea</div>
4003</body>
4004</html>
4005```
4006
4007## getBackForwardEntries
4008
4009getBackForwardEntries(): BackForwardList
4010
4011获取当前Webview的历史信息列表。
4012
4013> **说明:**
4014>
4015> [onLoadIntercept](./arkts-basic-components-web-events.md#onloadintercept10)在加载开始的时候触发,该时刻还未生成历史节点,所以在onLoadIntercept中调用getBackForwardEntries拿到的历史栈不包括当前正在加载中的跳转。
4016
4017**系统能力:** SystemCapability.Web.Webview.Core
4018
4019**返回值:**
4020
4021| 类型                                | 说明                        |
4022| ----------------------------------- | --------------------------- |
4023| [BackForwardList](./arkts-apis-webview-BackForwardList.md) | 当前Webview的历史信息列表。 |
4024
4025**错误码:**
4026
4027以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
4028
4029| 错误码ID | 错误信息                                                     |
4030| -------- | ------------------------------------------------------------ |
4031| 17100001 | Init error. The WebviewController must be associated with a Web component. |
4032
4033**示例:**
4034
4035```ts
4036// xxx.ets
4037import { webview } from '@kit.ArkWeb';
4038import { BusinessError } from '@kit.BasicServicesKit';
4039
4040@Entry
4041@Component
4042struct WebComponent {
4043  controller: webview.WebviewController = new webview.WebviewController();
4044
4045  build() {
4046    Column() {
4047      Button('getBackForwardEntries')
4048        .onClick(() => {
4049          try {
4050            let list = this.controller.getBackForwardEntries()
4051          } catch (error) {
4052            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
4053          }
4054        })
4055      Web({ src: 'www.example.com', controller: this.controller })
4056    }
4057  }
4058}
4059```
4060
4061## serializeWebState
4062
4063serializeWebState(): Uint8Array
4064
4065将当前Webview的页面状态历史记录信息序列化。
4066
4067**系统能力:** SystemCapability.Web.Webview.Core
4068
4069**返回值:**
4070
4071| 类型       | 说明                                          |
4072| ---------- | --------------------------------------------- |
4073| Uint8Array | 当前Webview的页面状态历史记录序列化后的数据。 |
4074
4075**错误码:**
4076
4077以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
4078
4079| 错误码ID | 错误信息                                                     |
4080| -------- | ------------------------------------------------------------ |
4081| 17100001 | Init error. The WebviewController must be associated with a Web component. |
4082
4083**示例:**
4084
40851.对文件的操作需要导入文件管理模块,详情请参考[文件管理](../apis-core-file-kit/js-apis-file-fs.md)。
4086```ts
4087// xxx.ets
4088import { webview } from '@kit.ArkWeb';
4089import { BusinessError } from '@kit.BasicServicesKit';
4090import { fileIo } from '@kit.CoreFileKit';
4091
4092@Entry
4093@Component
4094struct WebComponent {
4095  controller: webview.WebviewController = new webview.WebviewController();
4096
4097  build() {
4098    Column() {
4099      Button('serializeWebState')
4100        .onClick(() => {
4101          try {
4102            let state = this.controller.serializeWebState();
4103            let path:string | undefined = AppStorage.get("cacheDir");
4104            if (path) {
4105              path += '/WebState';
4106              // 以同步方法打开文件。
4107              let file = fileIo.openSync(path, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);
4108              fileIo.writeSync(file.fd, state.buffer);
4109              fileIo.closeSync(file.fd);
4110            }
4111          } catch (error) {
4112            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
4113          }
4114        })
4115      Web({ src: 'www.example.com', controller: this.controller })
4116    }
4117  }
4118}
4119```
4120
41212.修改EntryAbility.ets4122获取应用缓存文件路径。
4123```ts
4124// xxx.ets
4125import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
4126
4127export default class EntryAbility extends UIAbility {
4128    onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
4129        // 通过在AppStorage对象上绑定cacheDir,可以实现UIAbility组件与Page之间的数据同步。
4130        AppStorage.setOrCreate("cacheDir", this.context.cacheDir);
4131    }
4132}
4133```
4134
4135## restoreWebState
4136
4137restoreWebState(state: Uint8Array): void
4138
4139当前Webview从序列化数据中恢复页面状态历史记录。
4140
4141如果state过大,可能会导致异常。建议state大于512k时,放弃恢复页面状态历史记录。
4142
4143**系统能力:** SystemCapability.Web.Webview.Core
4144
4145**参数:**
4146
4147| 参数名 | 类型       | 必填 | 说明                         |
4148| ------ | ---------- | ---- | ---------------------------- |
4149| state  | Uint8Array | 是   | 页面状态历史记录序列化数据。 |
4150
4151**错误码:**
4152
4153以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
4154
4155| 错误码ID | 错误信息                                                     |
4156| -------- | ------------------------------------------------------------ |
4157| 17100001 | Init error. The WebviewController must be associated with a Web component. |
4158| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. |
4159
4160**示例:**
4161
41621.对文件的操作需要导入文件管理模块,详情请参考[文件管理](../apis-core-file-kit/js-apis-file-fs.md)。
4163```ts
4164// xxx.ets
4165import { webview } from '@kit.ArkWeb';
4166import { BusinessError } from '@kit.BasicServicesKit';
4167import { fileIo } from '@kit.CoreFileKit';
4168
4169@Entry
4170@Component
4171struct WebComponent {
4172  controller: webview.WebviewController = new webview.WebviewController();
4173
4174  build() {
4175    Column() {
4176      Button('RestoreWebState')
4177        .onClick(() => {
4178          try {
4179            let path: string | undefined = AppStorage.get("cacheDir");
4180            if (path) {
4181              path += '/WebState';
4182              // 以同步方法打开文件。
4183              let file = fileIo.openSync(path, fileIo.OpenMode.READ_WRITE);
4184              let stat = fileIo.statSync(path);
4185              let size = stat.size;
4186              let buf = new ArrayBuffer(size);
4187              fileIo.read(file.fd, buf, (err, readLen) => {
4188                if (err) {
4189                  console.error("console error with error message: " + err.message + ", error code: " + err.code);
4190                } else {
4191                  console.info("read file data succeed");
4192                  this.controller.restoreWebState(new Uint8Array(buf.slice(0, readLen)));
4193                  fileIo.closeSync(file);
4194                }
4195              });
4196            }
4197          } catch (error) {
4198            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
4199          }
4200        })
4201      Web({ src: 'www.example.com', controller: this.controller })
4202    }
4203  }
4204}
4205```
4206
42072.修改EntryAbility.ets4208获取应用缓存文件路径。
4209```ts
4210// xxx.ets
4211import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
4212
4213export default class EntryAbility extends UIAbility {
4214  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
4215    // 通过在AppStorage对象上绑定cacheDir,可以实现UIAbility组件与Page之间的数据同步。
4216    AppStorage.setOrCreate("cacheDir", this.context.cacheDir);
4217  }
4218}
4219```
4220
4221## customizeSchemes
4222
4223static customizeSchemes(schemes: Array\<WebCustomScheme\>): void
4224
4225对Web内核赋予自定义协议url的跨域请求与fetch请求的权限。当Web在跨域fetch自定义协议url时,该fetch请求可被[onInterceptRequest](./arkts-basic-components-web-events.md#oninterceptrequest9)事件接口所拦截,从而开发者可以进一步处理该请求。建议在任何Web组件初始化之前调用该接口。
4226
4227**系统能力:** SystemCapability.Web.Webview.Core
4228
4229**参数:**
4230
4231| 参数名   | 类型    | 必填 | 说明                      |
4232| -------- | ------- | ---- | -------------------------------------- |
4233| schemes | Array\<[WebCustomScheme](./arkts-apis-webview-i.md#webcustomscheme)\> | 是   | 自定义协议配置,最多支持同时配置10个自定义协议。 |
4234
4235**错误码:**
4236
4237以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
4238
4239| 错误码ID | 错误信息                                                     |
4240| -------- | ------------------------------------------------------------ |
4241|  401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types.    |
4242| 17100020 | Failed to register custom schemes. |
4243
4244**示例:**
4245
4246```ts
4247// xxx.ets
4248import { webview } from '@kit.ArkWeb';
4249import { BusinessError } from '@kit.BasicServicesKit';
4250
4251@Entry
4252@Component
4253struct WebComponent {
4254  controller: webview.WebviewController = new webview.WebviewController();
4255  responseWeb: WebResourceResponse = new WebResourceResponse();
4256  scheme1: webview.WebCustomScheme = { schemeName: "name1", isSupportCORS: true, isSupportFetch: true };
4257  scheme2: webview.WebCustomScheme = { schemeName: "name2", isSupportCORS: true, isSupportFetch: true };
4258  scheme3: webview.WebCustomScheme = { schemeName: "name3", isSupportCORS: true, isSupportFetch: true };
4259
4260  aboutToAppear(): void {
4261    try {
4262      webview.WebviewController.customizeSchemes([this.scheme1, this.scheme2, this.scheme3]);
4263    } catch (error) {
4264      console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
4265    }
4266  }
4267
4268  build() {
4269    Column() {
4270      Web({ src: 'www.example.com', controller: this.controller })
4271        .onInterceptRequest((event) => {
4272          if (event) {
4273            console.info('url:' + event.request.getRequestUrl());
4274          }
4275          return this.responseWeb;
4276        })
4277    }
4278  }
4279}
4280```
4281
4282## getCertificate<sup>10+</sup>
4283
4284getCertificate(): Promise<Array<cert.X509Cert>>
4285
4286获取当前网站的证书信息。使用Web组件加载https网站,会进行SSL证书校验,该接口会通过Promise异步返回当前网站的X509格式证书(X509Cert证书类型定义见[X509Cert](../apis-device-certificate-kit/js-apis-cert.md#x509cert)定义),便于开发者展示网站证书信息。
4287
4288**系统能力:** SystemCapability.Web.Webview.Core
4289
4290**返回值:**
4291
4292| 类型       | 说明                                          |
4293| ---------- | --------------------------------------------- |
4294| Promise<Array<cert.X509Cert>> | Promise实例,用于获取当前加载的https网站的X509格式证书数组。 |
4295
4296**错误码:**
4297
4298以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
4299
4300| 错误码ID | 错误信息                                                     |
4301| -------- | ------------------------------------------------------------ |
4302| 17100001 | Init error. The WebviewController must be associated with a web component. |
4303
4304**示例:**
4305
4306```ts
4307// xxx.ets
4308import { webview } from '@kit.ArkWeb';
4309import { BusinessError } from '@kit.BasicServicesKit';
4310import { cert } from '@kit.DeviceCertificateKit';
4311
4312function Uint8ArrayToString(dataArray: Uint8Array) {
4313  let dataString = '';
4314  for (let i = 0; i < dataArray.length; i++) {
4315    dataString += String.fromCharCode(dataArray[i]);
4316  }
4317  return dataString;
4318}
4319
4320function ParseX509CertInfo(x509CertArray: Array<cert.X509Cert>) {
4321  let res: string = 'getCertificate success: len = ' + x509CertArray.length;
4322  for (let i = 0; i < x509CertArray.length; i++) {
4323    res += ', index = ' + i + ', issuer name = '
4324      + Uint8ArrayToString(x509CertArray[i].getIssuerName().data) + ', subject name = '
4325      + Uint8ArrayToString(x509CertArray[i].getSubjectName().data) + ', valid start = '
4326      + x509CertArray[i].getNotBeforeTime()
4327      + ', valid end = ' + x509CertArray[i].getNotAfterTime();
4328  }
4329  return res;
4330}
4331
4332@Entry
4333@Component
4334struct Index {
4335  // outputStr在UI界面显示调试信息
4336  @State outputStr: string = '';
4337  webviewCtl: webview.WebviewController = new webview.WebviewController();
4338
4339  build() {
4340    Row() {
4341      Column() {
4342        List({ space: 20, initialIndex: 0 }) {
4343          ListItem() {
4344            Button() {
4345              Text('load bad ssl')
4346                .fontSize(10)
4347                .fontWeight(FontWeight.Bold)
4348            }
4349            .type(ButtonType.Capsule)
4350            .onClick(() => {
4351              // 加载一个过期的证书网站,查看获取到的证书信息
4352              this.webviewCtl.loadUrl('https://expired.badssl.com');
4353            })
4354            .height(50)
4355          }
4356
4357          ListItem() {
4358            Button() {
4359              Text('load example')
4360                .fontSize(10)
4361                .fontWeight(FontWeight.Bold)
4362            }
4363            .type(ButtonType.Capsule)
4364            .onClick(() => {
4365              // 加载一个https网站,查看网站的证书信息
4366              this.webviewCtl.loadUrl('https://www.example.com');
4367            })
4368            .height(50)
4369          }
4370
4371          ListItem() {
4372            Button() {
4373              Text('getCertificate Promise')
4374                .fontSize(10)
4375                .fontWeight(FontWeight.Bold)
4376            }
4377            .type(ButtonType.Capsule)
4378            .onClick(() => {
4379              try {
4380                this.webviewCtl.getCertificate().then((x509CertArray: Array<cert.X509Cert>) => {
4381                  this.outputStr = ParseX509CertInfo(x509CertArray);
4382                })
4383              } catch (error) {
4384                this.outputStr = 'getCertificate failed: ' + (error as BusinessError).code + ", errMsg: " + (error as BusinessError).message;
4385              }
4386            })
4387            .height(50)
4388          }
4389
4390          ListItem() {
4391            Button() {
4392              Text('getCertificate AsyncCallback')
4393                .fontSize(10)
4394                .fontWeight(FontWeight.Bold)
4395            }
4396            .type(ButtonType.Capsule)
4397            .onClick(() => {
4398              try {
4399                this.webviewCtl.getCertificate((error: BusinessError, x509CertArray: Array<cert.X509Cert>) => {
4400                  if (error) {
4401                    this.outputStr = 'getCertificate failed: ' + error.code + ", errMsg: " + error.message;
4402                  } else {
4403                    this.outputStr = ParseX509CertInfo(x509CertArray);
4404                  }
4405                })
4406              } catch (error) {
4407                this.outputStr = 'getCertificate failed: ' + (error as BusinessError).code + ", errMsg: " + (error as BusinessError).message;
4408              }
4409            })
4410            .height(50)
4411          }
4412        }
4413        .listDirection(Axis.Horizontal)
4414        .height('10%')
4415
4416        Text(this.outputStr)
4417          .width('100%')
4418          .fontSize(10)
4419
4420        Web({ src: 'https://www.example.com', controller: this.webviewCtl })
4421          .fileAccess(true)
4422          .javaScriptAccess(true)
4423          .domStorageAccess(true)
4424          .onlineImageAccess(true)
4425          .onPageEnd((e) => {
4426            if (e) {
4427              this.outputStr = 'onPageEnd : url = ' + e.url;
4428            }
4429          })
4430          .onSslErrorEventReceive((e) => {
4431            // 忽略ssl证书错误,便于测试一些证书过期的网站,如:https://expired.badssl.com
4432            e.handler.handleConfirm();
4433          })
4434          .width('100%')
4435          .height('70%')
4436      }
4437      .height('100%')
4438    }
4439  }
4440}
4441```
4442
4443## getCertificate<sup>10+</sup>
4444
4445getCertificate(callback: AsyncCallback<Array<cert.X509Cert>>): void
4446
4447获取当前网站的证书信息。使用Web组件加载https网站,会进行SSL证书校验,该接口会通过AsyncCallback异步返回当前网站的X509格式证书(X509Cert证书类型定义见[X509Cert定义](../apis-device-certificate-kit/js-apis-cert.md)),便于开发者展示网站证书信息。
4448
4449**系统能力:** SystemCapability.Web.Webview.Core
4450
4451**参数:**
4452
4453| 参数名   | 类型                         | 必填 | 说明                                     |
4454| -------- | ---------------------------- | ---- | ---------------------------------------- |
4455| callback | AsyncCallback<Array<cert.X509Cert>> | 是   | 通过AsyncCallback异步返回当前网站的X509格式证书。 |
4456
4457**错误码:**
4458
4459以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
4460
4461| 错误码ID | 错误信息                                                     |
4462| -------- | ------------------------------------------------------------ |
4463| 17100001 | Init error. The WebviewController must be associated with a web component. |
4464| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. |
4465
4466**示例:**
4467
4468```ts
4469// xxx.ets
4470import { webview } from '@kit.ArkWeb';
4471import { BusinessError } from '@kit.BasicServicesKit';
4472import { cert } from '@kit.DeviceCertificateKit';
4473
4474function Uint8ArrayToString(dataArray: Uint8Array) {
4475  let dataString = '';
4476  for (let i = 0; i < dataArray.length; i++) {
4477    dataString += String.fromCharCode(dataArray[i]);
4478  }
4479  return dataString;
4480}
4481
4482function ParseX509CertInfo(x509CertArray: Array<cert.X509Cert>) {
4483  let res: string = 'getCertificate success: len = ' + x509CertArray.length;
4484  for (let i = 0; i < x509CertArray.length; i++) {
4485    res += ', index = ' + i + ', issuer name = '
4486      + Uint8ArrayToString(x509CertArray[i].getIssuerName().data) + ', subject name = '
4487      + Uint8ArrayToString(x509CertArray[i].getSubjectName().data) + ', valid start = '
4488      + x509CertArray[i].getNotBeforeTime()
4489      + ', valid end = ' + x509CertArray[i].getNotAfterTime();
4490  }
4491  return res;
4492}
4493
4494@Entry
4495@Component
4496struct Index {
4497  // outputStr在UI界面显示调试信息
4498  @State outputStr: string = '';
4499  webviewCtl: webview.WebviewController = new webview.WebviewController();
4500
4501  build() {
4502    Row() {
4503      Column() {
4504        List({ space: 20, initialIndex: 0 }) {
4505          ListItem() {
4506            Button() {
4507              Text('load bad ssl')
4508                .fontSize(10)
4509                .fontWeight(FontWeight.Bold)
4510            }
4511            .type(ButtonType.Capsule)
4512            .onClick(() => {
4513              // 加载一个过期的证书网站,查看获取到的证书信息
4514              this.webviewCtl.loadUrl('https://expired.badssl.com');
4515            })
4516            .height(50)
4517          }
4518
4519          ListItem() {
4520            Button() {
4521              Text('load example')
4522                .fontSize(10)
4523                .fontWeight(FontWeight.Bold)
4524            }
4525            .type(ButtonType.Capsule)
4526            .onClick(() => {
4527              // 加载一个https网站,查看网站的证书信息
4528              this.webviewCtl.loadUrl('https://www.example.com');
4529            })
4530            .height(50)
4531          }
4532
4533          ListItem() {
4534            Button() {
4535              Text('getCertificate Promise')
4536                .fontSize(10)
4537                .fontWeight(FontWeight.Bold)
4538            }
4539            .type(ButtonType.Capsule)
4540            .onClick(() => {
4541              try {
4542                this.webviewCtl.getCertificate().then((x509CertArray: Array<cert.X509Cert>) => {
4543                  this.outputStr = ParseX509CertInfo(x509CertArray);
4544                })
4545              } catch (error) {
4546                this.outputStr = 'getCertificate failed: ' + (error as BusinessError).code + ", errMsg: " + (error as BusinessError).message;
4547              }
4548            })
4549            .height(50)
4550          }
4551
4552          ListItem() {
4553            Button() {
4554              Text('getCertificate AsyncCallback')
4555                .fontSize(10)
4556                .fontWeight(FontWeight.Bold)
4557            }
4558            .type(ButtonType.Capsule)
4559            .onClick(() => {
4560              try {
4561                this.webviewCtl.getCertificate((error: BusinessError, x509CertArray: Array<cert.X509Cert>) => {
4562                  if (error) {
4563                    this.outputStr = 'getCertificate failed: ' + error.code + ", errMsg: " + error.message;
4564                  } else {
4565                    this.outputStr = ParseX509CertInfo(x509CertArray);
4566                  }
4567                })
4568              } catch (error) {
4569                this.outputStr = 'getCertificate failed: ' + (error as BusinessError).code + ", errMsg: " + (error as BusinessError).message;
4570              }
4571            })
4572            .height(50)
4573          }
4574        }
4575        .listDirection(Axis.Horizontal)
4576        .height('10%')
4577
4578        Text(this.outputStr)
4579          .width('100%')
4580          .fontSize(10)
4581
4582        Web({ src: 'https://www.example.com', controller: this.webviewCtl })
4583          .fileAccess(true)
4584          .javaScriptAccess(true)
4585          .domStorageAccess(true)
4586          .onlineImageAccess(true)
4587          .onPageEnd((e) => {
4588            if (e) {
4589              this.outputStr = 'onPageEnd : url = ' + e.url;
4590            }
4591          })
4592          .onSslErrorEventReceive((e) => {
4593            // 忽略ssl证书错误,便于测试一些证书过期的网站,如:https://expired.badssl.com
4594            e.handler.handleConfirm();
4595          })
4596          .width('100%')
4597          .height('70%')
4598      }
4599      .height('100%')
4600    }
4601  }
4602}
4603```
4604
4605## setAudioMuted<sup>10+</sup>
4606
4607setAudioMuted(mute: boolean): void
4608
4609设置网页静音。
4610
4611**系统能力:** SystemCapability.Web.Webview.Core
4612
4613**参数:**
4614
4615| 参数名   | 类型    | 必填 | 说明                      |
4616| -------- | ------- | ---- | -------------------------------------- |
4617| mute | boolean | 是   | 表示是否将网页设置为静音状态。<br>true表示将网页设置为静音状态,false表示将网页取消静音状态。 |
4618
4619**错误码:**
4620
4621以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
4622
4623| 错误码ID | 错误信息                                                     |
4624| -------- | ------------------------------------------------------------ |
4625| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. |
4626| 17100001 | Init error. The WebviewController must be associated with a Web component. |
4627
4628**示例:**
4629
4630```ts
4631// xxx.ets
4632import { webview } from '@kit.ArkWeb';
4633
4634@Entry
4635@Component
4636struct WebComponent {
4637  controller: webview.WebviewController = new webview.WebviewController();
4638  @State muted: boolean = false;
4639
4640  build() {
4641    Column() {
4642      Button("Toggle Mute")
4643        .onClick(event => {
4644          if (event) {
4645            this.muted = !this.muted;
4646            this.controller.setAudioMuted(this.muted);
4647          }
4648        })
4649      Web({ src: 'www.example.com', controller: this.controller })
4650    }
4651  }
4652}
4653```
4654
4655## prefetchPage<sup>10+</sup>
4656
4657prefetchPage(url: string, additionalHeaders?: Array\<WebHeader>): void
4658
4659在预测到将要加载的页面之前调用,提前下载页面所需的资源,包括主资源子资源,但不会执行网页JavaScript代码或呈现网页,以加快加载速度。
4660
4661> **说明:**
4662>
4663> - 下载的页面资源,会缓存五分钟左右,超过这段时间Web组件会自动释放。
4664>
4665> - prefetchPage对302重定向页面同样正常预取。
4666>
4667> - 先执行prefetchPage,再加载页面时,已预取的资源将直接从缓存中加载。
4668>
4669> - 连续prefetchPage多个url只有第一个生效。
4670>
4671> - prefetchPage有时间限制,500ms内不能多次预取。
4672
4673**系统能力:** SystemCapability.Web.Webview.Core
4674
4675**参数:**
4676
4677| 参数名             | 类型                             | 必填  | 说明                      |
4678| ------------------| --------------------------------| ---- | ------------- |
4679| url               | string                          | 是    | 预加载的url。|
4680| additionalHeaders | Array\<[WebHeader](./arkts-apis-webview-i.md#webheader)> | 否    | url的附加HTTP请求头。<br>默认值: [] |
4681
4682**错误码:**
4683
4684以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
4685
4686| 错误码ID  | 错误信息                                                      |
4687| -------- | ------------------------------------------------------------ |
4688| 17100001 | Init error. The WebviewController must be associated with a Web component. |
4689| 17100002 | URL error. The webpage corresponding to the URL is invalid, or the URL length exceeds 2048.                                                 |
4690
4691**示例:**
4692
4693```ts
4694// xxx.ets
4695import { webview } from '@kit.ArkWeb';
4696import { BusinessError } from '@kit.BasicServicesKit';
4697
4698@Entry
4699@Component
4700struct WebComponent {
4701  controller: webview.WebviewController = new webview.WebviewController();
4702
4703  build() {
4704    Column() {
4705      Button('prefetchPopularPage')
4706        .onClick(() => {
4707          try {
4708            // 预加载时,需要将'https://www.example.com'替换成一个真实的网站地址。
4709            this.controller.prefetchPage('https://www.example.com');
4710          } catch (error) {
4711            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
4712          }
4713        })
4714      // 需要将'www.example1.com'替换成一个真实的网站地址。
4715      Web({ src: 'www.example1.com', controller: this.controller })
4716    }
4717  }
4718}
4719```
4720
4721## prefetchResource<sup>12+</sup>
4722
4723static prefetchResource(request: RequestInfo, additionalHeaders?: Array\<WebHeader>, cacheKey?: string, cacheValidTime?: number): void
4724
4725根据指定的请求信息和附加的http请求头去预获取资源请求,存入内存缓存,并指定其缓存key和有效期,以加快加载速度。目前仅支持Content-Type为application/x-www-form-urlencoded的post请求。最多可以预获取6个post请求。如果要预获取第7个,请通过[clearPrefetchedResource](#clearprefetchedresource12)清除不需要的post请求缓存,否则会自动清除最早预获取的post缓存。如果要使用预获取的资源缓存,开发者需要在正式发起的post请求的请求头中增加键值“ArkWebPostCacheKey”,其内容为对应缓存的cacheKey。
4726
4727**系统能力:**  SystemCapability.Web.Webview.Core
4728
4729**参数:**
4730
4731| 参数名             | 类型                             |  必填  | 说明                                                              |
4732| ------------------| ------------------------------- | ---- | ------------------------------------------------------------------ |
4733| request           | [RequestInfo](./arkts-apis-webview-i.md#requestinfo12)   | 是   | 预获取请求的信息。                                                      |
4734| additionalHeaders | Array\<[WebHeader](./arkts-apis-webview-i.md#webheader)> | 否   | 预获取请求的附加HTTP请求头。                                             |
4735| cacheKey          | string                          | 否   | 用于后续查询预获取资源缓存的key。仅支持字母和数字,未传入或传入空则取默认值url作为key。 |
4736| cacheValidTime    | number                          | 否   | 预获取资源缓存的有效期。<br>取值范围:(0, 2147483647]。<br>默认值:300秒。 <br>单位:秒。         |
4737
4738**错误码:**
4739
4740以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
4741
4742| 错误码ID  | 错误信息                                                      |
4743| -------- | ------------------------------------------------------------ |
4744| 401      | Invalid input parameter.Possible causes: 1. Mandatory parameters are left unspecified.2. Incorrect parameter types.3. Parameter verification failed. |
4745| 17100002 | URL error. The webpage corresponding to the URL is invalid, or the URL length exceeds 2048.                                                 |
4746
4747**示例:**
4748
4749```ts
4750// xxx.ets
4751import { webview } from '@kit.ArkWeb';
4752import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
4753
4754export default class EntryAbility extends UIAbility {
4755  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
4756    console.log("EntryAbility onCreate");
4757    webview.WebviewController.initializeWebEngine();
4758    // 预获取时,需要將"https://www.example1.com/post?e=f&g=h"替换成真实要访问的网站地址。
4759    webview.WebviewController.prefetchResource(
4760      {
4761        url: "https://www.example1.com/post?e=f&g=h",
4762        method: "POST",
4763        formData: "a=x&b=y",
4764      },
4765      [{
4766        headerKey: "c",
4767        headerValue: "z",
4768      },],
4769      "KeyX", 500);
4770    AppStorage.setOrCreate("abilityWant", want);
4771    console.log("EntryAbility onCreate done");
4772  }
4773}
4774```
4775
4776## clearPrefetchedResource<sup>12+</sup>
4777
4778static clearPrefetchedResource(cacheKeyList: Array\<string>): void
4779
4780根据指定的缓存key列表清除对应的预获取资源缓存。入参中的缓存key必须是[prefetchResource](#prefetchresource12)指定预获取到的资源缓存key。
4781
4782**系统能力:**  SystemCapability.Web.Webview.Core
4783
4784**参数:**
4785
4786| 参数名             | 类型        | 必填  | 说明                                                                       |
4787| ------------------| ----------- | ---- | ------------------------------------------------------------------------- |
4788| cacheKeyList      | Array\<string>      | 是   | 用于后续查询预获取资源缓存的key。仅支持字母和数字,未传入或传入空则取默认值url作为key。 |
4789
4790**示例:**
4791
4792```ts
4793// xxx.ets
4794import { webview } from '@kit.ArkWeb';
4795
4796@Entry
4797@Component
4798struct WebComponent {
4799  controller: webview.WebviewController = new webview.WebviewController();
4800
4801  build() {
4802    Column() {
4803      Web({ src: "https://www.example.com/", controller: this.controller })
4804        .onAppear(() => {
4805          // 预获取时,需要將"https://www.example1.com/post?e=f&g=h"替换成真实要访问的网站地址。
4806          webview.WebviewController.prefetchResource(
4807            {
4808              url: "https://www.example1.com/post?e=f&g=h",
4809              method: "POST",
4810              formData: "a=x&b=y",
4811            },
4812            [{
4813              headerKey: "c",
4814              headerValue: "z",
4815            },],
4816            "KeyX", 500);
4817        })
4818        .onPageEnd(() => {
4819          // 清除后续不再使用的预获取缓存。
4820          webview.WebviewController.clearPrefetchedResource(["KeyX",]);
4821        })
4822    }
4823  }
4824}
4825```
4826
4827## prepareForPageLoad<sup>10+</sup>
4828
4829static prepareForPageLoad(url: string, preconnectable: boolean, numSockets: number): void
4830
4831预连接url,在加载url之前调用此API,对url只进行DNS解析,socket建链操作,并不获取主资源子资源。
4832
4833**系统能力:**  SystemCapability.Web.Webview.Core
4834
4835**参数:**
4836
4837| 参数名          | 类型    |  必填  | 说明                                            |
4838| ---------------| ------- | ---- | ------------- |
4839| url            | string  | 是   | 预连接的url。|
4840| preconnectable | boolean | 是   | 是否进行预连接。如果preconnectable为true,则对url进行DNS解析,socket建链预连接;如果preconnectable为false,则不做任何预连接操作。|
4841| numSockets     | number  | 是   | 要预连接的socket数。socket数目连接需要大于0,最多允许6个连接。|
4842
4843**错误码:**
4844
4845以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
4846
4847| 错误码ID  | 错误信息                                                      |
4848| -------- | ------------------------------------------------------------ |
4849| 17100002 | URL error. The webpage corresponding to the URL is invalid, or the URL length exceeds 2048.                                                 |
4850| 17100013 | The number of preconnect sockets is invalid.                                                 |
4851
4852**示例:**
4853
4854```ts
4855// xxx.ets
4856import { webview } from '@kit.ArkWeb';
4857import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
4858
4859export default class EntryAbility extends UIAbility {
4860  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
4861    console.info("EntryAbility onCreate");
4862    webview.WebviewController.initializeWebEngine();
4863    // 预连接时,需要將'https://www.example.com'替换成一个真实的网站地址。
4864    webview.WebviewController.prepareForPageLoad("https://www.example.com", true, 2);
4865    AppStorage.setOrCreate("abilityWant", want);
4866    console.info("EntryAbility onCreate done");
4867  }
4868}
4869```
4870
4871## setCustomUserAgent<sup>10+</sup>
4872
4873setCustomUserAgent(userAgent: string): void
4874
4875设置自定义用户代理,会覆盖系统的用户代理。
4876
4877当Web组件src设置了url时,建议在onControllerAttached回调事件中设置User-Agent,设置方式请参考示例。不建议将User-Agent设置在onLoadIntercept回调事件中,会概率性出现设置失败。
4878
4879当Web组件src设置为空字符串时,建议先调用setCustomUserAgent方法设置User-Agent,再通过loadUrl加载具体页面。
4880
4881默认User-Agent定义与使用场景请参考[User-Agent开发指导](../../web/web-default-userAgent.md)
4882
4883> **说明:**
4884>
4885>当Web组件src设置了url,且未在onControllerAttached回调事件中设置User-Agent。再调用setCustomUserAgent方法时,可能会出现加载的页面与实际设置User-Agent不符的异常现象。
4886
4887**系统能力:**  SystemCapability.Web.Webview.Core
4888
4889**参数:**
4890
4891| 参数名          | 类型    |  必填  | 说明                                            |
4892| ---------------| ------- | ---- | ------------- |
4893| userAgent      | string  | 是   | 用户自定义代理信息。建议先使用[getUserAgent](#getuseragent)获取当前默认用户代理,在此基础上追加自定义用户代理信息。 |
4894
4895**错误码:**
4896
4897以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
4898
4899| 错误码ID  | 错误信息                                                      |
4900| -------- | ------------------------------------------------------------ |
4901| 17100001 | Init error. The WebviewController must be associated with a Web component. |
4902| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. |
4903
4904**示例:**
4905
4906```ts
4907// xxx.ets
4908import { webview } from '@kit.ArkWeb';
4909import { BusinessError } from '@kit.BasicServicesKit';
4910
4911@Entry
4912@Component
4913struct WebComponent {
4914  controller: webview.WebviewController = new webview.WebviewController();
4915  @State customUserAgent: string = ' DemoApp';
4916
4917  build() {
4918    Column() {
4919      Web({ src: 'www.example.com', controller: this.controller })
4920      .onControllerAttached(() => {
4921        console.info("onControllerAttached");
4922        try {
4923          let userAgent = this.controller.getUserAgent() + this.customUserAgent;
4924          this.controller.setCustomUserAgent(userAgent);
4925        } catch (error) {
4926          console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
4927        }
4928      })
4929    }
4930  }
4931}
4932```
4933
4934## setDownloadDelegate<sup>11+</sup>
4935
4936setDownloadDelegate(delegate: WebDownloadDelegate): void
4937
4938为当前的Web组件设置一个WebDownloadDelegate,该delegate用来接收页面内触发的下载与下载的进展。
4939
4940**系统能力:**  SystemCapability.Web.Webview.Core
4941
4942**参数:**
4943
4944| 参数名          | 类型    |  必填  | 说明                                            |
4945| ---------------| ------- | ---- | ------------- |
4946| delegate      | [WebDownloadDelegate](./arkts-apis-webview-WebDownloadDelegate.md)  | 是   | 用来接收下载进回调的委托。 |
4947
4948**错误码:**
4949
4950以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
4951
4952| 错误码ID  | 错误信息                                                      |
4953| -------- | ------------------------------------------------------------ |
4954| 17100001 | Init error. The WebviewController must be associated with a Web component. |
4955
4956**示例:**
4957
4958```ts
4959// xxx.ets
4960import { webview } from '@kit.ArkWeb';
4961import { BusinessError } from '@kit.BasicServicesKit';
4962
4963@Entry
4964@Component
4965struct WebComponent {
4966  controller: webview.WebviewController = new webview.WebviewController();
4967  delegate: webview.WebDownloadDelegate = new webview.WebDownloadDelegate();
4968
4969  build() {
4970    Column() {
4971      Button('setDownloadDelegate')
4972        .onClick(() => {
4973          try {
4974            this.controller.setDownloadDelegate(this.delegate);
4975          } catch (error) {
4976            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
4977          }
4978        })
4979      Web({ src: 'www.example.com', controller: this.controller })
4980    }
4981  }
4982}
4983```
4984
4985## startDownload<sup>11+</sup>
4986
4987startDownload(url: string): void
4988
4989使用Web组件的下载能力来下载指定的url, 比如下载网页中指定的图片。
4990
4991**系统能力:**  SystemCapability.Web.Webview.Core
4992
4993**参数:**
4994
4995| 参数名          | 类型    |  必填  | 说明                                            |
4996| ---------------| ------- | ---- | ------------- |
4997| url      | string  | 是   | 下载地址。 |
4998
4999**错误码:**
5000
5001以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
5002
5003| 错误码ID  | 错误信息                                                      |
5004| -------- | ------------------------------------------------------------ |
5005| 17100001 | Init error. The WebviewController must be associated with a Web component. |
5006| 17100002 | URL error. The webpage corresponding to the URL is invalid, or the URL length exceeds 2048. |
5007
5008**示例:**
5009
5010```ts
5011// xxx.ets
5012import { webview } from '@kit.ArkWeb';
5013import { BusinessError } from '@kit.BasicServicesKit';
5014
5015@Entry
5016@Component
5017struct WebComponent {
5018  controller: webview.WebviewController = new webview.WebviewController();
5019  delegate: webview.WebDownloadDelegate = new webview.WebDownloadDelegate();
5020
5021  build() {
5022    Column() {
5023      Button('setDownloadDelegate')
5024        .onClick(() => {
5025          try {
5026            this.controller.setDownloadDelegate(this.delegate);
5027          } catch (error) {
5028            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
5029          }
5030        })
5031      Button('startDownload')
5032        .onClick(() => {
5033          try {
5034            this.controller.startDownload('https://www.example.com');
5035          } catch (error) {
5036            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
5037          }
5038        })
5039      Web({ src: 'www.example.com', controller: this.controller })
5040    }
5041  }
5042}
5043```
5044
5045## getCustomUserAgent<sup>10+</sup>
5046
5047getCustomUserAgent(): string
5048
5049获取自定义用户代理。
5050
5051默认User-Agent定义与使用场景请参考[User-Agent开发指导](../../web/web-default-userAgent.md)
5052
5053**系统能力:**  SystemCapability.Web.Webview.Core
5054
5055**返回值:**
5056
5057| 类型   | 说明                      |
5058| ------ | ------------------------- |
5059| string | 用户自定义代理信息。 |
5060
5061**错误码:**
5062
5063以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
5064
5065| 错误码ID  | 错误信息                                                      |
5066| -------- | ------------------------------------------------------------ |
5067| 17100001 | Init error. The WebviewController must be associated with a Web component. |
5068
5069**示例:**
5070
5071```ts
5072// xxx.ets
5073import { webview } from '@kit.ArkWeb';
5074import { BusinessError } from '@kit.BasicServicesKit';
5075
5076@Entry
5077@Component
5078struct WebComponent {
5079  controller: webview.WebviewController = new webview.WebviewController();
5080  @State userAgent: string = '';
5081
5082  build() {
5083    Column() {
5084      Button('getCustomUserAgent')
5085        .onClick(() => {
5086          try {
5087            this.userAgent = this.controller.getCustomUserAgent();
5088            console.info("userAgent: " + this.userAgent);
5089          } catch (error) {
5090            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
5091          }
5092        })
5093      Web({ src: 'www.example.com', controller: this.controller })
5094    }
5095  }
5096}
5097```
5098
5099## setAppCustomUserAgent<sup>20+</sup>
5100
5101static setAppCustomUserAgent(userAgent: string): void
5102
5103设置应用级自定义用户代理,会覆盖系统的用户代理,应用内所有Web组件生效。
5104
5105当需要设置应用级自定义用户代理时,建议在Web组件创建前调用setAppCustomUserAgent方法设置User-Agent,再创建指定src的Web组件或通过[loadUrl](#loadurl)加载具体页面。
5106
5107默认User-Agent定义与使用场景,及相关User-Agent接口定义优先级请参考[User-Agent开发指导](../../web/web-default-userAgent.md)。
5108
5109**系统能力:**  SystemCapability.Web.Webview.Core
5110
5111**参数:**
5112
5113| 参数名          | 类型    |  必填  | 说明 |
5114| ---------------| ------- | ---- | ------------- |
5115| userAgent      | string  | 是   | 用户自定义代理信息。建议先使用[getDefaultUserAgent](#getdefaultuseragent14)获取当前默认用户代理,在此基础上追加自定义用户代理信息。 |
5116
5117**示例:**
5118
5119```ts
5120// xxx.ets
5121import { webview } from '@kit.ArkWeb';
5122import { BusinessError } from '@kit.BasicServicesKit';
5123
5124@Entry
5125@Component
5126struct WebComponent {
5127  controller: webview.WebviewController = new webview.WebviewController();
5128
5129  aboutToAppear(): void {
5130    try {
5131      webview.WebviewController.initializeWebEngine();
5132      let defaultUserAgent = webview.WebviewController.getDefaultUserAgent();
5133      let appUA = defaultUserAgent + " appUA";
5134      webview.WebviewController.setAppCustomUserAgent(appUA);
5135    } catch (error) {
5136      console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
5137    }
5138  }
5139
5140  build() {
5141    Column() {
5142      Web({ src: 'www.example.com', controller: this.controller })
5143    }
5144  }
5145}
5146```
5147
5148## setUserAgentForHosts<sup>20+</sup>
5149
5150static setUserAgentForHosts(userAgent: string, hosts: Array\<string>): void
5151
5152针对特定网站设置自定义用户代理,会覆盖系统的用户代理,应用内所有Web组件生效。
5153
5154当需要对特定网站设置自定义用户代理时,建议在Web组件创建前调用setUserAgentForHosts方法设置User-Agent,再创建指定src的Web组件或通过[loadUrl](#loadurl)加载具体页面。
5155
5156默认User-Agent定义与使用场景,及相关User-Agent接口定义优先级请参考[User-Agent开发指导](../../web/web-default-userAgent.md)。
5157
5158**系统能力:**  SystemCapability.Web.Webview.Core
5159
5160**参数:**
5161
5162| 参数名          | 类型    |  必填  | 说明 |
5163| ---------------| ------- | ---- | ------------- |
5164| userAgent      | string  | 是   | 用户自定义代理信息。建议先使用[getDefaultUserAgent](#getdefaultuseragent14)获取当前默认用户代理,在此基础上追加自定义用户代理信息。 |
5165| hosts      | Array\<string>  | 是   | 用户自定义代理的相关域名列表,每次调用时仅保留最新传入的列表,并限制最大条目数为两万,超出部分自动截断。 |
5166
5167**错误码:**
5168
5169以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
5170
5171| 错误码ID | 错误信息                                                     |
5172| -------- | ------------------------------------------------------------ |
5173| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3. Parameter verification failed. |
5174
5175**示例:**
5176
5177```ts
5178// xxx.ets
5179import { webview } from '@kit.ArkWeb';
5180import { BusinessError } from '@kit.BasicServicesKit';
5181
5182@Entry
5183@Component
5184struct WebComponent {
5185  controller: webview.WebviewController = new webview.WebviewController();
5186
5187  aboutToAppear(): void {
5188    try {
5189      webview.WebviewController.initializeWebEngine();
5190      let defaultUserAgent = webview.WebviewController.getDefaultUserAgent();
5191      let appUA = defaultUserAgent + " appUA";
5192      webview.WebviewController.setUserAgentForHosts(
5193        appUA,
5194        [
5195          "www.example.com",
5196          "www.baidu.com"
5197        ]
5198      );
5199    } catch (error) {
5200      console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
5201    }
5202  }
5203
5204  build() {
5205    Column() {
5206      Web({ src: 'www.example.com', controller: this.controller })
5207    }
5208  }
5209}
5210```
5211
5212## setConnectionTimeout<sup>11+</sup>
5213
5214static setConnectionTimeout(timeout: number): void
5215
5216设置网络连接超时时间,使用者可通过Web组件中的onErrorReceive方法获取超时错误码。
5217
5218**系统能力:** SystemCapability.Web.Webview.Core
5219
5220**参数:**
5221
5222| 参数名          | 类型    |  必填  | 说明                                            |
5223| ---------------| ------- | ---- | ------------- |
5224| timeout        | number  | 是   | socket连接超时时间,以秒为单位,必须为大于0的整数。 |
5225
5226**错误码:**
5227
5228以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
5229
5230| 错误码ID | 错误信息                                                     |
5231| -------- | ------------------------------------------------------------ |
5232| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3. Parameter verification failed. |
5233
5234**示例:**
5235
5236```ts
5237// xxx.ets
5238import { webview } from '@kit.ArkWeb';
5239import { BusinessError } from '@kit.BasicServicesKit';
5240
5241@Entry
5242@Component
5243struct WebComponent {
5244  controller: webview.WebviewController = new webview.WebviewController();
5245
5246  build() {
5247    Column() {
5248      Button('setConnectionTimeout')
5249        .onClick(() => {
5250          try {
5251            webview.WebviewController.setConnectionTimeout(5);
5252            console.info("setConnectionTimeout: 5s");
5253          } catch (error) {
5254            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
5255          }
5256        })
5257      Web({ src: 'www.example.com', controller: this.controller })
5258        .onErrorReceive((event) => {
5259          if (event) {
5260            console.info('getErrorInfo:' + event.error.getErrorInfo());
5261            console.info('getErrorCode:' + event.error.getErrorCode());
5262          }
5263        })
5264    }
5265  }
5266}
5267```
5268
5269## warmupServiceWorker<sup>12+</sup>
5270
5271static warmupServiceWorker(url: string): void
5272
5273预热ServiceWorker,以提升首屏页面的加载速度(仅限于会使用ServiceWorker的页面)。在加载url之前调用此API。
5274
5275**系统能力:**  SystemCapability.Web.Webview.Core
5276
5277**参数:**
5278
5279| 参数名          | 类型    |  必填  | 说明                                            |
5280| ---------------| ------- | ---- | ------------- |
5281| url            | string  | 是   | 需要预热ServiceWorker的url。|
5282
5283**错误码:**
5284
5285以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
5286
5287| 错误码ID  | 错误信息                                                      |
5288| -------- | ------------------------------------------------------------ |
5289| 17100002 | URL error. The webpage corresponding to the URL is invalid, or the URL length exceeds 2048.              |
5290
5291**示例:**
5292
5293```ts
5294// xxx.ts
5295import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
5296import { hilog } from '@kit.PerformanceAnalysisKit';
5297import { window } from '@kit.ArkUI';
5298import { webview } from '@kit.ArkWeb';
5299
5300export default class EntryAbility extends UIAbility {
5301    onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
5302        console.info("EntryAbility onCreate");
5303        webview.WebviewController.initializeWebEngine();
5304        webview.WebviewController.warmupServiceWorker("https://www.example.com");
5305        AppStorage.setOrCreate("abilityWant", want);
5306    }
5307}
5308```
5309
5310## enableSafeBrowsing<sup>11+</sup>
5311
5312enableSafeBrowsing(enable: boolean): void
5313
5314启用检查网站安全风险的功能,非法和欺诈网站是强制启用的,不能通过此功能禁用。
5315本功能默认不生效,OpenHarmony只提供恶意网址拦截页WebUI,网址风险检测以及显示WebUI的功能由Vendor实现。推荐在WebContentsObserver中监听跳转[DidStartNavigation](https://gitcode.com/openharmony-tpc/chromium_src/blob/master/content/public/browser/web_contents_observer.h#:~:text=virtual%20void-,DidStartNavigation)、[DidRedirectNavigation](https://gitcode.com/openharmony-tpc/chromium_src/blob/master/content/public/browser/web_contents_observer.h#:~:text=virtual%20void-,DidRedirectNavigation)进行检测。
5316
5317> **说明:**
5318>
5319> 该接口不生效,调用不会产生任何实际效果。
5320
5321**系统能力:** SystemCapability.Web.Webview.Core
5322
5323**参数:**
5324
5325| 参数名   | 类型    |  必填  | 说明                       |
5326| --------| ------- | ---- | ---------------------------|
5327|  enable | boolean | 是   | 是否启用检查网站安全风险的功能。<br>true表示启用检查网站安全风险的功能,false表示不启用检查网站安全风险的功能。<br>默认值:false。 |
5328
5329**错误码:**
5330
5331以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
5332
5333| 错误码ID | 错误信息                  |
5334| -------- | ----------------------- |
5335| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. |
5336
5337**示例:**
5338
5339```ts
5340// xxx.ets
5341import { webview } from '@kit.ArkWeb';
5342import { BusinessError } from '@kit.BasicServicesKit';
5343
5344@Entry
5345@Component
5346struct WebComponent {
5347  controller: webview.WebviewController = new webview.WebviewController();
5348
5349  build() {
5350    Column() {
5351      Button('enableSafeBrowsing')
5352        .onClick(() => {
5353          try {
5354            this.controller.enableSafeBrowsing(true);
5355            console.info("enableSafeBrowsing: true");
5356          } catch (error) {
5357            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
5358          }
5359        })
5360      Web({ src: 'www.example.com', controller: this.controller })
5361    }
5362  }
5363}
5364```
5365
5366## isSafeBrowsingEnabled<sup>11+</sup>
5367
5368isSafeBrowsingEnabled(): boolean
5369
5370获取当前网页是否启用了检查网站安全风险。
5371
5372**系统能力:** SystemCapability.Web.Webview.Core
5373
5374**返回值:**
5375
5376| 类型    | 说明                                     |
5377| ------- | --------------------------------------- |
5378| boolean | 当前网页是否启用了检查网站安全风险的功能。<br>true表示启用了检查网站安全风险的功能,false表示未启用检查网站安全风险的功能。<br>默认值:false。 |
5379
5380**示例:**
5381
5382```ts
5383// xxx.ets
5384import { webview } from '@kit.ArkWeb';
5385
5386@Entry
5387@Component
5388struct WebComponent {
5389  controller: webview.WebviewController = new webview.WebviewController();
5390
5391  build() {
5392    Column() {
5393      Button('isSafeBrowsingEnabled')
5394        .onClick(() => {
5395          let result = this.controller.isSafeBrowsingEnabled();
5396          console.info("result: " + result);
5397        })
5398      Web({ src: 'www.example.com', controller: this.controller })
5399    }
5400  }
5401}
5402```
5403
5404## enableIntelligentTrackingPrevention<sup>12+</sup>
5405
5406enableIntelligentTrackingPrevention(enable: boolean): void
5407
5408启用智能防跟踪功能。
5409
5410**系统能力:** SystemCapability.Web.Webview.Core
5411
5412**设备行为差异:** 该接口在Phone、Tablet、PC/2in1中可正常使用。从API version 18开始,在其他设备类型中返回801错误码。
5413
5414**参数:**
5415
5416| 参数名   | 类型    |  必填  | 说明                       |
5417| --------| ------- | ---- | ---------------------------|
5418|  enable | boolean | 是   | 是否启用智能防跟踪功能。<br>true表示启用智能防跟踪功能,false表示不启用智能防跟踪功能。<br>默认值:false。 |
5419
5420**错误码:**
5421
5422以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
5423
5424| 错误码ID | 错误信息                  |
5425| -------- | ----------------------- |
5426| 17100001 | Init error. The WebviewController must be associated with a Web component. |
5427|  401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. |
5428|  801 | Capability not supported. |
5429
5430**示例:**
5431
5432```ts
5433// xxx.ets
5434import { webview } from '@kit.ArkWeb';
5435import { BusinessError } from '@kit.BasicServicesKit';
5436
5437@Entry
5438@Component
5439struct WebComponent {
5440  controller: webview.WebviewController = new webview.WebviewController();
5441
5442  build() {
5443    Column() {
5444      Button('enableIntelligentTrackingPrevention')
5445        .onClick(() => {
5446          try {
5447            this.controller.enableIntelligentTrackingPrevention(true);
5448            console.info("enableIntelligentTrackingPrevention: true");
5449          } catch (error) {
5450            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
5451          }
5452        })
5453      Web({ src: 'www.example.com', controller: this.controller })
5454    }
5455  }
5456}
5457```
5458
5459## isIntelligentTrackingPreventionEnabled<sup>12+</sup>
5460
5461isIntelligentTrackingPreventionEnabled(): boolean
5462
5463获取当前Web是否启用了智能防跟踪功能。
5464
5465**系统能力:** SystemCapability.Web.Webview.Core
5466
5467**设备行为差异:** 该接口在Phone、Tablet、PC/2in1中可正常使用。从API version 18开始,在其他设备类型中返回801错误码。
5468
5469**返回值:**
5470
5471| 类型    | 说明                                     |
5472| ------- | --------------------------------------- |
5473| boolean | 当前Web是否启用了智能防跟踪功能。<br>true表示启用了智能防跟踪功能,false表示未启用智能防跟踪功能。<br>默认值:false。 |
5474
5475**错误码:**
5476
5477以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
5478
5479| 错误码ID | 错误信息                  |
5480| -------- | ----------------------- |
5481| 17100001 | Init error. The WebviewController must be associated with a Web component. |
5482|  801 | Capability not supported. |
5483
5484**示例:**
5485
5486```ts
5487// xxx.ets
5488import { webview } from '@kit.ArkWeb';
5489import { BusinessError } from '@kit.BasicServicesKit';
5490
5491@Entry
5492@Component
5493struct WebComponent {
5494  controller: webview.WebviewController = new webview.WebviewController();
5495
5496  build() {
5497    Column() {
5498      Button('isIntelligentTrackingPreventionEnabled')
5499        .onClick(() => {
5500          try {
5501            let result = this.controller.isIntelligentTrackingPreventionEnabled();
5502            console.info("result: " + result);
5503          } catch (error) {
5504            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
5505          }
5506        })
5507      Web({ src: 'www.example.com', controller: this.controller })
5508    }
5509  }
5510}
5511```
5512
5513## addIntelligentTrackingPreventionBypassingList<sup>12+</sup>
5514
5515static addIntelligentTrackingPreventionBypassingList(hostList: Array\<string>): void
5516
5517添加智能防跟踪功能绕过的域名列表。
5518
5519**系统能力:** SystemCapability.Web.Webview.Core
5520
5521**设备行为差异:** 该接口在Phone、Tablet、PC/2in1中可正常使用。从API version 18开始,在其他设备类型中返回801错误码。
5522
5523**参数:**
5524
5525| 参数名       | 类型           | 必填  | 说明                      |
5526| ----------- | ------------- | ---- | ------------------------ |
5527| hostList    | Array\<string> | 是   | 绕过智能防跟踪功能的域名列表。 |
5528
5529**错误码:**
5530
5531以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
5532
5533| 错误码ID  | 错误信息                  |
5534| -------- | ------------------------ |
5535|  401     | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. |
5536|  801     | Capability not supported. |
5537
5538**示例:**
5539
5540```ts
5541// xxx.ets
5542import { webview } from '@kit.ArkWeb';
5543import { BusinessError } from '@kit.BasicServicesKit';
5544
5545@Entry
5546@Component
5547struct WebComponent {
5548  controller: webview.WebviewController = new webview.WebviewController();
5549
5550  build() {
5551    Column() {
5552      Button('addIntelligentTrackingPreventionBypassingList')
5553        .onClick(() => {
5554          try {
5555            let hostList = ["www.test1.com", "www.test2.com", "www.test3.com"];
5556            webview.WebviewController.addIntelligentTrackingPreventionBypassingList(hostList);
5557          } catch (error) {
5558            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
5559          }
5560        })
5561      Web({ src: 'www.example.com', controller: this.controller })
5562    }
5563  }
5564}
5565```
5566
5567## removeIntelligentTrackingPreventionBypassingList<sup>12+</sup>
5568
5569static removeIntelligentTrackingPreventionBypassingList(hostList: Array\<string>): void
5570
5571删除通过addIntelligentTrackingPreventionBypassingList接口添加的部分域名列表。
5572
5573**系统能力:** SystemCapability.Web.Webview.Core
5574
5575**设备行为差异:** 该接口在Phone、Tablet、PC/2in1中可正常使用。从API version 18开始,在其他设备类型中返回801错误码。
5576
5577**参数:**
5578
5579| 参数名       | 类型           | 必填  | 说明                      |
5580| ----------- | ------------- | ---- | ------------------------ |
5581| hostList    | Array\<string> | 是   | 绕过智能防跟踪功能的域名列表。 |
5582
5583**错误码:**
5584
5585以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
5586
5587| 错误码ID  | 错误信息                  |
5588| -------- | ------------------------ |
5589|  401     | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. |
5590|  801     | Capability not supported. |
5591
5592**示例:**
5593
5594```ts
5595// xxx.ets
5596import { webview } from '@kit.ArkWeb';
5597import { BusinessError } from '@kit.BasicServicesKit';
5598
5599@Entry
5600@Component
5601struct WebComponent {
5602  controller: webview.WebviewController = new webview.WebviewController();
5603
5604  build() {
5605    Column() {
5606      Button('removeIntelligentTrackingPreventionBypassingList')
5607        .onClick(() => {
5608          try {
5609            let hostList = ["www.test1.com", "www.test2.com"];
5610            webview.WebviewController.removeIntelligentTrackingPreventionBypassingList(hostList);
5611          } catch (error) {
5612            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
5613          }
5614        })
5615      Web({ src: 'www.example.com', controller: this.controller })
5616    }
5617  }
5618}
5619```
5620
5621## clearIntelligentTrackingPreventionBypassingList<sup>12+</sup>
5622
5623static clearIntelligentTrackingPreventionBypassingList(): void
5624
5625删除通过addIntelligentTrackingPreventionBypassingList接口添加的所有域名。
5626
5627**系统能力:** SystemCapability.Web.Webview.Core
5628
5629**设备行为差异:** 该接口在Phone、Tablet、PC/2in1中可正常使用。从API version 18开始,在其他设备类型中返回801错误码。
5630
5631**错误码:**
5632
5633以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
5634
5635| 错误码ID  | 错误信息                  |
5636| -------- | ------------------------ |
5637|  801     | Capability not supported. |
5638
5639**示例:**
5640
5641```ts
5642// xxx.ets
5643import { webview } from '@kit.ArkWeb';
5644
5645@Entry
5646@Component
5647struct WebComponent {
5648  controller: webview.WebviewController = new webview.WebviewController();
5649
5650  build() {
5651    Column() {
5652      Button('clearIntelligentTrackingPreventionBypassingList')
5653        .onClick(() => {
5654          webview.WebviewController.clearIntelligentTrackingPreventionBypassingList();
5655      })
5656      Web({ src: 'www.example.com', controller: this.controller })
5657    }
5658  }
5659}
5660```
5661
5662## getDefaultUserAgent<sup>14+</sup>
5663
5664static getDefaultUserAgent(): string
5665
5666获取默认用户代理。
5667
5668此接口只允许在UI线程调用。
5669
5670默认User-Agent定义与使用场景请参考[User-Agent开发指导](../../web/web-default-userAgent.md)
5671
5672**系统能力:** SystemCapability.Web.Webview.Core
5673
5674**返回值:**
5675
5676| 类型     | 说明           |
5677| ------ | ------------ |
5678| string | ArkWeb默认User-Agent字符串。 |
5679
5680**示例:**
5681
5682```ts
5683// xxx.ets
5684import { webview } from '@kit.ArkWeb';
5685import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
5686
5687export default class EntryAbility extends UIAbility {
5688  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
5689    console.info("EntryAbility onCreate");
5690    webview.WebviewController.initializeWebEngine();
5691    let defaultUserAgent = webview.WebviewController.getDefaultUserAgent();
5692    console.info("defaultUserAgent: " + defaultUserAgent);
5693  }
5694}
5695```
5696
5697## enableAdsBlock<sup>12+</sup>
5698
5699enableAdsBlock(enable: boolean): void
5700
5701启用广告过滤功能。
5702
5703**系统能力:** SystemCapability.Web.Webview.Core
5704
5705**参数:**
5706
5707| 参数名   | 类型    |  必填  | 说明                       |
5708| --------| ------- | ---- | ---------------------------|
5709|  enable | boolean | 是   | 是否启用广告过滤功能。<br>true表示启用广告过滤功能,false表示取消广告过滤功能。<br>默认值:false。 |
5710
5711**错误码:**
5712
5713> **说明:**
5714>
5715> 从API version 18开始,在不支持广告过滤功能的设备上调用该API会抛出801异常。
5716
5717以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
5718
5719| 错误码ID | 错误信息                  |
5720| -------- | ----------------------- |
5721| 17100001 | Init error. The WebviewController must be associated with a Web component. |
5722|  401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Parameter string is too long. 3.Parameter verification failed. |
5723|  801 | Capability not supported. |
5724
5725**示例:**
5726
5727```ts
5728// xxx.ets
5729import { webview } from '@kit.ArkWeb';
5730import { BusinessError } from '@kit.BasicServicesKit';
5731
5732@Entry
5733@Component
5734struct WebComponent {
5735  controller: webview.WebviewController = new webview.WebviewController();
5736
5737  build() {
5738    Column() {
5739      Button('enableAdsBlock')
5740        .onClick(() => {
5741          try {
5742            this.controller.enableAdsBlock(true);
5743            console.info("enableAdsBlock: true")
5744          } catch (error) {
5745            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
5746          }
5747        })
5748      Web({ src: 'www.example.com', controller: this.controller })
5749    }
5750  }
5751}
5752```
5753
5754## isAdsBlockEnabled<sup>12+</sup>
5755
5756isAdsBlockEnabled() : boolean
5757
5758查询广告过滤功能是否开启。
5759
5760**系统能力:** SystemCapability.Web.Webview.Core
5761
5762**返回值:**
5763
5764| 类型                                                         | 说明                   |
5765| ------------------------------------------------------------ | ---------------------- |
5766| boolean | 返回true代表广告过滤功能已开启,返回false代表广告过滤功能关闭。<br>默认值:false。 |
5767
5768**错误码:**
5769
5770> **说明:**
5771>
5772> 从API version 18开始,在不支持广告过滤功能的设备上调用该API会抛出801异常。
5773
5774以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
5775
5776| 错误码ID | 错误信息                  |
5777| -------- | ----------------------- |
5778|  801 | Capability not supported. |
5779
5780**示例:**
5781
5782```ts
5783// xxx.ets
5784import { webview } from '@kit.ArkWeb';
5785import { BusinessError } from '@kit.BasicServicesKit';
5786
5787@Entry
5788@Component
5789struct WebComponent {
5790  controller: webview.WebviewController = new webview.WebviewController();
5791
5792  build() {
5793    Column() {
5794      Button('isAdsBlockEnabled')
5795        .onClick(() => {
5796          try {
5797            let isAdsBlockEnabled: boolean = this.controller.isAdsBlockEnabled();
5798            console.info("isAdsBlockEnabled:", isAdsBlockEnabled);
5799          } catch (error) {
5800            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
5801          }
5802        })
5803      Web({ src: 'www.example.com', controller: this.controller })
5804    }
5805  }
5806}
5807```
5808
5809## isAdsBlockEnabledForCurPage<sup>12+</sup>
5810
5811isAdsBlockEnabledForCurPage() : boolean
5812
5813查询当前网页是否开启广告过滤功能。
5814当Web组件使能广告过滤功能后,默认所有页面都是开启广告过滤的,支持通过[addAdsBlockDisallowedList](./arkts-apis-webview-AdsBlockManager.md#addadsblockdisallowedlist12)指定域名禁用广告过滤。
5815
5816**系统能力:** SystemCapability.Web.Webview.Core
5817
5818**返回值:**
5819
5820| 类型                                                         | 说明                   |
5821| ------------------------------------------------------------ | ---------------------- |
5822| boolean | 返回true代表此网页已开启广告过滤,返回false代表当前网页已关闭广告过滤。 |
5823
5824**错误码:**
5825
5826> **说明:**
5827>
5828> 从API version 18开始,在不支持广告过滤功能的设备上调用该API会抛出801异常。
5829
5830以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
5831
5832| 错误码ID | 错误信息                  |
5833| -------- | ----------------------- |
5834|  801 | Capability not supported. |
5835
5836**示例:**
5837
5838```ts
5839// xxx.ets
5840import { webview } from '@kit.ArkWeb';
5841import { BusinessError } from '@kit.BasicServicesKit';
5842
5843@Entry
5844@Component
5845struct WebComponent {
5846  controller: webview.WebviewController = new webview.WebviewController();
5847
5848  build() {
5849    Column() {
5850      Button('isAdsBlockEnabledForCurPage')
5851        .onClick(() => {
5852          try {
5853            let isAdsBlockEnabledForCurPage: boolean = this.controller.isAdsBlockEnabledForCurPage();
5854            console.info("isAdsBlockEnabledForCurPage:", isAdsBlockEnabledForCurPage);
5855          } catch (error) {
5856            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
5857          }
5858        })
5859      Web({ src: 'www.example.com', controller: this.controller })
5860    }
5861  }
5862}
5863```
5864
5865## setRenderProcessMode<sup>12+</sup>
5866
5867static setRenderProcessMode(mode: RenderProcessMode): void
5868
5869设置ArkWeb渲染子进程模式。
5870
5871**系统能力:** SystemCapability.Web.Webview.Core
5872
5873**参数:**
5874
5875| 参数名       | 类型           | 必填  | 说明                      |
5876| ----------- | ------------- | ---- | ------------------------ |
5877| mode        | [RenderProcessMode](./arkts-apis-webview-e.md#renderprocessmode12)| 是   | 渲染子进程模式。<br>可以先调用[getRenderProcessMode()](#getrenderprocessmode12)查看当前设备的ArkWeb渲染子进程模式,枚举值0为单子进程模式,枚举值1为多子进程模式。<br>手机默认为单渲染子进程模式,平板和PC/2in1默认为多渲染子进程模式。<br>如果传入RenderProcessMode枚举值之外的非法数字,则默认识别为多渲染子进程模式。 |
5878
5879**错误码:**
5880
5881以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
5882
5883| 错误码ID  | 错误信息                  |
5884| -------- | ------------------------ |
5885|  401     | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. |
5886
5887**示例:**
5888
5889```ts
5890// xxx.ets
5891import { webview } from '@kit.ArkWeb';
5892import { BusinessError } from '@kit.BasicServicesKit';
5893
5894@Entry
5895@Component
5896struct WebComponent {
5897  controller: webview.WebviewController = new webview.WebviewController();
5898
5899  build() {
5900    Column() {
5901      Button('setRenderProcessMode')
5902        .onClick(() => {
5903          try {
5904            webview.WebviewController.setRenderProcessMode(webview.RenderProcessMode.MULTIPLE);
5905          } catch (error) {
5906            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
5907          }
5908        })
5909      Web({ src: 'www.example.com', controller: this.controller })
5910    }
5911  }
5912}
5913```
5914## getRenderProcessMode<sup>12+</sup>
5915
5916static getRenderProcessMode(): RenderProcessMode
5917
5918查询ArkWeb的渲染子进程模式。
5919
5920**系统能力:** SystemCapability.Web.Webview.Core
5921
5922**返回值:**
5923
5924| 类型                                      | 说明                                                         |
5925| ----------------------------------------- | ------------------------------------------------------------ |
5926| [RenderProcessMode](./arkts-apis-webview-e.md#renderprocessmode12) | 渲染子进程模式类型。<br>调用getRenderProcessMode()获取当前设备的ArkWeb渲染子进程模式,枚举值0为单子进程模式,枚举值1为多子进程模式。<br>如果获取的值不在RenderProcessMode枚举值范围内,则默认为多渲染子进程模式。 |
5927
5928
5929**示例:**
5930
5931```ts
5932// xxx.ets
5933import { webview } from '@kit.ArkWeb';
5934
5935@Entry
5936@Component
5937struct WebComponent {
5938  controller: webview.WebviewController = new webview.WebviewController();
5939
5940  build() {
5941    Column() {
5942      Button('getRenderProcessMode')
5943        .onClick(() => {
5944          let mode = webview.WebviewController.getRenderProcessMode();
5945          console.info("getRenderProcessMode: " + mode);
5946        })
5947      Web({ src: 'www.example.com', controller: this.controller })
5948    }
5949  }
5950}
5951```
5952
5953## terminateRenderProcess<sup>12+</sup>
5954
5955terminateRenderProcess(): boolean
5956
5957销毁渲染进程。
5958
5959调用该接口将会主动销毁相关联的渲染进程。如果渲染进程尚未启动,或者已销毁则没有任何影响。此外销毁渲染进程会同时影响所有与该渲染进程关联的其他实例。
5960
5961**系统能力:** SystemCapability.Web.Webview.Core
5962
5963**返回值:**
5964
5965| 类型                                                         | 说明                   |
5966| ------------------------------------------------------------ | ---------------------- |
5967| boolean | 返回销毁渲染进程的结果。<br>返回true表示渲染进程可以被销毁或已被销毁,返回false表示渲染进程不可以被销毁。|
5968
5969**错误码:**
5970
5971以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
5972
5973| 错误码ID  | 错误信息                                                      |
5974| -------- | ------------------------------------------------------------ |
5975| 17100001 | Init error. The WebviewController must be associated with a Web component. |
5976
5977**示例:**
5978
5979```ts
5980// xxx.ets
5981import { webview } from '@kit.ArkWeb';
5982
5983@Entry
5984@Component
5985struct WebComponent {
5986  controller: webview.WebviewController = new webview.WebviewController();
5987
5988  build() {
5989    Column() {
5990      Button('terminateRenderProcess')
5991        .onClick(() => {
5992          let result = this.controller.terminateRenderProcess();
5993          console.info("terminateRenderProcess result: " + result);
5994        })
5995      Web({ src: 'www.example.com', controller: this.controller })
5996    }
5997  }
5998}
5999```
6000
6001## postUrl<sup>11+</sup>
6002
6003postUrl(url: string, postData: ArrayBuffer): void
6004
6005使用"POST"方法加载带有postData的url。如果url不是网络url,则会使用[loadUrl](#loadurl)方法加载url,忽略postData参数。
6006
6007**系统能力:** SystemCapability.Web.Webview.Core
6008
6009**参数:**
6010
6011| 参数名  | 类型             | 必填 | 说明                  |
6012| ------- | ---------------- | ---- | :-------------------- |
6013| url     | string | 是   | 需要加载的 URL。      |
6014| postData | ArrayBuffer | 是   | 使用"POST"方法传递数据。 该请求必须采用"application/x-www-form-urlencoded"编码。|
6015
6016**错误码:**
6017
6018以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
6019
6020| 错误码ID | 错误信息                                                     |
6021| -------- | ------------------------------------------------------------ |
6022| 17100001 | Init error. The WebviewController must be associated with a Web component. |
6023| 17100002 | URL error. The webpage corresponding to the URL is invalid, or the URL length exceeds 2048.  |
6024| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. |
6025
6026**示例:**
6027
6028```ts
6029// xxx.ets
6030import { webview } from '@kit.ArkWeb';
6031import { BusinessError } from '@kit.BasicServicesKit';
6032
6033class TestObj {
6034  constructor() {
6035  }
6036
6037  test(str: string): ArrayBuffer {
6038    let buf = new ArrayBuffer(str.length);
6039    let buff = new Uint8Array(buf);
6040
6041    for (let i = 0; i < str.length; i++) {
6042      buff[i] = str.charCodeAt(i);
6043    }
6044    return buf;
6045  }
6046}
6047
6048@Entry
6049@Component
6050struct WebComponent {
6051  controller: webview.WebviewController = new webview.WebviewController();
6052  @State testObjtest: TestObj = new TestObj();
6053
6054  build() {
6055    Column() {
6056      Button('postUrl')
6057        .onClick(() => {
6058          try {
6059            // 数据转化为ArrayBuffer类型。
6060            let postData = this.testObjtest.test("Name=test&Password=test");
6061            this.controller.postUrl('www.example.com', postData);
6062          } catch (error) {
6063            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
6064          }
6065        })
6066      Web({ src: '', controller: this.controller })
6067    }
6068  }
6069}
6070```
6071
6072## createWebPrintDocumentAdapter<sup>11+</sup>
6073
6074createWebPrintDocumentAdapter(jobName: string): print.PrintDocumentAdapter
6075
6076创建web相关打印功能。
6077
6078**系统能力:** SystemCapability.Web.Webview.Core
6079
6080**参数:**
6081
6082| 参数名  | 类型    | 必填 | 说明                  |
6083| ------- | ------ | ---- | :-------------------- |
6084| jobName | string | 是   | 需要打印的文件名。      |
6085
6086**返回值:**
6087
6088| 类型                 | 说明                      |
6089| -------------------- | ------------------------- |
6090| print.[PrintDocumentAdapter](../apis-basic-services-kit/js-apis-print.md#printdocumentadapter11) | 返回打印文档的适配器。 |
6091
6092**错误码:**
6093
6094以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
6095
6096| 错误码ID | 错误信息                                                                    |
6097| -------- | -------------------------------------------------------------------------- |
6098| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. |
6099| 17100001 | Init error. The WebviewController must be associated with a Web component. |
6100
6101**示例:**
6102
6103```ts
6104// xxx.ets
6105import { webview } from '@kit.ArkWeb';
6106import { BusinessError, print } from '@kit.BasicServicesKit';
6107
6108@Entry
6109@Component
6110struct WebComponent {
6111  controller: webview.WebviewController = new webview.WebviewController();
6112
6113  build() {
6114    Column() {
6115      Button('createWebPrintDocumentAdapter')
6116        .onClick(() => {
6117          try {
6118            let webPrintDocadapter = this.controller.createWebPrintDocumentAdapter('example.pdf');
6119            print.print('example_jobid', webPrintDocadapter, null, this.getUIContext().getHostContext());
6120          } catch (error) {
6121            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
6122          }
6123        })
6124      Web({ src: 'www.example.com', controller: this.controller })
6125    }
6126  }
6127}
6128```
6129## isIncognitoMode<sup>11+</sup>
6130
6131isIncognitoMode(): boolean
6132
6133查询当前是否是隐私模式的Webview。
6134
6135**系统能力:** SystemCapability.Web.Webview.Core
6136
6137**返回值:**
6138
6139| 类型                 | 说明                      |
6140| -------------------- | ------------------------- |
6141| boolean              | 返回是否是隐私模式的Webview。<br>true表示是隐私模式,false表示不是隐私模式。<br>默认为false。 |
6142
6143**错误码:**
6144
6145以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
6146
6147| 错误码ID | 错误信息                                                                    |
6148| -------- | -------------------------------------------------------------------------- |
6149| 17100001 | Init error. The WebviewController must be associated with a Web component. |
6150
6151**示例:**
6152
6153```ts
6154// xxx.ets
6155import { webview } from '@kit.ArkWeb';
6156import { BusinessError } from '@kit.BasicServicesKit';
6157
6158@Entry
6159@Component
6160struct WebComponent {
6161  controller: webview.WebviewController = new webview.WebviewController();
6162
6163  build() {
6164    Column() {
6165      Button('isIncognitoMode')
6166        .onClick(() => {
6167          try {
6168            let result = this.controller.isIncognitoMode();
6169            console.info('isIncognitoMode' + result);
6170          } catch (error) {
6171            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
6172          }
6173        })
6174      Web({ src: 'www.example.com', controller: this.controller })
6175    }
6176  }
6177}
6178```
6179
6180## getSecurityLevel<sup>11+</sup>
6181
6182getSecurityLevel(): SecurityLevel
6183
6184获取当前网页的安全级别。
6185
6186**系统能力:** SystemCapability.Web.Webview.Core
6187
6188**返回值:**
6189
6190| 类型                                | 说明                        |
6191| ----------------------------------- | --------------------------- |
6192| [SecurityLevel](./arkts-apis-webview-e.md#securitylevel11) | 当前网页的安全级别,具体值为NONE、SECURE、WARNING、DANGEROUS。 |
6193
6194**错误码:**
6195
6196以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
6197
6198| 错误码ID | 错误信息                                                     |
6199| -------- | ------------------------------------------------------------ |
6200| 17100001 | Init error. The WebviewController must be associated with a Web component. |
6201
6202**示例:**
6203
6204```ts
6205import { webview } from '@kit.ArkWeb';
6206
6207@Entry
6208@Component
6209struct WebComponent {
6210  controller: webview.WebviewController = new webview.WebviewController();
6211
6212  build() {
6213    Column() {
6214      Web({ src: 'www.example.com', controller: this.controller })
6215        .onPageEnd((event) => {
6216          if (event) {
6217            let securityLevel = this.controller.getSecurityLevel();
6218            console.info('securityLevel: ', securityLevel);
6219          }
6220        })
6221    }
6222  }
6223}
6224```
6225
6226## setScrollable<sup>12+</sup>
6227
6228setScrollable(enable: boolean, type?: ScrollType): void
6229
6230设置网页是否允许滚动。
6231
6232**系统能力:** SystemCapability.Web.Webview.Core
6233
6234**参数:**
6235
6236| 参数名 | 类型 | 必填 | 说明               |
6237| ------ | -------- | ---- | ---------------------- |
6238| enable     | boolean   | 是   | 表示是否将网页设置为允许滚动。<br>true表示设置为允许滚动,false表示禁止滚动。<br>默认值:true。 |
6239| type       | [ScrollType](./arkts-apis-webview-e.md#scrolltype12) |  否 | 网页可触发的滚动类型,支持缺省配置。<br/> - enable为false时,表示禁止ScrollType类型的滚动,当ScrollType缺省时表示禁止所有类型网页滚动。<br/> - enable为true时,ScrollType缺省与否,都表示允许所有类型的网页滚动。|
6240
6241**错误码:**
6242
6243以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
6244
6245| 错误码ID | 错误信息                                                     |
6246| -------- | ------------------------------------------------------------ |
6247| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3. Parameter verification failed. |
6248| 17100001 | Init error. The WebviewController must be associated with a Web component. |
6249
6250**示例:**
6251
6252```ts
6253// xxx.ets
6254import { webview } from '@kit.ArkWeb';
6255import { BusinessError } from '@kit.BasicServicesKit';
6256
6257@Entry
6258@Component
6259struct WebComponent {
6260  controller: webview.WebviewController = new webview.WebviewController();
6261
6262  build() {
6263    Column() {
6264      Button('setScrollable')
6265        .onClick(() => {
6266          try {
6267            this.controller.setScrollable(true);
6268          } catch (error) {
6269            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
6270          }
6271        })
6272      Web({ src: 'www.example.com', controller: this.controller })
6273    }
6274  }
6275}
6276```
6277
6278## getScrollable<sup>12+</sup>
6279
6280getScrollable(): boolean
6281
6282获取当前网页是否允许滚动。
6283
6284**系统能力:** SystemCapability.Web.Webview.Core
6285
6286**返回值:**
6287
6288| 类型   | 说明           |
6289| ------ | -------------- |
6290| boolean | 当前网页是否允许滚动。<br>true为允许滚动,false为禁止滚动。 |
6291
6292**错误码:**
6293
6294以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
6295
6296| 错误码ID | 错误信息                                                     |
6297| -------- | ------------------------------------------------------------ |
6298| 17100001 | Init error. The WebviewController must be associated with a Web component. |
6299
6300**示例:**
6301
6302```ts
6303// xxx.ets
6304import { webview } from '@kit.ArkWeb';
6305import { BusinessError } from '@kit.BasicServicesKit';
6306
6307@Entry
6308@Component
6309struct WebComponent {
6310  controller: webview.WebviewController = new webview.WebviewController();
6311
6312  build() {
6313    Column() {
6314      Button('getScrollable')
6315        .onClick(() => {
6316          try {
6317            let scrollEnabled = this.controller.getScrollable();
6318            console.info("scrollEnabled: " + scrollEnabled);
6319          } catch (error) {
6320            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
6321          }
6322        })
6323      Web({ src: 'www.example.com', controller: this.controller })
6324    }
6325  }
6326}
6327```
6328
6329## setPrintBackground<sup>12+</sup>
6330
6331setPrintBackground(enable: boolean): void
6332
6333设置是否打印网页背景。
6334
6335**系统能力:** SystemCapability.Web.Webview.Core
6336
6337**参数:**
6338
6339| 参数名   | 类型    | 必填 | 说明                      |
6340| -------- | ------- | ---- | -------------------------------------- |
6341| enable | boolean | 是   | 表示是否打印网页背景。<br>true表示设置为打印网页背景,false表示取消网页背景打印。 |
6342
6343**错误码:**
6344
6345以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
6346
6347| 错误码ID | 错误信息                                                     |
6348| -------- | ------------------------------------------------------------ |
6349| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. |
6350| 17100001 | Init error. The WebviewController must be associated with a Web component. |
6351
6352**示例:**
6353
6354```ts
6355import { webview } from '@kit.ArkWeb';
6356import { BusinessError } from '@kit.BasicServicesKit';
6357
6358@Entry
6359@Component
6360struct WebComponent {
6361  controller: webview.WebviewController = new webview.WebviewController();
6362
6363  build() {
6364    Column() {
6365      Button('setPrintBackground')
6366        .onClick(() => {
6367          try {
6368            this.controller.setPrintBackground(false);
6369          } catch (error) {
6370            console.error(`ErrorCode:${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`);
6371          }
6372        })
6373      Web({ src: 'www.example.com', controller: this.controller })
6374    }
6375  }
6376}
6377```
6378
6379## getPrintBackground<sup>12+</sup>
6380
6381getPrintBackground(): boolean
6382
6383查询webview是否打印网页背景。
6384
6385**系统能力:** SystemCapability.Web.Webview.Core
6386
6387**返回值:**
6388
6389| 类型                 | 说明                      |
6390| -------------------- | ------------------------- |
6391| boolean              | 返回Webview是否打印网页背景。<br>true:打印网页背景;false:不打印网页背景。 |
6392
6393**错误码:**
6394
6395以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
6396
6397| 错误码ID | 错误信息                                                     |
6398| -------- | ------------------------------------------------------------ |
6399| 17100001 | Init error. The WebviewController must be associated with a Web component. |
6400
6401**示例:**
6402
6403```ts
6404import { webview } from '@kit.ArkWeb';
6405import { BusinessError } from '@kit.BasicServicesKit';
6406
6407@Entry
6408@Component
6409struct WebComponent {
6410  controller: webview.WebviewController = new webview.WebviewController();
6411
6412  build() {
6413    Column() {
6414      Button('setPrintBackground')
6415        .onClick(() => {
6416          try {
6417            let enable = this.controller.getPrintBackground();
6418            console.info("getPrintBackground: " + enable);
6419          } catch (error) {
6420            console.error(`ErrorCode:${(error as BusinessError).code}, Message: ${(error as BusinessError).message}`);
6421          }
6422        })
6423      Web({ src: 'www.example.com', controller: this.controller })
6424    }
6425  }
6426}
6427```
6428
6429## getLastJavascriptProxyCallingFrameUrl<sup>12+</sup>
6430
6431getLastJavascriptProxyCallingFrameUrl(): string
6432
6433通过[registerJavaScriptProxy](#registerjavascriptproxy)或者[javaScriptProxy](./arkts-basic-components-web-attributes.md#javascriptproxy)注入JavaScript对象到window对象中。该接口可以获取最后一次调用注入的对象的frame的url。
6434
6435**系统能力:** SystemCapability.Web.Webview.Core
6436
6437**返回值:**
6438
6439| 类型     | 说明           |
6440| ------ | ------------ |
6441| string | 最后一次调用注入的对象的frame的url。 |
6442
6443**错误码:**
6444
6445以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
6446
6447| 错误码ID | 错误信息                                                     |
6448| -------- | ------------------------------------------------------------ |
6449| 17100001 | Init error. The WebviewController must be associated with a Web component. |
6450
6451**示例:**
6452
6453```ts
6454// xxx.ets
6455import { webview } from '@kit.ArkWeb';
6456import { BusinessError } from '@kit.BasicServicesKit';
6457
6458class TestObj {
6459  mycontroller: webview.WebviewController;
6460
6461  constructor(controller: webview.WebviewController) {
6462    this.mycontroller = controller;
6463  }
6464
6465  test(testStr: string): string {
6466    console.info('Web Component str' + testStr + " url " + this.mycontroller.getLastJavascriptProxyCallingFrameUrl());
6467    return testStr;
6468  }
6469
6470  toString(): void {
6471    console.info('Web Component toString ' + " url " + this.mycontroller.getLastJavascriptProxyCallingFrameUrl());
6472  }
6473
6474  testNumber(testNum: number): number {
6475    console.info('Web Component number' + testNum + " url " + this.mycontroller.getLastJavascriptProxyCallingFrameUrl());
6476    return testNum;
6477  }
6478
6479  testBool(testBol: boolean): boolean {
6480    console.info('Web Component boolean' + testBol + " url " + this.mycontroller.getLastJavascriptProxyCallingFrameUrl());
6481    return testBol;
6482  }
6483}
6484
6485class WebObj {
6486  mycontroller: webview.WebviewController;
6487
6488  constructor(controller: webview.WebviewController) {
6489    this.mycontroller = controller;
6490  }
6491
6492  webTest(): string {
6493    console.info('Web test ' + " url " + this.mycontroller.getLastJavascriptProxyCallingFrameUrl());
6494    return "Web test";
6495  }
6496
6497  webString(): void {
6498    console.info('Web test toString ' + " url " + this.mycontroller.getLastJavascriptProxyCallingFrameUrl());
6499  }
6500}
6501
6502@Entry
6503@Component
6504struct Index {
6505  controller: webview.WebviewController = new webview.WebviewController();
6506  @State testObjtest: TestObj = new TestObj(this.controller);
6507  @State webTestObj: WebObj = new WebObj(this.controller);
6508
6509  build() {
6510    Column() {
6511      Button('refresh')
6512        .onClick(() => {
6513          try {
6514            this.controller.refresh();
6515          } catch (error) {
6516            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
6517          }
6518        })
6519      Button('Register JavaScript To Window')
6520        .onClick(() => {
6521          try {
6522            this.controller.registerJavaScriptProxy(this.testObjtest, "objName", ["test", "toString", "testNumber", "testBool"]);
6523            this.controller.registerJavaScriptProxy(this.webTestObj, "objTestName", ["webTest", "webString"]);
6524          } catch (error) {
6525            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
6526          }
6527        })
6528      Button('deleteJavaScriptRegister')
6529        .onClick(() => {
6530          try {
6531            this.controller.deleteJavaScriptRegister("objName");
6532            this.controller.deleteJavaScriptRegister("objTestName");
6533          } catch (error) {
6534            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
6535          }
6536        })
6537      Web({ src: $rawfile('index.html'), controller: this.controller })
6538        .javaScriptAccess(true)
6539    }
6540  }
6541}
6542```
6543
6544加载的html文件。
6545```html
6546<!-- index.html -->
6547<!DOCTYPE html>
6548<html>
6549    <head>
6550      <meta charset="utf-8">
6551    </head>
6552    <body>
6553      <button type="button" onclick="htmlTest()">Click Me!</button>
6554      <p id="demo"></p>
6555      <p id="webDemo"></p>
6556      <script type="text/javascript">
6557        function htmlTest() {
6558          // This function call expects to return "ArkUI Web Component"
6559          let str=objName.test("webtest data");
6560          objName.testNumber(1);
6561          objName.testBool(true);
6562          document.getElementById("demo").innerHTML=str;
6563          console.info('objName.test result:'+ str)
6564
6565          // This function call expects to return "Web test"
6566          let webStr = objTestName.webTest();
6567          document.getElementById("webDemo").innerHTML=webStr;
6568          console.info('objTestName.webTest result:'+ webStr)
6569        }
6570      </script>
6571    </body>
6572</html>
6573```
6574
6575## pauseAllTimers<sup>12+</sup>
6576
6577static pauseAllTimers(): void
6578
6579暂停所有WebView的定时器。
6580
6581**系统能力:** SystemCapability.Web.Webview.Core
6582
6583**错误码:**
6584
6585以下错误码的详细介绍请参见[Webview错误码](errorcode-webview.md)。
6586
6587| 错误码ID | 错误信息                                                     |
6588| -------- | ------------------------------------------------------------ |
6589| 17100001 | Init error. The WebviewController must be associated with a Web component. |
6590
6591**示例:**
6592
6593```ts
6594import { webview } from '@kit.ArkWeb';
6595
6596@Entry
6597@Component
6598struct WebComponent {
6599  controller: webview.WebviewController = new webview.WebviewController();
6600
6601  build() {
6602    Column() {
6603      Row() {
6604        Button('PauseAllTimers')
6605          .onClick(() => {
6606            webview.WebviewController.pauseAllTimers();
6607          })
6608      }
6609      Web({ src: $rawfile("index.html"), controller: this.controller })
6610    }
6611  }
6612}
6613```
6614加载的html文件。
6615
6616```html
6617<!DOCTYPE html>
6618<html>
6619    <body>
6620        <button style="width:300px;height:150px;font-size:50px" onclick="startTimer()">start</button>
6621        <button style="width:300px;height:150px;font-size:50px" onclick="resetTimer()">reset</button>
6622        <input style="width:300px;height:150px;font-size:50px" value="0" id="show_num">
6623    </body>
6624</html>
6625<script>
6626    var timer = null;
6627    var num = 0;
6628
6629    function startTimer() {
6630        timer = setInterval(function() {
6631            document.getElementById("show_num").value = ++num;
6632        }, 1000);
6633    }
6634
6635    function resetTimer() {
6636        clearInterval(timer);
6637        document.getElementById("show_num").value = 0;
6638        num = 0;
6639    }
6640</script>
6641```
6642
6643## resumeAllTimers<sup>12+</sup>
6644
6645static resumeAllTimers(): void
6646
6647恢复从pauseAllTimers()接口中被暂停的所有的定时器。
6648
6649**系统能力:** SystemCapability.Web.Webview.Core
6650
6651**错误码:**
6652
6653以下错误码的详细介绍请参见[Webview错误码](errorcode-webview.md)。
6654
6655| 错误码ID | 错误信息                                                     |
6656| -------- | ------------------------------------------------------------ |
6657| 17100001 | Init error. The WebviewController must be associated with a Web component. |
6658
6659**示例:**
6660
6661```ts
6662import { webview } from '@kit.ArkWeb';
6663
6664@Entry
6665@Component
6666struct WebComponent {
6667  controller: webview.WebviewController = new webview.WebviewController();
6668
6669  build() {
6670    Column() {
6671      Row() {
6672        Button('ResumeAllTimers')
6673          .onClick(() => {
6674            webview.WebviewController.resumeAllTimers();
6675          })
6676        Button('PauseAllTimers')
6677          .onClick(() => {
6678            webview.WebviewController.pauseAllTimers();
6679          })
6680      }
6681      Web({ src: $rawfile("index.html"), controller: this.controller })
6682    }
6683  }
6684}
6685```
6686加载的html文件。
6687
6688```html
6689<!DOCTYPE html>
6690<html>
6691    <body>
6692        <button style="width:300px;height:150px;font-size:50px" onclick="startTimer()">start</button>
6693        <button style="width:300px;height:150px;font-size:50px" onclick="resetTimer()">reset</button>
6694        <input style="width:300px;height:150px;font-size:50px" value="0" id="show_num">
6695    </body>
6696</html>
6697<script>
6698    var timer = null;
6699    var num = 0;
6700
6701    function startTimer() {
6702        timer = setInterval(function() {
6703            document.getElementById("show_num").value = ++num;
6704        }, 1000);
6705    }
6706
6707    function resetTimer() {
6708        clearInterval(timer);
6709        document.getElementById("show_num").value = 0;
6710        num = 0;
6711    }
6712</script>
6713```
6714
6715## stopAllMedia<sup>12+</sup>
6716
6717stopAllMedia(): void
6718
6719控制网页所有音视频停止。
6720
6721**系统能力:** SystemCapability.Web.Webview.Core
6722
6723**错误码:**
6724
6725以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
6726
6727| 错误码ID | 错误信息                                                     |
6728| -------- | ------------------------------------------------------------ |
6729| 17100001 | Init error. The WebviewController must be associated with a Web component. |
6730
6731**示例:**
6732
6733```ts
6734// xxx.ets
6735import { webview } from '@kit.ArkWeb';
6736import { BusinessError } from '@kit.BasicServicesKit';
6737
6738@Entry
6739@Component
6740struct WebComponent {
6741  controller: webview.WebviewController = new webview.WebviewController();
6742
6743  build() {
6744    Column() {
6745      Button('stopAllMedia')
6746        .onClick(() => {
6747          try {
6748            this.controller.stopAllMedia();
6749          } catch (error) {
6750            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
6751          }
6752        })
6753      Web({ src: 'www.example.com', controller: this.controller })
6754    }
6755  }
6756}
6757```
6758
6759## pauseAllMedia<sup>12+</sup>
6760
6761pauseAllMedia(): void
6762
6763控制网页所有音视频暂停。
6764
6765**系统能力:** SystemCapability.Web.Webview.Core
6766
6767**错误码:**
6768
6769以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
6770
6771| 错误码ID | 错误信息                                                     |
6772| -------- | ------------------------------------------------------------ |
6773| 17100001 | Init error. The WebviewController must be associated with a Web component. |
6774
6775**示例:**
6776
6777```ts
6778// xxx.ets
6779import { webview } from '@kit.ArkWeb';
6780import { BusinessError } from '@kit.BasicServicesKit';
6781
6782@Entry
6783@Component
6784struct WebComponent {
6785  controller: webview.WebviewController = new webview.WebviewController();
6786
6787  build() {
6788    Column() {
6789      Button('pauseAllMedia')
6790        .onClick(() => {
6791          try {
6792            this.controller.pauseAllMedia();
6793          } catch (error) {
6794            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
6795          }
6796        })
6797      Web({ src: 'www.example.com', controller: this.controller })
6798    }
6799  }
6800}
6801```
6802
6803## resumeAllMedia<sup>12+</sup>
6804
6805resumeAllMedia(): void
6806
6807控制网页被pauseAllMedia接口暂停的音视频继续播放。
6808
6809**系统能力:** SystemCapability.Web.Webview.Core
6810
6811**错误码:**
6812
6813以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
6814
6815| 错误码ID | 错误信息                                                     |
6816| -------- | ------------------------------------------------------------ |
6817| 17100001 | Init error. The WebviewController must be associated with a Web component. |
6818
6819**示例:**
6820
6821```ts
6822// xxx.ets
6823import { webview } from '@kit.ArkWeb';
6824import { BusinessError } from '@kit.BasicServicesKit';
6825
6826@Entry
6827@Component
6828struct WebComponent {
6829  controller: webview.WebviewController = new webview.WebviewController();
6830
6831  build() {
6832    Column() {
6833      Button('resumeAllMedia')
6834        .onClick(() => {
6835          try {
6836            this.controller.resumeAllMedia();
6837          } catch (error) {
6838            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
6839          }
6840        })
6841      Web({ src: 'www.example.com', controller: this.controller })
6842    }
6843  }
6844}
6845```
6846
6847## closeAllMediaPresentations<sup>12+</sup>
6848
6849closeAllMediaPresentations(): void
6850
6851控制网页所有全屏视频关闭。
6852
6853**系统能力:** SystemCapability.Web.Webview.Core
6854
6855**错误码:**
6856
6857以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
6858
6859| 错误码ID | 错误信息                                                     |
6860| -------- | ------------------------------------------------------------ |
6861| 17100001 | Init error. The WebviewController must be associated with a Web component. |
6862
6863**示例:**
6864
6865```ts
6866// xxx.ets
6867import { webview } from '@kit.ArkWeb';
6868import { BusinessError } from '@kit.BasicServicesKit';
6869
6870@Entry
6871@Component
6872struct WebComponent {
6873  controller: webview.WebviewController = new webview.WebviewController();
6874
6875  build() {
6876    Column() {
6877      Button('closeAllMediaPresentations')
6878        .onClick(() => {
6879          try {
6880            this.controller.closeAllMediaPresentations();
6881          } catch (error) {
6882            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
6883          }
6884        })
6885      Web({ src: 'www.example.com', controller: this.controller })
6886    }
6887  }
6888}
6889```
6890
6891## getMediaPlaybackState<sup>12+</sup>
6892
6893getMediaPlaybackState(): MediaPlaybackState
6894
6895查询当前网页音视频播放状态。
6896
6897**系统能力:** SystemCapability.Web.Webview.Core
6898
6899**返回值:**
6900
6901| 类型                                        | 说明                                                      |
6902| ------------------------------------------- | --------------------------------------------------------- |
6903| [MediaPlaybackState](./arkts-apis-webview-e.md#mediaplaybackstate12) | 当前网页的播放状态,具体值为NONE、PLAYING、PAUSED、STOPPED。 |
6904
6905**错误码:**
6906
6907以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
6908
6909| 错误码ID | 错误信息                                                     |
6910| -------- | ------------------------------------------------------------ |
6911| 17100001 | Init error. The WebviewController must be associated with a Web component. |
6912
6913**示例:**
6914
6915```ts
6916// xxx.ets
6917import { webview } from '@kit.ArkWeb';
6918import { BusinessError } from '@kit.BasicServicesKit';
6919
6920@Entry
6921@Component
6922struct WebComponent {
6923  controller: webview.WebviewController = new webview.WebviewController();
6924
6925  build() {
6926    Column() {
6927      Button('getMediaPlaybackState')
6928        .onClick(() => {
6929          try {
6930            console.log("MediaPlaybackState : " + this.controller.getMediaPlaybackState());
6931          } catch (error) {
6932            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
6933          }
6934        })
6935      Web({ src: 'www.example.com', controller: this.controller })
6936    }
6937  }
6938}
6939```
6940
6941## setWebSchemeHandler<sup>12+</sup>
6942
6943setWebSchemeHandler(scheme: string, handler: WebSchemeHandler): void
6944
6945为当前Web组件设置[WebSchemeHandler](./arkts-apis-webview-WebSchemeHandler.md), [WebSchemeHandler](./arkts-apis-webview-WebSchemeHandler.md)类用于拦截指定scheme的请求。
6946
6947**系统能力:** SystemCapability.Web.Webview.Core
6948
6949**参数:**
6950
6951| 参数名 | 类型   | 必填 | 说明                      |
6952| ------ | ------ | ---- | :------------------------ |
6953| scheme    | string | 是   | 要拦截的协议。 |
6954| handler    | [WebSchemeHandler](./arkts-apis-webview-WebSchemeHandler.md) | 是   | 拦截此协议的拦截器。 |
6955
6956**错误码:**
6957
6958以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
6959
6960| 错误码ID | 错误信息                                                     |
6961| -------- | ------------------------------------------------------------ |
6962| 401      | Parameter error. Possible causes: 1. Incorrect parameter types.                                    |
6963| 17100001 | Init error. The WebviewController must be associated with a Web component. |
6964
6965**示例:**
6966
6967```ts
6968// xxx.ets
6969import { webview } from '@kit.ArkWeb';
6970import { BusinessError } from '@kit.BasicServicesKit';
6971
6972@Entry
6973@Component
6974struct WebComponent {
6975  controller: webview.WebviewController = new webview.WebviewController();
6976  schemeHandler: webview.WebSchemeHandler = new webview.WebSchemeHandler();
6977
6978  build() {
6979    Column() {
6980      Button('setWebSchemeHandler')
6981        .onClick(() => {
6982          try {
6983            this.controller.setWebSchemeHandler('http', this.schemeHandler);
6984          } catch (error) {
6985            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
6986          }
6987        })
6988      Web({ src: 'www.example.com', controller: this.controller })
6989    }
6990  }
6991}
6992```
6993
6994## clearWebSchemeHandler<sup>12+</sup>
6995
6996clearWebSchemeHandler(): void
6997
6998清除当前Web组件设置的所有WebSchemeHandler。
6999
7000**系统能力:** SystemCapability.Web.Webview.Core
7001
7002**错误码:**
7003
7004以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
7005
7006| 错误码ID | 错误信息                                                     |
7007| -------- | ------------------------------------------------------------ |
7008| 17100001 | Init error. The WebviewController must be associated with a Web component. |
7009
7010**示例:**
7011
7012```ts
7013// xxx.ets
7014import { webview } from '@kit.ArkWeb';
7015import { BusinessError } from '@kit.BasicServicesKit';
7016
7017@Entry
7018@Component
7019struct WebComponent {
7020  controller: webview.WebviewController = new webview.WebviewController();
7021
7022  build() {
7023    Column() {
7024      Button('clearWebSchemeHandler')
7025        .onClick(() => {
7026          try {
7027            this.controller.clearWebSchemeHandler();
7028          } catch (error) {
7029            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
7030          }
7031        })
7032      Web({ src: 'www.example.com', controller: this.controller })
7033    }
7034  }
7035}
7036```
7037
7038## setServiceWorkerWebSchemeHandler<sup>12+</sup>
7039
7040setServiceWorkerWebSchemeHandler(scheme: string, handler: WebSchemeHandler): void
7041
7042为当前应用的所有Web组件设置用于拦截ServiceWorker的WebSchemeHandler。
7043
7044**系统能力:** SystemCapability.Web.Webview.Core
7045
7046**参数:**
7047
7048| 参数名 | 类型   | 必填 | 说明                      |
7049| ------ | ------ | ---- | :------------------------ |
7050| scheme    | string | 是   | 要拦截的协议。 |
7051| handler    | [WebSchemeHandler](./arkts-apis-webview-WebSchemeHandler.md) | 是   | 拦截此协议的拦截器。 |
7052
7053**错误码:**
7054
7055以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
7056
7057| 错误码ID | 错误信息                                                     |
7058| -------- | ------------------------------------------------------------ |
7059| 401      | Parameter error. Possible causes: 1. Incorrect parameter types. |
7060
7061**示例:**
7062
7063```ts
7064// xxx.ets
7065import { webview } from '@kit.ArkWeb';
7066import { BusinessError } from '@kit.BasicServicesKit';
7067
7068@Entry
7069@Component
7070struct WebComponent {
7071  controller: webview.WebviewController = new webview.WebviewController();
7072  schemeHandler: webview.WebSchemeHandler = new webview.WebSchemeHandler();
7073
7074  build() {
7075    Column() {
7076      Button('setWebSchemeHandler')
7077        .onClick(() => {
7078          try {
7079            webview.WebviewController.setServiceWorkerWebSchemeHandler('http', this.schemeHandler);
7080          } catch (error) {
7081            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
7082          }
7083        })
7084      Web({ src: 'www.example.com', controller: this.controller })
7085    }
7086  }
7087}
7088```
7089
7090## clearServiceWorkerWebSchemeHandler<sup>12+</sup>
7091
7092clearServiceWorkerWebSchemeHandler(): void
7093
7094清除应用中设置的所有用于拦截ServiceWorker的WebSchemeHandler。
7095
7096**系统能力:** SystemCapability.Web.Webview.Core
7097
7098**示例:**
7099
7100```ts
7101// xxx.ets
7102import { webview } from '@kit.ArkWeb';
7103
7104@Entry
7105@Component
7106struct WebComponent {
7107  controller: webview.WebviewController = new webview.WebviewController();
7108
7109  build() {
7110    Column() {
7111      Button('clearServiceWorkerWebSchemeHandler')
7112        .onClick(() => {
7113          webview.WebviewController.clearServiceWorkerWebSchemeHandler();
7114        })
7115      Web({ src: 'www.example.com', controller: this.controller })
7116    }
7117  }
7118}
7119```
7120
7121## startCamera<sup>12+</sup>
7122
7123startCamera(): void
7124
7125开启当前网页摄像头捕获。使用摄像头功能前请在module.json5中添加权限: ohos.permission.CAMERA,具体权限的添加方法请参考[在配置文件中声明权限](../../security/AccessToken/declare-permissions.md#在配置文件中声明权限)。
7126
7127**系统能力:** SystemCapability.Web.Webview.Core
7128
7129**错误码:**
7130
7131以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
7132
7133| 错误码ID | 错误信息                                                     |
7134| -------- | ------------------------------------------------------------ |
7135| 17100001 | Init error. The WebviewController must be associated with a Web component. |
7136
7137**示例:**
7138```ts
7139// xxx.ets
7140import { webview } from '@kit.ArkWeb';
7141import { BusinessError } from '@kit.BasicServicesKit';
7142import { abilityAccessCtrl, PermissionRequestResult, common } from '@kit.AbilityKit';
7143
7144let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
7145
7146@Entry
7147@Component
7148struct WebComponent {
7149  controller: webview.WebviewController = new webview.WebviewController();
7150  uiContext: UIContext = this.getUIContext();
7151
7152  aboutToAppear(): void {
7153    let context: Context | undefined = this.uiContext.getHostContext() as common.UIAbilityContext;
7154    atManager.requestPermissionsFromUser(context, ['ohos.permission.CAMERA'], (err: BusinessError, data: PermissionRequestResult) => {
7155      console.info('data:' + JSON.stringify(data));
7156      console.info('data permissions:' + data.permissions);
7157      console.info('data authResults:' + data.authResults);
7158    })
7159  }
7160
7161  build() {
7162    Column() {
7163      Button("startCamera").onClick(() => {
7164        try {
7165          this.controller.startCamera();
7166        } catch (error) {
7167          console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
7168        }
7169      })
7170      Button("stopCamera").onClick(() => {
7171        try {
7172          this.controller.stopCamera();
7173        } catch (error) {
7174          console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
7175        }
7176      })
7177      Button("closeCamera").onClick(() => {
7178        try {
7179          this.controller.closeCamera();
7180        } catch (error) {
7181          console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
7182        }
7183      })
7184      Web({ src: $rawfile('index.html'), controller: this.controller })
7185        .onPermissionRequest((event) => {
7186          if (event) {
7187            this.uiContext.showAlertDialog({
7188              title: 'title',
7189              message: 'text',
7190              primaryButton: {
7191                value: 'deny',
7192                action: () => {
7193                  event.request.deny();
7194                }
7195              },
7196              secondaryButton: {
7197                value: 'onConfirm',
7198                action: () => {
7199                  event.request.grant(event.request.getAccessibleResource());
7200                }
7201              },
7202              cancel: () => {
7203                event.request.deny();
7204              }
7205            })
7206          }
7207        })
7208    }
7209  }
7210}
7211```
7212加载的html文件。
7213 ```html
7214<!-- index.html -->
7215<!DOCTYPE html>
7216<html>
7217  <head>
7218    <meta charset="UTF-8">
7219  </head>
7220  <body>
7221    <video id="video" width="400px" height="400px" autoplay>
7222    </video>
7223    <input type="button" title="HTML5摄像头" value="开启摄像头" onclick="getMedia()" />
7224    <script>
7225      function getMedia() {
7226        let constraints = {
7227          video: {
7228            width: 500,
7229            height: 500
7230          },
7231          audio: true
7232        }
7233        let video = document.getElementById("video");
7234        let promise = navigator.mediaDevices.getUserMedia(constraints);
7235        promise.then(function(mediaStream) {
7236          video.srcObject = mediaStream;
7237          video.play();
7238        })
7239      }
7240    </script>
7241  </body>
7242</html>
7243 ```
7244
7245## stopCamera<sup>12+</sup>
7246
7247stopCamera(): void
7248
7249停止当前网页摄像头捕获。
7250
7251**系统能力:** SystemCapability.Web.Webview.Core
7252
7253**错误码:**
7254
7255以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
7256
7257| 错误码ID | 错误信息                                                     |
7258| -------- | ------------------------------------------------------------ |
7259| 17100001 | Init error. The WebviewController must be associated with a Web component. |
7260
7261**示例:**
7262
7263完整示例代码参考[startCamera](#startcamera12)。
7264
7265## closeCamera<sup>12+</sup>
7266
7267closeCamera(): void
7268
7269关闭当前网页摄像头捕获。
7270
7271**系统能力:** SystemCapability.Web.Webview.Core
7272
7273**错误码:**
7274
7275以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
7276
7277| 错误码ID | 错误信息                                                     |
7278| -------- | ------------------------------------------------------------ |
7279| 17100001 | Init error. The WebviewController must be associated with a Web component. |
7280
7281**示例:**
7282
7283完整示例代码参考[startCamera](#startcamera12)。
7284
7285## precompileJavaScript<sup>12+</sup>
7286
7287precompileJavaScript(url: string, script: string | Uint8Array, cacheOptions: CacheOptions): Promise\<number\>
7288
7289预编译JavaScript生成字节码缓存或根据提供的参数更新已有的字节码缓存。
7290接口通过提供的文件信息、E-Tag响应头和Last-Modified响应头判断是否需要更新已有的字节码缓存。
7291
7292**系统能力:** SystemCapability.Web.Webview.Core
7293
7294**参数:**
7295
7296| 参数名  | 类型    | 必填 | 说明                  |
7297| ------- | ------ | ---- | :-------------------- |
7298| url | string | 是   | 本地JavaScript文件对应的网络地址,即业务网页请求该文件的服务器版本时使用的网络地址。网络地址仅支持http或https协议,长度不超过2048。如果该网络地址对应的缓存失效,则业务网页将通过网络请求对应的资源。      |
7299| script | string \| Uint8Array | 是   | 本地JavaScript的文本内容。内容不能为空。      |
7300| cacheOptions | [CacheOptions](./arkts-apis-webview-i.md#cacheoptions12) | 是   | 用于控制字节码缓存更新。      |
7301
7302**返回值:**
7303
7304| 类型                                | 说明                        |
7305| ----------------------------------- | --------------------------- |
7306| Promise\<number\> | 生成字节码缓存的错误码,0表示无错误,-1表示内部错误。 |
7307
7308**错误码:**
7309
7310以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
7311
7312| 错误码ID | 错误信息                                                     |
7313| -------- | ------------------------------------------------------------ |
7314| 401      | Invalid input parameter.Possible causes: 1. Mandatory parameters are left unspecified.2. Incorrect parameter types.3. Parameter verification failed.                                     |
7315| 17100001 | Init error. The WebviewController must be associated with a Web component. |
7316
7317**示例:**
7318
7319接口推荐配合动态组件使用,使用离线的Web组件用于生成字节码缓存,并在适当的时机加载业务用Web组件使用这些字节码缓存。下方是代码示例:
7320
73211. 首先,在EntryAbility中将UIContext存到localStorage中。
7322
7323   ```ts
7324   // EntryAbility.ets
7325   import { UIAbility } from '@kit.AbilityKit';
7326   import { window } from '@kit.ArkUI';
7327
7328   const localStorage: LocalStorage = new LocalStorage('uiContext');
7329
7330   export default class EntryAbility extends UIAbility {
7331     storage: LocalStorage = localStorage;
7332
7333     onWindowStageCreate(windowStage: window.WindowStage) {
7334       windowStage.loadContent('pages/Index', this.storage, (err, data) => {
7335         if (err.code) {
7336           return;
7337         }
7338
7339         this.storage.setOrCreate<UIContext>("uiContext", windowStage.getMainWindowSync().getUIContext());
7340       });
7341     }
7342   }
7343   ```
7344
73452. 编写动态组件所需基础代码。
7346
7347   ```ts
7348   // DynamicComponent.ets
7349   import { NodeController, BuilderNode, FrameNode, UIContext } from '@kit.ArkUI';
7350
7351   export interface BuilderData {
7352     url: string;
7353     controller: WebviewController;
7354     context: UIContext;
7355   }
7356
7357   let storage : LocalStorage | undefined = undefined;
7358
7359   export class NodeControllerImpl extends NodeController {
7360     private rootNode: BuilderNode<BuilderData[]> | null = null;
7361     private wrappedBuilder: WrappedBuilder<BuilderData[]> | null = null;
7362
7363     constructor(wrappedBuilder: WrappedBuilder<BuilderData[]>, context: UIContext) {
7364       storage = context.getSharedLocalStorage();
7365       super();
7366       this.wrappedBuilder = wrappedBuilder;
7367     }
7368
7369     makeNode(): FrameNode | null {
7370       if (this.rootNode != null) {
7371         return this.rootNode.getFrameNode();
7372       }
7373       return null;
7374     }
7375
7376     initWeb(url: string, controller: WebviewController) {
7377       if(this.rootNode != null) {
7378         return;
7379       }
7380
7381       const uiContext: UIContext = storage!.get<UIContext>("uiContext") as UIContext;
7382       if (!uiContext) {
7383         return;
7384       }
7385       this.rootNode = new BuilderNode(uiContext);
7386       this.rootNode.build(this.wrappedBuilder, { url: url, controller: controller });
7387     }
7388   }
7389
7390   export const createNode = (wrappedBuilder: WrappedBuilder<BuilderData[]>, data: BuilderData) => {
7391     const baseNode = new NodeControllerImpl(wrappedBuilder, data.context);
7392     baseNode.initWeb(data.url, data.controller);
7393     return baseNode;
7394   }
7395   ```
7396
73973. 编写用于生成字节码缓存的组件,本例中的本地Javascript资源内容通过文件读取接口读取rawfile目录下的本地文件。
7398
7399   <!--code_no_check-->
7400   ```ts
7401   // PrecompileWebview.ets
7402   import { BuilderData } from "./DynamicComponent";
7403   import { Config, configs } from "./PrecompileConfig";
7404
7405   @Builder
7406   function WebBuilder(data: BuilderData) {
7407     Web({ src: data.url, controller: data.controller })
7408       .onControllerAttached(() => {
7409         precompile(data.controller, configs, data.context);
7410       })
7411       .fileAccess(true)
7412   }
7413
7414   export const precompileWebview = wrapBuilder<BuilderData[]>(WebBuilder);
7415
7416   export const precompile = async (controller: WebviewController, configs: Array<Config>, context: UIContext) => {
7417     for (const config of configs) {
7418       let content = await readRawFile(config.localPath, context);
7419
7420       try {
7421         controller.precompileJavaScript(config.url, content, config.options)
7422           .then(errCode => {
7423             console.error("precompile successfully! " + errCode);
7424           }).catch((errCode: number) => {
7425             console.error("precompile failed. " + errCode);
7426         });
7427       } catch (err) {
7428         console.error("precompile failed. " + err.code + " " + err.message);
7429       }
7430     }
7431   }
7432
7433   async function readRawFile(path: string, context: UIContext) {
7434     try {
7435       return await context.getHostContext()!.resourceManager.getRawFileContent(path);
7436     } catch (err) {
7437       return new Uint8Array(0);
7438     }
7439   }
7440   ```
7441
7442JavaScript资源的获取方式也可通过[网络请求](../apis-network-kit/js-apis-http.md)的方式获取,但此方法获取到的http响应头非标准HTTP响应头格式,需额外将响应头转换成标准HTTP响应头格式后使用。如通过网络请求获取到的响应头是e-tag,则需要将其转换成E-Tag后使用。
7443
74444. 编写业务用组件代码。
7445
7446   <!--code_no_check-->
7447   ```ts
7448   // BusinessWebview.ets
7449   import { BuilderData } from "./DynamicComponent";
7450
7451   @Builder
7452   function WebBuilder(data: BuilderData) {
7453     // 此处组件可根据业务需要自行扩展
7454     Web({ src: data.url, controller: data.controller })
7455       .cacheMode(CacheMode.Default)
7456   }
7457
7458   export const businessWebview = wrapBuilder<BuilderData[]>(WebBuilder);
7459   ```
7460
74615. 编写资源配置信息。
7462
7463   ```ts
7464   // PrecompileConfig.ets
7465   import { webview } from '@kit.ArkWeb'
7466
7467   export interface Config {
7468     url:  string,
7469     localPath: string, // 本地资源路径
7470     options: webview.CacheOptions
7471   }
7472
7473   export let configs: Array<Config> = [
7474     {
7475       url: "https://www.example.com/example.js",
7476       localPath: "example.js",
7477       options: {
7478         responseHeaders: [
7479           { headerKey: "E-Tag", headerValue: "aWO42N9P9dG/5xqYQCxsx+vDOoU="},
7480           { headerKey: "Last-Modified", headerValue: "Wed, 21 Mar 2024 10:38:41 GMT"}
7481         ]
7482       }
7483     }
7484   ]
7485   ```
7486
74876. 在页面中使用。
7488
7489   <!--code_no_check-->
7490   ```ts
7491   // Index.ets
7492   import { webview } from '@kit.ArkWeb';
7493   import { NodeController } from '@kit.ArkUI';
7494   import { createNode } from "./DynamicComponent"
7495   import { precompileWebview } from "./PrecompileWebview"
7496   import { businessWebview } from "./BusinessWebview"
7497
7498   @Entry
7499   @Component
7500   struct Index {
7501     @State precompileNode: NodeController | undefined = undefined;
7502     precompileController: webview.WebviewController = new webview.WebviewController();
7503
7504     @State businessNode: NodeController | undefined = undefined;
7505     businessController: webview.WebviewController = new webview.WebviewController();
7506
7507     aboutToAppear(): void {
7508       // 初始化用于注入本地资源的Web组件
7509       this.precompileNode = createNode(precompileWebview,
7510         { url: "https://www.example.com/empty.html", controller: this.precompileController, context: this.getUIContext()});
7511     }
7512
7513     build() {
7514       Column() {
7515         // 在适当的时机加载业务用Web组件,本例以Button点击触发为例
7516         Button("加载页面")
7517           .onClick(() => {
7518             this.businessNode = createNode(businessWebview, {
7519               url:  "https://www.example.com/business.html",
7520               controller: this.businessController,
7521               context: this.getUIContext()
7522             });
7523           })
7524         // 用于业务的Web组件
7525         NodeContainer(this.businessNode);
7526       }
7527     }
7528   }
7529   ```
7530
7531当需要更新本地已经生成的编译字节码时,修改cacheOptions参数中responseHeaders中的E-Tag或Last-Modified响应头对应的值,再次调用接口即可。
7532
7533## onCreateNativeMediaPlayer<sup>12+</sup>
7534
7535onCreateNativeMediaPlayer(callback: CreateNativeMediaPlayerCallback): void
7536
7537注册回调函数,开启[应用接管网页媒体播放功能](./arkts-basic-components-web-attributes.md#enablenativemediaplayer12)后,当网页中有播放媒体时,触发注册的回调函数。
7538如果应用接管网页媒体播放功能未开启,则注册的回调函数不会被触发。
7539
7540**系统能力:** SystemCapability.Web.Webview.Core
7541
7542**参数:**
7543
7544| 参数名 | 类型 | 必填 | 说明 |
7545|--------|------|------|------|
7546| callback | [CreateNativeMediaPlayerCallback](./arkts-apis-webview-t.md#createnativemediaplayercallback12) | 是 | 接管网页媒体播放的回调函数。 |
7547
7548**示例:**
7549
7550```ts
7551// xxx.ets
7552import { webview } from '@kit.ArkWeb';
7553
7554class ActualNativeMediaPlayerListener {
7555  handler: webview.NativeMediaPlayerHandler;
7556
7557  constructor(handler: webview.NativeMediaPlayerHandler) {
7558    this.handler = handler;
7559  }
7560
7561  onPlaying() {
7562    // 本地播放器开始播放。
7563    this.handler.handleStatusChanged(webview.PlaybackStatus.PLAYING);
7564  }
7565  onPaused() {
7566    // 本地播放器暂停播放。
7567    this.handler.handleStatusChanged(webview.PlaybackStatus.PAUSED);
7568  }
7569  onSeeking() {
7570    // 本地播放器开始执行跳转到目标时间点。
7571    this.handler.handleSeeking();
7572  }
7573  onSeekDone() {
7574    // 本地播放器 seek 完成。
7575    this.handler.handleSeekFinished();
7576  }
7577  onEnded() {
7578    // 本地播放器播放完成。
7579    this.handler.handleEnded();
7580  }
7581  onVolumeChanged() {
7582    // 获取本地播放器的音量。
7583    let volume: number = getVolume();
7584    this.handler.handleVolumeChanged(volume);
7585  }
7586  onCurrentPlayingTimeUpdate() {
7587    // 更新播放时间。
7588    let currentTime: number = getCurrentPlayingTime();
7589    // 将时间单位换算成秒。
7590    let currentTimeInSeconds = convertToSeconds(currentTime);
7591    this.handler.handleTimeUpdate(currentTimeInSeconds);
7592  }
7593  onBufferedChanged() {
7594    // 缓存发生了变化。
7595    // 获取本地播放器的缓存时长。
7596    let bufferedEndTime: number = getCurrentBufferedTime();
7597    // 将时间单位换算成秒。
7598    let bufferedEndTimeInSeconds = convertToSeconds(bufferedEndTime);
7599    this.handler.handleBufferedEndTimeChanged(bufferedEndTimeInSeconds);
7600
7601    // 检查缓存状态。
7602    // 如果缓存状态发生了变化,则向 ArkWeb 内核通知缓存状态。
7603    let lastReadyState: webview.ReadyState = getLastReadyState();
7604    let currentReadyState:  webview.ReadyState = getCurrentReadyState();
7605    if (lastReadyState != currentReadyState) {
7606      this.handler.handleReadyStateChanged(currentReadyState);
7607    }
7608  }
7609  onEnterFullscreen() {
7610    // 本地播放器进入了全屏状态。
7611    let isFullscreen: boolean = true;
7612    this.handler.handleFullscreenChanged(isFullscreen);
7613  }
7614  onExitFullscreen() {
7615    // 本地播放器退出了全屏状态。
7616    let isFullscreen: boolean = false;
7617    this.handler.handleFullscreenChanged(isFullscreen);
7618  }
7619  onUpdateVideoSize(width: number, height: number) {
7620    // 当本地播放器解析出视频宽高时, 通知 ArkWeb 内核。
7621    this.handler.handleVideoSizeChanged(width, height);
7622  }
7623  onDurationChanged(duration: number) {
7624    // 本地播放器解析到了新的媒体时长, 通知 ArkWeb 内核。
7625    this.handler.handleDurationChanged(duration);
7626  }
7627  onError(error: webview.MediaError, errorMessage: string) {
7628    // 本地播放器出错了,通知 ArkWeb 内核。
7629    this.handler.handleError(error, errorMessage);
7630  }
7631  onNetworkStateChanged(state: webview.NetworkState) {
7632    // 本地播放器的网络状态发生了变化, 通知 ArkWeb 内核。
7633    this.handler.handleNetworkStateChanged(state);
7634  }
7635  onPlaybackRateChanged(playbackRate: number) {
7636    // 本地播放器的播放速率发生了变化, 通知 ArkWeb 内核。
7637    this.handler.handlePlaybackRateChanged(playbackRate);
7638  }
7639  onMutedChanged(muted: boolean) {
7640    // 本地播放器的静音状态发生了变化, 通知 ArkWeb 内核。
7641    this.handler.handleMutedChanged(muted);
7642  }
7643
7644  // ... 监听本地播放器其他的状态 ...
7645}
7646
7647class NativeMediaPlayerImpl implements webview.NativeMediaPlayerBridge {
7648  constructor(handler: webview.NativeMediaPlayerHandler, mediaInfo: webview.MediaInfo) {
7649    // 1. 创建一个本地播放器的状态监听。
7650    let listener: ActualNativeMediaPlayerListener = new ActualNativeMediaPlayerListener(handler);
7651    // 2. 创建一个本地播放器。
7652    // 3. 监听该本地播放器。
7653    // ...
7654  }
7655
7656  updateRect(x: number, y: number, width: number, height: number) {
7657    // <video> 标签的位置和大小发生了变化。
7658    // 根据该信息变化,作出相应的改变。
7659  }
7660
7661  play() {
7662    // 启动本地播放器播放。
7663  }
7664
7665  pause() {
7666    // 暂停本地播放器播放。
7667  }
7668
7669  seek(targetTime: number) {
7670    // 本地播放器跳转到指定的时间点。
7671  }
7672
7673  release() {
7674    // 销毁本地播放器。
7675  }
7676
7677  setVolume(volume: number) {
7678    // ArkWeb 内核要求调整本地播放器的音量。
7679    // 设置本地播放器的音量。
7680  }
7681
7682  setMuted(muted: boolean) {
7683    // 将本地播放器静音或取消静音。
7684  }
7685
7686  setPlaybackRate(playbackRate: number) {
7687    // 调整本地播放器的播放速度。
7688  }
7689
7690  enterFullscreen() {
7691    // 将本地播放器设置为全屏播放。
7692  }
7693
7694  exitFullscreen() {
7695    // 将本地播放器退出全屏播放。
7696  }
7697
7698  resumePlayer() {
7699    // 重新创建应用内播放器。
7700    // 恢复应用内播放器的状态信息。
7701  }
7702
7703  suspendPlayer(type: webview.SuspendType) {
7704    // 记录应用内播放器的状态信息。
7705    // 销毁应用内播放器。
7706  }
7707}
7708
7709@Entry
7710@Component
7711struct WebComponent {
7712  controller: webview.WebviewController = new webview.WebviewController()
7713  build() {
7714    Column() {
7715      Web({ src: 'www.example.com', controller: this.controller })
7716        .enableNativeMediaPlayer({enable: true, shouldOverlay: false})
7717        .onPageBegin((event) => {
7718          this.controller.onCreateNativeMediaPlayer((handler: webview.NativeMediaPlayerHandler, mediaInfo: webview.MediaInfo) => {
7719            if (!shouldHandle(mediaInfo)) {
7720              // 本地播放器不接管该媒体。
7721              // ArkWeb 内核将用自己的播放器来播放该媒体。
7722              return null;
7723            }
7724            let nativePlayer: webview.NativeMediaPlayerBridge = new NativeMediaPlayerImpl(handler, mediaInfo);
7725            return nativePlayer;
7726          });
7727        })
7728    }
7729  }
7730}
7731
7732// stub
7733function getVolume() {
7734  return 1;
7735}
7736function getCurrentPlayingTime() {
7737  return 1;
7738}
7739function getCurrentBufferedTime() {
7740  return 1;
7741}
7742function convertToSeconds(input: number) {
7743  return input;
7744}
7745function getLastReadyState() {
7746  return webview.ReadyState.HAVE_NOTHING;
7747}
7748function getCurrentReadyState() {
7749  return webview.ReadyState.HAVE_NOTHING;
7750}
7751function shouldHandle(mediaInfo: webview.MediaInfo) {
7752  return true;
7753}
7754```
7755
7756## enableWholeWebPageDrawing<sup>12+</sup>
7757
7758static enableWholeWebPageDrawing(): void
7759
7760设置开启网页全量绘制能力。仅在web初始化时设置。
7761
7762**系统能力:** SystemCapability.Web.Webview.Core
7763
7764**示例:**
7765
7766```ts
7767// xxx.ets
7768import { webview } from '@kit.ArkWeb';
7769import { BusinessError } from '@kit.BasicServicesKit';
7770
7771@Entry
7772@Component
7773struct WebComponent {
7774  controller: webview.WebviewController = new webview.WebviewController();
7775
7776  aboutToAppear(): void {
7777    try {
7778      webview.WebviewController.enableWholeWebPageDrawing();
7779    } catch (error) {
7780      console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
7781    }
7782  }
7783
7784  build() {
7785    Column() {
7786      Web({ src: 'www.example.com', controller: this.controller })
7787    }
7788  }
7789}
7790```
7791
7792## webPageSnapshot<sup>12+</sup>
7793
7794webPageSnapshot(info: SnapshotInfo, callback: AsyncCallback\<SnapshotResult>): void
7795
7796获取网页全量绘制结果。
7797
7798> **说明:**
7799>
7800> 仅支持对渲染进程上的资源进行截图:静态图片和文本。
7801>
7802> 如果页面有视频则截图时会显示该视频的占位图片,没有占位图片则显示空白。
7803
7804**系统能力:** SystemCapability.Web.Webview.Core
7805
7806**参数:**
7807
7808| 参数名       | 类型           | 必填  | 说明                      |
7809| ----------- | ------------- | ---- | ------------------------ |
7810| info        | [SnapshotInfo](./arkts-apis-webview-i.md#snapshotinfo12)| 是   | 全量绘制结果入参。 |
7811| callback        | AsyncCallback\<[SnapshotResult](./arkts-apis-webview-i.md#snapshotresult12)>| 是   | 全量绘制回调结果。 |
7812
7813**示例:**
7814
7815```ts
7816// xxx.ets
7817import { webview } from '@kit.ArkWeb';
7818import { BusinessError } from '@kit.BasicServicesKit';
7819
7820@Entry
7821@Component
7822struct WebComponent {
7823  controller: webview.WebviewController = new webview.WebviewController();
7824
7825  build() {
7826    Column() {
7827      Button('webPageSnapshot')
7828        .onClick(() => {
7829          try {
7830            this.controller.webPageSnapshot({ id: "1234", size: { width: 100, height: 100 } }, (error, result) => {
7831              if (error) {
7832                console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
7833                return;
7834              }
7835              if (result) {
7836                console.info(`return value is:${result}`);
7837                //开发者可以根据需要处理返回结果
7838              }
7839            });
7840          } catch (error) {
7841            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
7842          }
7843        })
7844      Web({ src: 'www.example.com', controller: this.controller })
7845    }
7846  }
7847}
7848```
7849
7850## injectOfflineResources<sup>12+</sup>
7851
7852injectOfflineResources(resourceMaps: Array\<[OfflineResourceMap](./arkts-apis-webview-i.md#offlineresourcemap12)\>): void
7853
7854将本地离线资源注入到内存缓存中,以提升页面首次启动速度。
7855内存缓存中的资源由内核自动管理,当注入的资源过多导致内存压力过大,内核自动释放未使用的资源,应避免注入大量资源到内存缓存中。
7856正常情况下,资源的有效期由提供的Cache-Control或Expires响应头控制其有效期,默认的有效期为86400秒,即1天。
7857资源的MIMEType通过提供的Content-Type响应头配置,Content-Type需符合标准,否则无法正常使用,MODULE_JS必须提供有效的MIMEType,其他类型可不提供。
7858以此方式注入的资源,仅支持通过HTML中的标签加载。如果业务网页中的script标签使用了crossorigin属性,则必须在接口的responseHeaders参数中设置Cross-Origin响应头的值为anonymous或use-credentials。
7859当调用`webview.WebviewController.SetRenderProcessMode(webview.RenderProcessMode.MULTIPLE)`接口后,应用会启动多渲染进程模式,此接口在此场景下不会生效。
7860
7861**系统能力:** SystemCapability.Web.Webview.Core
7862
7863**参数:**
7864
7865| 参数名  | 类型    | 必填 | 说明                  |
7866| ------- | ------ | ---- | :-------------------- |
7867| resourceMaps | Array\<[OfflineResourceMap](./arkts-apis-webview-i.md#offlineresourcemap12)\> | 是   | 本地离线资源配置对象,单次调用最大支持注入30个资源,单个资源最大支持10Mb。      |
7868
7869**错误码:**
7870
7871以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
7872
7873| 错误码ID | 错误信息                                                     |
7874| -------- | ------------------------------------------------------------ |
7875| 401      | Invalid input parameter.Possible causes: 1. Mandatory parameters are left unspecified.2. Incorrect parameter types.3. Parameter verification failed.                                     |
7876| 17100001 | Init error. The WebviewController must be associated with a Web component. |
7877| 17100002 | URL error. The webpage corresponding to the URL is invalid, or the URL length exceeds 2048.  |
7878
7879**示例:**
7880
7881接口推荐配合动态组件使用,使用离线的Web组件用于将资源注入到内核的内存缓存中,并在适当的时机加载业务用Web组件使用这些资源。下方是代码示例:
78821. 首先,在EntryAbility中将UIContext存到localStorage中。
7883
7884   ```ts
7885   // EntryAbility.ets
7886   import { UIAbility } from '@kit.AbilityKit';
7887   import { window } from '@kit.ArkUI';
7888
7889   const localStorage: LocalStorage = new LocalStorage('uiContext');
7890
7891   export default class EntryAbility extends UIAbility {
7892     storage: LocalStorage = localStorage;
7893
7894     onWindowStageCreate(windowStage: window.WindowStage) {
7895       windowStage.loadContent('pages/Index', this.storage, (err, data) => {
7896         if (err.code) {
7897           return;
7898         }
7899
7900         this.storage.setOrCreate<UIContext>("uiContext", windowStage.getMainWindowSync().getUIContext());
7901       });
7902     }
7903   }
7904   ```
7905
79062. 编写动态组件所需基础代码。
7907
7908   ```ts
7909   // DynamicComponent.ets
7910   import { NodeController, BuilderNode, FrameNode, UIContext } from '@kit.ArkUI';
7911
7912   export interface BuilderData {
7913     url: string;
7914     controller: WebviewController;
7915     context: UIContext;
7916   }
7917
7918   let storage : LocalStorage | undefined = undefined;
7919
7920   export class NodeControllerImpl extends NodeController {
7921     private rootNode: BuilderNode<BuilderData[]> | null = null;
7922     private wrappedBuilder: WrappedBuilder<BuilderData[]> | null = null;
7923
7924     constructor(wrappedBuilder: WrappedBuilder<BuilderData[]>, context: UIContext) {
7925       storage = context.getSharedLocalStorage();
7926       super();
7927       this.wrappedBuilder = wrappedBuilder;
7928     }
7929
7930     makeNode(): FrameNode | null {
7931       if (this.rootNode != null) {
7932         return this.rootNode.getFrameNode();
7933       }
7934       return null;
7935     }
7936
7937     initWeb(url: string, controller: WebviewController) {
7938       if(this.rootNode != null) {
7939         return;
7940       }
7941
7942       const uiContext: UIContext = storage!.get<UIContext>("uiContext") as UIContext;
7943       if (!uiContext) {
7944         return;
7945       }
7946       this.rootNode = new BuilderNode(uiContext);
7947       this.rootNode.build(this.wrappedBuilder, { url: url, controller: controller });
7948     }
7949   }
7950
7951   export const createNode = (wrappedBuilder: WrappedBuilder<BuilderData[]>, data: BuilderData) => {
7952     const baseNode = new NodeControllerImpl(wrappedBuilder, data.context);
7953     baseNode.initWeb(data.url, data.controller);
7954     return baseNode;
7955   }
7956   ```
7957
79583. 编写用于注入资源的组件代码,本例中的本地资源内容通过文件读取接口读取rawfile目录下的本地文件。
7959
7960   <!--code_no_check-->
7961   ```ts
7962   // InjectWebview.ets
7963   import { webview } from '@kit.ArkWeb';
7964   import { resourceConfigs } from "./Resource";
7965   import { BuilderData } from "./DynamicComponent";
7966
7967   @Builder
7968   function WebBuilder(data: BuilderData) {
7969     Web({ src: data.url, controller: data.controller })
7970       .onControllerAttached(async () => {
7971         try {
7972           data.controller.injectOfflineResources(await getData (data.context));
7973         } catch (err) {
7974           console.error("error: " + err.code + " " + err.message);
7975         }
7976       })
7977       .fileAccess(true)
7978   }
7979
7980   export const injectWebview = wrapBuilder<BuilderData[]>(WebBuilder);
7981
7982   export async function getData(context: UIContext) {
7983     const resourceMapArr: Array<webview.OfflineResourceMap> = [];
7984
7985     // 读取配置,从rawfile目录中读取文件内容
7986     for (let config of resourceConfigs) {
7987       let buf: Uint8Array = new Uint8Array(0);
7988       if (config.localPath) {
7989         buf = await readRawFile(config.localPath, context);
7990       }
7991
7992       resourceMapArr.push({
7993         urlList: config.urlList,
7994         resource: buf,
7995         responseHeaders: config.responseHeaders,
7996         type: config.type,
7997       })
7998     }
7999
8000     return resourceMapArr;
8001   }
8002
8003   export async function readRawFile(url: string, context: UIContext) {
8004     try {
8005       return await context.getHostContext()!.resourceManager.getRawFileContent(url);
8006     } catch (err) {
8007       return new Uint8Array(0);
8008     }
8009   }
8010   ```
8011
80124. 编写业务用组件代码。
8013
8014   <!--code_no_check-->
8015   ```ts
8016   // BusinessWebview.ets
8017   import { BuilderData } from "./DynamicComponent";
8018
8019   @Builder
8020   function WebBuilder(data: BuilderData) {
8021     // 此处组件可根据业务需要自行扩展
8022     Web({ src: data.url, controller: data.controller })
8023       .cacheMode(CacheMode.Default)
8024   }
8025
8026   export const businessWebview = wrapBuilder<BuilderData[]>(WebBuilder);
8027   ```
8028
80295. 编写资源配置信息。
8030
8031   ```ts
8032   // Resource.ets
8033   import { webview } from '@kit.ArkWeb';
8034
8035   export interface ResourceConfig {
8036     urlList: Array<string>,
8037     type: webview.OfflineResourceType,
8038     responseHeaders: Array<Header>,
8039     localPath: string, // 本地资源存放在rawfile目录下的路径
8040   }
8041
8042   export const resourceConfigs: Array<ResourceConfig> = [
8043     {
8044       localPath: "example.png",
8045       urlList: [
8046         "https://www.example.com/",
8047         "https://www.example.com/path1/example.png",
8048         "https://www.example.com/path2/example.png",
8049       ],
8050       type: webview.OfflineResourceType.IMAGE,
8051       responseHeaders: [
8052         { headerKey: "Cache-Control", headerValue: "max-age=1000" },
8053         { headerKey: "Content-Type", headerValue: "image/png" },
8054       ]
8055     },
8056     {
8057       localPath: "example.js",
8058       urlList: [ // 仅提供一个url,这个url既作为资源的源,也作为资源的网络请求地址
8059         "https://www.example.com/example.js",
8060       ],
8061       type: webview.OfflineResourceType.CLASSIC_JS,
8062       responseHeaders: [
8063         // 以<script crossorigin="anonymous" />方式使用,提供额外的响应头
8064         { headerKey: "Cross-Origin", headerValue:"anonymous" }
8065       ]
8066     },
8067   ];
8068   ```
8069
80706. 在页面中使用。
8071   <!--code_no_check-->
8072   ```ts
8073   // Index.ets
8074   import { webview } from '@kit.ArkWeb';
8075   import { NodeController } from '@kit.ArkUI';
8076   import { createNode } from "./DynamicComponent"
8077   import { injectWebview } from "./InjectWebview"
8078   import { businessWebview } from "./BusinessWebview"
8079
8080   @Entry
8081   @Component
8082   struct Index {
8083     @State injectNode: NodeController | undefined = undefined;
8084     injectController: webview.WebviewController = new webview.WebviewController();
8085
8086     @State businessNode: NodeController | undefined = undefined;
8087     businessController: webview.WebviewController = new webview.WebviewController();
8088
8089     aboutToAppear(): void {
8090       // 初始化用于注入本地资源的Web组件, 提供一个空的html页面作为url即可
8091       this.injectNode = createNode(injectWebview,
8092           { url: "https://www.example.com/empty.html", controller: this.injectController, context: this.getUIContext()});
8093     }
8094
8095     build() {
8096       Column() {
8097         // 在适当的时机加载业务用Web组件,本例以Button点击触发为例
8098         Button("加载页面")
8099           .onClick(() => {
8100             this.businessNode = createNode(businessWebview, {
8101               url: "https://www.example.com/business.html",
8102               controller: this.businessController,
8103               context: this.getUIContext()
8104             });
8105           })
8106         // 用于业务的Web组件
8107         NodeContainer(this.businessNode);
8108       }
8109     }
8110   }
8111   ```
8112
81137. 加载的HTML网页示例。
8114
8115   ```HTML
8116   <!DOCTYPE html>
8117   <html lang="en">
8118   <head></head>
8119   <body>
8120     <img src="https://www.example.com/path1/request.png" />
8121     <img src="https://www.example.com/path2/request.png" />
8122     <script src="https://www.example.com/example.js" crossorigin="anonymous"></script>
8123   </body>
8124   </html>
8125   ```
8126
8127## setHostIP<sup>12+</sup>
8128
8129static setHostIP(hostName: string, address: string, aliveTime: number): void
8130
8131设置主机域名解析后的IP地址。
8132
8133**系统能力:** SystemCapability.Web.Webview.Core
8134
8135**参数:**
8136
8137| 参数名    | 类型 | 必填 | 说明                             |
8138| --------- | -------- | ---- | ------------------------------------ |
8139| hostName  | string   | 是   | 要添加DNS记录的主机域名。            |
8140| address   | string   | 是   | 主机域名解析地址(支持IPv4,IPv6)。 |
8141| aliveTime | number   | 是   | 缓存有效时间(秒)。                 |
8142
8143**错误码:**
8144
8145以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
8146
8147| 错误码ID | 错误信息                 |
8148| -------- | ------------------------ |
8149| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified.2. Incorrect parameter types.3. Parameter verification failed. |
8150
8151**示例:**
8152
8153请参考[clearHostIP](#clearhostip12)。
8154
8155## clearHostIP<sup>12+</sup>
8156
8157static clearHostIP(hostName: string): void
8158
8159清除指定主机域名解析后的IP地址。
8160
8161**系统能力:** SystemCapability.Web.Webview.Core
8162
8163**参数:**
8164
8165| 参数名   | 类型 | 必填 | 说明                  |
8166| -------- | -------- | ---- | ------------------------- |
8167| hostName | string   | 是   | 要清除DNS记录的主机域名。 |
8168
8169**错误码:**
8170
8171以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
8172
8173| 错误码ID | 错误信息                 |
8174| -------- | ------------------------ |
8175| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified.2. Incorrect parameter types.3. Parameter verification failed. |
8176
8177**示例:**
8178
8179```ts
8180// xxx.ets
8181import { webview } from '@kit.ArkWeb';
8182import { BusinessError } from '@kit.BasicServicesKit';
8183
8184@Entry
8185@Component
8186struct WebComponent {
8187  controller: webview.WebviewController = new webview.WebviewController();
8188
8189  build() {
8190    Column() {
8191      // url加载前设置生效.
8192      Button('setHostIP')
8193        .onClick(() => {
8194          try {
8195            webview.WebviewController.setHostIP('www.example.com', '127.0.0.1', 30);
8196          } catch (error) {
8197            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
8198          }
8199        })
8200      Button('clearHostIP')
8201        .onClick(() => {
8202          try {
8203            webview.WebviewController.clearHostIP('www.example.com');
8204          } catch (error) {
8205            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
8206          }
8207        })
8208      Web({ src: 'www.example.com', controller: this.controller })
8209    }
8210  }
8211}
8212```
8213
8214## getSurfaceId<sup>12+</sup>
8215
8216getSurfaceId(): string
8217
8218获取ArkWeb对应Surface的ID,此ID可用于网页截图。
8219
8220> **说明:**
8221>
8222> 仅Web组件渲染模式是ASYNC_RENDER时有效。getSurfaceId需要在Web组件初始化之后才能获取到值。
8223
8224**系统能力:** SystemCapability.Web.Webview.Core
8225
8226**返回值:**
8227
8228| 类型   | 说明                |
8229| ------ | ------------------- |
8230| string | ArkWeb持有Surface的ID。 |
8231
8232**示例:**
8233
8234```ts
8235// xxx.ets
8236import { webview } from '@kit.ArkWeb';
8237import { image } from '@kit.ImageKit';
8238import { BusinessError } from '@kit.BasicServicesKit';
8239
8240@Entry
8241@Component
8242struct Example{
8243  controller: webview.WebviewController = new webview.WebviewController();
8244
8245  @State imagePixelMap: image.PixelMap | undefined = undefined;
8246
8247  build(){
8248    Column(){
8249      Button("截图")
8250        .onClick(()=>{
8251          try {
8252            let surfaceId = this.controller.getSurfaceId();
8253            console.info("surfaceId: " + surfaceId);
8254            if(surfaceId.length != 0) {
8255              let region:image.Region = { x: 0, y: 0, size: { height: 800, width: 1000}}
8256              this.imagePixelMap = image.createPixelMapFromSurfaceSync(surfaceId, region)
8257            }
8258          } catch (error) {
8259            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
8260          }
8261        })
8262      Image(this.imagePixelMap)
8263        .height(100)
8264      Web({src: 'www.example.com', controller: this.controller})
8265    }
8266  }
8267}
8268```
8269
8270## setUrlTrustList<sup>12+</sup>
8271
8272setUrlTrustList(urlTrustList: string): void
8273
8274设置当前web的url白名单,只有白名单内的url才能允许加载/跳转,否则将拦截并弹出告警页。
8275
8276**系统能力:** SystemCapability.Web.Webview.Core
8277
8278**参数:**
8279
8280| 参数名  | 类型    | 必填 | 说明                  |
8281| ------- | ------ | ---- | :-------------------- |
8282| urlTrustList | string | 是   | url白名单列表,使用json格式配置,最大支持10MB。<br/>白名单设置接口为覆盖方式,多次调用接口时,以最后一次设置为准。<br/>当本参数为空字符串时,表示取消白名单,放行所有url的访问。<br/>json格式示例:<br/>{<br>&nbsp;&nbsp;"UrlPermissionList":&nbsp;[<br/>&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"scheme":&nbsp;"https",<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"host":&nbsp;"www\.example1.com",<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"port":&nbsp;443,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"path":&nbsp;"pathA/pathB"<br/>&nbsp;&nbsp;&nbsp;&nbsp;},<br/>&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"scheme":&nbsp;"http",<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"host":&nbsp;"www\.example2.com",<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"port":&nbsp;80,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"path":&nbsp;"test1/test2/test3"<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;]<br/>} |
8283
8284**白名单json格式参数**
8285| 字段   | 参数类型 | 必填 | 参数描述                  |
8286| -------- | -------- | ---- | ------------------------- |
8287| scheme | string   | 否 | 可选参数,不设置即不匹配该项,支持协议:http、https。 |
8288| host | string | 是 | 必选参数,精准匹配,即url的host字段和规则字段完全一致才会放行,可允许同一host多条规则同时生效。 |
8289| port | number | 否 | 可选字段,不设置即不匹配该项。 |
8290| path | string | 否 | 可选字段,不设置即不匹配该项,匹配方式为前缀匹配,以"pathA/pathB/pathC"为例:pathA/pathB/pathC三级目录下全部允许访问,其中pathC必须是完整的目录名或者文件名,不允许部分匹配。|
8291
8292**错误码:**
8293
8294以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
8295
8296| 错误码ID | 错误信息                                                     |
8297| -------- | ------------------------------------------------------------ |
8298| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified.2. Parameter string is too long.3. Parameter verification failed.                                     |
8299| 17100001 | Init error. The WebviewController must be associated with a Web component. |
8300
8301**示例:**
8302  ```ts
8303  // xxx.ets
8304  import { webview } from '@kit.ArkWeb';
8305  import { BusinessError } from '@kit.BasicServicesKit';
8306
8307  @Entry
8308  @Component
8309  struct WebComponent {
8310    controller: webview.WebviewController = new webview.WebviewController();
8311    urltrustList: string = "{\"UrlPermissionList\":[{\"scheme\":\"http\", \"host\":\"trust.example.com\", \"port\":80, \"path\":\"test\"}]}"
8312
8313    build() {
8314      Column() {
8315        Button('Setting the trustlist')
8316          .onClick(() => {
8317            try {
8318              // 设置白名单,只允许访问trust网页
8319              this.controller.setUrlTrustList(this.urltrustList);
8320            } catch (error) {
8321              console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
8322            }
8323          })
8324        Button('Cancel the trustlist.')
8325          .onClick(() => {
8326            try {
8327              // 白名单传入空字符串表示关闭白名单机制,所有url都可以允许访问
8328              this.controller.setUrlTrustList("");
8329            } catch (error) {
8330              console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
8331            }
8332          })
8333        Button('Access the trust web')
8334          .onClick(() => {
8335            try {
8336              // 白名单生效,可以访问trust网页
8337              this.controller.loadUrl('http://trust.example.com/test');
8338            } catch (error) {
8339              console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
8340            }
8341          })
8342        Button('Access the untrust web')
8343          .onClick(() => {
8344            try {
8345              // 白名单生效,此时不可以访问untrust网页,并弹出错误页
8346              this.controller.loadUrl('http://untrust.example.com/test');
8347            } catch (error) {
8348              console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
8349            }
8350          })
8351        Web({ src: 'http://untrust.example.com/test', controller: this.controller }).onControllerAttached(() => {
8352          try {
8353            // onControllerAttached回调中设置白名单,可以保证在加载url之前生效,此时不可以访问untrust网页,并弹出错误页
8354            this.controller.setUrlTrustList(this.urltrustList);
8355          } catch (error) {
8356            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
8357          }
8358        })
8359      }
8360    }
8361  }
8362  ```
8363
8364## setPathAllowingUniversalAccess<sup>12+</sup>
8365
8366setPathAllowingUniversalAccess(pathList: Array\<string\>): void
8367
8368设置一个路径列表,当file协议访问该路径列表中的资源时,允许跨域访问本地文件。此外,当设置了路径列表时,file协议仅允许访问路径列表中的资源([fileAccess](./arkts-basic-components-web-attributes.md#fileaccess)的行为将会被此接口行为覆盖)。路径列表中的路径必须满足以下路径格式之一:
8369
83701.应用文件目录的子目录(应用文件目录通过Ability Kit中的[Context.filesDir](../apis-ability-kit/js-apis-inner-application-context.md#context)获取),例如:
8371
8372* /data/storage/el2/base/files/example
8373* /data/storage/el2/base/haps/entry/files/example
8374
83752.应用资源目录及其子目录(应用资源目录通过Ability Kit中的[Context.resourceDir](../apis-ability-kit/js-apis-inner-application-context.md#context)获取),例如:
8376
8377* /data/storage/el1/bundle/entry/resource/resfile
8378* /data/storage/el1/bundle/entry/resource/resfile/example
8379
8380当路径列表中有其中一个路径不满足以上条件之一,则会抛出异常码401,并且设置路径列表失败。当设置的路径列表为空,则file协议可访问范围以[fileAccess](./arkts-basic-components-web-attributes.md#fileaccess)的行为为准。
8381
8382**系统能力:** SystemCapability.Web.Webview.Core
8383
8384**参数:**
8385
8386| 参数名   | 类型 | 必填 | 说明                  |
8387| -------- | -------- | ---- | ------------------------- |
8388| pathList | Array\<string\>   | 是   | 路径列表 |
8389
8390**错误码:**
8391
8392以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
8393
8394| 错误码ID | 错误信息                 |
8395| -------- | ------------------------ |
8396| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Parameter string is too long. 3.Parameter verification failed. |
8397| 17100001 | Init error. The WebviewController must be associated with a Web component. |
8398
8399**示例:**
8400
8401```ts
8402// xxx.ets
8403import { webview } from '@kit.ArkWeb';
8404import { BusinessError } from '@kit.BasicServicesKit';
8405
8406@Entry
8407@Component
8408struct WebComponent {
8409  controller: WebviewController = new webview.WebviewController();
8410  uiContext: UIContext = this.getUIContext();
8411
8412  build() {
8413    Row() {
8414      Web({ src: "", controller: this.controller })
8415        .onControllerAttached(() => {
8416          try {
8417            // 设置允许可以跨域访问的路径列表
8418            this.controller.setPathAllowingUniversalAccess([
8419              this.uiContext.getHostContext()!.resourceDir,
8420              this.uiContext.getHostContext()!.filesDir + "/example"
8421            ])
8422            this.controller.loadUrl("file://" + this.getUIContext().getHostContext()!.resourceDir + "/index.html")
8423          } catch (error) {
8424            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
8425          }
8426        })
8427        .javaScriptAccess(true)
8428        .fileAccess(true)
8429        .domStorageAccess(true)
8430    }
8431  }
8432}
8433
8434```
8435
8436加载的html文件,位于应用资源目录resource/resfile/index.html8437```html
8438<!-- index.html -->
8439<!DOCTYPE html>
8440<html lang="en">
8441
8442<head>
8443    <meta charset="utf-8">
8444    <title>Demo</title>
8445    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no, viewport-fit=cover">
8446    <script>
8447        function getFile() {
8448            var file = "file:///data/storage/el1/bundle/entry/resources/resfile/js/script.js";
8449            var xmlHttpReq = new XMLHttpRequest();
8450            xmlHttpReq.onreadystatechange = function(){
8451                console.info("readyState:" + xmlHttpReq.readyState);
8452                console.info("status:" + xmlHttpReq.status);
8453                if(xmlHttpReq.readyState == 4){
8454                    if (xmlHttpReq.status == 200) {
8455                // 如果ets侧正确设置路径列表,则此处能正常获取资源
8456                        const element = document.getElementById('text');
8457                        element.textContent = "load " + file + " success";
8458                    } else {
8459                // 如果ets侧不设置路径列表,则此处会触发CORS跨域检查错误
8460                        const element = document.getElementById('text');
8461                        element.textContent = "load " + file + " failed";
8462                    }
8463                }
8464            }
8465            xmlHttpReq.open("GET", file);
8466            xmlHttpReq.send(null);
8467        }
8468
8469    </script>
8470</head>
8471
8472<body>
8473<div class="page">
8474    <button id="example" onclick="getFile()">stealFile</button>
8475</div>
8476<div id="text"></div>
8477</body>
8478
8479</html>
8480```
8481
8482html中使用file协议通过XMLHttpRequest跨域访问本地js文件,js文件位于resource/resfile/js/script.js8483<!--code_no_check-->
8484```javascript
8485const body = document.body;
8486const element = document.createElement('div');
8487element.textContent = 'success';
8488body.appendChild(element);
8489```
8490
8491## enableBackForwardCache<sup>12+</sup>
8492
8493static enableBackForwardCache(features: BackForwardCacheSupportedFeatures): void
8494
8495开启Web组件前进后退缓存功能,通过参数指定是否允许使用特定的页面进入前进后退缓存。
8496
8497需要在[initializeWebEngine()](#initializewebengine)初始化内核之前调用。
8498
8499**系统能力:**  SystemCapability.Web.Webview.Core
8500
8501**参数:**
8502
8503| 参数名          | 类型    |  必填  | 说明                                            |
8504| ---------------| ------- | ---- | ------------- |
8505| features     |  [BackForwardCacheSupportedFeatures](./arkts-apis-webview-BackForwardCacheSupportedFeatures.md) | 是   | 允许使用特定的页面进入前进后退缓存中。|
8506
8507**示例:**
8508
8509```ts
8510// EntryAbility.ets
8511import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
8512import { hilog } from '@kit.PerformanceAnalysisKit';
8513import { window } from '@kit.ArkUI';
8514import { webview } from '@kit.ArkWeb';
8515
8516export default class EntryAbility extends UIAbility {
8517    onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
8518        let features = new webview.BackForwardCacheSupportedFeatures();
8519        features.nativeEmbed = true;
8520        features.mediaTakeOver = true;
8521        // 如果一个页面同时使用了同层渲染和视频托管的能力,需要 nativeEmbed 和
8522        // mediaTakeOver 同时设置为 true,该页面才可以进入前进后退缓存中。
8523        webview.WebviewController.enableBackForwardCache(features);
8524        webview.WebviewController.initializeWebEngine();
8525        AppStorage.setOrCreate("abilityWant", want);
8526    }
8527}
8528```
8529
8530## setBackForwardCacheOptions<sup>12+</sup>
8531
8532setBackForwardCacheOptions(options: BackForwardCacheOptions): void
8533
8534可以设置Web组件中前进后退缓存的相关选项。
8535
8536**系统能力:**  SystemCapability.Web.Webview.Core
8537
8538**参数:**
8539
8540| 参数名          | 类型    |  必填  | 说明                                            |
8541| ---------------| ------- | ---- | ------------- |
8542| options     |  [BackForwardCacheOptions](./arkts-apis-webview-BackForwardCacheOptions.md) | 是   | 用来控制Web组件前进后退缓存相关选项。|
8543
8544**错误码:**
8545
8546以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
8547
8548| 错误码ID | 错误信息                                                     |
8549| -------- | ------------------------------------------------------------ |
8550| 17100001 | Init error. The WebviewController must be associated with a Web component. |
8551
8552**示例:**
8553
8554```ts
8555// xxx.ts
8556import { webview } from '@kit.ArkWeb';
8557
8558@Entry
8559@Component
8560struct Index {
8561  controller: webview.WebviewController = new webview.WebviewController();
8562
8563  build() {
8564    Column() {
8565      Row() {
8566        Button("Add options").onClick((event: ClickEvent) => {
8567          let options = new webview.BackForwardCacheOptions();
8568          options.size = 3;
8569          options.timeToLive = 10;
8570          this.controller.setBackForwardCacheOptions(options);
8571        })
8572        Button("Backward").onClick((event: ClickEvent) => {
8573          this.controller.backward();
8574        })
8575        Button("Forward").onClick((event: ClickEvent) => {
8576          this.controller.forward();
8577        })
8578      }
8579      Web({ src: "https://www.example.com", controller: this.controller })
8580    }
8581    .height('100%')
8582    .width('100%')
8583  }
8584}
8585```
8586
8587## trimMemoryByPressureLevel<sup>14+</sup>
8588
8589trimMemoryByPressureLevel(level: PressureLevel): void
8590
8591根据指定的内存压力等级,主动清理Web组件占用的缓存。
8592
8593**系统能力:** SystemCapability.Web.Webview.Core
8594
8595**参数:**
8596
8597| 参数名  | 类型    | 必填 | 说明                  |
8598| ------- | ------ | ---- | :-------------------- |
8599| level | [PressureLevel](./arkts-apis-webview-e.md#pressurelevel14) | 是 | 需要清理内存的内存等级。|
8600
8601**错误码:**
8602
8603以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
8604
8605| 错误码ID | 错误信息                                                     |
8606| -------- | ------------------------------------------------------------ |
8607| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Parameter string is too long. 3.Parameter verification failed. |
8608
8609**示例:**
8610```ts
8611// xxx.ets
8612import { webview } from '@kit.ArkWeb';
8613import { BusinessError } from '@kit.BasicServicesKit';
8614
8615@Entry
8616@Component
8617struct WebComponent {
8618  controller: WebviewController = new webview.WebviewController();
8619  build() {
8620    Column() {
8621      Row() {
8622        Button('trim_Memory')
8623          .onClick(() => {
8624            try {
8625              // 设置当前内存压力等级为适中,释放少量内存
8626              webview.WebviewController.trimMemoryByPressureLevel(
8627                webview.PressureLevel.MEMORY_PRESSURE_LEVEL_MODERATE);
8628            } catch (error) {
8629              console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
8630            }
8631          })
8632      }.height('10%')
8633      Web({ src: 'www.example.com', controller: this.controller })
8634    }
8635  }
8636}
8637```
8638
8639## createPdf<sup>14+</sup>
8640
8641createPdf(configuration: PdfConfiguration, callback: AsyncCallback\<PdfData\>): void
8642
8643异步callback方式获取指定网页的数据流。
8644
8645**系统能力:** SystemCapability.Web.Webview.Core
8646
8647**参数:**
8648
8649| 参数名        | 类型                                    | 必填 | 说明                    |
8650| ------------- | --------------------------------------- | ---- | ----------------------- |
8651| configuration | [PdfConfiguration](./arkts-apis-webview-i.md#pdfconfiguration14) | 是   | 生成PDF所需参数。       |
8652| callback      | AsyncCallback<[PdfData](./arkts-apis-webview-PdfData.md)>    | 是   | 回调返回网页PDF数据流。 |
8653
8654**错误码:**
8655
8656以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
8657
8658| 错误码ID | 错误信息                                                     |
8659| -------- | ------------------------------------------------------------ |
8660| 401      | Invalid input parameter.  |
8661| 17100001 | Init error. The WebviewController must be associated with a Web component. |
8662
8663**示例**:
8664
8665```ts
8666import { fileIo as fs } from '@kit.CoreFileKit';
8667import { webview } from '@kit.ArkWeb';
8668import { BusinessError } from '@kit.BasicServicesKit';
8669import { common } from '@kit.AbilityKit';
8670
8671@Entry
8672@Component
8673struct Index {
8674  controller: webview.WebviewController = new webview.WebviewController();
8675  pdfConfig: webview.PdfConfiguration = {
8676    width: 8.27,
8677    height: 11.69,
8678    marginTop: 0,
8679    marginBottom: 0,
8680    marginRight: 0,
8681    marginLeft: 0,
8682    shouldPrintBackground: true
8683  }
8684
8685  build() {
8686    Column() {
8687      Button('SavePDF')
8688        .onClick(() => {
8689          this.controller.createPdf(
8690            this.pdfConfig,
8691            (error, result: webview.PdfData) => {
8692              try {
8693                // 获取组件上下文
8694                let context = this.getUIContext().getHostContext() as common.UIAbilityContext;
8695                // 获取沙箱路径,设置pdf文件名
8696                let filePath = context.filesDir + "/test.pdf";
8697                let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
8698                fs.write(file.fd, result.pdfArrayBuffer().buffer).then((writeLen: number) => {
8699                  console.info("createPDF write data to file succeed and size is:" + writeLen);
8700                }).catch((err: BusinessError) => {
8701                  console.error("createPDF write data to file failed with error message: " + err.message +
8702                    ", error code: " + err.code);
8703                }).finally(() => {
8704                  fs.closeSync(file);
8705                });
8706              } catch (resError) {
8707                console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
8708              }
8709            });
8710        })
8711      Web({ src: "www.example.com", controller: this.controller })
8712    }
8713  }
8714}
8715```
8716
8717## createPdf<sup>14+</sup>
8718
8719createPdf(configuration: PdfConfiguration): Promise\<PdfData\>
8720
8721以Promise方式异步获取指定网页的数据流。
8722
8723**系统能力:** SystemCapability.Web.Webview.Core
8724
8725**参数:**
8726
8727| 参数名        | 类型                                    | 必填 | 说明              |
8728| ------------- | --------------------------------------- | ---- | ----------------- |
8729| configuration | [PdfConfiguration](./arkts-apis-webview-i.md#pdfconfiguration14) | 是   | 生成PDF所需参数。 |
8730
8731**返回值:**
8732
8733| 类型                           | 说明                          |
8734| ------------------------------ | ----------------------------- |
8735| Promise<[PdfData](./arkts-apis-webview-PdfData.md)> | Promise实例,返回网页数据流。 |
8736
8737**错误码:**
8738
8739以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
8740
8741| 错误码ID | 错误信息                                                     |
8742| -------- | ------------------------------------------------------------ |
8743| 401      | Invalid input parameter. |
8744| 17100001 | Init error. The WebviewController must be associated with a Web component. |
8745
8746**示例**:
8747
8748```ts
8749import { fileIo as fs } from '@kit.CoreFileKit';
8750import { webview } from '@kit.ArkWeb';
8751import { BusinessError } from '@kit.BasicServicesKit';
8752import { common } from '@kit.AbilityKit';
8753
8754@Entry
8755@Component
8756struct Index {
8757  controller: webview.WebviewController = new webview.WebviewController();
8758  pdfConfig: webview.PdfConfiguration = {
8759    width: 8.27,
8760    height: 11.69,
8761    marginTop: 0,
8762    marginBottom: 0,
8763    marginRight: 0,
8764    marginLeft: 0,
8765    shouldPrintBackground: true
8766  }
8767
8768  build() {
8769    Column() {
8770      Button('SavePDF')
8771        .onClick(() => {
8772          this.controller.createPdf(this.pdfConfig)
8773            .then((result: webview.PdfData) => {
8774              try {
8775                // 获取组件上下文
8776                let context = this.getUIContext().getHostContext() as common.UIAbilityContext;
8777                // 获取沙箱路径,设置pdf文件名
8778                let filePath = context.filesDir + "/test.pdf";
8779                let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
8780                fs.write(file.fd, result.pdfArrayBuffer().buffer).then((writeLen: number) => {
8781                  console.info("createPDF write data to file succeed and size is:" + writeLen);
8782                }).catch((err: BusinessError) => {
8783                  console.error("createPDF write data to file failed with error message: " + err.message +
8784                    ", error code: " + err.code);
8785                }).finally(() => {
8786                  fs.closeSync(file);
8787                });
8788              } catch (resError) {
8789                console.error(`ErrorCode: ${(resError as BusinessError).code},  Message: ${(resError as BusinessError).message}`);
8790              }
8791            })
8792        })
8793      Web({ src: "www.example.com", controller: this.controller })
8794    }
8795  }
8796}
8797```
8798
8799## getScrollOffset<sup>13+</sup>
8800
8801getScrollOffset(): ScrollOffset
8802
8803获取网页当前的滚动偏移量(包含过滚动偏移量)。
8804
8805**系统能力:** SystemCapability.Web.Webview.Core
8806
8807**返回值**
8808
8809| 类型                            | 说明                   |
8810| :------------------------------ | ---------------------- |
8811| [ScrollOffset](./arkts-apis-webview-i.md#scrolloffset13) | 网页当前的滚动偏移量(包含过滚动偏移量)。 |
8812
8813**示例:**
8814
8815```ts
8816// xxx.ets
8817import { webview } from '@kit.ArkWeb';
8818
8819@Entry
8820@Component
8821struct WebComponent {
8822  @State testTitle: string = 'webScroll'
8823  controller: webview.WebviewController = new webview.WebviewController();
8824  @State controllerX: number =-100;
8825  @State controllerY: number =-100;
8826  @State mode: OverScrollMode = OverScrollMode.ALWAYS;
8827
8828  build() {
8829    Column() {
8830      Row() {
8831        Text(this.testTitle)
8832          .fontSize(30)
8833          .fontWeight(FontWeight.Bold)
8834          .margin(5)
8835      }
8836      Column() {
8837        Text(`controllerX: ${this.controllerX}, controllerY: ${this.controllerY}`)
8838      }
8839      .margin({ top: 10, bottom: 10 })
8840      Web({ src: $rawfile("scrollByTo.html"), controller: this.controller })
8841        .key("web_01")
8842        .overScrollMode(this.mode)
8843        .onTouch(() => {
8844          this.controllerX = this.controller.getScrollOffset().x;
8845          this.controllerY = this.controller.getScrollOffset().y;
8846          let componentInfo = this.getUIContext().getComponentUtils().getRectangleById("web_01");
8847          let webHeight = this.getUIContext().px2vp(componentInfo.size.height);
8848          let pageHeight = this.controller.getPageHeight();
8849          if (this.controllerY < 0) {
8850            // case1:网页向下过滚动时,可直接使用ScrollOffset.y
8851            console.info(`get downwards overscroll offsetY = ${this.controllerY}`);
8852          } else if ((this.controllerY != 0) && (this.controllerY > (pageHeight - webHeight))) {
8853            // case2:网页向上过滚动时,需计算出网页下边界与Web组件下边界的偏移量
8854            console.info(`get upwards overscroll offsetY = ${this.controllerY - (pageHeight >= webHeight ? (pageHeight - webHeight) : 0)}`);
8855          } else {
8856            // case3:网页未发生过滚动时,可直接使用ScrollOffset.y
8857            console.info(`get scroll offsetY = ${this.controllerY}`);
8858          }
8859        })
8860        .height(600)
8861    }
8862    .width('100%')
8863    .height('100%')
8864  }
8865}
8866```
8867  加载的html文件。
8868  ```html
8869  <!--index.html-->
8870  <!DOCTYPE html>
8871  <html>
8872  <head>
8873      <meta name="viewport" id="viewport" content="width=device-width,initial-scale=1.0">
8874      <title>Demo</title>
8875      <style>
8876          body {
8877            width:3000px;
8878            height:6000px;
8879            padding-right:170px;
8880            padding-left:170px;
8881            border:5px solid blueviolet;
8882          }
8883      </style>
8884  </head>
8885  <body>
8886  Scroll Test
8887  </body>
8888  </html>
8889  ```
8890
8891## getPageOffset<sup>20+</sup>
8892
8893getPageOffset(): ScrollOffset
8894
8895获取网页当前的滚动偏移量(不包含过滚动偏移量)。
8896
8897**系统能力:** SystemCapability.Web.Webview.Core
8898
8899**返回值**
8900
8901| 类型                            | 说明                   |
8902| :------------------------------ | ---------------------- |
8903| [ScrollOffset](./arkts-apis-webview-i.md#scrolloffset13) | 网页当前的滚动偏移量(不包含过滚动偏移量)。 |
8904
8905**错误码:**
8906
8907以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)。
8908
8909| 错误码ID | 错误信息                                                     |
8910| -------- | ------------------------------------------------------------ |
8911|  801     | Capability not supported. |
8912
8913**示例:**
8914
8915```ts
8916// xxx.ets
8917import { BusinessError } from '@kit.BasicServicesKit';
8918import { webview } from '@kit.ArkWeb';
8919
8920@Entry
8921@Component
8922struct WebComponent {
8923  controller: webview.WebviewController = new webview.WebviewController();
8924
8925  build() {
8926    Column() {
8927      Web({ src: $rawfile('index.html'), controller: this.controller })
8928        .onScroll((event) => {
8929          try {
8930            console.info("getPageOffset x:" + this.controller.getPageOffset().x + ",y:" +
8931            this.controller.getPageOffset().y);
8932          } catch (error) {
8933            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
8934          }
8935        })
8936    }
8937  }
8938}
8939```
8940```html
8941<!-- index.html -->
8942<!DOCTYPE html>
8943<html>
8944<head>
8945    <meta name="viewport" id="viewport" content="width=device-width, initial-scale=1.0">
8946    <style>
8947        .blue {
8948          background-color: lightblue;
8949        }
8950        .green {
8951          background-color: lightgreen;
8952        }
8953        .blue, .green {
8954         font-size:16px;
8955         height:200px;
8956         text-align: center;       /* 水平居中 */
8957         line-height: 200px;       /* 垂直居中(值等于容器高度) */
8958        }
8959    </style>
8960</head>
8961<body>
8962<div class="blue" >webArea</div>
8963<div class="green">webArea</div>
8964<div class="blue">webArea</div>
8965<div class="green">webArea</div>
8966<div class="blue">webArea</div>
8967<div class="green">webArea</div>
8968<div class="blue">webArea</div>
8969</body>
8970</html>
8971```
8972
8973## getLastHitTest<sup>18+</sup>
8974
8975getLastHitTest(): HitTestValue
8976
8977获取上一次被点击区域的元素信息。
8978
8979**系统能力:** SystemCapability.Web.Webview.Core
8980
8981**返回值:**
8982
8983| 类型         | 说明                 |
8984| ------------ | -------------------- |
8985| [HitTestValue](./arkts-apis-webview-i.md#hittestvalue) | 点击区域的元素信息。 |
8986
8987**错误码:**
8988
8989以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
8990
8991| 错误码ID | 错误信息                                                     |
8992| -------- | ------------------------------------------------------------ |
8993| 17100001 | Init error. The WebviewController must be associated with a Web component. |
8994
8995**示例:**
8996
8997```ts
8998// xxx.ets
8999import { webview } from '@kit.ArkWeb';
9000import { BusinessError } from '@kit.BasicServicesKit';
9001
9002@Entry
9003@Component
9004struct WebComponent {
9005  controller: webview.WebviewController = new webview.WebviewController();
9006
9007  build() {
9008    Column() {
9009      Button('getLastHitTest')
9010        .onClick(() => {
9011          try {
9012            let hitValue = this.controller.getLastHitTest();
9013            console.log("hitType: " + hitValue.type);
9014            console.log("extra: " + hitValue.extra);
9015          } catch (error) {
9016            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
9017          }
9018        })
9019      Web({ src: 'www.example.com', controller: this.controller })
9020    }
9021  }
9022}
9023```
9024
9025## getAttachState<sup>20+</sup>
9026
9027getAttachState(): ControllerAttachState
9028
9029查询当前WebViewController是否绑定一个Web组件。
9030
9031**系统能力:** SystemCapability.Web.Webview.Core
9032
9033**返回值:**
9034
9035| 类型         | 说明                 |
9036| ------------ | -------------------- |
9037| [ControllerAttachState](./arkts-apis-webview-i.md#controllerattachstate20) | WebViewController与Web组件的绑定状态。 |
9038
9039**示例:**
9040点击Button可以获取当前WebViewController的绑定状态并输出日志。
9041
9042```ts
9043// xxx.ets
9044import { webview } from '@kit.ArkWeb';
9045import { BusinessError } from '@kit.BasicServicesKit';
9046
9047@Entry
9048@Component
9049struct WebComponent {
9050  controller: webview.WebviewController = new webview.WebviewController();
9051
9052  build() {
9053    Column() {
9054      Button('getAttachState')
9055        .onClick(() => {
9056          try {
9057            if (this.controller.getAttachState() == webview.ControllerAttachState.ATTACHED) {
9058              console.info('Controller is attached.');
9059            } else {
9060              console.info('Controller is unattached.');
9061            }
9062          } catch (error) {
9063            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
9064          }
9065        })
9066      Web({ src: 'www.example.com', controller: this.controller })
9067    }
9068  }
9069}
9070```
9071## on('controllerAttachStateChange')<sup>20+</sup>
9072
9073on(type: 'controllerAttachStateChange', callback: Callback&lt;ControllerAttachState&gt;): void
9074
9075注册WebViewController绑定状态事件,通过Callback方式获取WebViewController绑定状态的变化通知。
9076
9077**系统能力:** SystemCapability.Web.Webview.Core
9078
9079**参数:**
9080
9081| 参数名 | 类型 | 必填 | 说明 |
9082| -------- | -------- | -------- | -------- |
9083| type | string | 是 | 表示注册WebViewController绑定状态事件,固定为"controllerAttachStateChange"。 |
9084| callback | Callback<[ControllerAttachState](./arkts-apis-webview-i.md#controllerattachstate20)> | 是 | WebViewController绑定状态改变时的回调函数。 |
9085
9086**示例:**
9087
9088请参考[off](#offcontrollerattachstatechange20)。
9089
9090## off('controllerAttachStateChange')<sup>20+</sup>
9091
9092off(type: 'controllerAttachStateChange', callback?: Callback&lt;ControllerAttachState&gt;): void
9093
9094取消WebViewController绑定状态事件的注册,取消后将不再接收Callback通知。
9095
9096**系统能力:** SystemCapability.Web.Webview.Core
9097
9098**参数:**
9099
9100| 参数名 | 类型 | 必填 | 说明 |
9101| -------- | -------- | -------- | -------- |
9102| type | string | 是 | 表示注册WebViewController绑定状态事件,固定为"controllerAttachStateChange"。 |
9103| callback | Callback<[ControllerAttachState](./arkts-apis-webview-i.md#controllerattachstate20)> | 否 | WebViewController绑定状态发生改变时的回调函数,默认情况下不填写回调函数。如果填写了Callback,将仅取消注册该特定的回调。如果不填写Callback,将取消注册所有回调。 |
9104
9105**示例:**
9106
9107on可以注册多个回调,当绑定状态改变后会获取当前的绑定状态并触发这些回调。off可以取消注册某个回调,也可以取消注册所有回调。
9108
9109```ts
9110// xxx.ets
9111import { webview } from '@kit.ArkWeb';
9112import { BusinessError } from '@kit.BasicServicesKit';
9113
9114@Entry
9115@Component
9116struct WebComponent {
9117  controller: webview.WebviewController = new webview.WebviewController();
9118  // 构建回调函数
9119  handleControllerAttachStateChange = (state: webview.ControllerAttachState) => {
9120    if (state == webview.ControllerAttachState.UNATTACHED) {
9121      console.info('handleControllerAttachStateChange: Controller is unattached.');
9122    } else {
9123      console.info('handleControllerAttachStateChange: Controller is attached.');
9124    }
9125  };
9126  aboutToAppear() {
9127    try {
9128      this.controller.on('controllerAttachStateChange', this.handleControllerAttachStateChange);
9129    } catch (error) {
9130      console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
9131    }
9132    try {
9133      // 注册回调以接收controller绑定状态更改通知
9134      this.controller.on('controllerAttachStateChange', (state: webview.ControllerAttachState) => {
9135        if (state == webview.ControllerAttachState.UNATTACHED) {
9136          console.info('Controller is unattached.');
9137        } else {
9138          console.info('Controller is attached.');
9139        }
9140      })
9141    } catch (error) {
9142      console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
9143    }
9144  }
9145  aboutToDisappear() {
9146    // 取消指定注册回调
9147    // this.controller.off('controllerAttachStateChange', this.handleControllerAttachStateChange);
9148    // 取消所有注册回调
9149    this.controller.off('controllerAttachStateChange');
9150  }
9151
9152  build() {
9153    Column() {
9154      Web({ src: 'www.example.com', controller: this.controller })
9155    }
9156  }
9157}
9158```
9159## waitForAttached<sup>20+</sup>
9160
9161waitForAttached(timeout: number):Promise&lt;ControllerAttachState&gt;
9162
9163异步等待WebViewController与Web组件绑定完成,绑定完成或超时触发回调,通过Promise方式返回当前[ControllerAttachState](./arkts-apis-webview-i.md#controllerattachstate20)状态。
9164
9165**系统能力:** SystemCapability.Web.Webview.Core
9166
9167**参数:**
9168
9169| 参数名        | 类型                                    | 必填 | 说明              |
9170| ------------- | --------------------------------------- | ---- | ----------------- |
9171| timeout | number | 是   | 异步等待时长。<br/>取值范围: [0, 65535]<br/>单位: ms |
9172
9173**返回值:**
9174
9175| 类型                           | 说明                          |
9176| ------------------------------ | ----------------------------- |
9177| Promise<[ControllerAttachState](./arkts-apis-webview-i.md#controllerattachstate20)> | Promise实例,返回当前[ControllerAttachState](./arkts-apis-webview-i.md#controllerattachstate20)状态。 |
9178
9179
9180**示例:**
9181
9182在初始化阶段设置WebViewController等待绑定完成,超时时间为1000ms。若绑定完成或者超时则会触发回调。
9183
9184```ts
9185// xxx.ets
9186import { webview } from '@kit.ArkWeb';
9187import { BusinessError } from '@kit.BasicServicesKit';
9188
9189@Entry
9190@Component
9191struct WebComponent {
9192  controller: webview.WebviewController = new webview.WebviewController();
9193
9194  async aboutToAppear() {
9195    this.controller.waitForAttached(1000).then((state: webview.ControllerAttachState) => {
9196      if (state == webview.ControllerAttachState.ATTACHED) {
9197        //绑定完成或者超时都会触发回调
9198        console.info('Controller is attached.');
9199      }
9200    })
9201    try {
9202      const state = await this.controller.waitForAttached(1000);
9203      if (state == webview.ControllerAttachState.ATTACHED) {
9204        console.info('Controller is attached.');
9205      }
9206    } catch (error) {
9207      console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
9208    }
9209  }
9210
9211  build() {
9212    Column() {
9213      Web({ src: 'www.example.com', controller: this.controller })
9214    }
9215  }
9216}
9217```
9218
9219## setWebDebuggingAccess<sup>20+</sup>
9220
9221static setWebDebuggingAccess(webDebuggingAccess: boolean, port: number): void
9222
9223设置是否启用无线网页调试功能,默认不开启。
9224
9225* 当没有指定端口port时,该接口等同于[setWebDebuggingAccess](#setwebdebuggingaccess)接口,ArkWeb会启动一个本地domain socket监听。
9226* 当指定了端口port时,ArkWeb会启动一个tcp socket监听。这时可以无线调试网页。详情请参考[无线调试](../../web/web-debugging-with-devtools.md#无线调试)。
9227
9228由于小于1024的端口号作为熟知或系统端口,在操作系统上需要特权才能开启,因此port的取值必须大于1024,否则该接口会抛出异常。
9229
9230安全提示:启用网页调试功能可以让用户检查修改Web页面内部状态,存在安全隐患,不建议在应用正式发布版本中启用。
9231
9232**系统能力:** SystemCapability.Web.Webview.Core
9233
9234**参数:**
9235
9236| 参数名              | 类型    | 必填   |  说明 |
9237| ------------------ | ------- | ---- | ------------- |
9238| webDebuggingAccess | boolean | 是   | 设置是否启用网页调试功能。<br/>true表示开启网页调试功能,false表示关闭网页调试功能。 |
9239| port               | number  | 是   | 指定devtools服务的tcp端口号。如果没有指定port,那么该接口等同于[setWebDebuggingAccess](#setwebdebuggingaccess)接口。<br/>取值范围: (1024, 65535]<br/>如果port的值在区间[0, 1024]内,则会抛出BusinessError异常,错误码为17100023。 |
9240
9241
9242**错误码:**
9243
9244以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
9245
9246| 错误码ID | 错误信息                                                     |
9247| -------- | ------------------------------------------------------------ |
9248| 17100023 | The port number is not within the allowed range. |
9249
9250**示例:**
9251
9252```ts
9253// xxx.ets
9254import { webview } from '@kit.ArkWeb';
9255import { BusinessError } from '@kit.BasicServicesKit';
9256
9257@Entry
9258@Component
9259struct WebComponent {
9260  controller: webview.WebviewController = new webview.WebviewController();
9261
9262  aboutToAppear(): void {
9263    try {
9264      webview.WebviewController.setWebDebuggingAccess(true, 8888);
9265    } catch (error) {
9266      console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
9267    }
9268  }
9269
9270  build() {
9271    Column() {
9272      Web({ src: 'www.example.com', controller: this.controller })
9273    }
9274  }
9275}
9276```
9277
9278## getProgress<sup>20+</sup>
9279
9280getProgress(): number
9281
9282获取当前网页加载进度。
9283
9284**系统能力:** SystemCapability.Web.Webview.Core
9285
9286**返回值**
9287
9288| 类型                            | 说明                   |
9289| :------------------------------ | ---------------------- |
9290| number | 当前页面加载进度,取值范围[0, 100] |
9291
9292**错误码:**
9293
9294以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
9295
9296| 错误码ID | 错误信息                                                     |
9297| -------- | ------------------------------------------------------------ |
9298| 801 | Capability not supported. |
9299
9300**示例:**
9301
9302```ts
9303import { webview } from '@kit.ArkWeb';
9304
9305@Entry
9306@Component
9307struct WebComponent {
9308  controller: webview.WebviewController = new webview.WebviewController();
9309
9310  build() {
9311    Column() {
9312      Web({ src: 'www.example.com', controller: this.controller })
9313        .onPageBegin(() => {
9314          let curProgress = this.controller.getProgress();
9315          console.info("current page loading progress is :" + curProgress);
9316        })
9317    }
9318  }
9319}
9320```
9321
9322## getHitTest<sup>(deprecated)</sup>
9323
9324getHitTest(): WebHitTestType
9325
9326获取当前被点击区域的元素类型。
9327
9328> **说明:**
9329>
9330> 从API version11开始支持,从API version 18开始废弃。建议使用[getLastHitTest](#getlasthittest18)替代。
9331
9332**系统能力:** SystemCapability.Web.Webview.Core
9333
9334**返回值:**
9335
9336| 类型                                                         | 说明                   |
9337| ------------------------------------------------------------ | ---------------------- |
9338| [WebHitTestType](./arkts-apis-webview-e.md#webhittesttype)| 被点击区域的元素类型。 |
9339
9340**错误码:**
9341
9342以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
9343
9344| 错误码ID | 错误信息                                                     |
9345| -------- | ------------------------------------------------------------ |
9346| 17100001 | Init error. The WebviewController must be associated with a Web component. |
9347
9348**示例:**
9349
9350```ts
9351// xxx.ets
9352import { webview } from '@kit.ArkWeb';
9353import { BusinessError } from '@kit.BasicServicesKit';
9354
9355@Entry
9356@Component
9357struct WebComponent {
9358  controller: webview.WebviewController = new webview.WebviewController();
9359
9360  build() {
9361    Column() {
9362      Button('getHitTest')
9363        .onClick(() => {
9364          try {
9365            let hitTestType = this.controller.getHitTest();
9366            console.log("hitTestType: " + hitTestType);
9367          } catch (error) {
9368            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
9369          }
9370        })
9371      Web({ src: 'www.example.com', controller: this.controller })
9372    }
9373  }
9374}
9375```
9376
9377## getHitTestValue<sup>(deprecated)</sup>
9378
9379getHitTestValue(): HitTestValue
9380
9381获取当前被点击区域的元素信息。
9382
9383> **说明:**
9384>
9385> 从API version11开始支持,从API version 18开始废弃。建议使用[getLastHitTest](#getlasthittest18)替代。
9386
9387**系统能力:** SystemCapability.Web.Webview.Core
9388
9389**返回值:**
9390
9391| 类型         | 说明                 |
9392| ------------ | -------------------- |
9393| [HitTestValue](./arkts-apis-webview-i.md#hittestvalue) | 点击区域的元素信息。 |
9394
9395**错误码:**
9396
9397以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
9398
9399| 错误码ID | 错误信息                                                     |
9400| -------- | ------------------------------------------------------------ |
9401| 17100001 | Init error. The WebviewController must be associated with a Web component. |
9402
9403**示例:**
9404
9405```ts
9406// xxx.ets
9407import { webview } from '@kit.ArkWeb';
9408import { BusinessError } from '@kit.BasicServicesKit';
9409
9410@Entry
9411@Component
9412struct WebComponent {
9413  controller: webview.WebviewController = new webview.WebviewController();
9414
9415  build() {
9416    Column() {
9417      Button('getHitTestValue')
9418        .onClick(() => {
9419          try {
9420            let hitValue = this.controller.getHitTestValue();
9421            console.log("hitType: " + hitValue.type);
9422            console.log("extra: " + hitValue.extra);
9423          } catch (error) {
9424            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
9425          }
9426        })
9427      Web({ src: 'www.example.com', controller: this.controller })
9428    }
9429  }
9430}
9431```
9432
9433## avoidVisibleViewportBottom<sup>20+</sup>
9434
9435avoidVisibleViewportBottom(avoidHeight: number): void
9436
9437设置Web网页可视视口底部避让高度。
9438
9439> **说明:**
9440>
9441> - avoidHeight有效值区间为[0, Web组件高度],超出有效值区间时取边界值。
9442> - 该接口高度设置为非0时,Web组件位置和尺寸不变,可视视口向上避让avoidHeight,表现为Web网页内容抬升avoidHeight。该接口一般用于应用自定义网页底部避让区,不建议和点击web网页可编辑区拉起键盘的场景同时使用。同时使用时,键盘弹起避让模式将使用OVERLAYS_CONTENT。
9443> - 该接口高度设置为0时,Web网页内容可恢复,键盘弹起避让模式将使用[keyboardAvoidMode()](./arkts-basic-components-web-attributes.md#keyboardavoidmode12)声明的模式。
9444
9445**系统能力:** SystemCapability.Web.Webview.Core
9446
9447**参数:**
9448
9449| 参数名 | 类型 | 必填 | 说明               |
9450| ------ | -------- | ---- | ---------------------- |
9451| avoidHeight   | number   | 是   | 设置Web网页可视视口底部避让高度。<br>默认值:0<br>单位:vp<br>合法取值范围:0~Web组件高度<br>非法值设置行为:超出合法取值范围时取边界值。 |
9452
9453**错误码:**
9454
9455以下错误码的详细介绍请参见[webview错误码](errorcode-webview.md)。
9456
9457| 错误码ID | 错误信息                                                     |
9458| -------- | ------------------------------------------------------------ |
9459| 17100001 | Init error. The WebviewController must be associated with a Web component. |
9460| 801 | Capability not supported. |
9461
9462**示例:**
9463
9464```ts
9465// xxx.ets
9466import { webview } from '@kit.ArkWeb';
9467import { BusinessError } from '@kit.BasicServicesKit';
9468
9469@Entry
9470@Component
9471struct WebComponent {
9472  controller: webview.WebviewController = new webview.WebviewController();
9473  avoidHeight: number = 100;
9474
9475  build() {
9476    Column() {
9477      Button('avoid')
9478        .onClick(() => {
9479          try {
9480            this.controller.avoidVisibleViewportBottom(this.avoidHeight);
9481          } catch (error) {
9482            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
9483          }
9484        })
9485      Button('reset')
9486        .onClick(() => {
9487          try {
9488            this.controller.avoidVisibleViewportBottom(0);
9489          } catch (error) {
9490            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
9491          }
9492        })
9493      Web({ src: 'www.example.com', controller: this.controller })
9494    }
9495  }
9496}
9497```
9498
9499## setErrorPageEnabled<sup>20+</sup>
9500
9501setErrorPageEnabled(enable: boolean): void
9502
9503设置是否启用默认错误页。
9504
9505在当前接口设置为true时如果页面加载发生错误将触发[onOverrideErrorPage](./arkts-basic-components-web-events.md#onoverrideerrorpage20)回调,可在该回调接口中设置自定义的错误展示页面。
9506
9507**系统能力:** SystemCapability.Web.Webview.Core
9508
9509**参数:**
9510
9511| 参数名   | 类型    | 必填 | 说明                      |
9512| -------- | ------- | ---- | -------------------------------------- |
9513| enable | boolean | 是 | 表示是否启用默认错误页。true表示启用,false表示不启用。 |
9514
9515**错误码:**
9516
9517以下错误码的详细介绍请参见[Webview错误码](errorcode-webview.md)。
9518
9519| 错误码ID | 错误信息                                                     |
9520| -------- | ------------------------------------------------------------ |
9521| 17100001 | Init error. The WebviewController must be associated with a Web component. |
9522
9523**示例:**
9524
9525```ts
9526// xxx.ets
9527import { webview } from '@kit.ArkWeb';
9528@Entry
9529@Component
9530struct WebComponent {
9531  controller: webview.WebviewController = new webview.WebviewController();
9532  build() {
9533    Column() {
9534      Web({ src: 'www.example.com', controller: this.controller })
9535       .onControllerAttached(() => {
9536            this.controller.setErrorPageEnabled(true);
9537            if (!this.controller.getErrorPageEnabled()) {
9538                this.controller.setErrorPageEnabled(true);
9539            }
9540        })
9541    }
9542  }
9543}
9544```
9545
9546## getErrorPageEnabled<sup>20+</sup>
9547
9548getErrorPageEnabled(): boolean
9549
9550查询是否启用了默认错误页功能。
9551
9552**系统能力:** SystemCapability.Web.Webview.Core
9553
9554**返回值:**
9555
9556| 类型                 | 说明                      |
9557| -------------------- | ------------------------- |
9558| boolean | 返回是否启用默认错误页功能。<br>true:已启用;false:未启用。 |
9559
9560**错误码:**
9561
9562以下错误码的详细介绍请参见[Webview错误码](errorcode-webview.md)。
9563
9564| 错误码ID | 错误信息                                                     |
9565| -------- | ------------------------------------------------------------ |
9566| 17100001 | Init error. The WebviewController must be associated with a Web component. |
9567
9568**示例:**
9569
9570```ts
9571// xxx.ets
9572import { webview } from '@kit.ArkWeb';
9573@Entry
9574@Component
9575struct WebComponent {
9576  controller: webview.WebviewController = new webview.WebviewController();
9577  build() {
9578    Column() {
9579      Web({ src: 'www.example.com', controller: this.controller })
9580       .onControllerAttached(() => {
9581            this.controller.setErrorPageEnabled(true);
9582            if (!this.controller.getErrorPageEnabled()) {
9583                this.controller.setErrorPageEnabled(true);
9584            }
9585        })
9586    }
9587  }
9588}
9589```
9590
9591## enablePrivateNetworkAccess<sup>20+</sup>
9592
9593static enablePrivateNetworkAccess(enable: boolean): void
9594
9595设置私有网络访问检查功能(Private Network Access)的启用状态。
9596
9597启用后,Web组件将对私有网络请求(如访问本地服务器或内网资源)进行CORS预检。它会先发送OPTIONS预检请求,获取目标服务器的显式授权,然后传输实际数据。禁用此功能将跳过安全检查。
9598
9599**系统能力:** SystemCapability.Web.Webview.Core
9600
9601**参数:**
9602
9603| 参数名   | 类型    | 必填 | 说明                                                     |
9604| -------- | ------- | ---- | -------------------------------------------------------- |
9605| enable | boolean | 是   | 是否启用私有网络访问检查功能开关。true表示启用,false表示禁用。 |
9606
9607**示例:**
9608
9609```ts
9610import { webview } from '@kit.ArkWeb';
9611
9612@Entry
9613@Component
9614struct WebComponent {
9615  controller: webview.WebviewController = new webview.WebviewController();
9616
9617  build() {
9618    Column() {
9619      Web({ src: 'www.example.com', controller: this.controller })
9620        .onControllerAttached(() => {
9621          // 设置为false时ArkWeb将不再检查私有网络请求是否合法
9622          webview.WebviewController.enablePrivateNetworkAccess(false);
9623        })
9624    }
9625  }
9626}
9627```
9628
9629## isPrivateNetworkAccessEnabled<sup>20+</sup>
9630
9631static isPrivateNetworkAccessEnabled(): boolean
9632
9633获取Web组件是否启用了私有网络访问检查功能。
9634
9635**系统能力:** SystemCapability.Web.Webview.Core
9636
9637**返回值:**
9638
9639| 类型    | 说明                                     |
9640| ------- | --------------------------------------- |
9641| boolean | 返回Web组件是否启用了私有网络访问检查功能。true表示已启用;false表示已禁用。 |
9642
9643**示例:**
9644
9645```ts
9646import { webview } from '@kit.ArkWeb';
9647import { BusinessError } from '@kit.BasicServicesKit';
9648
9649@Entry
9650@Component
9651struct WebComponent {
9652  controller: webview.WebviewController = new webview.WebviewController();
9653
9654  build() {
9655    Column() {
9656      Button('isPrivateNetworkAccessEnabled')
9657        .onClick(() => {
9658          try {
9659            let isEnabled: boolean = webview.WebviewController.isPrivateNetworkAccessEnabled();
9660            console.log("isPrivateNetworkAccessEnabled:", isEnabled);
9661          } catch (error) {
9662            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
9663          }
9664        })
9665      Web({ src: 'www.example.com', controller: this.controller })
9666        .onControllerAttached(() => {
9667          // 设置为false时ArkWeb将不再检查私有网络请求是否合法
9668          webview.WebviewController.enablePrivateNetworkAccess(false);
9669        })
9670    }
9671  }
9672}
9673```
9674
9675## getBlanklessInfoWithKey<sup>20+</sup>
9676
9677getBlanklessInfoWithKey(key: string): BlanklessInfo
9678
9679获取页面首屏加载预测信息(详细说明见[BlanklessInfo](./arkts-apis-webview-i.md#blanklessinfo20)),并开始本次加载过渡帧生成,应用根据此信息确定是否需要启用无白屏加载。必须与[setBlanklessLoadingWithKey](#setblanklessloadingwithkey20)接口配套使用,并且必须在触发加载页面的接口之前或在`onLoadIntercept`中调用。需在`WebViewController`与Web组件绑定后才能使用。
9680
9681> **说明:**
9682>
9683> - 持久缓存容量:默认大小为30MB(约30页),可以通过接口[setBlanklessLoadingCacheCapacity](#setblanklessloadingcachecapacity20)设置缓存容量,具体见该接口说明。超过容量时根据LRU(Least Recently Used,淘汰不常用缓存的策略)机制更新缓存。自动清理超过7天的持久缓存数据,缓存清除后第三次加载页面开始有优化效果。
9684> - 如果发现快照相似度(即[BlanklessInfo](./arkts-apis-webview-i.md#blanklessinfo20)中的similarity)极低,请确认key值是否传递正确。
9685> - 调用本接口后,将启用页面加载快照检测及生成过渡帧计算,会产生一定的资源开销。
9686> - 启用无白屏加载的页面会带来一定的资源开销,开销的大小与Web组件的分辨率相关。假设分辨率的宽度和高度分别为:w, h。页面在打开阶段会增加峰值内存,增加约12*w*h B,页面打开后内存回收,不影响稳态内存。增加固态应用缓存的大小,每个页面增加的缓存约w*h/10 B,缓存位于应用缓存的位置。
9687> - 请在module.json5中添加权限: ohos.permission.INTERNETohos.permission.GET_NETWORK_INFO,具体权限的添加方法请参考[在配置文件中声明权限](../../security/AccessToken/declare-permissions.md#在配置文件中声明权限)。
9688
9689**系统能力:** SystemCapability.Web.Webview.Core
9690
9691**设备行为差异:** 该接口在Phone中可正常调用,在其他设备类型中返回801错误码。
9692
9693**参数:**
9694
9695| 参数名   | 类型    | 必填 | 说明                      |
9696| -------- | ------- | ---- | -------------------------------------- |
9697| key | string | 是 | 唯一标识本页面的key值。<br>合法取值范围:非空,长度不超过2048个字符。<br>设置非法值时不生效。 |
9698
9699**返回值:**
9700
9701| 类型                 | 说明                      |
9702| -------------------- | ------------------------- |
9703| [BlanklessInfo](./arkts-apis-webview-i.md#blanklessinfo20) | 页面首屏加载预测信息,主要包括首屏相似度预测值,首屏加载耗时预测值,应用需根据此信息来决策是否启用无白屏加载插帧。 |
9704
9705**错误码:**
9706
9707以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)。
9708
9709| 错误码ID | 错误信息                                                     |
9710| -------- | ------------------------------------------------------------ |
9711|  801     | Capability not supported. |
9712
9713**示例:**
9714
9715```ts
9716import { webview } from '@kit.ArkWeb';
9717import { BusinessError } from '@kit.BasicServicesKit';
9718
9719@Entry
9720@Component
9721struct WebComponent {
9722  controller: webview.WebviewController = new webview.WebviewController();
9723  build() {
9724    Column() {
9725      Web({ src: 'https://www.example.com', controller: this.controller })
9726       .javaScriptAccess(true)
9727       .onLoadIntercept((event) => {
9728            // 当相似度超过50%,加载耗时小于1000ms时启用插帧,否则不启用。
9729            try {
9730              let info = this.controller.getBlanklessInfoWithKey('https://www.example.com/page1');
9731              if (info.errCode == webview.WebBlanklessErrorCode.SUCCESS) {
9732                if (info.similarity >= 0.5 && info.loadingTime < 1000) {
9733                  this.controller.setBlanklessLoadingWithKey('http://www.example.com/page1', true);
9734                } else {
9735                  this.controller.setBlanklessLoadingWithKey('http://www.example.com/page1', false);
9736                }
9737              } else {
9738                console.log('getBlankless info err');
9739              }
9740            } catch (error) {
9741              console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
9742            }
9743            return false;
9744        })
9745    }
9746  }
9747}
9748```
9749
9750## setBlanklessLoadingWithKey<sup>20+</sup>
9751
9752setBlanklessLoadingWithKey(key: string, is_start: boolean): WebBlanklessErrorCode
9753
9754设置无白屏加载是否启用,本接口必须与[getBlanklessInfoWithKey](#getblanklessinfowithkey20)接口配套使用。
9755
9756> **说明:**
9757>
9758> - 需在触发页面加载的接口之后调用,其他约束同[getBlanklessInfoWithKey](#getblanklessinfowithkey20)。
9759> - 页面加载必须在调用本接口的组件中进行。
9760> - 当相似度较低时,系统将判定为跳变过大,启用插帧会失败。
9761> - 请在module.json5中添加权限: ohos.permission.INTERNETohos.permission.GET_NETWORK_INFO,具体权限的添加方法请参考[在配置文件中声明权限](../../security/AccessToken/declare-permissions.md#在配置文件中声明权限)。
9762
9763**系统能力:** SystemCapability.Web.Webview.Core
9764
9765**参数:**
9766
9767| 参数名   | 类型    | 必填 | 说明                      |
9768| -------- | ------- | ---- | -------------------------------------- |
9769| key | string | 是 | 唯一标识本页面的key值。必须与getBlanklessInfoWithKey接口的key值相同。<br>合法取值范围:非空,长度不超过2048个字符。<br>非法值设置行为:返回错误码WebBlanklessErrorCode,方案不生效。 |
9770| is_start | boolean | 是 | 是否启用开始插帧。true:启用,false:不启用。<br>默认值:false |
9771
9772**返回值:**
9773
9774| 类型                 | 说明                      |
9775| -------------------- | ------------------------- |
9776| [WebBlanklessErrorCode](./arkts-apis-webview-e.md#webblanklesserrorcode20) | 返回接口调用是否成功,具体见[WebBlanklessErrorCode](./arkts-apis-webview-e.md#webblanklesserrorcode20)定义。 |
9777
9778**错误码:**
9779
9780以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)。
9781
9782| 错误码ID | 错误信息                                                     |
9783| -------- | ------------------------------------------------------------ |
9784|  801     | Capability not supported. |
9785
9786**示例:**
9787
9788```ts
9789import { webview } from '@kit.ArkWeb';
9790import { BusinessError } from '@kit.BasicServicesKit';
9791
9792@Entry
9793@Component
9794struct WebComponent {
9795  controller: webview.WebviewController = new webview.WebviewController();
9796  build() {
9797    Column() {
9798      Web({ src: 'https://www.example.com', controller: this.controller })
9799       .javaScriptAccess(true)
9800       .onLoadIntercept((event) => {
9801            // 当相似度超过50%,加载耗时小于1000ms时启用插帧,否则不启用。
9802            try {
9803              let info = this.controller.getBlanklessInfoWithKey('https://www.example.com/page1');
9804              if (info.errCode == webview.WebBlanklessErrorCode.SUCCESS) {
9805                if (info.similarity >= 0.5 && info.loadingTime < 1000) {
9806                  this.controller.setBlanklessLoadingWithKey('http://www.example.com/page1', true);
9807                } else {
9808                  this.controller.setBlanklessLoadingWithKey('http://www.example.com/page1', false);
9809                }
9810              } else {
9811                console.log('getBlankless info err');
9812              }
9813            } catch (error) {
9814              console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
9815            }
9816            return false;
9817        })
9818    }
9819  }
9820}
9821```
9822
9823## clearBlanklessLoadingCache<sup>20+</sup>
9824
9825static clearBlanklessLoadingCache(keys?: Array\<string\>): void
9826
9827清除指定key值页面无白屏优化缓存,本接口只清除缓存。
9828
9829在小程序或Web应用场景中,当页面加载时内容变化显著,可能会出现一次明显的跳变。若对此跳变有所顾虑,可使用该接口清除页面缓存。
9830
9831> **说明:**
9832>
9833> - 清除之后的页面,需在第三次加载页面时才会产生优化效果。
9834
9835**系统能力:** SystemCapability.Web.Webview.Core
9836
9837**参数:**
9838
9839| 参数名   | 类型    | 必填 | 说明                      |
9840| -------- | ------- | ---- | -------------------------------------- |
9841| keys | Array\<string\> | 否 | 清除Blankless优化方案页面的key值列表,key值为[getBlanklessInfoWithKey](#getblanklessinfowithkey20)中指定过的。<br>默认值:所有Blankless优化方案缓存的页面key列表。<br>合法取值范围:长度不超过2048,key列表长度<=100。key和加载页面时输入给ArkWeb的相同。<br>非法值设置行为:key长度超过2048时该key不生效;长度超过100时,取前100个;当为空时,使用默认值。 |
9842
9843**错误码:**
9844
9845以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)。
9846
9847| 错误码ID | 错误信息                                                     |
9848| -------- | ------------------------------------------------------------ |
9849|  801     | Capability not supported. |
9850
9851**示例:**
9852
9853```ts
9854import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
9855import { webview } from '@kit.ArkWeb';
9856import { BusinessError } from '@kit.BasicServicesKit';
9857
9858export default class EntryAbility extends UIAbility {
9859  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
9860    console.log("EntryAbility onCreate");
9861    // 假设应用的Web页面在2025/06/10会进行大幅改动,例如商品促销活动等,该提案清除白屏插帧优化缓存
9862    webview.WebviewController.initializeWebEngine();
9863    let pageUpdateTime: number = Date.UTC(2025, 5, 10, 0, 0, 0, 0);
9864    let pageUpdateTime1: number = Date.UTC(2025, 5, 11, 0, 0, 0, 0);
9865    let pageUpdateTimeNow: number = Date.now();
9866    if (pageUpdateTimeNow > pageUpdateTime && pageUpdateTime < pageUpdateTime1) {
9867      // 清除指定页面的白屏插帧方案缓存
9868      try {
9869        webview.WebviewController.clearBlanklessLoadingCache(["https://www.example.com", "https://www.example1.com"]);
9870      } catch (error) {
9871        console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
9872      }
9873    }
9874    AppStorage.setOrCreate("abilityWant", want);
9875    console.log("EntryAbility onCreate done");
9876  }
9877}
9878```
9879
9880## setBlanklessLoadingCacheCapacity<sup>20+</sup>
9881
9882static setBlanklessLoadingCacheCapacity(capacity: number): number
9883
9884设置无白屏加载方案的持久化缓存容量,返回实际生效值。默认缓存容量为30MB,最大值为100MB。当实际缓存超过容量时,将采用淘汰不常用的过渡帧的方式清理。
9885
9886**系统能力:** SystemCapability.Web.Webview.Core
9887
9888**参数:**
9889
9890| 参数名   | 类型    | 必填 | 说明                      |
9891| -------- | ------- | ---- | -------------------------------------- |
9892| capacity | number | 是 | 设置持久化缓存设置,单位MB,最大设置不超过100MB。<br>默认值:30MB。<br>合法取值范围:0~100,当设置为0时,无缓存空间,则功能全局不开启。<br>非法值设置行为:小于0时生效值为0,大于100时生效值为100。 |
9893
9894**返回值:**
9895
9896| 类型                 | 说明                      |
9897| -------------------- | ------------------------- |
9898| number | 返回实际生效的容量值,范围0~100。<br>小于0时生效值为0,大于100时生效值为100。 |
9899
9900**错误码:**
9901
9902以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)。
9903
9904| 错误码ID | 错误信息                                                     |
9905| -------- | ------------------------------------------------------------ |
9906|  801     | Capability not supported. |
9907
9908**示例:**
9909
9910```ts
9911import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
9912import { webview } from '@kit.ArkWeb';
9913import { BusinessError } from '@kit.BasicServicesKit';
9914
9915export default class EntryAbility extends UIAbility {
9916  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
9917    console.log("EntryAbility onCreate");
9918    webview.WebviewController.initializeWebEngine();
9919    // 设置缓存容量为10MB
9920    try {
9921      webview.WebviewController.setBlanklessLoadingCacheCapacity(10);
9922    } catch (error) {
9923      console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
9924    }
9925    AppStorage.setOrCreate("abilityWant", want);
9926    console.log("EntryAbility onCreate done");
9927  }
9928}
9929```
9930
9931## setWebDestroyMode<sup>20+</sup>
9932
9933setWebDestroyMode(mode: WebDestroyMode): void
9934
9935设置Web组件的销毁模式。当Web组件销毁时,销毁模式会影响Web内核资源释放的时机,例如JavaScript运行上下文、渲染上下文等。默认值:[WebDestroyMode.NORMAL_MODE](./arkts-apis-webview-e.md#webdestroymode20)(普通模式),由系统决定销毁时机。应用可设置[WebDestroyMode.FAST_MODE](./arkts-apis-webview-e.md#webdestroymode20)(快速模式),以立即销毁资源,从而提升特定场景的性能。
9936
9937> **说明:**
9938>
9939> [WebDestroyMode.FAST_MODE](./arkts-apis-webview-e.md#webdestroymode20)(快速模式)会改变Web组件销毁时机,应用需关注依赖Web组件销毁时机的错误实现,例如:Web组件销毁后仍调用WebviewController的未定义行为,与[WebDestroyMode.NORMAL_MODE](./arkts-apis-webview-e.md#webdestroymode20)(普通模式)相比,销毁时机提前,有更高的几率触发未关联绑定的异常(17100001),建议应用捕捉异常,或者通过[getAttachState](#getattachstate20)方法查询是否绑定状态,来避免稳定性问题。
9940
9941**系统能力:** SystemCapability.Web.Webview.Core
9942
9943**参数:**
9944
9945| 参数名   | 类型    | 必填 | 说明                      |
9946| -------- | ------- | ---- | -------------------------------------- |
9947| mode | [WebDestroyMode](./arkts-apis-webview-e.md#webdestroymode20) | 是 | 设置Web组件的销毁模式。<br>默认值:WebDestroyMode.NORMAL_MODE |
9948
9949**示例:**
9950
9951```ts
9952import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
9953import { webview } from '@kit.ArkWeb';
9954
9955export default class EntryAbility extends UIAbility {
9956  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
9957    console.info("EntryAbility onCreate");
9958    webview.WebviewController.initializeWebEngine();
9959    // 设置快速销毁模式
9960    webview.WebviewController.setWebDestroyMode(webview.WebDestroyMode.FAST_MODE);
9961    AppStorage.setOrCreate("abilityWant", want);
9962    console.info("EntryAbility onCreate done");
9963  }
9964}
9965```
9966
9967## setActiveWebEngineVersion<sup>20+</sup>
9968
9969static setActiveWebEngineVersion(engineVersion: ArkWebEngineVersion): void
9970
9971设置ArkWeb内核版本。若系统不支持指定版本,则设置无效。该接口为全局静态API,须在调用initializeWebEngine前执行,若已加载任何Web组件,则该设置无效。
9972
9973**遗留内核适配:**
9974
9975在OpenHarmony 6.0及以后,使用遗留内核时,部分ArkWeb接口不会生效,参考[M114内核在OpenHarmony6.0系统上的适配指导](https://gitcode.com/openharmony-tpc/chromium_src/blob/132_trunk/web/ReleaseNote/CompatibleWithLegacyWebEngine.md)9976
9977> **说明:**
9978>
9979> - setActiveWebEngineVersion不支持在异步线程中调用。
9980> - setActiveWebEngineVersion全局生效,在整个APP生命周期中调用一次即可,不需要重复调用。
9981
9982**系统能力:** SystemCapability.Web.Webview.Core
9983
9984**参数:**
9985
9986| 参数名              | 类型    | 必填   |  说明 |
9987| ------------------ | ------- | ---- | ------------- |
9988| engineVersion         |   [ArkWebEngineVersion](./arkts-apis-webview-e.md#arkwebengineversion20)   | 是   | ArkWeb内核版本。 |
9989
9990**示例:**
9991
9992本示例以EntryAbility为例,实现了在Ability创建阶段设置ArkWeb内核版本的功能。
9993
9994```ts
9995// xxx.ets
9996import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
9997import { webview } from '@kit.ArkWeb';
9998
9999export default class EntryAbility extends UIAbility {
10000  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
10001    console.log("EntryAbility onCreate")
10002    webview.WebviewController.setActiveWebEngineVersion(webview.ArkWebEngineVersion.M114)
10003    if (webview.WebviewController.getActiveWebEngineVersion() == webview.ArkWebEngineVersion.M114) {
10004      console.log("Active Web Engine Version set to M114")
10005    }
10006    console.log("EntryAbility onCreate done")
10007  }
10008}
10009```
10010
10011## getActiveWebEngineVersion<sup>20+</sup>
10012
10013static getActiveWebEngineVersion(): ArkWebEngineVersion
10014
10015获取当前ArkWeb内核版本。
10016
10017**系统能力:** SystemCapability.Web.Webview.Core
10018
10019**返回值:**
10020
10021| 类型    | 说明                              |
10022| ------- | --------------------------------- |
10023| [ArkWebEngineVersion](./arkts-apis-webview-e.md#arkwebengineversion20) | 返回由[ArkWebEngineVersion](./arkts-apis-webview-e.md#arkwebengineversion20)所定义的当前使用的ArkWeb内核版本。 |
10024
10025**示例:**
10026
10027请参考[setActiveWebEngineVersion](#setactivewebengineversion20)。