• 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_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