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