1 /*
2 * Copyright (c) 2023 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 "native_interface_arkweb.h"
17
18 #include <memory>
19 #include <mutex>
20 #include <unordered_map>
21 #include <vector>
22
23 #include "native_arkweb_utils.h"
24 #include "native_javascript_execute_callback.h"
25 #include "nweb.h"
26 #include "nweb_log.h"
27
28 namespace {
29 std::mutex g_mtxMap; // the mutex to protect the shared resource
30 std::unordered_map<std::string, NativeArkWeb_OnValidCallback> g_validMap;
31 std::unordered_map<std::string, NativeArkWeb_OnDestroyCallback> g_destroyMap;
32 } // namespace
33
34 namespace OHOS::NWeb {
35
36 class NWebJsProxyCallbackImpl : public NWebJsProxyCallback {
37 public:
NWebJsProxyCallbackImpl(const char * methodName,NativeArkWeb_OnJavaScriptProxyCallback methodCallback)38 NWebJsProxyCallbackImpl(const char *methodName, NativeArkWeb_OnJavaScriptProxyCallback methodCallback)
39 : methodName_(methodName), methodCallback_(methodCallback) {
40 }
41 ~NWebJsProxyCallbackImpl() = default;
42
GetMethodName()43 std::string GetMethodName() override
44 {
45 return methodName_;
46 }
47
GetMethodCallback()48 NativeArkWeb_OnJavaScriptProxyCallback GetMethodCallback() override
49 {
50 return methodCallback_;
51 }
52
53 private:
54 std::string methodName_;
55 NativeArkWeb_OnJavaScriptProxyCallback methodCallback_ = nullptr;
56 };
57
58 }; // namespace OHOS::NWeb
59
60 using namespace OHOS;
OH_NativeArkWeb_RunJavaScript(const char * webTag,const char * jsCode,NativeArkWeb_OnJavaScriptCallback callback)61 void OH_NativeArkWeb_RunJavaScript(const char* webTag, const char* jsCode, NativeArkWeb_OnJavaScriptCallback callback)
62 {
63 std::weak_ptr<OHOS::NWeb::NWeb> nwebWeak = OH_NativeArkWeb_GetWebInstanceByWebTag(webTag);
64 if (auto nweb = nwebWeak.lock()) {
65 auto callbackImpl = std::make_shared<OHOS::NWeb::NativeJavaScriptExecuteCallback>(callback);
66 WVLOG_I("native RunJavaScript webTag: %{public}s", webTag);
67 nweb->ExecuteJavaScript(jsCode, callbackImpl, false);
68 } else {
69 WVLOG_E("native RunJavaScript get nweb null: %{public}s", webTag);
70 }
71 }
72
OH_NativeArkWeb_RegisterJavaScriptProxy(const char * webTag,const char * objName,const char ** methodList,NativeArkWeb_OnJavaScriptProxyCallback * callback,int32_t size,bool isNeedRefresh)73 void OH_NativeArkWeb_RegisterJavaScriptProxy(const char* webTag, const char* objName, const char** methodList,
74 NativeArkWeb_OnJavaScriptProxyCallback* callback, int32_t size, bool isNeedRefresh)
75 {
76 WVLOG_I("native OH_NativeArkWeb_RegisterJavaScriptProxy webTag:%{public}s", webTag);
77 std::vector<std::shared_ptr<OHOS::NWeb::NWebJsProxyCallback>> proxyCallbacks;
78 for (int i = 0; i < size; i++) {
79 std::shared_ptr<OHOS::NWeb::NWebJsProxyCallback> proxyCallback =
80 std::make_shared<OHOS::NWeb::NWebJsProxyCallbackImpl>(methodList[i], callback[i]);
81 proxyCallbacks.push_back(proxyCallback);
82 }
83
84 std::weak_ptr<OHOS::NWeb::NWeb> nwebWeak = OH_NativeArkWeb_GetWebInstanceByWebTag(webTag);
85 if (auto nweb = nwebWeak.lock()) {
86 nweb->RegisterNativeArkJSFunction(objName, proxyCallbacks);
87 if (isNeedRefresh) {
88 nweb->Reload();
89 }
90 } else {
91 WVLOG_E("native RegisterJavaScriptProxy get nweb null: %{public}s", webTag);
92 }
93 }
94
OH_NativeArkWeb_UnregisterJavaScriptProxy(const char * webTag,const char * objName)95 void OH_NativeArkWeb_UnregisterJavaScriptProxy(const char* webTag, const char* objName)
96 {
97 WVLOG_I("native OH_NativeArkWeb_RegisterJavaScriptProxy: %{public}s", webTag);
98 std::weak_ptr<OHOS::NWeb::NWeb> nwebWeak = OH_NativeArkWeb_GetWebInstanceByWebTag(webTag);
99 if (auto nweb = nwebWeak.lock()) {
100 nweb->UnRegisterNativeArkJSFunction(objName);
101 } else {
102 WVLOG_E("native RegisterJavaScriptProxy get nweb null: %{public}s", webTag);
103 }
104 }
105
OH_NativeArkWeb_SetDestroyCallback(const char * webTag,NativeArkWeb_OnDestroyCallback callback)106 void OH_NativeArkWeb_SetDestroyCallback(const char* webTag, NativeArkWeb_OnDestroyCallback callback)
107 {
108 WVLOG_I("native RegisterDestroyCallback, webTag: %{public}s", webTag);
109 std::lock_guard<std::mutex> guard(g_mtxMap);
110 g_destroyMap[webTag] = callback;
111 std::weak_ptr<OHOS::NWeb::NWeb> nwebWeak = OH_NativeArkWeb_GetWebInstanceByWebTag(webTag);
112 if (auto nweb = nwebWeak.lock()) {
113 WVLOG_I("native RegisterNativeDestroyCallback call nweb");
114 nweb->RegisterNativeDestroyCallback(webTag, callback);
115 } else {
116 WVLOG_E("native RegisterDestroyCallback get nweb null: %{public}s", webTag);
117 }
118 }
119
OH_NativeArkWeb_GetDestroyCallback(const char * webTag)120 NativeArkWeb_OnDestroyCallback OH_NativeArkWeb_GetDestroyCallback(const char* webTag)
121 {
122 WVLOG_I("native OH_Web_GetDestroyCallback, webTag: %{public}s", webTag);
123 std::lock_guard<std::mutex> guard(g_mtxMap);
124 std::unordered_map<std::string, NativeArkWeb_OnDestroyCallback>::iterator iter;
125 if ((iter = g_destroyMap.find(webTag)) != g_destroyMap.end()) {
126 return iter->second;
127 }
128 return nullptr;
129 }
130
OH_NativeArkWeb_SetJavaScriptProxyValidCallback(const char * webTag,NativeArkWeb_OnValidCallback callback)131 void OH_NativeArkWeb_SetJavaScriptProxyValidCallback(const char* webTag, NativeArkWeb_OnValidCallback callback)
132 {
133 WVLOG_I("native RegisterValidCallback, webTag: %{public}s", webTag);
134 std::lock_guard<std::mutex> guard(g_mtxMap);
135 g_validMap[webTag] = callback;
136 std::weak_ptr<OHOS::NWeb::NWeb> nwebWeak = OH_NativeArkWeb_GetWebInstanceByWebTag(webTag);
137 if (auto nweb = nwebWeak.lock()) {
138 WVLOG_I("native OH_NativeArkWeb_SetJavaScriptProxyValidCallback call nweb");
139 nweb->RegisterNativeValideCallback(webTag, callback);
140 } else {
141 WVLOG_E("native RegisterDestroyCallback get nweb null: %{public}s", webTag);
142 }
143 }
144
OH_NativeArkWeb_GetJavaScriptProxyValidCallback(const char * webTag)145 NativeArkWeb_OnValidCallback OH_NativeArkWeb_GetJavaScriptProxyValidCallback(const char* webTag)
146 {
147 WVLOG_I("native OH_Web_GetValidCallback, webTag: %{public}s", webTag);
148 std::lock_guard<std::mutex> guard(g_mtxMap);
149 std::unordered_map<std::string, NativeArkWeb_OnValidCallback>::iterator iter;
150 if ((iter = g_validMap.find(webTag)) != g_validMap.end()) {
151 return iter->second;
152 }
153 return nullptr;
154 }
155