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, [¶m] { 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, ¶m)) { 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", ©Number); 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