From cac4c39e11a3f8388522d49c073d0c57e5a7a720 Mon Sep 17 00:00:00 2001 From: shawn_he Date: Thu, 4 May 2023 10:43:33 +0800 Subject: [PATCH] update doc Signed-off-by: shawn_he --- .../dfx/errormanager-guidelines.md | 10 +- en/application-dev/web/Readme-EN.md | 17 ++ .../web/figures/debug-effect.png | Bin 0 -> 48322 bytes .../web/figures/resource-path.png | Bin 0 -> 21832 bytes .../web/web-app-page-data-channel.md | 143 ++++++++++++++++ .../web/web-component-overview.md | 14 ++ .../web/web-cookie-and-data-storage-mgmt.md | 131 +++++++++++++++ .../web/web-debugging-with-devtools.md | 45 +++++ en/application-dev/web/web-file-upload.md | 52 ++++++ .../web/web-geolocation-permission.md | 73 ++++++++ ...-in-app-frontend-page-function-invoking.md | 48 ++++++ .../web/web-in-page-app-function-invoking.md | 113 +++++++++++++ .../web/web-open-in-new-window.md | 69 ++++++++ .../web-page-loading-with-web-components.md | 140 ++++++++++++++++ ...b-redirection-and-browsing-history-mgmt.md | 157 ++++++++++++++++++ .../web-resource-interception-request-mgmt.md | 70 ++++++++ en/application-dev/web/web-set-dark-mode.md | 50 ++++++ ...ubsys-power-battery-level-customization.md | 13 +- .../subsys-power-level-LED-color.md | 20 ++- 19 files changed, 1153 insertions(+), 12 deletions(-) create mode 100644 en/application-dev/web/Readme-EN.md create mode 100644 en/application-dev/web/figures/debug-effect.png create mode 100644 en/application-dev/web/figures/resource-path.png create mode 100644 en/application-dev/web/web-app-page-data-channel.md create mode 100644 en/application-dev/web/web-component-overview.md create mode 100644 en/application-dev/web/web-cookie-and-data-storage-mgmt.md create mode 100644 en/application-dev/web/web-debugging-with-devtools.md create mode 100644 en/application-dev/web/web-file-upload.md create mode 100644 en/application-dev/web/web-geolocation-permission.md create mode 100644 en/application-dev/web/web-in-app-frontend-page-function-invoking.md create mode 100644 en/application-dev/web/web-in-page-app-function-invoking.md create mode 100644 en/application-dev/web/web-open-in-new-window.md create mode 100644 en/application-dev/web/web-page-loading-with-web-components.md create mode 100644 en/application-dev/web/web-redirection-and-browsing-history-mgmt.md create mode 100644 en/application-dev/web/web-resource-interception-request-mgmt.md create mode 100644 en/application-dev/web/web-set-dark-mode.md diff --git a/en/application-dev/dfx/errormanager-guidelines.md b/en/application-dev/dfx/errormanager-guidelines.md index 4679cfcfc7..8509fff09e 100644 --- a/en/application-dev/dfx/errormanager-guidelines.md +++ b/en/application-dev/dfx/errormanager-guidelines.md @@ -23,7 +23,8 @@ When an asynchronous callback is used, the return value can be processed directl | API | Description | | ------------------------------ | ------------------------------------------------------------ | -| onUnhandledException(errMsg: string): void | Called when an application generates an uncaught exception after being registered.| +| onUnhandledException(errMsg: string): void | Called when an uncaught exception is reported after the application is registered.| +| onException?(errObject: Error): void | Called when an application exception is reported to the JavaScript layer after the application is registered.| ### Result Codes for Unregistering an Observer @@ -43,6 +44,13 @@ let registerId = -1; let callback = { onUnhandledException: function (errMsg) { console.log(errMsg); + }, + onException: function (errorObj) { + console.log('onException, name: ', errorObj.name); + console.log('onException, message: ', errorObj.message); + if (typeof(errorObj.stack) === 'string') { + console.log('onException, stack: ', errorObj.stack); + } } } diff --git a/en/application-dev/web/Readme-EN.md b/en/application-dev/web/Readme-EN.md new file mode 100644 index 0000000000..e003a42ecd --- /dev/null +++ b/en/application-dev/web/Readme-EN.md @@ -0,0 +1,17 @@ +# Web + +- [Web Component Overview](web-component-overview.md) +- [Loading Pages by Using the Web Component](web-page-loading-with-web-components.md) +- Setting Basic Attributes and Events + - [Setting the Dark Mode](web-set-dark-mode.md) + - [Uploading Files](web-file-upload.md) + - [Opening Pages in a New Window](web-open-in-new-window.md) + - [Managing Location Permissions](web-geolocation-permission.md) +- Using Frontend Page JavaScript Code on the Application + - [Invoking Frontend Page Functions on the Application](web-in-app-frontend-page-function-invoking.md) + - [Invoking Application Functions on the Frontend Page](web-in-page-app-function-invoking.md) + - [Establishing a Data Channel Between the Application and Frontend Page](web-app-page-data-channel.md) +- [Managing Page Redirection and Browsing History Navigation](web-redirection-and-browsing-history-mgmt.md) +- [Managing Cookies and Data Storage](web-cookie-and-data-storage-mgmt.md) +- [Customizing Page Request Responses](web-resource-interception-request-mgmt.md) +- [Debugging Frontend Pages by Using DevTools](web-debugging-with-devtools.md) diff --git a/en/application-dev/web/figures/debug-effect.png b/en/application-dev/web/figures/debug-effect.png new file mode 100644 index 0000000000000000000000000000000000000000..32c46cadbb99a6623532f50d14fa0750854c9a5d GIT binary patch literal 48322 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�qEo_{IguGkdOWC{ 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 { + this.sendFromEts = value; + }) + + Button('postMessage') + .onClick(() => { + try { + // 1. Create two message ports. + this.ports = this.controller.createWebMessagePorts(); + // 2. Register a callback for the message port (for example, port 1) on the application. + this.ports[1].onMessageEvent((result: web_webview.WebMessage) => { + let msg = 'Got msg from HTML:'; + if (typeof(result) === 'string') { + console.info(`received string message from html5, string is: ${result}`); + msg = msg + result; + } else if (typeof(result) === 'object') { + if (result instanceof ArrayBuffer) { + console.info(`received arraybuffer from html5, length is: ${result.byteLength}`); + msg = msg + 'lenght is ' + result.byteLength; + } else { + console.info('not support'); + } + } else { + console.info('not support'); + } + this.receivedFromHtml = msg; + }) + // 3. Send the other message port (for example, port 0) to the HTML side, which then saves the message port. + this.controller.postMessage('__init_port__', [this.ports[0]], '*'); + } catch (error) { + console.error(`ErrorCode: ${error.code}, Message: ${error.message}`); + } + }) + + // 4. Use the message port on the application to send messages to the message port that has been sent to the HTML side. + Button('SendDataToHTML') + .onClick(() => { + try { + if (this.ports && this.ports[1]) { + this.ports[1].postMessageEvent(this.sendFromEts); + } else { + console.error(`ports is null, Please initialize first`); + } + } catch (error) { + console.error(`ErrorCode: ${error.code}, Message: ${error.message}`); + } + }) + Web({ src: $rawfile('xxx.html'), controller: this.controller }) + } + } + } + ``` + +- Frontend page code: + + ```html + + + + + + WebView Message Port Demo + + + + + +

