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