• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "ohos_nweb/bridge/ark_web_nweb_webview_bridge_helper.h"
17 
18 #include "base/bridge/ark_web_bridge_macros.h"
19 
20 namespace OHOS::ArkWeb {
21 
22 const std::string NWEB_LIB_FILE_NAME = "libarkweb_engine.so";
23 
ArkWebNWebWebviewBridgeHelper()24 ArkWebNWebWebviewBridgeHelper::ArkWebNWebWebviewBridgeHelper()
25 {
26     InitFuncMemberMaps(ARK_WEB_NWEB_INTERFACE_INIT, ARK_WEB_NWEB_INTERFACE_BUTT);
27 }
28 
Init(bool runMode,const std::string & bundlePath)29 bool ArkWebNWebWebviewBridgeHelper::Init(bool runMode, const std::string& bundlePath)
30 {
31     std::string libDirPath;
32     if (runMode) {
33         libDirPath = bundlePath + "/" + WEBVIEW_RELATIVE_PATH_FOR_BUNDLE;
34     } else {
35         libDirPath = bundlePath + "/" + WEBVIEW_RELATIVE_PATH_FOR_MOCK;
36     }
37 
38 #ifdef __MUSL__
39     if (!LoadLibFile(RTLD_NOW | RTLD_GLOBAL, "nweb_ns", libDirPath, NWEB_LIB_FILE_NAME)) {
40 #else
41     if (!LoadLibFile(RTLD_NOW, libDirPath + "/" + NWEB_LIB_FILE_NAME)) {
42 #endif
43         return false;
44     }
45 
46     memberCheckFunc_ =
47         reinterpret_cast<ArkWebMemberCheckFunc>(LoadFuncSymbol("ark_web_nweb_webcore_check_func_static"));
48     if (!memberCheckFunc_) {
49         ARK_WEB_BRIDGE_INFO_LOG("failed to load func ark_web_nweb_webcore_check_func_static");
50     }
51     return true;
52 }
53 
54 ArkWebNWebWebviewBridgeHelper& ArkWebNWebWebviewBridgeHelper::GetInstance()
55 {
56     static ArkWebNWebWebviewBridgeHelper helper;
57     return helper;
58 }
59 
60 void ArkWebNWebWebviewBridgeHelper::PreloadLibFile(bool runMode, const std::string& bundlePath)
61 {
62     std::string libFilePath;
63     if (runMode) {
64         libFilePath = bundlePath + "/" + WEBVIEW_RELATIVE_PATH_FOR_BUNDLE + "/" + NWEB_LIB_FILE_NAME;
65     } else {
66         libFilePath = bundlePath + "/" + WEBVIEW_RELATIVE_PATH_FOR_MOCK + "/" + NWEB_LIB_FILE_NAME;
67     }
68 
69     ArkWebBridgeHelper::PrereadLibFile(libFilePath);
70 }
71 
72 void ArkWebNWebWebviewBridgeHelper::PreDlopenLibFile(const std::string& bundlePath)
73 {
74     std::string libDirPath = bundlePath + "/" + WEBVIEW_RELATIVE_PATH_FOR_BUNDLE;
75 #ifdef __MUSL__
76     LoadLibFile(RTLD_NOW | RTLD_GLOBAL, "nweb_ns", libDirPath, NWEB_LIB_FILE_NAME);
77 #else
78     LoadLibFile(RTLD_NOW, libDirPath + "/" + NWEB_LIB_FILE_NAME);
79 #endif
80 }
81 
82 } // namespace OHOS::ArkWeb
83 
84 #ifdef __cplusplus
85 extern "C" {
86 #endif // __cplusplus
87 
88 ARK_WEB_EXPORT
ark_web_nweb_webview_check_func_static(ArkWebBridgeType bridgeType,const ArkWebString * funcName)89 void* ark_web_nweb_webview_check_func_static(ArkWebBridgeType bridgeType, const ArkWebString* funcName)
90 {
91     if (!funcName) {
92         ARK_WEB_BRIDGE_INFO_LOG("func name is nullptr");
93         return nullptr;
94     }
95 
96     return OHOS::ArkWeb::ArkWebNWebWebviewBridgeHelper::GetInstance().CheckFuncMemberForCalled(
97         bridgeType, ArkWebStringStructToClass(*funcName));
98 }
99 
100 #ifdef __cplusplus
101 }
102 #endif // __cplusplus
103