10826e83eSopenharmony_ci/* 20826e83eSopenharmony_ci * Copyright (c) 2024 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 "arkweb_interface.h" 170826e83eSopenharmony_ci 180826e83eSopenharmony_ci#include "arkweb_type.h" 190826e83eSopenharmony_ci#include "nweb_helper.h" 200826e83eSopenharmony_ci#include "nweb_log.h" 210826e83eSopenharmony_ci#include "arkweb_error_code.h" 220826e83eSopenharmony_ci 230826e83eSopenharmony_cinamespace { 240826e83eSopenharmony_ci#define ARKWEB_NATIVE_FOR_EACH_COMPONENT_API_FN(DO) \ 250826e83eSopenharmony_ci DO(onControllerAttached, OH_ArkWeb_OnControllerAttached); \ 260826e83eSopenharmony_ci DO(onPageBegin, OH_ArkWeb_OnPageBegin); \ 270826e83eSopenharmony_ci DO(onPageEnd, OH_ArkWeb_OnPageEnd); \ 280826e83eSopenharmony_ci DO(onDestroy, OH_ArkWeb_OnDestroy) 290826e83eSopenharmony_ci 300826e83eSopenharmony_ci#define ARKWEB_NATIVE_FOR_EACH_CONTROLLER_API_FN(DO) \ 310826e83eSopenharmony_ci DO(runJavaScript, OH_ArkWeb_RunJavaScript); \ 320826e83eSopenharmony_ci DO(registerJavaScriptProxy, OH_ArkWeb_RegisterJavaScriptProxy); \ 330826e83eSopenharmony_ci DO(deleteJavaScriptRegister, OH_ArkWeb_DeleteJavaScriptProxy); \ 340826e83eSopenharmony_ci DO(refresh, OH_ArkWeb_Refresh); \ 350826e83eSopenharmony_ci DO(registerAsyncJavaScriptProxy, OH_ArkWeb_RegisterAsyncJavaScriptProxy); \ 360826e83eSopenharmony_ci DO(createWebMessagePorts, OH_ArkWeb_CreateWebMessagePorts); \ 370826e83eSopenharmony_ci DO(destroyWebMessagePorts, OH_ArkWeb_DestroyWebMessagePorts); \ 380826e83eSopenharmony_ci DO(postWebMessage, OH_ArkWeb_PostWebMessage) 390826e83eSopenharmony_ci 400826e83eSopenharmony_ci#define ARKWEB_NATIVE_FOR_EACH_WEBMESSAGEPORT_API_FN(DO) \ 410826e83eSopenharmony_ci DO(postMessage, OH_WebMessage_PostMessage); \ 420826e83eSopenharmony_ci DO(close, OH_WebMessage_Close); \ 430826e83eSopenharmony_ci DO(setMessageEventHandler, OH_WebMessage_SetMessageEventHandler) 440826e83eSopenharmony_ci 450826e83eSopenharmony_ci#define ARKWEB_NATIVE_FOR_EACH_WEBMESSAGE_API_FN(DO) \ 460826e83eSopenharmony_ci DO(createWebMessage, OH_WebMessage_CreateWebMessage); \ 470826e83eSopenharmony_ci DO(destroyWebMessage, OH_WebMessage_DestroyWebMessage); \ 480826e83eSopenharmony_ci DO(setType, OH_WebMessage_SetType); \ 490826e83eSopenharmony_ci DO(getType, OH_WebMessage_GetType); \ 500826e83eSopenharmony_ci DO(setData, OH_WebMessage_SetData); \ 510826e83eSopenharmony_ci DO(getData, OH_WebMessage_GetData) 520826e83eSopenharmony_ci 530826e83eSopenharmony_ci#define ARKWEB_NATIVE_FOR_EACH_WEBCOOKIEMANAGER_API_FN(DO) \ 540826e83eSopenharmony_ci DO(fetchCookieSync, OH_CookieManager_FetchCookieSync); \ 550826e83eSopenharmony_ci DO(configCookieSync, OH_CookieManager_ConfigCookieSync); \ 560826e83eSopenharmony_ci DO(existCookies, OH_CookieManager_ExistCookies); \ 570826e83eSopenharmony_ci DO(clearAllCookiesSync, OH_CookieManager_ClearAllCookiesSync); \ 580826e83eSopenharmony_ci DO(clearSessionCookiesSync, OH_CookieManager_ClearSessionCookiesSync) 590826e83eSopenharmony_ci 600826e83eSopenharmony_ciArkWeb_ComponentAPI* g_ComponentImpl = nullptr; 610826e83eSopenharmony_ciArkWeb_ControllerAPI* g_ControllerImpl = nullptr; 620826e83eSopenharmony_ciArkWeb_WebMessagePortAPI* g_WebMessagePortImpl = nullptr; 630826e83eSopenharmony_ciArkWeb_WebMessageAPI* g_WebMessageImpl = nullptr; 640826e83eSopenharmony_ciArkWeb_CookieManagerAPI* g_CookieManagerImpl = nullptr; 650826e83eSopenharmony_ci 660826e83eSopenharmony_ci} // namespace 670826e83eSopenharmony_ci 680826e83eSopenharmony_citemplate<typename Fn> 690826e83eSopenharmony_cistatic void LoadFunction(const char* functionName, Fn* fnOut) 700826e83eSopenharmony_ci{ 710826e83eSopenharmony_ci void* fn = OHOS::NWeb::NWebHelper::Instance().LoadFuncSymbol(functionName); 720826e83eSopenharmony_ci if (!fn) { 730826e83eSopenharmony_ci WVLOG_E("%{public}s not found.", functionName); 740826e83eSopenharmony_ci return; 750826e83eSopenharmony_ci } 760826e83eSopenharmony_ci *fnOut = reinterpret_cast<Fn>(fn); 770826e83eSopenharmony_ci} 780826e83eSopenharmony_ci 790826e83eSopenharmony_cistatic bool LoadComponentAPI() 800826e83eSopenharmony_ci{ 810826e83eSopenharmony_ci if (g_ComponentImpl) { 820826e83eSopenharmony_ci WVLOG_I("NativeArkWeb component api already loaded"); 830826e83eSopenharmony_ci return true; 840826e83eSopenharmony_ci } 850826e83eSopenharmony_ci g_ComponentImpl = new (std::nothrow) ArkWeb_ComponentAPI(); 860826e83eSopenharmony_ci if (!g_ComponentImpl) { 870826e83eSopenharmony_ci WVLOG_E("NativeArkWeb component api is nullptr"); 880826e83eSopenharmony_ci return false; 890826e83eSopenharmony_ci } 900826e83eSopenharmony_ci g_ComponentImpl->size = sizeof(ArkWeb_ComponentAPI); 910826e83eSopenharmony_ci 920826e83eSopenharmony_ci if (!OHOS::NWeb::NWebHelper::Instance().LoadWebEngine(true, false)) { 930826e83eSopenharmony_ci WVLOG_E("NativeArkWeb webEngineHandle is nullptr"); 940826e83eSopenharmony_ci return false; 950826e83eSopenharmony_ci } 960826e83eSopenharmony_ci#define ARKWEB_NATIVE_LOAD_FN_PTR(fn, ndkFn) LoadFunction(#ndkFn, &(g_ComponentImpl->fn)) 970826e83eSopenharmony_ci ARKWEB_NATIVE_FOR_EACH_COMPONENT_API_FN(ARKWEB_NATIVE_LOAD_FN_PTR); 980826e83eSopenharmony_ci#undef ARKWEB_NATIVE_LOAD_FN_PTR 990826e83eSopenharmony_ci 1000826e83eSopenharmony_ci return true; 1010826e83eSopenharmony_ci} 1020826e83eSopenharmony_ci 1030826e83eSopenharmony_cistatic bool LoadControllerAPI() 1040826e83eSopenharmony_ci{ 1050826e83eSopenharmony_ci if (g_ControllerImpl) { 1060826e83eSopenharmony_ci WVLOG_I("NativeArkWeb controller api already loaded"); 1070826e83eSopenharmony_ci return true; 1080826e83eSopenharmony_ci } 1090826e83eSopenharmony_ci g_ControllerImpl = new (std::nothrow) ArkWeb_ControllerAPI(); 1100826e83eSopenharmony_ci if (!g_ControllerImpl) { 1110826e83eSopenharmony_ci WVLOG_E("NativeArkWeb controller api is nullptr"); 1120826e83eSopenharmony_ci return false; 1130826e83eSopenharmony_ci } 1140826e83eSopenharmony_ci g_ControllerImpl->size = sizeof(ArkWeb_ControllerAPI); 1150826e83eSopenharmony_ci 1160826e83eSopenharmony_ci if (!OHOS::NWeb::NWebHelper::Instance().LoadWebEngine(true, false)) { 1170826e83eSopenharmony_ci WVLOG_E("NativeArkWeb webEngineHandle is nullptr"); 1180826e83eSopenharmony_ci return false; 1190826e83eSopenharmony_ci } 1200826e83eSopenharmony_ci#define ARKWEB_NATIVE_LOAD_FN_PTR(fn, ndkFn) LoadFunction(#ndkFn, &(g_ControllerImpl->fn)) 1210826e83eSopenharmony_ci ARKWEB_NATIVE_FOR_EACH_CONTROLLER_API_FN(ARKWEB_NATIVE_LOAD_FN_PTR); 1220826e83eSopenharmony_ci#undef ARKWEB_NATIVE_LOAD_FN_PTR 1230826e83eSopenharmony_ci 1240826e83eSopenharmony_ci return true; 1250826e83eSopenharmony_ci} 1260826e83eSopenharmony_ci 1270826e83eSopenharmony_cistatic bool LoadWebMessagePortAPI() 1280826e83eSopenharmony_ci{ 1290826e83eSopenharmony_ci if (g_WebMessagePortImpl) { 1300826e83eSopenharmony_ci WVLOG_I("NativeArkWeb web message port api already loaded"); 1310826e83eSopenharmony_ci return true; 1320826e83eSopenharmony_ci } 1330826e83eSopenharmony_ci g_WebMessagePortImpl = new (std::nothrow) ArkWeb_WebMessagePortAPI(); 1340826e83eSopenharmony_ci if (!g_WebMessagePortImpl) { 1350826e83eSopenharmony_ci WVLOG_E("NativeArkWeb web message port api is nullptr"); 1360826e83eSopenharmony_ci return false; 1370826e83eSopenharmony_ci } 1380826e83eSopenharmony_ci g_WebMessagePortImpl->size = sizeof(ArkWeb_WebMessagePortAPI); 1390826e83eSopenharmony_ci 1400826e83eSopenharmony_ci if (!OHOS::NWeb::NWebHelper::Instance().LoadWebEngine(true, false)) { 1410826e83eSopenharmony_ci WVLOG_E("NativeArkWeb webEngineHandle is nullptr"); 1420826e83eSopenharmony_ci return false; 1430826e83eSopenharmony_ci } 1440826e83eSopenharmony_ci#define ARKWEB_NATIVE_LOAD_FN_PTR(fn, ndkFn) LoadFunction(#ndkFn, &(g_WebMessagePortImpl->fn)) 1450826e83eSopenharmony_ci ARKWEB_NATIVE_FOR_EACH_WEBMESSAGEPORT_API_FN(ARKWEB_NATIVE_LOAD_FN_PTR); 1460826e83eSopenharmony_ci#undef ARKWEB_NATIVE_LOAD_FN_PTR 1470826e83eSopenharmony_ci 1480826e83eSopenharmony_ci return true; 1490826e83eSopenharmony_ci} 1500826e83eSopenharmony_ci 1510826e83eSopenharmony_cistatic bool LoadWebMessageAPI() 1520826e83eSopenharmony_ci{ 1530826e83eSopenharmony_ci if (g_WebMessageImpl) { 1540826e83eSopenharmony_ci WVLOG_I("NativeArkWeb web message api already loaded"); 1550826e83eSopenharmony_ci return true; 1560826e83eSopenharmony_ci } 1570826e83eSopenharmony_ci g_WebMessageImpl = new (std::nothrow) ArkWeb_WebMessageAPI(); 1580826e83eSopenharmony_ci if (!g_WebMessageImpl) { 1590826e83eSopenharmony_ci WVLOG_E("NativeArkWeb web message api is nullptr"); 1600826e83eSopenharmony_ci return false; 1610826e83eSopenharmony_ci } 1620826e83eSopenharmony_ci g_WebMessageImpl->size = sizeof(ArkWeb_WebMessageAPI); 1630826e83eSopenharmony_ci 1640826e83eSopenharmony_ci if (!OHOS::NWeb::NWebHelper::Instance().LoadWebEngine(true, false)) { 1650826e83eSopenharmony_ci WVLOG_E("NativeArkWeb webEngineHandle is nullptr"); 1660826e83eSopenharmony_ci return false; 1670826e83eSopenharmony_ci } 1680826e83eSopenharmony_ci#define ARKWEB_NATIVE_LOAD_FN_PTR(fn, ndkFn) LoadFunction(#ndkFn, &(g_WebMessageImpl->fn)) 1690826e83eSopenharmony_ci ARKWEB_NATIVE_FOR_EACH_WEBMESSAGE_API_FN(ARKWEB_NATIVE_LOAD_FN_PTR); 1700826e83eSopenharmony_ci#undef ARKWEB_NATIVE_LOAD_FN_PTR 1710826e83eSopenharmony_ci 1720826e83eSopenharmony_ci return true; 1730826e83eSopenharmony_ci} 1740826e83eSopenharmony_ci 1750826e83eSopenharmony_cistatic bool LoadCookieManagerAPI() 1760826e83eSopenharmony_ci{ 1770826e83eSopenharmony_ci if (g_CookieManagerImpl) { 1780826e83eSopenharmony_ci WVLOG_I("NativeArkWeb cookie manager api already loaded"); 1790826e83eSopenharmony_ci return true; 1800826e83eSopenharmony_ci } 1810826e83eSopenharmony_ci 1820826e83eSopenharmony_ci g_CookieManagerImpl = new ArkWeb_CookieManagerAPI(); 1830826e83eSopenharmony_ci if (!g_CookieManagerImpl) { 1840826e83eSopenharmony_ci WVLOG_E("NativeArkWeb cookie manager api is nullptr"); 1850826e83eSopenharmony_ci return false; 1860826e83eSopenharmony_ci } 1870826e83eSopenharmony_ci g_CookieManagerImpl->size = sizeof(ArkWeb_CookieManagerAPI); 1880826e83eSopenharmony_ci 1890826e83eSopenharmony_ci if (!OHOS::NWeb::NWebHelper::Instance().LoadWebEngine(true, true)) { 1900826e83eSopenharmony_ci WVLOG_E("NativeArkWeb webEngineHandle is nullptr"); 1910826e83eSopenharmony_ci return false; 1920826e83eSopenharmony_ci } 1930826e83eSopenharmony_ci#define ARKWEB_NATIVE_LOAD_FN_PTR(fn, ndkFn) LoadFunction(#ndkFn, &(g_CookieManagerImpl->fn)) 1940826e83eSopenharmony_ci ARKWEB_NATIVE_FOR_EACH_WEBCOOKIEMANAGER_API_FN(ARKWEB_NATIVE_LOAD_FN_PTR); 1950826e83eSopenharmony_ci#undef ARKWEB_NATIVE_LOAD_FN_PTR 1960826e83eSopenharmony_ci 1970826e83eSopenharmony_ci return true; 1980826e83eSopenharmony_ci} 1990826e83eSopenharmony_ci 2000826e83eSopenharmony_ciArkWeb_AnyNativeAPI* OH_ArkWeb_GetNativeAPI(ArkWeb_NativeAPIVariantKind type) 2010826e83eSopenharmony_ci{ 2020826e83eSopenharmony_ci switch (type) { 2030826e83eSopenharmony_ci case ARKWEB_NATIVE_COMPONENT: { 2040826e83eSopenharmony_ci if (!LoadComponentAPI()) { 2050826e83eSopenharmony_ci return nullptr; 2060826e83eSopenharmony_ci } 2070826e83eSopenharmony_ci return reinterpret_cast<ArkWeb_AnyNativeAPI*>(g_ComponentImpl); 2080826e83eSopenharmony_ci } 2090826e83eSopenharmony_ci case ARKWEB_NATIVE_CONTROLLER: { 2100826e83eSopenharmony_ci if (!LoadControllerAPI()) { 2110826e83eSopenharmony_ci return nullptr; 2120826e83eSopenharmony_ci } 2130826e83eSopenharmony_ci return reinterpret_cast<ArkWeb_AnyNativeAPI*>(g_ControllerImpl); 2140826e83eSopenharmony_ci } 2150826e83eSopenharmony_ci case ARKWEB_NATIVE_WEB_MESSAGE_PORT: { 2160826e83eSopenharmony_ci if (!LoadWebMessagePortAPI()) { 2170826e83eSopenharmony_ci return nullptr; 2180826e83eSopenharmony_ci } 2190826e83eSopenharmony_ci return reinterpret_cast<ArkWeb_AnyNativeAPI*>(g_WebMessagePortImpl); 2200826e83eSopenharmony_ci } 2210826e83eSopenharmony_ci case ARKWEB_NATIVE_WEB_MESSAGE: { 2220826e83eSopenharmony_ci if (!LoadWebMessageAPI()) { 2230826e83eSopenharmony_ci return nullptr; 2240826e83eSopenharmony_ci } 2250826e83eSopenharmony_ci return reinterpret_cast<ArkWeb_AnyNativeAPI*>(g_WebMessageImpl); 2260826e83eSopenharmony_ci } 2270826e83eSopenharmony_ci case ARKWEB_NATIVE_COOKIE_MANAGER: { 2280826e83eSopenharmony_ci if (!LoadCookieManagerAPI()) { 2290826e83eSopenharmony_ci return nullptr; 2300826e83eSopenharmony_ci } 2310826e83eSopenharmony_ci return reinterpret_cast<ArkWeb_AnyNativeAPI*>(g_CookieManagerImpl); 2320826e83eSopenharmony_ci } 2330826e83eSopenharmony_ci default: { 2340826e83eSopenharmony_ci WVLOG_E("fail to get %{public}d arkweb api family", type); 2350826e83eSopenharmony_ci return nullptr; 2360826e83eSopenharmony_ci } 2370826e83eSopenharmony_ci } 2380826e83eSopenharmony_ci} 239