WebView Message Port Demo

+
+
+
+
+

display received message send from ets

+ + + ``` diff --git a/en/application-dev/web/web-component-overview.md b/en/application-dev/web/web-component-overview.md new file mode 100644 index 0000000000..187661ee6c --- /dev/null +++ b/en/application-dev/web/web-component-overview.md @@ -0,0 +1,14 @@ +# Web Component Overview + + +In addition to displaying web page content on applications, the **Web** component provides you with some other helpful functions, including: + + +- **Page loading**: provides a full set of basic frontend page loading capabilities, which allow you to load network pages, local pages, and HTML text data. + +- **Page interaction**: supports a wide range of page interaction modes, which allow you to set the dark mode for frontend pages, load pages in a new window, manage location permissions and cookies, and use frontend page JavaScript code on the application. + +- **Page debugging**: uses DevTools to debug frontend pages. + + +To help you better understand the features of the **Web** component, the following sections will exemplify use of the **Web** component in common application scenarios. diff --git a/en/application-dev/web/web-cookie-and-data-storage-mgmt.md b/en/application-dev/web/web-cookie-and-data-storage-mgmt.md new file mode 100644 index 0000000000..e5d402724d --- /dev/null +++ b/en/application-dev/web/web-cookie-and-data-storage-mgmt.md @@ -0,0 +1,131 @@ +# Managing Cookies and Data Storage + + +## Cookie Management + +A cookie is a segment of data sent from the server to the client to uniquely identify a user during network access. The client may hold the data and provide it to the server at later interactions so that the server can quickly identify the client identity and status. + +The **Web** component provides the **WebCookieManager** class for you to manage cookie information, which is stored in the **/proc/{pid}/root/data/storage/el2/base/cache/web/Cookiesd** file in the application sandbox path. + +The following uses [setCookie()](../reference/apis/js-apis-webview.md#setcookie) as an example to describe how to set a cookie's value to **test** for **www.example.com**. For details about functions and usage of other APIs, see [WebCookieManager()](../reference/apis/js-apis-webview.md#webcookiemanager). + + +```ts +// xxx.ets +import web_webview from '@ohos.web.webview'; + +@Entry +@Component +struct WebComponent { + controller: web_webview.WebviewController = new web_webview.WebviewController(); + + build() { + Column() { + Button('setCookie') + .onClick(() => { + try { + web_webview.WebCookieManager.setCookie('https://www.example.com', 'value=test'); + } catch (error) { + console.error(`ErrorCode: ${error.code}, Message: ${error.message}`); + } + }) + Web({ src: 'www.example.com', controller: this.controller }) + } + } +} +``` + + +## Cache and Storage Management + +Network resource requests are relatively time-consuming during website access. You can use store resources locally by means of cache and Dom Storage to fasten the access to the same website. + + +### Cache + +Use [cacheMode()](../reference/arkui-ts/ts-basic-components-web.md#cachemode) to configure the cache mode for page resources. Four cache modes are supported: + +- **Default**: Page resources in a cache that has not expired are preferentially used. If the cache does not exist, page resources are obtained from the network. + +- **None**: Page resources are loaded from the cache. If the cache does not exist, page resources are obtained from the network. + +- **Online**: Page resources are not loaded from the cache. All resources are obtained from the network. + +- **Only**: Page resources are only loaded from the cache. + + +In the following example, the cache mode is set to **None**. + + + +```ts +// xxx.ets +import web_webview from '@ohos.web.webview'; + +@Entry +@Component +struct WebComponent { + @State mode: CacheMode = CacheMode.None; + controller: web_webview.WebviewController = new web_webview.WebviewController(); + build() { + Column() { + Web({ src: 'www.example.com', controller: this.controller }) + .cacheMode(this.mode) + } + } +} +``` + + + To obtain up-to-date resources, you can use [removeCache()](../reference/apis/js-apis-webview.md#removecache) to clear cached resources. The sample code is as follows: + +```ts +// xxx.ets +import web_webview from '@ohos.web.webview'; + +@Entry +@Component +struct WebComponent { + @State mode: CacheMode = CacheMode.None; + controller: web_webview.WebviewController = new web_webview.WebviewController(); + build() { + Column() { + Button('removeCache') + .onClick(() => { + try { + // If this parameter is set to true, the cache in both the ROM and RAM is cleared. If this parameter is set to false, only the cache in the RAM is cleared. + this.controller.removeCache(true); + } catch (error) { + console.error(`ErrorCode: ${error.code}, Message: ${error.message}`); + } + }) + Web({ src: 'www.example.com', controller: this.controller }) + .cacheMode(this.mode) + } + } +} +``` + + +### Dom Storage + +Dom Storage falls into Session Storage and Local Storage. Wherein, Session Storage applies to the temporary data, and its data storage and release follow the session lifecycle; Local Storage applies to the persistent data, which is flushed to the application directory. In both storage modes, data is stored in a form of key-value pair, and is usually used when a page that needs to be stored on the client is accessed. You can use [domStorageAccess()](../reference/arkui-ts/ts-basic-components-web.md#domstorageaccess) to enable Dom Storage. The following is the sample code: + + + +```ts +// xxx.ets +import web_webview from '@ohos.web.webview'; + +@Entry +@Component +struct WebComponent { + controller: web_webview.WebviewController = new web_webview.WebviewController(); + build() { + Column() { + Web({ src: 'www.example.com', controller: this.controller }) + .domStorageAccess(true) + } + } +} +``` diff --git a/en/application-dev/web/web-debugging-with-devtools.md b/en/application-dev/web/web-debugging-with-devtools.md new file mode 100644 index 0000000000..3a38a48ab1 --- /dev/null +++ b/en/application-dev/web/web-debugging-with-devtools.md @@ -0,0 +1,45 @@ +# Debugging Frontend Pages by Using DevTools + + +The **Web** component supports debugging of web frontend pages by using DevTools, a web frontend development and debugging tool that allows you to debug an application's frontend pages on a PC. Before you do this, use [setWebDebuggingAccess()](../reference/apis/js-apis-webview.md#setwebdebuggingaccess) to enable frontend page debugging for the **Web** component. + + +To use DevTools for frontend page debugging, perform the following steps: + + +1. Enable web frontend page debugging in the application code. + + ```ts + // xxx.ets + import web_webview from '@ohos.web.webview'; + + @Entry + @Component + struct WebComponent { + controller: web_webview.WebviewController = new web_webview.WebviewController(); + aboutToAppear() { + // Enable web frontend page debugging. + web_webview.WebviewController.setWebDebuggingAccess(true); + } + build() { + Column() { + Web({ src: 'www.example.com', controller: this.controller }) + } + } + } + ``` + +2. Connect your device to a PC, and configure port mapping on the PC as follows: + + ``` + // Configure port mapping. + hdc fport tcp:9222 tcp:9222 + // View port mapping. + hdc fport ls + ``` + +3. Enter **chrome://inspect/\#devices** in the address box of the Chrome browser on the PC. Once the device is identified, you can get started with page debugging. The debugging effect is as follows: + + **Figure 1** Page debugging effect + + ![debug-effect](figures/debug-effect.png) diff --git a/en/application-dev/web/web-file-upload.md b/en/application-dev/web/web-file-upload.md new file mode 100644 index 0000000000..e06f0345b2 --- /dev/null +++ b/en/application-dev/web/web-file-upload.md @@ -0,0 +1,52 @@ +# Uploading Files + + +The **Web** component supports file uploading on a frontend page. You can use [onShowFileSelector()](../reference/arkui-ts/ts-basic-components-web.md#onshowfileselector9) to process file upload requests sent from a frontend page. + + +In the following example, when a user clicks the **Upload** button on the frontend page, the application receives a file upload request through [onShowFileSelector()](../reference/arkui-ts/ts-basic-components-web.md#onshowfileselector9), which carries the path of the local file to be uploaded. + + +- Application code: + + ```ts + // xxx.ets + import web_webview from '@ohos.web.webview'; + @Entry + @Component + struct WebComponent { + controller: WebController = new WebController() + build() { + Column() { + // Load the local.html page. + Web({ src: $rawfile('local.html'), controller: this.controller }) + .onShowFileSelector((event) => { + // Set the path of the local file to be uploaded. + let fileList: Array = [ + 'xxx/test.png', + ] + event.result.handleFileList(fileList) + return true; + }) + } + } + } + ``` + + +- Code of the **local.html** page: + + ```html + + + + + Document + + + + +
+ + + ``` diff --git a/en/application-dev/web/web-geolocation-permission.md b/en/application-dev/web/web-geolocation-permission.md new file mode 100644 index 0000000000..0f157cccaa --- /dev/null +++ b/en/application-dev/web/web-geolocation-permission.md @@ -0,0 +1,73 @@ +# Managing Location Permissions + + +The **Web** component provides the location permission management capability. You can use [onGeolocationShow()](../reference/arkui-ts/ts-basic-components-web.md#ongeolocationshow) to manage the location permission specific to a website. Based on the API response, the **Web** component determines whether to grant the location permission to the frontend page. To obtain the device location, you need to declare the [ohos.permission.LOCATION](../security/accesstoken-guidelines.md) permission. + + +In the following example, when a user clicks the **Get Location** button on the frontend page, the **Web** component notifies the application of the location permission request in a pop-up window. + + +- Frontend page code: + + ```html + + + +

