• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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