10826e83eSopenharmony_ci/*
20826e83eSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
30826e83eSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
40826e83eSopenharmony_ci * you may not use this file except in compliance with the License.
50826e83eSopenharmony_ci * You may obtain a copy of the License at
60826e83eSopenharmony_ci *
70826e83eSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
80826e83eSopenharmony_ci *
90826e83eSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
100826e83eSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
110826e83eSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
120826e83eSopenharmony_ci * See the License for the specific language governing permissions and
130826e83eSopenharmony_ci * limitations under the License.
140826e83eSopenharmony_ci */
150826e83eSopenharmony_ci
160826e83eSopenharmony_ci#include "napi_webview_controller.h"
170826e83eSopenharmony_ci
180826e83eSopenharmony_ci#include <arpa/inet.h>
190826e83eSopenharmony_ci#include <cctype>
200826e83eSopenharmony_ci#include <climits>
210826e83eSopenharmony_ci#include <cstdint>
220826e83eSopenharmony_ci#include <regex>
230826e83eSopenharmony_ci#include <securec.h>
240826e83eSopenharmony_ci#include <unistd.h>
250826e83eSopenharmony_ci#include <uv.h>
260826e83eSopenharmony_ci
270826e83eSopenharmony_ci#include "application_context.h"
280826e83eSopenharmony_ci#include "business_error.h"
290826e83eSopenharmony_ci#include "napi_parse_utils.h"
300826e83eSopenharmony_ci#include "native_engine/native_engine.h"
310826e83eSopenharmony_ci#include "nweb.h"
320826e83eSopenharmony_ci#include "nweb_adapter_helper.h"
330826e83eSopenharmony_ci#include "nweb_helper.h"
340826e83eSopenharmony_ci#include "nweb_init_params.h"
350826e83eSopenharmony_ci#include "nweb_log.h"
360826e83eSopenharmony_ci#include "ohos_adapter_helper.h"
370826e83eSopenharmony_ci#include "parameters.h"
380826e83eSopenharmony_ci#include "pixel_map.h"
390826e83eSopenharmony_ci#include "pixel_map_napi.h"
400826e83eSopenharmony_ci#include "web_errors.h"
410826e83eSopenharmony_ci#include "webview_javascript_execute_callback.h"
420826e83eSopenharmony_ci#include "webview_createpdf_execute_callback.h"
430826e83eSopenharmony_ci
440826e83eSopenharmony_ci#include "web_download_delegate.h"
450826e83eSopenharmony_ci#include "web_download_manager.h"
460826e83eSopenharmony_ci#include "arkweb_scheme_handler.h"
470826e83eSopenharmony_ci#include "web_scheme_handler_request.h"
480826e83eSopenharmony_ci
490826e83eSopenharmony_cinamespace OHOS {
500826e83eSopenharmony_cinamespace NWeb {
510826e83eSopenharmony_ciusing namespace NWebError;
520826e83eSopenharmony_ciusing NWebError::NO_ERROR;
530826e83eSopenharmony_ci
540826e83eSopenharmony_cinamespace {
550826e83eSopenharmony_ciconstexpr uint32_t URL_MAXIMUM = 2048;
560826e83eSopenharmony_ciconstexpr uint32_t SOCKET_MAXIMUM = 6;
570826e83eSopenharmony_ciconstexpr char URL_REGEXPR[] = "^http(s)?:\\/\\/.+";
580826e83eSopenharmony_ciconstexpr size_t MAX_RESOURCES_COUNT = 30;
590826e83eSopenharmony_ciconstexpr size_t MAX_RESOURCE_SIZE = 10 * 1024 * 1024;
600826e83eSopenharmony_ciconstexpr size_t MAX_URL_TRUST_LIST_STR_LEN = 10 * 1024 * 1024; // 10M
610826e83eSopenharmony_ciconstexpr double A4_WIDTH = 8.27;
620826e83eSopenharmony_ciconstexpr double A4_HEIGHT = 11.69;
630826e83eSopenharmony_ciconstexpr double SCALE_MIN = 0.1;
640826e83eSopenharmony_ciconstexpr double SCALE_MAX = 2.0;
650826e83eSopenharmony_ciconstexpr double HALF = 2.0;
660826e83eSopenharmony_ciconstexpr double TEN_MILLIMETER_TO_INCH = 0.39;
670826e83eSopenharmony_ciconstexpr size_t BFCACHE_DEFAULT_SIZE = 1;
680826e83eSopenharmony_ciconstexpr size_t BFCACHE_DEFAULT_TIMETOLIVE = 600;
690826e83eSopenharmony_ciusing WebPrintWriteResultCallback = std::function<void(std::string, uint32_t)>;
700826e83eSopenharmony_ci
710826e83eSopenharmony_cibool ParsePrepareUrl(napi_env env, napi_value urlObj, std::string& url)
720826e83eSopenharmony_ci{
730826e83eSopenharmony_ci    napi_valuetype valueType = napi_null;
740826e83eSopenharmony_ci    napi_typeof(env, urlObj, &valueType);
750826e83eSopenharmony_ci
760826e83eSopenharmony_ci    if (valueType == napi_string) {
770826e83eSopenharmony_ci        NapiParseUtils::ParseString(env, urlObj, url);
780826e83eSopenharmony_ci        if (url.size() > URL_MAXIMUM) {
790826e83eSopenharmony_ci            WVLOG_E("The URL exceeds the maximum length of %{public}d", URL_MAXIMUM);
800826e83eSopenharmony_ci            return false;
810826e83eSopenharmony_ci        }
820826e83eSopenharmony_ci
830826e83eSopenharmony_ci        if (!regex_match(url, std::regex(URL_REGEXPR, std::regex_constants::icase))) {
840826e83eSopenharmony_ci            WVLOG_E("ParsePrepareUrl error");
850826e83eSopenharmony_ci            return false;
860826e83eSopenharmony_ci        }
870826e83eSopenharmony_ci
880826e83eSopenharmony_ci        return true;
890826e83eSopenharmony_ci    }
900826e83eSopenharmony_ci
910826e83eSopenharmony_ci    WVLOG_E("Unable to parse type from url object.");
920826e83eSopenharmony_ci    return false;
930826e83eSopenharmony_ci}
940826e83eSopenharmony_ci
950826e83eSopenharmony_cibool ParseIP(napi_env env, napi_value urlObj, std::string& ip)
960826e83eSopenharmony_ci{
970826e83eSopenharmony_ci    napi_valuetype valueType = napi_null;
980826e83eSopenharmony_ci    napi_typeof(env, urlObj, &valueType);
990826e83eSopenharmony_ci
1000826e83eSopenharmony_ci    if (valueType == napi_string) {
1010826e83eSopenharmony_ci        NapiParseUtils::ParseString(env, urlObj, ip);
1020826e83eSopenharmony_ci        if (ip == "") {
1030826e83eSopenharmony_ci            WVLOG_E("The IP is null");
1040826e83eSopenharmony_ci            return false;
1050826e83eSopenharmony_ci        }
1060826e83eSopenharmony_ci
1070826e83eSopenharmony_ci        unsigned char buf[sizeof(struct in6_addr)];
1080826e83eSopenharmony_ci        if ((inet_pton(AF_INET, ip.c_str(), buf) == 1) || (inet_pton(AF_INET6, ip.c_str(), buf) == 1)) {
1090826e83eSopenharmony_ci            return true;
1100826e83eSopenharmony_ci        }
1110826e83eSopenharmony_ci        WVLOG_E("IP error.");
1120826e83eSopenharmony_ci        return false;
1130826e83eSopenharmony_ci    }
1140826e83eSopenharmony_ci
1150826e83eSopenharmony_ci    WVLOG_E("Unable to parse type from ip object.");
1160826e83eSopenharmony_ci    return false;
1170826e83eSopenharmony_ci}
1180826e83eSopenharmony_ci
1190826e83eSopenharmony_cinapi_valuetype GetArrayValueType(napi_env env, napi_value array, bool& isDouble)
1200826e83eSopenharmony_ci{
1210826e83eSopenharmony_ci    uint32_t arrayLength = 0;
1220826e83eSopenharmony_ci    napi_get_array_length(env, array, &arrayLength);
1230826e83eSopenharmony_ci    napi_valuetype valueTypeFirst = napi_undefined;
1240826e83eSopenharmony_ci    napi_valuetype valueTypeCur = napi_undefined;
1250826e83eSopenharmony_ci    for (uint32_t i = 0; i < arrayLength; ++i) {
1260826e83eSopenharmony_ci        napi_value obj = nullptr;
1270826e83eSopenharmony_ci        napi_get_element(env, array, i, &obj);
1280826e83eSopenharmony_ci        napi_typeof(env, obj, &valueTypeCur);
1290826e83eSopenharmony_ci        if (i == 0) {
1300826e83eSopenharmony_ci            valueTypeFirst = valueTypeCur;
1310826e83eSopenharmony_ci        }
1320826e83eSopenharmony_ci        if (valueTypeCur != napi_string && valueTypeCur != napi_number && valueTypeCur != napi_boolean) {
1330826e83eSopenharmony_ci            BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
1340826e83eSopenharmony_ci            return napi_undefined;
1350826e83eSopenharmony_ci        }
1360826e83eSopenharmony_ci        if (valueTypeCur != valueTypeFirst) {
1370826e83eSopenharmony_ci            BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
1380826e83eSopenharmony_ci            return napi_undefined;
1390826e83eSopenharmony_ci        }
1400826e83eSopenharmony_ci        if (valueTypeFirst == napi_number) {
1410826e83eSopenharmony_ci            int32_t elementInt32 = 0;
1420826e83eSopenharmony_ci            double elementDouble = 0.0;
1430826e83eSopenharmony_ci            bool isReadValue32 = napi_get_value_int32(env, obj, &elementInt32) == napi_ok;
1440826e83eSopenharmony_ci            bool isReadDouble = napi_get_value_double(env, obj, &elementDouble) == napi_ok;
1450826e83eSopenharmony_ci            constexpr double MINIMAL_ERROR = 0.000001;
1460826e83eSopenharmony_ci            if (isReadValue32 && isReadDouble) {
1470826e83eSopenharmony_ci                isDouble = abs(elementDouble - elementInt32 * 1.0) > MINIMAL_ERROR;
1480826e83eSopenharmony_ci            } else if (isReadDouble) {
1490826e83eSopenharmony_ci                isDouble = true;
1500826e83eSopenharmony_ci            }
1510826e83eSopenharmony_ci        }
1520826e83eSopenharmony_ci    }
1530826e83eSopenharmony_ci    return valueTypeFirst;
1540826e83eSopenharmony_ci}
1550826e83eSopenharmony_ci
1560826e83eSopenharmony_civoid SetArrayHandlerBoolean(napi_env env, napi_value array, WebMessageExt* webMessageExt)
1570826e83eSopenharmony_ci{
1580826e83eSopenharmony_ci    std::vector<bool> outValue;
1590826e83eSopenharmony_ci    if (!NapiParseUtils::ParseBooleanArray(env, array, outValue)) {
1600826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
1610826e83eSopenharmony_ci        return;
1620826e83eSopenharmony_ci    }
1630826e83eSopenharmony_ci    webMessageExt->SetBooleanArray(outValue);
1640826e83eSopenharmony_ci}
1650826e83eSopenharmony_ci
1660826e83eSopenharmony_civoid SetArrayHandlerString(napi_env env, napi_value array, WebMessageExt* webMessageExt)
1670826e83eSopenharmony_ci{
1680826e83eSopenharmony_ci    std::vector<std::string> outValue;
1690826e83eSopenharmony_ci    if (!NapiParseUtils::ParseStringArray(env, array, outValue)) {
1700826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
1710826e83eSopenharmony_ci        return;
1720826e83eSopenharmony_ci    }
1730826e83eSopenharmony_ci    webMessageExt->SetStringArray(outValue);
1740826e83eSopenharmony_ci}
1750826e83eSopenharmony_ci
1760826e83eSopenharmony_civoid SetArrayHandlerInteger(napi_env env, napi_value array, WebMessageExt* webMessageExt)
1770826e83eSopenharmony_ci{
1780826e83eSopenharmony_ci    std::vector<int64_t> outValue;
1790826e83eSopenharmony_ci    if (!NapiParseUtils::ParseInt64Array(env, array, outValue)) {
1800826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
1810826e83eSopenharmony_ci        return;
1820826e83eSopenharmony_ci    }
1830826e83eSopenharmony_ci    webMessageExt->SetInt64Array(outValue);
1840826e83eSopenharmony_ci}
1850826e83eSopenharmony_ci
1860826e83eSopenharmony_civoid SetArrayHandlerDouble(napi_env env, napi_value array, WebMessageExt* webMessageExt)
1870826e83eSopenharmony_ci{
1880826e83eSopenharmony_ci    std::vector<double> outValue;
1890826e83eSopenharmony_ci    if (!NapiParseUtils::ParseDoubleArray(env, array, outValue)) {
1900826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
1910826e83eSopenharmony_ci        return;
1920826e83eSopenharmony_ci    }
1930826e83eSopenharmony_ci    webMessageExt->SetDoubleArray(outValue);
1940826e83eSopenharmony_ci}
1950826e83eSopenharmony_ci
1960826e83eSopenharmony_ciWebviewController* GetWebviewController(napi_env env, napi_callback_info info)
1970826e83eSopenharmony_ci{
1980826e83eSopenharmony_ci    napi_value thisVar = nullptr;
1990826e83eSopenharmony_ci    napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
2000826e83eSopenharmony_ci
2010826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
2020826e83eSopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, (void **)&webviewController);
2030826e83eSopenharmony_ci    if ((!webviewController) || (status != napi_ok) || !webviewController->IsInit()) {
2040826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
2050826e83eSopenharmony_ci        return nullptr;
2060826e83eSopenharmony_ci    }
2070826e83eSopenharmony_ci    return webviewController;
2080826e83eSopenharmony_ci}
2090826e83eSopenharmony_ci
2100826e83eSopenharmony_cibool ParsePrepareRequestMethod(napi_env env, napi_value methodObj, std::string& method)
2110826e83eSopenharmony_ci{
2120826e83eSopenharmony_ci    napi_valuetype valueType = napi_null;
2130826e83eSopenharmony_ci    napi_typeof(env, methodObj, &valueType);
2140826e83eSopenharmony_ci
2150826e83eSopenharmony_ci    if (valueType == napi_string) {
2160826e83eSopenharmony_ci        NapiParseUtils::ParseString(env, methodObj, method);
2170826e83eSopenharmony_ci        if (method != "POST") {
2180826e83eSopenharmony_ci            WVLOG_E("The method %{public}s is not supported.", method.c_str());
2190826e83eSopenharmony_ci            return false;
2200826e83eSopenharmony_ci        }
2210826e83eSopenharmony_ci        return true;
2220826e83eSopenharmony_ci    }
2230826e83eSopenharmony_ci
2240826e83eSopenharmony_ci    WVLOG_E("Unable to parse type from method object.");
2250826e83eSopenharmony_ci    return false;
2260826e83eSopenharmony_ci}
2270826e83eSopenharmony_ci
2280826e83eSopenharmony_cibool ParseHttpHeaders(napi_env env, napi_value headersArray, std::map<std::string, std::string>* headers)
2290826e83eSopenharmony_ci{
2300826e83eSopenharmony_ci    bool isArray = false;
2310826e83eSopenharmony_ci    napi_is_array(env, headersArray, &isArray);
2320826e83eSopenharmony_ci    if (isArray) {
2330826e83eSopenharmony_ci        uint32_t arrayLength = INTEGER_ZERO;
2340826e83eSopenharmony_ci        napi_get_array_length(env, headersArray, &arrayLength);
2350826e83eSopenharmony_ci        for (uint32_t i = 0; i < arrayLength; ++i) {
2360826e83eSopenharmony_ci            std::string key;
2370826e83eSopenharmony_ci            std::string value;
2380826e83eSopenharmony_ci            napi_value obj = nullptr;
2390826e83eSopenharmony_ci            napi_value keyObj = nullptr;
2400826e83eSopenharmony_ci            napi_value valueObj = nullptr;
2410826e83eSopenharmony_ci            napi_get_element(env, headersArray, i, &obj);
2420826e83eSopenharmony_ci            if (napi_get_named_property(env, obj, "headerKey", &keyObj) != napi_ok) {
2430826e83eSopenharmony_ci                continue;
2440826e83eSopenharmony_ci            }
2450826e83eSopenharmony_ci            if (napi_get_named_property(env, obj, "headerValue", &valueObj) != napi_ok) {
2460826e83eSopenharmony_ci                continue;
2470826e83eSopenharmony_ci            }
2480826e83eSopenharmony_ci            if (!NapiParseUtils::ParseString(env, keyObj, key) || !NapiParseUtils::ParseString(env, valueObj, value)) {
2490826e83eSopenharmony_ci                WVLOG_E("Unable to parse string from headers array object.");
2500826e83eSopenharmony_ci                return false;
2510826e83eSopenharmony_ci            }
2520826e83eSopenharmony_ci            if (key.empty()) {
2530826e83eSopenharmony_ci                WVLOG_E("Key from headers is empty.");
2540826e83eSopenharmony_ci                return false;
2550826e83eSopenharmony_ci            }
2560826e83eSopenharmony_ci            (*headers)[key] = value;
2570826e83eSopenharmony_ci        }
2580826e83eSopenharmony_ci    } else {
2590826e83eSopenharmony_ci        WVLOG_E("Unable to parse type from headers array object.");
2600826e83eSopenharmony_ci        return false;
2610826e83eSopenharmony_ci    }
2620826e83eSopenharmony_ci    return true;
2630826e83eSopenharmony_ci}
2640826e83eSopenharmony_ci
2650826e83eSopenharmony_cibool CheckCacheKey(napi_env env, const std::string& cacheKey)
2660826e83eSopenharmony_ci{
2670826e83eSopenharmony_ci    for (char c : cacheKey) {
2680826e83eSopenharmony_ci        if (!isalnum(c)) {
2690826e83eSopenharmony_ci            WVLOG_E("BusinessError: 401. The character of 'cacheKey' must be number or letters.");
2700826e83eSopenharmony_ci            BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
2710826e83eSopenharmony_ci            return false;
2720826e83eSopenharmony_ci        }
2730826e83eSopenharmony_ci    }
2740826e83eSopenharmony_ci    return true;
2750826e83eSopenharmony_ci}
2760826e83eSopenharmony_ci
2770826e83eSopenharmony_cibool ParseCacheKeyList(napi_env env, napi_value cacheKeyArray, std::vector<std::string>* cacheKeyList)
2780826e83eSopenharmony_ci{
2790826e83eSopenharmony_ci    bool isArray = false;
2800826e83eSopenharmony_ci    napi_is_array(env, cacheKeyArray, &isArray);
2810826e83eSopenharmony_ci    if (!isArray) {
2820826e83eSopenharmony_ci        WVLOG_E("Unable to parse type from CacheKey array object.");
2830826e83eSopenharmony_ci        return false;
2840826e83eSopenharmony_ci    }
2850826e83eSopenharmony_ci    uint32_t arrayLength = INTEGER_ZERO;
2860826e83eSopenharmony_ci    napi_get_array_length(env, cacheKeyArray, &arrayLength);
2870826e83eSopenharmony_ci    if (arrayLength == 0) {
2880826e83eSopenharmony_ci        WVLOG_E("cacheKey array length is invalid");
2890826e83eSopenharmony_ci        return false;
2900826e83eSopenharmony_ci    }
2910826e83eSopenharmony_ci    for (uint32_t i = 0; i < arrayLength; ++i) {
2920826e83eSopenharmony_ci        napi_value cacheKeyItem = nullptr;
2930826e83eSopenharmony_ci        napi_get_element(env, cacheKeyArray, i, &cacheKeyItem);
2940826e83eSopenharmony_ci        std::string cacheKeyStr;
2950826e83eSopenharmony_ci        if (!NapiParseUtils::ParseString(env, cacheKeyItem, cacheKeyStr)) {
2960826e83eSopenharmony_ci            WVLOG_E("Unable to parse string from cacheKey array object.");
2970826e83eSopenharmony_ci            return false;
2980826e83eSopenharmony_ci        }
2990826e83eSopenharmony_ci        if (cacheKeyStr.empty()) {
3000826e83eSopenharmony_ci            WVLOG_E("Cache Key is empty.");
3010826e83eSopenharmony_ci            return false;
3020826e83eSopenharmony_ci        }
3030826e83eSopenharmony_ci        for (char c : cacheKeyStr) {
3040826e83eSopenharmony_ci            if (!isalnum(c)) {
3050826e83eSopenharmony_ci                WVLOG_E("Cache Key is invalid.");
3060826e83eSopenharmony_ci                return false;
3070826e83eSopenharmony_ci            }
3080826e83eSopenharmony_ci        }
3090826e83eSopenharmony_ci        cacheKeyList->emplace_back(cacheKeyStr);
3100826e83eSopenharmony_ci    }
3110826e83eSopenharmony_ci    return true;
3120826e83eSopenharmony_ci}
3130826e83eSopenharmony_ci
3140826e83eSopenharmony_cistd::shared_ptr<NWebEnginePrefetchArgs> ParsePrefetchArgs(napi_env env, napi_value preArgs)
3150826e83eSopenharmony_ci{
3160826e83eSopenharmony_ci    napi_value urlObj = nullptr;
3170826e83eSopenharmony_ci    std::string url;
3180826e83eSopenharmony_ci    napi_get_named_property(env, preArgs, "url", &urlObj);
3190826e83eSopenharmony_ci    if (!ParsePrepareUrl(env, urlObj, url)) {
3200826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INVALID_URL);
3210826e83eSopenharmony_ci        return nullptr;
3220826e83eSopenharmony_ci    }
3230826e83eSopenharmony_ci
3240826e83eSopenharmony_ci    napi_value methodObj = nullptr;
3250826e83eSopenharmony_ci    std::string method;
3260826e83eSopenharmony_ci    napi_get_named_property(env, preArgs, "method", &methodObj);
3270826e83eSopenharmony_ci    if (!ParsePrepareRequestMethod(env, methodObj, method)) {
3280826e83eSopenharmony_ci        WVLOG_E("BusinessError: 401. The type of 'method' must be string 'POST'.");
3290826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
3300826e83eSopenharmony_ci        return nullptr;
3310826e83eSopenharmony_ci    }
3320826e83eSopenharmony_ci
3330826e83eSopenharmony_ci    napi_value formDataObj = nullptr;
3340826e83eSopenharmony_ci    std::string formData;
3350826e83eSopenharmony_ci    napi_get_named_property(env, preArgs, "formData", &formDataObj);
3360826e83eSopenharmony_ci    if (!NapiParseUtils::ParseString(env, formDataObj, formData)) {
3370826e83eSopenharmony_ci        WVLOG_E("BusinessError: 401. The type of 'formData' must be string.");
3380826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
3390826e83eSopenharmony_ci        return nullptr;
3400826e83eSopenharmony_ci    }
3410826e83eSopenharmony_ci    std::shared_ptr<NWebEnginePrefetchArgs> prefetchArgs = std::make_shared<NWebEnginePrefetchArgsImpl>(
3420826e83eSopenharmony_ci        url, method, formData);
3430826e83eSopenharmony_ci    return prefetchArgs;
3440826e83eSopenharmony_ci}
3450826e83eSopenharmony_ci
3460826e83eSopenharmony_ciPDFMarginConfig ParsePDFMarginConfigArgs(napi_env env, napi_value preArgs, double width, double height)
3470826e83eSopenharmony_ci{
3480826e83eSopenharmony_ci    napi_value marginTopObj = nullptr;
3490826e83eSopenharmony_ci    double marginTop = TEN_MILLIMETER_TO_INCH;
3500826e83eSopenharmony_ci    napi_get_named_property(env, preArgs, "marginTop", &marginTopObj);
3510826e83eSopenharmony_ci    if (!NapiParseUtils::ParseDouble(env, marginTopObj, marginTop)) {
3520826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
3530826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "marginTop", "number"));
3540826e83eSopenharmony_ci        return PDFMarginConfig();
3550826e83eSopenharmony_ci    }
3560826e83eSopenharmony_ci    marginTop = (marginTop >= height / HALF || marginTop <= 0.0) ? 0.0 : marginTop;
3570826e83eSopenharmony_ci
3580826e83eSopenharmony_ci    napi_value marginBottomObj = nullptr;
3590826e83eSopenharmony_ci    double marginBottom = TEN_MILLIMETER_TO_INCH;
3600826e83eSopenharmony_ci    napi_get_named_property(env, preArgs, "marginBottom", &marginBottomObj);
3610826e83eSopenharmony_ci    if (!NapiParseUtils::ParseDouble(env, marginBottomObj, marginBottom)) {
3620826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
3630826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "marginBottom", "number"));
3640826e83eSopenharmony_ci        return PDFMarginConfig();
3650826e83eSopenharmony_ci    }
3660826e83eSopenharmony_ci    marginBottom = (marginBottom >= height / HALF || marginBottom <= 0.0) ? 0.0 : marginBottom;
3670826e83eSopenharmony_ci
3680826e83eSopenharmony_ci    napi_value marginRightObj = nullptr;
3690826e83eSopenharmony_ci    double marginRight = TEN_MILLIMETER_TO_INCH;
3700826e83eSopenharmony_ci    napi_get_named_property(env, preArgs, "marginRight", &marginRightObj);
3710826e83eSopenharmony_ci    if (!NapiParseUtils::ParseDouble(env, marginRightObj, marginRight)) {
3720826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
3730826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "marginRight", "number"));
3740826e83eSopenharmony_ci        return PDFMarginConfig();
3750826e83eSopenharmony_ci    }
3760826e83eSopenharmony_ci    marginRight = (marginRight >= width / HALF || marginRight <= 0.0) ? 0.0 : marginRight;
3770826e83eSopenharmony_ci
3780826e83eSopenharmony_ci    napi_value marginLeftObj = nullptr;
3790826e83eSopenharmony_ci    double marginLeft = TEN_MILLIMETER_TO_INCH;
3800826e83eSopenharmony_ci    napi_get_named_property(env, preArgs, "marginLeft", &marginLeftObj);
3810826e83eSopenharmony_ci    if (!NapiParseUtils::ParseDouble(env, marginLeftObj, marginLeft)) {
3820826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
3830826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "marginLeft", "number"));
3840826e83eSopenharmony_ci        return PDFMarginConfig();
3850826e83eSopenharmony_ci    }
3860826e83eSopenharmony_ci    marginLeft = (marginLeft >= width / HALF || marginLeft <= 0.0) ? 0.0 : marginLeft;
3870826e83eSopenharmony_ci
3880826e83eSopenharmony_ci    return { marginTop, marginBottom, marginRight, marginLeft };
3890826e83eSopenharmony_ci}
3900826e83eSopenharmony_ci
3910826e83eSopenharmony_cistd::shared_ptr<NWebPDFConfigArgs> ParsePDFConfigArgs(napi_env env, napi_value preArgs)
3920826e83eSopenharmony_ci{
3930826e83eSopenharmony_ci    napi_value widthObj = nullptr;
3940826e83eSopenharmony_ci    double width = A4_WIDTH;
3950826e83eSopenharmony_ci    napi_get_named_property(env, preArgs, "width", &widthObj);
3960826e83eSopenharmony_ci    if (!NapiParseUtils::ParseDouble(env, widthObj, width)) {
3970826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(
3980826e83eSopenharmony_ci            env, PARAM_CHECK_ERROR, NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "width", "number"));
3990826e83eSopenharmony_ci        return nullptr;
4000826e83eSopenharmony_ci    }
4010826e83eSopenharmony_ci
4020826e83eSopenharmony_ci    napi_value heightObj = nullptr;
4030826e83eSopenharmony_ci    double height = A4_HEIGHT;
4040826e83eSopenharmony_ci    napi_get_named_property(env, preArgs, "height", &heightObj);
4050826e83eSopenharmony_ci    if (!NapiParseUtils::ParseDouble(env, heightObj, height)) {
4060826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
4070826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "height", "number"));
4080826e83eSopenharmony_ci        return nullptr;
4090826e83eSopenharmony_ci    }
4100826e83eSopenharmony_ci
4110826e83eSopenharmony_ci    napi_value scaleObj = nullptr;
4120826e83eSopenharmony_ci    double scale = 1.0;
4130826e83eSopenharmony_ci    napi_get_named_property(env, preArgs, "scale", &scaleObj);
4140826e83eSopenharmony_ci    NapiParseUtils::ParseDouble(env, scaleObj, scale);
4150826e83eSopenharmony_ci    scale = scale > SCALE_MAX ? SCALE_MAX : scale < SCALE_MIN ? SCALE_MIN : scale;
4160826e83eSopenharmony_ci
4170826e83eSopenharmony_ci    auto margin = ParsePDFMarginConfigArgs(env, preArgs, width, height);
4180826e83eSopenharmony_ci
4190826e83eSopenharmony_ci    napi_value shouldPrintBackgroundObj = nullptr;
4200826e83eSopenharmony_ci    bool shouldPrintBackground = false;
4210826e83eSopenharmony_ci    napi_get_named_property(env, preArgs, "shouldPrintBackground", &shouldPrintBackgroundObj);
4220826e83eSopenharmony_ci    NapiParseUtils::ParseBoolean(env, shouldPrintBackgroundObj, shouldPrintBackground);
4230826e83eSopenharmony_ci
4240826e83eSopenharmony_ci    std::shared_ptr<NWebPDFConfigArgs> pdfConfig = std::make_shared<NWebPDFConfigArgsImpl>(
4250826e83eSopenharmony_ci        width, height, scale, margin.top, margin.bottom, margin.right, margin.left, shouldPrintBackground);
4260826e83eSopenharmony_ci    return pdfConfig;
4270826e83eSopenharmony_ci}
4280826e83eSopenharmony_ci
4290826e83eSopenharmony_civoid JsErrorCallback(napi_env env, napi_ref jsCallback, int32_t err)
4300826e83eSopenharmony_ci{
4310826e83eSopenharmony_ci    napi_value jsError = nullptr;
4320826e83eSopenharmony_ci    napi_value jsResult = nullptr;
4330826e83eSopenharmony_ci
4340826e83eSopenharmony_ci    jsError = BusinessError::CreateError(env, err);
4350826e83eSopenharmony_ci    napi_get_undefined(env, &jsResult);
4360826e83eSopenharmony_ci    napi_value args[INTEGER_TWO] = {jsError, jsResult};
4370826e83eSopenharmony_ci
4380826e83eSopenharmony_ci    napi_value callback = nullptr;
4390826e83eSopenharmony_ci    napi_value callbackResult = nullptr;
4400826e83eSopenharmony_ci    napi_get_reference_value(env, jsCallback, &callback);
4410826e83eSopenharmony_ci    napi_call_function(env, nullptr, callback, INTEGER_TWO, args, &callbackResult);
4420826e83eSopenharmony_ci    napi_delete_reference(env, jsCallback);
4430826e83eSopenharmony_ci}
4440826e83eSopenharmony_ci
4450826e83eSopenharmony_cibool ParseRegisterJavaScriptProxyParam(napi_env env, size_t argc, napi_value* argv,
4460826e83eSopenharmony_ci    RegisterJavaScriptProxyParam* param)
4470826e83eSopenharmony_ci{
4480826e83eSopenharmony_ci    std::string objName;
4490826e83eSopenharmony_ci    if (!NapiParseUtils::ParseString(env, argv[INTEGER_ONE], objName)) {
4500826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
4510826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "name", "string"));
4520826e83eSopenharmony_ci        return false;
4530826e83eSopenharmony_ci    }
4540826e83eSopenharmony_ci    std::vector<std::string> methodList;
4550826e83eSopenharmony_ci    if (!NapiParseUtils::ParseStringArray(env, argv[INTEGER_TWO], methodList)) {
4560826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
4570826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "methodList", "array"));
4580826e83eSopenharmony_ci        return false;
4590826e83eSopenharmony_ci    }
4600826e83eSopenharmony_ci    std::vector<std::string> asyncMethodList;
4610826e83eSopenharmony_ci    if (argc == INTEGER_FOUR && !NapiParseUtils::ParseStringArray(env, argv[INTEGER_THREE], asyncMethodList)) {
4620826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
4630826e83eSopenharmony_ci        return false;
4640826e83eSopenharmony_ci    }
4650826e83eSopenharmony_ci    std::string permission;
4660826e83eSopenharmony_ci    if (argc == INTEGER_FIVE && !NapiParseUtils::ParseString(env, argv[INTEGER_FOUR], permission)) {
4670826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
4680826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "permission", "string"));
4690826e83eSopenharmony_ci        return false;
4700826e83eSopenharmony_ci    }
4710826e83eSopenharmony_ci    param->env = env;
4720826e83eSopenharmony_ci    param->obj = argv[INTEGER_ZERO];
4730826e83eSopenharmony_ci    param->objName = objName;
4740826e83eSopenharmony_ci    param->syncMethodList = methodList;
4750826e83eSopenharmony_ci    param->asyncMethodList = asyncMethodList;
4760826e83eSopenharmony_ci    param->permission = permission;
4770826e83eSopenharmony_ci    return true;
4780826e83eSopenharmony_ci}
4790826e83eSopenharmony_ci
4800826e83eSopenharmony_cinapi_value RemoveDownloadDelegateRef(napi_env env, napi_value thisVar)
4810826e83eSopenharmony_ci{
4820826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
4830826e83eSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, (void **)&webviewController));
4840826e83eSopenharmony_ci    if (webviewController == nullptr || !webviewController->IsInit()) {
4850826e83eSopenharmony_ci        WVLOG_E("create message port failed, napi unwrap webviewController failed");
4860826e83eSopenharmony_ci        return nullptr;
4870826e83eSopenharmony_ci    }
4880826e83eSopenharmony_ci
4890826e83eSopenharmony_ci    WebDownloadManager::RemoveDownloadDelegateRef(webviewController->GetWebId());
4900826e83eSopenharmony_ci    return nullptr;
4910826e83eSopenharmony_ci}
4920826e83eSopenharmony_ci
4930826e83eSopenharmony_ci} // namespace
4940826e83eSopenharmony_ci
4950826e83eSopenharmony_ciint32_t NapiWebviewController::maxFdNum_ = -1;
4960826e83eSopenharmony_cistd::atomic<int32_t> NapiWebviewController::usedFd_ {0};
4970826e83eSopenharmony_cistd::atomic<bool> g_inWebPageSnapshot {false};
4980826e83eSopenharmony_ci
4990826e83eSopenharmony_cithread_local napi_ref g_classWebMsgPort;
5000826e83eSopenharmony_cithread_local napi_ref g_historyListRef;
5010826e83eSopenharmony_cithread_local napi_ref g_webMsgExtClassRef;
5020826e83eSopenharmony_cithread_local napi_ref g_webPrintDocClassRef;
5030826e83eSopenharmony_cinapi_value NapiWebviewController::Init(napi_env env, napi_value exports)
5040826e83eSopenharmony_ci{
5050826e83eSopenharmony_ci    napi_property_descriptor properties[] = {
5060826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_FUNCTION("initializeWebEngine", NapiWebviewController::InitializeWebEngine),
5070826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_FUNCTION("setHttpDns", NapiWebviewController::SetHttpDns),
5080826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_FUNCTION("setWebDebuggingAccess", NapiWebviewController::SetWebDebuggingAccess),
5090826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_FUNCTION("setServiceWorkerWebSchemeHandler",
5100826e83eSopenharmony_ci                                     NapiWebviewController::SetServiceWorkerWebSchemeHandler),
5110826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_FUNCTION("clearServiceWorkerWebSchemeHandler",
5120826e83eSopenharmony_ci                                     NapiWebviewController::ClearServiceWorkerWebSchemeHandler),
5130826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("getWebDebuggingAccess", NapiWebviewController::InnerGetWebDebuggingAccess),
5140826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("setWebId", NapiWebviewController::SetWebId),
5150826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("jsProxy", NapiWebviewController::InnerJsProxy),
5160826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("getCustomeSchemeCmdLine", NapiWebviewController::InnerGetCustomeSchemeCmdLine),
5170826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("accessForward", NapiWebviewController::AccessForward),
5180826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("accessBackward", NapiWebviewController::AccessBackward),
5190826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("accessStep", NapiWebviewController::AccessStep),
5200826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("clearHistory", NapiWebviewController::ClearHistory),
5210826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("forward", NapiWebviewController::Forward),
5220826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("backward", NapiWebviewController::Backward),
5230826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("onActive", NapiWebviewController::OnActive),
5240826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("onInactive", NapiWebviewController::OnInactive),
5250826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("refresh", NapiWebviewController::Refresh),
5260826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("zoomIn", NapiWebviewController::ZoomIn),
5270826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("zoomOut", NapiWebviewController::ZoomOut),
5280826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("getWebId", NapiWebviewController::GetWebId),
5290826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("getUserAgent", NapiWebviewController::GetUserAgent),
5300826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("getCustomUserAgent", NapiWebviewController::GetCustomUserAgent),
5310826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("setCustomUserAgent", NapiWebviewController::SetCustomUserAgent),
5320826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("getTitle", NapiWebviewController::GetTitle),
5330826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("getPageHeight", NapiWebviewController::GetPageHeight),
5340826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("backOrForward", NapiWebviewController::BackOrForward),
5350826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("storeWebArchive", NapiWebviewController::StoreWebArchive),
5360826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("createWebMessagePorts", NapiWebviewController::CreateWebMessagePorts),
5370826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("postMessage", NapiWebviewController::PostMessage),
5380826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("getHitTestValue", NapiWebviewController::GetHitTestValue),
5390826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("requestFocus", NapiWebviewController::RequestFocus),
5400826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("loadUrl", NapiWebviewController::LoadUrl),
5410826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("postUrl", NapiWebviewController::PostUrl),
5420826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("loadData", NapiWebviewController::LoadData),
5430826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("getHitTest", NapiWebviewController::GetHitTest),
5440826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("clearMatches", NapiWebviewController::ClearMatches),
5450826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("searchNext", NapiWebviewController::SearchNext),
5460826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("searchAllAsync", NapiWebviewController::SearchAllAsync),
5470826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("clearSslCache", NapiWebviewController::ClearSslCache),
5480826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("clearClientAuthenticationCache", NapiWebviewController::ClearClientAuthenticationCache),
5490826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("stop", NapiWebviewController::Stop),
5500826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("zoom", NapiWebviewController::Zoom),
5510826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("registerJavaScriptProxy", NapiWebviewController::RegisterJavaScriptProxy),
5520826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("innerCompleteWindowNew", NapiWebviewController::InnerCompleteWindowNew),
5530826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("deleteJavaScriptRegister", NapiWebviewController::DeleteJavaScriptRegister),
5540826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("runJavaScript", NapiWebviewController::RunJavaScript),
5550826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("runJavaScriptExt", NapiWebviewController::RunJavaScriptExt),
5560826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("getUrl", NapiWebviewController::GetUrl),
5570826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("terminateRenderProcess", NapiWebviewController::TerminateRenderProcess),
5580826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("getOriginalUrl", NapiWebviewController::GetOriginalUrl),
5590826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("setNetworkAvailable", NapiWebviewController::SetNetworkAvailable),
5600826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("innerGetWebId", NapiWebviewController::InnerGetWebId),
5610826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("hasImage", NapiWebviewController::HasImage),
5620826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("removeCache", NapiWebviewController::RemoveCache),
5630826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("getFavicon", NapiWebviewController::GetFavicon),
5640826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("getBackForwardEntries", NapiWebviewController::getBackForwardEntries),
5650826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("serializeWebState", NapiWebviewController::SerializeWebState),
5660826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("restoreWebState", NapiWebviewController::RestoreWebState),
5670826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("pageDown", NapiWebviewController::ScrollPageDown),
5680826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("pageUp", NapiWebviewController::ScrollPageUp),
5690826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("scrollTo", NapiWebviewController::ScrollTo),
5700826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("scrollBy", NapiWebviewController::ScrollBy),
5710826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("slideScroll", NapiWebviewController::SlideScroll),
5720826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("setScrollable", NapiWebviewController::SetScrollable),
5730826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("getScrollable", NapiWebviewController::GetScrollable),
5740826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_FUNCTION("customizeSchemes", NapiWebviewController::CustomizeSchemes),
5750826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("innerSetHapPath", NapiWebviewController::InnerSetHapPath),
5760826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("innerGetCertificate", NapiWebviewController::InnerGetCertificate),
5770826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("setAudioMuted", NapiWebviewController::SetAudioMuted),
5780826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("innerGetThisVar", NapiWebviewController::InnerGetThisVar),
5790826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("prefetchPage", NapiWebviewController::PrefetchPage),
5800826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("setDownloadDelegate", NapiWebviewController::SetDownloadDelegate),
5810826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("startDownload", NapiWebviewController::StartDownload),
5820826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_FUNCTION("prepareForPageLoad", NapiWebviewController::PrepareForPageLoad),
5830826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("createWebPrintDocumentAdapter", NapiWebviewController::CreateWebPrintDocumentAdapter),
5840826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_FUNCTION("setConnectionTimeout", NapiWebviewController::SetConnectionTimeout),
5850826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("enableSafeBrowsing", NapiWebviewController::EnableSafeBrowsing),
5860826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("isSafeBrowsingEnabled", NapiWebviewController::IsSafeBrowsingEnabled),
5870826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("getSecurityLevel", NapiWebviewController::GetSecurityLevel),
5880826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("isIncognitoMode", NapiWebviewController::IsIncognitoMode),
5890826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("setPrintBackground", NapiWebviewController::SetPrintBackground),
5900826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("getPrintBackground", NapiWebviewController::GetPrintBackground),
5910826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("setWebSchemeHandler", NapiWebviewController::SetWebSchemeHandler),
5920826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("clearWebSchemeHandler", NapiWebviewController::ClearWebSchemeHandler),
5930826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("enableIntelligentTrackingPrevention",
5940826e83eSopenharmony_ci            NapiWebviewController::EnableIntelligentTrackingPrevention),
5950826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("isIntelligentTrackingPreventionEnabled",
5960826e83eSopenharmony_ci            NapiWebviewController::IsIntelligentTrackingPreventionEnabled),
5970826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_FUNCTION("addIntelligentTrackingPreventionBypassingList",
5980826e83eSopenharmony_ci            NapiWebviewController::AddIntelligentTrackingPreventionBypassingList),
5990826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_FUNCTION("removeIntelligentTrackingPreventionBypassingList",
6000826e83eSopenharmony_ci            NapiWebviewController::RemoveIntelligentTrackingPreventionBypassingList),
6010826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_FUNCTION("clearIntelligentTrackingPreventionBypassingList",
6020826e83eSopenharmony_ci            NapiWebviewController::ClearIntelligentTrackingPreventionBypassingList),
6030826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("getLastJavascriptProxyCallingFrameUrl",
6040826e83eSopenharmony_ci            NapiWebviewController::GetLastJavascriptProxyCallingFrameUrl),
6050826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_FUNCTION("getDefaultUserAgent", NapiWebviewController::GetDefaultUserAgent),
6060826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_FUNCTION("pauseAllTimers", NapiWebviewController::PauseAllTimers),
6070826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_FUNCTION("resumeAllTimers", NapiWebviewController::ResumeAllTimers),
6080826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("startCamera", NapiWebviewController::StartCamera),
6090826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("stopCamera", NapiWebviewController::StopCamera),
6100826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("closeCamera", NapiWebviewController::CloseCamera),
6110826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("closeAllMediaPresentations", NapiWebviewController::CloseAllMediaPresentations),
6120826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("stopAllMedia", NapiWebviewController::StopAllMedia),
6130826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("resumeAllMedia", NapiWebviewController::ResumeAllMedia),
6140826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("pauseAllMedia", NapiWebviewController::PauseAllMedia),
6150826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("getMediaPlaybackState", NapiWebviewController::GetMediaPlaybackState),
6160826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("onCreateNativeMediaPlayer", NapiWebviewController::OnCreateNativeMediaPlayer),
6170826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_FUNCTION("prefetchResource", NapiWebviewController::PrefetchResource),
6180826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_FUNCTION("clearPrefetchedResource", NapiWebviewController::ClearPrefetchedResource),
6190826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_FUNCTION("setRenderProcessMode", NapiWebviewController::SetRenderProcessMode),
6200826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_FUNCTION("getRenderProcessMode", NapiWebviewController::GetRenderProcessMode),
6210826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("precompileJavaScript", NapiWebviewController::PrecompileJavaScript),
6220826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("injectOfflineResources", NapiWebviewController::InjectOfflineResources),
6230826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_FUNCTION("setHostIP", NapiWebviewController::SetHostIP),
6240826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_FUNCTION("clearHostIP", NapiWebviewController::ClearHostIP),
6250826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_FUNCTION("warmupServiceWorker", NapiWebviewController::WarmupServiceWorker),
6260826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("getSurfaceId", NapiWebviewController::GetSurfaceId),
6270826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_FUNCTION("enableWholeWebPageDrawing", NapiWebviewController::EnableWholeWebPageDrawing),
6280826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("enableAdsBlock", NapiWebviewController::EnableAdsBlock),
6290826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("isAdsBlockEnabled", NapiWebviewController::IsAdsBlockEnabled),
6300826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("isAdsBlockEnabledForCurPage", NapiWebviewController::IsAdsBlockEnabledForCurPage),
6310826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("webPageSnapshot", NapiWebviewController::WebPageSnapshot),
6320826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("setUrlTrustList", NapiWebviewController::SetUrlTrustList),
6330826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("setPathAllowingUniversalAccess",
6340826e83eSopenharmony_ci            NapiWebviewController::SetPathAllowingUniversalAccess),
6350826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_FUNCTION("enableBackForwardCache", NapiWebviewController::EnableBackForwardCache),
6360826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("setBackForwardCacheOptions", NapiWebviewController::SetBackForwardCacheOptions),
6370826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("scrollByWithResult", NapiWebviewController::ScrollByWithResult),
6380826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("updateInstanceId", NapiWebviewController::UpdateInstanceId),
6390826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_FUNCTION("trimMemoryByPressureLevel",
6400826e83eSopenharmony_ci            NapiWebviewController::TrimMemoryByPressureLevel),
6410826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("getScrollOffset",
6420826e83eSopenharmony_ci            NapiWebviewController::GetScrollOffset),
6430826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("createPdf", NapiWebviewController::RunCreatePDFExt),
6440826e83eSopenharmony_ci    };
6450826e83eSopenharmony_ci    napi_value constructor = nullptr;
6460826e83eSopenharmony_ci    napi_define_class(env, WEBVIEW_CONTROLLER_CLASS_NAME.c_str(), WEBVIEW_CONTROLLER_CLASS_NAME.length(),
6470826e83eSopenharmony_ci        NapiWebviewController::JsConstructor, nullptr, sizeof(properties) / sizeof(properties[0]),
6480826e83eSopenharmony_ci        properties, &constructor);
6490826e83eSopenharmony_ci    NAPI_ASSERT(env, constructor != nullptr, "define js class WebviewController failed");
6500826e83eSopenharmony_ci    napi_status status = napi_set_named_property(env, exports, "WebviewController", constructor);
6510826e83eSopenharmony_ci    NAPI_ASSERT(env, status == napi_ok, "set property WebviewController failed");
6520826e83eSopenharmony_ci
6530826e83eSopenharmony_ci    napi_value webMsgTypeEnum = nullptr;
6540826e83eSopenharmony_ci    napi_property_descriptor webMsgTypeProperties[] = {
6550826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("NOT_SUPPORT", NapiParseUtils::ToInt32Value(env,
6560826e83eSopenharmony_ci            static_cast<int32_t>(WebMessageType::NOTSUPPORT))),
6570826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("STRING", NapiParseUtils::ToInt32Value(env,
6580826e83eSopenharmony_ci            static_cast<int32_t>(WebMessageType::STRING))),
6590826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("NUMBER", NapiParseUtils::ToInt32Value(env,
6600826e83eSopenharmony_ci            static_cast<int32_t>(WebMessageType::NUMBER))),
6610826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("BOOLEAN", NapiParseUtils::ToInt32Value(env,
6620826e83eSopenharmony_ci            static_cast<int32_t>(WebMessageType::BOOLEAN))),
6630826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("ARRAY_BUFFER", NapiParseUtils::ToInt32Value(env,
6640826e83eSopenharmony_ci            static_cast<int32_t>(WebMessageType::ARRAYBUFFER))),
6650826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("ARRAY", NapiParseUtils::ToInt32Value(env,
6660826e83eSopenharmony_ci            static_cast<int32_t>(WebMessageType::ARRAY))),
6670826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("ERROR", NapiParseUtils::ToInt32Value(env,
6680826e83eSopenharmony_ci            static_cast<int32_t>(WebMessageType::ERROR)))
6690826e83eSopenharmony_ci    };
6700826e83eSopenharmony_ci    napi_define_class(env, WEB_PORT_MSG_ENUM_NAME.c_str(), WEB_PORT_MSG_ENUM_NAME.length(),
6710826e83eSopenharmony_ci        NapiParseUtils::CreateEnumConstructor, nullptr, sizeof(webMsgTypeProperties) /
6720826e83eSopenharmony_ci        sizeof(webMsgTypeProperties[0]), webMsgTypeProperties, &webMsgTypeEnum);
6730826e83eSopenharmony_ci    napi_set_named_property(env, exports, WEB_PORT_MSG_ENUM_NAME.c_str(), webMsgTypeEnum);
6740826e83eSopenharmony_ci
6750826e83eSopenharmony_ci    napi_value webMsgExtClass = nullptr;
6760826e83eSopenharmony_ci    napi_property_descriptor webMsgExtClsProperties[] = {
6770826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("getType", NapiWebMessageExt::GetType),
6780826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("getString", NapiWebMessageExt::GetString),
6790826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("getNumber", NapiWebMessageExt::GetNumber),
6800826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("getBoolean", NapiWebMessageExt::GetBoolean),
6810826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("getArrayBuffer", NapiWebMessageExt::GetArrayBuffer),
6820826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("getArray", NapiWebMessageExt::GetArray),
6830826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("getError", NapiWebMessageExt::GetError),
6840826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("setType", NapiWebMessageExt::SetType),
6850826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("setString", NapiWebMessageExt::SetString),
6860826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("setNumber", NapiWebMessageExt::SetNumber),
6870826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("setBoolean", NapiWebMessageExt::SetBoolean),
6880826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("setArrayBuffer", NapiWebMessageExt::SetArrayBuffer),
6890826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("setArray", NapiWebMessageExt::SetArray),
6900826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("setError", NapiWebMessageExt::SetError)
6910826e83eSopenharmony_ci    };
6920826e83eSopenharmony_ci    napi_define_class(env, WEB_EXT_MSG_CLASS_NAME.c_str(), WEB_EXT_MSG_CLASS_NAME.length(),
6930826e83eSopenharmony_ci        NapiWebMessageExt::JsConstructor, nullptr, sizeof(webMsgExtClsProperties) / sizeof(webMsgExtClsProperties[0]),
6940826e83eSopenharmony_ci        webMsgExtClsProperties, &webMsgExtClass);
6950826e83eSopenharmony_ci    napi_create_reference(env, webMsgExtClass, 1, &g_webMsgExtClassRef);
6960826e83eSopenharmony_ci    napi_set_named_property(env, exports, WEB_EXT_MSG_CLASS_NAME.c_str(), webMsgExtClass);
6970826e83eSopenharmony_ci
6980826e83eSopenharmony_ci    napi_value securityLevelEnum = nullptr;
6990826e83eSopenharmony_ci    napi_property_descriptor securityLevelProperties[] = {
7000826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("NONE", NapiParseUtils::ToInt32Value(env,
7010826e83eSopenharmony_ci            static_cast<int32_t>(SecurityLevel::NONE))),
7020826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("SECURE", NapiParseUtils::ToInt32Value(env,
7030826e83eSopenharmony_ci            static_cast<int32_t>(SecurityLevel::SECURE))),
7040826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("WARNING", NapiParseUtils::ToInt32Value(env,
7050826e83eSopenharmony_ci            static_cast<int32_t>(SecurityLevel::WARNING))),
7060826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("DANGEROUS", NapiParseUtils::ToInt32Value(env,
7070826e83eSopenharmony_ci            static_cast<int32_t>(SecurityLevel::DANGEROUS)))
7080826e83eSopenharmony_ci    };
7090826e83eSopenharmony_ci    napi_define_class(env, WEB_SECURITY_LEVEL_ENUM_NAME.c_str(), WEB_SECURITY_LEVEL_ENUM_NAME.length(),
7100826e83eSopenharmony_ci        NapiParseUtils::CreateEnumConstructor, nullptr, sizeof(securityLevelProperties) /
7110826e83eSopenharmony_ci        sizeof(securityLevelProperties[0]), securityLevelProperties, &securityLevelEnum);
7120826e83eSopenharmony_ci    napi_set_named_property(env, exports, WEB_SECURITY_LEVEL_ENUM_NAME.c_str(), securityLevelEnum);
7130826e83eSopenharmony_ci
7140826e83eSopenharmony_ci    napi_value msgPortCons = nullptr;
7150826e83eSopenharmony_ci    napi_property_descriptor msgPortProperties[] = {
7160826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("close", NapiWebMessagePort::Close),
7170826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("postMessageEvent", NapiWebMessagePort::PostMessageEvent),
7180826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("onMessageEvent", NapiWebMessagePort::OnMessageEvent),
7190826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("postMessageEventExt", NapiWebMessagePort::PostMessageEventExt),
7200826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("onMessageEventExt", NapiWebMessagePort::OnMessageEventExt)
7210826e83eSopenharmony_ci    };
7220826e83eSopenharmony_ci    NAPI_CALL(env, napi_define_class(env, WEB_MESSAGE_PORT_CLASS_NAME.c_str(), WEB_MESSAGE_PORT_CLASS_NAME.length(),
7230826e83eSopenharmony_ci        NapiWebMessagePort::JsConstructor, nullptr, sizeof(msgPortProperties) / sizeof(msgPortProperties[0]),
7240826e83eSopenharmony_ci        msgPortProperties, &msgPortCons));
7250826e83eSopenharmony_ci    NAPI_CALL(env, napi_create_reference(env, msgPortCons, 1, &g_classWebMsgPort));
7260826e83eSopenharmony_ci    NAPI_CALL(env, napi_set_named_property(env, exports, WEB_MESSAGE_PORT_CLASS_NAME.c_str(), msgPortCons));
7270826e83eSopenharmony_ci
7280826e83eSopenharmony_ci    napi_value hitTestTypeEnum = nullptr;
7290826e83eSopenharmony_ci    napi_property_descriptor hitTestTypeProperties[] = {
7300826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("EditText", NapiParseUtils::ToInt32Value(env,
7310826e83eSopenharmony_ci            static_cast<int32_t>(WebHitTestType::EDIT))),
7320826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("Email", NapiParseUtils::ToInt32Value(env,
7330826e83eSopenharmony_ci            static_cast<int32_t>(WebHitTestType::EMAIL))),
7340826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("HttpAnchor", NapiParseUtils::ToInt32Value(env,
7350826e83eSopenharmony_ci            static_cast<int32_t>(WebHitTestType::HTTP))),
7360826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("HttpAnchorImg", NapiParseUtils::ToInt32Value(env,
7370826e83eSopenharmony_ci            static_cast<int32_t>(WebHitTestType::HTTP_IMG))),
7380826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("Img", NapiParseUtils::ToInt32Value(env,
7390826e83eSopenharmony_ci            static_cast<int32_t>(WebHitTestType::IMG))),
7400826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("Map", NapiParseUtils::ToInt32Value(env,
7410826e83eSopenharmony_ci            static_cast<int32_t>(WebHitTestType::MAP))),
7420826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("Phone", NapiParseUtils::ToInt32Value(env,
7430826e83eSopenharmony_ci            static_cast<int32_t>(WebHitTestType::PHONE))),
7440826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("Unknown", NapiParseUtils::ToInt32Value(env,
7450826e83eSopenharmony_ci            static_cast<int32_t>(WebHitTestType::UNKNOWN))),
7460826e83eSopenharmony_ci    };
7470826e83eSopenharmony_ci    napi_define_class(env, WEB_HITTESTTYPE_V9_ENUM_NAME.c_str(), WEB_HITTESTTYPE_V9_ENUM_NAME.length(),
7480826e83eSopenharmony_ci        NapiParseUtils::CreateEnumConstructor, nullptr, sizeof(hitTestTypeProperties) /
7490826e83eSopenharmony_ci        sizeof(hitTestTypeProperties[0]), hitTestTypeProperties, &hitTestTypeEnum);
7500826e83eSopenharmony_ci    napi_set_named_property(env, exports, WEB_HITTESTTYPE_V9_ENUM_NAME.c_str(), hitTestTypeEnum);
7510826e83eSopenharmony_ci
7520826e83eSopenharmony_ci    napi_define_class(env, WEB_HITTESTTYPE_ENUM_NAME.c_str(), WEB_HITTESTTYPE_ENUM_NAME.length(),
7530826e83eSopenharmony_ci        NapiParseUtils::CreateEnumConstructor, nullptr, sizeof(hitTestTypeProperties) /
7540826e83eSopenharmony_ci        sizeof(hitTestTypeProperties[0]), hitTestTypeProperties, &hitTestTypeEnum);
7550826e83eSopenharmony_ci    napi_set_named_property(env, exports, WEB_HITTESTTYPE_ENUM_NAME.c_str(), hitTestTypeEnum);
7560826e83eSopenharmony_ci
7570826e83eSopenharmony_ci    napi_value secureDnsModeEnum = nullptr;
7580826e83eSopenharmony_ci    napi_property_descriptor secureDnsModeProperties[] = {
7590826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("Off", NapiParseUtils::ToInt32Value(env,
7600826e83eSopenharmony_ci            static_cast<int32_t>(SecureDnsModeType::OFF))),
7610826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("Auto", NapiParseUtils::ToInt32Value(env,
7620826e83eSopenharmony_ci            static_cast<int32_t>(SecureDnsModeType::AUTO))),
7630826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("SecureOnly", NapiParseUtils::ToInt32Value(env,
7640826e83eSopenharmony_ci            static_cast<int32_t>(SecureDnsModeType::SECURE_ONLY))),
7650826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("OFF", NapiParseUtils::ToInt32Value(env,
7660826e83eSopenharmony_ci            static_cast<int32_t>(SecureDnsModeType::OFF))),
7670826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("AUTO", NapiParseUtils::ToInt32Value(env,
7680826e83eSopenharmony_ci            static_cast<int32_t>(SecureDnsModeType::AUTO))),
7690826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("SECURE_ONLY", NapiParseUtils::ToInt32Value(env,
7700826e83eSopenharmony_ci            static_cast<int32_t>(SecureDnsModeType::SECURE_ONLY))),
7710826e83eSopenharmony_ci    };
7720826e83eSopenharmony_ci    napi_define_class(env, WEB_SECURE_DNS_MODE_ENUM_NAME.c_str(), WEB_SECURE_DNS_MODE_ENUM_NAME.length(),
7730826e83eSopenharmony_ci        NapiParseUtils::CreateEnumConstructor, nullptr, sizeof(secureDnsModeProperties) /
7740826e83eSopenharmony_ci        sizeof(secureDnsModeProperties[0]), secureDnsModeProperties, &secureDnsModeEnum);
7750826e83eSopenharmony_ci    napi_set_named_property(env, exports, WEB_SECURE_DNS_MODE_ENUM_NAME.c_str(), secureDnsModeEnum);
7760826e83eSopenharmony_ci
7770826e83eSopenharmony_ci    napi_value historyList = nullptr;
7780826e83eSopenharmony_ci    napi_property_descriptor historyListProperties[] = {
7790826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("getItemAtIndex", NapiWebHistoryList::GetItem)
7800826e83eSopenharmony_ci    };
7810826e83eSopenharmony_ci    napi_define_class(env, WEB_HISTORY_LIST_CLASS_NAME.c_str(), WEB_HISTORY_LIST_CLASS_NAME.length(),
7820826e83eSopenharmony_ci        NapiWebHistoryList::JsConstructor, nullptr, sizeof(historyListProperties) / sizeof(historyListProperties[0]),
7830826e83eSopenharmony_ci        historyListProperties, &historyList);
7840826e83eSopenharmony_ci    napi_create_reference(env, historyList, 1, &g_historyListRef);
7850826e83eSopenharmony_ci    napi_set_named_property(env, exports, WEB_HISTORY_LIST_CLASS_NAME.c_str(), historyList);
7860826e83eSopenharmony_ci
7870826e83eSopenharmony_ci    napi_value webPrintDoc = nullptr;
7880826e83eSopenharmony_ci    napi_property_descriptor WebPrintDocumentClass[] = {
7890826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("onStartLayoutWrite", NapiWebPrintDocument::OnStartLayoutWrite),
7900826e83eSopenharmony_ci        DECLARE_NAPI_FUNCTION("onJobStateChanged", NapiWebPrintDocument::OnJobStateChanged),
7910826e83eSopenharmony_ci    };
7920826e83eSopenharmony_ci    napi_define_class(env, WEB_PRINT_DOCUMENT_CLASS_NAME.c_str(), WEB_PRINT_DOCUMENT_CLASS_NAME.length(),
7930826e83eSopenharmony_ci        NapiWebPrintDocument::JsConstructor, nullptr,
7940826e83eSopenharmony_ci        sizeof(WebPrintDocumentClass) / sizeof(WebPrintDocumentClass[0]),
7950826e83eSopenharmony_ci        WebPrintDocumentClass, &webPrintDoc);
7960826e83eSopenharmony_ci    napi_create_reference(env, webPrintDoc, 1, &g_webPrintDocClassRef);
7970826e83eSopenharmony_ci    napi_set_named_property(env, exports, WEB_PRINT_DOCUMENT_CLASS_NAME.c_str(), webPrintDoc);
7980826e83eSopenharmony_ci
7990826e83eSopenharmony_ci    napi_value renderProcessModeEnum = nullptr;
8000826e83eSopenharmony_ci    napi_property_descriptor renderProcessModeProperties[] = {
8010826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("SINGLE", NapiParseUtils::ToInt32Value(env,
8020826e83eSopenharmony_ci            static_cast<int32_t>(RenderProcessMode::SINGLE_MODE))),
8030826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("MULTIPLE", NapiParseUtils::ToInt32Value(env,
8040826e83eSopenharmony_ci            static_cast<int32_t>(RenderProcessMode::MULTIPLE_MODE))),
8050826e83eSopenharmony_ci    };
8060826e83eSopenharmony_ci    napi_define_class(env, WEB_RENDER_PROCESS_MODE_ENUM_NAME.c_str(), WEB_RENDER_PROCESS_MODE_ENUM_NAME.length(),
8070826e83eSopenharmony_ci        NapiParseUtils::CreateEnumConstructor, nullptr, sizeof(renderProcessModeProperties) /
8080826e83eSopenharmony_ci        sizeof(renderProcessModeProperties[0]), renderProcessModeProperties, &renderProcessModeEnum);
8090826e83eSopenharmony_ci    napi_set_named_property(env, exports, WEB_RENDER_PROCESS_MODE_ENUM_NAME.c_str(), renderProcessModeEnum);
8100826e83eSopenharmony_ci
8110826e83eSopenharmony_ci    napi_value offlineResourceTypeEnum = nullptr;
8120826e83eSopenharmony_ci    napi_property_descriptor offlineResourceTypeProperties[] = {
8130826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("IMAGE", NapiParseUtils::ToInt32Value(env,
8140826e83eSopenharmony_ci            static_cast<int32_t>(OfflineResourceType::IMAGE))),
8150826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("CSS", NapiParseUtils::ToInt32Value(env,
8160826e83eSopenharmony_ci            static_cast<int32_t>(OfflineResourceType::CSS))),
8170826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("CLASSIC_JS", NapiParseUtils::ToInt32Value(env,
8180826e83eSopenharmony_ci            static_cast<int32_t>(OfflineResourceType::CLASSIC_JS))),
8190826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("MODULE_JS", NapiParseUtils::ToInt32Value(env,
8200826e83eSopenharmony_ci            static_cast<int32_t>(OfflineResourceType::MODULE_JS))),
8210826e83eSopenharmony_ci    };
8220826e83eSopenharmony_ci    napi_define_class(env, OFFLINE_RESOURCE_TYPE_ENUM_NAME.c_str(), OFFLINE_RESOURCE_TYPE_ENUM_NAME.length(),
8230826e83eSopenharmony_ci        NapiParseUtils::CreateEnumConstructor, nullptr, sizeof(offlineResourceTypeProperties) /
8240826e83eSopenharmony_ci        sizeof(offlineResourceTypeProperties[0]), offlineResourceTypeProperties, &offlineResourceTypeEnum);
8250826e83eSopenharmony_ci    napi_set_named_property(env, exports, OFFLINE_RESOURCE_TYPE_ENUM_NAME.c_str(), offlineResourceTypeEnum);
8260826e83eSopenharmony_ci
8270826e83eSopenharmony_ci    napi_value pressureLevelEnum = nullptr;
8280826e83eSopenharmony_ci    napi_property_descriptor pressureLevelProperties[] = {
8290826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("MEMORY_PRESSURE_LEVEL_MODERATE", NapiParseUtils::ToInt32Value(env,
8300826e83eSopenharmony_ci            static_cast<int32_t>(PressureLevel::MEMORY_PRESSURE_LEVEL_MODERATE))),
8310826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("MEMORY_PRESSURE_LEVEL_CRITICAL", NapiParseUtils::ToInt32Value(env,
8320826e83eSopenharmony_ci            static_cast<int32_t>(PressureLevel::MEMORY_PRESSURE_LEVEL_CRITICAL))),
8330826e83eSopenharmony_ci    };
8340826e83eSopenharmony_ci    napi_define_class(env, WEB_PRESSURE_LEVEL_ENUM_NAME.c_str(), WEB_PRESSURE_LEVEL_ENUM_NAME.length(),
8350826e83eSopenharmony_ci        NapiParseUtils::CreateEnumConstructor, nullptr, sizeof(pressureLevelProperties) /
8360826e83eSopenharmony_ci        sizeof(pressureLevelProperties[0]), pressureLevelProperties, &pressureLevelEnum);
8370826e83eSopenharmony_ci    napi_set_named_property(env, exports, WEB_PRESSURE_LEVEL_ENUM_NAME.c_str(), pressureLevelEnum);
8380826e83eSopenharmony_ci
8390826e83eSopenharmony_ci    napi_value scrollTypeEnum = nullptr;
8400826e83eSopenharmony_ci    napi_property_descriptor scrollTypeProperties[] = {
8410826e83eSopenharmony_ci        DECLARE_NAPI_STATIC_PROPERTY("EVENT", NapiParseUtils::ToInt32Value(env,
8420826e83eSopenharmony_ci            static_cast<int32_t>(ScrollType::EVENT))),
8430826e83eSopenharmony_ci    };
8440826e83eSopenharmony_ci    napi_define_class(env, WEB_SCROLL_TYPE_ENUM_NAME.c_str(), WEB_SCROLL_TYPE_ENUM_NAME.length(),
8450826e83eSopenharmony_ci        NapiParseUtils::CreateEnumConstructor, nullptr, sizeof(scrollTypeProperties) /
8460826e83eSopenharmony_ci        sizeof(scrollTypeProperties[0]), scrollTypeProperties, &scrollTypeEnum);
8470826e83eSopenharmony_ci    napi_set_named_property(env, exports, WEB_SCROLL_TYPE_ENUM_NAME.c_str(), scrollTypeEnum);
8480826e83eSopenharmony_ci
8490826e83eSopenharmony_ci    WebviewJavaScriptExecuteCallback::InitJSExcute(env, exports);
8500826e83eSopenharmony_ci    WebviewCreatePDFExecuteCallback::InitJSExcute(env, exports);
8510826e83eSopenharmony_ci    return exports;
8520826e83eSopenharmony_ci}
8530826e83eSopenharmony_ci
8540826e83eSopenharmony_cinapi_value NapiWebviewController::JsConstructor(napi_env env, napi_callback_info info)
8550826e83eSopenharmony_ci{
8560826e83eSopenharmony_ci    WVLOG_I("NapiWebviewController::JsConstructor start");
8570826e83eSopenharmony_ci    napi_value thisVar = nullptr;
8580826e83eSopenharmony_ci
8590826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
8600826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
8610826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
8620826e83eSopenharmony_ci
8630826e83eSopenharmony_ci    WebviewController *webviewController;
8640826e83eSopenharmony_ci    std::string webTag;
8650826e83eSopenharmony_ci    if (argc == 1) {
8660826e83eSopenharmony_ci        NapiParseUtils::ParseString(env, argv[INTEGER_ZERO], webTag);
8670826e83eSopenharmony_ci        if (webTag.empty()) {
8680826e83eSopenharmony_ci            WVLOG_E("native webTag is empty");
8690826e83eSopenharmony_ci            return nullptr;
8700826e83eSopenharmony_ci        }
8710826e83eSopenharmony_ci        webviewController = new (std::nothrow) WebviewController(webTag);
8720826e83eSopenharmony_ci        WVLOG_I("new webview controller webname:%{public}s", webTag.c_str());
8730826e83eSopenharmony_ci    } else {
8740826e83eSopenharmony_ci        webTag = WebviewController::GenerateWebTag();
8750826e83eSopenharmony_ci        webviewController = new (std::nothrow) WebviewController(webTag);
8760826e83eSopenharmony_ci    }
8770826e83eSopenharmony_ci    WebviewController::webTagSet_.insert(webTag);
8780826e83eSopenharmony_ci
8790826e83eSopenharmony_ci    if (webviewController == nullptr) {
8800826e83eSopenharmony_ci        WVLOG_E("new webview controller failed");
8810826e83eSopenharmony_ci        return nullptr;
8820826e83eSopenharmony_ci    }
8830826e83eSopenharmony_ci    napi_status status = napi_wrap(
8840826e83eSopenharmony_ci        env, thisVar, webviewController,
8850826e83eSopenharmony_ci        [](napi_env env, void *data, void *hint) {
8860826e83eSopenharmony_ci            WebviewController *webviewController = static_cast<WebviewController *>(data);
8870826e83eSopenharmony_ci            delete webviewController;
8880826e83eSopenharmony_ci        },
8890826e83eSopenharmony_ci        nullptr, nullptr);
8900826e83eSopenharmony_ci    if (status != napi_ok) {
8910826e83eSopenharmony_ci        WVLOG_E("Wrap native webviewController failed.");
8920826e83eSopenharmony_ci        return nullptr;
8930826e83eSopenharmony_ci    }
8940826e83eSopenharmony_ci    return thisVar;
8950826e83eSopenharmony_ci}
8960826e83eSopenharmony_ci
8970826e83eSopenharmony_cinapi_value NapiWebviewController::InitializeWebEngine(napi_env env, napi_callback_info info)
8980826e83eSopenharmony_ci{
8990826e83eSopenharmony_ci    WVLOG_D("InitializeWebEngine invoked.");
9000826e83eSopenharmony_ci
9010826e83eSopenharmony_ci    // obtain bundle path
9020826e83eSopenharmony_ci    std::shared_ptr<AbilityRuntime::ApplicationContext> ctx =
9030826e83eSopenharmony_ci        AbilityRuntime::ApplicationContext::GetApplicationContext();
9040826e83eSopenharmony_ci    if (!ctx) {
9050826e83eSopenharmony_ci        WVLOG_E("Failed to init web engine due to nil application context.");
9060826e83eSopenharmony_ci        return nullptr;
9070826e83eSopenharmony_ci    }
9080826e83eSopenharmony_ci
9090826e83eSopenharmony_ci    // load so
9100826e83eSopenharmony_ci    const std::string& bundlePath = ctx->GetBundleCodeDir();
9110826e83eSopenharmony_ci    NWebHelper::Instance().SetBundlePath(bundlePath);
9120826e83eSopenharmony_ci    if (!NWebHelper::Instance().InitAndRun(true)) {
9130826e83eSopenharmony_ci        WVLOG_E("Failed to init web engine due to NWebHelper failure.");
9140826e83eSopenharmony_ci        return nullptr;
9150826e83eSopenharmony_ci    }
9160826e83eSopenharmony_ci
9170826e83eSopenharmony_ci    napi_value result = nullptr;
9180826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
9190826e83eSopenharmony_ci    WVLOG_I("NWebHelper initialized, init web engine done, bundle_path: %{public}s", bundlePath.c_str());
9200826e83eSopenharmony_ci    return result;
9210826e83eSopenharmony_ci}
9220826e83eSopenharmony_ci
9230826e83eSopenharmony_cinapi_value NapiWebviewController::SetHttpDns(napi_env env, napi_callback_info info)
9240826e83eSopenharmony_ci{
9250826e83eSopenharmony_ci    napi_value thisVar = nullptr;
9260826e83eSopenharmony_ci    napi_value result = nullptr;
9270826e83eSopenharmony_ci    size_t argc = INTEGER_TWO;
9280826e83eSopenharmony_ci    napi_value argv[INTEGER_TWO] = { 0 };
9290826e83eSopenharmony_ci    int dohMode;
9300826e83eSopenharmony_ci    std::string dohConfig;
9310826e83eSopenharmony_ci
9320826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
9330826e83eSopenharmony_ci    if (argc != INTEGER_TWO) {
9340826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
9350826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "two"));
9360826e83eSopenharmony_ci        return result;
9370826e83eSopenharmony_ci    }
9380826e83eSopenharmony_ci
9390826e83eSopenharmony_ci    if (!NapiParseUtils::ParseInt32(env, argv[INTEGER_ZERO], dohMode)) {
9400826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
9410826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "secureDnsMode", "SecureDnsMode"));
9420826e83eSopenharmony_ci        return result;
9430826e83eSopenharmony_ci    }
9440826e83eSopenharmony_ci
9450826e83eSopenharmony_ci    if (dohMode < static_cast<int>(SecureDnsModeType::OFF) ||
9460826e83eSopenharmony_ci        dohMode > static_cast<int>(SecureDnsModeType::SECURE_ONLY)) {
9470826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
9480826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_TYPE_INVALID, "secureDnsMode"));
9490826e83eSopenharmony_ci        return result;
9500826e83eSopenharmony_ci    }
9510826e83eSopenharmony_ci
9520826e83eSopenharmony_ci    if (!NapiParseUtils::ParseString(env, argv[INTEGER_ONE], dohConfig)) {
9530826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
9540826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "secureDnsConfig", "string"));
9550826e83eSopenharmony_ci        return result;
9560826e83eSopenharmony_ci    }
9570826e83eSopenharmony_ci
9580826e83eSopenharmony_ci    if (dohConfig.rfind("https", 0) != 0 && dohConfig.rfind("HTTPS", 0) != 0) {
9590826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
9600826e83eSopenharmony_ci            "BusinessError 401: Parameter error. Parameter secureDnsConfig must start with 'http' or 'https'.");
9610826e83eSopenharmony_ci        return result;
9620826e83eSopenharmony_ci    }
9630826e83eSopenharmony_ci
9640826e83eSopenharmony_ci    std::shared_ptr<NWebDOHConfigImpl> config = std::make_shared<NWebDOHConfigImpl>();
9650826e83eSopenharmony_ci    config->SetMode(dohMode);
9660826e83eSopenharmony_ci    config->SetConfig(dohConfig);
9670826e83eSopenharmony_ci    WVLOG_I("set http dns mode:%{public}d doh_config:%{public}s", dohMode, dohConfig.c_str());
9680826e83eSopenharmony_ci
9690826e83eSopenharmony_ci    NWebHelper::Instance().SetHttpDns(config);
9700826e83eSopenharmony_ci
9710826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
9720826e83eSopenharmony_ci    return result;
9730826e83eSopenharmony_ci}
9740826e83eSopenharmony_ci
9750826e83eSopenharmony_cinapi_value NapiWebviewController::SetWebDebuggingAccess(napi_env env, napi_callback_info info)
9760826e83eSopenharmony_ci{
9770826e83eSopenharmony_ci    WVLOG_D("SetWebDebuggingAccess start");
9780826e83eSopenharmony_ci    napi_value result = nullptr;
9790826e83eSopenharmony_ci    if (OHOS::system::GetBoolParameter("web.debug.devtools", false)) {
9800826e83eSopenharmony_ci        return result;
9810826e83eSopenharmony_ci    }
9820826e83eSopenharmony_ci    napi_value thisVar = nullptr;
9830826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
9840826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = {0};
9850826e83eSopenharmony_ci
9860826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
9870826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
9880826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
9890826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
9900826e83eSopenharmony_ci        return result;
9910826e83eSopenharmony_ci    }
9920826e83eSopenharmony_ci
9930826e83eSopenharmony_ci    bool webDebuggingAccess = false;
9940826e83eSopenharmony_ci    if (!NapiParseUtils::ParseBoolean(env, argv[0], webDebuggingAccess)) {
9950826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
9960826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "webDebuggingAccess", "boolean"));
9970826e83eSopenharmony_ci        return result;
9980826e83eSopenharmony_ci    }
9990826e83eSopenharmony_ci    WebviewController::webDebuggingAccess_ = webDebuggingAccess;
10000826e83eSopenharmony_ci
10010826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
10020826e83eSopenharmony_ci    return result;
10030826e83eSopenharmony_ci}
10040826e83eSopenharmony_ci
10050826e83eSopenharmony_cinapi_value NapiWebviewController::EnableSafeBrowsing(napi_env env, napi_callback_info info)
10060826e83eSopenharmony_ci{
10070826e83eSopenharmony_ci    WVLOG_D("EnableSafeBrowsing start");
10080826e83eSopenharmony_ci    napi_value result = nullptr;
10090826e83eSopenharmony_ci    napi_value thisVar = nullptr;
10100826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
10110826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = {0};
10120826e83eSopenharmony_ci
10130826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
10140826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
10150826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
10160826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
10170826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
10180826e83eSopenharmony_ci        return result;
10190826e83eSopenharmony_ci    }
10200826e83eSopenharmony_ci
10210826e83eSopenharmony_ci    bool safeBrowsingEnable = false;
10220826e83eSopenharmony_ci    if (!NapiParseUtils::ParseBoolean(env, argv[0], safeBrowsingEnable)) {
10230826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
10240826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "enable", "boolean"));
10250826e83eSopenharmony_ci        return result;
10260826e83eSopenharmony_ci    }
10270826e83eSopenharmony_ci
10280826e83eSopenharmony_ci    WebviewController *controller = nullptr;
10290826e83eSopenharmony_ci    napi_unwrap(env, thisVar, (void **)&controller);
10300826e83eSopenharmony_ci    if (!controller) {
10310826e83eSopenharmony_ci        return result;
10320826e83eSopenharmony_ci    }
10330826e83eSopenharmony_ci    if (!controller->IsInit()) {
10340826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
10350826e83eSopenharmony_ci        return result;
10360826e83eSopenharmony_ci    }
10370826e83eSopenharmony_ci    controller->EnableSafeBrowsing(safeBrowsingEnable);
10380826e83eSopenharmony_ci    return result;
10390826e83eSopenharmony_ci}
10400826e83eSopenharmony_ci
10410826e83eSopenharmony_cinapi_value NapiWebviewController::IsSafeBrowsingEnabled(napi_env env, napi_callback_info info)
10420826e83eSopenharmony_ci{
10430826e83eSopenharmony_ci    WVLOG_D("IsSafeBrowsingEnabled start");
10440826e83eSopenharmony_ci    napi_value result = nullptr;
10450826e83eSopenharmony_ci    WebviewController *webviewController = GetWebviewController(env, info);
10460826e83eSopenharmony_ci    if (!webviewController) {
10470826e83eSopenharmony_ci        return nullptr;
10480826e83eSopenharmony_ci    }
10490826e83eSopenharmony_ci
10500826e83eSopenharmony_ci    bool isSafeBrowsingEnabled = webviewController->IsSafeBrowsingEnabled();
10510826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_boolean(env, isSafeBrowsingEnabled, &result));
10520826e83eSopenharmony_ci    return result;
10530826e83eSopenharmony_ci}
10540826e83eSopenharmony_ci
10550826e83eSopenharmony_cinapi_value NapiWebviewController::InnerGetWebDebuggingAccess(napi_env env, napi_callback_info info)
10560826e83eSopenharmony_ci{
10570826e83eSopenharmony_ci    WVLOG_D("InnerGetWebDebuggingAccess start");
10580826e83eSopenharmony_ci    bool webDebuggingAccess = WebviewController::webDebuggingAccess_;
10590826e83eSopenharmony_ci    napi_value result = nullptr;
10600826e83eSopenharmony_ci    napi_get_boolean(env, webDebuggingAccess, &result);
10610826e83eSopenharmony_ci    return result;
10620826e83eSopenharmony_ci}
10630826e83eSopenharmony_ci
10640826e83eSopenharmony_cinapi_value NapiWebviewController::InnerGetThisVar(napi_env env, napi_callback_info info)
10650826e83eSopenharmony_ci{
10660826e83eSopenharmony_ci    WVLOG_D("InnerGetThisVar start");
10670826e83eSopenharmony_ci    napi_value thisVar = nullptr;
10680826e83eSopenharmony_ci    napi_value result = nullptr;
10690826e83eSopenharmony_ci    napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
10700826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
10710826e83eSopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, (void **)&webviewController);
10720826e83eSopenharmony_ci    if ((!webviewController) || (status != napi_ok)) {
10730826e83eSopenharmony_ci        WVLOG_E("webviewController is nullptr.");
10740826e83eSopenharmony_ci        napi_create_int64(env, 0, &result);
10750826e83eSopenharmony_ci    } else {
10760826e83eSopenharmony_ci        napi_create_int64(env, reinterpret_cast<int64_t>(webviewController), &result);
10770826e83eSopenharmony_ci    }
10780826e83eSopenharmony_ci    return result;
10790826e83eSopenharmony_ci}
10800826e83eSopenharmony_ci
10810826e83eSopenharmony_cinapi_value NapiWebviewController::SetWebId(napi_env env, napi_callback_info info)
10820826e83eSopenharmony_ci{
10830826e83eSopenharmony_ci    napi_value thisVar = nullptr;
10840826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
10850826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE];
10860826e83eSopenharmony_ci    void* data = nullptr;
10870826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
10880826e83eSopenharmony_ci
10890826e83eSopenharmony_ci    int32_t webId = -1;
10900826e83eSopenharmony_ci    if (!NapiParseUtils::ParseInt32(env, argv[0], webId)) {
10910826e83eSopenharmony_ci        WVLOG_E("Parse web id failed.");
10920826e83eSopenharmony_ci        return nullptr;
10930826e83eSopenharmony_ci    }
10940826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
10950826e83eSopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, (void **)&webviewController);
10960826e83eSopenharmony_ci    if ((!webviewController) || (status != napi_ok)) {
10970826e83eSopenharmony_ci        WVLOG_E("webviewController is nullptr.");
10980826e83eSopenharmony_ci        return nullptr;
10990826e83eSopenharmony_ci    }
11000826e83eSopenharmony_ci    webviewController->SetWebId(webId);
11010826e83eSopenharmony_ci    return thisVar;
11020826e83eSopenharmony_ci}
11030826e83eSopenharmony_ci
11040826e83eSopenharmony_cinapi_value NapiWebviewController::InnerSetHapPath(napi_env env, napi_callback_info info)
11050826e83eSopenharmony_ci{
11060826e83eSopenharmony_ci    napi_value result = nullptr;
11070826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
11080826e83eSopenharmony_ci    napi_value thisVar = nullptr;
11090826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
11100826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE];
11110826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
11120826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
11130826e83eSopenharmony_ci        WVLOG_E("Failed to run InnerSetHapPath beacuse of wrong Param number.");
11140826e83eSopenharmony_ci        return result;
11150826e83eSopenharmony_ci    }
11160826e83eSopenharmony_ci    std::string hapPath;
11170826e83eSopenharmony_ci    if (!NapiParseUtils::ParseString(env, argv[0], hapPath)) {
11180826e83eSopenharmony_ci        WVLOG_E("Parse hap path failed.");
11190826e83eSopenharmony_ci        return result;
11200826e83eSopenharmony_ci    }
11210826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
11220826e83eSopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, (void **)&webviewController);
11230826e83eSopenharmony_ci    if ((!webviewController) || (status != napi_ok) || !webviewController->IsInit()) {
11240826e83eSopenharmony_ci        WVLOG_E("Wrap webviewController failed. WebviewController must be associated with a Web component.");
11250826e83eSopenharmony_ci        return result;
11260826e83eSopenharmony_ci    }
11270826e83eSopenharmony_ci    webviewController->InnerSetHapPath(hapPath);
11280826e83eSopenharmony_ci    return result;
11290826e83eSopenharmony_ci}
11300826e83eSopenharmony_ci
11310826e83eSopenharmony_cinapi_value NapiWebviewController::InnerJsProxy(napi_env env, napi_callback_info info)
11320826e83eSopenharmony_ci{
11330826e83eSopenharmony_ci    napi_value thisVar = nullptr;
11340826e83eSopenharmony_ci    napi_value result = nullptr;
11350826e83eSopenharmony_ci    size_t argc = INTEGER_FIVE;
11360826e83eSopenharmony_ci    napi_value argv[INTEGER_FIVE] = { 0 };
11370826e83eSopenharmony_ci    napi_get_undefined(env, &result);
11380826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
11390826e83eSopenharmony_ci    if (argc != INTEGER_FIVE) {
11400826e83eSopenharmony_ci        WVLOG_E("Failed to run InnerJsProxy beacuse of wrong Param number.");
11410826e83eSopenharmony_ci        return result;
11420826e83eSopenharmony_ci    }
11430826e83eSopenharmony_ci    napi_valuetype valueType = napi_undefined;
11440826e83eSopenharmony_ci    napi_typeof(env, argv[INTEGER_ZERO], &valueType);
11450826e83eSopenharmony_ci    if (valueType != napi_object) {
11460826e83eSopenharmony_ci        WVLOG_E("Failed to run InnerJsProxy beacuse of wrong Param type.");
11470826e83eSopenharmony_ci        return result;
11480826e83eSopenharmony_ci    }
11490826e83eSopenharmony_ci    std::string objName;
11500826e83eSopenharmony_ci    if (!NapiParseUtils::ParseString(env, argv[INTEGER_ONE], objName)) {
11510826e83eSopenharmony_ci        WVLOG_E("Failed to run InnerJsProxy beacuse of wrong object name.");
11520826e83eSopenharmony_ci        return result;
11530826e83eSopenharmony_ci    }
11540826e83eSopenharmony_ci    std::vector<std::string> methodList;
11550826e83eSopenharmony_ci    bool hasSyncMethod = NapiParseUtils::ParseStringArray(env, argv[INTEGER_TWO], methodList);
11560826e83eSopenharmony_ci    std::vector<std::string> asyncMethodList;
11570826e83eSopenharmony_ci    bool hasAsyncMethod = NapiParseUtils::ParseStringArray(env, argv[INTEGER_THREE], asyncMethodList);
11580826e83eSopenharmony_ci    if (!hasSyncMethod && !hasAsyncMethod) {
11590826e83eSopenharmony_ci        WVLOG_E("Failed to run InnerJsProxy beacuse of empty method lists.");
11600826e83eSopenharmony_ci        return result;
11610826e83eSopenharmony_ci    }
11620826e83eSopenharmony_ci    std::string permission = "";
11630826e83eSopenharmony_ci    NapiParseUtils::ParseString(env, argv[INTEGER_FOUR], permission);
11640826e83eSopenharmony_ci    WebviewController* controller = nullptr;
11650826e83eSopenharmony_ci    napi_unwrap(env, thisVar, (void **)&controller);
11660826e83eSopenharmony_ci    if (!controller || !controller->IsInit()) {
11670826e83eSopenharmony_ci        WVLOG_E("Failed to run InnerJsProxy. The WebviewController must be associted with a Web component.");
11680826e83eSopenharmony_ci        return result;
11690826e83eSopenharmony_ci    }
11700826e83eSopenharmony_ci    controller->SetNWebJavaScriptResultCallBack();
11710826e83eSopenharmony_ci    RegisterJavaScriptProxyParam param;
11720826e83eSopenharmony_ci    param.env = env;
11730826e83eSopenharmony_ci    param.obj = argv[INTEGER_ZERO];
11740826e83eSopenharmony_ci    param.objName = objName;
11750826e83eSopenharmony_ci    param.syncMethodList = methodList;
11760826e83eSopenharmony_ci    param.asyncMethodList = asyncMethodList;
11770826e83eSopenharmony_ci    param.permission = permission;
11780826e83eSopenharmony_ci    controller->RegisterJavaScriptProxy(param);
11790826e83eSopenharmony_ci    return result;
11800826e83eSopenharmony_ci}
11810826e83eSopenharmony_ci
11820826e83eSopenharmony_cinapi_value NapiWebviewController::InnerGetCustomeSchemeCmdLine(napi_env env, napi_callback_info info)
11830826e83eSopenharmony_ci{
11840826e83eSopenharmony_ci    WebviewController::existNweb_ = true;
11850826e83eSopenharmony_ci    napi_value result = nullptr;
11860826e83eSopenharmony_ci    const std::string& cmdLine = WebviewController::customeSchemeCmdLine_;
11870826e83eSopenharmony_ci    napi_create_string_utf8(env, cmdLine.c_str(), cmdLine.length(), &result);
11880826e83eSopenharmony_ci    return result;
11890826e83eSopenharmony_ci}
11900826e83eSopenharmony_ci
11910826e83eSopenharmony_cinapi_value NapiWebviewController::AccessForward(napi_env env, napi_callback_info info)
11920826e83eSopenharmony_ci{
11930826e83eSopenharmony_ci    napi_value result = nullptr;
11940826e83eSopenharmony_ci    WebviewController *webviewController = GetWebviewController(env, info);
11950826e83eSopenharmony_ci    if (!webviewController) {
11960826e83eSopenharmony_ci        return nullptr;
11970826e83eSopenharmony_ci    }
11980826e83eSopenharmony_ci
11990826e83eSopenharmony_ci    bool access = webviewController->AccessForward();
12000826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_boolean(env, access, &result));
12010826e83eSopenharmony_ci    return result;
12020826e83eSopenharmony_ci}
12030826e83eSopenharmony_ci
12040826e83eSopenharmony_cinapi_value NapiWebviewController::AccessBackward(napi_env env, napi_callback_info info)
12050826e83eSopenharmony_ci{
12060826e83eSopenharmony_ci    napi_value result = nullptr;
12070826e83eSopenharmony_ci    WebviewController *webviewController = GetWebviewController(env, info);
12080826e83eSopenharmony_ci    if (!webviewController) {
12090826e83eSopenharmony_ci        return nullptr;
12100826e83eSopenharmony_ci    }
12110826e83eSopenharmony_ci
12120826e83eSopenharmony_ci    bool access = webviewController->AccessBackward();
12130826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_boolean(env, access, &result));
12140826e83eSopenharmony_ci    return result;
12150826e83eSopenharmony_ci}
12160826e83eSopenharmony_ci
12170826e83eSopenharmony_cinapi_value NapiWebviewController::Forward(napi_env env, napi_callback_info info)
12180826e83eSopenharmony_ci{
12190826e83eSopenharmony_ci    napi_value result = nullptr;
12200826e83eSopenharmony_ci    WebviewController *webviewController = GetWebviewController(env, info);
12210826e83eSopenharmony_ci    if (!webviewController) {
12220826e83eSopenharmony_ci        return nullptr;
12230826e83eSopenharmony_ci    }
12240826e83eSopenharmony_ci
12250826e83eSopenharmony_ci    webviewController->Forward();
12260826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
12270826e83eSopenharmony_ci    return result;
12280826e83eSopenharmony_ci}
12290826e83eSopenharmony_ci
12300826e83eSopenharmony_cinapi_value NapiWebviewController::Backward(napi_env env, napi_callback_info info)
12310826e83eSopenharmony_ci{
12320826e83eSopenharmony_ci    napi_value result = nullptr;
12330826e83eSopenharmony_ci    WebviewController *webviewController = GetWebviewController(env, info);
12340826e83eSopenharmony_ci    if (!webviewController) {
12350826e83eSopenharmony_ci        return nullptr;
12360826e83eSopenharmony_ci    }
12370826e83eSopenharmony_ci
12380826e83eSopenharmony_ci    webviewController->Backward();
12390826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
12400826e83eSopenharmony_ci    return result;
12410826e83eSopenharmony_ci}
12420826e83eSopenharmony_ci
12430826e83eSopenharmony_cinapi_value NapiWebviewController::AccessStep(napi_env env, napi_callback_info info)
12440826e83eSopenharmony_ci{
12450826e83eSopenharmony_ci    napi_value thisVar = nullptr;
12460826e83eSopenharmony_ci    napi_value result = nullptr;
12470826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
12480826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE];
12490826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
12500826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
12510826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
12520826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
12530826e83eSopenharmony_ci        return nullptr;
12540826e83eSopenharmony_ci    }
12550826e83eSopenharmony_ci
12560826e83eSopenharmony_ci    int32_t step = INTEGER_ZERO;
12570826e83eSopenharmony_ci    if (!NapiParseUtils::ParseInt32(env, argv[INTEGER_ZERO], step)) {
12580826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
12590826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "step", "number"));
12600826e83eSopenharmony_ci        return nullptr;
12610826e83eSopenharmony_ci    }
12620826e83eSopenharmony_ci
12630826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
12640826e83eSopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, (void **)&webviewController);
12650826e83eSopenharmony_ci    if ((!webviewController) || (status != napi_ok) || !webviewController->IsInit()) {
12660826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
12670826e83eSopenharmony_ci        return nullptr;
12680826e83eSopenharmony_ci    }
12690826e83eSopenharmony_ci
12700826e83eSopenharmony_ci    bool access = webviewController->AccessStep(step);
12710826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_boolean(env, access, &result));
12720826e83eSopenharmony_ci    return result;
12730826e83eSopenharmony_ci}
12740826e83eSopenharmony_ci
12750826e83eSopenharmony_cinapi_value NapiWebviewController::ClearHistory(napi_env env, napi_callback_info info)
12760826e83eSopenharmony_ci{
12770826e83eSopenharmony_ci    napi_value result = nullptr;
12780826e83eSopenharmony_ci    WebviewController *webviewController = GetWebviewController(env, info);
12790826e83eSopenharmony_ci    if (!webviewController) {
12800826e83eSopenharmony_ci        return nullptr;
12810826e83eSopenharmony_ci    }
12820826e83eSopenharmony_ci
12830826e83eSopenharmony_ci    webviewController->ClearHistory();
12840826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
12850826e83eSopenharmony_ci    return result;
12860826e83eSopenharmony_ci}
12870826e83eSopenharmony_ci
12880826e83eSopenharmony_cinapi_value NapiWebviewController::OnActive(napi_env env, napi_callback_info info)
12890826e83eSopenharmony_ci{
12900826e83eSopenharmony_ci    napi_value result = nullptr;
12910826e83eSopenharmony_ci    WebviewController *webviewController = GetWebviewController(env, info);
12920826e83eSopenharmony_ci    if (!webviewController) {
12930826e83eSopenharmony_ci        WVLOG_E("NapiWebviewController::OnActive get controller failed");
12940826e83eSopenharmony_ci        return nullptr;
12950826e83eSopenharmony_ci    }
12960826e83eSopenharmony_ci
12970826e83eSopenharmony_ci    webviewController->OnActive();
12980826e83eSopenharmony_ci    WVLOG_I("The web component has been successfully activated");
12990826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
13000826e83eSopenharmony_ci    return result;
13010826e83eSopenharmony_ci}
13020826e83eSopenharmony_ci
13030826e83eSopenharmony_cinapi_value NapiWebviewController::OnInactive(napi_env env, napi_callback_info info)
13040826e83eSopenharmony_ci{
13050826e83eSopenharmony_ci    napi_value result = nullptr;
13060826e83eSopenharmony_ci    WebviewController *webviewController = GetWebviewController(env, info);
13070826e83eSopenharmony_ci    if (!webviewController) {
13080826e83eSopenharmony_ci        WVLOG_E("NapiWebviewController::OnInactive get controller failed");
13090826e83eSopenharmony_ci        return nullptr;
13100826e83eSopenharmony_ci    }
13110826e83eSopenharmony_ci
13120826e83eSopenharmony_ci    webviewController->OnInactive();
13130826e83eSopenharmony_ci    WVLOG_I("The web component has been successfully inactivated");
13140826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
13150826e83eSopenharmony_ci    return result;
13160826e83eSopenharmony_ci}
13170826e83eSopenharmony_ci
13180826e83eSopenharmony_cinapi_value NapiWebviewController::Refresh(napi_env env, napi_callback_info info)
13190826e83eSopenharmony_ci{
13200826e83eSopenharmony_ci    napi_value result = nullptr;
13210826e83eSopenharmony_ci    WebviewController *webviewController = GetWebviewController(env, info);
13220826e83eSopenharmony_ci    if (!webviewController) {
13230826e83eSopenharmony_ci        return nullptr;
13240826e83eSopenharmony_ci    }
13250826e83eSopenharmony_ci
13260826e83eSopenharmony_ci    webviewController->Refresh();
13270826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
13280826e83eSopenharmony_ci    return result;
13290826e83eSopenharmony_ci}
13300826e83eSopenharmony_ci
13310826e83eSopenharmony_ci
13320826e83eSopenharmony_cinapi_value NapiWebMessageExt::JsConstructor(napi_env env, napi_callback_info info)
13330826e83eSopenharmony_ci{
13340826e83eSopenharmony_ci    WVLOG_D("NapiWebMessageExt::JsConstructor");
13350826e83eSopenharmony_ci    napi_value thisVar = nullptr;
13360826e83eSopenharmony_ci    napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
13370826e83eSopenharmony_ci
13380826e83eSopenharmony_ci    auto webMsg = std::make_shared<OHOS::NWeb::NWebMessage>(NWebValue::Type::NONE);
13390826e83eSopenharmony_ci    WebMessageExt *webMessageExt = new (std::nothrow) WebMessageExt(webMsg);
13400826e83eSopenharmony_ci    if (webMessageExt == nullptr) {
13410826e83eSopenharmony_ci        WVLOG_E("new msg port failed");
13420826e83eSopenharmony_ci        return nullptr;
13430826e83eSopenharmony_ci    }
13440826e83eSopenharmony_ci    NAPI_CALL(env, napi_wrap(env, thisVar, webMessageExt,
13450826e83eSopenharmony_ci        [](napi_env env, void *data, void *hint) {
13460826e83eSopenharmony_ci            WebMessageExt *webMessageExt = static_cast<WebMessageExt *>(data);
13470826e83eSopenharmony_ci            if (webMessageExt) {
13480826e83eSopenharmony_ci                delete webMessageExt;
13490826e83eSopenharmony_ci            }
13500826e83eSopenharmony_ci        },
13510826e83eSopenharmony_ci        nullptr, nullptr));
13520826e83eSopenharmony_ci    return thisVar;
13530826e83eSopenharmony_ci}
13540826e83eSopenharmony_ci
13550826e83eSopenharmony_cinapi_value NapiWebMessageExt::GetType(napi_env env, napi_callback_info info)
13560826e83eSopenharmony_ci{
13570826e83eSopenharmony_ci    WVLOG_D("NapiWebMessageExt::GetType start");
13580826e83eSopenharmony_ci    napi_value thisVar = nullptr;
13590826e83eSopenharmony_ci    napi_value result = nullptr;
13600826e83eSopenharmony_ci    napi_status status = napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
13610826e83eSopenharmony_ci    if (status != napi_status::napi_ok) {
13620826e83eSopenharmony_ci        WVLOG_E("napi_get_cb_info status not ok");
13630826e83eSopenharmony_ci        return result;
13640826e83eSopenharmony_ci    }
13650826e83eSopenharmony_ci
13660826e83eSopenharmony_ci    if (thisVar == nullptr) {
13670826e83eSopenharmony_ci        WVLOG_E("napi_get_cb_info thisVar is nullptr");
13680826e83eSopenharmony_ci        return result;
13690826e83eSopenharmony_ci    }
13700826e83eSopenharmony_ci
13710826e83eSopenharmony_ci    WebMessageExt *webMessageExt = nullptr;
13720826e83eSopenharmony_ci    status = napi_unwrap(env, thisVar, (void **)&webMessageExt);
13730826e83eSopenharmony_ci    if ((!webMessageExt) || (status != napi_ok)) {
13740826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
13750826e83eSopenharmony_ci        return nullptr;
13760826e83eSopenharmony_ci    }
13770826e83eSopenharmony_ci
13780826e83eSopenharmony_ci    int32_t type = webMessageExt->GetType();
13790826e83eSopenharmony_ci    status = napi_create_int32(env, type, &result);
13800826e83eSopenharmony_ci    if (status != napi_status::napi_ok) {
13810826e83eSopenharmony_ci        WVLOG_E("napi_create_int32 failed.");
13820826e83eSopenharmony_ci        return result;
13830826e83eSopenharmony_ci    }
13840826e83eSopenharmony_ci    return result;
13850826e83eSopenharmony_ci}
13860826e83eSopenharmony_ci
13870826e83eSopenharmony_cinapi_value NapiWebMessageExt::GetString(napi_env env, napi_callback_info info)
13880826e83eSopenharmony_ci{
13890826e83eSopenharmony_ci    WVLOG_D(" GetString webJsMessageExt start");
13900826e83eSopenharmony_ci    napi_value thisVar = nullptr;
13910826e83eSopenharmony_ci    napi_value result = nullptr;
13920826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
13930826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
13940826e83eSopenharmony_ci
13950826e83eSopenharmony_ci    WebMessageExt *webJsMessageExt = nullptr;
13960826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
13970826e83eSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, (void **)&webJsMessageExt));
13980826e83eSopenharmony_ci    if (webJsMessageExt == nullptr) {
13990826e83eSopenharmony_ci        WVLOG_E("unwrap webJsMessageExt failed.");
14000826e83eSopenharmony_ci        return result;
14010826e83eSopenharmony_ci    }
14020826e83eSopenharmony_ci
14030826e83eSopenharmony_ci    if (webJsMessageExt->GetType() != static_cast<int32_t>(WebMessageType::STRING)) {
14040826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, TYPE_NOT_MATCH_WITCH_VALUE);
14050826e83eSopenharmony_ci        return nullptr;
14060826e83eSopenharmony_ci    }
14070826e83eSopenharmony_ci
14080826e83eSopenharmony_ci    NapiParseUtils::ConvertNWebToNapiValue(env, webJsMessageExt->GetData(), result);
14090826e83eSopenharmony_ci    return result;
14100826e83eSopenharmony_ci}
14110826e83eSopenharmony_ci
14120826e83eSopenharmony_cinapi_value NapiWebMessageExt::GetNumber(napi_env env, napi_callback_info info)
14130826e83eSopenharmony_ci{
14140826e83eSopenharmony_ci    WVLOG_D("GetNumber webJsMessageExt start");
14150826e83eSopenharmony_ci    napi_value thisVar = nullptr;
14160826e83eSopenharmony_ci    napi_value result = nullptr;
14170826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
14180826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
14190826e83eSopenharmony_ci
14200826e83eSopenharmony_ci    WebMessageExt *webJsMessageExt = nullptr;
14210826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
14220826e83eSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, (void **)&webJsMessageExt));
14230826e83eSopenharmony_ci    if (webJsMessageExt == nullptr) {
14240826e83eSopenharmony_ci        WVLOG_E("unwrap webJsMessageExt failed.");
14250826e83eSopenharmony_ci        return result;
14260826e83eSopenharmony_ci    }
14270826e83eSopenharmony_ci
14280826e83eSopenharmony_ci    if (webJsMessageExt->GetType() != static_cast<int32_t>(WebMessageType::NUMBER)) {
14290826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, TYPE_NOT_MATCH_WITCH_VALUE);
14300826e83eSopenharmony_ci        WVLOG_E("GetNumber webJsMessageExt failed,not match");
14310826e83eSopenharmony_ci        return nullptr;
14320826e83eSopenharmony_ci    }
14330826e83eSopenharmony_ci
14340826e83eSopenharmony_ci    NapiParseUtils::ConvertNWebToNapiValue(env, webJsMessageExt->GetData(), result);
14350826e83eSopenharmony_ci    return result;
14360826e83eSopenharmony_ci}
14370826e83eSopenharmony_ci
14380826e83eSopenharmony_cinapi_value NapiWebMessageExt::GetBoolean(napi_env env, napi_callback_info info)
14390826e83eSopenharmony_ci{
14400826e83eSopenharmony_ci    napi_value thisVar = nullptr;
14410826e83eSopenharmony_ci    napi_value result = nullptr;
14420826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
14430826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
14440826e83eSopenharmony_ci
14450826e83eSopenharmony_ci    WebMessageExt *webJsMessageExt = nullptr;
14460826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
14470826e83eSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, (void **)&webJsMessageExt));
14480826e83eSopenharmony_ci    if (webJsMessageExt == nullptr) {
14490826e83eSopenharmony_ci        WVLOG_E("unwrap webJsMessageExt failed.");
14500826e83eSopenharmony_ci        return result;
14510826e83eSopenharmony_ci    }
14520826e83eSopenharmony_ci
14530826e83eSopenharmony_ci    if (webJsMessageExt->GetType() != static_cast<int32_t>(WebMessageType::BOOLEAN)) {
14540826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, TYPE_NOT_MATCH_WITCH_VALUE);
14550826e83eSopenharmony_ci        return nullptr;
14560826e83eSopenharmony_ci    }
14570826e83eSopenharmony_ci
14580826e83eSopenharmony_ci    NapiParseUtils::ConvertNWebToNapiValue(env, webJsMessageExt->GetData(), result);
14590826e83eSopenharmony_ci    return result;
14600826e83eSopenharmony_ci}
14610826e83eSopenharmony_ci
14620826e83eSopenharmony_cinapi_value NapiWebMessageExt::GetArrayBuffer(napi_env env, napi_callback_info info)
14630826e83eSopenharmony_ci{
14640826e83eSopenharmony_ci    napi_value thisVar = nullptr;
14650826e83eSopenharmony_ci    napi_value result = nullptr;
14660826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
14670826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
14680826e83eSopenharmony_ci
14690826e83eSopenharmony_ci    WebMessageExt *webJsMessageExt = nullptr;
14700826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
14710826e83eSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, (void **)&webJsMessageExt));
14720826e83eSopenharmony_ci    if (webJsMessageExt == nullptr) {
14730826e83eSopenharmony_ci        WVLOG_E("unwrap webJsMessageExt failed.");
14740826e83eSopenharmony_ci        return result;
14750826e83eSopenharmony_ci    }
14760826e83eSopenharmony_ci
14770826e83eSopenharmony_ci    if (webJsMessageExt->GetType() != static_cast<int32_t>(WebMessageType::ARRAYBUFFER)) {
14780826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, TYPE_NOT_MATCH_WITCH_VALUE);
14790826e83eSopenharmony_ci        return nullptr;
14800826e83eSopenharmony_ci    }
14810826e83eSopenharmony_ci    NapiParseUtils::ConvertNWebToNapiValue(env, webJsMessageExt->GetData(), result);
14820826e83eSopenharmony_ci    return result;
14830826e83eSopenharmony_ci}
14840826e83eSopenharmony_ci
14850826e83eSopenharmony_cinapi_value NapiWebMessageExt::GetArray(napi_env env, napi_callback_info info)
14860826e83eSopenharmony_ci{
14870826e83eSopenharmony_ci    napi_value thisVar = nullptr;
14880826e83eSopenharmony_ci    napi_value result = nullptr;
14890826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
14900826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
14910826e83eSopenharmony_ci
14920826e83eSopenharmony_ci    WebMessageExt *webJsMessageExt = nullptr;
14930826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
14940826e83eSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, (void **)&webJsMessageExt));
14950826e83eSopenharmony_ci    if (webJsMessageExt == nullptr) {
14960826e83eSopenharmony_ci        WVLOG_E("unwrap webJsMessageExt failed.");
14970826e83eSopenharmony_ci        return result;
14980826e83eSopenharmony_ci    }
14990826e83eSopenharmony_ci
15000826e83eSopenharmony_ci    if (webJsMessageExt->GetType() != static_cast<int32_t>(WebMessageType::ARRAY)) {
15010826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, TYPE_NOT_MATCH_WITCH_VALUE);
15020826e83eSopenharmony_ci        return nullptr;
15030826e83eSopenharmony_ci    }
15040826e83eSopenharmony_ci
15050826e83eSopenharmony_ci    NapiParseUtils::ConvertNWebToNapiValue(env, webJsMessageExt->GetData(), result);
15060826e83eSopenharmony_ci    return result;
15070826e83eSopenharmony_ci}
15080826e83eSopenharmony_ci
15090826e83eSopenharmony_cinapi_value NapiWebMessageExt::GetError(napi_env env, napi_callback_info info)
15100826e83eSopenharmony_ci{
15110826e83eSopenharmony_ci    napi_value thisVar = nullptr;
15120826e83eSopenharmony_ci    napi_value result = nullptr;
15130826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
15140826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
15150826e83eSopenharmony_ci
15160826e83eSopenharmony_ci    WebMessageExt *webJsMessageExt = nullptr;
15170826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
15180826e83eSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, (void **)&webJsMessageExt));
15190826e83eSopenharmony_ci    if (webJsMessageExt == nullptr) {
15200826e83eSopenharmony_ci        WVLOG_E("unwrap webJsMessageExt failed.");
15210826e83eSopenharmony_ci        return result;
15220826e83eSopenharmony_ci    }
15230826e83eSopenharmony_ci
15240826e83eSopenharmony_ci    if (webJsMessageExt->GetType() != static_cast<int32_t>(WebMessageType::ERROR)) {
15250826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, TYPE_NOT_MATCH_WITCH_VALUE);
15260826e83eSopenharmony_ci        return nullptr;
15270826e83eSopenharmony_ci    }
15280826e83eSopenharmony_ci
15290826e83eSopenharmony_ci    NapiParseUtils::ConvertNWebToNapiValue(env, webJsMessageExt->GetData(), result);
15300826e83eSopenharmony_ci    return result;
15310826e83eSopenharmony_ci}
15320826e83eSopenharmony_ci
15330826e83eSopenharmony_cinapi_value NapiWebMessageExt::SetType(napi_env env, napi_callback_info info)
15340826e83eSopenharmony_ci{
15350826e83eSopenharmony_ci    WVLOG_D("NapiWebMessageExt::SetType");
15360826e83eSopenharmony_ci    napi_value thisVar = nullptr;
15370826e83eSopenharmony_ci    napi_value result = nullptr;
15380826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
15390826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
15400826e83eSopenharmony_ci    int type = -1;
15410826e83eSopenharmony_ci    napi_status status = napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
15420826e83eSopenharmony_ci    if (status != napi_ok) {
15430826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
15440826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_TYPE_INVALID, "type"));
15450826e83eSopenharmony_ci        WVLOG_E("NapiWebMessageExt::SetType napi_get_cb_info failed");
15460826e83eSopenharmony_ci        return result;
15470826e83eSopenharmony_ci    }
15480826e83eSopenharmony_ci    if (thisVar == nullptr) {
15490826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
15500826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NOT_NULL, "type"));
15510826e83eSopenharmony_ci        WVLOG_E("NapiWebMessageExt::SetType thisVar is null");
15520826e83eSopenharmony_ci        return result;
15530826e83eSopenharmony_ci    }
15540826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
15550826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
15560826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
15570826e83eSopenharmony_ci        return result;
15580826e83eSopenharmony_ci    }
15590826e83eSopenharmony_ci    if (!NapiParseUtils::ParseInt32(env, argv[0], type)) {
15600826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR, ParamCheckErrorMsgTemplate::TYPE_ALL_INT);
15610826e83eSopenharmony_ci        return result;
15620826e83eSopenharmony_ci    }
15630826e83eSopenharmony_ci    if (type <= static_cast<int>(WebMessageType::NOTSUPPORT) || type > static_cast<int>(WebMessageType::ERROR)) {
15640826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, TYPE_NOT_MATCH_WITCH_VALUE);
15650826e83eSopenharmony_ci        return result;
15660826e83eSopenharmony_ci    }
15670826e83eSopenharmony_ci    WebMessageExt *webMessageExt = nullptr;
15680826e83eSopenharmony_ci    status = napi_unwrap(env, thisVar, (void **)&webMessageExt);
15690826e83eSopenharmony_ci    if (status != napi_ok) {
15700826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
15710826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_TYPE_INVALID, "type"));
15720826e83eSopenharmony_ci        WVLOG_E("NapiWebMessageExt::SetType napi_unwrap failed");
15730826e83eSopenharmony_ci        return result;
15740826e83eSopenharmony_ci    }
15750826e83eSopenharmony_ci    if (!webMessageExt) {
15760826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
15770826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NOT_NULL, "type"));
15780826e83eSopenharmony_ci        WVLOG_E("NapiWebMessageExt::SetType webMessageExt is null");
15790826e83eSopenharmony_ci        return result;
15800826e83eSopenharmony_ci    }
15810826e83eSopenharmony_ci    webMessageExt->SetType(type);
15820826e83eSopenharmony_ci    return result;
15830826e83eSopenharmony_ci}
15840826e83eSopenharmony_ci
15850826e83eSopenharmony_cinapi_value NapiWebMessageExt::SetString(napi_env env, napi_callback_info info)
15860826e83eSopenharmony_ci{
15870826e83eSopenharmony_ci    WVLOG_D("NapiWebMessageExt::SetString start");
15880826e83eSopenharmony_ci    napi_value thisVar = nullptr;
15890826e83eSopenharmony_ci    napi_value result = nullptr;
15900826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
15910826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
15920826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
15930826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
15940826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
15950826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
15960826e83eSopenharmony_ci        return result;
15970826e83eSopenharmony_ci    }
15980826e83eSopenharmony_ci
15990826e83eSopenharmony_ci    std::string value;
16000826e83eSopenharmony_ci    if (!NapiParseUtils::ParseString(env, argv[0], value)) {
16010826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
16020826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "message", "string"));
16030826e83eSopenharmony_ci        return result;
16040826e83eSopenharmony_ci    }
16050826e83eSopenharmony_ci    WebMessageExt *webMessageExt = nullptr;
16060826e83eSopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, (void **)&webMessageExt);
16070826e83eSopenharmony_ci    if ((!webMessageExt) || (status != napi_ok)) {
16080826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
16090826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_TYPE_INVALID, "message"));
16100826e83eSopenharmony_ci        return result;
16110826e83eSopenharmony_ci    }
16120826e83eSopenharmony_ci
16130826e83eSopenharmony_ci    int32_t type = webMessageExt->GetType();
16140826e83eSopenharmony_ci    if (type != static_cast<int32_t>(WebMessageType::STRING)) {
16150826e83eSopenharmony_ci        WVLOG_E("web message SetString error type:%{public}d", type);
16160826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, TYPE_NOT_MATCH_WITCH_VALUE);
16170826e83eSopenharmony_ci        return result;
16180826e83eSopenharmony_ci    }
16190826e83eSopenharmony_ci    webMessageExt->SetString(value);
16200826e83eSopenharmony_ci    return result;
16210826e83eSopenharmony_ci}
16220826e83eSopenharmony_ci
16230826e83eSopenharmony_cinapi_value NapiWebMessageExt::SetNumber(napi_env env, napi_callback_info info)
16240826e83eSopenharmony_ci{
16250826e83eSopenharmony_ci    WVLOG_D("NapiWebMessageExt::SetNumber start");
16260826e83eSopenharmony_ci    napi_value thisVar = nullptr;
16270826e83eSopenharmony_ci    napi_value result = nullptr;
16280826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
16290826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
16300826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
16310826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
16320826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
16330826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
16340826e83eSopenharmony_ci        return result;
16350826e83eSopenharmony_ci    }
16360826e83eSopenharmony_ci
16370826e83eSopenharmony_ci    double value = 0;
16380826e83eSopenharmony_ci    if (!NapiParseUtils::ParseDouble(env, argv[0], value)) {
16390826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
16400826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "message", "number"));
16410826e83eSopenharmony_ci        return result;
16420826e83eSopenharmony_ci    }
16430826e83eSopenharmony_ci
16440826e83eSopenharmony_ci    WebMessageExt *webMessageExt = nullptr;
16450826e83eSopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, (void **)&webMessageExt);
16460826e83eSopenharmony_ci    if ((!webMessageExt) || (status != napi_ok)) {
16470826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
16480826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_TYPE_INVALID, "message"));
16490826e83eSopenharmony_ci        return result;
16500826e83eSopenharmony_ci    }
16510826e83eSopenharmony_ci
16520826e83eSopenharmony_ci    int32_t type = webMessageExt->GetType();
16530826e83eSopenharmony_ci    if (type != static_cast<int32_t>(WebMessageType::NUMBER)) {
16540826e83eSopenharmony_ci        WVLOG_E("web message SetNumber error type:%{public}d", type);
16550826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, TYPE_NOT_MATCH_WITCH_VALUE);
16560826e83eSopenharmony_ci        return result;
16570826e83eSopenharmony_ci    }
16580826e83eSopenharmony_ci    webMessageExt->SetNumber(value);
16590826e83eSopenharmony_ci    return result;
16600826e83eSopenharmony_ci}
16610826e83eSopenharmony_ci
16620826e83eSopenharmony_cinapi_value NapiWebMessageExt::SetBoolean(napi_env env, napi_callback_info info)
16630826e83eSopenharmony_ci{
16640826e83eSopenharmony_ci    WVLOG_D("NapiWebMessageExt::SetBoolean start");
16650826e83eSopenharmony_ci    napi_value thisVar = nullptr;
16660826e83eSopenharmony_ci    napi_value result = nullptr;
16670826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
16680826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
16690826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
16700826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
16710826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
16720826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
16730826e83eSopenharmony_ci        return result;
16740826e83eSopenharmony_ci    }
16750826e83eSopenharmony_ci
16760826e83eSopenharmony_ci    bool value = 0;
16770826e83eSopenharmony_ci    if (!NapiParseUtils::ParseBoolean(env, argv[0], value)) {
16780826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
16790826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "message", "boolean"));
16800826e83eSopenharmony_ci        return result;
16810826e83eSopenharmony_ci    }
16820826e83eSopenharmony_ci
16830826e83eSopenharmony_ci    WebMessageExt *webMessageExt = nullptr;
16840826e83eSopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, (void **)&webMessageExt);
16850826e83eSopenharmony_ci    if ((!webMessageExt) || (status != napi_ok)) {
16860826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
16870826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_TYPE_INVALID, "message"));
16880826e83eSopenharmony_ci        return result;
16890826e83eSopenharmony_ci    }
16900826e83eSopenharmony_ci
16910826e83eSopenharmony_ci    int32_t type = webMessageExt->GetType();
16920826e83eSopenharmony_ci    if (type != static_cast<int32_t>(WebMessageType::BOOLEAN)) {
16930826e83eSopenharmony_ci        WVLOG_E("web message SetBoolean error type:%{public}d", type);
16940826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, TYPE_NOT_MATCH_WITCH_VALUE);
16950826e83eSopenharmony_ci        return result;
16960826e83eSopenharmony_ci    }
16970826e83eSopenharmony_ci    webMessageExt->SetBoolean(value);
16980826e83eSopenharmony_ci    return result;
16990826e83eSopenharmony_ci}
17000826e83eSopenharmony_ci
17010826e83eSopenharmony_cinapi_value NapiWebMessageExt::SetArrayBuffer(napi_env env, napi_callback_info info)
17020826e83eSopenharmony_ci{
17030826e83eSopenharmony_ci    WVLOG_D("NapiWebMessageExt::SetArrayBuffer start");
17040826e83eSopenharmony_ci    napi_value thisVar = nullptr;
17050826e83eSopenharmony_ci    napi_value result = nullptr;
17060826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
17070826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
17080826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
17090826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
17100826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
17110826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
17120826e83eSopenharmony_ci        return result;
17130826e83eSopenharmony_ci    }
17140826e83eSopenharmony_ci
17150826e83eSopenharmony_ci    bool isArrayBuffer = false;
17160826e83eSopenharmony_ci    NAPI_CALL(env, napi_is_arraybuffer(env, argv[INTEGER_ZERO], &isArrayBuffer));
17170826e83eSopenharmony_ci    if (!isArrayBuffer) {
17180826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
17190826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "message", "arrayBuffer"));
17200826e83eSopenharmony_ci        return result;
17210826e83eSopenharmony_ci    }
17220826e83eSopenharmony_ci
17230826e83eSopenharmony_ci    uint8_t *arrBuf = nullptr;
17240826e83eSopenharmony_ci    size_t byteLength = 0;
17250826e83eSopenharmony_ci    napi_get_arraybuffer_info(env, argv[INTEGER_ZERO], (void**)&arrBuf, &byteLength);
17260826e83eSopenharmony_ci    std::vector<uint8_t> vecData(arrBuf, arrBuf + byteLength);
17270826e83eSopenharmony_ci    WebMessageExt *webMessageExt = nullptr;
17280826e83eSopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, (void **)&webMessageExt);
17290826e83eSopenharmony_ci    if ((!webMessageExt) || (status != napi_ok)) {
17300826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
17310826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_TYPE_INVALID, "message"));
17320826e83eSopenharmony_ci        return result;
17330826e83eSopenharmony_ci    }
17340826e83eSopenharmony_ci
17350826e83eSopenharmony_ci    int32_t type = webMessageExt->GetType();
17360826e83eSopenharmony_ci    if (type != static_cast<int32_t>(WebMessageType::ARRAYBUFFER)) {
17370826e83eSopenharmony_ci        WVLOG_E("web message SetArrayBuffer error type:%{public}d", type);
17380826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, TYPE_NOT_MATCH_WITCH_VALUE);
17390826e83eSopenharmony_ci        return result;
17400826e83eSopenharmony_ci    }
17410826e83eSopenharmony_ci    webMessageExt->SetArrayBuffer(vecData);
17420826e83eSopenharmony_ci    return result;
17430826e83eSopenharmony_ci}
17440826e83eSopenharmony_ci
17450826e83eSopenharmony_cinapi_value NapiWebMessageExt::SetArray(napi_env env, napi_callback_info info)
17460826e83eSopenharmony_ci{
17470826e83eSopenharmony_ci    WVLOG_D("NapiWebMessageExt::SetArray start");
17480826e83eSopenharmony_ci    napi_value thisVar = nullptr;
17490826e83eSopenharmony_ci    napi_value result = nullptr;
17500826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
17510826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
17520826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
17530826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
17540826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
17550826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
17560826e83eSopenharmony_ci        return result;
17570826e83eSopenharmony_ci    }
17580826e83eSopenharmony_ci    bool isArray = false;
17590826e83eSopenharmony_ci    NAPI_CALL(env, napi_is_array(env, argv[INTEGER_ZERO], &isArray));
17600826e83eSopenharmony_ci    if (!isArray) {
17610826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
17620826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "message", "array"));
17630826e83eSopenharmony_ci        return result;
17640826e83eSopenharmony_ci    }
17650826e83eSopenharmony_ci    WebMessageExt *webMessageExt = nullptr;
17660826e83eSopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, (void **)&webMessageExt);
17670826e83eSopenharmony_ci    if ((!webMessageExt) || (status != napi_ok)) {
17680826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
17690826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_TYPE_INVALID, "message"));
17700826e83eSopenharmony_ci        return result;
17710826e83eSopenharmony_ci    }
17720826e83eSopenharmony_ci    int32_t type = webMessageExt->GetType();
17730826e83eSopenharmony_ci    if (type != static_cast<int32_t>(WebMessageType::ARRAY)) {
17740826e83eSopenharmony_ci        WVLOG_E("web message SetArray error type:%{public}d", type);
17750826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, TYPE_NOT_MATCH_WITCH_VALUE);
17760826e83eSopenharmony_ci        return result;
17770826e83eSopenharmony_ci    }
17780826e83eSopenharmony_ci    bool isDouble = false;
17790826e83eSopenharmony_ci    napi_valuetype valueType = GetArrayValueType(env, argv[INTEGER_ZERO], isDouble);
17800826e83eSopenharmony_ci    if (valueType == napi_undefined) {
17810826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
17820826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "message", "number"));
17830826e83eSopenharmony_ci        return result;
17840826e83eSopenharmony_ci    }
17850826e83eSopenharmony_ci    using SetArrayHandler = std::function<void(napi_env, napi_value, WebMessageExt*)>;
17860826e83eSopenharmony_ci    const std::unordered_map<napi_valuetype, SetArrayHandler> functionMap = {
17870826e83eSopenharmony_ci        { napi_boolean, SetArrayHandlerBoolean },
17880826e83eSopenharmony_ci        { napi_string, SetArrayHandlerString },
17890826e83eSopenharmony_ci        { napi_number, [isDouble](napi_env env, napi_value array, WebMessageExt* msgExt) {
17900826e83eSopenharmony_ci            isDouble ? SetArrayHandlerDouble(env, array, msgExt)
17910826e83eSopenharmony_ci                     : SetArrayHandlerInteger(env, array, msgExt);
17920826e83eSopenharmony_ci        } }
17930826e83eSopenharmony_ci    };
17940826e83eSopenharmony_ci    auto it = functionMap.find(valueType);
17950826e83eSopenharmony_ci    if (it != functionMap.end()) {
17960826e83eSopenharmony_ci        it->second(env, argv[INTEGER_ZERO], webMessageExt);
17970826e83eSopenharmony_ci    }
17980826e83eSopenharmony_ci    return result;
17990826e83eSopenharmony_ci}
18000826e83eSopenharmony_ci
18010826e83eSopenharmony_cinapi_value NapiWebMessageExt::SetError(napi_env env, napi_callback_info info)
18020826e83eSopenharmony_ci{
18030826e83eSopenharmony_ci    WVLOG_D("NapiWebMessageExt::SetError start");
18040826e83eSopenharmony_ci    napi_value thisVar = nullptr;
18050826e83eSopenharmony_ci    napi_value result = nullptr;
18060826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
18070826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
18080826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
18090826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
18100826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
18110826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
18120826e83eSopenharmony_ci        return result;
18130826e83eSopenharmony_ci    }
18140826e83eSopenharmony_ci
18150826e83eSopenharmony_ci    bool isError = false;
18160826e83eSopenharmony_ci    NAPI_CALL(env, napi_is_error(env, argv[INTEGER_ZERO], &isError));
18170826e83eSopenharmony_ci    if (!isError) {
18180826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
18190826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "message", "error"));
18200826e83eSopenharmony_ci        return result;
18210826e83eSopenharmony_ci    }
18220826e83eSopenharmony_ci
18230826e83eSopenharmony_ci    napi_value nameObj = 0;
18240826e83eSopenharmony_ci    napi_get_named_property(env, argv[INTEGER_ZERO], "name", &nameObj);
18250826e83eSopenharmony_ci    std::string nameVal;
18260826e83eSopenharmony_ci    if (!NapiParseUtils::ParseString(env, nameObj, nameVal)) {
18270826e83eSopenharmony_ci        return result;
18280826e83eSopenharmony_ci    }
18290826e83eSopenharmony_ci
18300826e83eSopenharmony_ci    napi_value msgObj = 0;
18310826e83eSopenharmony_ci    napi_get_named_property(env, argv[INTEGER_ZERO], "message", &msgObj);
18320826e83eSopenharmony_ci    std::string msgVal;
18330826e83eSopenharmony_ci    if (!NapiParseUtils::ParseString(env, msgObj, msgVal)) {
18340826e83eSopenharmony_ci        return result;
18350826e83eSopenharmony_ci    }
18360826e83eSopenharmony_ci
18370826e83eSopenharmony_ci    WebMessageExt *webMessageExt = nullptr;
18380826e83eSopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, (void **)&webMessageExt);
18390826e83eSopenharmony_ci    if ((!webMessageExt) || (status != napi_ok)) {
18400826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
18410826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_TYPE_INVALID, "message"));
18420826e83eSopenharmony_ci        return result;
18430826e83eSopenharmony_ci    }
18440826e83eSopenharmony_ci
18450826e83eSopenharmony_ci    int32_t type = webMessageExt->GetType();
18460826e83eSopenharmony_ci    if (type != static_cast<int32_t>(WebMessageType::ERROR)) {
18470826e83eSopenharmony_ci        WVLOG_E("web message SetError error type:%{public}d", type);
18480826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, TYPE_NOT_MATCH_WITCH_VALUE);
18490826e83eSopenharmony_ci        return result;
18500826e83eSopenharmony_ci    }
18510826e83eSopenharmony_ci    webMessageExt->SetError(nameVal, msgVal);
18520826e83eSopenharmony_ci    return result;
18530826e83eSopenharmony_ci}
18540826e83eSopenharmony_ci
18550826e83eSopenharmony_cinapi_value NapiWebviewController::CreateWebMessagePorts(napi_env env, napi_callback_info info)
18560826e83eSopenharmony_ci{
18570826e83eSopenharmony_ci    WVLOG_D("create web message port");
18580826e83eSopenharmony_ci    napi_value thisVar = nullptr;
18590826e83eSopenharmony_ci    napi_value result = nullptr;
18600826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
18610826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
18620826e83eSopenharmony_ci    bool isExtentionType = false;
18630826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
18640826e83eSopenharmony_ci    if (argc != INTEGER_ZERO && argc != INTEGER_ONE) {
18650826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
18660826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_TWO, "zero", "one"));
18670826e83eSopenharmony_ci        return result;
18680826e83eSopenharmony_ci    }
18690826e83eSopenharmony_ci
18700826e83eSopenharmony_ci    if (argc == INTEGER_ONE) {
18710826e83eSopenharmony_ci        if (!NapiParseUtils::ParseBoolean(env, argv[0], isExtentionType)) {
18720826e83eSopenharmony_ci            BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
18730826e83eSopenharmony_ci                NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "isExtentionType", "boolean"));
18740826e83eSopenharmony_ci            return result;
18750826e83eSopenharmony_ci        }
18760826e83eSopenharmony_ci    }
18770826e83eSopenharmony_ci
18780826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
18790826e83eSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, (void **)&webviewController));
18800826e83eSopenharmony_ci    if (webviewController == nullptr || !webviewController->IsInit()) {
18810826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
18820826e83eSopenharmony_ci        WVLOG_E("create message port failed, napi unwrap webviewController failed");
18830826e83eSopenharmony_ci        return nullptr;
18840826e83eSopenharmony_ci    }
18850826e83eSopenharmony_ci    int32_t nwebId = webviewController->GetWebId();
18860826e83eSopenharmony_ci    std::vector<std::string> ports = webviewController->CreateWebMessagePorts();
18870826e83eSopenharmony_ci    if (ports.size() != INTEGER_TWO) {
18880826e83eSopenharmony_ci        WVLOG_E("create web message port failed");
18890826e83eSopenharmony_ci        return result;
18900826e83eSopenharmony_ci    }
18910826e83eSopenharmony_ci    napi_value msgPortcons = nullptr;
18920826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_reference_value(env, g_classWebMsgPort, &msgPortcons));
18930826e83eSopenharmony_ci    napi_create_array(env, &result);
18940826e83eSopenharmony_ci    napi_value consParam[INTEGER_TWO][INTEGER_THREE] = {{0}};
18950826e83eSopenharmony_ci    for (uint32_t i = 0; i < INTEGER_TWO; i++) {
18960826e83eSopenharmony_ci        napi_value msgPortObj = nullptr;
18970826e83eSopenharmony_ci        NAPI_CALL(env, napi_create_int32(env, nwebId, &consParam[i][INTEGER_ZERO]));
18980826e83eSopenharmony_ci        NAPI_CALL(env, napi_create_string_utf8(env, ports[i].c_str(), ports[i].length(), &consParam[i][INTEGER_ONE]));
18990826e83eSopenharmony_ci        NAPI_CALL(env, napi_get_boolean(env, isExtentionType, &consParam[i][INTEGER_TWO]));
19000826e83eSopenharmony_ci        NAPI_CALL(env, napi_new_instance(env, msgPortcons, INTEGER_THREE, consParam[i], &msgPortObj));
19010826e83eSopenharmony_ci        napi_value jsExtention;
19020826e83eSopenharmony_ci        napi_get_boolean(env, isExtentionType, &jsExtention);
19030826e83eSopenharmony_ci        napi_set_named_property(env, msgPortObj, "isExtentionType", jsExtention);
19040826e83eSopenharmony_ci
19050826e83eSopenharmony_ci        napi_set_element(env, result, i, msgPortObj);
19060826e83eSopenharmony_ci    }
19070826e83eSopenharmony_ci
19080826e83eSopenharmony_ci    return result;
19090826e83eSopenharmony_ci}
19100826e83eSopenharmony_ci
19110826e83eSopenharmony_cibool GetSendPorts(napi_env env, napi_value argv, std::vector<std::string>& sendPorts)
19120826e83eSopenharmony_ci{
19130826e83eSopenharmony_ci    uint32_t arrayLen = 0;
19140826e83eSopenharmony_ci    napi_get_array_length(env, argv, &arrayLen);
19150826e83eSopenharmony_ci    if (arrayLen == 0) {
19160826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
19170826e83eSopenharmony_ci        return false;
19180826e83eSopenharmony_ci    }
19190826e83eSopenharmony_ci
19200826e83eSopenharmony_ci    napi_valuetype valueType = napi_undefined;
19210826e83eSopenharmony_ci    for (uint32_t i = 0; i < arrayLen; i++) {
19220826e83eSopenharmony_ci        napi_value portItem = nullptr;
19230826e83eSopenharmony_ci        napi_get_element(env, argv, i, &portItem);
19240826e83eSopenharmony_ci        napi_typeof(env, portItem, &valueType);
19250826e83eSopenharmony_ci        if (valueType != napi_object) {
19260826e83eSopenharmony_ci            BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
19270826e83eSopenharmony_ci            return false;
19280826e83eSopenharmony_ci        }
19290826e83eSopenharmony_ci        WebMessagePort *msgPort = nullptr;
19300826e83eSopenharmony_ci        napi_status status = napi_unwrap(env, portItem, (void **)&msgPort);
19310826e83eSopenharmony_ci        if ((!msgPort) || (status != napi_ok)) {
19320826e83eSopenharmony_ci            WVLOG_E("post port to html failed, napi unwrap msg port fail");
19330826e83eSopenharmony_ci            return false;
19340826e83eSopenharmony_ci        }
19350826e83eSopenharmony_ci        std::string portHandle = msgPort->GetPortHandle();
19360826e83eSopenharmony_ci        sendPorts.emplace_back(portHandle);
19370826e83eSopenharmony_ci    }
19380826e83eSopenharmony_ci    return true;
19390826e83eSopenharmony_ci}
19400826e83eSopenharmony_ci
19410826e83eSopenharmony_cinapi_value NapiWebviewController::PostMessage(napi_env env, napi_callback_info info)
19420826e83eSopenharmony_ci{
19430826e83eSopenharmony_ci    WVLOG_D("post message port");
19440826e83eSopenharmony_ci    napi_value thisVar = nullptr;
19450826e83eSopenharmony_ci    napi_value result = nullptr;
19460826e83eSopenharmony_ci    size_t argc = INTEGER_THREE;
19470826e83eSopenharmony_ci    napi_value argv[INTEGER_THREE];
19480826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
19490826e83eSopenharmony_ci    if (argc != INTEGER_THREE) {
19500826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
19510826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "three"));
19520826e83eSopenharmony_ci        return result;
19530826e83eSopenharmony_ci    }
19540826e83eSopenharmony_ci
19550826e83eSopenharmony_ci    std::string portName;
19560826e83eSopenharmony_ci    if (!NapiParseUtils::ParseString(env, argv[INTEGER_ZERO], portName)) {
19570826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
19580826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "name", "string"));
19590826e83eSopenharmony_ci        return result;
19600826e83eSopenharmony_ci    }
19610826e83eSopenharmony_ci
19620826e83eSopenharmony_ci    bool isArray = false;
19630826e83eSopenharmony_ci    NAPI_CALL(env, napi_is_array(env, argv[INTEGER_ONE], &isArray));
19640826e83eSopenharmony_ci    if (!isArray) {
19650826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
19660826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "ports", "array"));
19670826e83eSopenharmony_ci        return result;
19680826e83eSopenharmony_ci    }
19690826e83eSopenharmony_ci    std::vector<std::string> sendPorts;
19700826e83eSopenharmony_ci    if (!GetSendPorts(env, argv[INTEGER_ONE], sendPorts)) {
19710826e83eSopenharmony_ci        WVLOG_E("post port to html failed, getSendPorts fail");
19720826e83eSopenharmony_ci        return result;
19730826e83eSopenharmony_ci    }
19740826e83eSopenharmony_ci
19750826e83eSopenharmony_ci    std::string urlStr;
19760826e83eSopenharmony_ci    if (!NapiParseUtils::ParseString(env, argv[INTEGER_TWO], urlStr)) {
19770826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
19780826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "uri", "string"));
19790826e83eSopenharmony_ci        return result;
19800826e83eSopenharmony_ci    }
19810826e83eSopenharmony_ci
19820826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
19830826e83eSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, (void **)&webviewController));
19840826e83eSopenharmony_ci    if (webviewController == nullptr || !webviewController->IsInit()) {
19850826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
19860826e83eSopenharmony_ci        WVLOG_E("post port to html failed, napi unwrap webviewController failed");
19870826e83eSopenharmony_ci        return nullptr;
19880826e83eSopenharmony_ci    }
19890826e83eSopenharmony_ci
19900826e83eSopenharmony_ci    webviewController->PostWebMessage(portName, sendPorts, urlStr);
19910826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
19920826e83eSopenharmony_ci
19930826e83eSopenharmony_ci    return result;
19940826e83eSopenharmony_ci}
19950826e83eSopenharmony_ci
19960826e83eSopenharmony_cinapi_value NapiWebMessagePort::JsConstructor(napi_env env, napi_callback_info info)
19970826e83eSopenharmony_ci{
19980826e83eSopenharmony_ci    WVLOG_D("web message port construct");
19990826e83eSopenharmony_ci    napi_value thisVar = nullptr;
20000826e83eSopenharmony_ci    size_t argc = INTEGER_THREE;
20010826e83eSopenharmony_ci    napi_value argv[INTEGER_THREE] = {0};
20020826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
20030826e83eSopenharmony_ci
20040826e83eSopenharmony_ci    int32_t webId = -1;
20050826e83eSopenharmony_ci    if (!NapiParseUtils::ParseInt32(env, argv[INTEGER_ZERO], webId)) {
20060826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
20070826e83eSopenharmony_ci        return nullptr;
20080826e83eSopenharmony_ci    }
20090826e83eSopenharmony_ci
20100826e83eSopenharmony_ci    std::string portHandle;
20110826e83eSopenharmony_ci    if (!NapiParseUtils::ParseString(env, argv[INTEGER_ONE], portHandle)) {
20120826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
20130826e83eSopenharmony_ci        return nullptr;
20140826e83eSopenharmony_ci    }
20150826e83eSopenharmony_ci
20160826e83eSopenharmony_ci    bool isExtentionType = false;
20170826e83eSopenharmony_ci    if (!NapiParseUtils::ParseBoolean(env, argv[INTEGER_TWO], isExtentionType)) {
20180826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
20190826e83eSopenharmony_ci        return nullptr;
20200826e83eSopenharmony_ci    }
20210826e83eSopenharmony_ci
20220826e83eSopenharmony_ci    WebMessagePort *msgPort = new (std::nothrow) WebMessagePort(webId, portHandle, isExtentionType);
20230826e83eSopenharmony_ci    if (msgPort == nullptr) {
20240826e83eSopenharmony_ci        WVLOG_E("new msg port failed");
20250826e83eSopenharmony_ci        return nullptr;
20260826e83eSopenharmony_ci    }
20270826e83eSopenharmony_ci    NAPI_CALL(env, napi_wrap(env, thisVar, msgPort,
20280826e83eSopenharmony_ci        [](napi_env env, void *data, void *hint) {
20290826e83eSopenharmony_ci            WebMessagePort *msgPort = static_cast<WebMessagePort *>(data);
20300826e83eSopenharmony_ci            delete msgPort;
20310826e83eSopenharmony_ci        },
20320826e83eSopenharmony_ci        nullptr, nullptr));
20330826e83eSopenharmony_ci    return thisVar;
20340826e83eSopenharmony_ci}
20350826e83eSopenharmony_ci
20360826e83eSopenharmony_cinapi_value NapiWebMessagePort::Close(napi_env env, napi_callback_info info)
20370826e83eSopenharmony_ci{
20380826e83eSopenharmony_ci    WVLOG_D("close message port");
20390826e83eSopenharmony_ci    napi_value thisVar = nullptr;
20400826e83eSopenharmony_ci    napi_value result = nullptr;
20410826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
20420826e83eSopenharmony_ci
20430826e83eSopenharmony_ci    WebMessagePort *msgPort = nullptr;
20440826e83eSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, (void **)&msgPort));
20450826e83eSopenharmony_ci    if (msgPort == nullptr) {
20460826e83eSopenharmony_ci        WVLOG_E("close message port failed, napi unwrap msg port failed");
20470826e83eSopenharmony_ci        return nullptr;
20480826e83eSopenharmony_ci    }
20490826e83eSopenharmony_ci    ErrCode ret = msgPort->ClosePort();
20500826e83eSopenharmony_ci    if (ret != NO_ERROR) {
20510826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, ret);
20520826e83eSopenharmony_ci        return result;
20530826e83eSopenharmony_ci    }
20540826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
20550826e83eSopenharmony_ci
20560826e83eSopenharmony_ci    return result;
20570826e83eSopenharmony_ci}
20580826e83eSopenharmony_ci
20590826e83eSopenharmony_cibool PostMessageEventMsgHandler(napi_env env, napi_value argv, napi_valuetype valueType, bool isArrayBuffer,
20600826e83eSopenharmony_ci    std::shared_ptr<NWebMessage> webMsg)
20610826e83eSopenharmony_ci{
20620826e83eSopenharmony_ci    if (valueType == napi_string) {
20630826e83eSopenharmony_ci        size_t bufferSize = 0;
20640826e83eSopenharmony_ci        napi_get_value_string_utf8(env, argv, nullptr, 0, &bufferSize);
20650826e83eSopenharmony_ci        if (bufferSize > UINT_MAX) {
20660826e83eSopenharmony_ci            WVLOG_E("String length is too long");
20670826e83eSopenharmony_ci            return false;
20680826e83eSopenharmony_ci        }
20690826e83eSopenharmony_ci        char* stringValue = new (std::nothrow) char[bufferSize + 1];
20700826e83eSopenharmony_ci        if (stringValue == nullptr) {
20710826e83eSopenharmony_ci            BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
20720826e83eSopenharmony_ci            return false;
20730826e83eSopenharmony_ci        }
20740826e83eSopenharmony_ci        size_t jsStringLength = 0;
20750826e83eSopenharmony_ci        napi_get_value_string_utf8(env, argv, stringValue, bufferSize + 1, &jsStringLength);
20760826e83eSopenharmony_ci        std::string message(stringValue);
20770826e83eSopenharmony_ci        delete [] stringValue;
20780826e83eSopenharmony_ci        stringValue = nullptr;
20790826e83eSopenharmony_ci
20800826e83eSopenharmony_ci        webMsg->SetType(NWebValue::Type::STRING);
20810826e83eSopenharmony_ci        webMsg->SetString(message);
20820826e83eSopenharmony_ci    } else if (isArrayBuffer) {
20830826e83eSopenharmony_ci        uint8_t *arrBuf = nullptr;
20840826e83eSopenharmony_ci        size_t byteLength = 0;
20850826e83eSopenharmony_ci        napi_get_arraybuffer_info(env, argv, (void**)&arrBuf, &byteLength);
20860826e83eSopenharmony_ci        std::vector<uint8_t> vecData(arrBuf, arrBuf + byteLength);
20870826e83eSopenharmony_ci        webMsg->SetType(NWebValue::Type::BINARY);
20880826e83eSopenharmony_ci        webMsg->SetBinary(vecData);
20890826e83eSopenharmony_ci    }
20900826e83eSopenharmony_ci    return true;
20910826e83eSopenharmony_ci}
20920826e83eSopenharmony_ci
20930826e83eSopenharmony_cinapi_value NapiWebMessagePort::PostMessageEvent(napi_env env, napi_callback_info info)
20940826e83eSopenharmony_ci{
20950826e83eSopenharmony_ci    WVLOG_D("message port post message");
20960826e83eSopenharmony_ci    napi_value thisVar = nullptr;
20970826e83eSopenharmony_ci    napi_value result = nullptr;
20980826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
20990826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE];
21000826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
21010826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
21020826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
21030826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
21040826e83eSopenharmony_ci        return result;
21050826e83eSopenharmony_ci    }
21060826e83eSopenharmony_ci    napi_valuetype valueType = napi_undefined;
21070826e83eSopenharmony_ci    napi_typeof(env, argv[INTEGER_ZERO], &valueType);
21080826e83eSopenharmony_ci
21090826e83eSopenharmony_ci    bool isArrayBuffer = false;
21100826e83eSopenharmony_ci    NAPI_CALL(env, napi_is_arraybuffer(env, argv[INTEGER_ZERO], &isArrayBuffer));
21110826e83eSopenharmony_ci    if (valueType != napi_string && !isArrayBuffer) {
21120826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
21130826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_TYPE_INVALID, "message"));
21140826e83eSopenharmony_ci        return result;
21150826e83eSopenharmony_ci    }
21160826e83eSopenharmony_ci
21170826e83eSopenharmony_ci    auto webMsg = std::make_shared<OHOS::NWeb::NWebMessage>(NWebValue::Type::NONE);
21180826e83eSopenharmony_ci    if (!PostMessageEventMsgHandler(env, argv[INTEGER_ZERO], valueType, isArrayBuffer, webMsg)) {
21190826e83eSopenharmony_ci        WVLOG_E("post message failed, PostMessageEventMsgHandler failed");
21200826e83eSopenharmony_ci        return result;
21210826e83eSopenharmony_ci    }
21220826e83eSopenharmony_ci
21230826e83eSopenharmony_ci    WebMessagePort *msgPort = nullptr;
21240826e83eSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, (void **)&msgPort));
21250826e83eSopenharmony_ci    if (msgPort == nullptr) {
21260826e83eSopenharmony_ci        WVLOG_E("post message failed, napi unwrap msg port failed");
21270826e83eSopenharmony_ci        return nullptr;
21280826e83eSopenharmony_ci    }
21290826e83eSopenharmony_ci    ErrCode ret = msgPort->PostPortMessage(webMsg);
21300826e83eSopenharmony_ci    if (ret != NO_ERROR) {
21310826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, ret);
21320826e83eSopenharmony_ci        return result;
21330826e83eSopenharmony_ci    }
21340826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
21350826e83eSopenharmony_ci
21360826e83eSopenharmony_ci    return result;
21370826e83eSopenharmony_ci}
21380826e83eSopenharmony_ci
21390826e83eSopenharmony_cinapi_value NapiWebMessagePort::PostMessageEventExt(napi_env env, napi_callback_info info)
21400826e83eSopenharmony_ci{
21410826e83eSopenharmony_ci    WVLOG_D("message PostMessageEventExt start");
21420826e83eSopenharmony_ci    napi_value thisVar = nullptr;
21430826e83eSopenharmony_ci    napi_value result = nullptr;
21440826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
21450826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE];
21460826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
21470826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
21480826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
21490826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
21500826e83eSopenharmony_ci        return result;
21510826e83eSopenharmony_ci    }
21520826e83eSopenharmony_ci    napi_valuetype valueType = napi_undefined;
21530826e83eSopenharmony_ci    napi_typeof(env, argv[INTEGER_ZERO], &valueType);
21540826e83eSopenharmony_ci    if (valueType != napi_object) {
21550826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
21560826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_TYPE_INVALID, "message"));
21570826e83eSopenharmony_ci        return result;
21580826e83eSopenharmony_ci    }
21590826e83eSopenharmony_ci
21600826e83eSopenharmony_ci    WebMessageExt *webMessageExt = nullptr;
21610826e83eSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, argv[INTEGER_ZERO], (void **)&webMessageExt));
21620826e83eSopenharmony_ci    if (webMessageExt == nullptr) {
21630826e83eSopenharmony_ci        WVLOG_E("post message failed, napi unwrap msg port failed");
21640826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
21650826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NOT_NULL, "message"));
21660826e83eSopenharmony_ci        return nullptr;
21670826e83eSopenharmony_ci    }
21680826e83eSopenharmony_ci
21690826e83eSopenharmony_ci    WebMessagePort *msgPort = nullptr;
21700826e83eSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, (void **)&msgPort));
21710826e83eSopenharmony_ci    if (msgPort == nullptr) {
21720826e83eSopenharmony_ci        WVLOG_E("post message failed, napi unwrap msg port failed");
21730826e83eSopenharmony_ci        return nullptr;
21740826e83eSopenharmony_ci    }
21750826e83eSopenharmony_ci
21760826e83eSopenharmony_ci    if (!msgPort->IsExtentionType()) {
21770826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
21780826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_TYPE_INVALID, "message"));
21790826e83eSopenharmony_ci        return result;
21800826e83eSopenharmony_ci    }
21810826e83eSopenharmony_ci
21820826e83eSopenharmony_ci    ErrCode ret = msgPort->PostPortMessage(webMessageExt->GetData());
21830826e83eSopenharmony_ci    if (ret != NO_ERROR) {
21840826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, ret);
21850826e83eSopenharmony_ci        return result;
21860826e83eSopenharmony_ci    }
21870826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
21880826e83eSopenharmony_ci
21890826e83eSopenharmony_ci    return result;
21900826e83eSopenharmony_ci}
21910826e83eSopenharmony_ci
21920826e83eSopenharmony_ci
21930826e83eSopenharmony_cinapi_value NapiWebMessagePort::OnMessageEventExt(napi_env env, napi_callback_info info)
21940826e83eSopenharmony_ci{
21950826e83eSopenharmony_ci    WVLOG_D("message port set OnMessageEventExt callback");
21960826e83eSopenharmony_ci    napi_value thisVar = nullptr;
21970826e83eSopenharmony_ci    napi_value result = nullptr;
21980826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
21990826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE];
22000826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
22010826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
22020826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
22030826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
22040826e83eSopenharmony_ci        return result;
22050826e83eSopenharmony_ci    }
22060826e83eSopenharmony_ci    napi_valuetype valueType = napi_undefined;
22070826e83eSopenharmony_ci    napi_typeof(env, argv[INTEGER_ZERO], &valueType);
22080826e83eSopenharmony_ci    if (valueType != napi_function) {
22090826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
22100826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "callback", "function"));
22110826e83eSopenharmony_ci        return result;
22120826e83eSopenharmony_ci    }
22130826e83eSopenharmony_ci
22140826e83eSopenharmony_ci    napi_ref onMsgEventFunc = nullptr;
22150826e83eSopenharmony_ci    NAPI_CALL(env, napi_create_reference(env, argv[INTEGER_ZERO], INTEGER_ONE, &onMsgEventFunc));
22160826e83eSopenharmony_ci
22170826e83eSopenharmony_ci    auto callbackImpl = std::make_shared<NWebValueCallbackImpl>(env, onMsgEventFunc, true);
22180826e83eSopenharmony_ci
22190826e83eSopenharmony_ci    WebMessagePort *msgPort = nullptr;
22200826e83eSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, (void **)&msgPort));
22210826e83eSopenharmony_ci    if (msgPort == nullptr) {
22220826e83eSopenharmony_ci        WVLOG_E("set message event callback failed, napi unwrap msg port failed");
22230826e83eSopenharmony_ci        napi_delete_reference(env, onMsgEventFunc);
22240826e83eSopenharmony_ci        return nullptr;
22250826e83eSopenharmony_ci    }
22260826e83eSopenharmony_ci    ErrCode ret = msgPort->SetPortMessageCallback(callbackImpl);
22270826e83eSopenharmony_ci    if (ret != NO_ERROR) {
22280826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, ret);
22290826e83eSopenharmony_ci    }
22300826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
22310826e83eSopenharmony_ci    return result;
22320826e83eSopenharmony_ci}
22330826e83eSopenharmony_ci
22340826e83eSopenharmony_cibool UvWebMsgOnReceiveCbDataHandler(NapiWebMessagePort::WebMsgPortParam *data, napi_value& result)
22350826e83eSopenharmony_ci{
22360826e83eSopenharmony_ci    if (data->extention_) {
22370826e83eSopenharmony_ci        napi_value webMsgExt = nullptr;
22380826e83eSopenharmony_ci        napi_status status = napi_get_reference_value(data->env_, g_webMsgExtClassRef, &webMsgExt);
22390826e83eSopenharmony_ci        if (status != napi_status::napi_ok) {
22400826e83eSopenharmony_ci            WVLOG_E("napi_get_reference_value failed.");
22410826e83eSopenharmony_ci            return false;
22420826e83eSopenharmony_ci        }
22430826e83eSopenharmony_ci        status = napi_new_instance(data->env_, webMsgExt, 0, NULL, &result);
22440826e83eSopenharmony_ci        if (status != napi_status::napi_ok) {
22450826e83eSopenharmony_ci            WVLOG_E("napi_new_instance failed.");
22460826e83eSopenharmony_ci            return false;
22470826e83eSopenharmony_ci        }
22480826e83eSopenharmony_ci
22490826e83eSopenharmony_ci        WebMessageExt *webMessageExt = new (std::nothrow) WebMessageExt(data->msg_);
22500826e83eSopenharmony_ci        if (webMessageExt == nullptr) {
22510826e83eSopenharmony_ci            WVLOG_E("new WebMessageExt failed.");
22520826e83eSopenharmony_ci            return false;
22530826e83eSopenharmony_ci        }
22540826e83eSopenharmony_ci
22550826e83eSopenharmony_ci        status = napi_wrap(data->env_, result, webMessageExt,
22560826e83eSopenharmony_ci            [](napi_env env, void *data, void *hint) {
22570826e83eSopenharmony_ci                WebMessageExt *webMessageExt = static_cast<WebMessageExt *>(data);
22580826e83eSopenharmony_ci                delete webMessageExt;
22590826e83eSopenharmony_ci            },
22600826e83eSopenharmony_ci            nullptr, nullptr);
22610826e83eSopenharmony_ci        if (status != napi_status::napi_ok) {
22620826e83eSopenharmony_ci            WVLOG_E("napi_wrap failed.");
22630826e83eSopenharmony_ci            return false;
22640826e83eSopenharmony_ci        }
22650826e83eSopenharmony_ci    } else {
22660826e83eSopenharmony_ci        NapiParseUtils::ConvertNWebToNapiValue(data->env_, data->msg_, result);
22670826e83eSopenharmony_ci    }
22680826e83eSopenharmony_ci    return true;
22690826e83eSopenharmony_ci}
22700826e83eSopenharmony_ci
22710826e83eSopenharmony_civoid NWebValueCallbackImpl::UvWebMessageOnReceiveValueCallback(uv_work_t *work, int status)
22720826e83eSopenharmony_ci{
22730826e83eSopenharmony_ci    if (work == nullptr) {
22740826e83eSopenharmony_ci        WVLOG_E("uv work is null");
22750826e83eSopenharmony_ci        return;
22760826e83eSopenharmony_ci    }
22770826e83eSopenharmony_ci    NapiWebMessagePort::WebMsgPortParam *data = reinterpret_cast<NapiWebMessagePort::WebMsgPortParam*>(work->data);
22780826e83eSopenharmony_ci    if (data == nullptr) {
22790826e83eSopenharmony_ci        WVLOG_E("WebMsgPortParam is null");
22800826e83eSopenharmony_ci        delete work;
22810826e83eSopenharmony_ci        work = nullptr;
22820826e83eSopenharmony_ci        return;
22830826e83eSopenharmony_ci    }
22840826e83eSopenharmony_ci    napi_handle_scope scope = nullptr;
22850826e83eSopenharmony_ci    napi_open_handle_scope(data->env_, &scope);
22860826e83eSopenharmony_ci    if (scope == nullptr) {
22870826e83eSopenharmony_ci        delete work;
22880826e83eSopenharmony_ci        work = nullptr;
22890826e83eSopenharmony_ci        return;
22900826e83eSopenharmony_ci    }
22910826e83eSopenharmony_ci    napi_value result[INTEGER_ONE] = {0};
22920826e83eSopenharmony_ci    if (!UvWebMsgOnReceiveCbDataHandler(data, result[INTEGER_ZERO])) {
22930826e83eSopenharmony_ci        delete work;
22940826e83eSopenharmony_ci        work = nullptr;
22950826e83eSopenharmony_ci        napi_close_handle_scope(data->env_, scope);
22960826e83eSopenharmony_ci        return;
22970826e83eSopenharmony_ci    }
22980826e83eSopenharmony_ci
22990826e83eSopenharmony_ci    napi_value onMsgEventFunc = nullptr;
23000826e83eSopenharmony_ci    napi_get_reference_value(data->env_, data->callback_, &onMsgEventFunc);
23010826e83eSopenharmony_ci    napi_value placeHodler = nullptr;
23020826e83eSopenharmony_ci    napi_call_function(data->env_, nullptr, onMsgEventFunc, INTEGER_ONE, &result[INTEGER_ZERO], &placeHodler);
23030826e83eSopenharmony_ci
23040826e83eSopenharmony_ci    std::unique_lock<std::mutex> lock(data->mutex_);
23050826e83eSopenharmony_ci    data->ready_ = true;
23060826e83eSopenharmony_ci    data->condition_.notify_all();
23070826e83eSopenharmony_ci    napi_close_handle_scope(data->env_, scope);
23080826e83eSopenharmony_ci}
23090826e83eSopenharmony_ci
23100826e83eSopenharmony_cistatic void InvokeWebMessageCallback(NapiWebMessagePort::WebMsgPortParam *data)
23110826e83eSopenharmony_ci{
23120826e83eSopenharmony_ci    napi_handle_scope scope = nullptr;
23130826e83eSopenharmony_ci    napi_open_handle_scope(data->env_, &scope);
23140826e83eSopenharmony_ci    if (scope == nullptr) {
23150826e83eSopenharmony_ci        WVLOG_E("scope is null");
23160826e83eSopenharmony_ci        return;
23170826e83eSopenharmony_ci    }
23180826e83eSopenharmony_ci    napi_value result[INTEGER_ONE] = {0};
23190826e83eSopenharmony_ci    if (!UvWebMsgOnReceiveCbDataHandler(data, result[INTEGER_ZERO])) {
23200826e83eSopenharmony_ci        WVLOG_E("get result failed");
23210826e83eSopenharmony_ci        napi_close_handle_scope(data->env_, scope);
23220826e83eSopenharmony_ci        return;
23230826e83eSopenharmony_ci    }
23240826e83eSopenharmony_ci
23250826e83eSopenharmony_ci    napi_value onMsgEventFunc = nullptr;
23260826e83eSopenharmony_ci    napi_get_reference_value(data->env_, data->callback_, &onMsgEventFunc);
23270826e83eSopenharmony_ci    napi_value placeHodler = nullptr;
23280826e83eSopenharmony_ci    napi_call_function(data->env_, nullptr, onMsgEventFunc, INTEGER_ONE, &result[INTEGER_ZERO], &placeHodler);
23290826e83eSopenharmony_ci
23300826e83eSopenharmony_ci    napi_close_handle_scope(data->env_, scope);
23310826e83eSopenharmony_ci}
23320826e83eSopenharmony_ci
23330826e83eSopenharmony_civoid NWebValueCallbackImpl::OnReceiveValue(std::shared_ptr<NWebMessage> result)
23340826e83eSopenharmony_ci{
23350826e83eSopenharmony_ci    WVLOG_D("message port received msg");
23360826e83eSopenharmony_ci    uv_loop_s *loop = nullptr;
23370826e83eSopenharmony_ci    uv_work_t *work = nullptr;
23380826e83eSopenharmony_ci    napi_get_uv_event_loop(env_, &loop);
23390826e83eSopenharmony_ci    auto engine = reinterpret_cast<NativeEngine*>(env_);
23400826e83eSopenharmony_ci    if (loop == nullptr) {
23410826e83eSopenharmony_ci        WVLOG_E("get uv event loop failed");
23420826e83eSopenharmony_ci        return;
23430826e83eSopenharmony_ci    }
23440826e83eSopenharmony_ci    work = new (std::nothrow) uv_work_t;
23450826e83eSopenharmony_ci    if (work == nullptr) {
23460826e83eSopenharmony_ci        WVLOG_E("new uv work failed");
23470826e83eSopenharmony_ci        return;
23480826e83eSopenharmony_ci    }
23490826e83eSopenharmony_ci    NapiWebMessagePort::WebMsgPortParam *param = new (std::nothrow) NapiWebMessagePort::WebMsgPortParam();
23500826e83eSopenharmony_ci    if (param == nullptr) {
23510826e83eSopenharmony_ci        WVLOG_E("new WebMsgPortParam failed");
23520826e83eSopenharmony_ci        delete work;
23530826e83eSopenharmony_ci        return;
23540826e83eSopenharmony_ci    }
23550826e83eSopenharmony_ci    param->env_ = env_;
23560826e83eSopenharmony_ci    param->callback_ = callback_;
23570826e83eSopenharmony_ci    param->msg_ = result;
23580826e83eSopenharmony_ci    param->extention_ = extention_;
23590826e83eSopenharmony_ci    if (pthread_self() == engine->GetTid()) {
23600826e83eSopenharmony_ci        InvokeWebMessageCallback(param);
23610826e83eSopenharmony_ci    } else {
23620826e83eSopenharmony_ci        work->data = reinterpret_cast<void*>(param);
23630826e83eSopenharmony_ci        uv_queue_work_with_qos(
23640826e83eSopenharmony_ci            loop, work, [](uv_work_t* work) {}, UvWebMessageOnReceiveValueCallback, uv_qos_user_initiated);
23650826e83eSopenharmony_ci
23660826e83eSopenharmony_ci        {
23670826e83eSopenharmony_ci            std::unique_lock<std::mutex> lock(param->mutex_);
23680826e83eSopenharmony_ci            param->condition_.wait(lock, [&param] { return param->ready_; });
23690826e83eSopenharmony_ci        }
23700826e83eSopenharmony_ci    }
23710826e83eSopenharmony_ci
23720826e83eSopenharmony_ci    if (param != nullptr) {
23730826e83eSopenharmony_ci        delete param;
23740826e83eSopenharmony_ci        param = nullptr;
23750826e83eSopenharmony_ci    }
23760826e83eSopenharmony_ci    if (work != nullptr) {
23770826e83eSopenharmony_ci        delete work;
23780826e83eSopenharmony_ci        work = nullptr;
23790826e83eSopenharmony_ci    }
23800826e83eSopenharmony_ci}
23810826e83eSopenharmony_ci
23820826e83eSopenharmony_civoid UvNWebValueCallbackImplThreadWoker(uv_work_t *work, int status)
23830826e83eSopenharmony_ci{
23840826e83eSopenharmony_ci    if (work == nullptr) {
23850826e83eSopenharmony_ci        WVLOG_E("uv work is null");
23860826e83eSopenharmony_ci        return;
23870826e83eSopenharmony_ci    }
23880826e83eSopenharmony_ci    NapiWebMessagePort::WebMsgPortParam *data = reinterpret_cast<NapiWebMessagePort::WebMsgPortParam*>(work->data);
23890826e83eSopenharmony_ci    if (data == nullptr) {
23900826e83eSopenharmony_ci        WVLOG_E("WebMsgPortParam is null");
23910826e83eSopenharmony_ci        delete work;
23920826e83eSopenharmony_ci        return;
23930826e83eSopenharmony_ci    }
23940826e83eSopenharmony_ci
23950826e83eSopenharmony_ci    napi_delete_reference(data->env_, data->callback_);
23960826e83eSopenharmony_ci    delete data;
23970826e83eSopenharmony_ci    data = nullptr;
23980826e83eSopenharmony_ci    delete work;
23990826e83eSopenharmony_ci    work = nullptr;
24000826e83eSopenharmony_ci}
24010826e83eSopenharmony_ci
24020826e83eSopenharmony_ciNWebValueCallbackImpl::~NWebValueCallbackImpl()
24030826e83eSopenharmony_ci{
24040826e83eSopenharmony_ci    WVLOG_D("~NWebValueCallbackImpl");
24050826e83eSopenharmony_ci    uv_loop_s *loop = nullptr;
24060826e83eSopenharmony_ci    uv_work_t *work = nullptr;
24070826e83eSopenharmony_ci    napi_get_uv_event_loop(env_, &loop);
24080826e83eSopenharmony_ci    if (loop == nullptr) {
24090826e83eSopenharmony_ci        WVLOG_E("get uv event loop failed");
24100826e83eSopenharmony_ci        return;
24110826e83eSopenharmony_ci    }
24120826e83eSopenharmony_ci    work = new (std::nothrow) uv_work_t;
24130826e83eSopenharmony_ci    if (work == nullptr) {
24140826e83eSopenharmony_ci        WVLOG_E("new uv work failed");
24150826e83eSopenharmony_ci        return;
24160826e83eSopenharmony_ci    }
24170826e83eSopenharmony_ci    NapiWebMessagePort::WebMsgPortParam *param = new (std::nothrow) NapiWebMessagePort::WebMsgPortParam();
24180826e83eSopenharmony_ci    if (param == nullptr) {
24190826e83eSopenharmony_ci        WVLOG_E("new WebMsgPortParam failed");
24200826e83eSopenharmony_ci        delete work;
24210826e83eSopenharmony_ci        return;
24220826e83eSopenharmony_ci    }
24230826e83eSopenharmony_ci    param->env_ = env_;
24240826e83eSopenharmony_ci    param->callback_ = callback_;
24250826e83eSopenharmony_ci    work->data = reinterpret_cast<void*>(param);
24260826e83eSopenharmony_ci    int ret = uv_queue_work_with_qos(
24270826e83eSopenharmony_ci        loop, work, [](uv_work_t *work) {}, UvNWebValueCallbackImplThreadWoker, uv_qos_user_initiated);
24280826e83eSopenharmony_ci    if (ret != 0) {
24290826e83eSopenharmony_ci        if (param != nullptr) {
24300826e83eSopenharmony_ci            delete param;
24310826e83eSopenharmony_ci            param = nullptr;
24320826e83eSopenharmony_ci        }
24330826e83eSopenharmony_ci        if (work != nullptr) {
24340826e83eSopenharmony_ci            delete work;
24350826e83eSopenharmony_ci            work = nullptr;
24360826e83eSopenharmony_ci        }
24370826e83eSopenharmony_ci    }
24380826e83eSopenharmony_ci}
24390826e83eSopenharmony_ci
24400826e83eSopenharmony_cinapi_value NapiWebMessagePort::OnMessageEvent(napi_env env, napi_callback_info info)
24410826e83eSopenharmony_ci{
24420826e83eSopenharmony_ci    WVLOG_D("message port set OnMessageEvent callback");
24430826e83eSopenharmony_ci    napi_value thisVar = nullptr;
24440826e83eSopenharmony_ci    napi_value result = nullptr;
24450826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
24460826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE];
24470826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
24480826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
24490826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
24500826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
24510826e83eSopenharmony_ci        return result;
24520826e83eSopenharmony_ci    }
24530826e83eSopenharmony_ci    napi_valuetype valueType = napi_undefined;
24540826e83eSopenharmony_ci    napi_typeof(env, argv[INTEGER_ZERO], &valueType);
24550826e83eSopenharmony_ci    if (valueType != napi_function) {
24560826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
24570826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "callback", "function"));
24580826e83eSopenharmony_ci        return result;
24590826e83eSopenharmony_ci    }
24600826e83eSopenharmony_ci
24610826e83eSopenharmony_ci    napi_ref onMsgEventFunc = nullptr;
24620826e83eSopenharmony_ci    NAPI_CALL(env, napi_create_reference(env, argv[INTEGER_ZERO], INTEGER_ONE, &onMsgEventFunc));
24630826e83eSopenharmony_ci
24640826e83eSopenharmony_ci    auto callbackImpl = std::make_shared<NWebValueCallbackImpl>(env, onMsgEventFunc, false);
24650826e83eSopenharmony_ci
24660826e83eSopenharmony_ci    WebMessagePort *msgPort = nullptr;
24670826e83eSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, (void **)&msgPort));
24680826e83eSopenharmony_ci    if (msgPort == nullptr) {
24690826e83eSopenharmony_ci        WVLOG_E("set message event callback failed, napi unwrap msg port failed");
24700826e83eSopenharmony_ci        return nullptr;
24710826e83eSopenharmony_ci    }
24720826e83eSopenharmony_ci    ErrCode ret = msgPort->SetPortMessageCallback(callbackImpl);
24730826e83eSopenharmony_ci    if (ret != NO_ERROR) {
24740826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, ret);
24750826e83eSopenharmony_ci    }
24760826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
24770826e83eSopenharmony_ci    return result;
24780826e83eSopenharmony_ci}
24790826e83eSopenharmony_ci
24800826e83eSopenharmony_cinapi_value NapiWebviewController::ZoomIn(napi_env env, napi_callback_info info)
24810826e83eSopenharmony_ci{
24820826e83eSopenharmony_ci    napi_value result = nullptr;
24830826e83eSopenharmony_ci    WebviewController *webviewController = GetWebviewController(env, info);
24840826e83eSopenharmony_ci    if (!webviewController) {
24850826e83eSopenharmony_ci        return nullptr;
24860826e83eSopenharmony_ci    }
24870826e83eSopenharmony_ci
24880826e83eSopenharmony_ci    ErrCode ret = webviewController->ZoomIn();
24890826e83eSopenharmony_ci    if (ret != NO_ERROR) {
24900826e83eSopenharmony_ci        if (ret == NWEB_ERROR) {
24910826e83eSopenharmony_ci            WVLOG_E("ZoomIn failed.");
24920826e83eSopenharmony_ci            return nullptr;
24930826e83eSopenharmony_ci        }
24940826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, ret);
24950826e83eSopenharmony_ci    }
24960826e83eSopenharmony_ci
24970826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
24980826e83eSopenharmony_ci    return result;
24990826e83eSopenharmony_ci}
25000826e83eSopenharmony_ci
25010826e83eSopenharmony_cinapi_value NapiWebviewController::ZoomOut(napi_env env, napi_callback_info info)
25020826e83eSopenharmony_ci{
25030826e83eSopenharmony_ci    napi_value result = nullptr;
25040826e83eSopenharmony_ci    WebviewController *webviewController = GetWebviewController(env, info);
25050826e83eSopenharmony_ci    if (!webviewController) {
25060826e83eSopenharmony_ci        return nullptr;
25070826e83eSopenharmony_ci    }
25080826e83eSopenharmony_ci
25090826e83eSopenharmony_ci    ErrCode ret = webviewController->ZoomOut();
25100826e83eSopenharmony_ci    if (ret != NO_ERROR) {
25110826e83eSopenharmony_ci        if (ret == NWEB_ERROR) {
25120826e83eSopenharmony_ci            WVLOG_E("ZoomOut failed.");
25130826e83eSopenharmony_ci            return nullptr;
25140826e83eSopenharmony_ci        }
25150826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, ret);
25160826e83eSopenharmony_ci    }
25170826e83eSopenharmony_ci
25180826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
25190826e83eSopenharmony_ci    return result;
25200826e83eSopenharmony_ci}
25210826e83eSopenharmony_ci
25220826e83eSopenharmony_cinapi_value NapiWebviewController::GetWebId(napi_env env, napi_callback_info info)
25230826e83eSopenharmony_ci{
25240826e83eSopenharmony_ci    napi_value result = nullptr;
25250826e83eSopenharmony_ci    WebviewController *webviewController = GetWebviewController(env, info);
25260826e83eSopenharmony_ci    if (!webviewController) {
25270826e83eSopenharmony_ci        return nullptr;
25280826e83eSopenharmony_ci    }
25290826e83eSopenharmony_ci
25300826e83eSopenharmony_ci    int32_t webId = webviewController->GetWebId();
25310826e83eSopenharmony_ci    napi_create_int32(env, webId, &result);
25320826e83eSopenharmony_ci
25330826e83eSopenharmony_ci    return result;
25340826e83eSopenharmony_ci}
25350826e83eSopenharmony_ci
25360826e83eSopenharmony_cinapi_value NapiWebviewController::GetUserAgent(napi_env env, napi_callback_info info)
25370826e83eSopenharmony_ci{
25380826e83eSopenharmony_ci    napi_value result = nullptr;
25390826e83eSopenharmony_ci    WebviewController *webviewController = GetWebviewController(env, info);
25400826e83eSopenharmony_ci    if (!webviewController) {
25410826e83eSopenharmony_ci        return nullptr;
25420826e83eSopenharmony_ci    }
25430826e83eSopenharmony_ci
25440826e83eSopenharmony_ci    std::string userAgent = "";
25450826e83eSopenharmony_ci    userAgent = webviewController->GetUserAgent();
25460826e83eSopenharmony_ci    napi_create_string_utf8(env, userAgent.c_str(), userAgent.length(), &result);
25470826e83eSopenharmony_ci
25480826e83eSopenharmony_ci    return result;
25490826e83eSopenharmony_ci}
25500826e83eSopenharmony_ci
25510826e83eSopenharmony_cinapi_value NapiWebviewController::GetCustomUserAgent(napi_env env, napi_callback_info info)
25520826e83eSopenharmony_ci{
25530826e83eSopenharmony_ci    napi_value thisVar = nullptr;
25540826e83eSopenharmony_ci    napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
25550826e83eSopenharmony_ci
25560826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
25570826e83eSopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, (void **)&webviewController);
25580826e83eSopenharmony_ci    if ((!webviewController) || (status != napi_ok) || !webviewController->IsInit()) {
25590826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
25600826e83eSopenharmony_ci        return nullptr;
25610826e83eSopenharmony_ci    }
25620826e83eSopenharmony_ci
25630826e83eSopenharmony_ci    napi_value result = nullptr;
25640826e83eSopenharmony_ci    std::string userAgent = webviewController->GetCustomUserAgent();
25650826e83eSopenharmony_ci    napi_create_string_utf8(env, userAgent.c_str(), userAgent.length(), &result);
25660826e83eSopenharmony_ci    return result;
25670826e83eSopenharmony_ci}
25680826e83eSopenharmony_ci
25690826e83eSopenharmony_cinapi_value NapiWebviewController::SetCustomUserAgent(napi_env env, napi_callback_info info)
25700826e83eSopenharmony_ci{
25710826e83eSopenharmony_ci    napi_value thisVar = nullptr;
25720826e83eSopenharmony_ci    napi_value result = nullptr;
25730826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
25740826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE];
25750826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
25760826e83eSopenharmony_ci
25770826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
25780826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
25790826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
25800826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
25810826e83eSopenharmony_ci        return result;
25820826e83eSopenharmony_ci    }
25830826e83eSopenharmony_ci
25840826e83eSopenharmony_ci    std::string userAgent;
25850826e83eSopenharmony_ci    if (!NapiParseUtils::ParseString(env, argv[INTEGER_ZERO], userAgent)) {
25860826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
25870826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "userAgent", "string"));
25880826e83eSopenharmony_ci        return result;
25890826e83eSopenharmony_ci    }
25900826e83eSopenharmony_ci
25910826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
25920826e83eSopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, (void **)&webviewController);
25930826e83eSopenharmony_ci    if ((!webviewController) || (status != napi_ok) || !webviewController->IsInit()) {
25940826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
25950826e83eSopenharmony_ci        return result;
25960826e83eSopenharmony_ci    }
25970826e83eSopenharmony_ci    ErrCode ret = webviewController->SetCustomUserAgent(userAgent);
25980826e83eSopenharmony_ci    if (ret != NO_ERROR) {
25990826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, ret);
26000826e83eSopenharmony_ci    }
26010826e83eSopenharmony_ci    return result;
26020826e83eSopenharmony_ci}
26030826e83eSopenharmony_ci
26040826e83eSopenharmony_cinapi_value NapiWebviewController::GetTitle(napi_env env, napi_callback_info info)
26050826e83eSopenharmony_ci{
26060826e83eSopenharmony_ci    napi_value result = nullptr;
26070826e83eSopenharmony_ci    WebviewController *webviewController = GetWebviewController(env, info);
26080826e83eSopenharmony_ci    if (!webviewController) {
26090826e83eSopenharmony_ci        return nullptr;
26100826e83eSopenharmony_ci    }
26110826e83eSopenharmony_ci
26120826e83eSopenharmony_ci    std::string title = "";
26130826e83eSopenharmony_ci    title = webviewController->GetTitle();
26140826e83eSopenharmony_ci    napi_create_string_utf8(env, title.c_str(), title.length(), &result);
26150826e83eSopenharmony_ci
26160826e83eSopenharmony_ci    return result;
26170826e83eSopenharmony_ci}
26180826e83eSopenharmony_ci
26190826e83eSopenharmony_cinapi_value NapiWebviewController::GetPageHeight(napi_env env, napi_callback_info info)
26200826e83eSopenharmony_ci{
26210826e83eSopenharmony_ci    napi_value result = nullptr;
26220826e83eSopenharmony_ci    WebviewController *webviewController = GetWebviewController(env, info);
26230826e83eSopenharmony_ci    if (!webviewController) {
26240826e83eSopenharmony_ci        return nullptr;
26250826e83eSopenharmony_ci    }
26260826e83eSopenharmony_ci
26270826e83eSopenharmony_ci    int32_t pageHeight = webviewController->GetPageHeight();
26280826e83eSopenharmony_ci    napi_create_int32(env, pageHeight, &result);
26290826e83eSopenharmony_ci
26300826e83eSopenharmony_ci    return result;
26310826e83eSopenharmony_ci}
26320826e83eSopenharmony_ci
26330826e83eSopenharmony_cinapi_value NapiWebviewController::BackOrForward(napi_env env, napi_callback_info info)
26340826e83eSopenharmony_ci{
26350826e83eSopenharmony_ci    napi_value thisVar = nullptr;
26360826e83eSopenharmony_ci    napi_value result = nullptr;
26370826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
26380826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = {0};
26390826e83eSopenharmony_ci    void* data = nullptr;
26400826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
26410826e83eSopenharmony_ci
26420826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
26430826e83eSopenharmony_ci        WVLOG_E("Requires 1 parameters.");
26440826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
26450826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
26460826e83eSopenharmony_ci        return nullptr;
26470826e83eSopenharmony_ci    }
26480826e83eSopenharmony_ci
26490826e83eSopenharmony_ci    int32_t step = -1;
26500826e83eSopenharmony_ci    if (!NapiParseUtils::ParseInt32(env, argv[INTEGER_ZERO], step)) {
26510826e83eSopenharmony_ci        WVLOG_E("Parameter is not integer number type.");
26520826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
26530826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "step", "number"));
26540826e83eSopenharmony_ci        return nullptr;
26550826e83eSopenharmony_ci    }
26560826e83eSopenharmony_ci
26570826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
26580826e83eSopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, (void **)&webviewController);
26590826e83eSopenharmony_ci    if ((!webviewController) || (status != napi_ok) || !webviewController->IsInit()) {
26600826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
26610826e83eSopenharmony_ci        return nullptr;
26620826e83eSopenharmony_ci    }
26630826e83eSopenharmony_ci
26640826e83eSopenharmony_ci    ErrCode ret = webviewController->BackOrForward(step);
26650826e83eSopenharmony_ci    if (ret != NO_ERROR) {
26660826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, ret);
26670826e83eSopenharmony_ci    }
26680826e83eSopenharmony_ci
26690826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
26700826e83eSopenharmony_ci    return result;
26710826e83eSopenharmony_ci}
26720826e83eSopenharmony_ci
26730826e83eSopenharmony_cinapi_value NapiWebviewController::StoreWebArchive(napi_env env, napi_callback_info info)
26740826e83eSopenharmony_ci{
26750826e83eSopenharmony_ci    napi_value thisVar = nullptr;
26760826e83eSopenharmony_ci    napi_value result = nullptr;
26770826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
26780826e83eSopenharmony_ci    size_t argcPromise = INTEGER_TWO;
26790826e83eSopenharmony_ci    size_t argcCallback = INTEGER_THREE;
26800826e83eSopenharmony_ci    napi_value argv[INTEGER_THREE] = { 0 };
26810826e83eSopenharmony_ci
26820826e83eSopenharmony_ci    napi_get_undefined(env, &result);
26830826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
26840826e83eSopenharmony_ci
26850826e83eSopenharmony_ci    if (argc != argcPromise && argc != argcCallback) {
26860826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, NWebError::PARAM_CHECK_ERROR,
26870826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_TWO, "two", "three"));
26880826e83eSopenharmony_ci        return result;
26890826e83eSopenharmony_ci    }
26900826e83eSopenharmony_ci    std::string baseName;
26910826e83eSopenharmony_ci    if (!NapiParseUtils::ParseString(env, argv[INTEGER_ZERO], baseName)) {
26920826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, NWebError::PARAM_CHECK_ERROR,
26930826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "baseName", "string"));
26940826e83eSopenharmony_ci        return result;
26950826e83eSopenharmony_ci    }
26960826e83eSopenharmony_ci
26970826e83eSopenharmony_ci    if (baseName.empty()) {
26980826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, NWebError::PARAM_CHECK_ERROR,
26990826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NOT_NULL, "baseName"));
27000826e83eSopenharmony_ci        return result;
27010826e83eSopenharmony_ci    }
27020826e83eSopenharmony_ci
27030826e83eSopenharmony_ci    bool autoName = false;
27040826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
27050826e83eSopenharmony_ci    if (!NapiParseUtils::ParseBoolean(env, argv[INTEGER_ONE], autoName)) {
27060826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, NWebError::PARAM_CHECK_ERROR,
27070826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "autoName", "boolean"));
27080826e83eSopenharmony_ci        return result;
27090826e83eSopenharmony_ci    }
27100826e83eSopenharmony_ci
27110826e83eSopenharmony_ci    if (argc == argcCallback) {
27120826e83eSopenharmony_ci        napi_valuetype valueType = napi_null;
27130826e83eSopenharmony_ci        napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
27140826e83eSopenharmony_ci        napi_typeof(env, argv[argcCallback - 1], &valueType);
27150826e83eSopenharmony_ci        if (valueType != napi_function) {
27160826e83eSopenharmony_ci            BusinessError::ThrowErrorByErrcode(env, NWebError::PARAM_CHECK_ERROR,
27170826e83eSopenharmony_ci                NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "callback", "function"));
27180826e83eSopenharmony_ci            return result;
27190826e83eSopenharmony_ci        }
27200826e83eSopenharmony_ci    }
27210826e83eSopenharmony_ci    return StoreWebArchiveInternal(env, info, baseName, autoName);
27220826e83eSopenharmony_ci}
27230826e83eSopenharmony_ci
27240826e83eSopenharmony_cinapi_value NapiWebviewController::StoreWebArchiveInternal(napi_env env, napi_callback_info info,
27250826e83eSopenharmony_ci    const std::string &baseName, bool autoName)
27260826e83eSopenharmony_ci{
27270826e83eSopenharmony_ci    napi_value thisVar = nullptr;
27280826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
27290826e83eSopenharmony_ci    size_t argcPromise = INTEGER_TWO;
27300826e83eSopenharmony_ci    size_t argcCallback = INTEGER_THREE;
27310826e83eSopenharmony_ci    napi_value argv[INTEGER_THREE] = {0};
27320826e83eSopenharmony_ci
27330826e83eSopenharmony_ci    napi_value result = nullptr;
27340826e83eSopenharmony_ci    napi_get_undefined(env, &result);
27350826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
27360826e83eSopenharmony_ci
27370826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
27380826e83eSopenharmony_ci    napi_unwrap(env, thisVar, (void **)&webviewController);
27390826e83eSopenharmony_ci
27400826e83eSopenharmony_ci    if (!webviewController || !webviewController->IsInit()) {
27410826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
27420826e83eSopenharmony_ci        return result;
27430826e83eSopenharmony_ci    }
27440826e83eSopenharmony_ci
27450826e83eSopenharmony_ci    if (argc == argcCallback) {
27460826e83eSopenharmony_ci        napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
27470826e83eSopenharmony_ci        napi_ref jsCallback = nullptr;
27480826e83eSopenharmony_ci        napi_create_reference(env, argv[argcCallback - 1], 1, &jsCallback);
27490826e83eSopenharmony_ci
27500826e83eSopenharmony_ci        if (jsCallback) {
27510826e83eSopenharmony_ci            webviewController->StoreWebArchiveCallback(baseName, autoName, env, std::move(jsCallback));
27520826e83eSopenharmony_ci        }
27530826e83eSopenharmony_ci        return result;
27540826e83eSopenharmony_ci    } else if (argc == argcPromise) {
27550826e83eSopenharmony_ci        napi_deferred deferred = nullptr;
27560826e83eSopenharmony_ci        napi_value promise = nullptr;
27570826e83eSopenharmony_ci        napi_create_promise(env, &deferred, &promise);
27580826e83eSopenharmony_ci        if (promise && deferred) {
27590826e83eSopenharmony_ci            webviewController->StoreWebArchivePromise(baseName, autoName, env, deferred);
27600826e83eSopenharmony_ci        }
27610826e83eSopenharmony_ci        return promise;
27620826e83eSopenharmony_ci    }
27630826e83eSopenharmony_ci    return result;
27640826e83eSopenharmony_ci}
27650826e83eSopenharmony_ci
27660826e83eSopenharmony_cinapi_value NapiWebviewController::GetHitTestValue(napi_env env, napi_callback_info info)
27670826e83eSopenharmony_ci{
27680826e83eSopenharmony_ci    napi_value result = nullptr;
27690826e83eSopenharmony_ci    WebviewController *webviewController = GetWebviewController(env, info);
27700826e83eSopenharmony_ci    if (!webviewController) {
27710826e83eSopenharmony_ci        return nullptr;
27720826e83eSopenharmony_ci    }
27730826e83eSopenharmony_ci
27740826e83eSopenharmony_ci    std::shared_ptr<HitTestResult> nwebResult = webviewController->GetHitTestValue();
27750826e83eSopenharmony_ci
27760826e83eSopenharmony_ci    napi_create_object(env, &result);
27770826e83eSopenharmony_ci
27780826e83eSopenharmony_ci    napi_value type;
27790826e83eSopenharmony_ci    if (nwebResult) {
27800826e83eSopenharmony_ci        napi_create_uint32(env, nwebResult->GetType(), &type);
27810826e83eSopenharmony_ci    } else {
27820826e83eSopenharmony_ci        napi_create_uint32(env, HitTestResult::UNKNOWN_TYPE, &type);
27830826e83eSopenharmony_ci    }
27840826e83eSopenharmony_ci    napi_set_named_property(env, result, "type", type);
27850826e83eSopenharmony_ci
27860826e83eSopenharmony_ci    napi_value extra;
27870826e83eSopenharmony_ci    if (nwebResult) {
27880826e83eSopenharmony_ci        napi_create_string_utf8(env, nwebResult->GetExtra().c_str(), NAPI_AUTO_LENGTH, &extra);
27890826e83eSopenharmony_ci    } else {
27900826e83eSopenharmony_ci        napi_create_string_utf8(env, "", NAPI_AUTO_LENGTH, &extra);
27910826e83eSopenharmony_ci    }
27920826e83eSopenharmony_ci    napi_set_named_property(env, result, "extra", extra);
27930826e83eSopenharmony_ci
27940826e83eSopenharmony_ci    return result;
27950826e83eSopenharmony_ci}
27960826e83eSopenharmony_ci
27970826e83eSopenharmony_cinapi_value NapiWebviewController::RequestFocus(napi_env env, napi_callback_info info)
27980826e83eSopenharmony_ci{
27990826e83eSopenharmony_ci    napi_value result = nullptr;
28000826e83eSopenharmony_ci    WebviewController *webviewController = GetWebviewController(env, info);
28010826e83eSopenharmony_ci    if (!webviewController) {
28020826e83eSopenharmony_ci        return nullptr;
28030826e83eSopenharmony_ci    }
28040826e83eSopenharmony_ci
28050826e83eSopenharmony_ci    webviewController->RequestFocus();
28060826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
28070826e83eSopenharmony_ci    return result;
28080826e83eSopenharmony_ci}
28090826e83eSopenharmony_ci
28100826e83eSopenharmony_cinapi_value NapiWebviewController::PostUrl(napi_env env, napi_callback_info info)
28110826e83eSopenharmony_ci{
28120826e83eSopenharmony_ci    WVLOG_D("NapiWebMessageExt::PostUrl start");
28130826e83eSopenharmony_ci    napi_value thisVar = nullptr;
28140826e83eSopenharmony_ci    napi_value result = nullptr;
28150826e83eSopenharmony_ci    size_t argc = INTEGER_TWO;
28160826e83eSopenharmony_ci    napi_value argv[INTEGER_TWO] = { 0 };
28170826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
28180826e83eSopenharmony_ci    if (argc != INTEGER_TWO) {
28190826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
28200826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "two"));
28210826e83eSopenharmony_ci        return result;
28220826e83eSopenharmony_ci    }
28230826e83eSopenharmony_ci
28240826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
28250826e83eSopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, (void **)&webviewController);
28260826e83eSopenharmony_ci    if ((!webviewController) || (status != napi_ok) || !webviewController->IsInit()) {
28270826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
28280826e83eSopenharmony_ci        return nullptr;
28290826e83eSopenharmony_ci    }
28300826e83eSopenharmony_ci
28310826e83eSopenharmony_ci    std::string url;
28320826e83eSopenharmony_ci    if (!NapiParseUtils::ParseString(env, argv[INTEGER_ZERO], url)) {
28330826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
28340826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "url", "string"));
28350826e83eSopenharmony_ci        return result;
28360826e83eSopenharmony_ci    }
28370826e83eSopenharmony_ci
28380826e83eSopenharmony_ci    bool isArrayBuffer = false;
28390826e83eSopenharmony_ci    NAPI_CALL(env, napi_is_arraybuffer(env, argv[INTEGER_ONE], &isArrayBuffer));
28400826e83eSopenharmony_ci    if (!isArrayBuffer) {
28410826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
28420826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "postData", "array"));
28430826e83eSopenharmony_ci        return result;
28440826e83eSopenharmony_ci    }
28450826e83eSopenharmony_ci
28460826e83eSopenharmony_ci    char *arrBuf = nullptr;
28470826e83eSopenharmony_ci    size_t byteLength = 0;
28480826e83eSopenharmony_ci    napi_get_arraybuffer_info(env, argv[INTEGER_ONE], (void **)&arrBuf, &byteLength);
28490826e83eSopenharmony_ci
28500826e83eSopenharmony_ci    std::vector<char> postData(arrBuf, arrBuf + byteLength);
28510826e83eSopenharmony_ci    ErrCode ret = webviewController->PostUrl(url, postData);
28520826e83eSopenharmony_ci    if (ret != NO_ERROR) {
28530826e83eSopenharmony_ci        if (ret == NWEB_ERROR) {
28540826e83eSopenharmony_ci            WVLOG_E("PostData failed");
28550826e83eSopenharmony_ci            return result;
28560826e83eSopenharmony_ci        }
28570826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, ret);
28580826e83eSopenharmony_ci        return result;
28590826e83eSopenharmony_ci    }
28600826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
28610826e83eSopenharmony_ci    return result;
28620826e83eSopenharmony_ci}
28630826e83eSopenharmony_ci
28640826e83eSopenharmony_cinapi_value NapiWebviewController::LoadUrl(napi_env env, napi_callback_info info)
28650826e83eSopenharmony_ci{
28660826e83eSopenharmony_ci    napi_value thisVar = nullptr;
28670826e83eSopenharmony_ci    napi_value result = nullptr;
28680826e83eSopenharmony_ci    size_t argc = INTEGER_TWO;
28690826e83eSopenharmony_ci    napi_value argv[INTEGER_TWO];
28700826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
28710826e83eSopenharmony_ci    if ((argc != INTEGER_ONE) && (argc != INTEGER_TWO)) {
28720826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
28730826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_TWO, "one", "two"));
28740826e83eSopenharmony_ci        return nullptr;
28750826e83eSopenharmony_ci    }
28760826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
28770826e83eSopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, (void **)&webviewController);
28780826e83eSopenharmony_ci    if ((!webviewController) || (status != napi_ok) || !webviewController->IsInit()) {
28790826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
28800826e83eSopenharmony_ci        return nullptr;
28810826e83eSopenharmony_ci    }
28820826e83eSopenharmony_ci    napi_valuetype webSrcType;
28830826e83eSopenharmony_ci    napi_typeof(env, argv[INTEGER_ZERO], &webSrcType);
28840826e83eSopenharmony_ci    if (webSrcType != napi_string && webSrcType != napi_object) {
28850826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
28860826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_TYPE_INVALID, "url"));
28870826e83eSopenharmony_ci        return nullptr;
28880826e83eSopenharmony_ci    }
28890826e83eSopenharmony_ci    std::string webSrc;
28900826e83eSopenharmony_ci    if (!webviewController->ParseUrl(env, argv[INTEGER_ZERO], webSrc)) {
28910826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INVALID_URL);
28920826e83eSopenharmony_ci        return nullptr;
28930826e83eSopenharmony_ci    }
28940826e83eSopenharmony_ci    if (argc == INTEGER_ONE) {
28950826e83eSopenharmony_ci        ErrCode ret = webviewController->LoadUrl(webSrc);
28960826e83eSopenharmony_ci        if (ret != NO_ERROR) {
28970826e83eSopenharmony_ci            if (ret == NWEB_ERROR) {
28980826e83eSopenharmony_ci                return nullptr;
28990826e83eSopenharmony_ci            }
29000826e83eSopenharmony_ci            BusinessError::ThrowErrorByErrcode(env, ret);
29010826e83eSopenharmony_ci            return nullptr;
29020826e83eSopenharmony_ci        }
29030826e83eSopenharmony_ci        NAPI_CALL(env, napi_get_undefined(env, &result));
29040826e83eSopenharmony_ci        return result;
29050826e83eSopenharmony_ci    }
29060826e83eSopenharmony_ci    return LoadUrlWithHttpHeaders(env, info, webSrc, argv, webviewController);
29070826e83eSopenharmony_ci}
29080826e83eSopenharmony_ci
29090826e83eSopenharmony_cinapi_value NapiWebviewController::LoadUrlWithHttpHeaders(napi_env env, napi_callback_info info, const std::string& url,
29100826e83eSopenharmony_ci    const napi_value* argv, WebviewController* webviewController)
29110826e83eSopenharmony_ci{
29120826e83eSopenharmony_ci    napi_value result = nullptr;
29130826e83eSopenharmony_ci    std::map<std::string, std::string> httpHeaders;
29140826e83eSopenharmony_ci    napi_value array = argv[INTEGER_ONE];
29150826e83eSopenharmony_ci    bool isArray = false;
29160826e83eSopenharmony_ci    napi_is_array(env, array, &isArray);
29170826e83eSopenharmony_ci    if (isArray) {
29180826e83eSopenharmony_ci        uint32_t arrayLength = INTEGER_ZERO;
29190826e83eSopenharmony_ci        napi_get_array_length(env, array, &arrayLength);
29200826e83eSopenharmony_ci        for (uint32_t i = 0; i < arrayLength; ++i) {
29210826e83eSopenharmony_ci            std::string key;
29220826e83eSopenharmony_ci            std::string value;
29230826e83eSopenharmony_ci            napi_value obj = nullptr;
29240826e83eSopenharmony_ci            napi_value keyObj = nullptr;
29250826e83eSopenharmony_ci            napi_value valueObj = nullptr;
29260826e83eSopenharmony_ci            napi_get_element(env, array, i, &obj);
29270826e83eSopenharmony_ci            if (napi_get_named_property(env, obj, "headerKey", &keyObj) != napi_ok) {
29280826e83eSopenharmony_ci                continue;
29290826e83eSopenharmony_ci            }
29300826e83eSopenharmony_ci            if (napi_get_named_property(env, obj, "headerValue", &valueObj) != napi_ok) {
29310826e83eSopenharmony_ci                continue;
29320826e83eSopenharmony_ci            }
29330826e83eSopenharmony_ci            NapiParseUtils::ParseString(env, keyObj, key);
29340826e83eSopenharmony_ci            NapiParseUtils::ParseString(env, valueObj, value);
29350826e83eSopenharmony_ci            httpHeaders[key] = value;
29360826e83eSopenharmony_ci        }
29370826e83eSopenharmony_ci    } else {
29380826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
29390826e83eSopenharmony_ci        return nullptr;
29400826e83eSopenharmony_ci    }
29410826e83eSopenharmony_ci
29420826e83eSopenharmony_ci    ErrCode ret = webviewController->LoadUrl(url, httpHeaders);
29430826e83eSopenharmony_ci    if (ret != NO_ERROR) {
29440826e83eSopenharmony_ci        if (ret == NWEB_ERROR) {
29450826e83eSopenharmony_ci            WVLOG_E("LoadUrl failed.");
29460826e83eSopenharmony_ci            return nullptr;
29470826e83eSopenharmony_ci        }
29480826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, ret);
29490826e83eSopenharmony_ci        return nullptr;
29500826e83eSopenharmony_ci    }
29510826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
29520826e83eSopenharmony_ci    return result;
29530826e83eSopenharmony_ci}
29540826e83eSopenharmony_ci
29550826e83eSopenharmony_cinapi_value NapiWebviewController::LoadData(napi_env env, napi_callback_info info)
29560826e83eSopenharmony_ci{
29570826e83eSopenharmony_ci    napi_value thisVar = nullptr;
29580826e83eSopenharmony_ci    napi_value result = nullptr;
29590826e83eSopenharmony_ci    size_t argc = INTEGER_FIVE;
29600826e83eSopenharmony_ci    napi_value argv[INTEGER_FIVE];
29610826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
29620826e83eSopenharmony_ci    if ((argc != INTEGER_THREE) && (argc != INTEGER_FOUR) &&
29630826e83eSopenharmony_ci        (argc != INTEGER_FIVE)) {
29640826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
29650826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_TWO, "three", "four"));
29660826e83eSopenharmony_ci        return nullptr;
29670826e83eSopenharmony_ci    }
29680826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
29690826e83eSopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, (void **)&webviewController);
29700826e83eSopenharmony_ci    if ((!webviewController) || (status != napi_ok) || !webviewController->IsInit()) {
29710826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
29720826e83eSopenharmony_ci        return nullptr;
29730826e83eSopenharmony_ci    }
29740826e83eSopenharmony_ci    std::string data;
29750826e83eSopenharmony_ci    std::string mimeType;
29760826e83eSopenharmony_ci    std::string encoding;
29770826e83eSopenharmony_ci    std::string baseUrl;
29780826e83eSopenharmony_ci    std::string historyUrl;
29790826e83eSopenharmony_ci    if (!NapiParseUtils::ParseString(env, argv[INTEGER_ZERO], data) ||
29800826e83eSopenharmony_ci        !NapiParseUtils::ParseString(env, argv[INTEGER_ONE], mimeType) ||
29810826e83eSopenharmony_ci        !NapiParseUtils::ParseString(env, argv[INTEGER_TWO], encoding)) {
29820826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR, ParamCheckErrorMsgTemplate::TYPE_ALL_STRING);
29830826e83eSopenharmony_ci        return nullptr;
29840826e83eSopenharmony_ci    }
29850826e83eSopenharmony_ci    if ((argc >= INTEGER_FOUR) && !NapiParseUtils::ParseString(env, argv[INTEGER_THREE], baseUrl)) {
29860826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR, ParamCheckErrorMsgTemplate::TYPE_ALL_STRING);
29870826e83eSopenharmony_ci        return nullptr;
29880826e83eSopenharmony_ci    }
29890826e83eSopenharmony_ci    if ((argc == INTEGER_FIVE) && !NapiParseUtils::ParseString(env, argv[INTEGER_FOUR], historyUrl)) {
29900826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR, ParamCheckErrorMsgTemplate::TYPE_ALL_STRING);
29910826e83eSopenharmony_ci        return nullptr;
29920826e83eSopenharmony_ci    }
29930826e83eSopenharmony_ci    ErrCode ret = webviewController->LoadData(data, mimeType, encoding, baseUrl, historyUrl);
29940826e83eSopenharmony_ci    if (ret != NO_ERROR) {
29950826e83eSopenharmony_ci        if (ret == NWEB_ERROR) {
29960826e83eSopenharmony_ci            WVLOG_E("LoadData failed.");
29970826e83eSopenharmony_ci            return nullptr;
29980826e83eSopenharmony_ci        }
29990826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, ret);
30000826e83eSopenharmony_ci        return nullptr;
30010826e83eSopenharmony_ci    }
30020826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
30030826e83eSopenharmony_ci    return result;
30040826e83eSopenharmony_ci}
30050826e83eSopenharmony_ci
30060826e83eSopenharmony_cinapi_value NapiWebviewController::GetHitTest(napi_env env, napi_callback_info info)
30070826e83eSopenharmony_ci{
30080826e83eSopenharmony_ci    napi_value result = nullptr;
30090826e83eSopenharmony_ci    WebviewController *webviewController = GetWebviewController(env, info);
30100826e83eSopenharmony_ci    if (!webviewController) {
30110826e83eSopenharmony_ci        return nullptr;
30120826e83eSopenharmony_ci    }
30130826e83eSopenharmony_ci
30140826e83eSopenharmony_ci    int32_t type = webviewController->GetHitTest();
30150826e83eSopenharmony_ci    napi_create_int32(env, type, &result);
30160826e83eSopenharmony_ci    return result;
30170826e83eSopenharmony_ci}
30180826e83eSopenharmony_ci
30190826e83eSopenharmony_cinapi_value NapiWebviewController::ClearMatches(napi_env env, napi_callback_info info)
30200826e83eSopenharmony_ci{
30210826e83eSopenharmony_ci    napi_value thisVar = nullptr;
30220826e83eSopenharmony_ci    napi_value result = nullptr;
30230826e83eSopenharmony_ci
30240826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
30250826e83eSopenharmony_ci    napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
30260826e83eSopenharmony_ci
30270826e83eSopenharmony_ci    WebviewController *controller = nullptr;
30280826e83eSopenharmony_ci    napi_unwrap(env, thisVar, (void **)&controller);
30290826e83eSopenharmony_ci    if (!controller || !controller->IsInit()) {
30300826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
30310826e83eSopenharmony_ci        return result;
30320826e83eSopenharmony_ci    }
30330826e83eSopenharmony_ci    controller->ClearMatches();
30340826e83eSopenharmony_ci    return result;
30350826e83eSopenharmony_ci}
30360826e83eSopenharmony_ci
30370826e83eSopenharmony_cinapi_value NapiWebviewController::SearchNext(napi_env env, napi_callback_info info)
30380826e83eSopenharmony_ci{
30390826e83eSopenharmony_ci    napi_value thisVar = nullptr;
30400826e83eSopenharmony_ci    napi_value result = nullptr;
30410826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
30420826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
30430826e83eSopenharmony_ci
30440826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
30450826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
30460826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
30470826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
30480826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
30490826e83eSopenharmony_ci        return result;
30500826e83eSopenharmony_ci    }
30510826e83eSopenharmony_ci    bool forward;
30520826e83eSopenharmony_ci    if (!NapiParseUtils::ParseBoolean(env, argv[0], forward)) {
30530826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
30540826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "forward", "boolean"));
30550826e83eSopenharmony_ci        return result;
30560826e83eSopenharmony_ci    }
30570826e83eSopenharmony_ci
30580826e83eSopenharmony_ci    WebviewController *controller = nullptr;
30590826e83eSopenharmony_ci    napi_unwrap(env, thisVar, (void **)&controller);
30600826e83eSopenharmony_ci    if (!controller || !controller->IsInit()) {
30610826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
30620826e83eSopenharmony_ci        return result;
30630826e83eSopenharmony_ci    }
30640826e83eSopenharmony_ci    controller->SearchNext(forward);
30650826e83eSopenharmony_ci    return result;
30660826e83eSopenharmony_ci}
30670826e83eSopenharmony_ci
30680826e83eSopenharmony_cinapi_value NapiWebviewController::SearchAllAsync(napi_env env, napi_callback_info info)
30690826e83eSopenharmony_ci{
30700826e83eSopenharmony_ci    napi_value thisVar = nullptr;
30710826e83eSopenharmony_ci    napi_value result = nullptr;
30720826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
30730826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
30740826e83eSopenharmony_ci
30750826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
30760826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
30770826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
30780826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
30790826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
30800826e83eSopenharmony_ci        return result;
30810826e83eSopenharmony_ci    }
30820826e83eSopenharmony_ci    std::string searchString;
30830826e83eSopenharmony_ci    if (!NapiParseUtils::ParseString(env, argv[0], searchString)) {
30840826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
30850826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "searchString", "number"));
30860826e83eSopenharmony_ci        return result;
30870826e83eSopenharmony_ci    }
30880826e83eSopenharmony_ci
30890826e83eSopenharmony_ci    WebviewController *controller = nullptr;
30900826e83eSopenharmony_ci    napi_unwrap(env, thisVar, (void **)&controller);
30910826e83eSopenharmony_ci    if (!controller || !controller->IsInit()) {
30920826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
30930826e83eSopenharmony_ci        return result;
30940826e83eSopenharmony_ci    }
30950826e83eSopenharmony_ci    controller->SearchAllAsync(searchString);
30960826e83eSopenharmony_ci    return result;
30970826e83eSopenharmony_ci}
30980826e83eSopenharmony_ci
30990826e83eSopenharmony_cinapi_value NapiWebviewController::ClearSslCache(napi_env env, napi_callback_info info)
31000826e83eSopenharmony_ci{
31010826e83eSopenharmony_ci    napi_value thisVar = nullptr;
31020826e83eSopenharmony_ci    napi_value result = nullptr;
31030826e83eSopenharmony_ci
31040826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
31050826e83eSopenharmony_ci    napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
31060826e83eSopenharmony_ci
31070826e83eSopenharmony_ci    WebviewController *controller = nullptr;
31080826e83eSopenharmony_ci    napi_unwrap(env, thisVar, (void **)&controller);
31090826e83eSopenharmony_ci    if (!controller || !controller->IsInit()) {
31100826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
31110826e83eSopenharmony_ci        return result;
31120826e83eSopenharmony_ci    }
31130826e83eSopenharmony_ci    controller->ClearSslCache();
31140826e83eSopenharmony_ci    return result;
31150826e83eSopenharmony_ci}
31160826e83eSopenharmony_ci
31170826e83eSopenharmony_cinapi_value NapiWebviewController::ClearClientAuthenticationCache(napi_env env, napi_callback_info info)
31180826e83eSopenharmony_ci{
31190826e83eSopenharmony_ci    napi_value thisVar = nullptr;
31200826e83eSopenharmony_ci    napi_value result = nullptr;
31210826e83eSopenharmony_ci
31220826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
31230826e83eSopenharmony_ci    napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
31240826e83eSopenharmony_ci
31250826e83eSopenharmony_ci    WebviewController *controller = nullptr;
31260826e83eSopenharmony_ci    napi_unwrap(env, thisVar, (void **)&controller);
31270826e83eSopenharmony_ci    if (!controller || !controller->IsInit()) {
31280826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
31290826e83eSopenharmony_ci        return result;
31300826e83eSopenharmony_ci    }
31310826e83eSopenharmony_ci    controller->ClearClientAuthenticationCache();
31320826e83eSopenharmony_ci
31330826e83eSopenharmony_ci    return result;
31340826e83eSopenharmony_ci}
31350826e83eSopenharmony_ci
31360826e83eSopenharmony_cinapi_value NapiWebviewController::Stop(napi_env env, napi_callback_info info)
31370826e83eSopenharmony_ci{
31380826e83eSopenharmony_ci    napi_value thisVar = nullptr;
31390826e83eSopenharmony_ci    napi_value result = nullptr;
31400826e83eSopenharmony_ci    napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
31410826e83eSopenharmony_ci
31420826e83eSopenharmony_ci    WebviewController *controller = nullptr;
31430826e83eSopenharmony_ci    napi_unwrap(env, thisVar, (void **)&controller);
31440826e83eSopenharmony_ci    if (!controller || !controller->IsInit()) {
31450826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
31460826e83eSopenharmony_ci        return result;
31470826e83eSopenharmony_ci    }
31480826e83eSopenharmony_ci    controller->Stop();
31490826e83eSopenharmony_ci
31500826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
31510826e83eSopenharmony_ci    return result;
31520826e83eSopenharmony_ci}
31530826e83eSopenharmony_ci
31540826e83eSopenharmony_cinapi_value NapiWebviewController::Zoom(napi_env env, napi_callback_info info)
31550826e83eSopenharmony_ci{
31560826e83eSopenharmony_ci    napi_value thisVar = nullptr;
31570826e83eSopenharmony_ci    napi_value result = nullptr;
31580826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
31590826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
31600826e83eSopenharmony_ci
31610826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
31620826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
31630826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
31640826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
31650826e83eSopenharmony_ci        return result;
31660826e83eSopenharmony_ci    }
31670826e83eSopenharmony_ci    float factor = 0.0;
31680826e83eSopenharmony_ci    if (!NapiParseUtils::ParseFloat(env, argv[0], factor)) {
31690826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
31700826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "factor", "number"));
31710826e83eSopenharmony_ci        return result;
31720826e83eSopenharmony_ci    }
31730826e83eSopenharmony_ci
31740826e83eSopenharmony_ci    WebviewController *controller = nullptr;
31750826e83eSopenharmony_ci    napi_unwrap(env, thisVar, (void **)&controller);
31760826e83eSopenharmony_ci    if (!controller || !controller->IsInit()) {
31770826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
31780826e83eSopenharmony_ci        return result;
31790826e83eSopenharmony_ci    }
31800826e83eSopenharmony_ci
31810826e83eSopenharmony_ci    ErrCode ret = controller->Zoom(factor);
31820826e83eSopenharmony_ci    if (ret != NO_ERROR) {
31830826e83eSopenharmony_ci        if (ret == NWEB_ERROR) {
31840826e83eSopenharmony_ci            WVLOG_E("Zoom failed.");
31850826e83eSopenharmony_ci            return result;
31860826e83eSopenharmony_ci        }
31870826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, ret);
31880826e83eSopenharmony_ci    }
31890826e83eSopenharmony_ci
31900826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
31910826e83eSopenharmony_ci    return result;
31920826e83eSopenharmony_ci}
31930826e83eSopenharmony_ci
31940826e83eSopenharmony_cinapi_value NapiWebviewController::InnerCompleteWindowNew(napi_env env, napi_callback_info info)
31950826e83eSopenharmony_ci{
31960826e83eSopenharmony_ci    napi_value thisVar = nullptr;
31970826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
31980826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE];
31990826e83eSopenharmony_ci    void* data = nullptr;
32000826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
32010826e83eSopenharmony_ci
32020826e83eSopenharmony_ci    int32_t parentNwebId = -1;
32030826e83eSopenharmony_ci    if (!NapiParseUtils::ParseInt32(env, argv[0], parentNwebId) || parentNwebId == -1) {
32040826e83eSopenharmony_ci        WVLOG_E("Parse parent nweb id failed.");
32050826e83eSopenharmony_ci        return nullptr;
32060826e83eSopenharmony_ci    }
32070826e83eSopenharmony_ci    WebviewController* webviewController = nullptr;
32080826e83eSopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, (void**)&webviewController);
32090826e83eSopenharmony_ci    if ((!webviewController) || (status != napi_ok)) {
32100826e83eSopenharmony_ci        WVLOG_E("webviewController is nullptr.");
32110826e83eSopenharmony_ci        return nullptr;
32120826e83eSopenharmony_ci    }
32130826e83eSopenharmony_ci    webviewController->InnerCompleteWindowNew(parentNwebId);
32140826e83eSopenharmony_ci    return thisVar;
32150826e83eSopenharmony_ci}
32160826e83eSopenharmony_ci
32170826e83eSopenharmony_cinapi_value NapiWebviewController::RegisterJavaScriptProxy(napi_env env, napi_callback_info info)
32180826e83eSopenharmony_ci{
32190826e83eSopenharmony_ci    napi_value thisVar = nullptr;
32200826e83eSopenharmony_ci    napi_value result = nullptr;
32210826e83eSopenharmony_ci    size_t argc = INTEGER_FIVE;
32220826e83eSopenharmony_ci    napi_value argv[INTEGER_FIVE] = { 0 };
32230826e83eSopenharmony_ci    napi_get_undefined(env, &result);
32240826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
32250826e83eSopenharmony_ci    if (argc != INTEGER_THREE && argc != INTEGER_FOUR && argc != INTEGER_FIVE) {
32260826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
32270826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_THREE, "three", "four", "five"));
32280826e83eSopenharmony_ci        return result;
32290826e83eSopenharmony_ci    }
32300826e83eSopenharmony_ci    napi_valuetype valueType = napi_undefined;
32310826e83eSopenharmony_ci    napi_typeof(env, argv[INTEGER_ZERO], &valueType);
32320826e83eSopenharmony_ci    if (valueType != napi_object) {
32330826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
32340826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "object", "object"));
32350826e83eSopenharmony_ci        return result;
32360826e83eSopenharmony_ci    }
32370826e83eSopenharmony_ci    RegisterJavaScriptProxyParam param;
32380826e83eSopenharmony_ci    if (!ParseRegisterJavaScriptProxyParam(env, argc, argv, &param)) {
32390826e83eSopenharmony_ci        return result;
32400826e83eSopenharmony_ci    }
32410826e83eSopenharmony_ci    WebviewController* controller = nullptr;
32420826e83eSopenharmony_ci    napi_unwrap(env, thisVar, (void **)&controller);
32430826e83eSopenharmony_ci    if (!controller || !controller->IsInit()) {
32440826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
32450826e83eSopenharmony_ci        return result;
32460826e83eSopenharmony_ci    }
32470826e83eSopenharmony_ci    controller->SetNWebJavaScriptResultCallBack();
32480826e83eSopenharmony_ci    controller->RegisterJavaScriptProxy(param);
32490826e83eSopenharmony_ci    return result;
32500826e83eSopenharmony_ci}
32510826e83eSopenharmony_ci
32520826e83eSopenharmony_cinapi_value NapiWebviewController::DeleteJavaScriptRegister(napi_env env, napi_callback_info info)
32530826e83eSopenharmony_ci{
32540826e83eSopenharmony_ci    napi_value thisVar = nullptr;
32550826e83eSopenharmony_ci    napi_value result = nullptr;
32560826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
32570826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
32580826e83eSopenharmony_ci
32590826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
32600826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
32610826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
32620826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
32630826e83eSopenharmony_ci        return result;
32640826e83eSopenharmony_ci    }
32650826e83eSopenharmony_ci
32660826e83eSopenharmony_ci    std::string objName;
32670826e83eSopenharmony_ci    if (!NapiParseUtils::ParseString(env, argv[INTEGER_ZERO], objName)) {
32680826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
32690826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "name", "string"));
32700826e83eSopenharmony_ci        return result;
32710826e83eSopenharmony_ci    }
32720826e83eSopenharmony_ci
32730826e83eSopenharmony_ci    WebviewController *controller = nullptr;
32740826e83eSopenharmony_ci    napi_unwrap(env, thisVar, (void **)&controller);
32750826e83eSopenharmony_ci    if (!controller || !controller->IsInit()) {
32760826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
32770826e83eSopenharmony_ci        return result;
32780826e83eSopenharmony_ci    }
32790826e83eSopenharmony_ci    ErrCode ret = controller->DeleteJavaScriptRegister(objName, {});
32800826e83eSopenharmony_ci    if (ret != NO_ERROR) {
32810826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, ret);
32820826e83eSopenharmony_ci        return result;
32830826e83eSopenharmony_ci    }
32840826e83eSopenharmony_ci
32850826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
32860826e83eSopenharmony_ci    return result;
32870826e83eSopenharmony_ci}
32880826e83eSopenharmony_ci
32890826e83eSopenharmony_cinapi_value NapiWebviewController::RunJavaScript(napi_env env, napi_callback_info info)
32900826e83eSopenharmony_ci{
32910826e83eSopenharmony_ci    return RunJS(env, info, false);
32920826e83eSopenharmony_ci}
32930826e83eSopenharmony_ci
32940826e83eSopenharmony_cinapi_value NapiWebviewController::RunJavaScriptExt(napi_env env, napi_callback_info info)
32950826e83eSopenharmony_ci{
32960826e83eSopenharmony_ci    return RunJS(env, info, true);
32970826e83eSopenharmony_ci}
32980826e83eSopenharmony_ci
32990826e83eSopenharmony_cinapi_value NapiWebviewController::RunJS(napi_env env, napi_callback_info info, bool extention)
33000826e83eSopenharmony_ci{
33010826e83eSopenharmony_ci    napi_value thisVar = nullptr;
33020826e83eSopenharmony_ci    napi_value result = nullptr;
33030826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
33040826e83eSopenharmony_ci    size_t argcPromise = INTEGER_ONE;
33050826e83eSopenharmony_ci    size_t argcCallback = INTEGER_TWO;
33060826e83eSopenharmony_ci    napi_value argv[INTEGER_TWO] = { 0 };
33070826e83eSopenharmony_ci
33080826e83eSopenharmony_ci    napi_get_undefined(env, &result);
33090826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
33100826e83eSopenharmony_ci
33110826e83eSopenharmony_ci    if (argc != argcPromise && argc != argcCallback) {
33120826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
33130826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "two"));
33140826e83eSopenharmony_ci        return result;
33150826e83eSopenharmony_ci    }
33160826e83eSopenharmony_ci
33170826e83eSopenharmony_ci    if (argc == argcCallback) {
33180826e83eSopenharmony_ci        napi_valuetype valueType = napi_null;
33190826e83eSopenharmony_ci        napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
33200826e83eSopenharmony_ci        napi_typeof(env, argv[argcCallback - 1], &valueType);
33210826e83eSopenharmony_ci        if (valueType != napi_function) {
33220826e83eSopenharmony_ci            BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
33230826e83eSopenharmony_ci                NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "callback", "function"));
33240826e83eSopenharmony_ci            return result;
33250826e83eSopenharmony_ci        }
33260826e83eSopenharmony_ci    }
33270826e83eSopenharmony_ci
33280826e83eSopenharmony_ci    if (maxFdNum_ == -1) {
33290826e83eSopenharmony_ci        maxFdNum_ =
33300826e83eSopenharmony_ci            std::atoi(NWebAdapterHelper::Instance().ParsePerfConfig("flowBufferConfig", "maxFdNumber").c_str());
33310826e83eSopenharmony_ci    }
33320826e83eSopenharmony_ci
33330826e83eSopenharmony_ci    if (usedFd_.load() < maxFdNum_) {
33340826e83eSopenharmony_ci        return RunJavaScriptInternalExt(env, info, extention);
33350826e83eSopenharmony_ci    }
33360826e83eSopenharmony_ci
33370826e83eSopenharmony_ci    std::string script;
33380826e83eSopenharmony_ci    napi_valuetype valueType = napi_undefined;
33390826e83eSopenharmony_ci    napi_typeof(env, argv[INTEGER_ZERO], &valueType);
33400826e83eSopenharmony_ci    bool parseResult = (valueType == napi_string) ? NapiParseUtils::ParseString(env, argv[INTEGER_ZERO], script) :
33410826e83eSopenharmony_ci        NapiParseUtils::ParseArrayBuffer(env, argv[INTEGER_ZERO], script);
33420826e83eSopenharmony_ci    if (!parseResult) {
33430826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
33440826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "script", "string"));
33450826e83eSopenharmony_ci        return result;
33460826e83eSopenharmony_ci    }
33470826e83eSopenharmony_ci    return RunJavaScriptInternal(env, info, script, extention);
33480826e83eSopenharmony_ci}
33490826e83eSopenharmony_ci
33500826e83eSopenharmony_cinapi_value NapiWebviewController::RunCreatePDFExt(napi_env env, napi_callback_info info)
33510826e83eSopenharmony_ci{
33520826e83eSopenharmony_ci    napi_value thisVar = nullptr;
33530826e83eSopenharmony_ci    napi_value result = nullptr;
33540826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
33550826e83eSopenharmony_ci    size_t argcPromise = INTEGER_ONE;
33560826e83eSopenharmony_ci    size_t argcCallback = INTEGER_TWO;
33570826e83eSopenharmony_ci    napi_value argv[INTEGER_TWO] = { 0 };
33580826e83eSopenharmony_ci
33590826e83eSopenharmony_ci    napi_get_undefined(env, &result);
33600826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
33610826e83eSopenharmony_ci
33620826e83eSopenharmony_ci    WebviewController* webviewController = nullptr;
33630826e83eSopenharmony_ci    napi_unwrap(env, thisVar, (void**)&webviewController);
33640826e83eSopenharmony_ci
33650826e83eSopenharmony_ci    if (!webviewController || !webviewController->IsInit()) {
33660826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
33670826e83eSopenharmony_ci        return result;
33680826e83eSopenharmony_ci    }
33690826e83eSopenharmony_ci
33700826e83eSopenharmony_ci    std::shared_ptr<NWebPDFConfigArgs> pdfConfig = ParsePDFConfigArgs(env, argv[INTEGER_ZERO]);
33710826e83eSopenharmony_ci    if (pdfConfig == nullptr) {
33720826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
33730826e83eSopenharmony_ci        return nullptr;
33740826e83eSopenharmony_ci    }
33750826e83eSopenharmony_ci
33760826e83eSopenharmony_ci    if (argc == argcCallback) {
33770826e83eSopenharmony_ci        napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
33780826e83eSopenharmony_ci        napi_ref jsCallback = nullptr;
33790826e83eSopenharmony_ci        napi_create_reference(env, argv[argcCallback - 1], 1, &jsCallback);
33800826e83eSopenharmony_ci
33810826e83eSopenharmony_ci        if (jsCallback) {
33820826e83eSopenharmony_ci            webviewController->CreatePDFCallbackExt(env, pdfConfig, std::move(jsCallback));
33830826e83eSopenharmony_ci        }
33840826e83eSopenharmony_ci        return result;
33850826e83eSopenharmony_ci    } else if (argc == argcPromise) {
33860826e83eSopenharmony_ci        napi_deferred deferred = nullptr;
33870826e83eSopenharmony_ci        napi_value promise = nullptr;
33880826e83eSopenharmony_ci        napi_create_promise(env, &deferred, &promise);
33890826e83eSopenharmony_ci        if (promise && deferred) {
33900826e83eSopenharmony_ci            webviewController->CreatePDFPromiseExt(env, pdfConfig, deferred);
33910826e83eSopenharmony_ci        }
33920826e83eSopenharmony_ci        return promise;
33930826e83eSopenharmony_ci    }
33940826e83eSopenharmony_ci    return result;
33950826e83eSopenharmony_ci}
33960826e83eSopenharmony_ci
33970826e83eSopenharmony_cinapi_value NapiWebviewController::RunJavaScriptInternal(napi_env env, napi_callback_info info,
33980826e83eSopenharmony_ci    const std::string &script, bool extention)
33990826e83eSopenharmony_ci{
34000826e83eSopenharmony_ci    napi_value thisVar = nullptr;
34010826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
34020826e83eSopenharmony_ci    size_t argcPromise = INTEGER_ONE;
34030826e83eSopenharmony_ci    size_t argcCallback = INTEGER_TWO;
34040826e83eSopenharmony_ci    napi_value argv[INTEGER_TWO] = {0};
34050826e83eSopenharmony_ci
34060826e83eSopenharmony_ci    napi_value result = nullptr;
34070826e83eSopenharmony_ci    napi_get_undefined(env, &result);
34080826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
34090826e83eSopenharmony_ci
34100826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
34110826e83eSopenharmony_ci    napi_unwrap(env, thisVar, (void **)&webviewController);
34120826e83eSopenharmony_ci
34130826e83eSopenharmony_ci    if (!webviewController || !webviewController->IsInit()) {
34140826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
34150826e83eSopenharmony_ci        return result;
34160826e83eSopenharmony_ci    }
34170826e83eSopenharmony_ci
34180826e83eSopenharmony_ci    if (argc == argcCallback) {
34190826e83eSopenharmony_ci        napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
34200826e83eSopenharmony_ci        napi_ref jsCallback = nullptr;
34210826e83eSopenharmony_ci        napi_create_reference(env, argv[argcCallback - 1], 1, &jsCallback);
34220826e83eSopenharmony_ci
34230826e83eSopenharmony_ci        if (jsCallback) {
34240826e83eSopenharmony_ci            webviewController->RunJavaScriptCallback(script, env, std::move(jsCallback), extention);
34250826e83eSopenharmony_ci        }
34260826e83eSopenharmony_ci        return result;
34270826e83eSopenharmony_ci    } else if (argc == argcPromise) {
34280826e83eSopenharmony_ci        napi_deferred deferred = nullptr;
34290826e83eSopenharmony_ci        napi_value promise = nullptr;
34300826e83eSopenharmony_ci        napi_create_promise(env, &deferred, &promise);
34310826e83eSopenharmony_ci        if (promise && deferred) {
34320826e83eSopenharmony_ci            webviewController->RunJavaScriptPromise(script, env, deferred, extention);
34330826e83eSopenharmony_ci        }
34340826e83eSopenharmony_ci        return promise;
34350826e83eSopenharmony_ci    }
34360826e83eSopenharmony_ci    return result;
34370826e83eSopenharmony_ci}
34380826e83eSopenharmony_ci
34390826e83eSopenharmony_ciErrCode NapiWebviewController::ConstructFlowbuf(napi_env env, napi_value argv, int& fd, size_t& scriptLength)
34400826e83eSopenharmony_ci{
34410826e83eSopenharmony_ci    auto flowbufferAdapter = OhosAdapterHelper::GetInstance().CreateFlowbufferAdapter();
34420826e83eSopenharmony_ci    if (!flowbufferAdapter) {
34430826e83eSopenharmony_ci        return NWebError::NEW_OOM;
34440826e83eSopenharmony_ci    }
34450826e83eSopenharmony_ci    flowbufferAdapter->StartPerformanceBoost();
34460826e83eSopenharmony_ci
34470826e83eSopenharmony_ci    napi_valuetype valueType = napi_undefined;
34480826e83eSopenharmony_ci    napi_typeof(env, argv, &valueType);
34490826e83eSopenharmony_ci
34500826e83eSopenharmony_ci    ErrCode constructResult = (valueType == napi_string) ?
34510826e83eSopenharmony_ci        NapiParseUtils::ConstructStringFlowbuf(env, argv, fd, scriptLength) :
34520826e83eSopenharmony_ci        NapiParseUtils::ConstructArrayBufFlowbuf(env, argv, fd, scriptLength);
34530826e83eSopenharmony_ci    return constructResult;
34540826e83eSopenharmony_ci}
34550826e83eSopenharmony_ci
34560826e83eSopenharmony_cinapi_value NapiWebviewController::RunJSBackToOriginal(napi_env env, napi_callback_info info,
34570826e83eSopenharmony_ci    bool extention, napi_value argv, napi_value result)
34580826e83eSopenharmony_ci{
34590826e83eSopenharmony_ci    std::string script;
34600826e83eSopenharmony_ci    napi_valuetype valueType = napi_undefined;
34610826e83eSopenharmony_ci    napi_typeof(env, argv, &valueType);
34620826e83eSopenharmony_ci    bool parseResult = (valueType == napi_string) ? NapiParseUtils::ParseString(env, argv, script) :
34630826e83eSopenharmony_ci        NapiParseUtils::ParseArrayBuffer(env, argv, script);
34640826e83eSopenharmony_ci    if (!parseResult) {
34650826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
34660826e83eSopenharmony_ci        return result;
34670826e83eSopenharmony_ci    }
34680826e83eSopenharmony_ci    return RunJavaScriptInternal(env, info, script, extention);
34690826e83eSopenharmony_ci}
34700826e83eSopenharmony_ci
34710826e83eSopenharmony_cinapi_value NapiWebviewController::RunJavaScriptInternalExt(napi_env env, napi_callback_info info, bool extention)
34720826e83eSopenharmony_ci{
34730826e83eSopenharmony_ci    napi_value thisVar = nullptr;
34740826e83eSopenharmony_ci    napi_value result = nullptr;
34750826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
34760826e83eSopenharmony_ci    size_t argcPromise = INTEGER_ONE;
34770826e83eSopenharmony_ci    size_t argcCallback = INTEGER_TWO;
34780826e83eSopenharmony_ci    napi_value argv[INTEGER_TWO] = {0};
34790826e83eSopenharmony_ci
34800826e83eSopenharmony_ci    napi_get_undefined(env, &result);
34810826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
34820826e83eSopenharmony_ci
34830826e83eSopenharmony_ci    int fd;
34840826e83eSopenharmony_ci    size_t scriptLength;
34850826e83eSopenharmony_ci    ErrCode constructResult = ConstructFlowbuf(env, argv[INTEGER_ZERO], fd, scriptLength);
34860826e83eSopenharmony_ci    if (constructResult != NO_ERROR) {
34870826e83eSopenharmony_ci        return RunJSBackToOriginal(env, info, extention, argv[INTEGER_ZERO], result);
34880826e83eSopenharmony_ci    }
34890826e83eSopenharmony_ci    usedFd_++;
34900826e83eSopenharmony_ci
34910826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
34920826e83eSopenharmony_ci    napi_unwrap(env, thisVar, (void **)&webviewController);
34930826e83eSopenharmony_ci
34940826e83eSopenharmony_ci    if (!webviewController || !webviewController->IsInit()) {
34950826e83eSopenharmony_ci        close(fd);
34960826e83eSopenharmony_ci        usedFd_--;
34970826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
34980826e83eSopenharmony_ci        return result;
34990826e83eSopenharmony_ci    }
35000826e83eSopenharmony_ci
35010826e83eSopenharmony_ci    if (argc == argcCallback) {
35020826e83eSopenharmony_ci        napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
35030826e83eSopenharmony_ci        napi_ref jsCallback = nullptr;
35040826e83eSopenharmony_ci        napi_create_reference(env, argv[argcCallback - 1], 1, &jsCallback);
35050826e83eSopenharmony_ci
35060826e83eSopenharmony_ci        if (jsCallback) {
35070826e83eSopenharmony_ci            // RunJavaScriptCallbackExt will close fd after IPC
35080826e83eSopenharmony_ci            webviewController->RunJavaScriptCallbackExt(fd, scriptLength, env, std::move(jsCallback), extention);
35090826e83eSopenharmony_ci        }
35100826e83eSopenharmony_ci        usedFd_--;
35110826e83eSopenharmony_ci        return result;
35120826e83eSopenharmony_ci    } else if (argc == argcPromise) {
35130826e83eSopenharmony_ci        napi_deferred deferred = nullptr;
35140826e83eSopenharmony_ci        napi_value promise = nullptr;
35150826e83eSopenharmony_ci        napi_create_promise(env, &deferred, &promise);
35160826e83eSopenharmony_ci        if (promise && deferred) {
35170826e83eSopenharmony_ci            // RunJavaScriptCallbackExt will close fd after IPC
35180826e83eSopenharmony_ci            webviewController->RunJavaScriptPromiseExt(fd, scriptLength, env, deferred, extention);
35190826e83eSopenharmony_ci        }
35200826e83eSopenharmony_ci        usedFd_--;
35210826e83eSopenharmony_ci        return promise;
35220826e83eSopenharmony_ci    }
35230826e83eSopenharmony_ci    close(fd);
35240826e83eSopenharmony_ci    usedFd_--;
35250826e83eSopenharmony_ci    return result;
35260826e83eSopenharmony_ci}
35270826e83eSopenharmony_ci
35280826e83eSopenharmony_cinapi_value NapiWebviewController::GetUrl(napi_env env, napi_callback_info info)
35290826e83eSopenharmony_ci{
35300826e83eSopenharmony_ci    napi_value result = nullptr;
35310826e83eSopenharmony_ci    WebviewController *webviewController = GetWebviewController(env, info);
35320826e83eSopenharmony_ci    if (!webviewController) {
35330826e83eSopenharmony_ci        return nullptr;
35340826e83eSopenharmony_ci    }
35350826e83eSopenharmony_ci
35360826e83eSopenharmony_ci    std::string url = "";
35370826e83eSopenharmony_ci    url = webviewController->GetUrl();
35380826e83eSopenharmony_ci    napi_create_string_utf8(env, url.c_str(), url.length(), &result);
35390826e83eSopenharmony_ci
35400826e83eSopenharmony_ci    return result;
35410826e83eSopenharmony_ci}
35420826e83eSopenharmony_ci
35430826e83eSopenharmony_cinapi_value NapiWebviewController::GetOriginalUrl(napi_env env, napi_callback_info info)
35440826e83eSopenharmony_ci{
35450826e83eSopenharmony_ci    napi_value result = nullptr;
35460826e83eSopenharmony_ci    WebviewController *webviewController = GetWebviewController(env, info);
35470826e83eSopenharmony_ci    if (!webviewController) {
35480826e83eSopenharmony_ci        return nullptr;
35490826e83eSopenharmony_ci    }
35500826e83eSopenharmony_ci
35510826e83eSopenharmony_ci    std::string url = "";
35520826e83eSopenharmony_ci    url = webviewController->GetOriginalUrl();
35530826e83eSopenharmony_ci    napi_create_string_utf8(env, url.c_str(), url.length(), &result);
35540826e83eSopenharmony_ci    return result;
35550826e83eSopenharmony_ci}
35560826e83eSopenharmony_ci
35570826e83eSopenharmony_cinapi_value NapiWebviewController::TerminateRenderProcess(napi_env env, napi_callback_info info)
35580826e83eSopenharmony_ci{
35590826e83eSopenharmony_ci    napi_value result = nullptr;
35600826e83eSopenharmony_ci    WebviewController *webviewController = GetWebviewController(env, info);
35610826e83eSopenharmony_ci    if (!webviewController) {
35620826e83eSopenharmony_ci        return nullptr;
35630826e83eSopenharmony_ci    }
35640826e83eSopenharmony_ci    bool ret = false;
35650826e83eSopenharmony_ci    ret = webviewController->TerminateRenderProcess();
35660826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_boolean(env, ret, &result));
35670826e83eSopenharmony_ci    return result;
35680826e83eSopenharmony_ci}
35690826e83eSopenharmony_ci
35700826e83eSopenharmony_cinapi_value NapiWebviewController::SetNetworkAvailable(napi_env env, napi_callback_info info)
35710826e83eSopenharmony_ci{
35720826e83eSopenharmony_ci    napi_value thisVar = nullptr;
35730826e83eSopenharmony_ci    napi_value result = nullptr;
35740826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
35750826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
35760826e83eSopenharmony_ci    bool enable;
35770826e83eSopenharmony_ci
35780826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
35790826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
35800826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
35810826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
35820826e83eSopenharmony_ci        return result;
35830826e83eSopenharmony_ci    }
35840826e83eSopenharmony_ci
35850826e83eSopenharmony_ci    if (!NapiParseUtils::ParseBoolean(env, argv[0], enable)) {
35860826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
35870826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "enable", "booleane"));
35880826e83eSopenharmony_ci        return result;
35890826e83eSopenharmony_ci    }
35900826e83eSopenharmony_ci
35910826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
35920826e83eSopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, (void **)&webviewController);
35930826e83eSopenharmony_ci    if ((!webviewController) || (status != napi_ok) || !webviewController->IsInit()) {
35940826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
35950826e83eSopenharmony_ci        return nullptr;
35960826e83eSopenharmony_ci    }
35970826e83eSopenharmony_ci    webviewController->PutNetworkAvailable(enable);
35980826e83eSopenharmony_ci    return result;
35990826e83eSopenharmony_ci}
36000826e83eSopenharmony_ci
36010826e83eSopenharmony_cinapi_value NapiWebviewController::InnerGetWebId(napi_env env, napi_callback_info info)
36020826e83eSopenharmony_ci{
36030826e83eSopenharmony_ci    napi_value thisVar = nullptr;
36040826e83eSopenharmony_ci    napi_value result = nullptr;
36050826e83eSopenharmony_ci    napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
36060826e83eSopenharmony_ci
36070826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
36080826e83eSopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, (void **)&webviewController);
36090826e83eSopenharmony_ci    int32_t webId = -1;
36100826e83eSopenharmony_ci    if ((!webviewController) || (status != napi_ok) || !webviewController->IsInit()) {
36110826e83eSopenharmony_ci        WVLOG_E("Init error. The WebviewController must be associated with a Web component.");
36120826e83eSopenharmony_ci        napi_create_int32(env, webId, &result);
36130826e83eSopenharmony_ci        return result;
36140826e83eSopenharmony_ci    }
36150826e83eSopenharmony_ci
36160826e83eSopenharmony_ci    webId = webviewController->GetWebId();
36170826e83eSopenharmony_ci    napi_create_int32(env, webId, &result);
36180826e83eSopenharmony_ci
36190826e83eSopenharmony_ci    return result;
36200826e83eSopenharmony_ci}
36210826e83eSopenharmony_ci
36220826e83eSopenharmony_cinapi_value NapiWebviewController::HasImage(napi_env env, napi_callback_info info)
36230826e83eSopenharmony_ci{
36240826e83eSopenharmony_ci    napi_value thisVar = nullptr;
36250826e83eSopenharmony_ci    napi_value result = nullptr;
36260826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
36270826e83eSopenharmony_ci    size_t argcPromiseParaNum = INTEGER_ZERO;
36280826e83eSopenharmony_ci    size_t argcCallbackParaNum = INTEGER_ONE;
36290826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
36300826e83eSopenharmony_ci
36310826e83eSopenharmony_ci    napi_get_undefined(env, &result);
36320826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
36330826e83eSopenharmony_ci
36340826e83eSopenharmony_ci    if (argc != argcPromiseParaNum && argc != argcCallbackParaNum) {
36350826e83eSopenharmony_ci        NWebError::BusinessError::ThrowErrorByErrcode(env, NWebError::PARAM_CHECK_ERROR,
36360826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_TWO, "zero", "one"));
36370826e83eSopenharmony_ci        return result;
36380826e83eSopenharmony_ci    }
36390826e83eSopenharmony_ci
36400826e83eSopenharmony_ci    if (argc == argcCallbackParaNum) {
36410826e83eSopenharmony_ci        napi_valuetype valueType = napi_null;
36420826e83eSopenharmony_ci        napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
36430826e83eSopenharmony_ci        napi_typeof(env, argv[argcCallbackParaNum - 1], &valueType);
36440826e83eSopenharmony_ci        if (valueType != napi_function) {
36450826e83eSopenharmony_ci            NWebError::BusinessError::ThrowErrorByErrcode(env, NWebError::PARAM_CHECK_ERROR,
36460826e83eSopenharmony_ci                NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "callback", "function"));
36470826e83eSopenharmony_ci            return result;
36480826e83eSopenharmony_ci        }
36490826e83eSopenharmony_ci    }
36500826e83eSopenharmony_ci    return HasImageInternal(env, info);
36510826e83eSopenharmony_ci}
36520826e83eSopenharmony_ci
36530826e83eSopenharmony_cinapi_value NapiWebviewController::HasImageInternal(napi_env env, napi_callback_info info)
36540826e83eSopenharmony_ci{
36550826e83eSopenharmony_ci    napi_value thisVar = nullptr;
36560826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
36570826e83eSopenharmony_ci    size_t argcPromiseParaNum = INTEGER_ZERO;
36580826e83eSopenharmony_ci    size_t argcCallbackParaNum = INTEGER_ONE;
36590826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
36600826e83eSopenharmony_ci
36610826e83eSopenharmony_ci    napi_value result = nullptr;
36620826e83eSopenharmony_ci    napi_get_undefined(env, &result);
36630826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
36640826e83eSopenharmony_ci
36650826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
36660826e83eSopenharmony_ci    napi_unwrap(env, thisVar, (void **)&webviewController);
36670826e83eSopenharmony_ci
36680826e83eSopenharmony_ci    if (!webviewController || !webviewController->IsInit()) {
36690826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
36700826e83eSopenharmony_ci        return result;
36710826e83eSopenharmony_ci    }
36720826e83eSopenharmony_ci
36730826e83eSopenharmony_ci    if (argc == argcCallbackParaNum) {
36740826e83eSopenharmony_ci        napi_ref jsCallback = nullptr;
36750826e83eSopenharmony_ci        napi_create_reference(env, argv[argcCallbackParaNum - 1], 1, &jsCallback);
36760826e83eSopenharmony_ci
36770826e83eSopenharmony_ci        if (jsCallback) {
36780826e83eSopenharmony_ci            ErrCode ret = webviewController->HasImagesCallback(env, std::move(jsCallback));
36790826e83eSopenharmony_ci            if (ret == NWEB_ERROR) {
36800826e83eSopenharmony_ci                return nullptr;
36810826e83eSopenharmony_ci            } else if (ret != NO_ERROR) {
36820826e83eSopenharmony_ci                BusinessError::ThrowErrorByErrcode(env, ret);
36830826e83eSopenharmony_ci                return nullptr;
36840826e83eSopenharmony_ci            }
36850826e83eSopenharmony_ci        }
36860826e83eSopenharmony_ci        return result;
36870826e83eSopenharmony_ci    } else if (argc == argcPromiseParaNum) {
36880826e83eSopenharmony_ci        napi_deferred deferred = nullptr;
36890826e83eSopenharmony_ci        napi_value promise = nullptr;
36900826e83eSopenharmony_ci        napi_create_promise(env, &deferred, &promise);
36910826e83eSopenharmony_ci        if (promise && deferred) {
36920826e83eSopenharmony_ci            ErrCode ret = webviewController->HasImagesPromise(env, deferred);
36930826e83eSopenharmony_ci            if (ret == NWEB_ERROR) {
36940826e83eSopenharmony_ci                return nullptr;
36950826e83eSopenharmony_ci            } else if (ret != NO_ERROR) {
36960826e83eSopenharmony_ci                BusinessError::ThrowErrorByErrcode(env, ret);
36970826e83eSopenharmony_ci                return nullptr;
36980826e83eSopenharmony_ci            }
36990826e83eSopenharmony_ci        }
37000826e83eSopenharmony_ci        return promise;
37010826e83eSopenharmony_ci    }
37020826e83eSopenharmony_ci    return result;
37030826e83eSopenharmony_ci}
37040826e83eSopenharmony_ci
37050826e83eSopenharmony_cinapi_value NapiWebviewController::RemoveCache(napi_env env, napi_callback_info info)
37060826e83eSopenharmony_ci{
37070826e83eSopenharmony_ci    napi_value thisVar = nullptr;
37080826e83eSopenharmony_ci    napi_value result = nullptr;
37090826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
37100826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
37110826e83eSopenharmony_ci    bool includeDiskFiles;
37120826e83eSopenharmony_ci
37130826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
37140826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
37150826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
37160826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
37170826e83eSopenharmony_ci        return result;
37180826e83eSopenharmony_ci    }
37190826e83eSopenharmony_ci
37200826e83eSopenharmony_ci    if (!NapiParseUtils::ParseBoolean(env, argv[0], includeDiskFiles)) {
37210826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
37220826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "clearRom", "boolean"));
37230826e83eSopenharmony_ci        return result;
37240826e83eSopenharmony_ci    }
37250826e83eSopenharmony_ci
37260826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
37270826e83eSopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, (void **)&webviewController);
37280826e83eSopenharmony_ci    if ((!webviewController) || (status != napi_ok) || !webviewController->IsInit()) {
37290826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
37300826e83eSopenharmony_ci        return nullptr;
37310826e83eSopenharmony_ci    }
37320826e83eSopenharmony_ci    webviewController->RemoveCache(includeDiskFiles);
37330826e83eSopenharmony_ci    return result;
37340826e83eSopenharmony_ci}
37350826e83eSopenharmony_ci
37360826e83eSopenharmony_cinapi_value NapiWebviewController::IsIncognitoMode(napi_env env, napi_callback_info info)
37370826e83eSopenharmony_ci{
37380826e83eSopenharmony_ci    napi_value result = nullptr;
37390826e83eSopenharmony_ci    WebviewController *webviewController = GetWebviewController(env, info);
37400826e83eSopenharmony_ci    if (!webviewController) {
37410826e83eSopenharmony_ci        return nullptr;
37420826e83eSopenharmony_ci    }
37430826e83eSopenharmony_ci
37440826e83eSopenharmony_ci    bool incognitoMode = false;
37450826e83eSopenharmony_ci    incognitoMode = webviewController->IsIncognitoMode();
37460826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_boolean(env, incognitoMode, &result));
37470826e83eSopenharmony_ci    return result;
37480826e83eSopenharmony_ci}
37490826e83eSopenharmony_ci
37500826e83eSopenharmony_cinapi_value NapiWebHistoryList::JsConstructor(napi_env env, napi_callback_info info)
37510826e83eSopenharmony_ci{
37520826e83eSopenharmony_ci    napi_value thisVar = nullptr;
37530826e83eSopenharmony_ci    napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
37540826e83eSopenharmony_ci    return thisVar;
37550826e83eSopenharmony_ci}
37560826e83eSopenharmony_ci
37570826e83eSopenharmony_ciMedia::PixelFormat getColorType(ImageColorType colorType)
37580826e83eSopenharmony_ci{
37590826e83eSopenharmony_ci    Media::PixelFormat pixelFormat_;
37600826e83eSopenharmony_ci    switch (colorType) {
37610826e83eSopenharmony_ci        case ImageColorType::COLOR_TYPE_UNKNOWN:
37620826e83eSopenharmony_ci            pixelFormat_ = Media::PixelFormat::UNKNOWN;
37630826e83eSopenharmony_ci            break;
37640826e83eSopenharmony_ci        case ImageColorType::COLOR_TYPE_RGBA_8888:
37650826e83eSopenharmony_ci            pixelFormat_ = Media::PixelFormat::RGBA_8888;
37660826e83eSopenharmony_ci            break;
37670826e83eSopenharmony_ci        case ImageColorType::COLOR_TYPE_BGRA_8888:
37680826e83eSopenharmony_ci            pixelFormat_ = Media::PixelFormat::BGRA_8888;
37690826e83eSopenharmony_ci            break;
37700826e83eSopenharmony_ci        default:
37710826e83eSopenharmony_ci            pixelFormat_ = Media::PixelFormat::UNKNOWN;
37720826e83eSopenharmony_ci            break;
37730826e83eSopenharmony_ci    }
37740826e83eSopenharmony_ci    return pixelFormat_;
37750826e83eSopenharmony_ci}
37760826e83eSopenharmony_ci
37770826e83eSopenharmony_ciMedia::AlphaType getAlphaType(ImageAlphaType alphaType)
37780826e83eSopenharmony_ci{
37790826e83eSopenharmony_ci    Media::AlphaType alphaType_;
37800826e83eSopenharmony_ci    switch (alphaType) {
37810826e83eSopenharmony_ci        case ImageAlphaType::ALPHA_TYPE_UNKNOWN:
37820826e83eSopenharmony_ci            alphaType_ = Media::AlphaType::IMAGE_ALPHA_TYPE_UNKNOWN;
37830826e83eSopenharmony_ci            break;
37840826e83eSopenharmony_ci        case ImageAlphaType::ALPHA_TYPE_OPAQUE:
37850826e83eSopenharmony_ci            alphaType_ = Media::AlphaType::IMAGE_ALPHA_TYPE_OPAQUE;
37860826e83eSopenharmony_ci            break;
37870826e83eSopenharmony_ci        case ImageAlphaType::ALPHA_TYPE_PREMULTIPLIED:
37880826e83eSopenharmony_ci            alphaType_ = Media::AlphaType::IMAGE_ALPHA_TYPE_PREMUL;
37890826e83eSopenharmony_ci            break;
37900826e83eSopenharmony_ci        case ImageAlphaType::ALPHA_TYPE_POSTMULTIPLIED:
37910826e83eSopenharmony_ci            alphaType_ = Media::AlphaType::IMAGE_ALPHA_TYPE_UNPREMUL;
37920826e83eSopenharmony_ci            break;
37930826e83eSopenharmony_ci        default:
37940826e83eSopenharmony_ci            alphaType_ = Media::AlphaType::IMAGE_ALPHA_TYPE_UNKNOWN;
37950826e83eSopenharmony_ci            break;
37960826e83eSopenharmony_ci    }
37970826e83eSopenharmony_ci    return alphaType_;
37980826e83eSopenharmony_ci}
37990826e83eSopenharmony_ci
38000826e83eSopenharmony_cinapi_value NapiWebHistoryList::GetFavicon(napi_env env, std::shared_ptr<NWebHistoryItem> item)
38010826e83eSopenharmony_ci{
38020826e83eSopenharmony_ci    napi_value result = nullptr;
38030826e83eSopenharmony_ci    void *data = nullptr;
38040826e83eSopenharmony_ci    int32_t width = 0;
38050826e83eSopenharmony_ci    int32_t height = 0;
38060826e83eSopenharmony_ci    ImageColorType colorType = ImageColorType::COLOR_TYPE_UNKNOWN;
38070826e83eSopenharmony_ci    ImageAlphaType alphaType = ImageAlphaType::ALPHA_TYPE_UNKNOWN;
38080826e83eSopenharmony_ci    bool isGetFavicon = item->GetFavicon(&data, width, height, colorType, alphaType);
38090826e83eSopenharmony_ci    napi_get_null(env, &result);
38100826e83eSopenharmony_ci
38110826e83eSopenharmony_ci    if (!isGetFavicon) {
38120826e83eSopenharmony_ci        return result;
38130826e83eSopenharmony_ci    }
38140826e83eSopenharmony_ci
38150826e83eSopenharmony_ci    Media::InitializationOptions opt;
38160826e83eSopenharmony_ci    opt.size.width = width;
38170826e83eSopenharmony_ci    opt.size.height = height;
38180826e83eSopenharmony_ci    opt.pixelFormat = getColorType(colorType);
38190826e83eSopenharmony_ci    opt.alphaType = getAlphaType(alphaType);
38200826e83eSopenharmony_ci    opt.editable = true;
38210826e83eSopenharmony_ci    auto pixelMap = Media::PixelMap::Create(opt);
38220826e83eSopenharmony_ci    if (pixelMap == nullptr) {
38230826e83eSopenharmony_ci        return result;
38240826e83eSopenharmony_ci    }
38250826e83eSopenharmony_ci    uint64_t stride = static_cast<uint64_t>(width) << 2;
38260826e83eSopenharmony_ci    uint64_t bufferSize = stride * static_cast<uint64_t>(height);
38270826e83eSopenharmony_ci    pixelMap->WritePixels(static_cast<const uint8_t *>(data), bufferSize);
38280826e83eSopenharmony_ci    std::shared_ptr<Media::PixelMap> pixelMapToJs(pixelMap.release());
38290826e83eSopenharmony_ci    napi_value jsPixelMap = OHOS::Media::PixelMapNapi::CreatePixelMap(env, pixelMapToJs);
38300826e83eSopenharmony_ci    return jsPixelMap;
38310826e83eSopenharmony_ci}
38320826e83eSopenharmony_ci
38330826e83eSopenharmony_cinapi_value NapiWebHistoryList::GetItem(napi_env env, napi_callback_info info)
38340826e83eSopenharmony_ci{
38350826e83eSopenharmony_ci    napi_value thisVar = nullptr;
38360826e83eSopenharmony_ci    napi_value result = nullptr;
38370826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
38380826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
38390826e83eSopenharmony_ci    int32_t index;
38400826e83eSopenharmony_ci    WebHistoryList *historyList = nullptr;
38410826e83eSopenharmony_ci
38420826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
38430826e83eSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, (void **)&historyList));
38440826e83eSopenharmony_ci    if (historyList == nullptr) {
38450826e83eSopenharmony_ci        WVLOG_E("unwrap historyList failed.");
38460826e83eSopenharmony_ci        return result;
38470826e83eSopenharmony_ci    }
38480826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
38490826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
38500826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
38510826e83eSopenharmony_ci        return result;
38520826e83eSopenharmony_ci    }
38530826e83eSopenharmony_ci    if (!NapiParseUtils::ParseInt32(env, argv[0], index)) {
38540826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
38550826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NOT_NULL_TWO, "index", "int"));
38560826e83eSopenharmony_ci        return result;
38570826e83eSopenharmony_ci    }
38580826e83eSopenharmony_ci    if (index >= historyList->GetListSize() || index < 0) {
38590826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
38600826e83eSopenharmony_ci            "BusinessError 401: Parameter error. The value of index must be greater than or equal to 0");
38610826e83eSopenharmony_ci        return result;
38620826e83eSopenharmony_ci    }
38630826e83eSopenharmony_ci
38640826e83eSopenharmony_ci    std::shared_ptr<NWebHistoryItem> item = historyList->GetItem(index);
38650826e83eSopenharmony_ci    if (!item) {
38660826e83eSopenharmony_ci        return result;
38670826e83eSopenharmony_ci    }
38680826e83eSopenharmony_ci
38690826e83eSopenharmony_ci    napi_create_object(env, &result);
38700826e83eSopenharmony_ci    std::string historyUrl = item->GetHistoryUrl();
38710826e83eSopenharmony_ci    std::string historyRawUrl = item->GetHistoryRawUrl();
38720826e83eSopenharmony_ci    std::string title = item->GetHistoryTitle();
38730826e83eSopenharmony_ci
38740826e83eSopenharmony_ci    napi_value js_historyUrl;
38750826e83eSopenharmony_ci    napi_create_string_utf8(env, historyUrl.c_str(), historyUrl.length(), &js_historyUrl);
38760826e83eSopenharmony_ci    napi_set_named_property(env, result, "historyUrl", js_historyUrl);
38770826e83eSopenharmony_ci
38780826e83eSopenharmony_ci    napi_value js_historyRawUrl;
38790826e83eSopenharmony_ci    napi_create_string_utf8(env, historyRawUrl.c_str(), historyRawUrl.length(), &js_historyRawUrl);
38800826e83eSopenharmony_ci    napi_set_named_property(env, result, "historyRawUrl", js_historyRawUrl);
38810826e83eSopenharmony_ci
38820826e83eSopenharmony_ci    napi_value js_title;
38830826e83eSopenharmony_ci    napi_create_string_utf8(env, title.c_str(), title.length(), &js_title);
38840826e83eSopenharmony_ci    napi_set_named_property(env, result, "title", js_title);
38850826e83eSopenharmony_ci
38860826e83eSopenharmony_ci    napi_value js_icon = GetFavicon(env, item);
38870826e83eSopenharmony_ci    napi_set_named_property(env, result, "icon", js_icon);
38880826e83eSopenharmony_ci    return result;
38890826e83eSopenharmony_ci}
38900826e83eSopenharmony_ci
38910826e83eSopenharmony_cinapi_value NapiWebviewController::getBackForwardEntries(napi_env env, napi_callback_info info)
38920826e83eSopenharmony_ci{
38930826e83eSopenharmony_ci    napi_value thisVar = nullptr;
38940826e83eSopenharmony_ci    napi_value result = nullptr;
38950826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
38960826e83eSopenharmony_ci
38970826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
38980826e83eSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, (void **)&webviewController));
38990826e83eSopenharmony_ci    if (webviewController == nullptr || !webviewController->IsInit()) {
39000826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
39010826e83eSopenharmony_ci        return nullptr;
39020826e83eSopenharmony_ci    }
39030826e83eSopenharmony_ci
39040826e83eSopenharmony_ci    std::shared_ptr<NWebHistoryList> list = webviewController->GetHistoryList();
39050826e83eSopenharmony_ci    if (!list) {
39060826e83eSopenharmony_ci        return result;
39070826e83eSopenharmony_ci    }
39080826e83eSopenharmony_ci
39090826e83eSopenharmony_ci    int32_t currentIndex = list->GetCurrentIndex();
39100826e83eSopenharmony_ci    int32_t size = list->GetListSize();
39110826e83eSopenharmony_ci
39120826e83eSopenharmony_ci    napi_value historyList = nullptr;
39130826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_reference_value(env, g_historyListRef, &historyList));
39140826e83eSopenharmony_ci    NAPI_CALL(env, napi_new_instance(env, historyList, 0, NULL, &result));
39150826e83eSopenharmony_ci
39160826e83eSopenharmony_ci    napi_value js_currentIndex;
39170826e83eSopenharmony_ci    napi_create_int32(env, currentIndex, &js_currentIndex);
39180826e83eSopenharmony_ci    napi_set_named_property(env, result, "currentIndex", js_currentIndex);
39190826e83eSopenharmony_ci
39200826e83eSopenharmony_ci    napi_value js_size;
39210826e83eSopenharmony_ci    napi_create_int32(env, size, &js_size);
39220826e83eSopenharmony_ci    napi_set_named_property(env, result, "size", js_size);
39230826e83eSopenharmony_ci
39240826e83eSopenharmony_ci    WebHistoryList *webHistoryList = new (std::nothrow) WebHistoryList(list);
39250826e83eSopenharmony_ci    if (webHistoryList == nullptr) {
39260826e83eSopenharmony_ci        return result;
39270826e83eSopenharmony_ci    }
39280826e83eSopenharmony_ci
39290826e83eSopenharmony_ci    NAPI_CALL(env, napi_wrap(env, result, webHistoryList,
39300826e83eSopenharmony_ci        [](napi_env env, void *data, void *hint) {
39310826e83eSopenharmony_ci            WebHistoryList *webHistoryList = static_cast<WebHistoryList *>(data);
39320826e83eSopenharmony_ci            delete webHistoryList;
39330826e83eSopenharmony_ci        },
39340826e83eSopenharmony_ci        nullptr, nullptr));
39350826e83eSopenharmony_ci
39360826e83eSopenharmony_ci    return result;
39370826e83eSopenharmony_ci}
39380826e83eSopenharmony_ci
39390826e83eSopenharmony_cinapi_value NapiWebviewController::GetFavicon(napi_env env, napi_callback_info info)
39400826e83eSopenharmony_ci{
39410826e83eSopenharmony_ci    napi_value thisVar = nullptr;
39420826e83eSopenharmony_ci    napi_value result = nullptr;
39430826e83eSopenharmony_ci    napi_get_null(env, &result);
39440826e83eSopenharmony_ci    napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
39450826e83eSopenharmony_ci
39460826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
39470826e83eSopenharmony_ci    napi_unwrap(env, thisVar, (void **)&webviewController);
39480826e83eSopenharmony_ci
39490826e83eSopenharmony_ci    if (!webviewController || !webviewController->IsInit()) {
39500826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
39510826e83eSopenharmony_ci        return result;
39520826e83eSopenharmony_ci    }
39530826e83eSopenharmony_ci
39540826e83eSopenharmony_ci    const void *data = nullptr;
39550826e83eSopenharmony_ci    size_t width = 0;
39560826e83eSopenharmony_ci    size_t height = 0;
39570826e83eSopenharmony_ci    ImageColorType colorType = ImageColorType::COLOR_TYPE_UNKNOWN;
39580826e83eSopenharmony_ci    ImageAlphaType alphaType = ImageAlphaType::ALPHA_TYPE_UNKNOWN;
39590826e83eSopenharmony_ci    bool isGetFavicon = webviewController->GetFavicon(&data, width, height, colorType, alphaType);
39600826e83eSopenharmony_ci    if (!isGetFavicon) {
39610826e83eSopenharmony_ci        return result;
39620826e83eSopenharmony_ci    }
39630826e83eSopenharmony_ci
39640826e83eSopenharmony_ci    Media::InitializationOptions opt;
39650826e83eSopenharmony_ci    opt.size.width = static_cast<int32_t>(width);
39660826e83eSopenharmony_ci    opt.size.height = static_cast<int32_t>(height);
39670826e83eSopenharmony_ci    opt.pixelFormat = getColorType(colorType);
39680826e83eSopenharmony_ci    opt.alphaType = getAlphaType(alphaType);
39690826e83eSopenharmony_ci    opt.editable = true;
39700826e83eSopenharmony_ci    auto pixelMap = Media::PixelMap::Create(opt);
39710826e83eSopenharmony_ci    if (pixelMap == nullptr) {
39720826e83eSopenharmony_ci        return result;
39730826e83eSopenharmony_ci    }
39740826e83eSopenharmony_ci    uint64_t stride = static_cast<uint64_t>(width) << 2;
39750826e83eSopenharmony_ci    uint64_t bufferSize = stride * static_cast<uint64_t>(height);
39760826e83eSopenharmony_ci    pixelMap->WritePixels(static_cast<const uint8_t *>(data), bufferSize);
39770826e83eSopenharmony_ci    std::shared_ptr<Media::PixelMap> pixelMapToJs(pixelMap.release());
39780826e83eSopenharmony_ci    napi_value jsPixelMap = OHOS::Media::PixelMapNapi::CreatePixelMap(env, pixelMapToJs);
39790826e83eSopenharmony_ci    return jsPixelMap;
39800826e83eSopenharmony_ci}
39810826e83eSopenharmony_ci
39820826e83eSopenharmony_cinapi_value NapiWebviewController::SerializeWebState(napi_env env, napi_callback_info info)
39830826e83eSopenharmony_ci{
39840826e83eSopenharmony_ci    napi_value thisVar = nullptr;
39850826e83eSopenharmony_ci    napi_value result = nullptr;
39860826e83eSopenharmony_ci    napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
39870826e83eSopenharmony_ci    napi_get_null(env, &result);
39880826e83eSopenharmony_ci
39890826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
39900826e83eSopenharmony_ci    napi_unwrap(env, thisVar, (void **)&webviewController);
39910826e83eSopenharmony_ci    if (!webviewController || !webviewController->IsInit()) {
39920826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
39930826e83eSopenharmony_ci        return result;
39940826e83eSopenharmony_ci    }
39950826e83eSopenharmony_ci
39960826e83eSopenharmony_ci    void *data = nullptr;
39970826e83eSopenharmony_ci    napi_value buffer = nullptr;
39980826e83eSopenharmony_ci    auto webState = webviewController->SerializeWebState();
39990826e83eSopenharmony_ci
40000826e83eSopenharmony_ci    NAPI_CALL(env, napi_create_arraybuffer(env, webState.size(), &data, &buffer));
40010826e83eSopenharmony_ci    int retCode = memcpy_s(data, webState.size(), webState.data(), webState.size());
40020826e83eSopenharmony_ci    if (retCode != 0) {
40030826e83eSopenharmony_ci        return result;
40040826e83eSopenharmony_ci    }
40050826e83eSopenharmony_ci    NAPI_CALL(env, napi_create_typedarray(env, napi_uint8_array, webState.size(), buffer, 0, &result));
40060826e83eSopenharmony_ci    return result;
40070826e83eSopenharmony_ci}
40080826e83eSopenharmony_ci
40090826e83eSopenharmony_cinapi_value NapiWebviewController::RestoreWebState(napi_env env, napi_callback_info info)
40100826e83eSopenharmony_ci{
40110826e83eSopenharmony_ci    napi_value thisVar = nullptr;
40120826e83eSopenharmony_ci    napi_value result = nullptr;
40130826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
40140826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
40150826e83eSopenharmony_ci    napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
40160826e83eSopenharmony_ci    napi_get_null(env, &result);
40170826e83eSopenharmony_ci
40180826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
40190826e83eSopenharmony_ci    napi_unwrap(env, thisVar, (void **)&webviewController);
40200826e83eSopenharmony_ci    if (!webviewController || !webviewController->IsInit()) {
40210826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
40220826e83eSopenharmony_ci        return result;
40230826e83eSopenharmony_ci    }
40240826e83eSopenharmony_ci
40250826e83eSopenharmony_ci    bool isTypedArray = false;
40260826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
40270826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
40280826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
40290826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
40300826e83eSopenharmony_ci        return result;
40310826e83eSopenharmony_ci    }
40320826e83eSopenharmony_ci    NAPI_CALL(env, napi_is_typedarray(env, argv[0], &isTypedArray));
40330826e83eSopenharmony_ci    if (!isTypedArray) {
40340826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
40350826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "state", "uint8Array"));
40360826e83eSopenharmony_ci        return result;
40370826e83eSopenharmony_ci    }
40380826e83eSopenharmony_ci
40390826e83eSopenharmony_ci    napi_typedarray_type type;
40400826e83eSopenharmony_ci    size_t length = 0;
40410826e83eSopenharmony_ci    napi_value buffer = nullptr;
40420826e83eSopenharmony_ci    size_t offset = 0;
40430826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_typedarray_info(env, argv[0], &type, &length, nullptr, &buffer, &offset));
40440826e83eSopenharmony_ci    if (type != napi_uint8_array) {
40450826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
40460826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "state", "uint8Array"));
40470826e83eSopenharmony_ci        return result;
40480826e83eSopenharmony_ci    }
40490826e83eSopenharmony_ci    uint8_t *data = nullptr;
40500826e83eSopenharmony_ci    size_t total = 0;
40510826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_arraybuffer_info(env, buffer, reinterpret_cast<void **>(&data), &total));
40520826e83eSopenharmony_ci    length = std::min<size_t>(length, total - offset);
40530826e83eSopenharmony_ci    std::vector<uint8_t> state(length);
40540826e83eSopenharmony_ci    int retCode = memcpy_s(state.data(), state.size(), &data[offset], length);
40550826e83eSopenharmony_ci    if (retCode != 0) {
40560826e83eSopenharmony_ci        return result;
40570826e83eSopenharmony_ci    }
40580826e83eSopenharmony_ci    webviewController->RestoreWebState(state);
40590826e83eSopenharmony_ci    return result;
40600826e83eSopenharmony_ci}
40610826e83eSopenharmony_ci
40620826e83eSopenharmony_cinapi_value NapiWebviewController::ScrollPageDown(napi_env env, napi_callback_info info)
40630826e83eSopenharmony_ci{
40640826e83eSopenharmony_ci    napi_value thisVar = nullptr;
40650826e83eSopenharmony_ci    napi_value result = nullptr;
40660826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
40670826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
40680826e83eSopenharmony_ci    bool bottom;
40690826e83eSopenharmony_ci
40700826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
40710826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
40720826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
40730826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
40740826e83eSopenharmony_ci        return result;
40750826e83eSopenharmony_ci    }
40760826e83eSopenharmony_ci
40770826e83eSopenharmony_ci    if (!NapiParseUtils::ParseBoolean(env, argv[0], bottom)) {
40780826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
40790826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "bottom", "booleane"));
40800826e83eSopenharmony_ci        return result;
40810826e83eSopenharmony_ci    }
40820826e83eSopenharmony_ci
40830826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
40840826e83eSopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, (void **)&webviewController);
40850826e83eSopenharmony_ci    if ((!webviewController) || (status != napi_ok) || !webviewController->IsInit()) {
40860826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
40870826e83eSopenharmony_ci        return nullptr;
40880826e83eSopenharmony_ci    }
40890826e83eSopenharmony_ci    webviewController->ScrollPageDown(bottom);
40900826e83eSopenharmony_ci    return result;
40910826e83eSopenharmony_ci}
40920826e83eSopenharmony_ci
40930826e83eSopenharmony_cinapi_value NapiWebviewController::ScrollPageUp(napi_env env, napi_callback_info info)
40940826e83eSopenharmony_ci{
40950826e83eSopenharmony_ci    napi_value thisVar = nullptr;
40960826e83eSopenharmony_ci    napi_value result = nullptr;
40970826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
40980826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
40990826e83eSopenharmony_ci    bool top;
41000826e83eSopenharmony_ci
41010826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
41020826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
41030826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
41040826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
41050826e83eSopenharmony_ci        return result;
41060826e83eSopenharmony_ci    }
41070826e83eSopenharmony_ci
41080826e83eSopenharmony_ci    if (!NapiParseUtils::ParseBoolean(env, argv[0], top)) {
41090826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
41100826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "top", "booleane"));
41110826e83eSopenharmony_ci        return result;
41120826e83eSopenharmony_ci    }
41130826e83eSopenharmony_ci
41140826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
41150826e83eSopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, (void **)&webviewController);
41160826e83eSopenharmony_ci    if ((!webviewController) || (status != napi_ok) || !webviewController->IsInit()) {
41170826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
41180826e83eSopenharmony_ci        return nullptr;
41190826e83eSopenharmony_ci    }
41200826e83eSopenharmony_ci    webviewController->ScrollPageUp(top);
41210826e83eSopenharmony_ci    return result;
41220826e83eSopenharmony_ci}
41230826e83eSopenharmony_ci
41240826e83eSopenharmony_cibool CheckSchemeName(const std::string& schemeName)
41250826e83eSopenharmony_ci{
41260826e83eSopenharmony_ci    if (schemeName.empty() || schemeName.size() > MAX_CUSTOM_SCHEME_NAME_LENGTH) {
41270826e83eSopenharmony_ci        WVLOG_E("Invalid scheme name length");
41280826e83eSopenharmony_ci        return false;
41290826e83eSopenharmony_ci    }
41300826e83eSopenharmony_ci    for (auto it = schemeName.begin(); it != schemeName.end(); it++) {
41310826e83eSopenharmony_ci        char chr = *it;
41320826e83eSopenharmony_ci        if (!((chr >= 'a' && chr <= 'z') || (chr >= '0' && chr <= '9') ||
41330826e83eSopenharmony_ci            (chr == '.') || (chr == '+') || (chr == '-'))) {
41340826e83eSopenharmony_ci            WVLOG_E("invalid character %{public}c", chr);
41350826e83eSopenharmony_ci            return false;
41360826e83eSopenharmony_ci        }
41370826e83eSopenharmony_ci    }
41380826e83eSopenharmony_ci    return true;
41390826e83eSopenharmony_ci}
41400826e83eSopenharmony_ci
41410826e83eSopenharmony_civoid SetCustomizeSchemeOption(Scheme& scheme)
41420826e83eSopenharmony_ci{
41430826e83eSopenharmony_ci    std::map<int, std::function<bool(const Scheme&)>> schemeProperties = {
41440826e83eSopenharmony_ci        {0, [](const Scheme& scheme) { return scheme.isStandard; }},
41450826e83eSopenharmony_ci        {1, [](const Scheme& scheme) { return scheme.isLocal; }},
41460826e83eSopenharmony_ci        {2, [](const Scheme& scheme) { return scheme.isDisplayIsolated; }},
41470826e83eSopenharmony_ci        {3, [](const Scheme& scheme) { return scheme.isSecure; }},
41480826e83eSopenharmony_ci        {4, [](const Scheme& scheme) { return scheme.isSupportCORS; }},
41490826e83eSopenharmony_ci        {5, [](const Scheme& scheme) { return scheme.isCspBypassing; }},
41500826e83eSopenharmony_ci        {6, [](const Scheme& scheme) { return scheme.isSupportFetch; }},
41510826e83eSopenharmony_ci        {7, [](const Scheme& scheme) { return scheme.isCodeCacheSupported; }}
41520826e83eSopenharmony_ci    };
41530826e83eSopenharmony_ci
41540826e83eSopenharmony_ci    for (const auto& property : schemeProperties) {
41550826e83eSopenharmony_ci        if (property.second(scheme)) {
41560826e83eSopenharmony_ci            scheme.option += 1 << property.first;
41570826e83eSopenharmony_ci        }
41580826e83eSopenharmony_ci    }
41590826e83eSopenharmony_ci}
41600826e83eSopenharmony_ci
41610826e83eSopenharmony_cibool SetCustomizeScheme(napi_env env, napi_value obj, Scheme& scheme)
41620826e83eSopenharmony_ci{
41630826e83eSopenharmony_ci    std::map<std::string, std::function<void(Scheme&, bool)>> schemeBooleanProperties = {
41640826e83eSopenharmony_ci        {"isSupportCORS", [](Scheme& scheme, bool value) { scheme.isSupportCORS = value; }},
41650826e83eSopenharmony_ci        {"isSupportFetch", [](Scheme& scheme, bool value) { scheme.isSupportFetch = value; }},
41660826e83eSopenharmony_ci        {"isStandard", [](Scheme& scheme, bool value) { scheme.isStandard = value; }},
41670826e83eSopenharmony_ci        {"isLocal", [](Scheme& scheme, bool value) { scheme.isLocal = value; }},
41680826e83eSopenharmony_ci        {"isDisplayIsolated", [](Scheme& scheme, bool value) { scheme.isDisplayIsolated = value; }},
41690826e83eSopenharmony_ci        {"isSecure", [](Scheme& scheme, bool value) { scheme.isSecure = value; }},
41700826e83eSopenharmony_ci        {"isCspBypassing", [](Scheme& scheme, bool value) { scheme.isCspBypassing = value; }},
41710826e83eSopenharmony_ci        {"isCodeCacheSupported", [](Scheme& scheme, bool value) { scheme.isCodeCacheSupported = value; }}
41720826e83eSopenharmony_ci    };
41730826e83eSopenharmony_ci
41740826e83eSopenharmony_ci    for (const auto& property : schemeBooleanProperties) {
41750826e83eSopenharmony_ci        napi_value propertyObj = nullptr;
41760826e83eSopenharmony_ci        napi_get_named_property(env, obj, property.first.c_str(), &propertyObj);
41770826e83eSopenharmony_ci        bool schemeProperty = false;
41780826e83eSopenharmony_ci        if (!NapiParseUtils::ParseBoolean(env, propertyObj, schemeProperty)) {
41790826e83eSopenharmony_ci            if (property.first == "isSupportCORS" || property.first == "isSupportFetch") {
41800826e83eSopenharmony_ci                return false;
41810826e83eSopenharmony_ci            }
41820826e83eSopenharmony_ci        }
41830826e83eSopenharmony_ci        property.second(scheme, schemeProperty);
41840826e83eSopenharmony_ci    }
41850826e83eSopenharmony_ci
41860826e83eSopenharmony_ci    napi_value schemeNameObj = nullptr;
41870826e83eSopenharmony_ci    if (napi_get_named_property(env, obj, "schemeName", &schemeNameObj) != napi_ok) {
41880826e83eSopenharmony_ci        return false;
41890826e83eSopenharmony_ci    }
41900826e83eSopenharmony_ci    if (!NapiParseUtils::ParseString(env, schemeNameObj, scheme.name)) {
41910826e83eSopenharmony_ci        return false;
41920826e83eSopenharmony_ci    }
41930826e83eSopenharmony_ci
41940826e83eSopenharmony_ci    if (!CheckSchemeName(scheme.name)) {
41950826e83eSopenharmony_ci        return false;
41960826e83eSopenharmony_ci    }
41970826e83eSopenharmony_ci
41980826e83eSopenharmony_ci    SetCustomizeSchemeOption(scheme);
41990826e83eSopenharmony_ci    return true;
42000826e83eSopenharmony_ci}
42010826e83eSopenharmony_ci
42020826e83eSopenharmony_ciint32_t CustomizeSchemesArrayDataHandler(napi_env env, napi_value array)
42030826e83eSopenharmony_ci{
42040826e83eSopenharmony_ci    uint32_t arrayLength = 0;
42050826e83eSopenharmony_ci    napi_get_array_length(env, array, &arrayLength);
42060826e83eSopenharmony_ci    if (arrayLength > MAX_CUSTOM_SCHEME_SIZE) {
42070826e83eSopenharmony_ci        return PARAM_CHECK_ERROR;
42080826e83eSopenharmony_ci    }
42090826e83eSopenharmony_ci    std::vector<Scheme> schemeVector;
42100826e83eSopenharmony_ci    for (uint32_t i = 0; i < arrayLength; ++i) {
42110826e83eSopenharmony_ci        napi_value obj = nullptr;
42120826e83eSopenharmony_ci        napi_get_element(env, array, i, &obj);
42130826e83eSopenharmony_ci        Scheme scheme;
42140826e83eSopenharmony_ci        bool result = SetCustomizeScheme(env, obj, scheme);
42150826e83eSopenharmony_ci        if (!result) {
42160826e83eSopenharmony_ci            return PARAM_CHECK_ERROR;
42170826e83eSopenharmony_ci        }
42180826e83eSopenharmony_ci        schemeVector.push_back(scheme);
42190826e83eSopenharmony_ci    }
42200826e83eSopenharmony_ci    int32_t registerResult;
42210826e83eSopenharmony_ci    for (auto it = schemeVector.begin(); it != schemeVector.end(); ++it) {
42220826e83eSopenharmony_ci        registerResult = OH_ArkWeb_RegisterCustomSchemes(it->name.c_str(), it->option);
42230826e83eSopenharmony_ci        if (registerResult != NO_ERROR) {
42240826e83eSopenharmony_ci            return registerResult;
42250826e83eSopenharmony_ci        }
42260826e83eSopenharmony_ci    }
42270826e83eSopenharmony_ci    return NO_ERROR;
42280826e83eSopenharmony_ci}
42290826e83eSopenharmony_ci
42300826e83eSopenharmony_cinapi_value NapiWebviewController::CustomizeSchemes(napi_env env, napi_callback_info info)
42310826e83eSopenharmony_ci{
42320826e83eSopenharmony_ci    if (WebviewController::existNweb_) {
42330826e83eSopenharmony_ci        WVLOG_E("There exist web component which has been already created.");
42340826e83eSopenharmony_ci    }
42350826e83eSopenharmony_ci
42360826e83eSopenharmony_ci    napi_value result = nullptr;
42370826e83eSopenharmony_ci    napi_value thisVar = nullptr;
42380826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
42390826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE];
42400826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
42410826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
42420826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
42430826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
42440826e83eSopenharmony_ci        return nullptr;
42450826e83eSopenharmony_ci    }
42460826e83eSopenharmony_ci    napi_value array = argv[INTEGER_ZERO];
42470826e83eSopenharmony_ci    bool isArray = false;
42480826e83eSopenharmony_ci    napi_is_array(env, array, &isArray);
42490826e83eSopenharmony_ci    if (!isArray) {
42500826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
42510826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "schemes", "array"));
42520826e83eSopenharmony_ci        return nullptr;
42530826e83eSopenharmony_ci    }
42540826e83eSopenharmony_ci    int32_t registerResult = CustomizeSchemesArrayDataHandler(env, array);
42550826e83eSopenharmony_ci    if (registerResult == NO_ERROR) {
42560826e83eSopenharmony_ci        NAPI_CALL(env, napi_get_undefined(env, &result));
42570826e83eSopenharmony_ci        return result;
42580826e83eSopenharmony_ci    }
42590826e83eSopenharmony_ci    if (registerResult == PARAM_CHECK_ERROR) {
42600826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
42610826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "schemeName", "string"));
42620826e83eSopenharmony_ci        return nullptr;
42630826e83eSopenharmony_ci    }
42640826e83eSopenharmony_ci    BusinessError::ThrowErrorByErrcode(env, REGISTER_CUSTOM_SCHEME_FAILED);
42650826e83eSopenharmony_ci    return nullptr;
42660826e83eSopenharmony_ci}
42670826e83eSopenharmony_ci
42680826e83eSopenharmony_cinapi_value NapiWebviewController::ScrollTo(napi_env env, napi_callback_info info)
42690826e83eSopenharmony_ci{
42700826e83eSopenharmony_ci    napi_value thisVar = nullptr;
42710826e83eSopenharmony_ci    napi_value result = nullptr;
42720826e83eSopenharmony_ci    size_t argc = INTEGER_THREE;
42730826e83eSopenharmony_ci    napi_value argv[INTEGER_THREE] = { 0 };
42740826e83eSopenharmony_ci    float x;
42750826e83eSopenharmony_ci    float y;
42760826e83eSopenharmony_ci    int32_t duration;
42770826e83eSopenharmony_ci
42780826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
42790826e83eSopenharmony_ci    if (argc != INTEGER_TWO && argc != INTEGER_THREE) {
42800826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
42810826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_TWO, "two", "three"));
42820826e83eSopenharmony_ci        return result;
42830826e83eSopenharmony_ci    }
42840826e83eSopenharmony_ci
42850826e83eSopenharmony_ci    if (!NapiParseUtils::ParseFloat(env, argv[INTEGER_ZERO], x)) {
42860826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
42870826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "x", "number"));
42880826e83eSopenharmony_ci        return result;
42890826e83eSopenharmony_ci    }
42900826e83eSopenharmony_ci
42910826e83eSopenharmony_ci    if (!NapiParseUtils::ParseFloat(env, argv[INTEGER_ONE], y)) {
42920826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
42930826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "y", "number"));
42940826e83eSopenharmony_ci        return result;
42950826e83eSopenharmony_ci    }
42960826e83eSopenharmony_ci
42970826e83eSopenharmony_ci    if (argc == INTEGER_THREE) {
42980826e83eSopenharmony_ci        if (!NapiParseUtils::ParseInt32(env, argv[INTEGER_TWO], duration)) {
42990826e83eSopenharmony_ci            BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
43000826e83eSopenharmony_ci                NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "duration", "number"));
43010826e83eSopenharmony_ci            return result;
43020826e83eSopenharmony_ci        }
43030826e83eSopenharmony_ci    }
43040826e83eSopenharmony_ci
43050826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
43060826e83eSopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, (void **)&webviewController);
43070826e83eSopenharmony_ci    if ((!webviewController) || (status != napi_ok) || !webviewController->IsInit()) {
43080826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
43090826e83eSopenharmony_ci        return nullptr;
43100826e83eSopenharmony_ci    }
43110826e83eSopenharmony_ci    if (argc == INTEGER_THREE) {
43120826e83eSopenharmony_ci        webviewController->ScrollToWithAnime(x, y, duration);
43130826e83eSopenharmony_ci    } else {
43140826e83eSopenharmony_ci        webviewController->ScrollTo(x, y);
43150826e83eSopenharmony_ci    }
43160826e83eSopenharmony_ci    return result;
43170826e83eSopenharmony_ci}
43180826e83eSopenharmony_ci
43190826e83eSopenharmony_cinapi_value NapiWebviewController::ScrollBy(napi_env env, napi_callback_info info)
43200826e83eSopenharmony_ci{
43210826e83eSopenharmony_ci    napi_value thisVar = nullptr;
43220826e83eSopenharmony_ci    napi_value result = nullptr;
43230826e83eSopenharmony_ci    size_t argc = INTEGER_THREE;
43240826e83eSopenharmony_ci    napi_value argv[INTEGER_THREE] = { 0 };
43250826e83eSopenharmony_ci    float deltaX;
43260826e83eSopenharmony_ci    float deltaY;
43270826e83eSopenharmony_ci    int32_t duration = 0;
43280826e83eSopenharmony_ci
43290826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
43300826e83eSopenharmony_ci    if (argc != INTEGER_TWO && argc != INTEGER_THREE) {
43310826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
43320826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_TWO, "two", "three"));
43330826e83eSopenharmony_ci        return result;
43340826e83eSopenharmony_ci    }
43350826e83eSopenharmony_ci
43360826e83eSopenharmony_ci    if (!NapiParseUtils::ParseFloat(env, argv[INTEGER_ZERO], deltaX)) {
43370826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
43380826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "deltaX", "number"));
43390826e83eSopenharmony_ci        return result;
43400826e83eSopenharmony_ci    }
43410826e83eSopenharmony_ci
43420826e83eSopenharmony_ci    if (!NapiParseUtils::ParseFloat(env, argv[INTEGER_ONE], deltaY)) {
43430826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
43440826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "deltaY", "number"));
43450826e83eSopenharmony_ci        return result;
43460826e83eSopenharmony_ci    }
43470826e83eSopenharmony_ci
43480826e83eSopenharmony_ci    if (argc == INTEGER_THREE) {
43490826e83eSopenharmony_ci        if (!NapiParseUtils::ParseInt32(env, argv[INTEGER_TWO], duration)) {
43500826e83eSopenharmony_ci            BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
43510826e83eSopenharmony_ci                NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "duration", "number"));
43520826e83eSopenharmony_ci            return result;
43530826e83eSopenharmony_ci        }
43540826e83eSopenharmony_ci    }
43550826e83eSopenharmony_ci
43560826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
43570826e83eSopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, (void **)&webviewController);
43580826e83eSopenharmony_ci    if ((!webviewController) || (status != napi_ok) || !webviewController->IsInit()) {
43590826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
43600826e83eSopenharmony_ci        return nullptr;
43610826e83eSopenharmony_ci    }
43620826e83eSopenharmony_ci    if (argc == INTEGER_THREE) {
43630826e83eSopenharmony_ci        webviewController->ScrollByWithAnime(deltaX, deltaY, duration);
43640826e83eSopenharmony_ci    } else {
43650826e83eSopenharmony_ci        webviewController->ScrollBy(deltaX, deltaY);
43660826e83eSopenharmony_ci    }
43670826e83eSopenharmony_ci    return result;
43680826e83eSopenharmony_ci}
43690826e83eSopenharmony_ci
43700826e83eSopenharmony_cinapi_value NapiWebviewController::SlideScroll(napi_env env, napi_callback_info info)
43710826e83eSopenharmony_ci{
43720826e83eSopenharmony_ci    napi_value thisVar = nullptr;
43730826e83eSopenharmony_ci    napi_value result = nullptr;
43740826e83eSopenharmony_ci    size_t argc = INTEGER_TWO;
43750826e83eSopenharmony_ci    napi_value argv[INTEGER_TWO] = { 0 };
43760826e83eSopenharmony_ci    float vx;
43770826e83eSopenharmony_ci    float vy;
43780826e83eSopenharmony_ci
43790826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
43800826e83eSopenharmony_ci    if (argc != INTEGER_TWO) {
43810826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
43820826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "two"));
43830826e83eSopenharmony_ci        return result;
43840826e83eSopenharmony_ci    }
43850826e83eSopenharmony_ci
43860826e83eSopenharmony_ci    if (!NapiParseUtils::ParseFloat(env, argv[INTEGER_ZERO], vx)) {
43870826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
43880826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "vx", "number"));
43890826e83eSopenharmony_ci        return result;
43900826e83eSopenharmony_ci    }
43910826e83eSopenharmony_ci
43920826e83eSopenharmony_ci    if (!NapiParseUtils::ParseFloat(env, argv[INTEGER_ONE], vy)) {
43930826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
43940826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "vy", "number"));
43950826e83eSopenharmony_ci        return result;
43960826e83eSopenharmony_ci    }
43970826e83eSopenharmony_ci
43980826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
43990826e83eSopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, (void **)&webviewController);
44000826e83eSopenharmony_ci    if ((!webviewController) || (status != napi_ok) || !webviewController->IsInit()) {
44010826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
44020826e83eSopenharmony_ci        return nullptr;
44030826e83eSopenharmony_ci    }
44040826e83eSopenharmony_ci    webviewController->SlideScroll(vx, vy);
44050826e83eSopenharmony_ci    return result;
44060826e83eSopenharmony_ci}
44070826e83eSopenharmony_ci
44080826e83eSopenharmony_cinapi_value NapiWebviewController::SetScrollable(napi_env env, napi_callback_info info)
44090826e83eSopenharmony_ci{
44100826e83eSopenharmony_ci    napi_value thisVar = nullptr;
44110826e83eSopenharmony_ci    napi_value result = nullptr;
44120826e83eSopenharmony_ci    size_t argc = INTEGER_TWO;
44130826e83eSopenharmony_ci    size_t argcForOld = INTEGER_ONE;
44140826e83eSopenharmony_ci    napi_value argv[INTEGER_TWO] = { 0 };
44150826e83eSopenharmony_ci
44160826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
44170826e83eSopenharmony_ci    if (argc != INTEGER_TWO && argc != argcForOld) {
44180826e83eSopenharmony_ci        NWebError::BusinessError::ThrowErrorByErrcode(env, NWebError::PARAM_CHECK_ERROR,
44190826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_TWO, "one", "two"));
44200826e83eSopenharmony_ci        return result;
44210826e83eSopenharmony_ci    }
44220826e83eSopenharmony_ci    bool isEnableScroll;
44230826e83eSopenharmony_ci    if (!NapiParseUtils::ParseBoolean(env, argv[0], isEnableScroll)) {
44240826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
44250826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "enable", "boolean"));
44260826e83eSopenharmony_ci        return result;
44270826e83eSopenharmony_ci    }
44280826e83eSopenharmony_ci
44290826e83eSopenharmony_ci    int32_t scrollType = -1;
44300826e83eSopenharmony_ci    if (argc == INTEGER_TWO) {
44310826e83eSopenharmony_ci        if (!NapiParseUtils::ParseInt32(env, argv[INTEGER_ONE], scrollType) || scrollType < 0 ||
44320826e83eSopenharmony_ci            scrollType >= INTEGER_ONE) {
44330826e83eSopenharmony_ci            WVLOG_E("BusinessError: 401. The character of 'scrollType' must be int32.");
44340826e83eSopenharmony_ci            BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
44350826e83eSopenharmony_ci            return result;
44360826e83eSopenharmony_ci        }
44370826e83eSopenharmony_ci    }
44380826e83eSopenharmony_ci
44390826e83eSopenharmony_ci    WebviewController* webviewController = nullptr;
44400826e83eSopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, (void**)&webviewController);
44410826e83eSopenharmony_ci    if ((!webviewController) || (status != napi_ok) || !webviewController->IsInit()) {
44420826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
44430826e83eSopenharmony_ci        return nullptr;
44440826e83eSopenharmony_ci    }
44450826e83eSopenharmony_ci    webviewController->SetScrollable(isEnableScroll, scrollType);
44460826e83eSopenharmony_ci    return result;
44470826e83eSopenharmony_ci}
44480826e83eSopenharmony_ci
44490826e83eSopenharmony_cinapi_value NapiWebviewController::GetScrollable(napi_env env, napi_callback_info info)
44500826e83eSopenharmony_ci{
44510826e83eSopenharmony_ci    napi_value result = nullptr;
44520826e83eSopenharmony_ci    WebviewController *webviewController = GetWebviewController(env, info);
44530826e83eSopenharmony_ci    if (!webviewController) {
44540826e83eSopenharmony_ci        return nullptr;
44550826e83eSopenharmony_ci    }
44560826e83eSopenharmony_ci
44570826e83eSopenharmony_ci    bool isScrollable = webviewController->GetScrollable();
44580826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_boolean(env, isScrollable, &result));
44590826e83eSopenharmony_ci    return result;
44600826e83eSopenharmony_ci}
44610826e83eSopenharmony_ci
44620826e83eSopenharmony_cinapi_value NapiWebviewController::InnerGetCertificate(napi_env env, napi_callback_info info)
44630826e83eSopenharmony_ci{
44640826e83eSopenharmony_ci    napi_value thisVar = nullptr;
44650826e83eSopenharmony_ci    napi_value result = nullptr;
44660826e83eSopenharmony_ci    napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr);
44670826e83eSopenharmony_ci    napi_create_array(env, &result);
44680826e83eSopenharmony_ci
44690826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
44700826e83eSopenharmony_ci    napi_unwrap(env, thisVar, (void **)&webviewController);
44710826e83eSopenharmony_ci    if (!webviewController || !webviewController->IsInit()) {
44720826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
44730826e83eSopenharmony_ci        return result;
44740826e83eSopenharmony_ci    }
44750826e83eSopenharmony_ci
44760826e83eSopenharmony_ci    std::vector<std::string> certChainDerData;
44770826e83eSopenharmony_ci    bool ans = webviewController->GetCertChainDerData(certChainDerData);
44780826e83eSopenharmony_ci    if (!ans) {
44790826e83eSopenharmony_ci        WVLOG_E("get cert chain data failed");
44800826e83eSopenharmony_ci        return result;
44810826e83eSopenharmony_ci    }
44820826e83eSopenharmony_ci
44830826e83eSopenharmony_ci    for (uint8_t i = 0; i < certChainDerData.size(); i++) {
44840826e83eSopenharmony_ci        if (i == UINT8_MAX) {
44850826e83eSopenharmony_ci            WVLOG_E("error, cert chain data array reach max");
44860826e83eSopenharmony_ci            break;
44870826e83eSopenharmony_ci        }
44880826e83eSopenharmony_ci        void *data = nullptr;
44890826e83eSopenharmony_ci        napi_value buffer = nullptr;
44900826e83eSopenharmony_ci        napi_value item = nullptr;
44910826e83eSopenharmony_ci        NAPI_CALL(env, napi_create_arraybuffer(env, certChainDerData[i].size(), &data, &buffer));
44920826e83eSopenharmony_ci        int retCode = memcpy_s(data, certChainDerData[i].size(),
44930826e83eSopenharmony_ci                               certChainDerData[i].data(), certChainDerData[i].size());
44940826e83eSopenharmony_ci        if (retCode != 0) {
44950826e83eSopenharmony_ci            WVLOG_E("memcpy_s cert data failed, index = %{public}u,", i);
44960826e83eSopenharmony_ci            continue;
44970826e83eSopenharmony_ci        }
44980826e83eSopenharmony_ci        NAPI_CALL(env, napi_create_typedarray(env, napi_uint8_array, certChainDerData[i].size(), buffer, 0, &item));
44990826e83eSopenharmony_ci        NAPI_CALL(env, napi_set_element(env, result, i, item));
45000826e83eSopenharmony_ci    }
45010826e83eSopenharmony_ci    return result;
45020826e83eSopenharmony_ci}
45030826e83eSopenharmony_ci
45040826e83eSopenharmony_cinapi_value NapiWebviewController::SetAudioMuted(napi_env env, napi_callback_info info)
45050826e83eSopenharmony_ci{
45060826e83eSopenharmony_ci    WVLOG_D("SetAudioMuted invoked");
45070826e83eSopenharmony_ci
45080826e83eSopenharmony_ci    napi_value result = nullptr;
45090826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
45100826e83eSopenharmony_ci
45110826e83eSopenharmony_ci    napi_value thisVar = nullptr;
45120826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
45130826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
45140826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
45150826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
45160826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
45170826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
45180826e83eSopenharmony_ci        return result;
45190826e83eSopenharmony_ci    }
45200826e83eSopenharmony_ci
45210826e83eSopenharmony_ci    bool muted = false;
45220826e83eSopenharmony_ci    if (!NapiParseUtils::ParseBoolean(env, argv[0], muted)) {
45230826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
45240826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "mute", "boolean"));
45250826e83eSopenharmony_ci        return result;
45260826e83eSopenharmony_ci    }
45270826e83eSopenharmony_ci
45280826e83eSopenharmony_ci    WebviewController* webviewController = nullptr;
45290826e83eSopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, (void**)&webviewController);
45300826e83eSopenharmony_ci    if ((!webviewController) || (status != napi_ok) || !webviewController->IsInit()) {
45310826e83eSopenharmony_ci        WVLOG_E("SetAudioMuted failed due to no associated Web component");
45320826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
45330826e83eSopenharmony_ci        return result;
45340826e83eSopenharmony_ci    }
45350826e83eSopenharmony_ci
45360826e83eSopenharmony_ci    ErrCode ret = webviewController->SetAudioMuted(muted);
45370826e83eSopenharmony_ci    if (ret != NO_ERROR) {
45380826e83eSopenharmony_ci        WVLOG_E("SetAudioMuted failed, error code: %{public}d", ret);
45390826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, ret);
45400826e83eSopenharmony_ci        return result;
45410826e83eSopenharmony_ci    }
45420826e83eSopenharmony_ci
45430826e83eSopenharmony_ci    WVLOG_I("SetAudioMuted: %{public}s", (muted ? "true" : "false"));
45440826e83eSopenharmony_ci    return result;
45450826e83eSopenharmony_ci}
45460826e83eSopenharmony_ci
45470826e83eSopenharmony_cinapi_value NapiWebviewController::PrefetchPage(napi_env env, napi_callback_info info)
45480826e83eSopenharmony_ci{
45490826e83eSopenharmony_ci    napi_value thisVar = nullptr;
45500826e83eSopenharmony_ci    napi_value result = nullptr;
45510826e83eSopenharmony_ci    size_t argc = INTEGER_TWO;
45520826e83eSopenharmony_ci    napi_value argv[INTEGER_TWO];
45530826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
45540826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
45550826e83eSopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, (void **)&webviewController);
45560826e83eSopenharmony_ci    if ((argc != INTEGER_ONE) && (argc != INTEGER_TWO)) {
45570826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
45580826e83eSopenharmony_ci        return nullptr;
45590826e83eSopenharmony_ci    }
45600826e83eSopenharmony_ci    if ((!webviewController) || (status != napi_ok) || !webviewController->IsInit()) {
45610826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
45620826e83eSopenharmony_ci        return nullptr;
45630826e83eSopenharmony_ci    }
45640826e83eSopenharmony_ci    std::string url;
45650826e83eSopenharmony_ci    if (!ParsePrepareUrl(env, argv[INTEGER_ZERO], url)) {
45660826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INVALID_URL);
45670826e83eSopenharmony_ci        return nullptr;
45680826e83eSopenharmony_ci    }
45690826e83eSopenharmony_ci    std::map<std::string, std::string> additionalHttpHeaders;
45700826e83eSopenharmony_ci    if (argc == INTEGER_ONE) {
45710826e83eSopenharmony_ci        ErrCode ret = webviewController->PrefetchPage(url, additionalHttpHeaders);
45720826e83eSopenharmony_ci        if (ret != NO_ERROR) {
45730826e83eSopenharmony_ci            WVLOG_E("PrefetchPage failed, error code: %{public}d", ret);
45740826e83eSopenharmony_ci            BusinessError::ThrowErrorByErrcode(env, ret);
45750826e83eSopenharmony_ci            return nullptr;
45760826e83eSopenharmony_ci        }
45770826e83eSopenharmony_ci        NAPI_CALL(env, napi_get_undefined(env, &result));
45780826e83eSopenharmony_ci        return result;
45790826e83eSopenharmony_ci    }
45800826e83eSopenharmony_ci    return PrefetchPageWithHttpHeaders(env, info, url, argv, webviewController);
45810826e83eSopenharmony_ci}
45820826e83eSopenharmony_ci
45830826e83eSopenharmony_cinapi_value NapiWebviewController::PrefetchPageWithHttpHeaders(napi_env env, napi_callback_info info, std::string& url,
45840826e83eSopenharmony_ci    const napi_value* argv, WebviewController* webviewController)
45850826e83eSopenharmony_ci{
45860826e83eSopenharmony_ci    napi_value result = nullptr;
45870826e83eSopenharmony_ci    std::map<std::string, std::string> additionalHttpHeaders;
45880826e83eSopenharmony_ci    napi_value array = argv[INTEGER_ONE];
45890826e83eSopenharmony_ci    bool isArray = false;
45900826e83eSopenharmony_ci    napi_is_array(env, array, &isArray);
45910826e83eSopenharmony_ci    if (isArray) {
45920826e83eSopenharmony_ci        uint32_t arrayLength = INTEGER_ZERO;
45930826e83eSopenharmony_ci        napi_get_array_length(env, array, &arrayLength);
45940826e83eSopenharmony_ci        for (uint32_t i = 0; i < arrayLength; ++i) {
45950826e83eSopenharmony_ci            std::string key;
45960826e83eSopenharmony_ci            std::string value;
45970826e83eSopenharmony_ci            napi_value obj = nullptr;
45980826e83eSopenharmony_ci            napi_value keyObj = nullptr;
45990826e83eSopenharmony_ci            napi_value valueObj = nullptr;
46000826e83eSopenharmony_ci            napi_get_element(env, array, i, &obj);
46010826e83eSopenharmony_ci            if (napi_get_named_property(env, obj, "headerKey", &keyObj) != napi_ok) {
46020826e83eSopenharmony_ci                continue;
46030826e83eSopenharmony_ci            }
46040826e83eSopenharmony_ci            if (napi_get_named_property(env, obj, "headerValue", &valueObj) != napi_ok) {
46050826e83eSopenharmony_ci                continue;
46060826e83eSopenharmony_ci            }
46070826e83eSopenharmony_ci            NapiParseUtils::ParseString(env, keyObj, key);
46080826e83eSopenharmony_ci            NapiParseUtils::ParseString(env, valueObj, value);
46090826e83eSopenharmony_ci            additionalHttpHeaders[key] = value;
46100826e83eSopenharmony_ci        }
46110826e83eSopenharmony_ci    } else {
46120826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
46130826e83eSopenharmony_ci        return nullptr;
46140826e83eSopenharmony_ci    }
46150826e83eSopenharmony_ci
46160826e83eSopenharmony_ci    ErrCode ret = webviewController->PrefetchPage(url, additionalHttpHeaders);
46170826e83eSopenharmony_ci    if (ret != NO_ERROR) {
46180826e83eSopenharmony_ci        WVLOG_E("PrefetchPage failed, error code: %{public}d", ret);
46190826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, ret);
46200826e83eSopenharmony_ci        return nullptr;
46210826e83eSopenharmony_ci    }
46220826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
46230826e83eSopenharmony_ci    return result;
46240826e83eSopenharmony_ci}
46250826e83eSopenharmony_ci
46260826e83eSopenharmony_cinapi_value NapiWebviewController::GetLastJavascriptProxyCallingFrameUrl(napi_env env, napi_callback_info info)
46270826e83eSopenharmony_ci{
46280826e83eSopenharmony_ci    napi_value result = nullptr;
46290826e83eSopenharmony_ci    WebviewController *webviewController = GetWebviewController(env, info);
46300826e83eSopenharmony_ci    if (!webviewController) {
46310826e83eSopenharmony_ci        return nullptr;
46320826e83eSopenharmony_ci    }
46330826e83eSopenharmony_ci
46340826e83eSopenharmony_ci    std::string lastCallingFrameUrl = webviewController->GetLastJavascriptProxyCallingFrameUrl();
46350826e83eSopenharmony_ci    napi_create_string_utf8(env, lastCallingFrameUrl.c_str(), lastCallingFrameUrl.length(), &result);
46360826e83eSopenharmony_ci    return result;
46370826e83eSopenharmony_ci}
46380826e83eSopenharmony_ci
46390826e83eSopenharmony_cinapi_value NapiWebviewController::PrepareForPageLoad(napi_env env, napi_callback_info info)
46400826e83eSopenharmony_ci{
46410826e83eSopenharmony_ci    napi_value thisVar = nullptr;
46420826e83eSopenharmony_ci    napi_value result = nullptr;
46430826e83eSopenharmony_ci    size_t argc = INTEGER_THREE;
46440826e83eSopenharmony_ci    napi_value argv[INTEGER_THREE] = { 0 };
46450826e83eSopenharmony_ci    napi_get_undefined(env, &result);
46460826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
46470826e83eSopenharmony_ci    if (argc != INTEGER_THREE) {
46480826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
46490826e83eSopenharmony_ci        return nullptr;
46500826e83eSopenharmony_ci    }
46510826e83eSopenharmony_ci
46520826e83eSopenharmony_ci    std::string url;
46530826e83eSopenharmony_ci    if (!ParsePrepareUrl(env, argv[INTEGER_ZERO], url)) {
46540826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INVALID_URL);
46550826e83eSopenharmony_ci        return nullptr;
46560826e83eSopenharmony_ci    }
46570826e83eSopenharmony_ci
46580826e83eSopenharmony_ci    bool preconnectable = false;
46590826e83eSopenharmony_ci    if (!NapiParseUtils::ParseBoolean(env, argv[INTEGER_ONE], preconnectable)) {
46600826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
46610826e83eSopenharmony_ci        return nullptr;
46620826e83eSopenharmony_ci    }
46630826e83eSopenharmony_ci
46640826e83eSopenharmony_ci    int32_t numSockets = 0;
46650826e83eSopenharmony_ci    if (!NapiParseUtils::ParseInt32(env, argv[INTEGER_TWO], numSockets)) {
46660826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
46670826e83eSopenharmony_ci        return nullptr;
46680826e83eSopenharmony_ci    }
46690826e83eSopenharmony_ci    if (numSockets <= 0 || static_cast<uint32_t>(numSockets) > SOCKET_MAXIMUM) {
46700826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INVALID_SOCKET_NUMBER);
46710826e83eSopenharmony_ci        return nullptr;
46720826e83eSopenharmony_ci    }
46730826e83eSopenharmony_ci
46740826e83eSopenharmony_ci    NWebHelper::Instance().PrepareForPageLoad(url, preconnectable, numSockets);
46750826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
46760826e83eSopenharmony_ci    return result;
46770826e83eSopenharmony_ci}
46780826e83eSopenharmony_ci
46790826e83eSopenharmony_cinapi_value NapiWebviewController::PrefetchResource(napi_env env, napi_callback_info info)
46800826e83eSopenharmony_ci{
46810826e83eSopenharmony_ci    napi_value thisVar = nullptr;
46820826e83eSopenharmony_ci    napi_value result = nullptr;
46830826e83eSopenharmony_ci    size_t argc = INTEGER_FOUR;
46840826e83eSopenharmony_ci    napi_value argv[INTEGER_FOUR] = { 0 };
46850826e83eSopenharmony_ci    napi_get_undefined(env, &result);
46860826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
46870826e83eSopenharmony_ci    if (argc > INTEGER_FOUR || argc < INTEGER_ONE) {
46880826e83eSopenharmony_ci        WVLOG_E("BusinessError: 401. Arg count must between 1 and 4.");
46890826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
46900826e83eSopenharmony_ci        return nullptr;
46910826e83eSopenharmony_ci    }
46920826e83eSopenharmony_ci
46930826e83eSopenharmony_ci    std::shared_ptr<NWebEnginePrefetchArgs> prefetchArgs = ParsePrefetchArgs(env, argv[INTEGER_ZERO]);
46940826e83eSopenharmony_ci    if (prefetchArgs == nullptr) {
46950826e83eSopenharmony_ci        return nullptr;
46960826e83eSopenharmony_ci    }
46970826e83eSopenharmony_ci
46980826e83eSopenharmony_ci    std::map<std::string, std::string> additionalHttpHeaders;
46990826e83eSopenharmony_ci    if (argc >= INTEGER_TWO && !ParseHttpHeaders(env, argv[INTEGER_ONE], &additionalHttpHeaders)) {
47000826e83eSopenharmony_ci        WVLOG_E("BusinessError: 401. The type of 'additionalHttpHeaders' must be Array of 'WebHeader'.");
47010826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
47020826e83eSopenharmony_ci        return nullptr;
47030826e83eSopenharmony_ci    }
47040826e83eSopenharmony_ci
47050826e83eSopenharmony_ci    std::string cacheKey;
47060826e83eSopenharmony_ci    if ((argc >= INTEGER_THREE) && !NapiParseUtils::ParseString(env, argv[INTEGER_TWO], cacheKey)) {
47070826e83eSopenharmony_ci        WVLOG_E("BusinessError: 401.The type of 'cacheKey' must be string.");
47080826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
47090826e83eSopenharmony_ci        return nullptr;
47100826e83eSopenharmony_ci    }
47110826e83eSopenharmony_ci
47120826e83eSopenharmony_ci    if (cacheKey.empty()) {
47130826e83eSopenharmony_ci        cacheKey = prefetchArgs->GetUrl();
47140826e83eSopenharmony_ci    } else {
47150826e83eSopenharmony_ci        if (!CheckCacheKey(env, cacheKey)) {
47160826e83eSopenharmony_ci            return nullptr;
47170826e83eSopenharmony_ci        }
47180826e83eSopenharmony_ci    }
47190826e83eSopenharmony_ci
47200826e83eSopenharmony_ci    int32_t cacheValidTime = 0;
47210826e83eSopenharmony_ci    if (argc >= INTEGER_FOUR) {
47220826e83eSopenharmony_ci        if (!NapiParseUtils::ParseInt32(env, argv[INTEGER_THREE], cacheValidTime) || cacheValidTime <= 0 ||
47230826e83eSopenharmony_ci            cacheValidTime > INT_MAX) {
47240826e83eSopenharmony_ci            WVLOG_E("BusinessError: 401. The character of 'cacheValidTime' must be int32.");
47250826e83eSopenharmony_ci            BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
47260826e83eSopenharmony_ci            return nullptr;
47270826e83eSopenharmony_ci        }
47280826e83eSopenharmony_ci    }
47290826e83eSopenharmony_ci
47300826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
47310826e83eSopenharmony_ci    NWebHelper::Instance().PrefetchResource(prefetchArgs, additionalHttpHeaders, cacheKey, cacheValidTime);
47320826e83eSopenharmony_ci    return result;
47330826e83eSopenharmony_ci}
47340826e83eSopenharmony_ci
47350826e83eSopenharmony_cinapi_value NapiWebviewController::ClearPrefetchedResource(napi_env env, napi_callback_info info)
47360826e83eSopenharmony_ci{
47370826e83eSopenharmony_ci    napi_value thisVar = nullptr;
47380826e83eSopenharmony_ci    napi_value result = nullptr;
47390826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
47400826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
47410826e83eSopenharmony_ci    napi_get_undefined(env, &result);
47420826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
47430826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
47440826e83eSopenharmony_ci        WVLOG_E("BusinessError: 401. Arg count must be 1.");
47450826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
47460826e83eSopenharmony_ci        return nullptr;
47470826e83eSopenharmony_ci    }
47480826e83eSopenharmony_ci
47490826e83eSopenharmony_ci    std::vector<std::string> cacheKeyList;
47500826e83eSopenharmony_ci    if (!ParseCacheKeyList(env, argv[INTEGER_ZERO], &cacheKeyList)) {
47510826e83eSopenharmony_ci        WVLOG_E("BusinessError: 401. The type of 'cacheKeyList' must be Array of string.");
47520826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
47530826e83eSopenharmony_ci        return nullptr;
47540826e83eSopenharmony_ci    }
47550826e83eSopenharmony_ci
47560826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
47570826e83eSopenharmony_ci    NWebHelper::Instance().ClearPrefetchedResource(cacheKeyList);
47580826e83eSopenharmony_ci    return result;
47590826e83eSopenharmony_ci}
47600826e83eSopenharmony_ci
47610826e83eSopenharmony_cinapi_value NapiWebviewController::SetDownloadDelegate(napi_env env, napi_callback_info info)
47620826e83eSopenharmony_ci{
47630826e83eSopenharmony_ci    WVLOG_D("WebDownloader::JS_SetDownloadDelegate");
47640826e83eSopenharmony_ci    NWebHelper::Instance().LoadNWebSDK();
47650826e83eSopenharmony_ci    size_t argc = 1;
47660826e83eSopenharmony_ci    napi_value argv[1] = {0};
47670826e83eSopenharmony_ci    napi_value thisVar = nullptr;
47680826e83eSopenharmony_ci    void* data = nullptr;
47690826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
47700826e83eSopenharmony_ci
47710826e83eSopenharmony_ci    WebDownloadDelegate* delegate = nullptr;
47720826e83eSopenharmony_ci    napi_value obj = argv[0];
47730826e83eSopenharmony_ci    napi_unwrap(env, obj, (void**)&delegate);
47740826e83eSopenharmony_ci    if (!delegate) {
47750826e83eSopenharmony_ci        WVLOG_E("[DOWNLOAD] WebDownloader::JS_SetDownloadDelegate delegate is null");
47760826e83eSopenharmony_ci        (void)RemoveDownloadDelegateRef(env, thisVar);
47770826e83eSopenharmony_ci        return nullptr;
47780826e83eSopenharmony_ci    }
47790826e83eSopenharmony_ci    napi_create_reference(env, obj, 1, &delegate->delegate_);
47800826e83eSopenharmony_ci
47810826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
47820826e83eSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, (void **)&webviewController));
47830826e83eSopenharmony_ci    if (webviewController == nullptr || !webviewController->IsInit()) {
47840826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
47850826e83eSopenharmony_ci        WVLOG_E("create message port failed, napi unwrap webviewController failed");
47860826e83eSopenharmony_ci        return nullptr;
47870826e83eSopenharmony_ci    }
47880826e83eSopenharmony_ci    int32_t nwebId = webviewController->GetWebId();
47890826e83eSopenharmony_ci    WebDownloadManager::AddDownloadDelegateForWeb(nwebId, delegate);
47900826e83eSopenharmony_ci    return nullptr;
47910826e83eSopenharmony_ci}
47920826e83eSopenharmony_ci
47930826e83eSopenharmony_cinapi_value NapiWebviewController::StartDownload(napi_env env, napi_callback_info info)
47940826e83eSopenharmony_ci{
47950826e83eSopenharmony_ci    WVLOG_D("[DOWNLOAD] NapiWebviewController::StartDownload");
47960826e83eSopenharmony_ci    size_t argc = 1;
47970826e83eSopenharmony_ci    napi_value argv[1] = {0};
47980826e83eSopenharmony_ci    napi_value thisVar = nullptr;
47990826e83eSopenharmony_ci    void* data = nullptr;
48000826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
48010826e83eSopenharmony_ci
48020826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
48030826e83eSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, (void **)&webviewController));
48040826e83eSopenharmony_ci    if (webviewController == nullptr || !webviewController->IsInit()) {
48050826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
48060826e83eSopenharmony_ci        WVLOG_E("create message port failed, napi unwrap webviewController failed");
48070826e83eSopenharmony_ci        return nullptr;
48080826e83eSopenharmony_ci    }
48090826e83eSopenharmony_ci
48100826e83eSopenharmony_ci    std::string url;
48110826e83eSopenharmony_ci    if (!ParsePrepareUrl(env, argv[INTEGER_ZERO], url)) {
48120826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INVALID_URL);
48130826e83eSopenharmony_ci        return nullptr;
48140826e83eSopenharmony_ci    }
48150826e83eSopenharmony_ci    int32_t nwebId = webviewController->GetWebId();
48160826e83eSopenharmony_ci    NWebHelper::Instance().LoadNWebSDK();
48170826e83eSopenharmony_ci    WebDownloader_StartDownload(nwebId, url.c_str());
48180826e83eSopenharmony_ci    return nullptr;
48190826e83eSopenharmony_ci}
48200826e83eSopenharmony_ci
48210826e83eSopenharmony_cinapi_value NapiWebviewController::CloseAllMediaPresentations(napi_env env, napi_callback_info info)
48220826e83eSopenharmony_ci{
48230826e83eSopenharmony_ci    napi_value result = nullptr;
48240826e83eSopenharmony_ci    WebviewController* webviewController = GetWebviewController(env, info);
48250826e83eSopenharmony_ci    if (!webviewController) {
48260826e83eSopenharmony_ci        return result;
48270826e83eSopenharmony_ci    }
48280826e83eSopenharmony_ci
48290826e83eSopenharmony_ci    webviewController->CloseAllMediaPresentations();
48300826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
48310826e83eSopenharmony_ci    return result;
48320826e83eSopenharmony_ci}
48330826e83eSopenharmony_ci
48340826e83eSopenharmony_cinapi_value NapiWebviewController::StopAllMedia(napi_env env, napi_callback_info info)
48350826e83eSopenharmony_ci{
48360826e83eSopenharmony_ci    napi_value result = nullptr;
48370826e83eSopenharmony_ci    WebviewController* webviewController = GetWebviewController(env, info);
48380826e83eSopenharmony_ci    if (!webviewController) {
48390826e83eSopenharmony_ci        return result;
48400826e83eSopenharmony_ci    }
48410826e83eSopenharmony_ci
48420826e83eSopenharmony_ci    webviewController->StopAllMedia();
48430826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
48440826e83eSopenharmony_ci    return result;
48450826e83eSopenharmony_ci}
48460826e83eSopenharmony_ci
48470826e83eSopenharmony_cinapi_value NapiWebviewController::ResumeAllMedia(napi_env env, napi_callback_info info)
48480826e83eSopenharmony_ci{
48490826e83eSopenharmony_ci    napi_value result = nullptr;
48500826e83eSopenharmony_ci    WebviewController* webviewController = GetWebviewController(env, info);
48510826e83eSopenharmony_ci    if (!webviewController) {
48520826e83eSopenharmony_ci        return result;
48530826e83eSopenharmony_ci    }
48540826e83eSopenharmony_ci
48550826e83eSopenharmony_ci    webviewController->ResumeAllMedia();
48560826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
48570826e83eSopenharmony_ci    return result;
48580826e83eSopenharmony_ci}
48590826e83eSopenharmony_ci
48600826e83eSopenharmony_cinapi_value NapiWebviewController::PauseAllMedia(napi_env env, napi_callback_info info)
48610826e83eSopenharmony_ci{
48620826e83eSopenharmony_ci    napi_value result = nullptr;
48630826e83eSopenharmony_ci    WebviewController* webviewController = GetWebviewController(env, info);
48640826e83eSopenharmony_ci    if (!webviewController) {
48650826e83eSopenharmony_ci        return result;
48660826e83eSopenharmony_ci    }
48670826e83eSopenharmony_ci
48680826e83eSopenharmony_ci    webviewController->PauseAllMedia();
48690826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
48700826e83eSopenharmony_ci    return result;
48710826e83eSopenharmony_ci}
48720826e83eSopenharmony_ci
48730826e83eSopenharmony_cinapi_value NapiWebviewController::GetMediaPlaybackState(napi_env env, napi_callback_info info)
48740826e83eSopenharmony_ci{
48750826e83eSopenharmony_ci    napi_value result = nullptr;
48760826e83eSopenharmony_ci    WebviewController* webviewController = GetWebviewController(env, info);
48770826e83eSopenharmony_ci    if (!webviewController) {
48780826e83eSopenharmony_ci        return result;
48790826e83eSopenharmony_ci    }
48800826e83eSopenharmony_ci
48810826e83eSopenharmony_ci    int32_t mediaPlaybackState = webviewController->GetMediaPlaybackState();
48820826e83eSopenharmony_ci    napi_create_int32(env, mediaPlaybackState, &result);
48830826e83eSopenharmony_ci    return result;
48840826e83eSopenharmony_ci}
48850826e83eSopenharmony_ci
48860826e83eSopenharmony_cinapi_value NapiWebviewController::SetConnectionTimeout(napi_env env, napi_callback_info info)
48870826e83eSopenharmony_ci{
48880826e83eSopenharmony_ci    napi_value result = nullptr;
48890826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
48900826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { nullptr };
48910826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
48920826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
48930826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
48940826e83eSopenharmony_ci                NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
48950826e83eSopenharmony_ci        return result;
48960826e83eSopenharmony_ci    }
48970826e83eSopenharmony_ci
48980826e83eSopenharmony_ci    int32_t timeout = 0;
48990826e83eSopenharmony_ci    if (!NapiParseUtils::ParseInt32(env, argv[INTEGER_ZERO], timeout) || (timeout <= 0)) {
49000826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
49010826e83eSopenharmony_ci                "BusinessError: 401. Parameter error. The type of 'timeout' must be int and must be positive integer.");
49020826e83eSopenharmony_ci        return result;
49030826e83eSopenharmony_ci    }
49040826e83eSopenharmony_ci
49050826e83eSopenharmony_ci    NWebHelper::Instance().SetConnectionTimeout(timeout);
49060826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
49070826e83eSopenharmony_ci    return result;
49080826e83eSopenharmony_ci}
49090826e83eSopenharmony_ci
49100826e83eSopenharmony_cinapi_value NapiWebviewController::CreateWebPrintDocumentAdapter(napi_env env, napi_callback_info info)
49110826e83eSopenharmony_ci{
49120826e83eSopenharmony_ci    WVLOG_I("Create web print document adapter.");
49130826e83eSopenharmony_ci    napi_value thisVar = nullptr;
49140826e83eSopenharmony_ci    napi_value result = nullptr;
49150826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
49160826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE];
49170826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
49180826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
49190826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
49200826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
49210826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
49220826e83eSopenharmony_ci        return result;
49230826e83eSopenharmony_ci    }
49240826e83eSopenharmony_ci    std::string jobName;
49250826e83eSopenharmony_ci    if (!NapiParseUtils::ParseString(env, argv[INTEGER_ZERO], jobName)) {
49260826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
49270826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "jopName", "string"));
49280826e83eSopenharmony_ci        return result;
49290826e83eSopenharmony_ci    }
49300826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
49310826e83eSopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, (void **)&webviewController);
49320826e83eSopenharmony_ci    if ((!webviewController) || (status != napi_ok) || !webviewController->IsInit()) {
49330826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
49340826e83eSopenharmony_ci        return result;
49350826e83eSopenharmony_ci    }
49360826e83eSopenharmony_ci    void* webPrintDocument = webviewController->CreateWebPrintDocumentAdapter(jobName);
49370826e83eSopenharmony_ci    if (!webPrintDocument) {
49380826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
49390826e83eSopenharmony_ci        return result;
49400826e83eSopenharmony_ci    }
49410826e83eSopenharmony_ci    napi_handle_scope scope = nullptr;
49420826e83eSopenharmony_ci    napi_open_handle_scope(env, &scope);
49430826e83eSopenharmony_ci    if (scope == nullptr) {
49440826e83eSopenharmony_ci        return result;
49450826e83eSopenharmony_ci    }
49460826e83eSopenharmony_ci    napi_value webPrintDoc = nullptr;
49470826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_reference_value(env, g_webPrintDocClassRef, &webPrintDoc));
49480826e83eSopenharmony_ci    napi_value consParam[INTEGER_ONE] = {0};
49490826e83eSopenharmony_ci    NAPI_CALL(env, napi_create_bigint_uint64(env, reinterpret_cast<uint64_t>(webPrintDocument),
49500826e83eSopenharmony_ci                                             &consParam[INTEGER_ZERO]));
49510826e83eSopenharmony_ci    napi_value proxy = nullptr;
49520826e83eSopenharmony_ci    status = napi_new_instance(env, webPrintDoc, INTEGER_ONE, &consParam[INTEGER_ZERO], &proxy);
49530826e83eSopenharmony_ci    if (status!= napi_ok) {
49540826e83eSopenharmony_ci        napi_close_handle_scope(env, scope);
49550826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
49560826e83eSopenharmony_ci        return result;
49570826e83eSopenharmony_ci    }
49580826e83eSopenharmony_ci    napi_close_handle_scope(env, scope);
49590826e83eSopenharmony_ci    return proxy;
49600826e83eSopenharmony_ci}
49610826e83eSopenharmony_ci
49620826e83eSopenharmony_cinapi_value NapiWebviewController::GetSecurityLevel(napi_env env, napi_callback_info info)
49630826e83eSopenharmony_ci{
49640826e83eSopenharmony_ci    napi_value result = nullptr;
49650826e83eSopenharmony_ci    WebviewController *webviewController = GetWebviewController(env, info);
49660826e83eSopenharmony_ci    if (!webviewController) {
49670826e83eSopenharmony_ci        return result;
49680826e83eSopenharmony_ci    }
49690826e83eSopenharmony_ci
49700826e83eSopenharmony_ci    int32_t securityLevel = webviewController->GetSecurityLevel();
49710826e83eSopenharmony_ci    napi_create_int32(env, securityLevel, &result);
49720826e83eSopenharmony_ci    return result;
49730826e83eSopenharmony_ci}
49740826e83eSopenharmony_ci
49750826e83eSopenharmony_civoid ParsePrintRangeAdapter(napi_env env, napi_value pageRange, PrintAttributesAdapter& printAttr)
49760826e83eSopenharmony_ci{
49770826e83eSopenharmony_ci    if (!pageRange) {
49780826e83eSopenharmony_ci        WVLOG_E("ParsePrintRangeAdapter failed.");
49790826e83eSopenharmony_ci        return;
49800826e83eSopenharmony_ci    }
49810826e83eSopenharmony_ci    napi_value startPage = nullptr;
49820826e83eSopenharmony_ci    napi_value endPage = nullptr;
49830826e83eSopenharmony_ci    napi_value pages = nullptr;
49840826e83eSopenharmony_ci    napi_get_named_property(env, pageRange, "startPage", &startPage);
49850826e83eSopenharmony_ci    napi_get_named_property(env, pageRange, "endPage", &endPage);
49860826e83eSopenharmony_ci    if (startPage) {
49870826e83eSopenharmony_ci        NapiParseUtils::ParseUint32(env, startPage, printAttr.pageRange.startPage);
49880826e83eSopenharmony_ci    }
49890826e83eSopenharmony_ci    if (endPage) {
49900826e83eSopenharmony_ci        NapiParseUtils::ParseUint32(env, endPage, printAttr.pageRange.endPage);
49910826e83eSopenharmony_ci    }
49920826e83eSopenharmony_ci    napi_get_named_property(env, pageRange, "pages", &pages);
49930826e83eSopenharmony_ci    uint32_t pageArrayLength = 0;
49940826e83eSopenharmony_ci    napi_get_array_length(env, pages, &pageArrayLength);
49950826e83eSopenharmony_ci    for (uint32_t i = 0; i < pageArrayLength; ++i) {
49960826e83eSopenharmony_ci        napi_value pagesNumObj = nullptr;
49970826e83eSopenharmony_ci        napi_get_element(env, pages, i, &pagesNumObj);
49980826e83eSopenharmony_ci        uint32_t pagesNum;
49990826e83eSopenharmony_ci        NapiParseUtils::ParseUint32(env, pagesNumObj, pagesNum);
50000826e83eSopenharmony_ci        printAttr.pageRange.pages.push_back(pagesNum);
50010826e83eSopenharmony_ci    }
50020826e83eSopenharmony_ci}
50030826e83eSopenharmony_ci
50040826e83eSopenharmony_civoid ParsePrintPageSizeAdapter(napi_env env, napi_value pageSize, PrintAttributesAdapter& printAttr)
50050826e83eSopenharmony_ci{
50060826e83eSopenharmony_ci    if (!pageSize) {
50070826e83eSopenharmony_ci        WVLOG_E("ParsePrintPageSizeAdapter failed.");
50080826e83eSopenharmony_ci        return;
50090826e83eSopenharmony_ci    }
50100826e83eSopenharmony_ci    napi_value id = nullptr;
50110826e83eSopenharmony_ci    napi_value name = nullptr;
50120826e83eSopenharmony_ci    napi_value width = nullptr;
50130826e83eSopenharmony_ci    napi_value height = nullptr;
50140826e83eSopenharmony_ci    napi_get_named_property(env, pageSize, "id", &id);
50150826e83eSopenharmony_ci    napi_get_named_property(env, pageSize, "name", &name);
50160826e83eSopenharmony_ci    napi_get_named_property(env, pageSize, "width", &width);
50170826e83eSopenharmony_ci    napi_get_named_property(env, pageSize, "height", &height);
50180826e83eSopenharmony_ci    if (width) {
50190826e83eSopenharmony_ci        NapiParseUtils::ParseUint32(env, width, printAttr.pageSize.width);
50200826e83eSopenharmony_ci    }
50210826e83eSopenharmony_ci    if (height) {
50220826e83eSopenharmony_ci        NapiParseUtils::ParseUint32(env, height, printAttr.pageSize.height);
50230826e83eSopenharmony_ci    }
50240826e83eSopenharmony_ci}
50250826e83eSopenharmony_ci
50260826e83eSopenharmony_civoid ParsePrintMarginAdapter(napi_env env, napi_value margin, PrintAttributesAdapter& printAttr)
50270826e83eSopenharmony_ci{
50280826e83eSopenharmony_ci    if (!margin) {
50290826e83eSopenharmony_ci        WVLOG_E("ParsePrintMarginAdapter failed.");
50300826e83eSopenharmony_ci        return;
50310826e83eSopenharmony_ci    }
50320826e83eSopenharmony_ci    napi_value top = nullptr;
50330826e83eSopenharmony_ci    napi_value bottom = nullptr;
50340826e83eSopenharmony_ci    napi_value left = nullptr;
50350826e83eSopenharmony_ci    napi_value right = nullptr;
50360826e83eSopenharmony_ci    napi_get_named_property(env, margin, "top", &top);
50370826e83eSopenharmony_ci    napi_get_named_property(env, margin, "bottom", &bottom);
50380826e83eSopenharmony_ci    napi_get_named_property(env, margin, "left", &left);
50390826e83eSopenharmony_ci    napi_get_named_property(env, margin, "right", &right);
50400826e83eSopenharmony_ci    if (top) {
50410826e83eSopenharmony_ci        NapiParseUtils::ParseUint32(env, top, printAttr.margin.top);
50420826e83eSopenharmony_ci    }
50430826e83eSopenharmony_ci    if (bottom) {
50440826e83eSopenharmony_ci        NapiParseUtils::ParseUint32(env, bottom, printAttr.margin.bottom);
50450826e83eSopenharmony_ci    }
50460826e83eSopenharmony_ci    if (left) {
50470826e83eSopenharmony_ci        NapiParseUtils::ParseUint32(env, left, printAttr.margin.left);
50480826e83eSopenharmony_ci    }
50490826e83eSopenharmony_ci    if (right) {
50500826e83eSopenharmony_ci        NapiParseUtils::ParseUint32(env, right, printAttr.margin.right);
50510826e83eSopenharmony_ci    }
50520826e83eSopenharmony_ci}
50530826e83eSopenharmony_ci
50540826e83eSopenharmony_ciWebPrintWriteResultCallback ParseWebPrintWriteResultCallback(napi_env env, napi_value argv)
50550826e83eSopenharmony_ci{
50560826e83eSopenharmony_ci    if (!argv) {
50570826e83eSopenharmony_ci        WVLOG_E("ParseWebPrintWriteResultCallback failed.");
50580826e83eSopenharmony_ci        return nullptr;
50590826e83eSopenharmony_ci    }
50600826e83eSopenharmony_ci    napi_ref jsCallback = nullptr;
50610826e83eSopenharmony_ci    napi_create_reference(env, argv, 1, &jsCallback);
50620826e83eSopenharmony_ci    if (jsCallback) {
50630826e83eSopenharmony_ci        WebPrintWriteResultCallback callbackImpl =
50640826e83eSopenharmony_ci            [env, jCallback = std::move(jsCallback)](std::string jobId, uint32_t state) {
50650826e83eSopenharmony_ci            if (!env) {
50660826e83eSopenharmony_ci                return;
50670826e83eSopenharmony_ci            }
50680826e83eSopenharmony_ci            napi_handle_scope scope = nullptr;
50690826e83eSopenharmony_ci            napi_open_handle_scope(env, &scope);
50700826e83eSopenharmony_ci            if (scope == nullptr) {
50710826e83eSopenharmony_ci                return;
50720826e83eSopenharmony_ci            }
50730826e83eSopenharmony_ci            napi_value setResult[INTEGER_TWO] = {0};
50740826e83eSopenharmony_ci            napi_create_string_utf8(env, jobId.c_str(), NAPI_AUTO_LENGTH, &setResult[INTEGER_ZERO]);
50750826e83eSopenharmony_ci            napi_create_uint32(env, state, &setResult[INTEGER_ONE]);
50760826e83eSopenharmony_ci            napi_value args[INTEGER_TWO] = {setResult[INTEGER_ZERO], setResult[INTEGER_ONE]};
50770826e83eSopenharmony_ci            napi_value callback = nullptr;
50780826e83eSopenharmony_ci            napi_get_reference_value(env, jCallback, &callback);
50790826e83eSopenharmony_ci            napi_value callbackResult = nullptr;
50800826e83eSopenharmony_ci            napi_call_function(env, nullptr, callback, INTEGER_TWO, args, &callbackResult);
50810826e83eSopenharmony_ci            napi_delete_reference(env, jCallback);
50820826e83eSopenharmony_ci            napi_close_handle_scope(env, scope);
50830826e83eSopenharmony_ci        };
50840826e83eSopenharmony_ci        return callbackImpl;
50850826e83eSopenharmony_ci    }
50860826e83eSopenharmony_ci    return nullptr;
50870826e83eSopenharmony_ci}
50880826e83eSopenharmony_ci
50890826e83eSopenharmony_cibool ParseWebPrintAttrParams(napi_env env, napi_value obj, PrintAttributesAdapter& printAttr)
50900826e83eSopenharmony_ci{
50910826e83eSopenharmony_ci    if (!obj) {
50920826e83eSopenharmony_ci        WVLOG_E("ParseWebPrintAttrParams failed.");
50930826e83eSopenharmony_ci        return false;
50940826e83eSopenharmony_ci    }
50950826e83eSopenharmony_ci    napi_value copyNumber = nullptr;
50960826e83eSopenharmony_ci    napi_value pageRange = nullptr;
50970826e83eSopenharmony_ci    napi_value isSequential = nullptr;
50980826e83eSopenharmony_ci    napi_value pageSize = nullptr;
50990826e83eSopenharmony_ci    napi_value isLandscape = nullptr;
51000826e83eSopenharmony_ci    napi_value colorMode = nullptr;
51010826e83eSopenharmony_ci    napi_value duplexMode = nullptr;
51020826e83eSopenharmony_ci    napi_value margin = nullptr;
51030826e83eSopenharmony_ci    napi_value option = nullptr;
51040826e83eSopenharmony_ci    napi_get_named_property(env, obj, "copyNumber", &copyNumber);
51050826e83eSopenharmony_ci    napi_get_named_property(env, obj, "pageRange", &pageRange);
51060826e83eSopenharmony_ci    napi_get_named_property(env, obj, "isSequential", &isSequential);
51070826e83eSopenharmony_ci    napi_get_named_property(env, obj, "pageSize", &pageSize);
51080826e83eSopenharmony_ci    napi_get_named_property(env, obj, "isLandscape", &isLandscape);
51090826e83eSopenharmony_ci    napi_get_named_property(env, obj, "colorMode", &colorMode);
51100826e83eSopenharmony_ci    napi_get_named_property(env, obj, "duplexMode", &duplexMode);
51110826e83eSopenharmony_ci    napi_get_named_property(env, obj, "margin", &margin);
51120826e83eSopenharmony_ci    napi_get_named_property(env, obj, "option", &option);
51130826e83eSopenharmony_ci    if (copyNumber) {
51140826e83eSopenharmony_ci        NapiParseUtils::ParseUint32(env, copyNumber, printAttr.copyNumber);
51150826e83eSopenharmony_ci    }
51160826e83eSopenharmony_ci    if (isSequential) {
51170826e83eSopenharmony_ci        NapiParseUtils::ParseBoolean(env, isSequential, printAttr.isSequential);
51180826e83eSopenharmony_ci    }
51190826e83eSopenharmony_ci    if (isLandscape) {
51200826e83eSopenharmony_ci        NapiParseUtils::ParseBoolean(env, isLandscape,  printAttr.isLandscape);
51210826e83eSopenharmony_ci    }
51220826e83eSopenharmony_ci    if (colorMode) {
51230826e83eSopenharmony_ci        NapiParseUtils::ParseUint32(env, colorMode, printAttr.colorMode);
51240826e83eSopenharmony_ci    }
51250826e83eSopenharmony_ci    if (duplexMode) {
51260826e83eSopenharmony_ci        NapiParseUtils::ParseUint32(env, duplexMode, printAttr.duplexMode);
51270826e83eSopenharmony_ci    }
51280826e83eSopenharmony_ci    if (option) {
51290826e83eSopenharmony_ci        NapiParseUtils::ParseString(env, option, printAttr.option);
51300826e83eSopenharmony_ci    }
51310826e83eSopenharmony_ci    ParsePrintRangeAdapter(env, pageRange, printAttr);
51320826e83eSopenharmony_ci    ParsePrintPageSizeAdapter(env, pageSize, printAttr);
51330826e83eSopenharmony_ci    ParsePrintMarginAdapter(env, margin, printAttr);
51340826e83eSopenharmony_ci    return true;
51350826e83eSopenharmony_ci}
51360826e83eSopenharmony_ci
51370826e83eSopenharmony_cinapi_value NapiWebPrintDocument::OnStartLayoutWrite(napi_env env, napi_callback_info info)
51380826e83eSopenharmony_ci{
51390826e83eSopenharmony_ci    WVLOG_I("On Start Layout Write.");
51400826e83eSopenharmony_ci    napi_value thisVar = nullptr;
51410826e83eSopenharmony_ci    napi_value result = nullptr;
51420826e83eSopenharmony_ci    size_t argc = INTEGER_FIVE;
51430826e83eSopenharmony_ci    napi_value argv[INTEGER_FIVE] = { 0 };
51440826e83eSopenharmony_ci    WebPrintDocument *webPrintDocument = nullptr;
51450826e83eSopenharmony_ci
51460826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
51470826e83eSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, (void **)&webPrintDocument));
51480826e83eSopenharmony_ci    if (webPrintDocument == nullptr) {
51490826e83eSopenharmony_ci        WVLOG_E("unwrap webPrintDocument failed.");
51500826e83eSopenharmony_ci        return result;
51510826e83eSopenharmony_ci    }
51520826e83eSopenharmony_ci
51530826e83eSopenharmony_ci    std::string jobId;
51540826e83eSopenharmony_ci    if (!NapiParseUtils::ParseString(env, argv[INTEGER_ZERO], jobId)) {
51550826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
51560826e83eSopenharmony_ci        return result;
51570826e83eSopenharmony_ci    }
51580826e83eSopenharmony_ci
51590826e83eSopenharmony_ci    int32_t fd;
51600826e83eSopenharmony_ci    if (!NapiParseUtils::ParseInt32(env, argv[INTEGER_THREE], fd)) {
51610826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
51620826e83eSopenharmony_ci        return result;
51630826e83eSopenharmony_ci    }
51640826e83eSopenharmony_ci    PrintAttributesAdapter oldPrintAttr;
51650826e83eSopenharmony_ci    PrintAttributesAdapter newPrintAttr;
51660826e83eSopenharmony_ci    bool ret = false;
51670826e83eSopenharmony_ci    ret = ParseWebPrintAttrParams(env, argv[INTEGER_ONE], oldPrintAttr);
51680826e83eSopenharmony_ci    if (!ret) {
51690826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
51700826e83eSopenharmony_ci        return result;
51710826e83eSopenharmony_ci    }
51720826e83eSopenharmony_ci    ret = ParseWebPrintAttrParams(env, argv[INTEGER_TWO], newPrintAttr);
51730826e83eSopenharmony_ci    if (!ret) {
51740826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
51750826e83eSopenharmony_ci        return result;
51760826e83eSopenharmony_ci    }
51770826e83eSopenharmony_ci    WebPrintWriteResultCallback writeResultCallback = nullptr;
51780826e83eSopenharmony_ci    writeResultCallback = ParseWebPrintWriteResultCallback(env, argv[INTEGER_FOUR]);
51790826e83eSopenharmony_ci    webPrintDocument->OnStartLayoutWrite(jobId, oldPrintAttr, newPrintAttr, fd, writeResultCallback);
51800826e83eSopenharmony_ci    return result;
51810826e83eSopenharmony_ci}
51820826e83eSopenharmony_ci
51830826e83eSopenharmony_cinapi_value NapiWebPrintDocument::OnJobStateChanged(napi_env env, napi_callback_info info)
51840826e83eSopenharmony_ci{
51850826e83eSopenharmony_ci    WVLOG_I("On Job State Changed.");
51860826e83eSopenharmony_ci    napi_value thisVar = nullptr;
51870826e83eSopenharmony_ci    napi_value result = nullptr;
51880826e83eSopenharmony_ci    size_t argc = INTEGER_TWO;
51890826e83eSopenharmony_ci    napi_value argv[INTEGER_TWO];
51900826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
51910826e83eSopenharmony_ci
51920826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
51930826e83eSopenharmony_ci    WebPrintDocument *webPrintDocument = nullptr;
51940826e83eSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, (void **)&webPrintDocument));
51950826e83eSopenharmony_ci    if (webPrintDocument == nullptr) {
51960826e83eSopenharmony_ci        WVLOG_E("unwrap webPrintDocument failed.");
51970826e83eSopenharmony_ci        return result;
51980826e83eSopenharmony_ci    }
51990826e83eSopenharmony_ci    if (argc != INTEGER_TWO) {
52000826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
52010826e83eSopenharmony_ci        return result;
52020826e83eSopenharmony_ci    }
52030826e83eSopenharmony_ci
52040826e83eSopenharmony_ci    std::string jobId;
52050826e83eSopenharmony_ci    if (!NapiParseUtils::ParseString(env, argv[INTEGER_ZERO], jobId)) {
52060826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
52070826e83eSopenharmony_ci        return result;
52080826e83eSopenharmony_ci    }
52090826e83eSopenharmony_ci
52100826e83eSopenharmony_ci    int32_t state;
52110826e83eSopenharmony_ci    if (!NapiParseUtils::ParseInt32(env, argv[INTEGER_ONE], state)) {
52120826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
52130826e83eSopenharmony_ci        return result;
52140826e83eSopenharmony_ci    }
52150826e83eSopenharmony_ci    webPrintDocument->OnJobStateChanged(jobId, state);
52160826e83eSopenharmony_ci    return result;
52170826e83eSopenharmony_ci}
52180826e83eSopenharmony_ci
52190826e83eSopenharmony_cinapi_value NapiWebPrintDocument::JsConstructor(napi_env env, napi_callback_info info)
52200826e83eSopenharmony_ci{
52210826e83eSopenharmony_ci    napi_value thisVar = nullptr;
52220826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
52230826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE];
52240826e83eSopenharmony_ci    uint64_t addrWebPrintDoc = 0;
52250826e83eSopenharmony_ci    bool loseLess = true;
52260826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
52270826e83eSopenharmony_ci
52280826e83eSopenharmony_ci    if (!NapiParseUtils::ParseUint64(env, argv[INTEGER_ZERO], addrWebPrintDoc, &loseLess)) {
52290826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
52300826e83eSopenharmony_ci        return nullptr;
52310826e83eSopenharmony_ci    }
52320826e83eSopenharmony_ci    void *webPrintDocPtr = reinterpret_cast<void *>(addrWebPrintDoc);
52330826e83eSopenharmony_ci    WebPrintDocument *webPrintDoc = new (std::nothrow) WebPrintDocument(webPrintDocPtr);
52340826e83eSopenharmony_ci    if (webPrintDoc == nullptr) {
52350826e83eSopenharmony_ci        WVLOG_E("new web print failed");
52360826e83eSopenharmony_ci        return nullptr;
52370826e83eSopenharmony_ci    }
52380826e83eSopenharmony_ci    NAPI_CALL(env, napi_wrap(env, thisVar, webPrintDoc,
52390826e83eSopenharmony_ci        [](napi_env env, void *data, void *hint) {
52400826e83eSopenharmony_ci            WebPrintDocument *webPrintDocument = static_cast<WebPrintDocument *>(data);
52410826e83eSopenharmony_ci            delete webPrintDocument;
52420826e83eSopenharmony_ci        },
52430826e83eSopenharmony_ci        nullptr, nullptr));
52440826e83eSopenharmony_ci    return thisVar;
52450826e83eSopenharmony_ci}
52460826e83eSopenharmony_ci
52470826e83eSopenharmony_cinapi_value NapiWebviewController::SetPrintBackground(napi_env env, napi_callback_info info)
52480826e83eSopenharmony_ci{
52490826e83eSopenharmony_ci    napi_value result = nullptr;
52500826e83eSopenharmony_ci    napi_value thisVar = nullptr;
52510826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
52520826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
52530826e83eSopenharmony_ci
52540826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
52550826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
52560826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
52570826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
52580826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
52590826e83eSopenharmony_ci        return result;
52600826e83eSopenharmony_ci    }
52610826e83eSopenharmony_ci
52620826e83eSopenharmony_ci    bool printBackgroundEnabled = false;
52630826e83eSopenharmony_ci    if (!NapiParseUtils::ParseBoolean(env, argv[0], printBackgroundEnabled)) {
52640826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
52650826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "enable", "boolean"));
52660826e83eSopenharmony_ci        return result;
52670826e83eSopenharmony_ci    }
52680826e83eSopenharmony_ci
52690826e83eSopenharmony_ci    WebviewController *webviewController = GetWebviewController(env, info);
52700826e83eSopenharmony_ci    if (!webviewController) {
52710826e83eSopenharmony_ci        return result;
52720826e83eSopenharmony_ci    }
52730826e83eSopenharmony_ci    webviewController->SetPrintBackground(printBackgroundEnabled);
52740826e83eSopenharmony_ci    return result;
52750826e83eSopenharmony_ci}
52760826e83eSopenharmony_ci
52770826e83eSopenharmony_cinapi_value NapiWebviewController::GetPrintBackground(napi_env env, napi_callback_info info)
52780826e83eSopenharmony_ci{
52790826e83eSopenharmony_ci    napi_value result = nullptr;
52800826e83eSopenharmony_ci    WebviewController *webviewController = GetWebviewController(env, info);
52810826e83eSopenharmony_ci
52820826e83eSopenharmony_ci    if (!webviewController) {
52830826e83eSopenharmony_ci        return result;
52840826e83eSopenharmony_ci    }
52850826e83eSopenharmony_ci
52860826e83eSopenharmony_ci    bool printBackgroundEnabled = webviewController->GetPrintBackground();
52870826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_boolean(env, printBackgroundEnabled, &result));
52880826e83eSopenharmony_ci    return result;
52890826e83eSopenharmony_ci}
52900826e83eSopenharmony_ci
52910826e83eSopenharmony_cinapi_value NapiWebviewController::SetWebSchemeHandler(napi_env env, napi_callback_info info)
52920826e83eSopenharmony_ci{
52930826e83eSopenharmony_ci    size_t argc = 2;
52940826e83eSopenharmony_ci    napi_value argv[2] = {0};
52950826e83eSopenharmony_ci    napi_value thisVar = nullptr;
52960826e83eSopenharmony_ci    void* data = nullptr;
52970826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
52980826e83eSopenharmony_ci
52990826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
53000826e83eSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, (void **)&webviewController));
53010826e83eSopenharmony_ci    if (webviewController == nullptr || !webviewController->IsInit()) {
53020826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INIT_ERROR);
53030826e83eSopenharmony_ci        WVLOG_E("create message port failed, napi unwrap webviewController failed");
53040826e83eSopenharmony_ci        return nullptr;
53050826e83eSopenharmony_ci    }
53060826e83eSopenharmony_ci
53070826e83eSopenharmony_ci    std::string scheme = "";
53080826e83eSopenharmony_ci    if (!NapiParseUtils::ParseString(env, argv[0], scheme)) {
53090826e83eSopenharmony_ci        WVLOG_E("NapiWebviewController::SetWebSchemeHandler parse scheme failed");
53100826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
53110826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "scheme", "string"));
53120826e83eSopenharmony_ci        return nullptr;
53130826e83eSopenharmony_ci    }
53140826e83eSopenharmony_ci
53150826e83eSopenharmony_ci    WebSchemeHandler* handler = nullptr;
53160826e83eSopenharmony_ci    napi_value obj = argv[1];
53170826e83eSopenharmony_ci    napi_unwrap(env, obj, (void**)&handler);
53180826e83eSopenharmony_ci    if (!handler) {
53190826e83eSopenharmony_ci        WVLOG_E("NapiWebviewController::SetWebSchemeHandler handler is null");
53200826e83eSopenharmony_ci        return nullptr;
53210826e83eSopenharmony_ci    }
53220826e83eSopenharmony_ci    napi_create_reference(env, obj, 1, &handler->delegate_);
53230826e83eSopenharmony_ci
53240826e83eSopenharmony_ci    if (!webviewController->SetWebSchemeHandler(scheme.c_str(), handler)) {
53250826e83eSopenharmony_ci        WVLOG_E("NapiWebviewController::SetWebSchemeHandler failed");
53260826e83eSopenharmony_ci    }
53270826e83eSopenharmony_ci    return nullptr;
53280826e83eSopenharmony_ci}
53290826e83eSopenharmony_ci
53300826e83eSopenharmony_cinapi_value NapiWebviewController::ClearWebSchemeHandler(napi_env env, napi_callback_info info)
53310826e83eSopenharmony_ci{
53320826e83eSopenharmony_ci    napi_value result = nullptr;
53330826e83eSopenharmony_ci    WebviewController *webviewController = GetWebviewController(env, info);
53340826e83eSopenharmony_ci    if (!webviewController) {
53350826e83eSopenharmony_ci        return nullptr;
53360826e83eSopenharmony_ci    }
53370826e83eSopenharmony_ci
53380826e83eSopenharmony_ci    int32_t ret = webviewController->ClearWebSchemeHandler();
53390826e83eSopenharmony_ci    if (ret != 0) {
53400826e83eSopenharmony_ci        WVLOG_E("NapiWebviewController::ClearWebSchemeHandler failed");
53410826e83eSopenharmony_ci    }
53420826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
53430826e83eSopenharmony_ci    return result;
53440826e83eSopenharmony_ci}
53450826e83eSopenharmony_ci
53460826e83eSopenharmony_cinapi_value NapiWebviewController::SetServiceWorkerWebSchemeHandler(
53470826e83eSopenharmony_ci    napi_env env, napi_callback_info info)
53480826e83eSopenharmony_ci{
53490826e83eSopenharmony_ci    size_t argc = 2;
53500826e83eSopenharmony_ci    napi_value argv[2] = {0};
53510826e83eSopenharmony_ci    napi_value thisVar = nullptr;
53520826e83eSopenharmony_ci    void* data = nullptr;
53530826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
53540826e83eSopenharmony_ci
53550826e83eSopenharmony_ci    std::string scheme = "";
53560826e83eSopenharmony_ci    if (!NapiParseUtils::ParseString(env, argv[0], scheme)) {
53570826e83eSopenharmony_ci        WVLOG_E("NapiWebviewController::SetWebSchemeHandler parse scheme failed");
53580826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
53590826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "scheme", "string"));
53600826e83eSopenharmony_ci        return nullptr;
53610826e83eSopenharmony_ci    }
53620826e83eSopenharmony_ci
53630826e83eSopenharmony_ci    WebSchemeHandler* handler = nullptr;
53640826e83eSopenharmony_ci    napi_value obj = argv[1];
53650826e83eSopenharmony_ci    napi_unwrap(env, obj, (void**)&handler);
53660826e83eSopenharmony_ci    if (!handler) {
53670826e83eSopenharmony_ci        WVLOG_E("NapiWebviewController::SetServiceWorkerWebSchemeHandler handler is null");
53680826e83eSopenharmony_ci        return nullptr;
53690826e83eSopenharmony_ci    }
53700826e83eSopenharmony_ci    napi_create_reference(env, obj, 1, &handler->delegate_);
53710826e83eSopenharmony_ci
53720826e83eSopenharmony_ci    if (!WebviewController::SetWebServiveWorkerSchemeHandler(
53730826e83eSopenharmony_ci        scheme.c_str(), handler)) {
53740826e83eSopenharmony_ci        WVLOG_E("NapiWebviewController::SetWebSchemeHandler failed");
53750826e83eSopenharmony_ci    }
53760826e83eSopenharmony_ci    return nullptr;
53770826e83eSopenharmony_ci}
53780826e83eSopenharmony_ci
53790826e83eSopenharmony_cinapi_value NapiWebviewController::ClearServiceWorkerWebSchemeHandler(
53800826e83eSopenharmony_ci    napi_env env, napi_callback_info info)
53810826e83eSopenharmony_ci{
53820826e83eSopenharmony_ci    int32_t ret = WebviewController::ClearWebServiceWorkerSchemeHandler();
53830826e83eSopenharmony_ci    if (ret != 0) {
53840826e83eSopenharmony_ci        WVLOG_E("ClearServiceWorkerWebSchemeHandler ret=%{public}d", ret);
53850826e83eSopenharmony_ci        return nullptr;
53860826e83eSopenharmony_ci    }
53870826e83eSopenharmony_ci    return nullptr;
53880826e83eSopenharmony_ci}
53890826e83eSopenharmony_ci
53900826e83eSopenharmony_cinapi_value NapiWebviewController::EnableIntelligentTrackingPrevention(
53910826e83eSopenharmony_ci    napi_env env, napi_callback_info info)
53920826e83eSopenharmony_ci{
53930826e83eSopenharmony_ci    WVLOG_I("enable/disable intelligent tracking prevention.");
53940826e83eSopenharmony_ci    napi_value result = nullptr;
53950826e83eSopenharmony_ci    napi_value thisVar = nullptr;
53960826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
53970826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
53980826e83eSopenharmony_ci
53990826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
54000826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
54010826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
54020826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
54030826e83eSopenharmony_ci            "BusinessError 401: Parameter error. The number of params must be one.");
54040826e83eSopenharmony_ci        return result;
54050826e83eSopenharmony_ci    }
54060826e83eSopenharmony_ci
54070826e83eSopenharmony_ci    bool enabled = false;
54080826e83eSopenharmony_ci    if (!NapiParseUtils::ParseBoolean(env, argv[INTEGER_ZERO], enabled)) {
54090826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
54100826e83eSopenharmony_ci            "BusinessError 401: Parameter error. The type of 'enable' must be boolean.");
54110826e83eSopenharmony_ci        return result;
54120826e83eSopenharmony_ci    }
54130826e83eSopenharmony_ci
54140826e83eSopenharmony_ci    WebviewController *webviewController = GetWebviewController(env, info);
54150826e83eSopenharmony_ci    if (!webviewController) {
54160826e83eSopenharmony_ci        return result;
54170826e83eSopenharmony_ci    }
54180826e83eSopenharmony_ci    webviewController->EnableIntelligentTrackingPrevention(enabled);
54190826e83eSopenharmony_ci    return result;
54200826e83eSopenharmony_ci}
54210826e83eSopenharmony_ci
54220826e83eSopenharmony_cinapi_value NapiWebviewController::IsIntelligentTrackingPreventionEnabled(
54230826e83eSopenharmony_ci    napi_env env, napi_callback_info info)
54240826e83eSopenharmony_ci{
54250826e83eSopenharmony_ci    WVLOG_I("get intelligent tracking prevention enabled value.");
54260826e83eSopenharmony_ci    napi_value result = nullptr;
54270826e83eSopenharmony_ci    WebviewController *webviewController = GetWebviewController(env, info);
54280826e83eSopenharmony_ci
54290826e83eSopenharmony_ci    if (!webviewController) {
54300826e83eSopenharmony_ci        return result;
54310826e83eSopenharmony_ci    }
54320826e83eSopenharmony_ci
54330826e83eSopenharmony_ci    bool enabled = webviewController->
54340826e83eSopenharmony_ci        IsIntelligentTrackingPreventionEnabled();
54350826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_boolean(env, enabled, &result));
54360826e83eSopenharmony_ci    return result;
54370826e83eSopenharmony_ci}
54380826e83eSopenharmony_ci
54390826e83eSopenharmony_cibool GetHostList(napi_env env, napi_value array, std::vector<std::string>& hosts)
54400826e83eSopenharmony_ci{
54410826e83eSopenharmony_ci    uint32_t arrayLen = 0;
54420826e83eSopenharmony_ci    napi_get_array_length(env, array, &arrayLen);
54430826e83eSopenharmony_ci    if (arrayLen == 0) {
54440826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
54450826e83eSopenharmony_ci            "BusinessError 401: Parameter error. The array length must be greater than 0.");
54460826e83eSopenharmony_ci        return false;
54470826e83eSopenharmony_ci    }
54480826e83eSopenharmony_ci
54490826e83eSopenharmony_ci    for (uint32_t i = 0; i < arrayLen; i++) {
54500826e83eSopenharmony_ci        napi_value hostItem = nullptr;
54510826e83eSopenharmony_ci        napi_get_element(env, array, i, &hostItem);
54520826e83eSopenharmony_ci
54530826e83eSopenharmony_ci        size_t hostLen = 0;
54540826e83eSopenharmony_ci        napi_get_value_string_utf8(env, hostItem, nullptr, 0, &hostLen);
54550826e83eSopenharmony_ci        if (hostLen == 0 || hostLen > UINT_MAX) {
54560826e83eSopenharmony_ci            WVLOG_E("hostitem length is invalid");
54570826e83eSopenharmony_ci            return false;
54580826e83eSopenharmony_ci        }
54590826e83eSopenharmony_ci
54600826e83eSopenharmony_ci        char host[hostLen + 1];
54610826e83eSopenharmony_ci        int retCode = memset_s(host, sizeof(host), 0, hostLen + 1);
54620826e83eSopenharmony_ci        if (retCode < 0) {
54630826e83eSopenharmony_ci            WVLOG_E("memset_s failed, retCode=%{public}d", retCode);
54640826e83eSopenharmony_ci            return false;
54650826e83eSopenharmony_ci        }
54660826e83eSopenharmony_ci        napi_get_value_string_utf8(env, hostItem, host, sizeof(host), &hostLen);
54670826e83eSopenharmony_ci        std::string hostStr(host);
54680826e83eSopenharmony_ci        hosts.emplace_back(hostStr);
54690826e83eSopenharmony_ci    }
54700826e83eSopenharmony_ci    return true;
54710826e83eSopenharmony_ci}
54720826e83eSopenharmony_ci
54730826e83eSopenharmony_cinapi_value NapiWebviewController::AddIntelligentTrackingPreventionBypassingList(
54740826e83eSopenharmony_ci    napi_env env, napi_callback_info info)
54750826e83eSopenharmony_ci{
54760826e83eSopenharmony_ci    WVLOG_I("Add intelligent tracking prevention bypassing list.");
54770826e83eSopenharmony_ci    napi_value result = nullptr;
54780826e83eSopenharmony_ci    napi_value thisVar = nullptr;
54790826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
54800826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
54810826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
54820826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
54830826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
54840826e83eSopenharmony_ci            "BusinessError 401: Parameter error. The number of params must be one.");
54850826e83eSopenharmony_ci        return result;
54860826e83eSopenharmony_ci    }
54870826e83eSopenharmony_ci
54880826e83eSopenharmony_ci    bool isArray = false;
54890826e83eSopenharmony_ci    NAPI_CALL(env, napi_is_array(env, argv[INTEGER_ZERO], &isArray));
54900826e83eSopenharmony_ci    if (!isArray) {
54910826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
54920826e83eSopenharmony_ci            "BusinessError 401: Parameter error. The type of 'hostList' must be string array.");
54930826e83eSopenharmony_ci        return result;
54940826e83eSopenharmony_ci    }
54950826e83eSopenharmony_ci
54960826e83eSopenharmony_ci    std::vector<std::string> hosts;
54970826e83eSopenharmony_ci    if (!GetHostList(env, argv[INTEGER_ZERO], hosts)) {
54980826e83eSopenharmony_ci        WVLOG_E("get host list failed, GetHostList fail");
54990826e83eSopenharmony_ci        return result;
55000826e83eSopenharmony_ci    }
55010826e83eSopenharmony_ci
55020826e83eSopenharmony_ci    NWebHelper::Instance().AddIntelligentTrackingPreventionBypassingList(hosts);
55030826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
55040826e83eSopenharmony_ci    return result;
55050826e83eSopenharmony_ci}
55060826e83eSopenharmony_ci
55070826e83eSopenharmony_cinapi_value NapiWebviewController::RemoveIntelligentTrackingPreventionBypassingList(
55080826e83eSopenharmony_ci    napi_env env, napi_callback_info info)
55090826e83eSopenharmony_ci{
55100826e83eSopenharmony_ci    WVLOG_I("Remove intelligent tracking prevention bypassing list.");
55110826e83eSopenharmony_ci    napi_value result = nullptr;
55120826e83eSopenharmony_ci    napi_value thisVar = nullptr;
55130826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
55140826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
55150826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
55160826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
55170826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
55180826e83eSopenharmony_ci            "BusinessError 401: Parameter error. The number of params must be one.");
55190826e83eSopenharmony_ci        return result;
55200826e83eSopenharmony_ci    }
55210826e83eSopenharmony_ci
55220826e83eSopenharmony_ci    bool isArray = false;
55230826e83eSopenharmony_ci    NAPI_CALL(env, napi_is_array(env, argv[INTEGER_ZERO], &isArray));
55240826e83eSopenharmony_ci    if (!isArray) {
55250826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
55260826e83eSopenharmony_ci            "BusinessError 401: Parameter error. The type of 'hostList' must be string array.");
55270826e83eSopenharmony_ci        return result;
55280826e83eSopenharmony_ci    }
55290826e83eSopenharmony_ci
55300826e83eSopenharmony_ci    std::vector<std::string> hosts;
55310826e83eSopenharmony_ci    if (!GetHostList(env, argv[INTEGER_ZERO], hosts)) {
55320826e83eSopenharmony_ci        WVLOG_E("get host list failed, GetHostList fail");
55330826e83eSopenharmony_ci        return result;
55340826e83eSopenharmony_ci    }
55350826e83eSopenharmony_ci
55360826e83eSopenharmony_ci    NWebHelper::Instance().RemoveIntelligentTrackingPreventionBypassingList(hosts);
55370826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
55380826e83eSopenharmony_ci    return result;
55390826e83eSopenharmony_ci}
55400826e83eSopenharmony_ci
55410826e83eSopenharmony_cinapi_value NapiWebviewController::ClearIntelligentTrackingPreventionBypassingList(
55420826e83eSopenharmony_ci    napi_env env, napi_callback_info info)
55430826e83eSopenharmony_ci{
55440826e83eSopenharmony_ci    napi_value result = nullptr;
55450826e83eSopenharmony_ci    WVLOG_I("Clear intelligent tracking prevention bypassing list.");
55460826e83eSopenharmony_ci    NWebHelper::Instance().ClearIntelligentTrackingPreventionBypassingList();
55470826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
55480826e83eSopenharmony_ci    return result;
55490826e83eSopenharmony_ci}
55500826e83eSopenharmony_ci
55510826e83eSopenharmony_cinapi_value NapiWebviewController::GetDefaultUserAgent(napi_env env, napi_callback_info info)
55520826e83eSopenharmony_ci{
55530826e83eSopenharmony_ci    WVLOG_I("Get the default user agent.");
55540826e83eSopenharmony_ci    napi_value result = nullptr;
55550826e83eSopenharmony_ci
55560826e83eSopenharmony_ci    std::string userAgent = NWebHelper::Instance().GetDefaultUserAgent();
55570826e83eSopenharmony_ci    NAPI_CALL(env, napi_create_string_utf8(env, userAgent.c_str(), userAgent.length(), &result));
55580826e83eSopenharmony_ci    return result;
55590826e83eSopenharmony_ci}
55600826e83eSopenharmony_ci
55610826e83eSopenharmony_cinapi_value NapiWebviewController::PauseAllTimers(napi_env env, napi_callback_info info)
55620826e83eSopenharmony_ci{
55630826e83eSopenharmony_ci    napi_value result = nullptr;
55640826e83eSopenharmony_ci    NWebHelper::Instance().PauseAllTimers();
55650826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
55660826e83eSopenharmony_ci    return result;
55670826e83eSopenharmony_ci}
55680826e83eSopenharmony_ci
55690826e83eSopenharmony_cinapi_value NapiWebviewController::ResumeAllTimers(napi_env env, napi_callback_info info)
55700826e83eSopenharmony_ci{
55710826e83eSopenharmony_ci    napi_value result = nullptr;
55720826e83eSopenharmony_ci    NWebHelper::Instance().ResumeAllTimers();
55730826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
55740826e83eSopenharmony_ci    return result;
55750826e83eSopenharmony_ci}
55760826e83eSopenharmony_ci
55770826e83eSopenharmony_cinapi_value NapiWebviewController::StartCamera(napi_env env, napi_callback_info info)
55780826e83eSopenharmony_ci{
55790826e83eSopenharmony_ci    napi_value result = nullptr;
55800826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
55810826e83eSopenharmony_ci    WebviewController* webviewController = GetWebviewController(env, info);
55820826e83eSopenharmony_ci    if (!webviewController) {
55830826e83eSopenharmony_ci        return result;
55840826e83eSopenharmony_ci    }
55850826e83eSopenharmony_ci    webviewController->StartCamera();
55860826e83eSopenharmony_ci
55870826e83eSopenharmony_ci    return result;
55880826e83eSopenharmony_ci}
55890826e83eSopenharmony_ci
55900826e83eSopenharmony_cinapi_value NapiWebviewController::StopCamera(napi_env env, napi_callback_info info)
55910826e83eSopenharmony_ci{
55920826e83eSopenharmony_ci    napi_value result = nullptr;
55930826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
55940826e83eSopenharmony_ci    WebviewController* webviewController = GetWebviewController(env, info);
55950826e83eSopenharmony_ci    if (!webviewController) {
55960826e83eSopenharmony_ci        return result;
55970826e83eSopenharmony_ci    }
55980826e83eSopenharmony_ci    webviewController->StopCamera();
55990826e83eSopenharmony_ci
56000826e83eSopenharmony_ci    return result;
56010826e83eSopenharmony_ci}
56020826e83eSopenharmony_ci
56030826e83eSopenharmony_cinapi_value NapiWebviewController::CloseCamera(napi_env env, napi_callback_info info)
56040826e83eSopenharmony_ci{
56050826e83eSopenharmony_ci    napi_value result = nullptr;
56060826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
56070826e83eSopenharmony_ci    WebviewController* webviewController = GetWebviewController(env, info);
56080826e83eSopenharmony_ci    if (!webviewController) {
56090826e83eSopenharmony_ci        return result;
56100826e83eSopenharmony_ci    }
56110826e83eSopenharmony_ci    webviewController->CloseCamera();
56120826e83eSopenharmony_ci
56130826e83eSopenharmony_ci    return result;
56140826e83eSopenharmony_ci}
56150826e83eSopenharmony_ci
56160826e83eSopenharmony_cinapi_value NapiWebviewController::OnCreateNativeMediaPlayer(napi_env env, napi_callback_info info)
56170826e83eSopenharmony_ci{
56180826e83eSopenharmony_ci    WVLOG_D("put on_create_native_media_player callback");
56190826e83eSopenharmony_ci
56200826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
56210826e83eSopenharmony_ci    napi_value value = nullptr;
56220826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE];
56230826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &value, nullptr);
56240826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
56250826e83eSopenharmony_ci        WVLOG_E("arg count %{public}zu is not equal to 1", argc);
56260826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
56270826e83eSopenharmony_ci        return nullptr;
56280826e83eSopenharmony_ci    }
56290826e83eSopenharmony_ci
56300826e83eSopenharmony_ci    napi_valuetype valueType = napi_undefined;
56310826e83eSopenharmony_ci    napi_typeof(env, argv[INTEGER_ZERO], &valueType);
56320826e83eSopenharmony_ci    if (valueType != napi_function) {
56330826e83eSopenharmony_ci        WVLOG_E("arg type is invalid");
56340826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
56350826e83eSopenharmony_ci        return nullptr;
56360826e83eSopenharmony_ci    }
56370826e83eSopenharmony_ci
56380826e83eSopenharmony_ci    napi_ref callback = nullptr;
56390826e83eSopenharmony_ci    napi_create_reference(env, argv[INTEGER_ZERO], INTEGER_ONE, &callback);
56400826e83eSopenharmony_ci    if (!callback) {
56410826e83eSopenharmony_ci        WVLOG_E("failed to create reference for callback");
56420826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
56430826e83eSopenharmony_ci        return nullptr;
56440826e83eSopenharmony_ci    }
56450826e83eSopenharmony_ci
56460826e83eSopenharmony_ci    WebviewController* webviewController = GetWebviewController(env, info);
56470826e83eSopenharmony_ci    if (!webviewController || !webviewController->IsInit()) {
56480826e83eSopenharmony_ci        WVLOG_E("webview controller is null or not init");
56490826e83eSopenharmony_ci        napi_delete_reference(env, callback);
56500826e83eSopenharmony_ci        return nullptr;
56510826e83eSopenharmony_ci    }
56520826e83eSopenharmony_ci
56530826e83eSopenharmony_ci    webviewController->OnCreateNativeMediaPlayer(env, std::move(callback));
56540826e83eSopenharmony_ci    return nullptr;
56550826e83eSopenharmony_ci}
56560826e83eSopenharmony_ci
56570826e83eSopenharmony_cinapi_value NapiWebviewController::SetRenderProcessMode(
56580826e83eSopenharmony_ci    napi_env env, napi_callback_info info)
56590826e83eSopenharmony_ci{
56600826e83eSopenharmony_ci    WVLOG_I("set render process mode.");
56610826e83eSopenharmony_ci    napi_value result = nullptr;
56620826e83eSopenharmony_ci    napi_value thisVar = nullptr;
56630826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
56640826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
56650826e83eSopenharmony_ci
56660826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
56670826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
56680826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
56690826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
56700826e83eSopenharmony_ci            "BusinessError 401: Parameter error. The number of params must be one.");
56710826e83eSopenharmony_ci        return result;
56720826e83eSopenharmony_ci    }
56730826e83eSopenharmony_ci
56740826e83eSopenharmony_ci    int32_t mode = 0;
56750826e83eSopenharmony_ci    if (!NapiParseUtils::ParseInt32(env, argv[INTEGER_ZERO], mode)) {
56760826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
56770826e83eSopenharmony_ci            "BusinessError 401: Parameter error. The type of 'mode' must be int.");
56780826e83eSopenharmony_ci        return result;
56790826e83eSopenharmony_ci    }
56800826e83eSopenharmony_ci
56810826e83eSopenharmony_ci    NWebHelper::Instance().SetRenderProcessMode(
56820826e83eSopenharmony_ci        static_cast<RenderProcessMode>(mode));
56830826e83eSopenharmony_ci
56840826e83eSopenharmony_ci    return result;
56850826e83eSopenharmony_ci}
56860826e83eSopenharmony_ci
56870826e83eSopenharmony_cinapi_value NapiWebviewController::GetRenderProcessMode(
56880826e83eSopenharmony_ci    napi_env env, napi_callback_info info)
56890826e83eSopenharmony_ci{
56900826e83eSopenharmony_ci    WVLOG_I("get render mode.");
56910826e83eSopenharmony_ci    napi_value result = nullptr;
56920826e83eSopenharmony_ci
56930826e83eSopenharmony_ci    int32_t mode = static_cast<int32_t>(NWebHelper::Instance().GetRenderProcessMode());
56940826e83eSopenharmony_ci    NAPI_CALL(env, napi_create_int32(env, mode, &result));
56950826e83eSopenharmony_ci    return result;
56960826e83eSopenharmony_ci}
56970826e83eSopenharmony_ci
56980826e83eSopenharmony_cinapi_value NapiWebviewController::PrecompileJavaScript(napi_env env, napi_callback_info info)
56990826e83eSopenharmony_ci{
57000826e83eSopenharmony_ci    napi_value thisVar = nullptr;
57010826e83eSopenharmony_ci    napi_value result = nullptr;
57020826e83eSopenharmony_ci    size_t argc = INTEGER_THREE;
57030826e83eSopenharmony_ci    napi_value argv[INTEGER_THREE] = {0};
57040826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
57050826e83eSopenharmony_ci    if (argc != INTEGER_THREE) {
57060826e83eSopenharmony_ci        WVLOG_E("BusinessError: 401. Args count of 'PrecompileJavaScript' must be 3.");
57070826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
57080826e83eSopenharmony_ci        return result;
57090826e83eSopenharmony_ci    }
57100826e83eSopenharmony_ci
57110826e83eSopenharmony_ci    WebviewController* webviewController = GetWebviewController(env, info);
57120826e83eSopenharmony_ci    if (!webviewController) {
57130826e83eSopenharmony_ci        WVLOG_E("PrecompileJavaScript: init webview controller error.");
57140826e83eSopenharmony_ci        return result;
57150826e83eSopenharmony_ci    }
57160826e83eSopenharmony_ci
57170826e83eSopenharmony_ci    std::string url;
57180826e83eSopenharmony_ci    if (!NapiParseUtils::ParseString(env, argv[INTEGER_ZERO], url) || url.empty()) {
57190826e83eSopenharmony_ci        WVLOG_E("BusinessError: 401. The type of 'url' must be string.");
57200826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
57210826e83eSopenharmony_ci        return result;
57220826e83eSopenharmony_ci    }
57230826e83eSopenharmony_ci
57240826e83eSopenharmony_ci    std::string script;
57250826e83eSopenharmony_ci    bool parseResult = webviewController->ParseScriptContent(env, argv[INTEGER_ONE], script);
57260826e83eSopenharmony_ci    if (!parseResult) {
57270826e83eSopenharmony_ci        WVLOG_E("BusinessError: 401. The type of 'script' must be string or Uint8Array.");
57280826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
57290826e83eSopenharmony_ci        return result;
57300826e83eSopenharmony_ci    }
57310826e83eSopenharmony_ci
57320826e83eSopenharmony_ci    auto cacheOptions = webviewController->ParseCacheOptions(env, argv[INTEGER_TWO]);
57330826e83eSopenharmony_ci
57340826e83eSopenharmony_ci    napi_deferred deferred = nullptr;
57350826e83eSopenharmony_ci    napi_value promise = nullptr;
57360826e83eSopenharmony_ci    napi_create_promise(env, &deferred, &promise);
57370826e83eSopenharmony_ci    if (promise && deferred) {
57380826e83eSopenharmony_ci        webviewController->PrecompileJavaScriptPromise(env, deferred, url, script, cacheOptions);
57390826e83eSopenharmony_ci        return promise;
57400826e83eSopenharmony_ci    }
57410826e83eSopenharmony_ci
57420826e83eSopenharmony_ci    return promise;
57430826e83eSopenharmony_ci}
57440826e83eSopenharmony_ci
57450826e83eSopenharmony_cinapi_value NapiWebviewController::EnableBackForwardCache(napi_env env, napi_callback_info info)
57460826e83eSopenharmony_ci{
57470826e83eSopenharmony_ci    napi_value thisVar = nullptr;
57480826e83eSopenharmony_ci    napi_value result = nullptr;
57490826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
57500826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
57510826e83eSopenharmony_ci    napi_get_undefined(env, &result);
57520826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
57530826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
57540826e83eSopenharmony_ci        WVLOG_E("EnalbeBackForwardCache: wrong number of params.");
57550826e83eSopenharmony_ci        NWebHelper::Instance().EnableBackForwardCache(false, false);
57560826e83eSopenharmony_ci        NAPI_CALL(env, napi_get_undefined(env, &result));
57570826e83eSopenharmony_ci        return result;
57580826e83eSopenharmony_ci    }
57590826e83eSopenharmony_ci
57600826e83eSopenharmony_ci    bool nativeEmbed = false;
57610826e83eSopenharmony_ci    bool mediaTakeOver = false;
57620826e83eSopenharmony_ci    napi_value embedObj = nullptr;
57630826e83eSopenharmony_ci    napi_value mediaObj = nullptr;
57640826e83eSopenharmony_ci    if (napi_get_named_property(env, argv[INTEGER_ZERO], "nativeEmbed", &embedObj) == napi_ok) {
57650826e83eSopenharmony_ci        if (!NapiParseUtils::ParseBoolean(env, embedObj, nativeEmbed)) {
57660826e83eSopenharmony_ci            nativeEmbed = false;
57670826e83eSopenharmony_ci        }
57680826e83eSopenharmony_ci    }
57690826e83eSopenharmony_ci
57700826e83eSopenharmony_ci    if (napi_get_named_property(env, argv[INTEGER_ZERO], "mediaTakeOver", &mediaObj) == napi_ok) {
57710826e83eSopenharmony_ci        if (!NapiParseUtils::ParseBoolean(env, mediaObj, mediaTakeOver)) {
57720826e83eSopenharmony_ci            mediaTakeOver = false;
57730826e83eSopenharmony_ci        }
57740826e83eSopenharmony_ci    }
57750826e83eSopenharmony_ci
57760826e83eSopenharmony_ci    NWebHelper::Instance().EnableBackForwardCache(nativeEmbed, mediaTakeOver);
57770826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
57780826e83eSopenharmony_ci    return result;
57790826e83eSopenharmony_ci}
57800826e83eSopenharmony_ci
57810826e83eSopenharmony_cinapi_value NapiWebviewController::SetBackForwardCacheOptions(napi_env env, napi_callback_info info)
57820826e83eSopenharmony_ci{
57830826e83eSopenharmony_ci    napi_value thisVar = nullptr;
57840826e83eSopenharmony_ci    napi_value result = nullptr;
57850826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
57860826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
57870826e83eSopenharmony_ci    napi_get_undefined(env, &result);
57880826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
57890826e83eSopenharmony_ci    WebviewController* webviewController = GetWebviewController(env, info);
57900826e83eSopenharmony_ci    if (!webviewController) {
57910826e83eSopenharmony_ci        WVLOG_E("SetBackForwardCacheOptions: Init webview controller error.");
57920826e83eSopenharmony_ci        return result;
57930826e83eSopenharmony_ci    }
57940826e83eSopenharmony_ci
57950826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
57960826e83eSopenharmony_ci        WVLOG_E("SetBackForwardCacheOptions: wrong number of params.");
57970826e83eSopenharmony_ci        webviewController->SetBackForwardCacheOptions(
57980826e83eSopenharmony_ci            BFCACHE_DEFAULT_SIZE, BFCACHE_DEFAULT_TIMETOLIVE);
57990826e83eSopenharmony_ci        NAPI_CALL(env, napi_get_undefined(env, &result));
58000826e83eSopenharmony_ci        return result;
58010826e83eSopenharmony_ci    }
58020826e83eSopenharmony_ci
58030826e83eSopenharmony_ci    int32_t size = BFCACHE_DEFAULT_SIZE;
58040826e83eSopenharmony_ci    int32_t timeToLive = BFCACHE_DEFAULT_TIMETOLIVE;
58050826e83eSopenharmony_ci    napi_value sizeObj = nullptr;
58060826e83eSopenharmony_ci    napi_value timeToLiveObj = nullptr;
58070826e83eSopenharmony_ci    if (napi_get_named_property(env, argv[INTEGER_ZERO], "size", &sizeObj) == napi_ok) {
58080826e83eSopenharmony_ci        if (!NapiParseUtils::ParseInt32(env, sizeObj, size)) {
58090826e83eSopenharmony_ci            size = BFCACHE_DEFAULT_SIZE;
58100826e83eSopenharmony_ci        }
58110826e83eSopenharmony_ci    }
58120826e83eSopenharmony_ci
58130826e83eSopenharmony_ci    if (napi_get_named_property(env, argv[INTEGER_ZERO], "timeToLive", &timeToLiveObj) == napi_ok) {
58140826e83eSopenharmony_ci        if (!NapiParseUtils::ParseInt32(env, timeToLiveObj, timeToLive)) {
58150826e83eSopenharmony_ci            timeToLive = BFCACHE_DEFAULT_TIMETOLIVE;
58160826e83eSopenharmony_ci        }
58170826e83eSopenharmony_ci    }
58180826e83eSopenharmony_ci
58190826e83eSopenharmony_ci    webviewController->SetBackForwardCacheOptions(size, timeToLive);
58200826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
58210826e83eSopenharmony_ci    return result;
58220826e83eSopenharmony_ci}
58230826e83eSopenharmony_ci
58240826e83eSopenharmony_cinapi_value NapiWebviewController::WarmupServiceWorker(napi_env env, napi_callback_info info)
58250826e83eSopenharmony_ci{
58260826e83eSopenharmony_ci    napi_value thisVar = nullptr;
58270826e83eSopenharmony_ci    napi_value result = nullptr;
58280826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
58290826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
58300826e83eSopenharmony_ci    napi_get_undefined(env, &result);
58310826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
58320826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
58330826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
58340826e83eSopenharmony_ci        return result;
58350826e83eSopenharmony_ci    }
58360826e83eSopenharmony_ci
58370826e83eSopenharmony_ci    std::string url;
58380826e83eSopenharmony_ci    if (!ParsePrepareUrl(env, argv[INTEGER_ZERO], url)) {
58390826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, INVALID_URL);
58400826e83eSopenharmony_ci        return result;
58410826e83eSopenharmony_ci    }
58420826e83eSopenharmony_ci
58430826e83eSopenharmony_ci    NWebHelper::Instance().WarmupServiceWorker(url);
58440826e83eSopenharmony_ci    return result;
58450826e83eSopenharmony_ci}
58460826e83eSopenharmony_ci
58470826e83eSopenharmony_cinapi_value NapiWebviewController::InjectOfflineResources(napi_env env, napi_callback_info info)
58480826e83eSopenharmony_ci{
58490826e83eSopenharmony_ci    napi_value thisVar = nullptr;
58500826e83eSopenharmony_ci    napi_value result = nullptr;
58510826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
58520826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = {0};
58530826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
58540826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
58550826e83eSopenharmony_ci        WVLOG_E("BusinessError: 401. Args count of 'InjectOfflineResource' must be 1.");
58560826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
58570826e83eSopenharmony_ci        return result;
58580826e83eSopenharmony_ci    }
58590826e83eSopenharmony_ci
58600826e83eSopenharmony_ci    napi_value resourcesList = argv[INTEGER_ZERO];
58610826e83eSopenharmony_ci    bool isArray = false;
58620826e83eSopenharmony_ci    napi_is_array(env, resourcesList, &isArray);
58630826e83eSopenharmony_ci    if (!isArray) {
58640826e83eSopenharmony_ci        WVLOG_E("BusinessError: 401. The type of 'resourceMaps' must be Array");
58650826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
58660826e83eSopenharmony_ci        return result;
58670826e83eSopenharmony_ci    }
58680826e83eSopenharmony_ci
58690826e83eSopenharmony_ci    AddResourcesToMemoryCache(env, info, resourcesList);
58700826e83eSopenharmony_ci    return result;
58710826e83eSopenharmony_ci}
58720826e83eSopenharmony_ci
58730826e83eSopenharmony_civoid NapiWebviewController::AddResourcesToMemoryCache(napi_env env,
58740826e83eSopenharmony_ci                                                      napi_callback_info info,
58750826e83eSopenharmony_ci                                                      napi_value& resourcesList)
58760826e83eSopenharmony_ci{
58770826e83eSopenharmony_ci    uint32_t resourcesCount = 0;
58780826e83eSopenharmony_ci    napi_get_array_length(env, resourcesList, &resourcesCount);
58790826e83eSopenharmony_ci
58800826e83eSopenharmony_ci    if (resourcesCount > MAX_RESOURCES_COUNT || resourcesCount == 0) {
58810826e83eSopenharmony_ci        WVLOG_E("BusinessError: 401. The size of 'resourceMaps' must less than %{public}zu and not 0",
58820826e83eSopenharmony_ci            MAX_RESOURCES_COUNT);
58830826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
58840826e83eSopenharmony_ci        return;
58850826e83eSopenharmony_ci    }
58860826e83eSopenharmony_ci
58870826e83eSopenharmony_ci    for (uint32_t i = 0 ; i < resourcesCount ; i++) {
58880826e83eSopenharmony_ci        napi_value urlListObj = nullptr;
58890826e83eSopenharmony_ci        napi_value resourceObj = nullptr;
58900826e83eSopenharmony_ci        napi_value headersObj = nullptr;
58910826e83eSopenharmony_ci        napi_value typeObj = nullptr;
58920826e83eSopenharmony_ci        napi_value obj = nullptr;
58930826e83eSopenharmony_ci
58940826e83eSopenharmony_ci        napi_create_array(env, &headersObj);
58950826e83eSopenharmony_ci        napi_create_array(env, &urlListObj);
58960826e83eSopenharmony_ci
58970826e83eSopenharmony_ci        napi_get_element(env, resourcesList, i, &obj);
58980826e83eSopenharmony_ci        if ((napi_get_named_property(env, obj, "urlList", &urlListObj) != napi_ok) ||
58990826e83eSopenharmony_ci            (napi_get_named_property(env, obj, "resource", &resourceObj) != napi_ok) ||
59000826e83eSopenharmony_ci            (napi_get_named_property(env, obj, "responseHeaders", &headersObj) != napi_ok) ||
59010826e83eSopenharmony_ci            (napi_get_named_property(env, obj, "type", &typeObj) != napi_ok)) {
59020826e83eSopenharmony_ci            WVLOG_E("InjectOfflineResources: parse params from resource map failed.");
59030826e83eSopenharmony_ci            BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
59040826e83eSopenharmony_ci            continue;
59050826e83eSopenharmony_ci        }
59060826e83eSopenharmony_ci
59070826e83eSopenharmony_ci        OfflineResourceValue resourceValue;
59080826e83eSopenharmony_ci        resourceValue.urlList = urlListObj;
59090826e83eSopenharmony_ci        resourceValue.resource = resourceObj;
59100826e83eSopenharmony_ci        resourceValue.responseHeaders = headersObj;
59110826e83eSopenharmony_ci        resourceValue.type = typeObj;
59120826e83eSopenharmony_ci        AddResourceItemToMemoryCache(env, info, resourceValue);
59130826e83eSopenharmony_ci    }
59140826e83eSopenharmony_ci}
59150826e83eSopenharmony_ci
59160826e83eSopenharmony_civoid NapiWebviewController::AddResourceItemToMemoryCache(napi_env env,
59170826e83eSopenharmony_ci                                                         napi_callback_info info,
59180826e83eSopenharmony_ci                                                         OfflineResourceValue resourceValue)
59190826e83eSopenharmony_ci{
59200826e83eSopenharmony_ci    WebviewController* webviewController = GetWebviewController(env, info);
59210826e83eSopenharmony_ci    if (!webviewController) {
59220826e83eSopenharmony_ci        WVLOG_E("InjectOfflineResource: init webview controller error.");
59230826e83eSopenharmony_ci        return;
59240826e83eSopenharmony_ci    }
59250826e83eSopenharmony_ci
59260826e83eSopenharmony_ci    std::vector<std::string> urlList;
59270826e83eSopenharmony_ci    ParseURLResult result = webviewController->ParseURLList(env, resourceValue.urlList, urlList);
59280826e83eSopenharmony_ci    if (result != ParseURLResult::OK) {
59290826e83eSopenharmony_ci        auto errCode = result == ParseURLResult::FAILED ? PARAM_CHECK_ERROR : INVALID_URL;
59300826e83eSopenharmony_ci        if (errCode == PARAM_CHECK_ERROR) {
59310826e83eSopenharmony_ci            WVLOG_E("BusinessError: 401. The type of 'urlList' must be Array of string.");
59320826e83eSopenharmony_ci        }
59330826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, errCode);
59340826e83eSopenharmony_ci        return;
59350826e83eSopenharmony_ci    }
59360826e83eSopenharmony_ci
59370826e83eSopenharmony_ci    std::vector<uint8_t> resource = webviewController->ParseUint8Array(env, resourceValue.resource);
59380826e83eSopenharmony_ci    if (resource.empty() || resource.size() > MAX_RESOURCE_SIZE) {
59390826e83eSopenharmony_ci        WVLOG_E("BusinessError: 401. The type of 'resource' must be Uint8Array. "
59400826e83eSopenharmony_ci            "'resource' size must less than %{public}zu and must not be empty.", MAX_RESOURCE_SIZE);
59410826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
59420826e83eSopenharmony_ci        return;
59430826e83eSopenharmony_ci    }
59440826e83eSopenharmony_ci
59450826e83eSopenharmony_ci    std::map<std::string, std::string> responseHeaders;
59460826e83eSopenharmony_ci    if (!webviewController->ParseResponseHeaders(env, resourceValue.responseHeaders, responseHeaders)) {
59470826e83eSopenharmony_ci        WVLOG_E("BusinessError: 401. The type of 'responseHeaders' must be Array of 'WebHeader'.");
59480826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
59490826e83eSopenharmony_ci        return;
59500826e83eSopenharmony_ci    }
59510826e83eSopenharmony_ci
59520826e83eSopenharmony_ci    uint32_t type = 0;
59530826e83eSopenharmony_ci    if (!NapiParseUtils::ParseUint32(env, resourceValue.type, type)) {
59540826e83eSopenharmony_ci        WVLOG_E("BusinessError: 401. The type of 'type' must be one kind of 'OfflineResourceType'.");
59550826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
59560826e83eSopenharmony_ci        return;
59570826e83eSopenharmony_ci    }
59580826e83eSopenharmony_ci
59590826e83eSopenharmony_ci    webviewController->InjectOfflineResource(urlList, resource, responseHeaders, type);
59600826e83eSopenharmony_ci}
59610826e83eSopenharmony_ci
59620826e83eSopenharmony_cinapi_value NapiWebviewController::SetHostIP(napi_env env, napi_callback_info info)
59630826e83eSopenharmony_ci{
59640826e83eSopenharmony_ci    napi_value thisVar = nullptr;
59650826e83eSopenharmony_ci    napi_value result = nullptr;
59660826e83eSopenharmony_ci    size_t argc = INTEGER_THREE;
59670826e83eSopenharmony_ci    napi_value argv[INTEGER_THREE] = { 0 };
59680826e83eSopenharmony_ci    std::string hostName;
59690826e83eSopenharmony_ci    std::string address;
59700826e83eSopenharmony_ci    int32_t aliveTime = INTEGER_ZERO;
59710826e83eSopenharmony_ci
59720826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
59730826e83eSopenharmony_ci    if (argc != INTEGER_THREE) {
59740826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
59750826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "three"));
59760826e83eSopenharmony_ci        return result;
59770826e83eSopenharmony_ci    }
59780826e83eSopenharmony_ci
59790826e83eSopenharmony_ci    if (!NapiParseUtils::ParseString(env, argv[INTEGER_ZERO], hostName) ||
59800826e83eSopenharmony_ci        !NapiParseUtils::ParseString(env, argv[INTEGER_ONE], address) ||
59810826e83eSopenharmony_ci        !NapiParseUtils::ParseInt32(env, argv[INTEGER_TWO], aliveTime) ||
59820826e83eSopenharmony_ci        aliveTime <= 0) {
59830826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR, ParamCheckErrorMsgTemplate::PARAM_TYEPS_ERROR);
59840826e83eSopenharmony_ci        return result;
59850826e83eSopenharmony_ci    }
59860826e83eSopenharmony_ci
59870826e83eSopenharmony_ci    if (!ParseIP(env, argv[INTEGER_ONE], address)) {
59880826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
59890826e83eSopenharmony_ci            "BusinessError 401: IP address error.");
59900826e83eSopenharmony_ci        return result;
59910826e83eSopenharmony_ci    }
59920826e83eSopenharmony_ci
59930826e83eSopenharmony_ci    NWebHelper::Instance().SetHostIP(hostName, address, aliveTime);
59940826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
59950826e83eSopenharmony_ci
59960826e83eSopenharmony_ci    return result;
59970826e83eSopenharmony_ci}
59980826e83eSopenharmony_ci
59990826e83eSopenharmony_cinapi_value NapiWebviewController::ClearHostIP(napi_env env, napi_callback_info info)
60000826e83eSopenharmony_ci{
60010826e83eSopenharmony_ci    napi_value thisVar = nullptr;
60020826e83eSopenharmony_ci    napi_value result = nullptr;
60030826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
60040826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
60050826e83eSopenharmony_ci    std::string hostName;
60060826e83eSopenharmony_ci
60070826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
60080826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
60090826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
60100826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
60110826e83eSopenharmony_ci        return result;
60120826e83eSopenharmony_ci    }
60130826e83eSopenharmony_ci
60140826e83eSopenharmony_ci    if (!NapiParseUtils::ParseString(env, argv[INTEGER_ZERO], hostName)) {
60150826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
60160826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "hostName", "string"));
60170826e83eSopenharmony_ci        return result;
60180826e83eSopenharmony_ci    }
60190826e83eSopenharmony_ci
60200826e83eSopenharmony_ci    NWebHelper::Instance().ClearHostIP(hostName);
60210826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
60220826e83eSopenharmony_ci    return result;
60230826e83eSopenharmony_ci}
60240826e83eSopenharmony_ci
60250826e83eSopenharmony_cinapi_value NapiWebviewController::EnableWholeWebPageDrawing(
60260826e83eSopenharmony_ci    napi_env env, napi_callback_info info)
60270826e83eSopenharmony_ci{
60280826e83eSopenharmony_ci    napi_value result = nullptr;
60290826e83eSopenharmony_ci    NWebHelper::Instance().EnableWholeWebPageDrawing();
60300826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
60310826e83eSopenharmony_ci    return result;
60320826e83eSopenharmony_ci}
60330826e83eSopenharmony_ci
60340826e83eSopenharmony_cinapi_value NapiWebviewController::EnableAdsBlock(
60350826e83eSopenharmony_ci    napi_env env, napi_callback_info info)
60360826e83eSopenharmony_ci{
60370826e83eSopenharmony_ci    napi_value result = nullptr;
60380826e83eSopenharmony_ci    napi_value thisVar = nullptr;
60390826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
60400826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
60410826e83eSopenharmony_ci
60420826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
60430826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
60440826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
60450826e83eSopenharmony_ci        WVLOG_E("EnableAdsBlock: args count is not allowed.");
60460826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
60470826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
60480826e83eSopenharmony_ci        return result;
60490826e83eSopenharmony_ci    }
60500826e83eSopenharmony_ci
60510826e83eSopenharmony_ci    bool enabled = false;
60520826e83eSopenharmony_ci    if (!NapiParseUtils::ParseBoolean(env, argv[INTEGER_ZERO], enabled)) {
60530826e83eSopenharmony_ci        WVLOG_E("EnableAdsBlock: the given enabled is not allowed.");
60540826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
60550826e83eSopenharmony_ci            "BusinessError 401: Parameter error. The type of 'enable' must be boolean.");
60560826e83eSopenharmony_ci        return result;
60570826e83eSopenharmony_ci    }
60580826e83eSopenharmony_ci
60590826e83eSopenharmony_ci    WebviewController *webviewController = GetWebviewController(env, info);
60600826e83eSopenharmony_ci    if (!webviewController) {
60610826e83eSopenharmony_ci        WVLOG_E("EnableAdsBlock: init webview controller error.");
60620826e83eSopenharmony_ci        return result;
60630826e83eSopenharmony_ci    }
60640826e83eSopenharmony_ci
60650826e83eSopenharmony_ci    WVLOG_I("EnableAdsBlock: %{public}s", (enabled ? "true" : "false"));
60660826e83eSopenharmony_ci    webviewController->EnableAdsBlock(enabled);
60670826e83eSopenharmony_ci    return result;
60680826e83eSopenharmony_ci}
60690826e83eSopenharmony_ci
60700826e83eSopenharmony_cinapi_value NapiWebviewController::IsAdsBlockEnabled(napi_env env, napi_callback_info info)
60710826e83eSopenharmony_ci{
60720826e83eSopenharmony_ci    napi_value result = nullptr;
60730826e83eSopenharmony_ci    WebviewController *webviewController = GetWebviewController(env, info);
60740826e83eSopenharmony_ci    if (!webviewController) {
60750826e83eSopenharmony_ci        return nullptr;
60760826e83eSopenharmony_ci    }
60770826e83eSopenharmony_ci
60780826e83eSopenharmony_ci    bool isAdsBlockEnabled = webviewController->IsAdsBlockEnabled();
60790826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_boolean(env, isAdsBlockEnabled, &result));
60800826e83eSopenharmony_ci    return result;
60810826e83eSopenharmony_ci}
60820826e83eSopenharmony_ci
60830826e83eSopenharmony_cinapi_value NapiWebviewController::IsAdsBlockEnabledForCurPage(napi_env env, napi_callback_info info)
60840826e83eSopenharmony_ci{
60850826e83eSopenharmony_ci    napi_value result = nullptr;
60860826e83eSopenharmony_ci    WebviewController *webviewController = GetWebviewController(env, info);
60870826e83eSopenharmony_ci    if (!webviewController) {
60880826e83eSopenharmony_ci        return nullptr;
60890826e83eSopenharmony_ci    }
60900826e83eSopenharmony_ci
60910826e83eSopenharmony_ci    bool isAdsBlockEnabledForCurPage = webviewController->IsAdsBlockEnabledForCurPage();
60920826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_boolean(env, isAdsBlockEnabledForCurPage, &result));
60930826e83eSopenharmony_ci    return result;
60940826e83eSopenharmony_ci}
60950826e83eSopenharmony_ci
60960826e83eSopenharmony_cinapi_value NapiWebviewController::GetSurfaceId(napi_env env, napi_callback_info info)
60970826e83eSopenharmony_ci{
60980826e83eSopenharmony_ci    napi_value result = nullptr;
60990826e83eSopenharmony_ci    WebviewController *webviewController = GetWebviewController(env, info);
61000826e83eSopenharmony_ci    if (!webviewController) {
61010826e83eSopenharmony_ci        return nullptr;
61020826e83eSopenharmony_ci    }
61030826e83eSopenharmony_ci
61040826e83eSopenharmony_ci    std::string surfaceId = webviewController->GetSurfaceId();
61050826e83eSopenharmony_ci    napi_create_string_utf8(env, surfaceId.c_str(), surfaceId.length(), &result);
61060826e83eSopenharmony_ci    return result;
61070826e83eSopenharmony_ci}
61080826e83eSopenharmony_ci
61090826e83eSopenharmony_cinapi_value NapiWebviewController::UpdateInstanceId(napi_env env, napi_callback_info info)
61100826e83eSopenharmony_ci{
61110826e83eSopenharmony_ci    WVLOG_D("Instance changed");
61120826e83eSopenharmony_ci    napi_value result = nullptr;
61130826e83eSopenharmony_ci    napi_value thisVar = nullptr;
61140826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
61150826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
61160826e83eSopenharmony_ci
61170826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
61180826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
61190826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
61200826e83eSopenharmony_ci        return result;
61210826e83eSopenharmony_ci    }
61220826e83eSopenharmony_ci
61230826e83eSopenharmony_ci    int32_t newId = 0;
61240826e83eSopenharmony_ci    if (!NapiParseUtils::ParseInt32(env, argv[INTEGER_ZERO], newId)) {
61250826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
61260826e83eSopenharmony_ci        return result;
61270826e83eSopenharmony_ci    }
61280826e83eSopenharmony_ci
61290826e83eSopenharmony_ci    WebviewController *webviewController = nullptr;
61300826e83eSopenharmony_ci    napi_status status = napi_unwrap(env, thisVar, (void **)&webviewController);
61310826e83eSopenharmony_ci    if ((!webviewController) || (status != napi_ok) || !webviewController->IsInit()) {
61320826e83eSopenharmony_ci        return result;
61330826e83eSopenharmony_ci    }
61340826e83eSopenharmony_ci
61350826e83eSopenharmony_ci    webviewController->UpdateInstanceId(newId);
61360826e83eSopenharmony_ci
61370826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
61380826e83eSopenharmony_ci    return result;
61390826e83eSopenharmony_ci}
61400826e83eSopenharmony_ci
61410826e83eSopenharmony_cinapi_value NapiWebviewController::SetUrlTrustList(napi_env env, napi_callback_info info)
61420826e83eSopenharmony_ci{
61430826e83eSopenharmony_ci    WVLOG_D("SetUrlTrustList invoked");
61440826e83eSopenharmony_ci
61450826e83eSopenharmony_ci    napi_value result = nullptr;
61460826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
61470826e83eSopenharmony_ci
61480826e83eSopenharmony_ci    napi_value thisVar = nullptr;
61490826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
61500826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
61510826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
61520826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
61530826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
61540826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
61550826e83eSopenharmony_ci        return result;
61560826e83eSopenharmony_ci    }
61570826e83eSopenharmony_ci
61580826e83eSopenharmony_ci    std::string urlTrustList;
61590826e83eSopenharmony_ci    if (!NapiParseUtils::ParseString(env, argv[0], urlTrustList)) {
61600826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
61610826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "urlTrustList", "string"));
61620826e83eSopenharmony_ci        return result;
61630826e83eSopenharmony_ci    }
61640826e83eSopenharmony_ci    if (urlTrustList.size() > MAX_URL_TRUST_LIST_STR_LEN) {
61650826e83eSopenharmony_ci        WVLOG_E("EnableAdsBlock: url trust list len is too large.");
61660826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
61670826e83eSopenharmony_ci        return result;
61680826e83eSopenharmony_ci    }
61690826e83eSopenharmony_ci
61700826e83eSopenharmony_ci    WebviewController* webviewController = GetWebviewController(env, info);
61710826e83eSopenharmony_ci    if (!webviewController) {
61720826e83eSopenharmony_ci        WVLOG_E("webview controller is null or not init");
61730826e83eSopenharmony_ci        return result;
61740826e83eSopenharmony_ci    }
61750826e83eSopenharmony_ci
61760826e83eSopenharmony_ci    std::string detailMsg;
61770826e83eSopenharmony_ci    ErrCode ret = webviewController->SetUrlTrustList(urlTrustList, detailMsg);
61780826e83eSopenharmony_ci    if (ret != NO_ERROR) {
61790826e83eSopenharmony_ci        WVLOG_E("SetUrlTrustList failed, error code: %{public}d", ret);
61800826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, ret,
61810826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_DETAIL_ERROR_MSG, detailMsg.c_str()));
61820826e83eSopenharmony_ci        return result;
61830826e83eSopenharmony_ci    }
61840826e83eSopenharmony_ci    return result;
61850826e83eSopenharmony_ci}
61860826e83eSopenharmony_ci
61870826e83eSopenharmony_ciWebSnapshotCallback CreateWebPageSnapshotResultCallback(
61880826e83eSopenharmony_ci    napi_env env, napi_ref jsCallback, bool check, int32_t inputWidth, int32_t inputHeight)
61890826e83eSopenharmony_ci{
61900826e83eSopenharmony_ci    return
61910826e83eSopenharmony_ci        [env, jCallback = std::move(jsCallback), check, inputWidth, inputHeight](
61920826e83eSopenharmony_ci            const char *returnId, bool returnStatus, float radio, void *returnData,
61930826e83eSopenharmony_ci            int returnWidth, int returnHeight) {
61940826e83eSopenharmony_ci            WVLOG_I("WebPageSnapshot return napi callback");
61950826e83eSopenharmony_ci            napi_value jsResult = nullptr;
61960826e83eSopenharmony_ci            napi_create_object(env, &jsResult);
61970826e83eSopenharmony_ci
61980826e83eSopenharmony_ci            napi_value jsPixelMap = nullptr;
61990826e83eSopenharmony_ci            Media::InitializationOptions opt;
62000826e83eSopenharmony_ci            opt.size.width = static_cast<int32_t>(returnWidth);
62010826e83eSopenharmony_ci            opt.size.height = static_cast<int32_t>(returnHeight);
62020826e83eSopenharmony_ci            opt.pixelFormat = Media::PixelFormat::RGBA_8888;
62030826e83eSopenharmony_ci            opt.alphaType = Media::AlphaType::IMAGE_ALPHA_TYPE_OPAQUE;
62040826e83eSopenharmony_ci            opt.editable = true;
62050826e83eSopenharmony_ci            auto pixelMap = Media::PixelMap::Create(opt);
62060826e83eSopenharmony_ci            if (pixelMap != nullptr) {
62070826e83eSopenharmony_ci                uint64_t stride = static_cast<uint64_t>(returnWidth) << 2;
62080826e83eSopenharmony_ci                uint64_t bufferSize = stride * static_cast<uint64_t>(returnHeight);
62090826e83eSopenharmony_ci                pixelMap->WritePixels(static_cast<const uint8_t *>(returnData), bufferSize);
62100826e83eSopenharmony_ci                std::shared_ptr<Media::PixelMap> pixelMapToJs(pixelMap.release());
62110826e83eSopenharmony_ci                jsPixelMap = OHOS::Media::PixelMapNapi::CreatePixelMap(env, pixelMapToJs);
62120826e83eSopenharmony_ci            } else {
62130826e83eSopenharmony_ci                WVLOG_E("WebPageSnapshot create pixel map error");
62140826e83eSopenharmony_ci            }
62150826e83eSopenharmony_ci            napi_set_named_property(env, jsResult, "imagePixelMap", jsPixelMap);
62160826e83eSopenharmony_ci
62170826e83eSopenharmony_ci            int returnJsWidth = 0;
62180826e83eSopenharmony_ci            int returnJsHeight = 0;
62190826e83eSopenharmony_ci            if (radio > 0) {
62200826e83eSopenharmony_ci                returnJsWidth = returnWidth / radio;
62210826e83eSopenharmony_ci                returnJsHeight = returnHeight / radio;
62220826e83eSopenharmony_ci            }
62230826e83eSopenharmony_ci            if (check) {
62240826e83eSopenharmony_ci                if (std::abs(returnJsWidth - inputWidth) < INTEGER_THREE) {
62250826e83eSopenharmony_ci                    returnJsWidth = inputWidth;
62260826e83eSopenharmony_ci                }
62270826e83eSopenharmony_ci
62280826e83eSopenharmony_ci                if (std::abs(returnJsHeight - inputHeight) < INTEGER_THREE) {
62290826e83eSopenharmony_ci                    returnJsHeight = inputHeight;
62300826e83eSopenharmony_ci                }
62310826e83eSopenharmony_ci            }
62320826e83eSopenharmony_ci            napi_value jsSizeObj = nullptr;
62330826e83eSopenharmony_ci            napi_create_object(env, &jsSizeObj);
62340826e83eSopenharmony_ci            napi_value jsSize[2] = {0};
62350826e83eSopenharmony_ci            napi_create_int32(env, returnJsWidth, &jsSize[0]);
62360826e83eSopenharmony_ci            napi_create_int32(env, returnJsHeight, &jsSize[1]);
62370826e83eSopenharmony_ci            napi_set_named_property(env, jsSizeObj, "width", jsSize[0]);
62380826e83eSopenharmony_ci            napi_set_named_property(env, jsSizeObj, "height", jsSize[1]);
62390826e83eSopenharmony_ci            napi_set_named_property(env, jsResult, "size", jsSizeObj);
62400826e83eSopenharmony_ci
62410826e83eSopenharmony_ci            napi_value jsId = nullptr;
62420826e83eSopenharmony_ci            napi_create_string_utf8(env, returnId, strlen(returnId), &jsId);
62430826e83eSopenharmony_ci            napi_set_named_property(env, jsResult, "id", jsId);
62440826e83eSopenharmony_ci
62450826e83eSopenharmony_ci            napi_value jsStatus = nullptr;
62460826e83eSopenharmony_ci            napi_get_boolean(env, returnStatus, &jsStatus);
62470826e83eSopenharmony_ci            napi_set_named_property(env, jsResult, "status", jsStatus);
62480826e83eSopenharmony_ci
62490826e83eSopenharmony_ci            napi_value jsError = nullptr;
62500826e83eSopenharmony_ci            napi_get_undefined(env, &jsError);
62510826e83eSopenharmony_ci            napi_value args[INTEGER_TWO] = {jsError, jsResult};
62520826e83eSopenharmony_ci
62530826e83eSopenharmony_ci            napi_value callback = nullptr;
62540826e83eSopenharmony_ci            napi_value callbackResult = nullptr;
62550826e83eSopenharmony_ci            napi_get_reference_value(env, jCallback, &callback);
62560826e83eSopenharmony_ci
62570826e83eSopenharmony_ci            napi_call_function(env, nullptr, callback, INTEGER_TWO, args, &callbackResult);
62580826e83eSopenharmony_ci            napi_delete_reference(env, jCallback);
62590826e83eSopenharmony_ci            g_inWebPageSnapshot = false;
62600826e83eSopenharmony_ci        };
62610826e83eSopenharmony_ci}
62620826e83eSopenharmony_ci
62630826e83eSopenharmony_cinapi_value NapiWebviewController::WebPageSnapshot(napi_env env, napi_callback_info info)
62640826e83eSopenharmony_ci{
62650826e83eSopenharmony_ci    napi_value thisVar = nullptr;
62660826e83eSopenharmony_ci    napi_value result = nullptr;
62670826e83eSopenharmony_ci    size_t argc = INTEGER_TWO;
62680826e83eSopenharmony_ci    napi_value argv[INTEGER_TWO] = {0};
62690826e83eSopenharmony_ci
62700826e83eSopenharmony_ci    napi_get_undefined(env, &result);
62710826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
62720826e83eSopenharmony_ci
62730826e83eSopenharmony_ci    if (argc != INTEGER_TWO) {
62740826e83eSopenharmony_ci        WVLOG_E("WebPageSnapshot: args count is not allowed.");
62750826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
62760826e83eSopenharmony_ci        return result;
62770826e83eSopenharmony_ci    }
62780826e83eSopenharmony_ci
62790826e83eSopenharmony_ci    napi_ref callback = nullptr;
62800826e83eSopenharmony_ci    napi_create_reference(env, argv[INTEGER_ONE], INTEGER_ONE, &callback);
62810826e83eSopenharmony_ci    if (!callback) {
62820826e83eSopenharmony_ci        WVLOG_E("WebPageSnapshot failed to create reference for callback");
62830826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR);
62840826e83eSopenharmony_ci        return result;
62850826e83eSopenharmony_ci    }
62860826e83eSopenharmony_ci
62870826e83eSopenharmony_ci    WebviewController *webviewController = GetWebviewController(env, info);
62880826e83eSopenharmony_ci    if (!webviewController) {
62890826e83eSopenharmony_ci        WVLOG_E("WebPageSnapshot init webview controller error.");
62900826e83eSopenharmony_ci        napi_delete_reference(env, callback);
62910826e83eSopenharmony_ci        return result;
62920826e83eSopenharmony_ci    }
62930826e83eSopenharmony_ci
62940826e83eSopenharmony_ci    if (g_inWebPageSnapshot) {
62950826e83eSopenharmony_ci        JsErrorCallback(env, std::move(callback), FUNCTION_NOT_ENABLE);
62960826e83eSopenharmony_ci        napi_delete_reference(env, callback);
62970826e83eSopenharmony_ci        return result;
62980826e83eSopenharmony_ci    }
62990826e83eSopenharmony_ci    g_inWebPageSnapshot = true;
63000826e83eSopenharmony_ci
63010826e83eSopenharmony_ci    napi_value snapshotId = nullptr;
63020826e83eSopenharmony_ci    napi_value snapshotSize = nullptr;
63030826e83eSopenharmony_ci    napi_value snapshotSizeWidth = nullptr;
63040826e83eSopenharmony_ci    napi_value snapshotSizeHeight = nullptr;
63050826e83eSopenharmony_ci
63060826e83eSopenharmony_ci    std::string nativeSnapshotId = "";
63070826e83eSopenharmony_ci    int32_t nativeSnapshotSizeWidth = 0;
63080826e83eSopenharmony_ci    int32_t nativeSnapshotSizeHeight = 0;
63090826e83eSopenharmony_ci    PixelUnit nativeSnapshotSizeWidthType = PixelUnit::NONE;
63100826e83eSopenharmony_ci    PixelUnit nativeSnapshotSizeHeightType = PixelUnit::NONE;
63110826e83eSopenharmony_ci    PixelUnit nativeSnapshotSizeType = PixelUnit::NONE;
63120826e83eSopenharmony_ci
63130826e83eSopenharmony_ci    if (napi_get_named_property(env, argv[INTEGER_ZERO], "id", &snapshotId) == napi_ok) {
63140826e83eSopenharmony_ci        NapiParseUtils::ParseString(env, snapshotId, nativeSnapshotId);
63150826e83eSopenharmony_ci    }
63160826e83eSopenharmony_ci
63170826e83eSopenharmony_ci    if (napi_get_named_property(env, argv[INTEGER_ZERO], "size", &snapshotSize) == napi_ok) {
63180826e83eSopenharmony_ci        if (napi_get_named_property(env, snapshotSize, "width", &snapshotSizeWidth) == napi_ok) {
63190826e83eSopenharmony_ci            if (!webviewController->ParseJsLengthToInt(env, snapshotSizeWidth,
63200826e83eSopenharmony_ci                                                       nativeSnapshotSizeWidthType,
63210826e83eSopenharmony_ci                                                       nativeSnapshotSizeWidth)) {
63220826e83eSopenharmony_ci                JsErrorCallback(env, std::move(callback), PARAM_CHECK_ERROR);
63230826e83eSopenharmony_ci                g_inWebPageSnapshot = false;
63240826e83eSopenharmony_ci                napi_delete_reference(env, callback);
63250826e83eSopenharmony_ci                return result;
63260826e83eSopenharmony_ci            }
63270826e83eSopenharmony_ci        }
63280826e83eSopenharmony_ci        if (napi_get_named_property(env, snapshotSize, "height", &snapshotSizeHeight) == napi_ok) {
63290826e83eSopenharmony_ci            if (!webviewController->ParseJsLengthToInt(env, snapshotSizeHeight,
63300826e83eSopenharmony_ci                                                       nativeSnapshotSizeHeightType,
63310826e83eSopenharmony_ci                                                       nativeSnapshotSizeHeight)) {
63320826e83eSopenharmony_ci                JsErrorCallback(env, std::move(callback), PARAM_CHECK_ERROR);
63330826e83eSopenharmony_ci                g_inWebPageSnapshot = false;
63340826e83eSopenharmony_ci                napi_delete_reference(env, callback);
63350826e83eSopenharmony_ci                return result;
63360826e83eSopenharmony_ci            }
63370826e83eSopenharmony_ci        }
63380826e83eSopenharmony_ci    }
63390826e83eSopenharmony_ci
63400826e83eSopenharmony_ci    if (nativeSnapshotSizeWidthType != PixelUnit::NONE && nativeSnapshotSizeHeightType != PixelUnit::NONE &&
63410826e83eSopenharmony_ci        nativeSnapshotSizeWidthType != nativeSnapshotSizeHeightType) {
63420826e83eSopenharmony_ci        WVLOG_E("WebPageSnapshot input different pixel unit");
63430826e83eSopenharmony_ci        JsErrorCallback(env, std::move(callback), PARAM_CHECK_ERROR);
63440826e83eSopenharmony_ci        g_inWebPageSnapshot = false;
63450826e83eSopenharmony_ci        napi_delete_reference(env, callback);
63460826e83eSopenharmony_ci        return result;
63470826e83eSopenharmony_ci    }
63480826e83eSopenharmony_ci
63490826e83eSopenharmony_ci    if (nativeSnapshotSizeWidthType != PixelUnit::NONE) {
63500826e83eSopenharmony_ci        nativeSnapshotSizeType = nativeSnapshotSizeWidthType;
63510826e83eSopenharmony_ci    }
63520826e83eSopenharmony_ci    if (nativeSnapshotSizeHeightType != PixelUnit::NONE) {
63530826e83eSopenharmony_ci        nativeSnapshotSizeType = nativeSnapshotSizeHeightType;
63540826e83eSopenharmony_ci    }
63550826e83eSopenharmony_ci    if (nativeSnapshotSizeWidth < 0 || nativeSnapshotSizeHeight < 0) {
63560826e83eSopenharmony_ci        WVLOG_E("WebPageSnapshot input pixel length less than 0");
63570826e83eSopenharmony_ci        JsErrorCallback(env, std::move(callback), PARAM_CHECK_ERROR);
63580826e83eSopenharmony_ci        g_inWebPageSnapshot = false;
63590826e83eSopenharmony_ci        napi_delete_reference(env, callback);
63600826e83eSopenharmony_ci        return result;
63610826e83eSopenharmony_ci    }
63620826e83eSopenharmony_ci    bool pixelCheck = false;
63630826e83eSopenharmony_ci    if (nativeSnapshotSizeType == PixelUnit::VP) {
63640826e83eSopenharmony_ci        pixelCheck = true;
63650826e83eSopenharmony_ci    }
63660826e83eSopenharmony_ci    WVLOG_I("WebPageSnapshot pixel type :%{public}d", static_cast<int>(nativeSnapshotSizeType));
63670826e83eSopenharmony_ci
63680826e83eSopenharmony_ci    auto resultCallback = CreateWebPageSnapshotResultCallback(
63690826e83eSopenharmony_ci        env, std::move(callback), pixelCheck, nativeSnapshotSizeWidth, nativeSnapshotSizeHeight);
63700826e83eSopenharmony_ci
63710826e83eSopenharmony_ci    ErrCode ret = webviewController->WebPageSnapshot(nativeSnapshotId.c_str(),
63720826e83eSopenharmony_ci        nativeSnapshotSizeType,
63730826e83eSopenharmony_ci        nativeSnapshotSizeWidth,
63740826e83eSopenharmony_ci        nativeSnapshotSizeHeight,
63750826e83eSopenharmony_ci        std::move(resultCallback));
63760826e83eSopenharmony_ci    if (ret != NO_ERROR) {
63770826e83eSopenharmony_ci        g_inWebPageSnapshot = false;
63780826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, ret);
63790826e83eSopenharmony_ci    }
63800826e83eSopenharmony_ci    return result;
63810826e83eSopenharmony_ci}
63820826e83eSopenharmony_ci
63830826e83eSopenharmony_cinapi_value NapiWebviewController::SetPathAllowingUniversalAccess(
63840826e83eSopenharmony_ci    napi_env env, napi_callback_info info)
63850826e83eSopenharmony_ci{
63860826e83eSopenharmony_ci    napi_value result = nullptr;
63870826e83eSopenharmony_ci    napi_value thisVar = nullptr;
63880826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
63890826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
63900826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
63910826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
63920826e83eSopenharmony_ci    WebviewController *webviewController = GetWebviewController(env, info);
63930826e83eSopenharmony_ci    if (!webviewController) {
63940826e83eSopenharmony_ci        WVLOG_E("SetPathAllowingUniversalAccess init webview controller error.");
63950826e83eSopenharmony_ci        return result;
63960826e83eSopenharmony_ci    }
63970826e83eSopenharmony_ci    bool isArray = false;
63980826e83eSopenharmony_ci    NAPI_CALL(env, napi_is_array(env, argv[INTEGER_ZERO], &isArray));
63990826e83eSopenharmony_ci    if (!isArray) {
64000826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
64010826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "pathList", "Array<string>"));
64020826e83eSopenharmony_ci        return result;
64030826e83eSopenharmony_ci    }
64040826e83eSopenharmony_ci    std::vector<std::string> pathList;
64050826e83eSopenharmony_ci    uint32_t pathCount = 0;
64060826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_array_length(env, argv[INTEGER_ZERO], &pathCount));
64070826e83eSopenharmony_ci    for (uint32_t i = 0 ; i < pathCount ; i++) {
64080826e83eSopenharmony_ci        napi_value pathItem = nullptr;
64090826e83eSopenharmony_ci        napi_get_element(env, argv[INTEGER_ZERO], i, &pathItem);
64100826e83eSopenharmony_ci        std::string path;
64110826e83eSopenharmony_ci        if (!NapiParseUtils::ParseString(env, pathItem, path)) {
64120826e83eSopenharmony_ci            BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
64130826e83eSopenharmony_ci                NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "pathList", "Array<string>"));
64140826e83eSopenharmony_ci            return result;
64150826e83eSopenharmony_ci        }
64160826e83eSopenharmony_ci        if (path.empty()) {
64170826e83eSopenharmony_ci            BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
64180826e83eSopenharmony_ci                NWebError::FormatString("BusinessError 401: Parameter error. Path: '%s' is invalid", path.c_str()));
64190826e83eSopenharmony_ci            return result;
64200826e83eSopenharmony_ci        }
64210826e83eSopenharmony_ci        pathList.emplace_back(path);
64220826e83eSopenharmony_ci    }
64230826e83eSopenharmony_ci    std::string errorPath;
64240826e83eSopenharmony_ci    webviewController->SetPathAllowingUniversalAccess(pathList, errorPath);
64250826e83eSopenharmony_ci    if (!errorPath.empty()) {
64260826e83eSopenharmony_ci        WVLOG_E("%{public}s is invalid.", errorPath.c_str());
64270826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
64280826e83eSopenharmony_ci            NWebError::FormatString("BusinessError 401: Parameter error. Path: '%s' is invalid", errorPath.c_str()));
64290826e83eSopenharmony_ci    }
64300826e83eSopenharmony_ci    return result;
64310826e83eSopenharmony_ci}
64320826e83eSopenharmony_ci
64330826e83eSopenharmony_cinapi_value NapiWebviewController::TrimMemoryByPressureLevel(napi_env env,
64340826e83eSopenharmony_ci    napi_callback_info info)
64350826e83eSopenharmony_ci{
64360826e83eSopenharmony_ci    napi_value thisVar = nullptr;
64370826e83eSopenharmony_ci    napi_value result = nullptr;
64380826e83eSopenharmony_ci    size_t argc = INTEGER_ONE;
64390826e83eSopenharmony_ci    napi_value argv[INTEGER_ONE] = { 0 };
64400826e83eSopenharmony_ci    int32_t memoryLevel;
64410826e83eSopenharmony_ci    napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
64420826e83eSopenharmony_ci    if (argc != INTEGER_ONE) {
64430826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
64440826e83eSopenharmony_ci            NWebError::FormatString(
64450826e83eSopenharmony_ci                ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
64460826e83eSopenharmony_ci        return result;
64470826e83eSopenharmony_ci    }
64480826e83eSopenharmony_ci
64490826e83eSopenharmony_ci    if (!NapiParseUtils::ParseInt32(env, argv[INTEGER_ZERO], memoryLevel)) {
64500826e83eSopenharmony_ci        BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
64510826e83eSopenharmony_ci            NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR,
64520826e83eSopenharmony_ci                                    "PressureLevel", "number"));
64530826e83eSopenharmony_ci        return result;
64540826e83eSopenharmony_ci    }
64550826e83eSopenharmony_ci
64560826e83eSopenharmony_ci    memoryLevel = memoryLevel == 1 ? 0 : memoryLevel;
64570826e83eSopenharmony_ci    NWebHelper::Instance().TrimMemoryByPressureLevel(memoryLevel);
64580826e83eSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
64590826e83eSopenharmony_ci    return result;
64600826e83eSopenharmony_ci}
64610826e83eSopenharmony_ci
64620826e83eSopenharmony_cinapi_value NapiWebviewController::GetScrollOffset(napi_env env,
64630826e83eSopenharmony_ci    napi_callback_info info)
64640826e83eSopenharmony_ci{
64650826e83eSopenharmony_ci    napi_value result = nullptr;
64660826e83eSopenharmony_ci    napi_value horizontal;
64670826e83eSopenharmony_ci    napi_value vertical;
64680826e83eSopenharmony_ci    float offsetX = 0;
64690826e83eSopenharmony_ci    float offsetY = 0;
64700826e83eSopenharmony_ci
64710826e83eSopenharmony_ci    WebviewController* webviewController = GetWebviewController(env, info);
64720826e83eSopenharmony_ci    if (!webviewController) {
64730826e83eSopenharmony_ci        return nullptr;
64740826e83eSopenharmony_ci    }
64750826e83eSopenharmony_ci
64760826e83eSopenharmony_ci    webviewController->GetScrollOffset(&offsetX, &offsetY);
64770826e83eSopenharmony_ci
64780826e83eSopenharmony_ci    napi_create_object(env, &result);
64790826e83eSopenharmony_ci    napi_create_double(env, static_cast<double>(offsetX), &horizontal);
64800826e83eSopenharmony_ci    napi_create_double(env, static_cast<double>(offsetY), &vertical);
64810826e83eSopenharmony_ci    napi_set_named_property(env, result, "x", horizontal);
64820826e83eSopenharmony_ci    napi_set_named_property(env, result, "y", vertical);
64830826e83eSopenharmony_ci    return result;
64840826e83eSopenharmony_ci}
64850826e83eSopenharmony_ci
64860826e83eSopenharmony_cinapi_value NapiWebviewController::ScrollByWithResult(napi_env env, napi_callback_info info)
64870826e83eSopenharmony_ci{
64880826e83eSopenharmony_ci   napi_value thisVar = nullptr;
64890826e83eSopenharmony_ci   napi_value result = nullptr;
64900826e83eSopenharmony_ci   size_t argc = INTEGER_TWO;
64910826e83eSopenharmony_ci   napi_value argv[INTEGER_TWO] = { 0 };
64920826e83eSopenharmony_ci   float deltaX;
64930826e83eSopenharmony_ci   float deltaY;
64940826e83eSopenharmony_ci
64950826e83eSopenharmony_ci   napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
64960826e83eSopenharmony_ci   if (argc != INTEGER_TWO) {
64970826e83eSopenharmony_ci       BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
64980826e83eSopenharmony_ci           NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "two"));
64990826e83eSopenharmony_ci       return result;
65000826e83eSopenharmony_ci   }
65010826e83eSopenharmony_ci
65020826e83eSopenharmony_ci   if (!NapiParseUtils::ParseFloat(env, argv[INTEGER_ZERO], deltaX)) {
65030826e83eSopenharmony_ci       BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
65040826e83eSopenharmony_ci           NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "deltaX", "number"));
65050826e83eSopenharmony_ci       return result;
65060826e83eSopenharmony_ci   }
65070826e83eSopenharmony_ci
65080826e83eSopenharmony_ci   if (!NapiParseUtils::ParseFloat(env, argv[INTEGER_ONE], deltaY)) {
65090826e83eSopenharmony_ci       BusinessError::ThrowErrorByErrcode(env, PARAM_CHECK_ERROR,
65100826e83eSopenharmony_ci           NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "deltaY", "number"));
65110826e83eSopenharmony_ci       return result;
65120826e83eSopenharmony_ci   }
65130826e83eSopenharmony_ci
65140826e83eSopenharmony_ci   WebviewController *webviewController = GetWebviewController(env, info);
65150826e83eSopenharmony_ci   if (!webviewController) {
65160826e83eSopenharmony_ci       return nullptr;
65170826e83eSopenharmony_ci   }
65180826e83eSopenharmony_ci
65190826e83eSopenharmony_ci   bool scrollByWithResult = webviewController->ScrollByWithResult(deltaX, deltaY);
65200826e83eSopenharmony_ci   NAPI_CALL(env, napi_get_boolean(env, scrollByWithResult, &result));
65210826e83eSopenharmony_ci   return result;
65220826e83eSopenharmony_ci}
65230826e83eSopenharmony_ci} // namespace NWeb
65240826e83eSopenharmony_ci} // namespace OHOS
6525