1 /*
2 * Copyright (c) 2022 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 "core/components/web/resource/web_delegate.h"
17 #include "core/components/web/resource/web_javascript_result_callback.h"
18
19 namespace OHOS::Ace {
20 using namespace OHOS::Ace::Framework;
21 using namespace OHOS::NWeb;
22
GetWebJSValueHelper(std::shared_ptr<NWebValue> argument)23 std::shared_ptr<WebJSValue> GetWebJSValueHelper(std::shared_ptr<NWebValue> argument)
24 {
25 if (!argument) {
26 TAG_LOGE(AceLogTag::ACE_WEB, "GetWebJSValueHelper: argument is null");
27 return std::make_shared<WebJSValue>();
28 }
29 switch (argument->GetType()) {
30 case NWebValue::Type::INTEGER:
31 return std::make_shared<WebJSValue>(argument->GetInt());
32 case NWebValue::Type::DOUBLE:
33 return std::make_shared<WebJSValue>(argument->GetDouble());
34 case NWebValue::Type::BOOLEAN:
35 return std::make_shared<WebJSValue>(argument->GetBoolean());
36 case NWebValue::Type::STRING:
37 return std::make_shared<WebJSValue>(argument->GetString());
38 case NWebValue::Type::LIST: {
39 size_t length = argument->GetListValueSize();
40 std::vector<WebJSValue> vec;
41 for (size_t i = 0; i < length; ++i) {
42 auto nPtr = std::make_shared<NWebValue>(argument->GetListValue(i));
43 vec.push_back(*GetWebJSValueHelper(nPtr));
44 }
45 return std::make_shared<WebJSValue>(vec);
46 }
47 case NWebValue::Type::DICTIONARY: {
48 std::map<std::string, WebJSValue> map;
49 auto dict = argument->GetDictionaryValue();
50 for (auto& item : dict) {
51 auto nPtr = std::make_shared<NWebValue>(item.second);
52 map[item.first] = *GetWebJSValueHelper(nPtr);
53 }
54 return std::make_shared<WebJSValue>(map);
55 }
56 case NWebValue::Type::BINARY: {
57 auto size = argument->GetBinaryValueSize();
58 auto buff = argument->GetBinaryValue();
59 return std::make_shared<WebJSValue>(buff, size);
60 }
61 case NWebValue::Type::NONE:
62 return std::make_shared<WebJSValue>();
63 default:
64 LOGI("GetWebJSValueHelper: jsvalue type not support!");
65 break;
66 }
67 return std::make_shared<WebJSValue>();
68 }
69
GetWebJSValue(const std::vector<std::shared_ptr<NWebValue>> & args)70 std::vector<std::shared_ptr<WebJSValue>> GetWebJSValue(const std::vector<std::shared_ptr<NWebValue>>& args)
71 {
72 std::vector<std::shared_ptr<WebJSValue>> webJSValues;
73 for (auto value : args) {
74 if (value == nullptr) {
75 continue;
76 }
77 webJSValues.push_back(GetWebJSValueHelper(value));
78 }
79 return webJSValues;
80 }
81
GetBasicTypeWebViewValue(const std::shared_ptr<WebJSValue> & webJSValue,std::shared_ptr<NWebValue> & webViewValue)82 bool GetBasicTypeWebViewValue(const std::shared_ptr<WebJSValue>& webJSValue, std::shared_ptr<NWebValue>& webViewValue)
83 {
84 WebJSValue::Type type = webJSValue->GetType();
85 switch (type) {
86 case WebJSValue::Type::INTEGER:
87 webViewValue->SetType(NWebValue::Type::INTEGER);
88 webViewValue->SetInt(webJSValue->GetInt());
89 break;
90 case WebJSValue::Type::DOUBLE:
91 webViewValue->SetType(NWebValue::Type::DOUBLE);
92 webViewValue->SetDouble(webJSValue->GetDouble());
93 break;
94 case WebJSValue::Type::BOOLEAN:
95 webViewValue->SetType(NWebValue::Type::BOOLEAN);
96 webViewValue->SetBoolean(webJSValue->GetBoolean());
97 break;
98 case WebJSValue::Type::STRING:
99 webViewValue->SetType(NWebValue::Type::STRING);
100 webViewValue->SetString(webJSValue->GetString());
101 break;
102 default:
103 return false;
104 }
105 return true;
106 }
107
GetWebViewValue(const std::shared_ptr<WebJSValue> & webJSValue)108 std::shared_ptr<NWebValue> GetWebViewValue(const std::shared_ptr<WebJSValue>& webJSValue)
109 {
110 if (!webJSValue) {
111 TAG_LOGE(AceLogTag::ACE_WEB, "GetWebViewValue: webJSValue is null");
112 return std::make_shared<NWebValue>(NWebValue::Type::NONE);
113 }
114 std::shared_ptr<NWebValue> webViewValue = std::make_shared<NWebValue>(NWebValue::Type::NONE);
115 WebJSValue::Type type = webJSValue->GetType();
116 if (GetBasicTypeWebViewValue(webJSValue, webViewValue)) {
117 return webViewValue;
118 }
119 switch (type) {
120 case WebJSValue::Type::LIST: {
121 size_t length = webJSValue->GetListValueSize();
122 std::vector<NWebValue> vec;
123 for (size_t i = 0; i < length; ++i) {
124 auto nPtr = std::make_shared<WebJSValue>(webJSValue->GetListValue(i));
125 vec.push_back(*GetWebViewValue(nPtr));
126 }
127 return std::make_shared<NWebValue>(vec);
128 }
129 case WebJSValue::Type::DICTIONARY: {
130 std::map<std::string, NWebValue> map;
131 auto dict = webJSValue->GetDictionaryValue();
132 for (auto& item : dict) {
133 auto nPtr = std::make_shared<WebJSValue>(item.second);
134 map[item.first] = *GetWebViewValue(nPtr);
135 }
136 return std::make_shared<NWebValue>(map);
137 }
138 case WebJSValue::Type::BINARY: {
139 auto size = webJSValue->GetBinaryValueSize();
140 auto buff = webJSValue->GetBinaryValue();
141 return std::make_shared<NWebValue>(buff, size);
142 }
143 case WebJSValue::Type::NONE:
144 break;
145 default:
146 LOGI("GetWebViewValue: jsvalue type not support!");
147 break;
148 }
149 return webViewValue;
150 }
151
GetJavaScriptResult(std::vector<std::shared_ptr<NWebValue>> args,const std::string & method,const std::string & object_name,int32_t routing_id,int32_t object_id)152 std::shared_ptr<NWebValue> WebJavaScriptResultCallBack::GetJavaScriptResult(
153 std::vector<std::shared_ptr<NWebValue>> args, const std::string& method, const std::string& object_name,
154 int32_t routing_id, int32_t object_id)
155 {
156 // webcontroller not support object, so the object_id and routing_id param is
157 // not used
158 (void)object_id;
159 (void)routing_id;
160 auto delegate = webDelegate_.Upgrade();
161 CHECK_NULL_RETURN(delegate, std::make_shared<NWebValue>(NWebValue::Type::NONE));
162 ContainerScope scope(delegate->GetInstanceId());
163 std::shared_ptr<WebJSValue> result;
164 auto jsArgs = GetWebJSValue(args);
165
166 auto task = Container::CurrentTaskExecutor();
167 if (task == nullptr) {
168 LOGW("can't get task executor");
169 return std::make_shared<NWebValue>(NWebValue::Type::NONE);
170 }
171
172 task->PostSyncTask(
173 [webJSCallBack = this, object_name, method, jsArgs, &result] {
174 if (webJSCallBack->javaScriptCallBackImpl_) {
175 result = webJSCallBack->javaScriptCallBackImpl_(object_name, method, jsArgs);
176 }
177 },
178 OHOS::Ace::TaskExecutor::TaskType::JS, "ArkUIWebGetJavaScriptResult");
179
180 return GetWebViewValue(result);
181 }
182
GetJavaScriptResultFlowbuf(std::vector<std::shared_ptr<NWebValue>> args,const std::string & method,const std::string & object_name,int fd,int32_t routing_id,int32_t object_id)183 std::shared_ptr<NWebValue> WebJavaScriptResultCallBack::GetJavaScriptResultFlowbuf(
184 std::vector<std::shared_ptr<NWebValue>> args, const std::string& method, const std::string& object_name,
185 int fd, int32_t routing_id, int32_t object_id)
186 {
187 // webcontroller not support object
188 // not supported
189 (void)object_id;
190 (void)routing_id;
191 LOGE("Flowbuf is not supported on the decrepted Webcontroller, use Webviewcontroller instead.");
192 return std::make_shared<NWebValue>(NWebValue::Type::NONE);
193 }
194
HasJavaScriptObjectMethods(int32_t object_id,const std::string & method_name)195 bool WebJavaScriptResultCallBack::HasJavaScriptObjectMethods(int32_t object_id, const std::string& method_name)
196 {
197 (void)object_id;
198 (void)method_name;
199 // webcontroller not support object, so nothing to do
200 return false;
201 }
202
GetJavaScriptObjectMethods(int32_t object_id)203 std::shared_ptr<NWebValue> WebJavaScriptResultCallBack::GetJavaScriptObjectMethods(int32_t object_id)
204 {
205 (void)object_id;
206 // webcontroller not support object, so nothing to do
207 return std::make_shared<NWebValue>();
208 }
209
RemoveJavaScriptObjectHolder(int32_t holder,int32_t object_id)210 void WebJavaScriptResultCallBack::RemoveJavaScriptObjectHolder(int32_t holder, int32_t object_id)
211 {
212 (void)holder;
213 (void)object_id;
214 // webcontroller not support object, so nothing to do
215 }
216
RemoveTransientJavaScriptObject()217 void WebJavaScriptResultCallBack::RemoveTransientJavaScriptObject()
218 {
219 // webcontroller not support object, so nothing to do
220 }
221 } // namespace OHOS::Ace
222