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 "webview_controller.h"
170826e83eSopenharmony_ci
180826e83eSopenharmony_ci#include <memory>
190826e83eSopenharmony_ci#include <unordered_map>
200826e83eSopenharmony_ci#include <securec.h>
210826e83eSopenharmony_ci#include <regex>
220826e83eSopenharmony_ci
230826e83eSopenharmony_ci#include "application_context.h"
240826e83eSopenharmony_ci#include "business_error.h"
250826e83eSopenharmony_ci#include "napi_parse_utils.h"
260826e83eSopenharmony_ci#include "ohos_resource_adapter_impl.h"
270826e83eSopenharmony_ci
280826e83eSopenharmony_ci#include "native_arkweb_utils.h"
290826e83eSopenharmony_ci#include "native_interface_arkweb.h"
300826e83eSopenharmony_ci#include "native_media_player_impl.h"
310826e83eSopenharmony_ci
320826e83eSopenharmony_ci#include "nweb_log.h"
330826e83eSopenharmony_ci#include "nweb_store_web_archive_callback.h"
340826e83eSopenharmony_ci#include "web_errors.h"
350826e83eSopenharmony_ci#include "webview_createpdf_execute_callback.h"
360826e83eSopenharmony_ci#include "webview_hasimage_callback.h"
370826e83eSopenharmony_ci#include "webview_javascript_execute_callback.h"
380826e83eSopenharmony_ci#include "webview_javascript_result_callback.h"
390826e83eSopenharmony_ci
400826e83eSopenharmony_ci#include "nweb_precompile_callback.h"
410826e83eSopenharmony_ci#include "nweb_cache_options_impl.h"
420826e83eSopenharmony_ci
430826e83eSopenharmony_ci#include "bundle_mgr_proxy.h"
440826e83eSopenharmony_ci#include "if_system_ability_manager.h"
450826e83eSopenharmony_ci#include "iservice_registry.h"
460826e83eSopenharmony_ci#include "parameters.h"
470826e83eSopenharmony_ci#include "system_ability_definition.h"
480826e83eSopenharmony_ci
490826e83eSopenharmony_cinamespace {
500826e83eSopenharmony_ciconstexpr int32_t PARAMZERO = 0;
510826e83eSopenharmony_ciconstexpr int32_t PARAMONE = 1;
520826e83eSopenharmony_ciconstexpr int32_t RESULT_COUNT = 2;
530826e83eSopenharmony_ciconst std::string BUNDLE_NAME_PREFIX = "bundleName:";
540826e83eSopenharmony_ciconst std::string MODULE_NAME_PREFIX = "moduleName:";
550826e83eSopenharmony_ci} // namespace
560826e83eSopenharmony_ci
570826e83eSopenharmony_cinamespace OHOS {
580826e83eSopenharmony_cinamespace NWeb {
590826e83eSopenharmony_cinamespace {
600826e83eSopenharmony_ciconstexpr uint32_t URL_MAXIMUM = 2048;
610826e83eSopenharmony_cibool GetAppBundleNameAndModuleName(std::string& bundleName, std::string& moduleName)
620826e83eSopenharmony_ci{
630826e83eSopenharmony_ci    static std::string applicationBundleName;
640826e83eSopenharmony_ci    static std::string applicationModuleName;
650826e83eSopenharmony_ci    if (!applicationBundleName.empty() && !applicationModuleName.empty()) {
660826e83eSopenharmony_ci        bundleName = applicationBundleName;
670826e83eSopenharmony_ci        moduleName = applicationModuleName;
680826e83eSopenharmony_ci        return true;
690826e83eSopenharmony_ci    }
700826e83eSopenharmony_ci    std::shared_ptr<AbilityRuntime::ApplicationContext> context =
710826e83eSopenharmony_ci        AbilityRuntime::ApplicationContext::GetApplicationContext();
720826e83eSopenharmony_ci    if (!context) {
730826e83eSopenharmony_ci        WVLOG_E("Failed to get application context.");
740826e83eSopenharmony_ci        return false;
750826e83eSopenharmony_ci    }
760826e83eSopenharmony_ci    auto resourceManager = context->GetResourceManager();
770826e83eSopenharmony_ci    if (!resourceManager) {
780826e83eSopenharmony_ci        WVLOG_E("Failed to get resource manager.");
790826e83eSopenharmony_ci        return false;
800826e83eSopenharmony_ci    }
810826e83eSopenharmony_ci    applicationBundleName = resourceManager->bundleInfo.first;
820826e83eSopenharmony_ci    applicationModuleName = resourceManager->bundleInfo.second;
830826e83eSopenharmony_ci    bundleName = applicationBundleName;
840826e83eSopenharmony_ci    moduleName = applicationModuleName;
850826e83eSopenharmony_ci    WVLOG_D("application bundleName: %{public}s, moduleName: %{public}s", bundleName.c_str(), moduleName.c_str());
860826e83eSopenharmony_ci    return true;
870826e83eSopenharmony_ci}
880826e83eSopenharmony_ci}
890826e83eSopenharmony_ciusing namespace NWebError;
900826e83eSopenharmony_cistd::mutex g_objectMtx;
910826e83eSopenharmony_cistd::unordered_map<int32_t, WebviewController*> g_webview_controller_map;
920826e83eSopenharmony_cistd::string WebviewController::customeSchemeCmdLine_ = "";
930826e83eSopenharmony_cibool WebviewController::existNweb_ = false;
940826e83eSopenharmony_cibool WebviewController::webDebuggingAccess_ = OHOS::system::GetBoolParameter("web.debug.devtools", false);
950826e83eSopenharmony_cistd::set<std::string> WebviewController::webTagSet_;
960826e83eSopenharmony_ciint32_t WebviewController::webTagStrId_ = 0;
970826e83eSopenharmony_ci
980826e83eSopenharmony_ciWebviewController::WebviewController(int32_t nwebId) : nwebId_(nwebId)
990826e83eSopenharmony_ci{
1000826e83eSopenharmony_ci    if (IsInit()) {
1010826e83eSopenharmony_ci        std::unique_lock<std::mutex> lk(g_objectMtx);
1020826e83eSopenharmony_ci        g_webview_controller_map.emplace(nwebId, this);
1030826e83eSopenharmony_ci    }
1040826e83eSopenharmony_ci}
1050826e83eSopenharmony_ci
1060826e83eSopenharmony_ciWebviewController::WebviewController(const std::string& webTag) : webTag_(webTag)
1070826e83eSopenharmony_ci{
1080826e83eSopenharmony_ci    NWebHelper::Instance().SetWebTag(-1, webTag_.c_str());
1090826e83eSopenharmony_ci}
1100826e83eSopenharmony_ci
1110826e83eSopenharmony_ciWebviewController::~WebviewController()
1120826e83eSopenharmony_ci{
1130826e83eSopenharmony_ci    std::unique_lock<std::mutex> lk(g_objectMtx);
1140826e83eSopenharmony_ci    g_webview_controller_map.erase(nwebId_);
1150826e83eSopenharmony_ci}
1160826e83eSopenharmony_ci
1170826e83eSopenharmony_civoid WebviewController::SetWebId(int32_t nwebId)
1180826e83eSopenharmony_ci{
1190826e83eSopenharmony_ci    nwebId_ = nwebId;
1200826e83eSopenharmony_ci    std::unique_lock<std::mutex> lk(g_objectMtx);
1210826e83eSopenharmony_ci    g_webview_controller_map.emplace(nwebId, this);
1220826e83eSopenharmony_ci
1230826e83eSopenharmony_ci    if (webTag_.empty()) {
1240826e83eSopenharmony_ci        WVLOG_I("native webtag is empty, don't care because it's not a native instance");
1250826e83eSopenharmony_ci        return;
1260826e83eSopenharmony_ci    }
1270826e83eSopenharmony_ci
1280826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
1290826e83eSopenharmony_ci    if (nweb_ptr) {
1300826e83eSopenharmony_ci        OH_NativeArkWeb_BindWebTagToWebInstance(webTag_.c_str(), nweb_ptr);
1310826e83eSopenharmony_ci        NWebHelper::Instance().SetWebTag(nwebId_, webTag_.c_str());
1320826e83eSopenharmony_ci    }
1330826e83eSopenharmony_ci    SetNWebJavaScriptResultCallBack();
1340826e83eSopenharmony_ci    NativeArkWeb_OnValidCallback validCallback = OH_NativeArkWeb_GetJavaScriptProxyValidCallback(webTag_.c_str());
1350826e83eSopenharmony_ci    if (validCallback) {
1360826e83eSopenharmony_ci        WVLOG_I("native validCallback start to call");
1370826e83eSopenharmony_ci        (*validCallback)(webTag_.c_str());
1380826e83eSopenharmony_ci    } else {
1390826e83eSopenharmony_ci        WVLOG_W("native validCallback is null, callback nothing");
1400826e83eSopenharmony_ci    }
1410826e83eSopenharmony_ci}
1420826e83eSopenharmony_ci
1430826e83eSopenharmony_ciWebviewController* WebviewController::FromID(int32_t nwebId)
1440826e83eSopenharmony_ci{
1450826e83eSopenharmony_ci    std::unique_lock<std::mutex> lk(g_objectMtx);
1460826e83eSopenharmony_ci    if (auto it = g_webview_controller_map.find(nwebId); it != g_webview_controller_map.end()) {
1470826e83eSopenharmony_ci        auto control = it->second;
1480826e83eSopenharmony_ci        return control;
1490826e83eSopenharmony_ci    }
1500826e83eSopenharmony_ci    return nullptr;
1510826e83eSopenharmony_ci}
1520826e83eSopenharmony_ci
1530826e83eSopenharmony_civoid WebviewController::InnerCompleteWindowNew(int32_t parentNwebId)
1540826e83eSopenharmony_ci{
1550826e83eSopenharmony_ci    WVLOG_D("WebviewController::InnerCompleteWindowNew parentNwebId == "
1560826e83eSopenharmony_ci            "%{public}d ",
1570826e83eSopenharmony_ci        parentNwebId);
1580826e83eSopenharmony_ci    if (parentNwebId < 0) {
1590826e83eSopenharmony_ci        WVLOG_E("WebviewController::InnerCompleteWindowNew parentNwebId == %{public}d "
1600826e83eSopenharmony_ci                "error",
1610826e83eSopenharmony_ci            parentNwebId);
1620826e83eSopenharmony_ci        return;
1630826e83eSopenharmony_ci    }
1640826e83eSopenharmony_ci    auto parentControl = FromID(parentNwebId);
1650826e83eSopenharmony_ci    if (!parentControl || !(parentControl->javaScriptResultCb_)) {
1660826e83eSopenharmony_ci        WVLOG_E("WebviewController::InnerCompleteWindowNew parentControl or "
1670826e83eSopenharmony_ci                "javaScriptResultCb_ is null");
1680826e83eSopenharmony_ci        return;
1690826e83eSopenharmony_ci    }
1700826e83eSopenharmony_ci
1710826e83eSopenharmony_ci    auto parNamedObjs = parentControl->javaScriptResultCb_->GetNamedObjects();
1720826e83eSopenharmony_ci
1730826e83eSopenharmony_ci    auto currentControl = FromID(nwebId_);
1740826e83eSopenharmony_ci    if (!currentControl || !(currentControl->javaScriptResultCb_)) {
1750826e83eSopenharmony_ci        WVLOG_E("WebviewController::InnerCompleteWindowNew currentControl or "
1760826e83eSopenharmony_ci                "javaScriptResultCb_ is null");
1770826e83eSopenharmony_ci        return;
1780826e83eSopenharmony_ci    }
1790826e83eSopenharmony_ci
1800826e83eSopenharmony_ci    std::unique_lock<std::mutex> lock(webMtx_);
1810826e83eSopenharmony_ci    {
1820826e83eSopenharmony_ci        auto curNamedObjs = currentControl->javaScriptResultCb_->GetNamedObjects();
1830826e83eSopenharmony_ci        SetNWebJavaScriptResultCallBack();
1840826e83eSopenharmony_ci        for (auto it = parNamedObjs.begin(); it != parNamedObjs.end(); it++) {
1850826e83eSopenharmony_ci            if (curNamedObjs.find(it->first) != curNamedObjs.end()) {
1860826e83eSopenharmony_ci                continue;
1870826e83eSopenharmony_ci            }
1880826e83eSopenharmony_ci            if (it->second && IsInit()) {
1890826e83eSopenharmony_ci                RegisterJavaScriptProxyParam param;
1900826e83eSopenharmony_ci                param.env = it->second->GetEnv();
1910826e83eSopenharmony_ci                param.obj = it->second->GetValue();
1920826e83eSopenharmony_ci                param.objName = it->first;
1930826e83eSopenharmony_ci                param.syncMethodList = it->second->GetSyncMethodNames();
1940826e83eSopenharmony_ci                param.asyncMethodList = it->second->GetAsyncMethodNames();
1950826e83eSopenharmony_ci                param.permission = it->second->GetPermission();
1960826e83eSopenharmony_ci                RegisterJavaScriptProxy(param);
1970826e83eSopenharmony_ci            }
1980826e83eSopenharmony_ci        }
1990826e83eSopenharmony_ci    }
2000826e83eSopenharmony_ci}
2010826e83eSopenharmony_ci
2020826e83eSopenharmony_cibool WebviewController::IsInit() const
2030826e83eSopenharmony_ci{
2040826e83eSopenharmony_ci    return NWebHelper::Instance().GetNWeb(nwebId_) ? true : false;
2050826e83eSopenharmony_ci}
2060826e83eSopenharmony_ci
2070826e83eSopenharmony_cibool WebviewController::AccessForward() const
2080826e83eSopenharmony_ci{
2090826e83eSopenharmony_ci    bool access = false;
2100826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
2110826e83eSopenharmony_ci    if (nweb_ptr) {
2120826e83eSopenharmony_ci        access = nweb_ptr->IsNavigateForwardAllowed();
2130826e83eSopenharmony_ci    } else {
2140826e83eSopenharmony_ci        WVLOG_E("WebviewController::AccessForward nweb_ptr is null");
2150826e83eSopenharmony_ci    }
2160826e83eSopenharmony_ci    return access;
2170826e83eSopenharmony_ci}
2180826e83eSopenharmony_ci
2190826e83eSopenharmony_cibool WebviewController::AccessBackward() const
2200826e83eSopenharmony_ci{
2210826e83eSopenharmony_ci    bool access = false;
2220826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
2230826e83eSopenharmony_ci    if (nweb_ptr) {
2240826e83eSopenharmony_ci        access = nweb_ptr->IsNavigatebackwardAllowed();
2250826e83eSopenharmony_ci    }
2260826e83eSopenharmony_ci    return access;
2270826e83eSopenharmony_ci}
2280826e83eSopenharmony_ci
2290826e83eSopenharmony_cibool WebviewController::AccessStep(int32_t step) const
2300826e83eSopenharmony_ci{
2310826e83eSopenharmony_ci    bool access = false;
2320826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
2330826e83eSopenharmony_ci    if (nweb_ptr) {
2340826e83eSopenharmony_ci        access = nweb_ptr->CanNavigateBackOrForward(step);
2350826e83eSopenharmony_ci    }
2360826e83eSopenharmony_ci    return access;
2370826e83eSopenharmony_ci}
2380826e83eSopenharmony_ci
2390826e83eSopenharmony_civoid WebviewController::ClearHistory()
2400826e83eSopenharmony_ci{
2410826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
2420826e83eSopenharmony_ci    if (nweb_ptr) {
2430826e83eSopenharmony_ci        nweb_ptr->DeleteNavigateHistory();
2440826e83eSopenharmony_ci    }
2450826e83eSopenharmony_ci}
2460826e83eSopenharmony_ci
2470826e83eSopenharmony_civoid WebviewController::Forward()
2480826e83eSopenharmony_ci{
2490826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
2500826e83eSopenharmony_ci    if (nweb_ptr) {
2510826e83eSopenharmony_ci        nweb_ptr->NavigateForward();
2520826e83eSopenharmony_ci    }
2530826e83eSopenharmony_ci}
2540826e83eSopenharmony_ci
2550826e83eSopenharmony_civoid WebviewController::Backward()
2560826e83eSopenharmony_ci{
2570826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
2580826e83eSopenharmony_ci    if (nweb_ptr) {
2590826e83eSopenharmony_ci        nweb_ptr->NavigateBack();
2600826e83eSopenharmony_ci    }
2610826e83eSopenharmony_ci}
2620826e83eSopenharmony_ci
2630826e83eSopenharmony_civoid WebviewController::OnActive()
2640826e83eSopenharmony_ci{
2650826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
2660826e83eSopenharmony_ci    if (nweb_ptr) {
2670826e83eSopenharmony_ci        nweb_ptr->OnContinue();
2680826e83eSopenharmony_ci    }
2690826e83eSopenharmony_ci}
2700826e83eSopenharmony_ci
2710826e83eSopenharmony_civoid WebviewController::OnInactive()
2720826e83eSopenharmony_ci{
2730826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
2740826e83eSopenharmony_ci    if (nweb_ptr) {
2750826e83eSopenharmony_ci        nweb_ptr->OnPause();
2760826e83eSopenharmony_ci    }
2770826e83eSopenharmony_ci}
2780826e83eSopenharmony_ci
2790826e83eSopenharmony_civoid WebviewController::Refresh()
2800826e83eSopenharmony_ci{
2810826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
2820826e83eSopenharmony_ci    if (nweb_ptr) {
2830826e83eSopenharmony_ci        nweb_ptr->Reload();
2840826e83eSopenharmony_ci    }
2850826e83eSopenharmony_ci}
2860826e83eSopenharmony_ci
2870826e83eSopenharmony_ciErrCode WebviewController::ZoomIn()
2880826e83eSopenharmony_ci{
2890826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
2900826e83eSopenharmony_ci    if (!nweb_ptr) {
2910826e83eSopenharmony_ci        return INIT_ERROR;
2920826e83eSopenharmony_ci    }
2930826e83eSopenharmony_ci    ErrCode result = NWebError::NO_ERROR;
2940826e83eSopenharmony_ci    result = nweb_ptr->ZoomIn();
2950826e83eSopenharmony_ci
2960826e83eSopenharmony_ci    return result;
2970826e83eSopenharmony_ci}
2980826e83eSopenharmony_ci
2990826e83eSopenharmony_ciErrCode WebviewController::ZoomOut()
3000826e83eSopenharmony_ci{
3010826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
3020826e83eSopenharmony_ci    if (!nweb_ptr) {
3030826e83eSopenharmony_ci        return INIT_ERROR;
3040826e83eSopenharmony_ci    }
3050826e83eSopenharmony_ci    ErrCode result = NWebError::NO_ERROR;
3060826e83eSopenharmony_ci    result = nweb_ptr->ZoomOut();
3070826e83eSopenharmony_ci
3080826e83eSopenharmony_ci    return result;
3090826e83eSopenharmony_ci}
3100826e83eSopenharmony_ci
3110826e83eSopenharmony_ciint32_t WebviewController::GetWebId() const
3120826e83eSopenharmony_ci{
3130826e83eSopenharmony_ci    int32_t webId = -1;
3140826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
3150826e83eSopenharmony_ci    if (nweb_ptr) {
3160826e83eSopenharmony_ci        webId = static_cast<int32_t>(nweb_ptr->GetWebId());
3170826e83eSopenharmony_ci    }
3180826e83eSopenharmony_ci    return webId;
3190826e83eSopenharmony_ci}
3200826e83eSopenharmony_ci
3210826e83eSopenharmony_cistd::string WebviewController::GetUserAgent()
3220826e83eSopenharmony_ci{
3230826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
3240826e83eSopenharmony_ci    if (!nweb_ptr) {
3250826e83eSopenharmony_ci        return "";
3260826e83eSopenharmony_ci    }
3270826e83eSopenharmony_ci    std::shared_ptr<OHOS::NWeb::NWebPreference> setting = nweb_ptr->GetPreference();
3280826e83eSopenharmony_ci    if (!setting) {
3290826e83eSopenharmony_ci        return "";
3300826e83eSopenharmony_ci    }
3310826e83eSopenharmony_ci    return setting->DefaultUserAgent();
3320826e83eSopenharmony_ci}
3330826e83eSopenharmony_ci
3340826e83eSopenharmony_cistd::string WebviewController::GetCustomUserAgent() const
3350826e83eSopenharmony_ci{
3360826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
3370826e83eSopenharmony_ci    if (!nweb_ptr) {
3380826e83eSopenharmony_ci        return "";
3390826e83eSopenharmony_ci    }
3400826e83eSopenharmony_ci    std::shared_ptr<OHOS::NWeb::NWebPreference> setting = nweb_ptr->GetPreference();
3410826e83eSopenharmony_ci    if (!setting) {
3420826e83eSopenharmony_ci        return "";
3430826e83eSopenharmony_ci    }
3440826e83eSopenharmony_ci    return setting->UserAgent();
3450826e83eSopenharmony_ci}
3460826e83eSopenharmony_ci
3470826e83eSopenharmony_ciErrCode WebviewController::SetCustomUserAgent(const std::string& userAgent)
3480826e83eSopenharmony_ci{
3490826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
3500826e83eSopenharmony_ci    if (!nweb_ptr) {
3510826e83eSopenharmony_ci        return NWebError::INIT_ERROR;
3520826e83eSopenharmony_ci    }
3530826e83eSopenharmony_ci    std::shared_ptr<OHOS::NWeb::NWebPreference> setting = nweb_ptr->GetPreference();
3540826e83eSopenharmony_ci    if (!setting) {
3550826e83eSopenharmony_ci        return NWebError::INIT_ERROR;
3560826e83eSopenharmony_ci    }
3570826e83eSopenharmony_ci    setting->PutUserAgent(userAgent);
3580826e83eSopenharmony_ci    return NWebError::NO_ERROR;
3590826e83eSopenharmony_ci}
3600826e83eSopenharmony_ci
3610826e83eSopenharmony_cistd::string WebviewController::GetTitle()
3620826e83eSopenharmony_ci{
3630826e83eSopenharmony_ci    std::string title = "";
3640826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
3650826e83eSopenharmony_ci    if (nweb_ptr) {
3660826e83eSopenharmony_ci        title = nweb_ptr->Title();
3670826e83eSopenharmony_ci    }
3680826e83eSopenharmony_ci    return title;
3690826e83eSopenharmony_ci}
3700826e83eSopenharmony_ci
3710826e83eSopenharmony_ciint32_t WebviewController::GetPageHeight()
3720826e83eSopenharmony_ci{
3730826e83eSopenharmony_ci    int32_t pageHeight = 0;
3740826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
3750826e83eSopenharmony_ci    if (nweb_ptr) {
3760826e83eSopenharmony_ci        pageHeight = nweb_ptr->ContentHeight();
3770826e83eSopenharmony_ci    }
3780826e83eSopenharmony_ci    return pageHeight;
3790826e83eSopenharmony_ci}
3800826e83eSopenharmony_ci
3810826e83eSopenharmony_ciErrCode WebviewController::BackOrForward(int32_t step)
3820826e83eSopenharmony_ci{
3830826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
3840826e83eSopenharmony_ci    if (!nweb_ptr) {
3850826e83eSopenharmony_ci        return INIT_ERROR;
3860826e83eSopenharmony_ci    }
3870826e83eSopenharmony_ci
3880826e83eSopenharmony_ci    nweb_ptr->NavigateBackOrForward(step);
3890826e83eSopenharmony_ci    return NWebError::NO_ERROR;
3900826e83eSopenharmony_ci}
3910826e83eSopenharmony_ci
3920826e83eSopenharmony_civoid WebviewController::StoreWebArchiveCallback(const std::string &baseName, bool autoName, napi_env env,
3930826e83eSopenharmony_ci    napi_ref jsCallback)
3940826e83eSopenharmony_ci{
3950826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
3960826e83eSopenharmony_ci    if (!nweb_ptr) {
3970826e83eSopenharmony_ci        napi_value setResult[RESULT_COUNT] = {0};
3980826e83eSopenharmony_ci        setResult[PARAMZERO] = BusinessError::CreateError(env, NWebError::INIT_ERROR);
3990826e83eSopenharmony_ci        napi_get_null(env, &setResult[PARAMONE]);
4000826e83eSopenharmony_ci
4010826e83eSopenharmony_ci        napi_value args[RESULT_COUNT] = {setResult[PARAMZERO], setResult[PARAMONE]};
4020826e83eSopenharmony_ci        napi_value callback = nullptr;
4030826e83eSopenharmony_ci        napi_get_reference_value(env, jsCallback, &callback);
4040826e83eSopenharmony_ci        napi_value callbackResult = nullptr;
4050826e83eSopenharmony_ci        napi_call_function(env, nullptr, callback, RESULT_COUNT, args, &callbackResult);
4060826e83eSopenharmony_ci        napi_delete_reference(env, jsCallback);
4070826e83eSopenharmony_ci        return;
4080826e83eSopenharmony_ci    }
4090826e83eSopenharmony_ci
4100826e83eSopenharmony_ci    if (jsCallback == nullptr) {
4110826e83eSopenharmony_ci        return;
4120826e83eSopenharmony_ci    }
4130826e83eSopenharmony_ci
4140826e83eSopenharmony_ci    auto callbackImpl = std::make_shared<OHOS::NWeb::NWebStoreWebArchiveCallback>();
4150826e83eSopenharmony_ci    callbackImpl->SetCallBack([env, jCallback = std::move(jsCallback)](std::string result) {
4160826e83eSopenharmony_ci        if (!env) {
4170826e83eSopenharmony_ci            return;
4180826e83eSopenharmony_ci        }
4190826e83eSopenharmony_ci        napi_handle_scope scope = nullptr;
4200826e83eSopenharmony_ci        napi_open_handle_scope(env, &scope);
4210826e83eSopenharmony_ci        if (scope == nullptr) {
4220826e83eSopenharmony_ci            return;
4230826e83eSopenharmony_ci        }
4240826e83eSopenharmony_ci
4250826e83eSopenharmony_ci        napi_value setResult[RESULT_COUNT] = {0};
4260826e83eSopenharmony_ci        if (result.empty()) {
4270826e83eSopenharmony_ci            setResult[PARAMZERO] = BusinessError::CreateError(env, NWebError::INVALID_RESOURCE);
4280826e83eSopenharmony_ci            napi_get_null(env, &setResult[PARAMONE]);
4290826e83eSopenharmony_ci        } else {
4300826e83eSopenharmony_ci            napi_get_undefined(env, &setResult[PARAMZERO]);
4310826e83eSopenharmony_ci            napi_create_string_utf8(env, result.c_str(), NAPI_AUTO_LENGTH, &setResult[PARAMONE]);
4320826e83eSopenharmony_ci        }
4330826e83eSopenharmony_ci        napi_value args[RESULT_COUNT] = {setResult[PARAMZERO], setResult[PARAMONE]};
4340826e83eSopenharmony_ci        napi_value callback = nullptr;
4350826e83eSopenharmony_ci        napi_get_reference_value(env, jCallback, &callback);
4360826e83eSopenharmony_ci        napi_value callbackResult = nullptr;
4370826e83eSopenharmony_ci        napi_call_function(env, nullptr, callback, RESULT_COUNT, args, &callbackResult);
4380826e83eSopenharmony_ci
4390826e83eSopenharmony_ci        napi_delete_reference(env, jCallback);
4400826e83eSopenharmony_ci        napi_close_handle_scope(env, scope);
4410826e83eSopenharmony_ci    });
4420826e83eSopenharmony_ci    nweb_ptr->StoreWebArchive(baseName, autoName, callbackImpl);
4430826e83eSopenharmony_ci    return;
4440826e83eSopenharmony_ci}
4450826e83eSopenharmony_ci
4460826e83eSopenharmony_civoid WebviewController::StoreWebArchivePromise(const std::string &baseName, bool autoName, napi_env env,
4470826e83eSopenharmony_ci    napi_deferred deferred)
4480826e83eSopenharmony_ci{
4490826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
4500826e83eSopenharmony_ci    if (!nweb_ptr) {
4510826e83eSopenharmony_ci        napi_value jsResult = nullptr;
4520826e83eSopenharmony_ci        jsResult = NWebError::BusinessError::CreateError(env, NWebError::INIT_ERROR);
4530826e83eSopenharmony_ci        napi_reject_deferred(env, deferred, jsResult);
4540826e83eSopenharmony_ci        return;
4550826e83eSopenharmony_ci    }
4560826e83eSopenharmony_ci
4570826e83eSopenharmony_ci    if (deferred == nullptr) {
4580826e83eSopenharmony_ci        return;
4590826e83eSopenharmony_ci    }
4600826e83eSopenharmony_ci
4610826e83eSopenharmony_ci    auto callbackImpl = std::make_shared<OHOS::NWeb::NWebStoreWebArchiveCallback>();
4620826e83eSopenharmony_ci    callbackImpl->SetCallBack([env, deferred](std::string result) {
4630826e83eSopenharmony_ci        if (!env) {
4640826e83eSopenharmony_ci            return;
4650826e83eSopenharmony_ci        }
4660826e83eSopenharmony_ci        napi_handle_scope scope = nullptr;
4670826e83eSopenharmony_ci        napi_open_handle_scope(env, &scope);
4680826e83eSopenharmony_ci        if (scope == nullptr) {
4690826e83eSopenharmony_ci            return;
4700826e83eSopenharmony_ci        }
4710826e83eSopenharmony_ci
4720826e83eSopenharmony_ci        napi_value setResult[RESULT_COUNT] = {0};
4730826e83eSopenharmony_ci        setResult[PARAMZERO] = NWebError::BusinessError::CreateError(env, NWebError::INVALID_RESOURCE);
4740826e83eSopenharmony_ci        napi_create_string_utf8(env, result.c_str(), NAPI_AUTO_LENGTH, &setResult[PARAMONE]);
4750826e83eSopenharmony_ci        napi_value args[RESULT_COUNT] = {setResult[PARAMZERO], setResult[PARAMONE]};
4760826e83eSopenharmony_ci        if (!result.empty()) {
4770826e83eSopenharmony_ci            napi_resolve_deferred(env, deferred, args[PARAMONE]);
4780826e83eSopenharmony_ci        } else {
4790826e83eSopenharmony_ci            napi_reject_deferred(env, deferred, args[PARAMZERO]);
4800826e83eSopenharmony_ci        }
4810826e83eSopenharmony_ci        napi_close_handle_scope(env, scope);
4820826e83eSopenharmony_ci    });
4830826e83eSopenharmony_ci    nweb_ptr->StoreWebArchive(baseName, autoName, callbackImpl);
4840826e83eSopenharmony_ci    return;
4850826e83eSopenharmony_ci}
4860826e83eSopenharmony_ci
4870826e83eSopenharmony_cistd::vector<std::string> WebviewController::CreateWebMessagePorts()
4880826e83eSopenharmony_ci{
4890826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
4900826e83eSopenharmony_ci    if (!nweb_ptr) {
4910826e83eSopenharmony_ci        std::vector<std::string> empty;
4920826e83eSopenharmony_ci        return empty;
4930826e83eSopenharmony_ci    }
4940826e83eSopenharmony_ci
4950826e83eSopenharmony_ci    return nweb_ptr->CreateWebMessagePorts();
4960826e83eSopenharmony_ci}
4970826e83eSopenharmony_ci
4980826e83eSopenharmony_ciErrCode WebviewController::PostWebMessage(std::string& message, std::vector<std::string>& ports, std::string& targetUrl)
4990826e83eSopenharmony_ci{
5000826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
5010826e83eSopenharmony_ci    if (!nweb_ptr) {
5020826e83eSopenharmony_ci        return INIT_ERROR;
5030826e83eSopenharmony_ci    }
5040826e83eSopenharmony_ci
5050826e83eSopenharmony_ci    nweb_ptr->PostWebMessage(message, ports, targetUrl);
5060826e83eSopenharmony_ci    return NWebError::NO_ERROR;
5070826e83eSopenharmony_ci}
5080826e83eSopenharmony_ci
5090826e83eSopenharmony_ciWebMessagePort::WebMessagePort(int32_t nwebId, std::string& port, bool isExtentionType)
5100826e83eSopenharmony_ci    : nwebId_(nwebId), portHandle_(port), isExtentionType_(isExtentionType)
5110826e83eSopenharmony_ci{}
5120826e83eSopenharmony_ci
5130826e83eSopenharmony_ciErrCode WebMessagePort::ClosePort()
5140826e83eSopenharmony_ci{
5150826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
5160826e83eSopenharmony_ci    if (!nweb_ptr) {
5170826e83eSopenharmony_ci        return INIT_ERROR;
5180826e83eSopenharmony_ci    }
5190826e83eSopenharmony_ci
5200826e83eSopenharmony_ci    nweb_ptr->ClosePort(portHandle_);
5210826e83eSopenharmony_ci    portHandle_.clear();
5220826e83eSopenharmony_ci    return NWebError::NO_ERROR;
5230826e83eSopenharmony_ci}
5240826e83eSopenharmony_ci
5250826e83eSopenharmony_ciErrCode WebMessagePort::PostPortMessage(std::shared_ptr<NWebMessage> data)
5260826e83eSopenharmony_ci{
5270826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
5280826e83eSopenharmony_ci    if (!nweb_ptr) {
5290826e83eSopenharmony_ci        return INIT_ERROR;
5300826e83eSopenharmony_ci    }
5310826e83eSopenharmony_ci
5320826e83eSopenharmony_ci    if (portHandle_.empty()) {
5330826e83eSopenharmony_ci        WVLOG_E("can't post message, message port already closed");
5340826e83eSopenharmony_ci        return CAN_NOT_POST_MESSAGE;
5350826e83eSopenharmony_ci    }
5360826e83eSopenharmony_ci    nweb_ptr->PostPortMessage(portHandle_, data);
5370826e83eSopenharmony_ci    return NWebError::NO_ERROR;
5380826e83eSopenharmony_ci}
5390826e83eSopenharmony_ci
5400826e83eSopenharmony_ciErrCode WebMessagePort::SetPortMessageCallback(
5410826e83eSopenharmony_ci    std::shared_ptr<NWebMessageValueCallback> callback)
5420826e83eSopenharmony_ci{
5430826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
5440826e83eSopenharmony_ci    if (!nweb_ptr) {
5450826e83eSopenharmony_ci        return INIT_ERROR;
5460826e83eSopenharmony_ci    }
5470826e83eSopenharmony_ci
5480826e83eSopenharmony_ci    if (portHandle_.empty()) {
5490826e83eSopenharmony_ci        WVLOG_E("can't register message port callback event, message port already closed");
5500826e83eSopenharmony_ci        return CAN_NOT_REGISTER_MESSAGE_EVENT;
5510826e83eSopenharmony_ci    }
5520826e83eSopenharmony_ci    nweb_ptr->SetPortMessageCallback(portHandle_, callback);
5530826e83eSopenharmony_ci    return NWebError::NO_ERROR;
5540826e83eSopenharmony_ci}
5550826e83eSopenharmony_ci
5560826e83eSopenharmony_cistd::string WebMessagePort::GetPortHandle() const
5570826e83eSopenharmony_ci{
5580826e83eSopenharmony_ci    return portHandle_;
5590826e83eSopenharmony_ci}
5600826e83eSopenharmony_ci
5610826e83eSopenharmony_cistd::shared_ptr<HitTestResult> WebviewController::GetHitTestValue()
5620826e83eSopenharmony_ci{
5630826e83eSopenharmony_ci    std::shared_ptr<HitTestResult> nwebResult;
5640826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
5650826e83eSopenharmony_ci    if (nweb_ptr) {
5660826e83eSopenharmony_ci        nwebResult = nweb_ptr->GetHitTestResult();
5670826e83eSopenharmony_ci        if (nwebResult) {
5680826e83eSopenharmony_ci            nwebResult->SetType(ConverToWebHitTestType(nwebResult->GetType()));
5690826e83eSopenharmony_ci        }
5700826e83eSopenharmony_ci    }
5710826e83eSopenharmony_ci    return nwebResult;
5720826e83eSopenharmony_ci}
5730826e83eSopenharmony_ci
5740826e83eSopenharmony_civoid WebviewController::RequestFocus()
5750826e83eSopenharmony_ci{
5760826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
5770826e83eSopenharmony_ci    if (nweb_ptr) {
5780826e83eSopenharmony_ci        nweb_ptr->OnFocus();
5790826e83eSopenharmony_ci    }
5800826e83eSopenharmony_ci}
5810826e83eSopenharmony_ci
5820826e83eSopenharmony_cistd::string WebviewController::GenerateWebTag()
5830826e83eSopenharmony_ci{
5840826e83eSopenharmony_ci    std::string webTag = "arkweb:" + std::to_string(WebviewController::webTagStrId_);
5850826e83eSopenharmony_ci    while (WebviewController::webTagSet_.find(webTag) != WebviewController::webTagSet_.end()) {
5860826e83eSopenharmony_ci        WebviewController::webTagStrId_++;
5870826e83eSopenharmony_ci        webTag = "arkweb:" + std::to_string(WebviewController::webTagStrId_);
5880826e83eSopenharmony_ci    }
5890826e83eSopenharmony_ci    return webTag;
5900826e83eSopenharmony_ci}
5910826e83eSopenharmony_ci
5920826e83eSopenharmony_cibool WebviewController::GetRawFileUrl(const std::string &fileName,
5930826e83eSopenharmony_ci    const std::string& bundleName, const std::string& moduleName, std::string &result) const
5940826e83eSopenharmony_ci{
5950826e83eSopenharmony_ci    if (fileName.empty()) {
5960826e83eSopenharmony_ci        WVLOG_E("File name is empty.");
5970826e83eSopenharmony_ci        return false;
5980826e83eSopenharmony_ci    }
5990826e83eSopenharmony_ci    if (hapPath_.empty()) {
6000826e83eSopenharmony_ci        std::shared_ptr<AbilityRuntime::ApplicationContext> context =
6010826e83eSopenharmony_ci            AbilityRuntime::ApplicationContext::GetApplicationContext();
6020826e83eSopenharmony_ci        std::string packagePath = "file:///" + context->GetBundleCodeDir() + "/";
6030826e83eSopenharmony_ci        std::string contextBundleName = context->GetBundleName() + "/";
6040826e83eSopenharmony_ci        std::shared_ptr<AppExecFwk::ApplicationInfo> appInfo = context->GetApplicationInfo();
6050826e83eSopenharmony_ci        std::string entryDir = appInfo->entryDir;
6060826e83eSopenharmony_ci        bool isStage = entryDir.find("entry") == std::string::npos ? false : true;
6070826e83eSopenharmony_ci        result = isStage ? packagePath + "entry/resources/rawfile/" + fileName :
6080826e83eSopenharmony_ci            packagePath + contextBundleName + "assets/entry/resources/rawfile/" + fileName;
6090826e83eSopenharmony_ci    } else {
6100826e83eSopenharmony_ci        std::string appBundleName;
6110826e83eSopenharmony_ci        std::string appModuleName;
6120826e83eSopenharmony_ci        result = "resource://RAWFILE/";
6130826e83eSopenharmony_ci        if (!bundleName.empty() && !moduleName.empty() &&
6140826e83eSopenharmony_ci            GetAppBundleNameAndModuleName(appBundleName, appModuleName)) {
6150826e83eSopenharmony_ci            if (appBundleName != bundleName || appModuleName != moduleName) {
6160826e83eSopenharmony_ci                result += BUNDLE_NAME_PREFIX + bundleName + "/" + MODULE_NAME_PREFIX + moduleName + "/";
6170826e83eSopenharmony_ci            }
6180826e83eSopenharmony_ci        }
6190826e83eSopenharmony_ci        result += fileName;
6200826e83eSopenharmony_ci    }
6210826e83eSopenharmony_ci    WVLOG_D("The parsed url is: ***");
6220826e83eSopenharmony_ci    return true;
6230826e83eSopenharmony_ci}
6240826e83eSopenharmony_ci
6250826e83eSopenharmony_cibool WebviewController::ParseUrl(napi_env env, napi_value urlObj, std::string& result) const
6260826e83eSopenharmony_ci{
6270826e83eSopenharmony_ci    napi_valuetype valueType = napi_null;
6280826e83eSopenharmony_ci    napi_typeof(env, urlObj, &valueType);
6290826e83eSopenharmony_ci    if ((valueType != napi_object) && (valueType != napi_string)) {
6300826e83eSopenharmony_ci        WVLOG_E("Unable to parse url object.");
6310826e83eSopenharmony_ci        return false;
6320826e83eSopenharmony_ci    }
6330826e83eSopenharmony_ci    if (valueType == napi_string) {
6340826e83eSopenharmony_ci        NapiParseUtils::ParseString(env, urlObj, result);
6350826e83eSopenharmony_ci        WVLOG_D("The parsed url is: ***");
6360826e83eSopenharmony_ci        return true;
6370826e83eSopenharmony_ci    }
6380826e83eSopenharmony_ci    napi_value type = nullptr;
6390826e83eSopenharmony_ci    napi_valuetype typeVlueType = napi_null;
6400826e83eSopenharmony_ci    napi_get_named_property(env, urlObj, "type", &type);
6410826e83eSopenharmony_ci    napi_typeof(env, type, &typeVlueType);
6420826e83eSopenharmony_ci    if (typeVlueType == napi_number) {
6430826e83eSopenharmony_ci        int32_t typeInteger;
6440826e83eSopenharmony_ci        NapiParseUtils::ParseInt32(env, type, typeInteger);
6450826e83eSopenharmony_ci        if (typeInteger == static_cast<int>(ResourceType::RAWFILE)) {
6460826e83eSopenharmony_ci            return ParseRawFileUrl(env, urlObj, result);
6470826e83eSopenharmony_ci        } else if (typeInteger == static_cast<int>(ResourceType::STRING)) {
6480826e83eSopenharmony_ci            if (!GetResourceUrl(env, urlObj, result)) {
6490826e83eSopenharmony_ci                WVLOG_E("Unable to parse string from url object.");
6500826e83eSopenharmony_ci                return false;
6510826e83eSopenharmony_ci            }
6520826e83eSopenharmony_ci            return true;
6530826e83eSopenharmony_ci        }
6540826e83eSopenharmony_ci        WVLOG_E("The type parsed from url object is not RAWFILE.");
6550826e83eSopenharmony_ci        return false;
6560826e83eSopenharmony_ci    }
6570826e83eSopenharmony_ci    WVLOG_E("Unable to parse type from url object.");
6580826e83eSopenharmony_ci    return false;
6590826e83eSopenharmony_ci}
6600826e83eSopenharmony_ci
6610826e83eSopenharmony_cibool WebviewController::ParseRawFileUrl(napi_env env, napi_value urlObj, std::string& result) const
6620826e83eSopenharmony_ci{
6630826e83eSopenharmony_ci    napi_value paraArray = nullptr;
6640826e83eSopenharmony_ci    napi_get_named_property(env, urlObj, "params", &paraArray);
6650826e83eSopenharmony_ci    bool isArray = false;
6660826e83eSopenharmony_ci    napi_is_array(env, paraArray, &isArray);
6670826e83eSopenharmony_ci    if (!isArray) {
6680826e83eSopenharmony_ci        WVLOG_E("Unable to parse parameter array from url object.");
6690826e83eSopenharmony_ci        return false;
6700826e83eSopenharmony_ci    }
6710826e83eSopenharmony_ci    napi_value fileNameObj;
6720826e83eSopenharmony_ci    napi_value bundleNameObj;
6730826e83eSopenharmony_ci    napi_value moduleNameObj;
6740826e83eSopenharmony_ci    std::string fileName;
6750826e83eSopenharmony_ci    std::string bundleName;
6760826e83eSopenharmony_ci    std::string moduleName;
6770826e83eSopenharmony_ci    napi_get_element(env, paraArray, 0, &fileNameObj);
6780826e83eSopenharmony_ci    napi_get_named_property(env, urlObj, "bundleName", &bundleNameObj);
6790826e83eSopenharmony_ci    napi_get_named_property(env, urlObj, "moduleName", &moduleNameObj);
6800826e83eSopenharmony_ci    NapiParseUtils::ParseString(env, fileNameObj, fileName);
6810826e83eSopenharmony_ci    NapiParseUtils::ParseString(env, bundleNameObj, bundleName);
6820826e83eSopenharmony_ci    NapiParseUtils::ParseString(env, moduleNameObj, moduleName);
6830826e83eSopenharmony_ci    return GetRawFileUrl(fileName, bundleName, moduleName, result);
6840826e83eSopenharmony_ci}
6850826e83eSopenharmony_ci
6860826e83eSopenharmony_cibool WebviewController::GetResourceUrl(napi_env env, napi_value urlObj, std::string& result) const
6870826e83eSopenharmony_ci{
6880826e83eSopenharmony_ci    napi_value resIdObj = nullptr;
6890826e83eSopenharmony_ci    napi_value bundleNameObj = nullptr;
6900826e83eSopenharmony_ci    napi_value moduleNameObj = nullptr;
6910826e83eSopenharmony_ci
6920826e83eSopenharmony_ci    int32_t resId;
6930826e83eSopenharmony_ci    std::string bundleName;
6940826e83eSopenharmony_ci    std::string moduleName;
6950826e83eSopenharmony_ci
6960826e83eSopenharmony_ci    if ((napi_get_named_property(env, urlObj, "id", &resIdObj) != napi_ok) ||
6970826e83eSopenharmony_ci        (napi_get_named_property(env, urlObj, "bundleName", &bundleNameObj) != napi_ok) ||
6980826e83eSopenharmony_ci        (napi_get_named_property(env, urlObj, "moduleName", &moduleNameObj) != napi_ok)) {
6990826e83eSopenharmony_ci        return false;
7000826e83eSopenharmony_ci    }
7010826e83eSopenharmony_ci
7020826e83eSopenharmony_ci    if (!NapiParseUtils::ParseInt32(env, resIdObj, resId) ||
7030826e83eSopenharmony_ci        !NapiParseUtils::ParseString(env, bundleNameObj, bundleName) ||
7040826e83eSopenharmony_ci        !NapiParseUtils::ParseString(env, moduleNameObj, moduleName)) {
7050826e83eSopenharmony_ci        return false;
7060826e83eSopenharmony_ci    }
7070826e83eSopenharmony_ci
7080826e83eSopenharmony_ci    if (OhosResourceAdapterImpl::GetResourceString(bundleName, moduleName, resId, result)) {
7090826e83eSopenharmony_ci        return true;
7100826e83eSopenharmony_ci    }
7110826e83eSopenharmony_ci    return false;
7120826e83eSopenharmony_ci}
7130826e83eSopenharmony_ci
7140826e83eSopenharmony_ciErrCode WebviewController::PostUrl(std::string& url, std::vector<char>& postData)
7150826e83eSopenharmony_ci{
7160826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
7170826e83eSopenharmony_ci    if (!nweb_ptr) {
7180826e83eSopenharmony_ci        return INIT_ERROR;
7190826e83eSopenharmony_ci    }
7200826e83eSopenharmony_ci    return nweb_ptr->PostUrl(url, postData);
7210826e83eSopenharmony_ci}
7220826e83eSopenharmony_ci
7230826e83eSopenharmony_ciErrCode WebviewController::LoadUrl(std::string url)
7240826e83eSopenharmony_ci{
7250826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
7260826e83eSopenharmony_ci    if (!nweb_ptr) {
7270826e83eSopenharmony_ci        return INIT_ERROR;
7280826e83eSopenharmony_ci    }
7290826e83eSopenharmony_ci    return nweb_ptr->Load(url);
7300826e83eSopenharmony_ci}
7310826e83eSopenharmony_ci
7320826e83eSopenharmony_ciErrCode WebviewController::LoadUrl(std::string url, std::map<std::string, std::string> httpHeaders)
7330826e83eSopenharmony_ci{
7340826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
7350826e83eSopenharmony_ci    if (!nweb_ptr) {
7360826e83eSopenharmony_ci        return INIT_ERROR;
7370826e83eSopenharmony_ci    }
7380826e83eSopenharmony_ci    return nweb_ptr->Load(url, httpHeaders);
7390826e83eSopenharmony_ci}
7400826e83eSopenharmony_ci
7410826e83eSopenharmony_ciErrCode WebviewController::LoadData(std::string data, std::string mimeType, std::string encoding,
7420826e83eSopenharmony_ci    std::string baseUrl, std::string historyUrl)
7430826e83eSopenharmony_ci{
7440826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
7450826e83eSopenharmony_ci    if (!nweb_ptr) {
7460826e83eSopenharmony_ci        return INIT_ERROR;
7470826e83eSopenharmony_ci    }
7480826e83eSopenharmony_ci    if (baseUrl.empty() && historyUrl.empty()) {
7490826e83eSopenharmony_ci        return nweb_ptr->LoadWithData(data, mimeType, encoding);
7500826e83eSopenharmony_ci    }
7510826e83eSopenharmony_ci    return nweb_ptr->LoadWithDataAndBaseUrl(baseUrl, data, mimeType, encoding, historyUrl);
7520826e83eSopenharmony_ci}
7530826e83eSopenharmony_ci
7540826e83eSopenharmony_ciint WebviewController::ConverToWebHitTestType(int hitType)
7550826e83eSopenharmony_ci{
7560826e83eSopenharmony_ci    WebHitTestType webHitType;
7570826e83eSopenharmony_ci    switch (hitType) {
7580826e83eSopenharmony_ci        case HitTestResult::UNKNOWN_TYPE:
7590826e83eSopenharmony_ci            webHitType = WebHitTestType::UNKNOWN;
7600826e83eSopenharmony_ci            break;
7610826e83eSopenharmony_ci        case HitTestResult::ANCHOR_TYPE:
7620826e83eSopenharmony_ci            webHitType = WebHitTestType::HTTP;
7630826e83eSopenharmony_ci            break;
7640826e83eSopenharmony_ci        case HitTestResult::PHONE_TYPE:
7650826e83eSopenharmony_ci            webHitType = WebHitTestType::PHONE;
7660826e83eSopenharmony_ci            break;
7670826e83eSopenharmony_ci        case HitTestResult::GEO_TYPE:
7680826e83eSopenharmony_ci            webHitType = WebHitTestType::MAP;
7690826e83eSopenharmony_ci            break;
7700826e83eSopenharmony_ci        case HitTestResult::EMAIL_TYPE:
7710826e83eSopenharmony_ci            webHitType = WebHitTestType::EMAIL;
7720826e83eSopenharmony_ci            break;
7730826e83eSopenharmony_ci        case HitTestResult::IMAGE_TYPE:
7740826e83eSopenharmony_ci            webHitType = WebHitTestType::IMG;
7750826e83eSopenharmony_ci            break;
7760826e83eSopenharmony_ci        case HitTestResult::IMAGE_ANCHOR_TYPE:
7770826e83eSopenharmony_ci            webHitType = WebHitTestType::HTTP_IMG;
7780826e83eSopenharmony_ci            break;
7790826e83eSopenharmony_ci        case HitTestResult::SRC_ANCHOR_TYPE:
7800826e83eSopenharmony_ci            webHitType = WebHitTestType::HTTP;
7810826e83eSopenharmony_ci            break;
7820826e83eSopenharmony_ci        case HitTestResult::SRC_IMAGE_ANCHOR_TYPE:
7830826e83eSopenharmony_ci            webHitType = WebHitTestType::HTTP_IMG;
7840826e83eSopenharmony_ci            break;
7850826e83eSopenharmony_ci        case HitTestResult::EDIT_TEXT_TYPE:
7860826e83eSopenharmony_ci            webHitType = WebHitTestType::EDIT;
7870826e83eSopenharmony_ci            break;
7880826e83eSopenharmony_ci        default:
7890826e83eSopenharmony_ci            webHitType = WebHitTestType::UNKNOWN;
7900826e83eSopenharmony_ci            break;
7910826e83eSopenharmony_ci    }
7920826e83eSopenharmony_ci    return static_cast<int>(webHitType);
7930826e83eSopenharmony_ci}
7940826e83eSopenharmony_ci
7950826e83eSopenharmony_ciint WebviewController::GetHitTest()
7960826e83eSopenharmony_ci{
7970826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
7980826e83eSopenharmony_ci    if (nweb_ptr) {
7990826e83eSopenharmony_ci        std::shared_ptr<HitTestResult> nwebResult = nweb_ptr->GetHitTestResult();
8000826e83eSopenharmony_ci        if (nwebResult) {
8010826e83eSopenharmony_ci            return ConverToWebHitTestType(nwebResult->GetType());
8020826e83eSopenharmony_ci        } else {
8030826e83eSopenharmony_ci            return ConverToWebHitTestType(HitTestResult::UNKNOWN_TYPE);
8040826e83eSopenharmony_ci        }
8050826e83eSopenharmony_ci    }
8060826e83eSopenharmony_ci    return static_cast<int>(WebHitTestType::UNKNOWN);
8070826e83eSopenharmony_ci}
8080826e83eSopenharmony_ci
8090826e83eSopenharmony_ci
8100826e83eSopenharmony_civoid WebviewController::ClearMatches()
8110826e83eSopenharmony_ci{
8120826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
8130826e83eSopenharmony_ci    if (nweb_ptr) {
8140826e83eSopenharmony_ci        nweb_ptr->ClearMatches();
8150826e83eSopenharmony_ci    }
8160826e83eSopenharmony_ci}
8170826e83eSopenharmony_ci
8180826e83eSopenharmony_civoid WebviewController::SearchNext(bool forward)
8190826e83eSopenharmony_ci{
8200826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
8210826e83eSopenharmony_ci    if (nweb_ptr) {
8220826e83eSopenharmony_ci        nweb_ptr->FindNext(forward);
8230826e83eSopenharmony_ci    }
8240826e83eSopenharmony_ci}
8250826e83eSopenharmony_ci
8260826e83eSopenharmony_civoid WebviewController::EnableSafeBrowsing(bool enable)
8270826e83eSopenharmony_ci{
8280826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
8290826e83eSopenharmony_ci    if (nweb_ptr) {
8300826e83eSopenharmony_ci        nweb_ptr->EnableSafeBrowsing(enable);
8310826e83eSopenharmony_ci    }
8320826e83eSopenharmony_ci}
8330826e83eSopenharmony_ci
8340826e83eSopenharmony_cibool WebviewController::IsSafeBrowsingEnabled() const
8350826e83eSopenharmony_ci{
8360826e83eSopenharmony_ci    bool isSafeBrowsingEnabled = false;
8370826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
8380826e83eSopenharmony_ci    if (nweb_ptr) {
8390826e83eSopenharmony_ci        isSafeBrowsingEnabled = nweb_ptr->IsSafeBrowsingEnabled();
8400826e83eSopenharmony_ci    }
8410826e83eSopenharmony_ci    return isSafeBrowsingEnabled;
8420826e83eSopenharmony_ci}
8430826e83eSopenharmony_ci
8440826e83eSopenharmony_civoid WebviewController::SearchAllAsync(const std::string& searchString)
8450826e83eSopenharmony_ci{
8460826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
8470826e83eSopenharmony_ci    if (nweb_ptr) {
8480826e83eSopenharmony_ci        nweb_ptr->FindAllAsync(searchString);
8490826e83eSopenharmony_ci    }
8500826e83eSopenharmony_ci}
8510826e83eSopenharmony_ci
8520826e83eSopenharmony_civoid WebviewController::ClearSslCache()
8530826e83eSopenharmony_ci{
8540826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
8550826e83eSopenharmony_ci    if (nweb_ptr) {
8560826e83eSopenharmony_ci        nweb_ptr->ClearSslCache();
8570826e83eSopenharmony_ci    }
8580826e83eSopenharmony_ci}
8590826e83eSopenharmony_ci
8600826e83eSopenharmony_civoid WebviewController::ClearClientAuthenticationCache()
8610826e83eSopenharmony_ci{
8620826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
8630826e83eSopenharmony_ci    if (nweb_ptr) {
8640826e83eSopenharmony_ci        nweb_ptr->ClearClientAuthenticationCache();
8650826e83eSopenharmony_ci    }
8660826e83eSopenharmony_ci}
8670826e83eSopenharmony_ci
8680826e83eSopenharmony_civoid WebviewController::Stop()
8690826e83eSopenharmony_ci{
8700826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
8710826e83eSopenharmony_ci    if (nweb_ptr) {
8720826e83eSopenharmony_ci        nweb_ptr->Stop();
8730826e83eSopenharmony_ci    }
8740826e83eSopenharmony_ci}
8750826e83eSopenharmony_ci
8760826e83eSopenharmony_ciErrCode WebviewController::Zoom(float factor)
8770826e83eSopenharmony_ci{
8780826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
8790826e83eSopenharmony_ci    if (!nweb_ptr) {
8800826e83eSopenharmony_ci        return INIT_ERROR;
8810826e83eSopenharmony_ci    }
8820826e83eSopenharmony_ci    ErrCode result = NWebError::NO_ERROR;
8830826e83eSopenharmony_ci    result = nweb_ptr->Zoom(factor);
8840826e83eSopenharmony_ci
8850826e83eSopenharmony_ci    return result;
8860826e83eSopenharmony_ci}
8870826e83eSopenharmony_ci
8880826e83eSopenharmony_ciErrCode WebviewController::DeleteJavaScriptRegister(const std::string& objName,
8890826e83eSopenharmony_ci    const std::vector<std::string>& methodList)
8900826e83eSopenharmony_ci{
8910826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
8920826e83eSopenharmony_ci    if (nweb_ptr) {
8930826e83eSopenharmony_ci        nweb_ptr->UnregisterArkJSfunction(objName, methodList);
8940826e83eSopenharmony_ci    }
8950826e83eSopenharmony_ci
8960826e83eSopenharmony_ci    if (javaScriptResultCb_) {
8970826e83eSopenharmony_ci        bool ret = javaScriptResultCb_->DeleteJavaScriptRegister(objName);
8980826e83eSopenharmony_ci        if (!ret) {
8990826e83eSopenharmony_ci            return CANNOT_DEL_JAVA_SCRIPT_PROXY;
9000826e83eSopenharmony_ci        }
9010826e83eSopenharmony_ci    }
9020826e83eSopenharmony_ci
9030826e83eSopenharmony_ci    return NWebError::NO_ERROR;
9040826e83eSopenharmony_ci}
9050826e83eSopenharmony_ci
9060826e83eSopenharmony_civoid WebviewController::SetNWebJavaScriptResultCallBack()
9070826e83eSopenharmony_ci{
9080826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
9090826e83eSopenharmony_ci    if (!nweb_ptr) {
9100826e83eSopenharmony_ci        return;
9110826e83eSopenharmony_ci    }
9120826e83eSopenharmony_ci
9130826e83eSopenharmony_ci    if (javaScriptResultCb_ && (javaScriptResultCb_->GetNWebId() == nwebId_)) {
9140826e83eSopenharmony_ci        return;
9150826e83eSopenharmony_ci    }
9160826e83eSopenharmony_ci
9170826e83eSopenharmony_ci    javaScriptResultCb_ = std::make_shared<WebviewJavaScriptResultCallBack>(nwebId_);
9180826e83eSopenharmony_ci    nweb_ptr->SetNWebJavaScriptResultCallBack(javaScriptResultCb_);
9190826e83eSopenharmony_ci}
9200826e83eSopenharmony_ci
9210826e83eSopenharmony_civoid WebviewController::RegisterJavaScriptProxy(RegisterJavaScriptProxyParam& param)
9220826e83eSopenharmony_ci{
9230826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
9240826e83eSopenharmony_ci    if (!nweb_ptr) {
9250826e83eSopenharmony_ci        WVLOG_E("WebviewController::RegisterJavaScriptProxy nweb_ptr is null");
9260826e83eSopenharmony_ci        return;
9270826e83eSopenharmony_ci    }
9280826e83eSopenharmony_ci    JavaScriptOb::ObjectID objId =
9290826e83eSopenharmony_ci        static_cast<JavaScriptOb::ObjectID>(JavaScriptOb::JavaScriptObjIdErrorCode::WEBCONTROLLERERROR);
9300826e83eSopenharmony_ci
9310826e83eSopenharmony_ci    if (!javaScriptResultCb_) {
9320826e83eSopenharmony_ci        WVLOG_E("WebviewController::RegisterJavaScriptProxy javaScriptResultCb_ is "
9330826e83eSopenharmony_ci                "null");
9340826e83eSopenharmony_ci        return;
9350826e83eSopenharmony_ci    }
9360826e83eSopenharmony_ci
9370826e83eSopenharmony_ci    if (param.syncMethodList.empty() && param.asyncMethodList.empty()) {
9380826e83eSopenharmony_ci        WVLOG_E("WebviewController::RegisterJavaScriptProxy all methodList are "
9390826e83eSopenharmony_ci                "empty");
9400826e83eSopenharmony_ci        return;
9410826e83eSopenharmony_ci    }
9420826e83eSopenharmony_ci
9430826e83eSopenharmony_ci    std::vector<std::string> allMethodList;
9440826e83eSopenharmony_ci    std::merge(param.syncMethodList.begin(), param.syncMethodList.end(),
9450826e83eSopenharmony_ci               param.asyncMethodList.begin(), param.asyncMethodList.end(),
9460826e83eSopenharmony_ci               std::back_inserter(allMethodList));
9470826e83eSopenharmony_ci
9480826e83eSopenharmony_ci    RegisterJavaScriptProxyParam param_tmp;
9490826e83eSopenharmony_ci    param_tmp.env = param.env;
9500826e83eSopenharmony_ci    param_tmp.obj = param.obj;
9510826e83eSopenharmony_ci    param_tmp.objName = param.objName;
9520826e83eSopenharmony_ci    param_tmp.syncMethodList = allMethodList;
9530826e83eSopenharmony_ci    param_tmp.asyncMethodList = param.asyncMethodList;
9540826e83eSopenharmony_ci    param_tmp.permission = param.permission;
9550826e83eSopenharmony_ci    objId = javaScriptResultCb_->RegisterJavaScriptProxy(param_tmp);
9560826e83eSopenharmony_ci
9570826e83eSopenharmony_ci    nweb_ptr->RegisterArkJSfunction(param_tmp.objName, param_tmp.syncMethodList,
9580826e83eSopenharmony_ci                                    std::vector<std::string>(), objId, param_tmp.permission);
9590826e83eSopenharmony_ci}
9600826e83eSopenharmony_ci
9610826e83eSopenharmony_civoid WebviewController::RunJavaScriptCallback(
9620826e83eSopenharmony_ci    const std::string& script, napi_env env, napi_ref jsCallback, bool extention)
9630826e83eSopenharmony_ci{
9640826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
9650826e83eSopenharmony_ci    if (!nweb_ptr) {
9660826e83eSopenharmony_ci        napi_value setResult[RESULT_COUNT] = {0};
9670826e83eSopenharmony_ci        setResult[PARAMZERO] = BusinessError::CreateError(env, NWebError::INIT_ERROR);
9680826e83eSopenharmony_ci        napi_get_null(env, &setResult[PARAMONE]);
9690826e83eSopenharmony_ci
9700826e83eSopenharmony_ci        napi_value args[RESULT_COUNT] = {setResult[PARAMZERO], setResult[PARAMONE]};
9710826e83eSopenharmony_ci        napi_value callback = nullptr;
9720826e83eSopenharmony_ci        napi_get_reference_value(env, jsCallback, &callback);
9730826e83eSopenharmony_ci        napi_value callbackResult = nullptr;
9740826e83eSopenharmony_ci        napi_call_function(env, nullptr, callback, RESULT_COUNT, args, &callbackResult);
9750826e83eSopenharmony_ci        napi_delete_reference(env, jsCallback);
9760826e83eSopenharmony_ci        return;
9770826e83eSopenharmony_ci    }
9780826e83eSopenharmony_ci
9790826e83eSopenharmony_ci    if (jsCallback == nullptr) {
9800826e83eSopenharmony_ci        return;
9810826e83eSopenharmony_ci    }
9820826e83eSopenharmony_ci
9830826e83eSopenharmony_ci    auto callbackImpl = std::make_shared<WebviewJavaScriptExecuteCallback>(env, jsCallback, nullptr, extention);
9840826e83eSopenharmony_ci    nweb_ptr->ExecuteJavaScript(script, callbackImpl, extention);
9850826e83eSopenharmony_ci}
9860826e83eSopenharmony_ci
9870826e83eSopenharmony_civoid WebviewController::RunJavaScriptPromise(const std::string &script, napi_env env,
9880826e83eSopenharmony_ci    napi_deferred deferred, bool extention)
9890826e83eSopenharmony_ci{
9900826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
9910826e83eSopenharmony_ci    if (!nweb_ptr) {
9920826e83eSopenharmony_ci        napi_value jsResult = nullptr;
9930826e83eSopenharmony_ci        jsResult = NWebError::BusinessError::CreateError(env, NWebError::INIT_ERROR);
9940826e83eSopenharmony_ci        napi_reject_deferred(env, deferred, jsResult);
9950826e83eSopenharmony_ci        return;
9960826e83eSopenharmony_ci    }
9970826e83eSopenharmony_ci
9980826e83eSopenharmony_ci    if (deferred == nullptr) {
9990826e83eSopenharmony_ci        return;
10000826e83eSopenharmony_ci    }
10010826e83eSopenharmony_ci
10020826e83eSopenharmony_ci    auto callbackImpl = std::make_shared<WebviewJavaScriptExecuteCallback>(env, nullptr, deferred, extention);
10030826e83eSopenharmony_ci    nweb_ptr->ExecuteJavaScript(script, callbackImpl, extention);
10040826e83eSopenharmony_ci}
10050826e83eSopenharmony_ci
10060826e83eSopenharmony_civoid WebviewController::RunJavaScriptCallbackExt(
10070826e83eSopenharmony_ci    const int fd, const size_t scriptLength, napi_env env, napi_ref jsCallback, bool extention)
10080826e83eSopenharmony_ci{
10090826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
10100826e83eSopenharmony_ci    if (!nweb_ptr) {
10110826e83eSopenharmony_ci        napi_value setResult[RESULT_COUNT] = {0};
10120826e83eSopenharmony_ci        setResult[PARAMZERO] = BusinessError::CreateError(env, NWebError::INIT_ERROR);
10130826e83eSopenharmony_ci        napi_get_null(env, &setResult[PARAMONE]);
10140826e83eSopenharmony_ci
10150826e83eSopenharmony_ci        napi_value args[RESULT_COUNT] = {setResult[PARAMZERO], setResult[PARAMONE]};
10160826e83eSopenharmony_ci        napi_value callback = nullptr;
10170826e83eSopenharmony_ci        napi_get_reference_value(env, jsCallback, &callback);
10180826e83eSopenharmony_ci        napi_value callbackResult = nullptr;
10190826e83eSopenharmony_ci        napi_call_function(env, nullptr, callback, RESULT_COUNT, args, &callbackResult);
10200826e83eSopenharmony_ci        napi_delete_reference(env, jsCallback);
10210826e83eSopenharmony_ci        close(fd);
10220826e83eSopenharmony_ci        return;
10230826e83eSopenharmony_ci    }
10240826e83eSopenharmony_ci
10250826e83eSopenharmony_ci    if (jsCallback == nullptr) {
10260826e83eSopenharmony_ci        close(fd);
10270826e83eSopenharmony_ci        return;
10280826e83eSopenharmony_ci    }
10290826e83eSopenharmony_ci
10300826e83eSopenharmony_ci    auto callbackImpl = std::make_shared<WebviewJavaScriptExecuteCallback>(env, jsCallback, nullptr, extention);
10310826e83eSopenharmony_ci    nweb_ptr->ExecuteJavaScriptExt(fd, scriptLength, callbackImpl, extention);
10320826e83eSopenharmony_ci}
10330826e83eSopenharmony_ci
10340826e83eSopenharmony_civoid WebviewController::RunJavaScriptPromiseExt(
10350826e83eSopenharmony_ci    const int fd, const size_t scriptLength, napi_env env, napi_deferred deferred, bool extention)
10360826e83eSopenharmony_ci{
10370826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
10380826e83eSopenharmony_ci    if (!nweb_ptr) {
10390826e83eSopenharmony_ci        napi_value jsResult = nullptr;
10400826e83eSopenharmony_ci        jsResult = NWebError::BusinessError::CreateError(env, NWebError::INIT_ERROR);
10410826e83eSopenharmony_ci        napi_reject_deferred(env, deferred, jsResult);
10420826e83eSopenharmony_ci        close(fd);
10430826e83eSopenharmony_ci        return;
10440826e83eSopenharmony_ci    }
10450826e83eSopenharmony_ci
10460826e83eSopenharmony_ci    if (deferred == nullptr) {
10470826e83eSopenharmony_ci        close(fd);
10480826e83eSopenharmony_ci        return;
10490826e83eSopenharmony_ci    }
10500826e83eSopenharmony_ci
10510826e83eSopenharmony_ci    auto callbackImpl = std::make_shared<WebviewJavaScriptExecuteCallback>(env, nullptr, deferred, extention);
10520826e83eSopenharmony_ci    nweb_ptr->ExecuteJavaScriptExt(fd, scriptLength, callbackImpl, extention);
10530826e83eSopenharmony_ci}
10540826e83eSopenharmony_ci
10550826e83eSopenharmony_civoid WebviewController::CreatePDFCallbackExt(
10560826e83eSopenharmony_ci    napi_env env, std::shared_ptr<NWebPDFConfigArgs> pdfConfig, napi_ref pdfCallback)
10570826e83eSopenharmony_ci{
10580826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
10590826e83eSopenharmony_ci    if (!nweb_ptr) {
10600826e83eSopenharmony_ci        napi_value setResult[RESULT_COUNT] = { 0 };
10610826e83eSopenharmony_ci        setResult[PARAMZERO] = BusinessError::CreateError(env, NWebError::INIT_ERROR);
10620826e83eSopenharmony_ci        napi_get_null(env, &setResult[PARAMONE]);
10630826e83eSopenharmony_ci
10640826e83eSopenharmony_ci        napi_value args[RESULT_COUNT] = { setResult[PARAMZERO], setResult[PARAMONE] };
10650826e83eSopenharmony_ci        napi_value callback = nullptr;
10660826e83eSopenharmony_ci        napi_get_reference_value(env, pdfCallback, &callback);
10670826e83eSopenharmony_ci        napi_value callbackResult = nullptr;
10680826e83eSopenharmony_ci        napi_call_function(env, nullptr, callback, RESULT_COUNT, args, &callbackResult);
10690826e83eSopenharmony_ci        napi_delete_reference(env, pdfCallback);
10700826e83eSopenharmony_ci        return;
10710826e83eSopenharmony_ci    }
10720826e83eSopenharmony_ci    if (pdfCallback == nullptr) {
10730826e83eSopenharmony_ci        return;
10740826e83eSopenharmony_ci    }
10750826e83eSopenharmony_ci    auto callbackImpl = std::make_shared<WebviewCreatePDFExecuteCallback>(env, pdfCallback, nullptr);
10760826e83eSopenharmony_ci    nweb_ptr->ExecuteCreatePDFExt(pdfConfig, callbackImpl);
10770826e83eSopenharmony_ci}
10780826e83eSopenharmony_ci
10790826e83eSopenharmony_civoid WebviewController::CreatePDFPromiseExt(
10800826e83eSopenharmony_ci    napi_env env, std::shared_ptr<NWebPDFConfigArgs> pdfConfig, napi_deferred deferred)
10810826e83eSopenharmony_ci{
10820826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
10830826e83eSopenharmony_ci    if (!nweb_ptr) {
10840826e83eSopenharmony_ci        napi_value pdfResult = nullptr;
10850826e83eSopenharmony_ci        pdfResult = NWebError::BusinessError::CreateError(env, NWebError::INIT_ERROR);
10860826e83eSopenharmony_ci        napi_reject_deferred(env, deferred, pdfResult);
10870826e83eSopenharmony_ci        return;
10880826e83eSopenharmony_ci    }
10890826e83eSopenharmony_ci    if (deferred == nullptr) {
10900826e83eSopenharmony_ci        return;
10910826e83eSopenharmony_ci    }
10920826e83eSopenharmony_ci    auto callbackImpl = std::make_shared<WebviewCreatePDFExecuteCallback>(env, nullptr, deferred);
10930826e83eSopenharmony_ci    nweb_ptr->ExecuteCreatePDFExt(pdfConfig, callbackImpl);
10940826e83eSopenharmony_ci}
10950826e83eSopenharmony_ci
10960826e83eSopenharmony_cistd::string WebviewController::GetUrl()
10970826e83eSopenharmony_ci{
10980826e83eSopenharmony_ci    std::string url = "";
10990826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
11000826e83eSopenharmony_ci    if (nweb_ptr) {
11010826e83eSopenharmony_ci        url = nweb_ptr->GetUrl();
11020826e83eSopenharmony_ci    }
11030826e83eSopenharmony_ci    return url;
11040826e83eSopenharmony_ci}
11050826e83eSopenharmony_ci
11060826e83eSopenharmony_cistd::string WebviewController::GetOriginalUrl()
11070826e83eSopenharmony_ci{
11080826e83eSopenharmony_ci    std::string url = "";
11090826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
11100826e83eSopenharmony_ci    if (nweb_ptr) {
11110826e83eSopenharmony_ci        url = nweb_ptr->GetOriginalUrl();
11120826e83eSopenharmony_ci    }
11130826e83eSopenharmony_ci    return url;
11140826e83eSopenharmony_ci}
11150826e83eSopenharmony_ci
11160826e83eSopenharmony_cibool WebviewController::TerminateRenderProcess() const
11170826e83eSopenharmony_ci{
11180826e83eSopenharmony_ci    bool ret = false;
11190826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
11200826e83eSopenharmony_ci    if (nweb_ptr) {
11210826e83eSopenharmony_ci        ret = nweb_ptr->TerminateRenderProcess();
11220826e83eSopenharmony_ci    }
11230826e83eSopenharmony_ci    return ret;
11240826e83eSopenharmony_ci}
11250826e83eSopenharmony_ci
11260826e83eSopenharmony_civoid WebviewController::PutNetworkAvailable(bool available)
11270826e83eSopenharmony_ci{
11280826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
11290826e83eSopenharmony_ci    if (nweb_ptr) {
11300826e83eSopenharmony_ci        nweb_ptr->PutNetworkAvailable(available);
11310826e83eSopenharmony_ci    }
11320826e83eSopenharmony_ci}
11330826e83eSopenharmony_ci
11340826e83eSopenharmony_ciErrCode WebviewController::HasImagesCallback(napi_env env, napi_ref jsCallback)
11350826e83eSopenharmony_ci{
11360826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
11370826e83eSopenharmony_ci    if (!nweb_ptr) {
11380826e83eSopenharmony_ci        napi_value setResult[RESULT_COUNT] = {0};
11390826e83eSopenharmony_ci        setResult[PARAMZERO] = BusinessError::CreateError(env, NWebError::INIT_ERROR);
11400826e83eSopenharmony_ci        napi_get_null(env, &setResult[PARAMONE]);
11410826e83eSopenharmony_ci
11420826e83eSopenharmony_ci        napi_value args[RESULT_COUNT] = {setResult[PARAMZERO], setResult[PARAMONE]};
11430826e83eSopenharmony_ci        napi_value callback = nullptr;
11440826e83eSopenharmony_ci        napi_get_reference_value(env, jsCallback, &callback);
11450826e83eSopenharmony_ci        napi_value callbackResult = nullptr;
11460826e83eSopenharmony_ci        napi_call_function(env, nullptr, callback, RESULT_COUNT, args, &callbackResult);
11470826e83eSopenharmony_ci        napi_delete_reference(env, jsCallback);
11480826e83eSopenharmony_ci        return NWebError::INIT_ERROR;
11490826e83eSopenharmony_ci    }
11500826e83eSopenharmony_ci
11510826e83eSopenharmony_ci    if (jsCallback == nullptr) {
11520826e83eSopenharmony_ci        return NWebError::PARAM_CHECK_ERROR;
11530826e83eSopenharmony_ci    }
11540826e83eSopenharmony_ci
11550826e83eSopenharmony_ci    auto callbackImpl = std::make_shared<WebviewHasImageCallback>(env, jsCallback, nullptr);
11560826e83eSopenharmony_ci    nweb_ptr->HasImages(callbackImpl);
11570826e83eSopenharmony_ci    return NWebError::NO_ERROR;
11580826e83eSopenharmony_ci}
11590826e83eSopenharmony_ci
11600826e83eSopenharmony_ciErrCode WebviewController::HasImagesPromise(napi_env env, napi_deferred deferred)
11610826e83eSopenharmony_ci{
11620826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
11630826e83eSopenharmony_ci    if (!nweb_ptr) {
11640826e83eSopenharmony_ci        napi_value jsResult = nullptr;
11650826e83eSopenharmony_ci        jsResult = NWebError::BusinessError::CreateError(env, NWebError::INIT_ERROR);
11660826e83eSopenharmony_ci        napi_reject_deferred(env, deferred, jsResult);
11670826e83eSopenharmony_ci        return NWebError::INIT_ERROR;
11680826e83eSopenharmony_ci    }
11690826e83eSopenharmony_ci
11700826e83eSopenharmony_ci    if (deferred == nullptr) {
11710826e83eSopenharmony_ci        return NWebError::PARAM_CHECK_ERROR;
11720826e83eSopenharmony_ci    }
11730826e83eSopenharmony_ci
11740826e83eSopenharmony_ci    auto callbackImpl = std::make_shared<WebviewHasImageCallback>(env, nullptr, deferred);
11750826e83eSopenharmony_ci    nweb_ptr->HasImages(callbackImpl);
11760826e83eSopenharmony_ci    return NWebError::NO_ERROR;
11770826e83eSopenharmony_ci}
11780826e83eSopenharmony_ci
11790826e83eSopenharmony_civoid WebviewController::RemoveCache(bool includeDiskFiles)
11800826e83eSopenharmony_ci{
11810826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
11820826e83eSopenharmony_ci    if (nweb_ptr) {
11830826e83eSopenharmony_ci        nweb_ptr->RemoveCache(includeDiskFiles);
11840826e83eSopenharmony_ci    }
11850826e83eSopenharmony_ci}
11860826e83eSopenharmony_ci
11870826e83eSopenharmony_cistd::shared_ptr<NWebHistoryList> WebviewController::GetHistoryList()
11880826e83eSopenharmony_ci{
11890826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
11900826e83eSopenharmony_ci    if (!nweb_ptr) {
11910826e83eSopenharmony_ci        return nullptr;
11920826e83eSopenharmony_ci    }
11930826e83eSopenharmony_ci    return nweb_ptr->GetHistoryList();
11940826e83eSopenharmony_ci}
11950826e83eSopenharmony_ci
11960826e83eSopenharmony_cistd::shared_ptr<NWebHistoryItem> WebHistoryList::GetItem(int32_t index)
11970826e83eSopenharmony_ci{
11980826e83eSopenharmony_ci    if (!sptrHistoryList_) {
11990826e83eSopenharmony_ci        return nullptr;
12000826e83eSopenharmony_ci    }
12010826e83eSopenharmony_ci    return sptrHistoryList_->GetItem(index);
12020826e83eSopenharmony_ci}
12030826e83eSopenharmony_ci
12040826e83eSopenharmony_ciint32_t WebHistoryList::GetListSize()
12050826e83eSopenharmony_ci{
12060826e83eSopenharmony_ci    int32_t listSize = 0;
12070826e83eSopenharmony_ci
12080826e83eSopenharmony_ci    if (!sptrHistoryList_) {
12090826e83eSopenharmony_ci        return listSize;
12100826e83eSopenharmony_ci    }
12110826e83eSopenharmony_ci    listSize = sptrHistoryList_->GetListSize();
12120826e83eSopenharmony_ci    return listSize;
12130826e83eSopenharmony_ci}
12140826e83eSopenharmony_ci
12150826e83eSopenharmony_cibool WebviewController::GetFavicon(
12160826e83eSopenharmony_ci    const void **data, size_t &width, size_t &height, ImageColorType &colorType, ImageAlphaType &alphaType) const
12170826e83eSopenharmony_ci{
12180826e83eSopenharmony_ci    bool isGetFavicon = false;
12190826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
12200826e83eSopenharmony_ci    if (nweb_ptr) {
12210826e83eSopenharmony_ci        isGetFavicon = nweb_ptr->GetFavicon(data, width, height, colorType, alphaType);
12220826e83eSopenharmony_ci    }
12230826e83eSopenharmony_ci    return isGetFavicon;
12240826e83eSopenharmony_ci}
12250826e83eSopenharmony_ci
12260826e83eSopenharmony_cistd::vector<uint8_t> WebviewController::SerializeWebState()
12270826e83eSopenharmony_ci{
12280826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
12290826e83eSopenharmony_ci    if (nweb_ptr) {
12300826e83eSopenharmony_ci        return nweb_ptr->SerializeWebState();
12310826e83eSopenharmony_ci    }
12320826e83eSopenharmony_ci    std::vector<uint8_t> empty;
12330826e83eSopenharmony_ci    return empty;
12340826e83eSopenharmony_ci}
12350826e83eSopenharmony_ci
12360826e83eSopenharmony_cibool WebviewController::RestoreWebState(const std::vector<uint8_t> &state) const
12370826e83eSopenharmony_ci{
12380826e83eSopenharmony_ci    bool isRestored = false;
12390826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
12400826e83eSopenharmony_ci    if (nweb_ptr) {
12410826e83eSopenharmony_ci        isRestored = nweb_ptr->RestoreWebState(state);
12420826e83eSopenharmony_ci    }
12430826e83eSopenharmony_ci    return isRestored;
12440826e83eSopenharmony_ci}
12450826e83eSopenharmony_ci
12460826e83eSopenharmony_civoid WebviewController::ScrollPageDown(bool bottom)
12470826e83eSopenharmony_ci{
12480826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
12490826e83eSopenharmony_ci    if (nweb_ptr) {
12500826e83eSopenharmony_ci        nweb_ptr->PageDown(bottom);
12510826e83eSopenharmony_ci    }
12520826e83eSopenharmony_ci    return;
12530826e83eSopenharmony_ci}
12540826e83eSopenharmony_ci
12550826e83eSopenharmony_civoid WebviewController::ScrollPageUp(bool top)
12560826e83eSopenharmony_ci{
12570826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
12580826e83eSopenharmony_ci    if (nweb_ptr) {
12590826e83eSopenharmony_ci        nweb_ptr->PageUp(top);
12600826e83eSopenharmony_ci    }
12610826e83eSopenharmony_ci    return;
12620826e83eSopenharmony_ci}
12630826e83eSopenharmony_ci
12640826e83eSopenharmony_civoid WebviewController::ScrollTo(float x, float y)
12650826e83eSopenharmony_ci{
12660826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
12670826e83eSopenharmony_ci    if (nweb_ptr) {
12680826e83eSopenharmony_ci        nweb_ptr->ScrollTo(x, y);
12690826e83eSopenharmony_ci    }
12700826e83eSopenharmony_ci    return;
12710826e83eSopenharmony_ci}
12720826e83eSopenharmony_ci
12730826e83eSopenharmony_civoid WebviewController::ScrollBy(float deltaX, float deltaY)
12740826e83eSopenharmony_ci{
12750826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
12760826e83eSopenharmony_ci    if (nweb_ptr) {
12770826e83eSopenharmony_ci        nweb_ptr->ScrollBy(deltaX, deltaY);
12780826e83eSopenharmony_ci    }
12790826e83eSopenharmony_ci    return;
12800826e83eSopenharmony_ci}
12810826e83eSopenharmony_ci
12820826e83eSopenharmony_civoid WebviewController::SlideScroll(float vx, float vy)
12830826e83eSopenharmony_ci{
12840826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
12850826e83eSopenharmony_ci    if (nweb_ptr) {
12860826e83eSopenharmony_ci        nweb_ptr->SlideScroll(vx, vy);
12870826e83eSopenharmony_ci    }
12880826e83eSopenharmony_ci    return;
12890826e83eSopenharmony_ci}
12900826e83eSopenharmony_ci
12910826e83eSopenharmony_civoid WebviewController::SetScrollable(bool enable)
12920826e83eSopenharmony_ci{
12930826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
12940826e83eSopenharmony_ci    if (!nweb_ptr) {
12950826e83eSopenharmony_ci        return;
12960826e83eSopenharmony_ci    }
12970826e83eSopenharmony_ci    std::shared_ptr<OHOS::NWeb::NWebPreference> setting = nweb_ptr->GetPreference();
12980826e83eSopenharmony_ci    if (!setting) {
12990826e83eSopenharmony_ci        return;
13000826e83eSopenharmony_ci    }
13010826e83eSopenharmony_ci    return setting->SetScrollable(enable);
13020826e83eSopenharmony_ci}
13030826e83eSopenharmony_ci
13040826e83eSopenharmony_cibool WebviewController::GetScrollable() const
13050826e83eSopenharmony_ci{
13060826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
13070826e83eSopenharmony_ci    if (!nweb_ptr) {
13080826e83eSopenharmony_ci        return true;
13090826e83eSopenharmony_ci    }
13100826e83eSopenharmony_ci    std::shared_ptr<OHOS::NWeb::NWebPreference> setting = nweb_ptr->GetPreference();
13110826e83eSopenharmony_ci    if (!setting) {
13120826e83eSopenharmony_ci        return true;
13130826e83eSopenharmony_ci    }
13140826e83eSopenharmony_ci    return setting->GetScrollable();
13150826e83eSopenharmony_ci}
13160826e83eSopenharmony_ci
13170826e83eSopenharmony_civoid WebviewController::InnerSetHapPath(const std::string &hapPath)
13180826e83eSopenharmony_ci{
13190826e83eSopenharmony_ci    hapPath_ = hapPath;
13200826e83eSopenharmony_ci}
13210826e83eSopenharmony_ci
13220826e83eSopenharmony_cibool WebviewController::GetCertChainDerData(std::vector<std::string> &certChainDerData) const
13230826e83eSopenharmony_ci{
13240826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
13250826e83eSopenharmony_ci    if (!nweb_ptr) {
13260826e83eSopenharmony_ci        WVLOG_E("GetCertChainDerData failed, nweb ptr is null");
13270826e83eSopenharmony_ci        return false;
13280826e83eSopenharmony_ci    }
13290826e83eSopenharmony_ci
13300826e83eSopenharmony_ci    return nweb_ptr->GetCertChainDerData(certChainDerData, true);
13310826e83eSopenharmony_ci}
13320826e83eSopenharmony_ci
13330826e83eSopenharmony_ciErrCode WebviewController::SetAudioMuted(bool muted)
13340826e83eSopenharmony_ci{
13350826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
13360826e83eSopenharmony_ci    if (!nweb_ptr) {
13370826e83eSopenharmony_ci        return NWebError::INIT_ERROR;
13380826e83eSopenharmony_ci    }
13390826e83eSopenharmony_ci
13400826e83eSopenharmony_ci    nweb_ptr->SetAudioMuted(muted);
13410826e83eSopenharmony_ci    return NWebError::NO_ERROR;
13420826e83eSopenharmony_ci}
13430826e83eSopenharmony_ci
13440826e83eSopenharmony_ciErrCode WebviewController::PrefetchPage(std::string& url, std::map<std::string, std::string> additionalHttpHeaders)
13450826e83eSopenharmony_ci{
13460826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
13470826e83eSopenharmony_ci    if (!nweb_ptr) {
13480826e83eSopenharmony_ci        return NWebError::INIT_ERROR;
13490826e83eSopenharmony_ci    }
13500826e83eSopenharmony_ci
13510826e83eSopenharmony_ci    nweb_ptr->PrefetchPage(url, additionalHttpHeaders);
13520826e83eSopenharmony_ci    return NWebError::NO_ERROR;
13530826e83eSopenharmony_ci}
13540826e83eSopenharmony_ci
13550826e83eSopenharmony_civoid WebPrintDocument::OnStartLayoutWrite(const std::string& jobId, const PrintAttributesAdapter& oldAttrs,
13560826e83eSopenharmony_ci    const PrintAttributesAdapter& newAttrs, uint32_t fd, std::function<void(std::string, uint32_t)> writeResultCallback)
13570826e83eSopenharmony_ci{
13580826e83eSopenharmony_ci    if (printDocAdapter_) {
13590826e83eSopenharmony_ci        std::shared_ptr<PrintWriteResultCallbackAdapter> callback =
13600826e83eSopenharmony_ci            std::make_shared<WebPrintWriteResultCallbackAdapter>(writeResultCallback);
13610826e83eSopenharmony_ci        printDocAdapter_->OnStartLayoutWrite(jobId, oldAttrs, newAttrs, fd, callback);
13620826e83eSopenharmony_ci    }
13630826e83eSopenharmony_ci}
13640826e83eSopenharmony_ci
13650826e83eSopenharmony_civoid WebPrintDocument::OnJobStateChanged(const std::string& jobId, uint32_t state)
13660826e83eSopenharmony_ci{
13670826e83eSopenharmony_ci    if (printDocAdapter_) {
13680826e83eSopenharmony_ci        printDocAdapter_->OnJobStateChanged(jobId, state);
13690826e83eSopenharmony_ci    }
13700826e83eSopenharmony_ci}
13710826e83eSopenharmony_ci
13720826e83eSopenharmony_civoid* WebviewController::CreateWebPrintDocumentAdapter(const std::string& jobName)
13730826e83eSopenharmony_ci{
13740826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
13750826e83eSopenharmony_ci    if (!nweb_ptr) {
13760826e83eSopenharmony_ci        return nullptr;
13770826e83eSopenharmony_ci    }
13780826e83eSopenharmony_ci    return nweb_ptr->CreateWebPrintDocumentAdapter(jobName);
13790826e83eSopenharmony_ci}
13800826e83eSopenharmony_ci
13810826e83eSopenharmony_civoid WebviewController::CloseAllMediaPresentations()
13820826e83eSopenharmony_ci{
13830826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
13840826e83eSopenharmony_ci    if (nweb_ptr) {
13850826e83eSopenharmony_ci        nweb_ptr->CloseAllMediaPresentations();
13860826e83eSopenharmony_ci    }
13870826e83eSopenharmony_ci}
13880826e83eSopenharmony_ci
13890826e83eSopenharmony_civoid WebviewController::StopAllMedia()
13900826e83eSopenharmony_ci{
13910826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
13920826e83eSopenharmony_ci    if (nweb_ptr) {
13930826e83eSopenharmony_ci        nweb_ptr->StopAllMedia();
13940826e83eSopenharmony_ci    }
13950826e83eSopenharmony_ci}
13960826e83eSopenharmony_ci
13970826e83eSopenharmony_civoid WebviewController::ResumeAllMedia()
13980826e83eSopenharmony_ci{
13990826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
14000826e83eSopenharmony_ci    if (nweb_ptr) {
14010826e83eSopenharmony_ci        nweb_ptr->ResumeAllMedia();
14020826e83eSopenharmony_ci    }
14030826e83eSopenharmony_ci}
14040826e83eSopenharmony_ci
14050826e83eSopenharmony_civoid WebviewController::PauseAllMedia()
14060826e83eSopenharmony_ci{
14070826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
14080826e83eSopenharmony_ci    if (nweb_ptr) {
14090826e83eSopenharmony_ci        nweb_ptr->PauseAllMedia();
14100826e83eSopenharmony_ci    }
14110826e83eSopenharmony_ci}
14120826e83eSopenharmony_ci
14130826e83eSopenharmony_ciint WebviewController::GetMediaPlaybackState()
14140826e83eSopenharmony_ci{
14150826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
14160826e83eSopenharmony_ci    if (!nweb_ptr) {
14170826e83eSopenharmony_ci        return static_cast<int>(MediaPlaybackState::NONE);
14180826e83eSopenharmony_ci    }
14190826e83eSopenharmony_ci    return nweb_ptr->GetMediaPlaybackState();
14200826e83eSopenharmony_ci}
14210826e83eSopenharmony_ci
14220826e83eSopenharmony_ciint WebviewController::GetSecurityLevel()
14230826e83eSopenharmony_ci{
14240826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
14250826e83eSopenharmony_ci    if (!nweb_ptr) {
14260826e83eSopenharmony_ci        return static_cast<int>(SecurityLevel::NONE);
14270826e83eSopenharmony_ci    }
14280826e83eSopenharmony_ci
14290826e83eSopenharmony_ci    int nwebSecurityLevel = nweb_ptr->GetSecurityLevel();
14300826e83eSopenharmony_ci    SecurityLevel securityLevel;
14310826e83eSopenharmony_ci    switch (nwebSecurityLevel) {
14320826e83eSopenharmony_ci        case static_cast<int>(CoreSecurityLevel::NONE):
14330826e83eSopenharmony_ci            securityLevel = SecurityLevel::NONE;
14340826e83eSopenharmony_ci            break;
14350826e83eSopenharmony_ci        case static_cast<int>(CoreSecurityLevel::SECURE):
14360826e83eSopenharmony_ci            securityLevel = SecurityLevel::SECURE;
14370826e83eSopenharmony_ci            break;
14380826e83eSopenharmony_ci        case static_cast<int>(CoreSecurityLevel::WARNING):
14390826e83eSopenharmony_ci            securityLevel = SecurityLevel::WARNING;
14400826e83eSopenharmony_ci            break;
14410826e83eSopenharmony_ci        case static_cast<int>(CoreSecurityLevel::DANGEROUS):
14420826e83eSopenharmony_ci            securityLevel = SecurityLevel::DANGEROUS;
14430826e83eSopenharmony_ci            break;
14440826e83eSopenharmony_ci        default:
14450826e83eSopenharmony_ci            securityLevel = SecurityLevel::NONE;
14460826e83eSopenharmony_ci            break;
14470826e83eSopenharmony_ci    }
14480826e83eSopenharmony_ci
14490826e83eSopenharmony_ci    return static_cast<int>(securityLevel);
14500826e83eSopenharmony_ci}
14510826e83eSopenharmony_ci
14520826e83eSopenharmony_cibool WebviewController::IsIncognitoMode() const
14530826e83eSopenharmony_ci{
14540826e83eSopenharmony_ci    bool incognitoMode = false;
14550826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
14560826e83eSopenharmony_ci    if (nweb_ptr) {
14570826e83eSopenharmony_ci        incognitoMode = nweb_ptr->IsIncognitoMode();
14580826e83eSopenharmony_ci    }
14590826e83eSopenharmony_ci    return incognitoMode;
14600826e83eSopenharmony_ci}
14610826e83eSopenharmony_ci
14620826e83eSopenharmony_civoid WebviewController::SetPrintBackground(bool enable)
14630826e83eSopenharmony_ci{
14640826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
14650826e83eSopenharmony_ci    if (nweb_ptr) {
14660826e83eSopenharmony_ci        nweb_ptr->SetPrintBackground(enable);
14670826e83eSopenharmony_ci    }
14680826e83eSopenharmony_ci}
14690826e83eSopenharmony_ci
14700826e83eSopenharmony_cibool  WebviewController::GetPrintBackground() const
14710826e83eSopenharmony_ci{
14720826e83eSopenharmony_ci    bool printBackgroundEnabled = false;
14730826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
14740826e83eSopenharmony_ci    if (nweb_ptr) {
14750826e83eSopenharmony_ci        printBackgroundEnabled = nweb_ptr->GetPrintBackground();
14760826e83eSopenharmony_ci    }
14770826e83eSopenharmony_ci
14780826e83eSopenharmony_ci    return printBackgroundEnabled;
14790826e83eSopenharmony_ci}
14800826e83eSopenharmony_ci
14810826e83eSopenharmony_civoid WebviewController::EnableIntelligentTrackingPrevention(bool enable)
14820826e83eSopenharmony_ci{
14830826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
14840826e83eSopenharmony_ci    if (nweb_ptr) {
14850826e83eSopenharmony_ci        nweb_ptr->EnableIntelligentTrackingPrevention(enable);
14860826e83eSopenharmony_ci    }
14870826e83eSopenharmony_ci}
14880826e83eSopenharmony_ci
14890826e83eSopenharmony_cibool WebviewController::IsIntelligentTrackingPreventionEnabled() const
14900826e83eSopenharmony_ci{
14910826e83eSopenharmony_ci    bool enabled = false;
14920826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
14930826e83eSopenharmony_ci    if (nweb_ptr) {
14940826e83eSopenharmony_ci        enabled = nweb_ptr->IsIntelligentTrackingPreventionEnabled();
14950826e83eSopenharmony_ci    }
14960826e83eSopenharmony_ci    return enabled;
14970826e83eSopenharmony_ci}
14980826e83eSopenharmony_ci
14990826e83eSopenharmony_civoid WebPrintWriteResultCallbackAdapter::WriteResultCallback(std::string jobId, uint32_t code)
15000826e83eSopenharmony_ci{
15010826e83eSopenharmony_ci    cb_(jobId, code);
15020826e83eSopenharmony_ci}
15030826e83eSopenharmony_ci
15040826e83eSopenharmony_cibool WebviewController::SetWebSchemeHandler(const char* scheme, WebSchemeHandler* handler) const
15050826e83eSopenharmony_ci{
15060826e83eSopenharmony_ci    if (!handler || !scheme) {
15070826e83eSopenharmony_ci        WVLOG_E("WebviewController::SetWebSchemeHandler handler or scheme is nullptr");
15080826e83eSopenharmony_ci        return false;
15090826e83eSopenharmony_ci    }
15100826e83eSopenharmony_ci    ArkWeb_SchemeHandler* schemeHandler =
15110826e83eSopenharmony_ci        const_cast<ArkWeb_SchemeHandler*>(WebSchemeHandler::GetArkWebSchemeHandler(handler));
15120826e83eSopenharmony_ci    return OH_ArkWeb_SetSchemeHandler(scheme, webTag_.c_str(), schemeHandler);
15130826e83eSopenharmony_ci}
15140826e83eSopenharmony_ci
15150826e83eSopenharmony_ciint32_t WebviewController::ClearWebSchemeHandler()
15160826e83eSopenharmony_ci{
15170826e83eSopenharmony_ci    return OH_ArkWeb_ClearSchemeHandlers(webTag_.c_str());
15180826e83eSopenharmony_ci}
15190826e83eSopenharmony_ci
15200826e83eSopenharmony_cibool WebviewController::SetWebServiveWorkerSchemeHandler(
15210826e83eSopenharmony_ci    const char* scheme, WebSchemeHandler* handler)
15220826e83eSopenharmony_ci{
15230826e83eSopenharmony_ci    ArkWeb_SchemeHandler* schemeHandler =
15240826e83eSopenharmony_ci        const_cast<ArkWeb_SchemeHandler*>(WebSchemeHandler::GetArkWebSchemeHandler(handler));
15250826e83eSopenharmony_ci    return OH_ArkWebServiceWorker_SetSchemeHandler(scheme, schemeHandler);
15260826e83eSopenharmony_ci}
15270826e83eSopenharmony_ci
15280826e83eSopenharmony_ciint32_t WebviewController::ClearWebServiceWorkerSchemeHandler()
15290826e83eSopenharmony_ci{
15300826e83eSopenharmony_ci    return OH_ArkWebServiceWorker_ClearSchemeHandlers();
15310826e83eSopenharmony_ci}
15320826e83eSopenharmony_ci
15330826e83eSopenharmony_ciErrCode WebviewController::StartCamera()
15340826e83eSopenharmony_ci{
15350826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
15360826e83eSopenharmony_ci    if (!nweb_ptr) {
15370826e83eSopenharmony_ci        return NWebError::INIT_ERROR;
15380826e83eSopenharmony_ci    }
15390826e83eSopenharmony_ci
15400826e83eSopenharmony_ci    nweb_ptr->StartCamera();
15410826e83eSopenharmony_ci    return NWebError::NO_ERROR;
15420826e83eSopenharmony_ci}
15430826e83eSopenharmony_ci
15440826e83eSopenharmony_ciErrCode WebviewController::StopCamera()
15450826e83eSopenharmony_ci{
15460826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
15470826e83eSopenharmony_ci    if (!nweb_ptr) {
15480826e83eSopenharmony_ci        return NWebError::INIT_ERROR;
15490826e83eSopenharmony_ci    }
15500826e83eSopenharmony_ci
15510826e83eSopenharmony_ci    nweb_ptr->StopCamera();
15520826e83eSopenharmony_ci    return NWebError::NO_ERROR;
15530826e83eSopenharmony_ci}
15540826e83eSopenharmony_ci
15550826e83eSopenharmony_ciErrCode WebviewController::CloseCamera()
15560826e83eSopenharmony_ci{
15570826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
15580826e83eSopenharmony_ci    if (!nweb_ptr) {
15590826e83eSopenharmony_ci        return NWebError::INIT_ERROR;
15600826e83eSopenharmony_ci    }
15610826e83eSopenharmony_ci
15620826e83eSopenharmony_ci    nweb_ptr->CloseCamera();
15630826e83eSopenharmony_ci    return NWebError::NO_ERROR;
15640826e83eSopenharmony_ci}
15650826e83eSopenharmony_ci
15660826e83eSopenharmony_cistd::string WebviewController::GetLastJavascriptProxyCallingFrameUrl()
15670826e83eSopenharmony_ci{
15680826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
15690826e83eSopenharmony_ci    if (!nweb_ptr) {
15700826e83eSopenharmony_ci        return "";
15710826e83eSopenharmony_ci    }
15720826e83eSopenharmony_ci
15730826e83eSopenharmony_ci    return nweb_ptr->GetLastJavascriptProxyCallingFrameUrl();
15740826e83eSopenharmony_ci}
15750826e83eSopenharmony_ci
15760826e83eSopenharmony_civoid WebviewController::OnCreateNativeMediaPlayer(napi_env env, napi_ref callback)
15770826e83eSopenharmony_ci{
15780826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
15790826e83eSopenharmony_ci    if (!nweb_ptr) {
15800826e83eSopenharmony_ci        return;
15810826e83eSopenharmony_ci    }
15820826e83eSopenharmony_ci
15830826e83eSopenharmony_ci    auto callbackImpl = std::make_shared<NWebCreateNativeMediaPlayerCallbackImpl>(nwebId_, env, callback);
15840826e83eSopenharmony_ci    nweb_ptr->OnCreateNativeMediaPlayer(callbackImpl);
15850826e83eSopenharmony_ci}
15860826e83eSopenharmony_ci
15870826e83eSopenharmony_cibool WebviewController::ParseScriptContent(napi_env env, napi_value value, std::string &script)
15880826e83eSopenharmony_ci{
15890826e83eSopenharmony_ci    napi_valuetype valueType;
15900826e83eSopenharmony_ci    napi_typeof(env, value, &valueType);
15910826e83eSopenharmony_ci    if (valueType == napi_string) {
15920826e83eSopenharmony_ci        std::string str;
15930826e83eSopenharmony_ci        if (!NapiParseUtils::ParseString(env, value, str)) {
15940826e83eSopenharmony_ci            WVLOG_E("PrecompileJavaScript: parse script text to string failed.");
15950826e83eSopenharmony_ci            return false;
15960826e83eSopenharmony_ci        }
15970826e83eSopenharmony_ci
15980826e83eSopenharmony_ci        script = str;
15990826e83eSopenharmony_ci        return true;
16000826e83eSopenharmony_ci    }
16010826e83eSopenharmony_ci
16020826e83eSopenharmony_ci    std::vector<uint8_t> vec = ParseUint8Array(env, value);
16030826e83eSopenharmony_ci    if (!vec.size()) {
16040826e83eSopenharmony_ci        WVLOG_E("PrecompileJavaScript: parse script text to Uint8Array failed.");
16050826e83eSopenharmony_ci        return false;
16060826e83eSopenharmony_ci    }
16070826e83eSopenharmony_ci
16080826e83eSopenharmony_ci    std::string str(vec.begin(), vec.end());
16090826e83eSopenharmony_ci    script = str;
16100826e83eSopenharmony_ci    return true;
16110826e83eSopenharmony_ci}
16120826e83eSopenharmony_ci
16130826e83eSopenharmony_cistd::shared_ptr<CacheOptions> WebviewController::ParseCacheOptions(napi_env env, napi_value value) {
16140826e83eSopenharmony_ci    std::map<std::string, std::string> responseHeaders;
16150826e83eSopenharmony_ci    auto defaultCacheOptions = std::make_shared<NWebCacheOptionsImpl>(responseHeaders);
16160826e83eSopenharmony_ci
16170826e83eSopenharmony_ci    napi_value responseHeadersValue = nullptr;
16180826e83eSopenharmony_ci    if (napi_get_named_property(env, value, "responseHeaders", &responseHeadersValue) != napi_ok) {
16190826e83eSopenharmony_ci        WVLOG_D("PrecompileJavaScript: cannot get 'responseHeaders' of CacheOptions.");
16200826e83eSopenharmony_ci        return defaultCacheOptions;
16210826e83eSopenharmony_ci    }
16220826e83eSopenharmony_ci
16230826e83eSopenharmony_ci    if (!ParseResponseHeaders(env, responseHeadersValue, responseHeaders)) {
16240826e83eSopenharmony_ci        WVLOG_D("PrecompileJavaScript: parse 'responseHeaders' of CacheOptions failed. use default options");
16250826e83eSopenharmony_ci        return defaultCacheOptions;
16260826e83eSopenharmony_ci    }
16270826e83eSopenharmony_ci
16280826e83eSopenharmony_ci    return std::make_shared<NWebCacheOptionsImpl>(responseHeaders);
16290826e83eSopenharmony_ci}
16300826e83eSopenharmony_ci
16310826e83eSopenharmony_civoid WebviewController::PrecompileJavaScriptPromise(
16320826e83eSopenharmony_ci    napi_env env, napi_deferred deferred,
16330826e83eSopenharmony_ci    const std::string &url, const std::string &script, std::shared_ptr<CacheOptions> cacheOptions)
16340826e83eSopenharmony_ci{
16350826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
16360826e83eSopenharmony_ci    if (!nweb_ptr || !deferred) {
16370826e83eSopenharmony_ci        return;
16380826e83eSopenharmony_ci    }
16390826e83eSopenharmony_ci
16400826e83eSopenharmony_ci    auto callbackImpl = std::make_shared<OHOS::NWeb::NWebPrecompileCallback>();
16410826e83eSopenharmony_ci    callbackImpl->SetCallback([env, deferred](int64_t result) {
16420826e83eSopenharmony_ci        if (!env) {
16430826e83eSopenharmony_ci            return;
16440826e83eSopenharmony_ci        }
16450826e83eSopenharmony_ci
16460826e83eSopenharmony_ci        napi_handle_scope scope = nullptr;
16470826e83eSopenharmony_ci        napi_open_handle_scope(env, &scope);
16480826e83eSopenharmony_ci        if (scope == nullptr) {
16490826e83eSopenharmony_ci            return;
16500826e83eSopenharmony_ci        }
16510826e83eSopenharmony_ci
16520826e83eSopenharmony_ci        napi_value setResult[RESULT_COUNT] = {0};
16530826e83eSopenharmony_ci        napi_create_int64(env, result, &setResult[PARAMZERO]);
16540826e83eSopenharmony_ci        napi_value args[RESULT_COUNT] = {setResult[PARAMZERO]};
16550826e83eSopenharmony_ci        if (result == static_cast<int64_t>(PrecompileError::OK)) {
16560826e83eSopenharmony_ci            napi_resolve_deferred(env, deferred, args[PARAMZERO]);
16570826e83eSopenharmony_ci        } else {
16580826e83eSopenharmony_ci            napi_reject_deferred(env, deferred, args[PARAMZERO]);
16590826e83eSopenharmony_ci        }
16600826e83eSopenharmony_ci
16610826e83eSopenharmony_ci        napi_close_handle_scope(env, scope);
16620826e83eSopenharmony_ci    });
16630826e83eSopenharmony_ci
16640826e83eSopenharmony_ci    nweb_ptr->PrecompileJavaScript(url, script, cacheOptions, callbackImpl);
16650826e83eSopenharmony_ci}
16660826e83eSopenharmony_ci
16670826e83eSopenharmony_cibool WebviewController::ParseResponseHeaders(napi_env env,
16680826e83eSopenharmony_ci                                             napi_value value,
16690826e83eSopenharmony_ci                                             std::map<std::string, std::string> &responseHeaders) const
16700826e83eSopenharmony_ci{
16710826e83eSopenharmony_ci    bool isArray = false;
16720826e83eSopenharmony_ci    napi_is_array(env, value, &isArray);
16730826e83eSopenharmony_ci    if (!isArray) {
16740826e83eSopenharmony_ci        WVLOG_E("Response headers is not array.");
16750826e83eSopenharmony_ci        return false;
16760826e83eSopenharmony_ci    }
16770826e83eSopenharmony_ci
16780826e83eSopenharmony_ci    uint32_t length = INTEGER_ZERO;
16790826e83eSopenharmony_ci    napi_get_array_length(env, value, &length);
16800826e83eSopenharmony_ci    for (uint32_t i = 0; i < length; i++) {
16810826e83eSopenharmony_ci        std::string keyString;
16820826e83eSopenharmony_ci        std::string valueString;
16830826e83eSopenharmony_ci        napi_value header = nullptr;
16840826e83eSopenharmony_ci        napi_value keyObj = nullptr;
16850826e83eSopenharmony_ci        napi_value valueObj = nullptr;
16860826e83eSopenharmony_ci        napi_get_element(env, value, i, &header);
16870826e83eSopenharmony_ci
16880826e83eSopenharmony_ci        if (napi_get_named_property(env, header, "headerKey", &keyObj) != napi_ok ||
16890826e83eSopenharmony_ci            !NapiParseUtils::ParseString(env, keyObj, keyString)) {
16900826e83eSopenharmony_ci            continue;
16910826e83eSopenharmony_ci        }
16920826e83eSopenharmony_ci
16930826e83eSopenharmony_ci        if (napi_get_named_property(env, header, "headerValue", &valueObj) != napi_ok ||
16940826e83eSopenharmony_ci            !NapiParseUtils::ParseString(env, valueObj, valueString)) {
16950826e83eSopenharmony_ci            continue;
16960826e83eSopenharmony_ci        }
16970826e83eSopenharmony_ci
16980826e83eSopenharmony_ci        responseHeaders[keyString] = valueString;
16990826e83eSopenharmony_ci    }
17000826e83eSopenharmony_ci
17010826e83eSopenharmony_ci    return true;
17020826e83eSopenharmony_ci}
17030826e83eSopenharmony_ci
17040826e83eSopenharmony_ciParseURLResult WebviewController::ParseURLList(napi_env env, napi_value value, std::vector<std::string>& urlList)
17050826e83eSopenharmony_ci{
17060826e83eSopenharmony_ci    if (!NapiParseUtils::ParseStringArray(env, value, urlList)) {
17070826e83eSopenharmony_ci        return ParseURLResult::FAILED;
17080826e83eSopenharmony_ci    }
17090826e83eSopenharmony_ci
17100826e83eSopenharmony_ci    for (auto url : urlList) {
17110826e83eSopenharmony_ci        if (!CheckURL(url)) {
17120826e83eSopenharmony_ci            return ParseURLResult::INVALID_URL;
17130826e83eSopenharmony_ci        }
17140826e83eSopenharmony_ci    }
17150826e83eSopenharmony_ci
17160826e83eSopenharmony_ci    return ParseURLResult::OK;
17170826e83eSopenharmony_ci}
17180826e83eSopenharmony_ci
17190826e83eSopenharmony_cibool WebviewController::CheckURL(std::string& url) const
17200826e83eSopenharmony_ci{
17210826e83eSopenharmony_ci    if (url.size() > URL_MAXIMUM) {
17220826e83eSopenharmony_ci        WVLOG_E("The URL exceeds the maximum length of %{public}d. URL: %{private}s", URL_MAXIMUM, url.c_str());
17230826e83eSopenharmony_ci        return false;
17240826e83eSopenharmony_ci    }
17250826e83eSopenharmony_ci
17260826e83eSopenharmony_ci    if (!regex_match(url, std::regex("^http(s)?:\\/\\/.+", std::regex_constants::icase))) {
17270826e83eSopenharmony_ci        WVLOG_E("The Parse URL error. URL: %{private}s", url.c_str());
17280826e83eSopenharmony_ci        return false;
17290826e83eSopenharmony_ci    }
17300826e83eSopenharmony_ci
17310826e83eSopenharmony_ci    return true;
17320826e83eSopenharmony_ci}
17330826e83eSopenharmony_ci
17340826e83eSopenharmony_cistd::vector<uint8_t> WebviewController::ParseUint8Array(napi_env env, napi_value value)
17350826e83eSopenharmony_ci{
17360826e83eSopenharmony_ci    napi_typedarray_type typedArrayType;
17370826e83eSopenharmony_ci    size_t length = 0;
17380826e83eSopenharmony_ci    napi_value buffer = nullptr;
17390826e83eSopenharmony_ci    size_t offset = 0;
17400826e83eSopenharmony_ci    napi_get_typedarray_info(env, value, &typedArrayType, &length, nullptr, &buffer, &offset);
17410826e83eSopenharmony_ci    if (typedArrayType != napi_uint8_array) {
17420826e83eSopenharmony_ci        WVLOG_E("Param is not Unit8Array.");
17430826e83eSopenharmony_ci        return std::vector<uint8_t>();
17440826e83eSopenharmony_ci    }
17450826e83eSopenharmony_ci
17460826e83eSopenharmony_ci    uint8_t *data = nullptr;
17470826e83eSopenharmony_ci    size_t total = 0;
17480826e83eSopenharmony_ci    napi_get_arraybuffer_info(env, buffer, reinterpret_cast<void **>(&data), &total);
17490826e83eSopenharmony_ci    length = std::min<size_t>(length, total - offset);
17500826e83eSopenharmony_ci    std::vector<uint8_t> vec(length);
17510826e83eSopenharmony_ci    int retCode = memcpy_s(vec.data(), vec.size(), &data[offset], length);
17520826e83eSopenharmony_ci    if (retCode != 0) {
17530826e83eSopenharmony_ci        WVLOG_E("Parse Uint8Array failed.");
17540826e83eSopenharmony_ci        return std::vector<uint8_t>();
17550826e83eSopenharmony_ci    }
17560826e83eSopenharmony_ci
17570826e83eSopenharmony_ci    return vec;
17580826e83eSopenharmony_ci}
17590826e83eSopenharmony_ci
17600826e83eSopenharmony_civoid WebviewController::InjectOfflineResource(const std::vector<std::string>& urlList,
17610826e83eSopenharmony_ci                                              const std::vector<uint8_t>& resource,
17620826e83eSopenharmony_ci                                              const std::map<std::string, std::string>& response_headers,
17630826e83eSopenharmony_ci                                              const uint32_t type)
17640826e83eSopenharmony_ci{
17650826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
17660826e83eSopenharmony_ci    if (!nweb_ptr) {
17670826e83eSopenharmony_ci        return;
17680826e83eSopenharmony_ci    }
17690826e83eSopenharmony_ci
17700826e83eSopenharmony_ci    std::string originUrl = urlList[0];
17710826e83eSopenharmony_ci    if (urlList.size() == 1) {
17720826e83eSopenharmony_ci        nweb_ptr->InjectOfflineResource(originUrl, originUrl, resource, response_headers, type);
17730826e83eSopenharmony_ci        return;
17740826e83eSopenharmony_ci    }
17750826e83eSopenharmony_ci
17760826e83eSopenharmony_ci    for (size_t i = 1 ; i < urlList.size() ; i++) {
17770826e83eSopenharmony_ci        nweb_ptr->InjectOfflineResource(urlList[i], originUrl, resource, response_headers, type);
17780826e83eSopenharmony_ci    }
17790826e83eSopenharmony_ci}
17800826e83eSopenharmony_ci
17810826e83eSopenharmony_civoid WebviewController::EnableAdsBlock(bool enable)
17820826e83eSopenharmony_ci{
17830826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
17840826e83eSopenharmony_ci    if (nweb_ptr) {
17850826e83eSopenharmony_ci        nweb_ptr->EnableAdsBlock(enable);
17860826e83eSopenharmony_ci    }
17870826e83eSopenharmony_ci}
17880826e83eSopenharmony_ci
17890826e83eSopenharmony_cibool WebviewController::IsAdsBlockEnabled() const
17900826e83eSopenharmony_ci{
17910826e83eSopenharmony_ci    bool enabled = false;
17920826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
17930826e83eSopenharmony_ci    if (nweb_ptr) {
17940826e83eSopenharmony_ci        enabled = nweb_ptr->IsAdsBlockEnabled();
17950826e83eSopenharmony_ci    }
17960826e83eSopenharmony_ci    return enabled;
17970826e83eSopenharmony_ci}
17980826e83eSopenharmony_ci
17990826e83eSopenharmony_cibool WebviewController::IsAdsBlockEnabledForCurPage() const
18000826e83eSopenharmony_ci{
18010826e83eSopenharmony_ci    bool enabled = false;
18020826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
18030826e83eSopenharmony_ci    if (nweb_ptr) {
18040826e83eSopenharmony_ci        enabled = nweb_ptr->IsAdsBlockEnabledForCurPage();
18050826e83eSopenharmony_ci    }
18060826e83eSopenharmony_ci    return enabled;
18070826e83eSopenharmony_ci}
18080826e83eSopenharmony_ci
18090826e83eSopenharmony_cistd::string WebviewController::GetSurfaceId()
18100826e83eSopenharmony_ci{
18110826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
18120826e83eSopenharmony_ci    if (!nweb_ptr) {
18130826e83eSopenharmony_ci        return "";
18140826e83eSopenharmony_ci    }
18150826e83eSopenharmony_ci    std::shared_ptr<OHOS::NWeb::NWebPreference> setting = nweb_ptr->GetPreference();
18160826e83eSopenharmony_ci    if (!setting) {
18170826e83eSopenharmony_ci        return "";
18180826e83eSopenharmony_ci    }
18190826e83eSopenharmony_ci    return setting->GetSurfaceId();
18200826e83eSopenharmony_ci}
18210826e83eSopenharmony_ci
18220826e83eSopenharmony_civoid WebviewController::UpdateInstanceId(int32_t newId)
18230826e83eSopenharmony_ci{
18240826e83eSopenharmony_ci    if (javaScriptResultCb_) {
18250826e83eSopenharmony_ci        javaScriptResultCb_->UpdateInstanceId(newId);
18260826e83eSopenharmony_ci    }
18270826e83eSopenharmony_ci}
18280826e83eSopenharmony_ci
18290826e83eSopenharmony_ciErrCode WebviewController::SetUrlTrustList(const std::string& urlTrustList, std::string& detailErrMsg)
18300826e83eSopenharmony_ci{
18310826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
18320826e83eSopenharmony_ci    if (!nweb_ptr) {
18330826e83eSopenharmony_ci        return NWebError::INIT_ERROR;
18340826e83eSopenharmony_ci    }
18350826e83eSopenharmony_ci
18360826e83eSopenharmony_ci    int ret = NWebError::NO_ERROR;
18370826e83eSopenharmony_ci    switch (nweb_ptr->SetUrlTrustListWithErrMsg(urlTrustList, detailErrMsg)) {
18380826e83eSopenharmony_ci        case static_cast<int>(UrlListSetResult::INIT_ERROR):
18390826e83eSopenharmony_ci            ret = NWebError::INIT_ERROR;
18400826e83eSopenharmony_ci            break;
18410826e83eSopenharmony_ci        case static_cast<int>(UrlListSetResult::PARAM_ERROR):
18420826e83eSopenharmony_ci            ret = NWebError::PARAM_CHECK_ERROR;
18430826e83eSopenharmony_ci            break;
18440826e83eSopenharmony_ci        case static_cast<int>(UrlListSetResult::SET_OK):
18450826e83eSopenharmony_ci            ret = NWebError::NO_ERROR;
18460826e83eSopenharmony_ci            break;
18470826e83eSopenharmony_ci        default:
18480826e83eSopenharmony_ci            ret = NWebError::PARAM_CHECK_ERROR;
18490826e83eSopenharmony_ci            break;
18500826e83eSopenharmony_ci    }
18510826e83eSopenharmony_ci    return ret;
18520826e83eSopenharmony_ci}
18530826e83eSopenharmony_cibool WebviewController::ParseJsLengthResourceToInt(
18540826e83eSopenharmony_ci    napi_env env, napi_value jsLength, PixelUnit &type, int32_t &result) const
18550826e83eSopenharmony_ci{
18560826e83eSopenharmony_ci    napi_value resIdObj = nullptr;
18570826e83eSopenharmony_ci    int32_t resId;
18580826e83eSopenharmony_ci
18590826e83eSopenharmony_ci    if ((napi_get_named_property(env, jsLength, "id", &resIdObj) != napi_ok)) {
18600826e83eSopenharmony_ci        return false;
18610826e83eSopenharmony_ci    }
18620826e83eSopenharmony_ci
18630826e83eSopenharmony_ci    if (!NapiParseUtils::ParseInt32(env, resIdObj, resId)) {
18640826e83eSopenharmony_ci        return false;
18650826e83eSopenharmony_ci    }
18660826e83eSopenharmony_ci
18670826e83eSopenharmony_ci    std::shared_ptr<AbilityRuntime::ApplicationContext> context =
18680826e83eSopenharmony_ci        AbilityRuntime::ApplicationContext::GetApplicationContext();
18690826e83eSopenharmony_ci    if (!context) {
18700826e83eSopenharmony_ci        WVLOG_E("WebPageSnapshot Failed to get application context.");
18710826e83eSopenharmony_ci        return false;
18720826e83eSopenharmony_ci    }
18730826e83eSopenharmony_ci    auto resourceManager = context->GetResourceManager();
18740826e83eSopenharmony_ci    if (!resourceManager) {
18750826e83eSopenharmony_ci        WVLOG_E("WebPageSnapshot Failed to get resource manager.");
18760826e83eSopenharmony_ci        return false;
18770826e83eSopenharmony_ci    }
18780826e83eSopenharmony_ci
18790826e83eSopenharmony_ci    napi_value jsResourceType = nullptr;
18800826e83eSopenharmony_ci    napi_valuetype resourceType = napi_null;
18810826e83eSopenharmony_ci    napi_get_named_property(env, jsLength, "type", &jsResourceType);
18820826e83eSopenharmony_ci    napi_typeof(env, jsResourceType, &resourceType);
18830826e83eSopenharmony_ci    if (resourceType == napi_number) {
18840826e83eSopenharmony_ci        int32_t resourceTypeNum;
18850826e83eSopenharmony_ci        NapiParseUtils::ParseInt32(env, jsResourceType, resourceTypeNum);
18860826e83eSopenharmony_ci        switch (resourceTypeNum) {
18870826e83eSopenharmony_ci            case static_cast<int>(ResourceType::INTEGER):
18880826e83eSopenharmony_ci                if (resourceManager->GetIntegerById(resId, result) == Global::Resource::SUCCESS) {
18890826e83eSopenharmony_ci                    type = PixelUnit::VP;
18900826e83eSopenharmony_ci                    return true;
18910826e83eSopenharmony_ci                }
18920826e83eSopenharmony_ci                break;
18930826e83eSopenharmony_ci            case static_cast<int>(ResourceType::STRING):
18940826e83eSopenharmony_ci                std::string resourceString;
18950826e83eSopenharmony_ci                if (resourceManager->GetStringById(resId, resourceString) == Global::Resource::SUCCESS) {
18960826e83eSopenharmony_ci                    return NapiParseUtils::ParseJsLengthStringToInt(resourceString, type, result);
18970826e83eSopenharmony_ci                }
18980826e83eSopenharmony_ci                break;
18990826e83eSopenharmony_ci        }
19000826e83eSopenharmony_ci        WVLOG_E("WebPageSnapshot resource type not support");
19010826e83eSopenharmony_ci        return false;
19020826e83eSopenharmony_ci    }
19030826e83eSopenharmony_ci    WVLOG_E("WebPageSnapshot resource type error");
19040826e83eSopenharmony_ci    return false;
19050826e83eSopenharmony_ci}
19060826e83eSopenharmony_ci
19070826e83eSopenharmony_cibool WebviewController::ParseJsLengthToInt(
19080826e83eSopenharmony_ci    napi_env env, napi_value jsLength, PixelUnit &type, int32_t &result) const
19090826e83eSopenharmony_ci{
19100826e83eSopenharmony_ci    napi_valuetype jsType = napi_null;
19110826e83eSopenharmony_ci    napi_typeof(env, jsLength, &jsType);
19120826e83eSopenharmony_ci    if ((jsType != napi_object) && (jsType != napi_string) && (jsType != napi_number)) {
19130826e83eSopenharmony_ci        WVLOG_E("WebPageSnapshot Unable to parse js length object.");
19140826e83eSopenharmony_ci        return false;
19150826e83eSopenharmony_ci    }
19160826e83eSopenharmony_ci
19170826e83eSopenharmony_ci    if (jsType == napi_number) {
19180826e83eSopenharmony_ci        NapiParseUtils::ParseInt32(env, jsLength, result);
19190826e83eSopenharmony_ci        type = PixelUnit::VP;
19200826e83eSopenharmony_ci        return true;
19210826e83eSopenharmony_ci    }
19220826e83eSopenharmony_ci
19230826e83eSopenharmony_ci    if (jsType == napi_string) {
19240826e83eSopenharmony_ci        std::string nativeString;
19250826e83eSopenharmony_ci        NapiParseUtils::ParseString(env, jsLength, nativeString);
19260826e83eSopenharmony_ci        if (!NapiParseUtils::ParseJsLengthStringToInt(nativeString, type, result)) {
19270826e83eSopenharmony_ci            return false;
19280826e83eSopenharmony_ci        }
19290826e83eSopenharmony_ci        return true;
19300826e83eSopenharmony_ci    }
19310826e83eSopenharmony_ci
19320826e83eSopenharmony_ci    if (jsType == napi_object) {
19330826e83eSopenharmony_ci        return ParseJsLengthResourceToInt(env, jsLength, type, result);
19340826e83eSopenharmony_ci    }
19350826e83eSopenharmony_ci    return false;
19360826e83eSopenharmony_ci}
19370826e83eSopenharmony_ci
19380826e83eSopenharmony_ciErrCode WebviewController::WebPageSnapshot(
19390826e83eSopenharmony_ci    const char *id, PixelUnit type, int32_t width, int32_t height, const WebSnapshotCallback callback)
19400826e83eSopenharmony_ci{
19410826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
19420826e83eSopenharmony_ci    if (!nweb_ptr) {
19430826e83eSopenharmony_ci        return INIT_ERROR;
19440826e83eSopenharmony_ci    }
19450826e83eSopenharmony_ci
19460826e83eSopenharmony_ci    bool init = nweb_ptr->WebPageSnapshot(id, type, width, height, std::move(callback));
19470826e83eSopenharmony_ci    if (!init) {
19480826e83eSopenharmony_ci        return INIT_ERROR;
19490826e83eSopenharmony_ci    }
19500826e83eSopenharmony_ci
19510826e83eSopenharmony_ci    return NWebError::NO_ERROR;
19520826e83eSopenharmony_ci}
19530826e83eSopenharmony_ci
19540826e83eSopenharmony_cibool WebviewController::GetHapModuleInfo()
19550826e83eSopenharmony_ci{
19560826e83eSopenharmony_ci    sptr<ISystemAbilityManager> systemAbilityManager =
19570826e83eSopenharmony_ci    SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
19580826e83eSopenharmony_ci    if (systemAbilityManager == nullptr) {
19590826e83eSopenharmony_ci        WVLOG_E("get SystemAbilityManager failed");
19600826e83eSopenharmony_ci        return false;
19610826e83eSopenharmony_ci    }
19620826e83eSopenharmony_ci    sptr<IRemoteObject> remoteObject =
19630826e83eSopenharmony_ci        systemAbilityManager->GetSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
19640826e83eSopenharmony_ci    if (remoteObject == nullptr) {
19650826e83eSopenharmony_ci        WVLOG_E("get Bundle Manager failed");
19660826e83eSopenharmony_ci        return false;
19670826e83eSopenharmony_ci    }
19680826e83eSopenharmony_ci    auto bundleMgr = iface_cast<AppExecFwk::IBundleMgr>(remoteObject);
19690826e83eSopenharmony_ci    if (bundleMgr == nullptr) {
19700826e83eSopenharmony_ci        WVLOG_E("get Bundle Manager failed");
19710826e83eSopenharmony_ci        return false;
19720826e83eSopenharmony_ci    }
19730826e83eSopenharmony_ci    AppExecFwk::BundleInfo bundleInfo;
19740826e83eSopenharmony_ci    if (bundleMgr->GetBundleInfoForSelf(
19750826e83eSopenharmony_ci        static_cast<int32_t>(AppExecFwk::GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE),
19760826e83eSopenharmony_ci        bundleInfo) != 0) {
19770826e83eSopenharmony_ci        WVLOG_E("get bundle info failed");
19780826e83eSopenharmony_ci        return false;
19790826e83eSopenharmony_ci    }
19800826e83eSopenharmony_ci    moduleName_ = bundleInfo.moduleNames;
19810826e83eSopenharmony_ci    return true;
19820826e83eSopenharmony_ci}
19830826e83eSopenharmony_ci
19840826e83eSopenharmony_civoid WebviewController::SetPathAllowingUniversalAccess(
19850826e83eSopenharmony_ci    const std::vector<std::string>& pathList, std::string& errorPath)
19860826e83eSopenharmony_ci{
19870826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
19880826e83eSopenharmony_ci    if (!nweb_ptr) {
19890826e83eSopenharmony_ci        return;
19900826e83eSopenharmony_ci    }
19910826e83eSopenharmony_ci    if (moduleName_.empty()) {
19920826e83eSopenharmony_ci        WVLOG_I("need to get module name for path");
19930826e83eSopenharmony_ci        if (!GetHapModuleInfo()) {
19940826e83eSopenharmony_ci            WVLOG_E("GetHapModuleInfo failed");
19950826e83eSopenharmony_ci            moduleName_.clear();
19960826e83eSopenharmony_ci            return;
19970826e83eSopenharmony_ci        }
19980826e83eSopenharmony_ci    }
19990826e83eSopenharmony_ci    nweb_ptr->SetPathAllowingUniversalAccess(pathList, moduleName_, errorPath);
20000826e83eSopenharmony_ci}
20010826e83eSopenharmony_ci
20020826e83eSopenharmony_civoid WebviewController::ScrollToWithAnime(float x, float y, int32_t duration)
20030826e83eSopenharmony_ci{
20040826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
20050826e83eSopenharmony_ci    if (nweb_ptr) {
20060826e83eSopenharmony_ci        nweb_ptr->ScrollToWithAnime(x, y, duration);
20070826e83eSopenharmony_ci    }
20080826e83eSopenharmony_ci    return;
20090826e83eSopenharmony_ci}
20100826e83eSopenharmony_ci
20110826e83eSopenharmony_civoid WebviewController::ScrollByWithAnime(float deltaX, float deltaY, int32_t duration)
20120826e83eSopenharmony_ci{
20130826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
20140826e83eSopenharmony_ci    if (nweb_ptr) {
20150826e83eSopenharmony_ci        nweb_ptr->ScrollByWithAnime(deltaX, deltaY, duration);
20160826e83eSopenharmony_ci    }
20170826e83eSopenharmony_ci    return;
20180826e83eSopenharmony_ci}
20190826e83eSopenharmony_ci
20200826e83eSopenharmony_civoid WebviewController::SetBackForwardCacheOptions(int32_t size, int32_t timeToLive)
20210826e83eSopenharmony_ci{
20220826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
20230826e83eSopenharmony_ci    if (!nweb_ptr) {
20240826e83eSopenharmony_ci        return;
20250826e83eSopenharmony_ci    }
20260826e83eSopenharmony_ci
20270826e83eSopenharmony_ci    nweb_ptr->SetBackForwardCacheOptions(size, timeToLive);
20280826e83eSopenharmony_ci}
20290826e83eSopenharmony_ci
20300826e83eSopenharmony_civoid WebviewController::GetScrollOffset(float* offset_x, float* offset_y)
20310826e83eSopenharmony_ci{
20320826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
20330826e83eSopenharmony_ci    if (nweb_ptr) {
20340826e83eSopenharmony_ci        nweb_ptr->GetScrollOffset(offset_x, offset_y);
20350826e83eSopenharmony_ci    }
20360826e83eSopenharmony_ci}
20370826e83eSopenharmony_ci
20380826e83eSopenharmony_cibool WebviewController::ScrollByWithResult(float deltaX, float deltaY) const
20390826e83eSopenharmony_ci{
20400826e83eSopenharmony_ci    bool enabled = false;
20410826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
20420826e83eSopenharmony_ci    if (nweb_ptr) {
20430826e83eSopenharmony_ci        enabled = nweb_ptr->ScrollByWithResult(deltaX, deltaY);
20440826e83eSopenharmony_ci    }
20450826e83eSopenharmony_ci    return enabled;
20460826e83eSopenharmony_ci}
20470826e83eSopenharmony_ci
20480826e83eSopenharmony_civoid WebviewController::SetScrollable(bool enable, int32_t scrollType)
20490826e83eSopenharmony_ci{
20500826e83eSopenharmony_ci    auto nweb_ptr = NWebHelper::Instance().GetNWeb(nwebId_);
20510826e83eSopenharmony_ci    if (!nweb_ptr) {
20520826e83eSopenharmony_ci        return;
20530826e83eSopenharmony_ci    }
20540826e83eSopenharmony_ci    std::shared_ptr<OHOS::NWeb::NWebPreference> setting = nweb_ptr->GetPreference();
20550826e83eSopenharmony_ci    if (!setting) {
20560826e83eSopenharmony_ci        return;
20570826e83eSopenharmony_ci    }
20580826e83eSopenharmony_ci    return setting->SetScrollable(enable, scrollType);
20590826e83eSopenharmony_ci}
20600826e83eSopenharmony_ci
20610826e83eSopenharmony_civoid WebMessageExt::SetType(int type)
20620826e83eSopenharmony_ci{
20630826e83eSopenharmony_ci    type_ = type;
20640826e83eSopenharmony_ci    WebMessageType jsType = static_cast<WebMessageType>(type);
20650826e83eSopenharmony_ci    NWebValue::Type nwebType = NWebValue::Type::NONE;
20660826e83eSopenharmony_ci    switch (jsType) {
20670826e83eSopenharmony_ci        case WebMessageType::STRING: {
20680826e83eSopenharmony_ci            nwebType = NWebValue::Type::STRING;
20690826e83eSopenharmony_ci            break;
20700826e83eSopenharmony_ci        }
20710826e83eSopenharmony_ci        case WebMessageType::NUMBER: {
20720826e83eSopenharmony_ci            nwebType = NWebValue::Type::DOUBLE;
20730826e83eSopenharmony_ci            break;
20740826e83eSopenharmony_ci        }
20750826e83eSopenharmony_ci        case WebMessageType::BOOLEAN: {
20760826e83eSopenharmony_ci            nwebType = NWebValue::Type::BOOLEAN;
20770826e83eSopenharmony_ci            break;
20780826e83eSopenharmony_ci        }
20790826e83eSopenharmony_ci        case WebMessageType::ARRAYBUFFER: {
20800826e83eSopenharmony_ci            nwebType = NWebValue::Type::BINARY;
20810826e83eSopenharmony_ci            break;
20820826e83eSopenharmony_ci        }
20830826e83eSopenharmony_ci        case WebMessageType::ARRAY: {
20840826e83eSopenharmony_ci            nwebType = NWebValue::Type::STRINGARRAY;
20850826e83eSopenharmony_ci            break;
20860826e83eSopenharmony_ci        }
20870826e83eSopenharmony_ci        case WebMessageType::ERROR: {
20880826e83eSopenharmony_ci            nwebType = NWebValue::Type::ERROR;
20890826e83eSopenharmony_ci            break;
20900826e83eSopenharmony_ci        }
20910826e83eSopenharmony_ci        default: {
20920826e83eSopenharmony_ci            nwebType = NWebValue::Type::NONE;
20930826e83eSopenharmony_ci            break;
20940826e83eSopenharmony_ci        }
20950826e83eSopenharmony_ci    }
20960826e83eSopenharmony_ci    if (data_) {
20970826e83eSopenharmony_ci        data_->SetType(nwebType);
20980826e83eSopenharmony_ci    }
20990826e83eSopenharmony_ci}
21000826e83eSopenharmony_ci
21010826e83eSopenharmony_ciint WebMessageExt::ConvertNwebType2JsType(NWebValue::Type type)
21020826e83eSopenharmony_ci{
21030826e83eSopenharmony_ci    WebMessageType jsType = WebMessageType::NOTSUPPORT;
21040826e83eSopenharmony_ci    switch (type) {
21050826e83eSopenharmony_ci        case NWebValue::Type::STRING: {
21060826e83eSopenharmony_ci            jsType = WebMessageType::STRING;
21070826e83eSopenharmony_ci            break;
21080826e83eSopenharmony_ci        }
21090826e83eSopenharmony_ci        case NWebValue::Type::DOUBLE:
21100826e83eSopenharmony_ci        case NWebValue::Type::INTEGER: {
21110826e83eSopenharmony_ci            jsType = WebMessageType::NUMBER;
21120826e83eSopenharmony_ci            break;
21130826e83eSopenharmony_ci        }
21140826e83eSopenharmony_ci        case NWebValue::Type::BOOLEAN: {
21150826e83eSopenharmony_ci            jsType = WebMessageType::BOOLEAN;
21160826e83eSopenharmony_ci            break;
21170826e83eSopenharmony_ci        }
21180826e83eSopenharmony_ci        case NWebValue::Type::STRINGARRAY:
21190826e83eSopenharmony_ci        case NWebValue::Type::DOUBLEARRAY:
21200826e83eSopenharmony_ci        case NWebValue::Type::INT64ARRAY:
21210826e83eSopenharmony_ci        case NWebValue::Type::BOOLEANARRAY: {
21220826e83eSopenharmony_ci            jsType = WebMessageType::ARRAY;
21230826e83eSopenharmony_ci            break;
21240826e83eSopenharmony_ci        }
21250826e83eSopenharmony_ci        case NWebValue::Type::BINARY: {
21260826e83eSopenharmony_ci            jsType = WebMessageType::ARRAYBUFFER;
21270826e83eSopenharmony_ci            break;
21280826e83eSopenharmony_ci        }
21290826e83eSopenharmony_ci        case NWebValue::Type::ERROR: {
21300826e83eSopenharmony_ci            jsType = WebMessageType::ERROR;
21310826e83eSopenharmony_ci            break;
21320826e83eSopenharmony_ci        }
21330826e83eSopenharmony_ci        default: {
21340826e83eSopenharmony_ci            jsType = WebMessageType::NOTSUPPORT;
21350826e83eSopenharmony_ci            break;
21360826e83eSopenharmony_ci        }
21370826e83eSopenharmony_ci    }
21380826e83eSopenharmony_ci    return static_cast<int>(jsType);
21390826e83eSopenharmony_ci}
21400826e83eSopenharmony_ci
21410826e83eSopenharmony_ci} // namespace NWeb
21420826e83eSopenharmony_ci} // namespace OHOS
2143