Location information

+ + + + + ``` + + +- Application code: + + ```ts + // xxx.ets + import web_webview from '@ohos.web.webview'; + + @Entry + @Component + struct WebComponent { + controller: web_webview.WebviewController = new web_webview.WebviewController(); + build() { + Column() { + Web({ src:$rawfile('getLocation.html'), controller:this.controller }) + .geolocationAccess(true) + .onGeolocationShow((event) => { // Notification of the location permission request + AlertDialog.show({ + title: 'Location Permission', + message:'Grant access to the device location?', + primaryButton: { + value: 'cancel', + action: () => { + event.geolocation.invoke(event.origin, false, false); // Deny access to the device location. + } + }, + secondaryButton: { + value: 'ok', + action: () => { + event.geolocation.invoke(event.origin, true, false); // Allow access to the device location. + } + }, + cancel: () => { + event.geolocation.invoke(event.origin, false, false); // Deny access to the device location. + } + }) + }) + } + } + } + ``` diff --git a/en/application-dev/web/web-in-app-frontend-page-function-invoking.md b/en/application-dev/web/web-in-app-frontend-page-function-invoking.md new file mode 100644 index 0000000000..66e9ef25c1 --- /dev/null +++ b/en/application-dev/web/web-in-app-frontend-page-function-invoking.md @@ -0,0 +1,48 @@ +# Invoking Frontend Page Functions on the Application + + +You can call [runJavaScript()](../reference/apis/js-apis-webview.md#runjavascript) on an application to call JavaScript functions of frontend pages. + + +In the following example, when a user clicks the **runJavaScript** button on the application, the **htmlTest()** API of the frontend page will be triggered. + + +- Frontend page code: + + ```html + + + + + + + + ``` + + +- Application code: + + ```ts + // xxx.ets + import web_webview from '@ohos.web.webview'; + + @Entry + @Component + struct WebComponent { + webviewController: web_webview.WebviewController = new web_webview.WebviewController(); + + build() { + Column() { + Web({ src: $rawfile('index.html'), controller: this.webviewController}) + Button('runJavaScript') + .onClick(() => { + this.webviewController.runJavaScript('htmlTest()'); + }) + } + } + } + ``` diff --git a/en/application-dev/web/web-in-page-app-function-invoking.md b/en/application-dev/web/web-in-page-app-function-invoking.md new file mode 100644 index 0000000000..6ef1ed5fa8 --- /dev/null +++ b/en/application-dev/web/web-in-page-app-function-invoking.md @@ -0,0 +1,113 @@ +# Invoking Application Functions on the Frontend Page + + +You can use the **Web** component to register application code with frontend pages. After the registration is done, frontend pages can use the registered object names to call application functions. + + +Two methods are available for registering the application code:
Call [javaScriptProxy()](../reference/arkui-ts/ts-basic-components-web.md#javascriptproxy) during **Web** component initialization.
Call [registerJavaScriptProxy()](../reference/apis/js-apis-webview.md#registerjavascriptproxy) after **Web** component initialization. + + +The following example registers the **test()** function with the frontend page. This way, the **test()** function can be triggered and run on the frontend page. + + +- Sample code for using [javaScriptProxy()](../reference/arkui-ts/ts-basic-components-web.md#javascriptproxy): + + ```ts + // xxx.ets + import web_webview from '@ohos.web.webview'; + + @Entry + @Component + struct WebComponent { + webviewController: web_webview.WebviewController = new web_webview.WebviewController(); + // Declare the object to be registered. + testObj = { + test: () => { + return 'ArkTS Hello World!'; + } + } + + build() { + Column() { + // Load the local index.html page. + Web({ src: $rawfile('index.html'), controller: this.webviewController}) + // Inject the object to the web client. + .javaScriptProxy({ + object: this.testObj, + name: "testObjName", + methodList: ["test"], + controller: this.webviewController + }) + } + } + } + ``` + + +- Sample code for using [registerJavaScriptProxy()](../reference/apis/js-apis-webview.md#registerjavascriptproxy): + + ```ts + // xxx.ets + import web_webview from '@ohos.web.webview'; + + @Entry + @Component + struct Index { + webviewController: web_webview.WebviewController = new web_webview.WebviewController(); + testObj = { + test: (data) => { + return "ArkUI Web Component"; + }, + toString: () => { + console.info('Web Component toString'); + } + } + + build() { + Column() { + Button('refresh') + .onClick(() => { + try { + this.webviewController.refresh(); + } catch (error) { + console.error(`Errorcode: ${error.code}, Message: ${error.message}`); + } + }) + Button('Register JavaScript To Window') + .onClick(() => { + try { + this.webviewController.registerJavaScriptProxy(this.testObj, "objName", ["test", "toString"]); + } catch (error) { + console.error(`Errorcode: ${error.code}, Message: ${error.message}`); + } + }) + Web({ src: $rawfile('index.html'), controller: this.webviewController }) + } + } + } + ``` + + > **NOTE** + > + > If you use [registerJavaScriptProxy()](../reference/apis/js-apis-webview.md#registerjavascriptproxy) to register a function, call **[refresh()]**(../reference/apis/js-apis-webview.md#refresh) for the function to take effect. + + +- Sample code for invoking application functions on the **index.htm** frontend page: + + ```html + + + + + +

+ + + + ``` diff --git a/en/application-dev/web/web-open-in-new-window.md b/en/application-dev/web/web-open-in-new-window.md new file mode 100644 index 0000000000..b1162d7788 --- /dev/null +++ b/en/application-dev/web/web-open-in-new-window.md @@ -0,0 +1,69 @@ +# Opening Pages in a New Window + + +The **Web** component provides the capability of opening pages in a new window. You can call [multiWindowAccess()](../reference/arkui-ts/ts-basic-components-web.md#multiwindowaccess9) to specify whether to allow a web page to be opened in a new window. When a new window is opened in the **Web** component, the application will receive a window opening event through [onWindowNew()](../reference/arkui-ts/ts-basic-components-web.md#onwindownew9). You need to add the code for processing the window opening request in the event callback. + + +> **NOTE** +> +> - If [allowWindowOpenMethod()](../reference/arkui-ts/ts-basic-components-web.md#allowwindowopenmethod10) is set to **true**, you can open a new window in the frontend page by invoking its JavaScript functions. +> +> - If you do not want to open a new window in [onWindowNew()](../reference/arkui-ts/ts-basic-components-web.md#onwindownew9), set the return value of [ControllerHandler.setWebController()](../reference/arkui-ts/ts-basic-components-web.md#setwebcontroller9) to **null**. + + +In the following example, when a user clicks the **Open Page in New Window** button, the application receives a window opening event in the [onWindowNew()](../reference/arkui-ts/ts-basic-components-web.md#onwindownew9) callback. + + +- Application code: + + For details about how to create a window, see [Web Development Examples] (https://gitee.com/openharmony/applications_app_samples/tree/master/code/BasicFeature/Web/Browser). + + ```ts + // xxx.ets + import web_webview from '@ohos.web.webview'; + @Entry + @Component + struct WebComponent { + controller: web_webview.WebviewController = new web_webview.WebviewController(); + build() { + Column() { + Web({ src:$rawfile("window.html"), controller: this.controller }) + .multiWindowAccess(true) + .onWindowNew((event) => { + console.info("onWindowNew..."); + var popController: web_webview.WebviewController = new web_webview.WebviewController(); + // Create a window, associate it with popController, and have popController returned to the Web component. If you do not need to open a new window, set the return value to event.handler.setWebController(null). + event.handler.setWebController(popController); + }) + } + } + } + ``` + + +- Code of the **window.html** page: + + ```html + + + + + WindowEvent + + + + + + + + ``` diff --git a/en/application-dev/web/web-page-loading-with-web-components.md b/en/application-dev/web/web-page-loading-with-web-components.md new file mode 100644 index 0000000000..ce80eff340 --- /dev/null +++ b/en/application-dev/web/web-page-loading-with-web-components.md @@ -0,0 +1,140 @@ +# Loading Pages by Using the Web Component + + +Page loading is a basic function of the **Web** component. Depending on the data source, page loading falls into three types: loading of network pages, loading of local pages, and loading of HTML rich text data. + + +If acquisition of network resources is involved in page loading, you need to declare the [ohos.permission.INTERNET](../security/accesstoken-guidelines.md) permission. + + +## Loading Network Pages + +You can specify the default network page to be loaded when creating a **Web** component. After the default network page is loaded, call [loadUrl()](../reference/apis/js-apis-webview.md#loadurl) if you want to change the network page displayed by the **Web** component. + + +In the following example, after the **www.example.com** page is loaded by the **Web** component, **loadUrl** is called to change the displayed page to **www.example1.com**. + + + +```ts +// xxx.ets +import web_webview from '@ohos.web.webview'; + +@Entry +@Component +struct WebComponent { + webviewController: web_webview.WebviewController = new web_webview.WebviewController(); + + build() { + Column() { + Button('loadUrl') + .onClick(() => { + try { + // Upon button clicking, call loadUrl to redirect to www.example1.com. + this.webviewController.loadUrl('www.example1.com'); + } catch (error) { + console.error(`ErrorCode: ${error.code}, Message: ${error.message}`); + } + }) + // When creating a Web component, set the default network page to be loaded to www.example.com. + Web({ src: 'www.example.com', controller: this.webviewController}) + } + } +} +``` + + +## Loading Local Pages + +Local page files are stored in the application's **rawfile** directory. You can specify the local page to be loaded by default when creating a **Web** component. After page loading is complete, you can call [loadUrl()](../reference/apis/js-apis-webview.md#loadurl) to change the displayed page of the **Web** component. + + +The following example shows how to load a local page file. + + +- Local page file in the application's resources/rawfile directory: + + **Figure 1** Path of local page files + + ![resource-path](figures/resource-path.png) + + +- Application code: + + ```ts + // xxx.ets + import web_webview from '@ohos.web.webview'; + + @Entry + @Component + struct WebComponent { + webviewController: web_webview.WebviewController = new web_webview.WebviewController(); + + build() { + Column() { + Button('loadUrl') + .onClick(() => { + try { + // Upon button clicking, call loadUrl to redirect to local1.html. + this.webviewController.loadUrl($rawfile("local1.html")); + } catch (error) { + console.error(`ErrorCode: ${error.code}, Message: ${error.message}`); + } + }) + // When creating a Web component, load the local.html file through $rawfile. + Web({ src: $rawfile("local.html"), controller: this.webviewController }) + } + } + } + ``` + + +- Code of the **local.html** page: + + ```html + + + + +

Hello World

+ + + ``` + + +## Loading HTML Rich Text Data + +The **Web** component provides the [loadData()](../reference/apis/js-apis-webview.md#loaddata) API for you to load HTML rich text data. This API is applicable if you want to display some page sections instead of the entire page. + + + +```ts +// xxx.ets +import web_webview from '@ohos.web.webview'; + +@Entry +@Component +struct WebComponent { + controller: web_webview.WebviewController = new web_webview.WebviewController(); + + build() { + Column() { + Button('loadData') + .onClick(() => { + try { + // Upon button clicking, call loadData to load HTML rich text data. + this.controller.loadData( + 'Source:
source
', + 'text/html', + 'UTF-8' + ); + } catch (error) { + console.error(`ErrorCode: ${error.code}, Message: ${error.message}`); + } + }) + // When creating a Web component, set the default network page to be loaded to www.example.com. + Web({ src: 'www.example.com', controller: this.controller }) + } + } +} +``` diff --git a/en/application-dev/web/web-redirection-and-browsing-history-mgmt.md b/en/application-dev/web/web-redirection-and-browsing-history-mgmt.md new file mode 100644 index 0000000000..6edb18eed1 --- /dev/null +++ b/en/application-dev/web/web-redirection-and-browsing-history-mgmt.md @@ -0,0 +1,157 @@ +# Managing Page Redirection and Browsing History Navigation + + +## History Navigation + +When a user clicks a web page link on the frontend page, the **Web** component automatically opens and loads the target website by default. When the current page is assigned a new loading link, the address of the accessed web page is automatically recorded. You can call [forward()](../reference/apis/js-apis-webview.md#forward) or [backward()](../reference/apis/js-apis-webview.md#backward) to browse the previous or next history record. + + In the following example, when a user clicks the button, **backward()** is called to go back to the previous page. + +```ts +// xxx.ets +import web_webview from '@ohos.web.webview'; + +@Entry +@Component +struct WebComponent { + webviewController: web_webview.WebviewController = new web_webview.WebviewController(); + build() { + Column() { + Button('loadData') + .onClick(() => { + if (this.webviewController.accessBackward()) { + this.webviewController.backward(); + return true; + } + }) + Web({ src: 'https://www.example.com/cn/', controller: this.webviewController}) + } + } +} +``` + + +If a previous record exists, [accessBackward()](../reference/apis/js-apis-webview.md#accessbackward) will return **true**. Similarly, you can call [accessForward()](../reference/apis/js-apis-webview.md#accessforward) to check whether a next record exists. If you skip the check, [forward()](../reference/apis/js-apis-webview.md#forward) and [backward()](../reference/apis/js-apis-webview.md#backward) will not trigger any action if the user has navigated to the end of history records. + + +## Page Redirection + +The **Web** component provides the [onUrlLoadIntercept()](../reference/arkui-ts/ts-basic-components-web.md#onurlloadintercept) API to redirect you from one page to another. + +In the following example, the frontend page **route.html** is loaded on to the application home page **Index.ets**, and the user is redirected to the application page **ProfilePage.ets** when clicking the link on the **route.html** page. + +- Code of the **index.ets** page: + + ```ts + // index.ets + import web_webview from '@ohos.web.webview'; + import router from '@ohos.router'; + @Entry + @Component + struct WebComponent { + webviewController: web_webview.WebviewController = new web_webview.WebviewController(); + + build() { + Column() { + Web({ src: $rawfile('route.html'), controller: this.webviewController }) + .onUrlLoadIntercept((event) => { + let url: string = event.data as string; + if (url.indexOf('native://') === 0) { + // Redirect to another page. + router.pushUrl({ url:url.substring(9) }) + return true; + } + return false; + }) + } + } + } + ``` + +- Code of the **route.html** page: + + ```html + + + + +
+ + + ``` + +- Code of the **ProfilePage.ets** page: + + ```ts + @Entry + @Component + struct ProfilePage { + @State message: string = 'Hello World'; + + build() { + Column() { + Text(this.message) + .fontSize(20) + } + } + } + ``` + + +## Cross-Application Redirection + +The **Web** component supports redirection from one application to another. + +In the following example, when a user clicks the link on the frontend page **call.html**, the user will be redirected to the dial screen of the phone app. + +- Application code: + + ```ts + // xxx.ets + import web_webview from '@ohos.web.webview'; + import call from '@ohos.telephony.call'; + + @Entry + @Component + struct WebComponent { + webviewController: web_webview.WebviewController = new web_webview.WebviewController(); + + build() { + Column() { + Web({ src: $rawfile('xxx.html'), controller: this.webviewController}) + .onUrlLoadIntercept((event) => { + let url: string = event.data as string; + // Check whether the link is redirecting to the dial screen of the phone app. + if (url.indexOf('tel://') === 0) { + // Redirect to the dial screen. + call.makeCall(url.substring(6), (err) => { + if (!err) { + console.info('make call succeeded.'); + } else { + console.info('make call fail, err is:' + JSON.stringify(err)); + } + }); + return true; + } + return false; + }) + } + } + } + ``` + +- Code of the **call.html** page: + + ```html + + + + + + + + ``` diff --git a/en/application-dev/web/web-resource-interception-request-mgmt.md b/en/application-dev/web/web-resource-interception-request-mgmt.md new file mode 100644 index 0000000000..c0e01e9ab2 --- /dev/null +++ b/en/application-dev/web/web-resource-interception-request-mgmt.md @@ -0,0 +1,70 @@ +# Customizing Page Request Responses + + +The **Web** component supports customization of the response to intercepted page requests. You can call [onInterceptRequest()](../reference/arkui-ts/ts-basic-components-web.md#oninterceptrequest9) to customize web page responses, file resource responses, etc. + + +When a resource loading request is initiated on a web page, the application layer will receive the request. The application layer then constructs a local resource response and sends it to the web kernel. On receiving the response, the web kernel parses the response and loads page resources accordingly. + + +In the following example, the **Web** component intercepts the web page request **https://www.intercept.com/test.html** and constructs a custom response in the application code. + + +- Code of the **example.html** page: + + ```html + + + + + example + + +